gamecam.cpp 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625
  1. //---------------------------------------------------------------------------
  2. //
  3. // GameCam.h -- File contains the Game camera class definitions
  4. //
  5. // MechCommander 2
  6. //
  7. //---------------------------------------------------------------------------//
  8. // Copyright (C) Microsoft Corporation. All rights reserved. //
  9. //===========================================================================//
  10. //---------------------------------------------------------------------------
  11. // Include Files
  12. #ifndef GAMECAM_H
  13. #include "gamecam.h"
  14. #endif
  15. #ifndef OBJMGR_H
  16. #include "objmgr.h"
  17. #endif
  18. #ifndef MOVER_H
  19. #include "mover.h"
  20. #endif
  21. #ifndef MISSION_H
  22. #include "mission.h"
  23. #endif
  24. #ifndef TEAM_H
  25. #include "team.h"
  26. #endif
  27. #ifndef COMNDR_H
  28. #include "comndr.h"
  29. #endif
  30. #ifndef WEATHER_H
  31. #include "weather.h"
  32. #endif
  33. #include <MLR\MLR.hpp>
  34. //---------------------------------------------------------------------------
  35. CameraPtr eye = NULL;
  36. extern bool useShadows;
  37. extern bool useFog;
  38. extern bool DisplayCameraAngle;
  39. extern MidLevelRenderer::MLRClipper * theClipper;
  40. #define MAX_SHADOW_PITCH_CHANGE (5.0f)
  41. extern bool drawOldWay;
  42. extern bool useNonWeaponEffects;
  43. GenericAppearance *theSky = NULL;
  44. //---------------------------------------------------------------------------
  45. void GameCamera::destroy (void)
  46. {
  47. if (theSky)
  48. {
  49. delete theSky;
  50. theSky = NULL;
  51. }
  52. if (compass)
  53. {
  54. delete compass;
  55. compass = NULL;
  56. }
  57. Camera::destroy();
  58. }
  59. //---------------------------------------------------------------------------
  60. void GameCamera::render (void)
  61. {
  62. //------------------------------------------------------
  63. // At present, these actually draw. Later they will
  64. // add elements to the draw list and sort and draw.
  65. // The later time has arrived. We begin sorting immediately.
  66. // NO LONGER NEED TO SORT!
  67. // ZBuffer time has arrived. Share and Enjoy!
  68. // Everything SIMPLY draws at the execution point into the zBuffer
  69. // at the correct depth. Miracles occur at that point!
  70. // Big code change but it removes a WHOLE bunch of code and memory!
  71. //--------------------------------------------------------
  72. // Get new viewport values to scale stuff. No longer uses
  73. // VFX stuff for this. ALL GOS NOW!
  74. gos_GetViewport(&viewMulX, &viewMulY, &viewAddX, &viewAddY);
  75. MidLevelRenderer::MLRState default_state;
  76. default_state.SetBackFaceOn();
  77. default_state.SetDitherOn();
  78. default_state.SetTextureCorrectionOn();
  79. default_state.SetZBufferCompareOn();
  80. default_state.SetZBufferWriteOn();
  81. default_state.SetFilterMode(MidLevelRenderer::MLRState::BiLinearFilterMode);
  82. float z = 1.0f;
  83. Stuff::RGBAColor fColor;
  84. fColor.red = ((fogColor >> 16) & 0xff);
  85. fColor.green = ((fogColor >> 8) & 0xff);
  86. fColor.blue = ((fogColor) & 0xff);
  87. //--------------------------------------------------------
  88. // Get new viewport values to scale stuff. No longer uses
  89. // VFX stuff for this. ALL GOS NOW!
  90. screenResolution.x = viewMulX;
  91. screenResolution.y = viewMulY;
  92. calculateProjectionConstants();
  93. TG_Shape::SetViewport(viewMulX,viewMulY,viewAddX,viewAddY);
  94. userInput->setViewport(viewMulX,viewMulY,viewAddX,viewAddY);
  95. gos_TextSetRegion(viewAddX,viewAddY,viewMulX,viewMulY);
  96. //--------------------------------------------------------
  97. // Get new viewport values to scale stuff. No longer uses
  98. // VFX stuff for this. ALL GOS NOW!
  99. screenResolution.x = viewMulX;
  100. screenResolution.y = viewMulY;
  101. calculateProjectionConstants();
  102. globalScaleFactor = getScaleFactor();
  103. globalScaleFactor *= viewMulX / 640.0; //Scale Mechs to ScreenRES
  104. //-----------------------------------------------
  105. // Set Ambient for this pass of rendering
  106. DWORD lightRGB = (ambientRed<<16)+(ambientGreen<<8)+ambientBlue;
  107. eye->setLightColor(1,lightRGB);
  108. eye->setLightIntensity(1,1.0);
  109. MidLevelRenderer::PerspectiveMode = usePerspective;
  110. theClipper->StartDraw(cameraOrigin, cameraToClip, fColor, &fColor, default_state, &z);
  111. MidLevelRenderer::GOSVertex::farClipReciprocal = (1.0f-cameraToClip(2, 2))/cameraToClip(3, 2);
  112. if (active && turn > 1)
  113. {
  114. //----------------------------------------------------------
  115. // Turn stuff on line by line until perspective is working.
  116. if (Environment.Renderer != 3)
  117. theSky->render(1);
  118. land->render(); //render the Terrain
  119. if (Environment.Renderer != 3)
  120. craterManager->render(); //render the craters and footprints
  121. ObjectManager->render(true, true, true); //render all other objects
  122. land->renderWater(); //Draw Water Last!
  123. if (useShadows && Environment.Renderer != 3)
  124. ObjectManager->renderShadows(true, true, true);
  125. if (mission && mission->missionInterface)
  126. mission->missionInterface->drawVTOL();
  127. if (!drawOldWay && !inMovieMode)
  128. {
  129. if (compass && (turn > 3) && drawCompass)
  130. compass->render(-1); //Force this to zBuffer in front of everything
  131. }
  132. if (!drawOldWay)
  133. mcTextureManager->renderLists(); //This sends triangles down to the card. All "rendering" to this point has been setting up tri lists
  134. if (drawOldWay)
  135. {
  136. //Last thing drawn were shadows which are not Gouraud Shaded!!!
  137. // MLR to be "efficient" doesn't set this state by default at startup!
  138. gos_SetRenderState( gos_State_ShadeMode, gos_ShadeGouraud);
  139. }
  140. theClipper->RenderNow(); //Draw the FX
  141. if (useNonWeaponEffects)
  142. weather->render(); //Draw the weather
  143. }
  144. if (drawOldWay && !inMovieMode)
  145. {
  146. gos_SetRenderState( gos_State_ZCompare, 0);
  147. gos_SetRenderState( gos_State_ZWrite, 0);
  148. gos_SetRenderState( gos_State_Perspective, 1);
  149. if (compass && (turn > 3) && drawCompass)
  150. compass->render();
  151. }
  152. //---------------------------------------------------------
  153. //Check if we are inMovieMode and should be letterboxed.
  154. // draw letterboxes here.
  155. if (inMovieMode && (letterBoxPos != 0.0f))
  156. {
  157. //Figure out the two faces we need to draw based on letterBox Pos and Alpha
  158. float barTopX = screenResolution.y * letterBoxPos;
  159. float barBotX = screenResolution.y - barTopX;
  160. gos_SetRenderState( gos_State_AlphaMode, gos_Alpha_AlphaInvAlpha);
  161. gos_SetRenderState( gos_State_ShadeMode, gos_ShadeGouraud);
  162. gos_SetRenderState( gos_State_MonoEnable, 0);
  163. gos_SetRenderState( gos_State_Perspective, 0);
  164. gos_SetRenderState( gos_State_Clipping, 1);
  165. gos_SetRenderState( gos_State_AlphaTest, 1);
  166. gos_SetRenderState( gos_State_Specular, 0);
  167. gos_SetRenderState( gos_State_Dither, 1);
  168. gos_SetRenderState( gos_State_TextureMapBlend, gos_BlendModulate);
  169. gos_SetRenderState( gos_State_Filter, gos_FilterNone);
  170. gos_SetRenderState( gos_State_TextureAddress, gos_TextureClamp );
  171. gos_SetRenderState( gos_State_ZCompare, 0);
  172. gos_SetRenderState( gos_State_ZWrite, 0);
  173. gos_SetRenderState( gos_State_Texture, 0);
  174. //------------------------------------
  175. gos_VERTEX gVertex[4];
  176. gVertex[0].x = 0.0f;
  177. gVertex[0].y = 0.0f;
  178. gVertex[0].z = 0.00001f;
  179. gVertex[0].rhw = 0.00001f;
  180. gVertex[0].u = 0.0f;
  181. gVertex[0].v = 0.0f;
  182. gVertex[0].argb = (letterBoxAlpha << 24);
  183. gVertex[0].frgb = 0xff000000;
  184. gVertex[1].x = 0.0f;
  185. gVertex[1].y = barTopX;
  186. gVertex[1].z = 0.00001f;
  187. gVertex[1].rhw = 0.00001f;
  188. gVertex[1].u = 0.0f;
  189. gVertex[1].v = 0.0f;
  190. gVertex[1].argb = (letterBoxAlpha << 24);
  191. gVertex[1].frgb = 0xff000000;
  192. gVertex[2].x = screenResolution.x;
  193. gVertex[2].y = barTopX;
  194. gVertex[2].z = 0.00001f;
  195. gVertex[2].rhw = 0.00001f;
  196. gVertex[2].u = 0.0f;
  197. gVertex[2].v = 0.0f;
  198. gVertex[2].argb = (letterBoxAlpha << 24);
  199. gVertex[2].frgb = 0xff000000;
  200. gVertex[3].x = screenResolution.x;
  201. gVertex[3].y = 0.0f;
  202. gVertex[3].z = 0.00001f;
  203. gVertex[3].rhw = 0.00001f;
  204. gVertex[3].u = 0.0f;
  205. gVertex[3].v = 0.0f;
  206. gVertex[3].argb = (letterBoxAlpha << 24);
  207. gVertex[3].frgb = 0xff000000;
  208. gos_DrawQuads(gVertex, 4);
  209. gVertex[0].x = 0.0f;
  210. gVertex[0].y = barBotX;
  211. gVertex[0].z = 0.00001f;
  212. gVertex[0].rhw = 0.00001f;
  213. gVertex[0].u = 0.0f;
  214. gVertex[0].v = 0.0f;
  215. gVertex[0].argb = (letterBoxAlpha << 24);
  216. gVertex[0].frgb = 0xff000000;
  217. gVertex[1].x = screenResolution.x;
  218. gVertex[1].y = barBotX;
  219. gVertex[1].z = 0.00001f;
  220. gVertex[1].rhw = 0.00001f;
  221. gVertex[1].u = 0.0f;
  222. gVertex[1].v = 0.0f;
  223. gVertex[1].argb = (letterBoxAlpha << 24);
  224. gVertex[1].frgb = 0xff000000;
  225. gVertex[2].x = screenResolution.x;
  226. gVertex[2].y = screenResolution.y;
  227. gVertex[2].z = 0.00001f;
  228. gVertex[2].rhw = 0.00001f;
  229. gVertex[2].u = 0.0f;
  230. gVertex[2].v = 0.0f;
  231. gVertex[2].argb = (letterBoxAlpha << 24);
  232. gVertex[2].frgb = 0xff000000;
  233. gVertex[3].x = 0.0f;
  234. gVertex[3].y = screenResolution.y;
  235. gVertex[3].z = 0.00001f;
  236. gVertex[3].rhw = 0.00001f;
  237. gVertex[3].u = 0.0f;
  238. gVertex[3].v = 0.0f;
  239. gVertex[3].argb = (letterBoxAlpha << 24);
  240. gVertex[3].frgb = 0xff000000;
  241. gos_DrawQuads(gVertex, 4);
  242. }
  243. if (inMovieMode && (fadeAlpha != 0x0))
  244. {
  245. //We are fading to something other then clear screen.
  246. gos_SetRenderState( gos_State_AlphaMode, gos_Alpha_AlphaInvAlpha);
  247. gos_SetRenderState( gos_State_ShadeMode, gos_ShadeGouraud);
  248. gos_SetRenderState( gos_State_MonoEnable, 0);
  249. gos_SetRenderState( gos_State_Perspective, 0);
  250. gos_SetRenderState( gos_State_Clipping, 1);
  251. gos_SetRenderState( gos_State_AlphaTest, 1);
  252. gos_SetRenderState( gos_State_Specular, 0);
  253. gos_SetRenderState( gos_State_Dither, 1);
  254. gos_SetRenderState( gos_State_TextureMapBlend, gos_BlendModulate);
  255. gos_SetRenderState( gos_State_Filter, gos_FilterNone);
  256. gos_SetRenderState( gos_State_TextureAddress, gos_TextureClamp );
  257. gos_SetRenderState( gos_State_ZCompare, 0);
  258. gos_SetRenderState( gos_State_ZWrite, 0);
  259. gos_SetRenderState( gos_State_Texture, 0);
  260. //------------------------------------
  261. gos_VERTEX gVertex[4];
  262. gVertex[0].x = 0.0f;
  263. gVertex[0].y = 0.0f;
  264. gVertex[0].z = 0.00001f;
  265. gVertex[0].rhw = 0.00001f;
  266. gVertex[0].u = 0.0f;
  267. gVertex[0].v = 0.0f;
  268. gVertex[0].argb = (fadeAlpha << 24) + (fadeColor & 0x00ffffff);
  269. gVertex[0].frgb = 0xff000000;
  270. gVertex[1].x = 0.0f;
  271. gVertex[1].y = screenResolution.y;
  272. gVertex[1].z = 0.00001f;
  273. gVertex[1].rhw = 0.00001f;
  274. gVertex[1].u = 0.0f;
  275. gVertex[1].v = 0.0f;
  276. gVertex[1].argb = (fadeAlpha << 24) + (fadeColor & 0x00ffffff);
  277. gVertex[1].frgb = 0xff000000;
  278. gVertex[2].x = screenResolution.x;
  279. gVertex[2].y = screenResolution.y;
  280. gVertex[2].z = 0.00001f;
  281. gVertex[2].rhw = 0.00001f;
  282. gVertex[2].u = 0.0f;
  283. gVertex[2].v = 0.0f;
  284. gVertex[2].argb = (fadeAlpha << 24) + (fadeColor & 0x00ffffff);
  285. gVertex[2].frgb = 0xff000000;
  286. gVertex[3].x = screenResolution.x;
  287. gVertex[3].y = 0.0f;
  288. gVertex[3].z = 0.00001f;
  289. gVertex[3].rhw = 0.00001f;
  290. gVertex[3].u = 0.0f;
  291. gVertex[3].v = 0.0f;
  292. gVertex[3].argb = (fadeAlpha << 24) + (fadeColor & 0x00ffffff);
  293. gVertex[3].frgb = 0xff000000;
  294. gos_DrawQuads(gVertex, 4);
  295. }
  296. //-----------------------------------------------------
  297. }
  298. //---------------------------------------------------------------------------
  299. long GameCamera::activate (void)
  300. {
  301. //------------------------------------------
  302. // If camera is already active, just return
  303. if (ready && active)
  304. return(NO_ERR);
  305. //---------------------------------------------------------
  306. // Camera always starts pointing at first mover in lists
  307. // CANNOT be infinite because we don't allow missions without at least 1 player mech!!
  308. MoverPtr firstMover = NULL;
  309. if (ObjectManager->getNumMovers() > 0) {
  310. long i = 0;
  311. firstMover = ObjectManager->getMover(i);
  312. while (firstMover && ((firstMover->getCommander()->getId() != Commander::home->getId()) || !firstMover->isOnGUI()))
  313. {
  314. i++;
  315. if (i == ObjectManager->getNumMovers())
  316. break;
  317. firstMover = ObjectManager->getMover(i);
  318. }
  319. }
  320. if (firstMover)
  321. {
  322. Stuff::Vector3D newPosition(firstMover->getPosition());
  323. setPosition(newPosition);
  324. }
  325. if (land)
  326. {
  327. land->update();
  328. }
  329. allNormal();
  330. //updateDaylight(true);
  331. lastShadowLightPitch = lightPitch;
  332. //Startup the SKYBox
  333. long appearanceType = (GENERIC_APPR_TYPE << 24);
  334. AppearanceTypePtr genericAppearanceType = NULL;
  335. genericAppearanceType = appearanceTypeList->getAppearance(appearanceType,"skybox");
  336. if (!genericAppearanceType)
  337. {
  338. char msg[1024];
  339. sprintf(msg,"No Generic Appearance Named %s","skybox");
  340. Fatal(0,msg);
  341. }
  342. theSky = new GenericAppearance;
  343. gosASSERT(theSky != NULL);
  344. //--------------------------------------------------------------
  345. gosASSERT(genericAppearanceType->getAppearanceClass() == GENERIC_APPR_TYPE);
  346. theSky->init((GenericAppearanceType*)genericAppearanceType, NULL);
  347. theSky->setSkyNumber(mission->theSkyNumber);
  348. return NO_ERR;
  349. }
  350. inline GameObjectPtr getCamObject (long partId, bool existsOnly)
  351. {
  352. GameObjectPtr obj = NULL;
  353. if (partId == -1)
  354. obj = NULL;
  355. else
  356. obj = ObjectManager->findByPartId(partId);
  357. if (existsOnly)
  358. {
  359. if (obj &&
  360. obj->getExists() &&
  361. (obj->getCommanderId() == Commander::home->getId()) ||
  362. (Team::home->teamLineOfSight(obj->getLOSPosition(),0.0f)))
  363. return(obj);
  364. return(NULL);
  365. }
  366. return(obj);
  367. }
  368. long cameraLineChanged = 0;
  369. bool useLOSAngle = true;
  370. //---------------------------------------------------------------------------
  371. long GameCamera::update (void)
  372. {
  373. if (lookTargetObject != -1)
  374. targetObject = getCamObject(lookTargetObject,true);
  375. if (targetObject &&
  376. targetObject->getExists() &&
  377. ((targetObject->getCommanderId() == Commander::home->getId()) ||
  378. !targetObject->isMover() ||
  379. (targetObject->isMover() && ((Mover *)targetObject)->conStat >= CONTACT_SENSOR_QUALITY_1) ))
  380. {
  381. setPosition(targetObject->getPosition(),false);
  382. }
  383. else
  384. {
  385. targetObject = NULL;
  386. }
  387. //Force CameraAltitude to be less than max based on angle. This keeps poly load relatively even
  388. float anglePercent = (projectionAngle - MIN_PERSPECTIVE) / (MAX_PERSPECTIVE - MIN_PERSPECTIVE);
  389. float testMax = Camera::AltitudeMaximumLo + ((Camera::AltitudeMaximumHi - Camera::AltitudeMaximumLo) * anglePercent);
  390. if (cameraAltitude > testMax)
  391. cameraAltitude = testMax;
  392. if ((cameraAltitude < testMax) && (cameraAltitudeDesired > testMax))
  393. cameraAltitude = testMax;
  394. // calculate new near and far plane distance based on
  395. // Current altitude above terrain.
  396. float altitudePercent = (cameraAltitude - AltitudeMinimum) / (testMax - AltitudeMinimum);
  397. Camera::NearPlaneDistance = MinNearPlane + ((MaxNearPlane - MinNearPlane) * altitudePercent);
  398. Camera::FarPlaneDistance = MinFarPlane + ((MaxFarPlane - MinFarPlane) * altitudePercent);
  399. if (userInput->getKeyDown(KEY_LBRACKET) && userInput->ctrl() && userInput->alt() && !userInput->shift())
  400. {
  401. useLOSAngle ^= true;
  402. }
  403. #ifdef DEBUG_CAMERA
  404. if (userInput->getKeyDown(KEY_RBRACKET) && userInput->ctrl() && userInput->alt() && !userInput->shift())
  405. {
  406. Camera::NearPlaneDistance += 10.0f;
  407. }
  408. if (userInput->getKeyDown(KEY_APOSTROPHE) && userInput->ctrl() && userInput->alt() && !userInput->shift())
  409. {
  410. Camera::FarPlaneDistance -= 1005.00f;
  411. }
  412. if (userInput->getKeyDown(KEY_SEMICOLON) && userInput->ctrl() && userInput->alt() && !userInput->shift())
  413. {
  414. Camera::FarPlaneDistance += 1005.0f;
  415. }
  416. char text[1024];
  417. sprintf(text,"Near Plane: %f Far Plane: %f",Camera::NearPlaneDistance,Camera::FarPlaneDistance);
  418. DWORD width, height;
  419. Stuff::Vector4D moveHere;
  420. moveHere.x = 10.0f;
  421. moveHere.y = 10.0f;
  422. gos_TextSetAttributes (gosFontHandle, 0, gosFontScale, false, true, false, false);
  423. gos_TextStringLength(&width,&height,text);
  424. moveHere.z = width;
  425. moveHere.w = height;
  426. globalFloatHelp[currentFloatHelp].setHelpText(text);
  427. globalFloatHelp[currentFloatHelp].setScreenPos(moveHere);
  428. globalFloatHelp[currentFloatHelp].setForegroundColor(SD_GREEN);
  429. globalFloatHelp[currentFloatHelp].setBackgroundColor(SD_BLACK);
  430. globalFloatHelp[currentFloatHelp].setScale(1.0f);
  431. globalFloatHelp[currentFloatHelp].setProportional(true);
  432. globalFloatHelp[currentFloatHelp].setBold(false);
  433. globalFloatHelp[currentFloatHelp].setItalic(false);
  434. globalFloatHelp[currentFloatHelp].setWordWrap(false);
  435. currentFloatHelp++;
  436. gosASSERT(currentFloatHelp < MAX_FLOAT_HELPS);
  437. #endif
  438. if (DisplayCameraAngle)
  439. {
  440. char text[1024];
  441. sprintf(text,"Camera Angle: %f degrees Camera Altitude: %f CameraPosition: X=%f Y=%f Z=%f CameraRotation: %f",projectionAngle,cameraAltitude,position.x,position.y,position.z,cameraRotation);
  442. DWORD width, height;
  443. Stuff::Vector4D moveHere;
  444. moveHere.x = 10.0f;
  445. moveHere.y = 10.0f;
  446. gos_TextSetAttributes (gosFontHandle, 0, gosFontScale, false, true, false, false);
  447. gos_TextStringLength(&width,&height,text);
  448. moveHere.z = width;
  449. moveHere.w = height;
  450. globalFloatHelp->setFloatHelp(text,moveHere,SD_GREEN,SD_BLACK,1.0f,true,false,false,false);
  451. }
  452. if (!compass) //Create it!
  453. {
  454. AppearanceType* appearanceType = appearanceTypeList->getAppearance( BLDG_TYPE << 24, "compass" );
  455. compass = new BldgAppearance;
  456. compass->init( appearanceType );
  457. }
  458. long result = Camera::update();
  459. // if ((day2NightTransitionTime > 0.0f) && !getIsNight() && (fabs(lastShadowLightPitch-lightPitch) > MAX_SHADOW_PITCH_CHANGE))
  460. // {
  461. // forceShadowRecalc = true;
  462. // lastShadowLightPitch = lightPitch;
  463. // }
  464. // else
  465. // {
  466. // forceShadowRecalc = false;
  467. // }
  468. //Always TRUE for right now. Debugging....
  469. //-fs
  470. //forceShadowRecalc = true;
  471. bool oldFog = useFog;
  472. bool oldShadows = useShadows;
  473. useFog = false;
  474. useShadows = false;
  475. if (compass && (turn > 3))
  476. {
  477. compass->setObjectParameters(getPosition(),0.0f,false,0,0);
  478. compass->setMoverParameters(0.0f);
  479. compass->setGesture(0);
  480. compass->setObjStatus(OBJECT_STATUS_DESTROYED);
  481. compass->setInView(true);
  482. compass->setVisibility(true,true);
  483. compass->setFilterState(true);
  484. compass->setIsHudElement();
  485. compass->update(); //Force it to try and draw or stuff will not work!
  486. }
  487. if (theSky)
  488. {
  489. Stuff::Vector3D pos = getPosition();
  490. theSky->setObjectParameters(pos,0.0f,false,0,0);
  491. theSky->setMoverParameters(0.0f);
  492. theSky->setGesture(0);
  493. theSky->setObjStatus(OBJECT_STATUS_NORMAL);
  494. theSky->setInView(true);
  495. theSky->setVisibility(true,true);
  496. theSky->setFilterState(true);
  497. theSky->setIsHudElement();
  498. theSky->update(); //Force it to try and draw or stuff will not work!
  499. }
  500. useFog = oldFog;
  501. useShadows = oldShadows;
  502. return result;
  503. }
  504. //---------------------------------------------------------------------------
  505. //
  506. // Edit log
  507. //
  508. //---------------------------------------------------------------------------