simpleCamera.cpp 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510
  1. /*************************************************************************************************\
  2. SimpleCamera.cpp : Implementation of the SimpleCamera component.
  3. //---------------------------------------------------------------------------//
  4. // Copyright (C) Microsoft Corporation. All rights reserved. //
  5. //===========================================================================//
  6. \*************************************************************************************************/
  7. #include "SimpleCamera.h"
  8. #include "appear.h"
  9. #include "mclib.h"
  10. #include "mech3d.h"
  11. #include "Mission.h"
  12. #include "bdactor.h"
  13. extern bool useShadows;
  14. extern bool drawOldWay;
  15. extern bool useFog;
  16. MidLevelRenderer::MLRClipper * theClipper = NULL;
  17. ////////////////////////////////////////////////
  18. SimpleCamera::SimpleCamera()
  19. {
  20. pObject = NULL;
  21. Camera::init();
  22. char path[256];
  23. strcpy( path, cameraPath );
  24. strcat( path, "cameras.fit" );
  25. FitIniFile camFile;
  26. if ( NO_ERR != camFile.open( path ) )
  27. {
  28. STOP(( "Need Camera File " ));
  29. }
  30. Camera::init( &camFile );
  31. AltitudeTight = 650;
  32. rotation = -45.f;
  33. bIsComponent = 0;
  34. rotateLightRight(90.0f);
  35. bIsInMission = false;
  36. }
  37. SimpleCamera::~SimpleCamera()
  38. {
  39. //Why did we not delete here??
  40. // It was commented out.
  41. // -fs
  42. if ( appearanceTypeList && appearanceTypeList->pointerCanBeDeleted(pObject) )
  43. delete pObject;
  44. pObject = NULL;
  45. //We have to do this here because we always load the damned sensor shape.
  46. // ONLY if we are running it in logistics. DO NOT DELETE THESE IN THE MIDDLE OF A MISSION!!!
  47. if (!bIsInMission)
  48. {
  49. if (GVAppearanceType::SensorTriangleShape)
  50. {
  51. delete GVAppearanceType::SensorTriangleShape;
  52. GVAppearanceType::SensorTriangleShape = NULL;
  53. }
  54. if (GVAppearanceType::SensorCircleShape)
  55. {
  56. delete GVAppearanceType::SensorCircleShape;
  57. GVAppearanceType::SensorCircleShape = NULL;
  58. }
  59. if (Mech3DAppearanceType::SensorSquareShape)
  60. {
  61. delete Mech3DAppearanceType::SensorSquareShape;
  62. Mech3DAppearanceType::SensorSquareShape = NULL;
  63. }
  64. }
  65. }
  66. void SimpleCamera::init( float left, float top, float right, float bottom )
  67. {
  68. bounds[0] = left;
  69. bounds[1] = top;
  70. bounds[2] = right;
  71. bounds[3] = bottom;
  72. }
  73. ////////////////////////////////////////////////
  74. void SimpleCamera::render()
  75. {
  76. render( 0, 0 );
  77. }
  78. void SimpleCamera::render(long xOffset, long yOffset)
  79. {
  80. if ( xOffset != 0 && yOffset != 0 ) // don't know how to do this
  81. return;
  82. if ( pObject )
  83. {
  84. if ( bIsComponent )
  85. {
  86. lightRed = 196;
  87. lightGreen = 196;
  88. lightBlue = 220;
  89. ambientRed = 196;
  90. ambientGreen = 196;
  91. ambientBlue = 196;
  92. }
  93. gos_PushRenderStates();
  94. oldCam = eye;
  95. eye = this;
  96. useFog = 0;
  97. gos_GetViewport(&viewMulX, &viewMulY, &viewAddX, &viewAddY);
  98. //--------------------------------------------------------
  99. // Get new viewport values to scale stuff. No longer uses
  100. // VFX stuff for this. ALL GOS NOW!
  101. screenResolution.x = viewMulX;
  102. screenResolution.y = viewMulY;
  103. calculateProjectionConstants();
  104. TG_Shape::SetViewport(viewMulX,viewMulY,viewAddX,viewAddY);
  105. globalScaleFactor = getScaleFactor();
  106. globalScaleFactor *= viewMulX / Environment.screenWidth; //Scale Mechs to ScreenRES
  107. //-----------------------------------------------
  108. setLightColor(1,0xffffffff);
  109. setLightIntensity(1,1.0);
  110. MidLevelRenderer::MLRState default_state;
  111. default_state.SetBackFaceOn();
  112. default_state.SetDitherOn();
  113. default_state.SetTextureCorrectionOn();
  114. default_state.SetZBufferCompareOn();
  115. default_state.SetZBufferWriteOn();
  116. default_state.SetFilterMode(MidLevelRenderer::MLRState::BiLinearFilterMode);
  117. Stuff::RGBAColor fColor;
  118. fColor.red = 0;
  119. fColor.green = 0;
  120. fColor.blue = 0;
  121. float z = 1.0;
  122. MidLevelRenderer::PerspectiveMode = usePerspective;
  123. theClipper->StartDraw(cameraOrigin, cameraToClip, fColor, &fColor, default_state, &z);
  124. MidLevelRenderer::GOSVertex::farClipReciprocal = (1.0f-cameraToClip(2, 2))/cameraToClip(3, 2);
  125. //--------------------------------
  126. //Set States for Software Renderer
  127. if (Environment.Renderer == 3)
  128. {
  129. gos_SetRenderState( gos_State_AlphaMode, gos_Alpha_OneZero);
  130. gos_SetRenderState( gos_State_ShadeMode, gos_ShadeGouraud);
  131. gos_SetRenderState( gos_State_MonoEnable, 1);
  132. gos_SetRenderState( gos_State_Perspective, 0);
  133. gos_SetRenderState( gos_State_Clipping, 1);
  134. gos_SetRenderState( gos_State_Specular, 0);
  135. gos_SetRenderState( gos_State_Dither, 0);
  136. gos_SetRenderState( gos_State_TextureMapBlend, gos_BlendModulate);
  137. gos_SetRenderState( gos_State_Filter, gos_FilterNone);
  138. gos_SetRenderState( gos_State_TextureAddress, gos_TextureWrap );
  139. gos_SetRenderState( gos_State_ZCompare, 1);
  140. gos_SetRenderState( gos_State_ZWrite, 1);
  141. }
  142. //--------------------------------
  143. //Set States for Hardware Renderer
  144. else
  145. {
  146. gos_SetRenderState( gos_State_AlphaMode, gos_Alpha_OneZero);
  147. gos_SetRenderState( gos_State_ShadeMode, gos_ShadeGouraud);
  148. gos_SetRenderState( gos_State_MonoEnable, 0);
  149. gos_SetRenderState( gos_State_Perspective, 1);
  150. gos_SetRenderState( gos_State_Clipping, 1);
  151. gos_SetRenderState( gos_State_Specular, 1);
  152. gos_SetRenderState( gos_State_Dither, 1);
  153. gos_SetRenderState( gos_State_TextureMapBlend, gos_BlendModulate);
  154. gos_SetRenderState( gos_State_TextureAddress, gos_TextureWrap );
  155. gos_SetRenderState( gos_State_ZCompare, 1);
  156. gos_SetRenderState( gos_State_ZWrite, 1);
  157. }
  158. pObject->render();
  159. if ( !drawOldWay )
  160. mcTextureManager->renderLists();
  161. eye = oldCam;
  162. gos_PopRenderStates();
  163. }
  164. }
  165. ////////////////////////////////////////////////
  166. long SimpleCamera::update()
  167. {
  168. if ( pObject )
  169. {
  170. turn++; //Must increment this now or matrices NEVER change!!
  171. //reset the TGL RAM pools.
  172. colorPool->reset();
  173. vertexPool->reset();
  174. facePool->reset();
  175. shadowPool->reset();
  176. trianglePool->reset();
  177. //reset the TGL RAM pools.
  178. colorPool->reset();
  179. vertexPool->reset();
  180. facePool->reset();
  181. shadowPool->reset();
  182. trianglePool->reset();
  183. mcTextureManager->clearArrays();
  184. mcTextureManager->update();
  185. Camera::update();
  186. //--------------------------------------------------------
  187. // Get new viewport values to scale stuff. No longer uses
  188. // VFX stuff for this. ALL GOS NOW!
  189. screenResolution.x = viewMulX;
  190. screenResolution.y = viewMulY;
  191. calculateProjectionConstants();
  192. float offsetX = bounds[2] + bounds[0] - viewMulX;
  193. offsetX /= 2;
  194. offsetX += fudgeX;
  195. float offsetY = bounds[1] + bounds[3] - viewMulY;
  196. offsetY /= 2;
  197. offsetY += fudgeY; // hack, just to get exactly where Dorje wants it
  198. TG_Shape::SetViewport(viewMulX,viewMulY, offsetX, offsetY);
  199. useShadows = 0;
  200. oldCam = eye;
  201. eye = this;
  202. Camera::update();
  203. ZoomTight();
  204. pObject->recalcBounds();
  205. pObject->scale(shapeScale);
  206. // we don't want to center around the feet
  207. Stuff::Vector3D mechPos = pObject->getRootNodeCenter();
  208. mechPos.x = -mechPos.x/2.f;
  209. float tmp = -mechPos.y/2.f;
  210. mechPos.y = -mechPos.z/2.f;
  211. mechPos.z = tmp;
  212. float rotation = frameLength * rotationIncrement + pObject->rotation;
  213. pObject->setObjectParameters(mechPos, rotation, 0, 0, 0);
  214. pObject->update();
  215. pObject->setVisibility(true,true);
  216. eye = oldCam;
  217. }
  218. return 0;
  219. }
  220. void SimpleCamera::setMech(const char* fileName, long baseColor, long highlight1, long highlight2 )
  221. {
  222. shapeScale = 0.0f;
  223. bIsComponent = 0;
  224. fudgeX = 5;
  225. fudgeY = 10;
  226. AltitudeTight = 650;
  227. // moving this to above the spot where we create the appearancetypelist
  228. if ( appearanceTypeList && appearanceTypeList->pointerCanBeDeleted(pObject) )
  229. delete pObject;
  230. if ( !appearanceTypeList )
  231. Mission::initBareMinimum();
  232. rotationIncrement = 0;
  233. pObject = NULL;
  234. if ( !fileName )
  235. {
  236. // allNormal();
  237. return;
  238. }
  239. char NoPathFileName[256];
  240. _splitpath( fileName, NULL, NULL, NoPathFileName, NULL );
  241. char testName[256];
  242. strcpy( testName, NoPathFileName );
  243. strcat( testName, "enc" );
  244. FullPathFileName path;
  245. path.init( tglPath, testName, ".ini" );
  246. //MUST ALWAYS CALL GET, EVEN IF WE HAVE AN APPEARANCE TYPE OR REFERENCE COUNT DOES NOT INCREASE!
  247. Mech3DAppearanceType* appearanceType = NULL;
  248. if ( fileExists( path ) )
  249. appearanceType = (Mech3DAppearanceType*)appearanceTypeList->getAppearance( MECH_TYPE << 24, (char*)testName );
  250. else
  251. appearanceType = (Mech3DAppearanceType*)appearanceTypeList->getAppearance( MECH_TYPE << 24, (char*)NoPathFileName );
  252. pObject = new Mech3DAppearance;
  253. pObject->init( appearanceType );
  254. pObject->setGestureGoal(2);
  255. pObject->resetPaintScheme( highlight1, highlight2, baseColor );
  256. pObject->rotation = rotation;
  257. activate();
  258. setPosition(position, 0);
  259. ZoomTight();
  260. }
  261. void SimpleCamera::setVehicle(const char* fileName,long base, long highlight, long h2)
  262. {
  263. shapeScale = 0.0f;
  264. bIsComponent = 0;
  265. fudgeX = 5;
  266. fudgeY = 10;
  267. AltitudeTight = 650;
  268. if ( !appearanceTypeList )
  269. Mission::initBareMinimum();
  270. rotationIncrement = 90;
  271. if ( appearanceTypeList && appearanceTypeList->pointerCanBeDeleted(pObject) )
  272. delete pObject;
  273. pObject = NULL;
  274. if ( !fileName )
  275. return;
  276. char NoPathFileName[256];
  277. _splitpath( fileName, NULL, NULL, NoPathFileName, NULL );
  278. char testName[256];
  279. strcpy( testName, fileName );
  280. strcat( testName, "enc" );
  281. FullPathFileName path;
  282. path.init( tglPath, testName, ".ini" );
  283. //MUST ALWAYS CALL GET, EVEN IF WE HAVE AN APPEARANCE TYPE OR REFERENCE COUNT DOES NOT INCREASE!
  284. GVAppearanceType* appearanceType = NULL;
  285. if ( fileExists( path ) )
  286. appearanceType = (GVAppearanceType*)appearanceTypeList->getAppearance( GV_TYPE << 24, (char*)testName );
  287. else
  288. appearanceType= (GVAppearanceType*)appearanceTypeList->getAppearance( GV_TYPE << 24, (char*)NoPathFileName );
  289. pObject = new GVAppearance;
  290. pObject->init( appearanceType );
  291. pObject->setGestureGoal(2);
  292. pObject->resetPaintScheme(base, highlight, h2);
  293. pObject->rotation = rotation;
  294. activate();
  295. setPosition(position);
  296. ZoomTight();
  297. }
  298. void SimpleCamera::setComponent(const char* fileName )
  299. {
  300. shapeScale = 0.0f;
  301. bIsComponent = 1;
  302. AltitudeTight = 580;
  303. fudgeX = 0;
  304. fudgeY = 0;
  305. if ( !appearanceTypeList )
  306. Mission::initBareMinimum();
  307. if ( appearanceTypeList && appearanceTypeList->pointerCanBeDeleted(pObject) )
  308. delete pObject;
  309. pObject = NULL;
  310. if ( !fileName )
  311. return;
  312. char testName[256];
  313. strcpy( testName, fileName );
  314. strcat( testName, "enc" );
  315. FullPathFileName path;
  316. path.init( tglPath, testName, ".ini" );
  317. BldgAppearanceType* appearanceType = NULL;
  318. if ( fileExists( path ) )
  319. {
  320. appearanceType = (BldgAppearanceType*)appearanceTypeList->getAppearance( BLDG_TYPE << 24, (char*)testName );
  321. }
  322. else
  323. appearanceType = (BldgAppearanceType*)appearanceTypeList->getAppearance( BLDG_TYPE << 24, (char*)fileName );
  324. //MUST ALWAYS CALL GET, EVEN IF WE HAVE AN APPEARANCE TYPE OR REFERENCE COUNT DOES NOT INCREASE!
  325. pObject = new BldgAppearance;
  326. pObject->init( appearanceType );
  327. pObject->resetPaintScheme(0xffff7e00, 0xffff7e00, 0xffbcbcbc);
  328. pObject->rotation = rotation;
  329. rotationIncrement = 90;
  330. activate();
  331. setPosition(position);
  332. ZoomTight();
  333. }
  334. void SimpleCamera::setScale( float newAltitude )
  335. {
  336. shapeScale = newAltitude;
  337. }
  338. void SimpleCamera::setBuilding( const char* pBuilding )
  339. {
  340. shapeScale = 0.0f;
  341. setComponent( pBuilding );
  342. AltitudeTight = 800;
  343. bIsComponent = 0;
  344. }
  345. void SimpleCamera::setObject( const char* pFileName, long type, long base, long highlight, long h2 )
  346. {
  347. if ( !pFileName || !strlen( pFileName ) )
  348. {
  349. if ( appearanceTypeList && appearanceTypeList->pointerCanBeDeleted(pObject) )
  350. delete pObject;
  351. pObject = NULL;
  352. return;
  353. }
  354. switch( type )
  355. {
  356. case BLDG_TYPE:
  357. setBuilding( pFileName );
  358. break;
  359. case TREED_TYPE:
  360. setBuilding( pFileName ); // this might not work....
  361. break;
  362. case GV_TYPE:
  363. setVehicle( pFileName, base, highlight, h2 );
  364. break;
  365. case MECH_TYPE:
  366. setMech( pFileName, base, highlight, h2 );
  367. break;
  368. default:
  369. gosASSERT( !"camera just got an unknown type!" );
  370. }
  371. }
  372. void SimpleCamera::setColors( long base, long highlight, long h2 )
  373. {
  374. pObject->resetPaintScheme( base, highlight, h2 );
  375. }
  376. void SimpleCamera::zoomIn( float howMuch )
  377. {
  378. AltitudeTight = 650.f/howMuch;
  379. }// scale for things that can't