radar.cpp 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718
  1. /*
  2. ** Command & Conquer Renegade(tm)
  3. ** Copyright 2025 Electronic Arts Inc.
  4. **
  5. ** This program is free software: you can redistribute it and/or modify
  6. ** it under the terms of the GNU General Public License as published by
  7. ** the Free Software Foundation, either version 3 of the License, or
  8. ** (at your option) any later version.
  9. **
  10. ** This program is distributed in the hope that it will be useful,
  11. ** but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. ** GNU General Public License for more details.
  14. **
  15. ** You should have received a copy of the GNU General Public License
  16. ** along with this program. If not, see <http://www.gnu.org/licenses/>.
  17. */
  18. /***********************************************************************************************
  19. *** Confidential - Westwood Studios ***
  20. ***********************************************************************************************
  21. * *
  22. * Project Name : Commando *
  23. * *
  24. * $Archive:: /Commando/Code/Combat/radar.cpp $*
  25. * *
  26. * $Author:: Byon_g $*
  27. * *
  28. * $Modtime:: 1/23/02 5:48p $*
  29. * *
  30. * $Revision:: 68 $*
  31. * *
  32. *---------------------------------------------------------------------------------------------*
  33. * Functions: *
  34. * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
  35. #include "radar.h"
  36. #include "assets.h"
  37. #include "soldier.h"
  38. #include "gameobjmanager.h"
  39. #include "debug.h"
  40. #include "combat.h"
  41. #include "render2d.h"
  42. #include "texture.h"
  43. #include "playertype.h"
  44. #include "globalsettings.h"
  45. #include "objectives.h"
  46. #include "globalsettings.h"
  47. #include "wwprofile.h"
  48. #include "wwaudio.h"
  49. #include "render2dsentence.h"
  50. #include "stylemgr.h"
  51. #include "translatedb.h"
  52. #include "string_ids.h"
  53. DynamicVectorClass<RadarMarkerClass> RadarManager::Markers;
  54. Render2DClass * RadarManager::Renderer;
  55. unsigned long RadarManager::BlipColors[ NUM_BLIP_COLOR_TYPES ];
  56. const PhysicalGameObj * RadarManager::BracketObj = NULL;
  57. RectClass RadarManager::BlipUV[ NUM_BLIP_TYPES ];
  58. bool RadarManager::IsHidden = false;
  59. float RadarManager::HiddenTimer = 0.0f;
  60. RadarModeEnum RadarManager::RadarMode = RADAR_ALL;
  61. Render2DSentenceClass * RadarManager::CompassRenderers[8];
  62. int RadarManager::CurrentCompassRendererIndex;
  63. static Matrix3D RadarTM;
  64. #if 0
  65. static float RadarSweep = 0;
  66. static float RadarSweepMove;
  67. #endif
  68. DynamicVectorClass<Render2DClass *> Blips;
  69. const char * RadarManager::Get_Blip_Shape_Type_Name( int index )
  70. {
  71. static const char * names[ NUM_BLIP_SHAPE_TYPES ] = {
  72. "None",
  73. "Human",
  74. "Vehicle",
  75. "Stationary",
  76. "Objective",
  77. };
  78. return names[index];
  79. }
  80. /*
  81. **
  82. */
  83. static const RectClass & Scale_UV( const RectClass & uv, float texture_size )
  84. {
  85. static RectClass new_uv;
  86. new_uv = uv;
  87. new_uv.Scale( 1/texture_size );
  88. return new_uv;
  89. }
  90. void RadarManager::Set_Hidden( bool onoff )
  91. {
  92. if ( IsHidden != onoff ) {
  93. int sound_id = 0;
  94. if ( onoff ) {
  95. sound_id = HUDGlobalSettingsDef::Get_Instance()->RadarOnSoundID;
  96. } else {
  97. sound_id = HUDGlobalSettingsDef::Get_Instance()->RadarOffSoundID;
  98. }
  99. if (sound_id != 0) {
  100. WWAudioClass::Get_Instance ()->Create_Instant_Sound (sound_id, Matrix3D (1));
  101. }
  102. IsHidden = onoff;
  103. }
  104. }
  105. /*
  106. **
  107. */
  108. #define RADAR_TEXTURE "HUD_MAIN.TGA"
  109. extern Vector2 INFO_UV_SCALE;
  110. extern Vector2 RADAR_RINGS_UV_UL;
  111. extern Vector2 RADAR_RINGS_UV_LR;
  112. extern Vector2 RADAR_RINGS_L_OFFSET;
  113. extern Vector2 RADAR_RINGS_R_OFFSET;
  114. extern Vector2 RADAR_STAR_UV_UL;
  115. extern Vector2 RADAR_STAR_UV_LR;
  116. extern Vector2 RADAR_SQUARE_UV_UL;
  117. extern Vector2 RADAR_SQUARE_UV_LR;
  118. extern Vector2 RADAR_TRIANGLE_UV_UL;
  119. extern Vector2 RADAR_TRIANGLE_UV_LR;
  120. extern Vector2 RADAR_CIRCLE_UV_UL;
  121. extern Vector2 RADAR_CIRCLE_UV_LR;
  122. extern Vector2 RADAR_BRACKET_UV_UL;
  123. extern Vector2 RADAR_BRACKET_UV_LR;
  124. extern Vector2 RADAR_SWEEP_UV_UL;
  125. extern Vector2 RADAR_SWEEP_UV_LR;
  126. void RadarManager::Init()
  127. {
  128. int i;
  129. BracketObj = NULL;
  130. Renderer = new Render2DClass();
  131. Renderer->Set_Texture( RADAR_TEXTURE );
  132. Renderer->Set_Coordinate_Range( Render2DClass::Get_Screen_Resolution() );
  133. // Init Colors
  134. for ( i = 0; i < NUM_BLIP_COLOR_TYPES; i++ ) {
  135. BlipColors[ i ] = 0xFFFFFFFF;
  136. }
  137. if ( HUDGlobalSettingsDef::Get_Instance() != NULL ) {
  138. BlipColors[ BLIP_COLOR_TYPE_NOD ] = HUDGlobalSettingsDef::Get_Instance()->Get_Nod_Color().Convert_To_ARGB();
  139. BlipColors[ BLIP_COLOR_TYPE_GDI ] = HUDGlobalSettingsDef::Get_Instance()->Get_GDI_Color().Convert_To_ARGB();
  140. BlipColors[ BLIP_COLOR_TYPE_NEUTRAL ] = HUDGlobalSettingsDef::Get_Instance()->Get_Neutral_Color().Convert_To_ARGB();
  141. BlipColors[ BLIP_COLOR_TYPE_MUTANT ] = HUDGlobalSettingsDef::Get_Instance()->Get_Mutant_Color().Convert_To_ARGB();
  142. BlipColors[ BLIP_COLOR_TYPE_RENEGADE ] = HUDGlobalSettingsDef::Get_Instance()->Get_Renegade_Color().Convert_To_ARGB();
  143. BlipColors[ BLIP_COLOR_TYPE_PRIMARY_OBJECTIVE ] = HUDGlobalSettingsDef::Get_Instance()->Get_Primary_Objective_Color().Convert_To_ARGB();
  144. BlipColors[ BLIP_COLOR_TYPE_SECONDARY_OBJECTIVE ] = HUDGlobalSettingsDef::Get_Instance()->Get_Secondary_Objective_Color().Convert_To_ARGB();
  145. BlipColors[ BLIP_COLOR_TYPE_TERTIARY_OBJECTIVE ] = HUDGlobalSettingsDef::Get_Instance()->Get_Tertiary_Objective_Color().Convert_To_ARGB();
  146. }
  147. #if 0
  148. const HUDGlobalSettingsDef * settings = HUDGlobalSettingsDef::Get_Instance();
  149. float radar_texture_size = settings->RadarTextureSize;
  150. BlipUV[ BLIP_SHAPE_TYPE_NONE ] = RectClass( 0,0,0,0 );
  151. BlipUV[ BLIP_SHAPE_TYPE_HUMAN ] = Scale_UV( settings->RadarHumanBlipUV, radar_texture_size );
  152. BlipUV[ BLIP_SHAPE_TYPE_VEHICLE ] = Scale_UV( settings->RadarVehicleBlipUV, radar_texture_size );
  153. BlipUV[ BLIP_SHAPE_TYPE_STATIONARY ] = Scale_UV( settings->RadarStationaryBlipUV, radar_texture_size );
  154. BlipUV[ BLIP_SHAPE_TYPE_OBJECTIVE ] = Scale_UV( settings->RadarObjectiveBlipUV, radar_texture_size );
  155. BlipUV[ BLIP_BRACKET ] = Scale_UV( settings->RadarBlipBracketUV, radar_texture_size );
  156. BlipUV[ BLIP_SWEEP ] = Scale_UV( settings->RadarSweepUV, radar_texture_size );
  157. #else
  158. BlipUV[ BLIP_SHAPE_TYPE_NONE ] = RectClass( 0,0,0,0 );
  159. BlipUV[ BLIP_SHAPE_TYPE_HUMAN ] = RectClass( RADAR_CIRCLE_UV_UL, RADAR_CIRCLE_UV_LR );
  160. BlipUV[ BLIP_SHAPE_TYPE_VEHICLE ] = RectClass( RADAR_TRIANGLE_UV_UL, RADAR_TRIANGLE_UV_LR );
  161. BlipUV[ BLIP_SHAPE_TYPE_STATIONARY ] = RectClass( RADAR_SQUARE_UV_UL, RADAR_SQUARE_UV_LR );
  162. BlipUV[ BLIP_SHAPE_TYPE_OBJECTIVE ] = RectClass( RADAR_STAR_UV_UL, RADAR_STAR_UV_LR );
  163. BlipUV[ BLIP_BRACKET ] = RectClass( RADAR_BRACKET_UV_UL, RADAR_BRACKET_UV_LR );
  164. BlipUV[ BLIP_SWEEP ] = RectClass( RADAR_SWEEP_UV_UL, RADAR_SWEEP_UV_LR );
  165. BlipUV[ BLIP_SHAPE_TYPE_HUMAN ].Scale( INFO_UV_SCALE );
  166. BlipUV[ BLIP_SHAPE_TYPE_VEHICLE ].Scale( INFO_UV_SCALE );
  167. BlipUV[ BLIP_SHAPE_TYPE_STATIONARY ].Scale( INFO_UV_SCALE );
  168. BlipUV[ BLIP_SHAPE_TYPE_OBJECTIVE ].Scale( INFO_UV_SCALE );
  169. BlipUV[ BLIP_BRACKET ].Scale( INFO_UV_SCALE );
  170. BlipUV[ BLIP_SWEEP ].Scale( INFO_UV_SCALE );
  171. #endif
  172. // Clear radar renderer pointers, these are initialized on demand
  173. for (i=0;i<8;++i) {
  174. CompassRenderers[i] = NULL;
  175. }
  176. // Don't reset the markers here, Some may have already been added when loading the level (Created)
  177. HiddenTimer = 0;
  178. }
  179. /*
  180. **
  181. */
  182. void RadarManager::Shutdown()
  183. {
  184. if ( Renderer ) {
  185. delete Renderer;
  186. Renderer = NULL;
  187. }
  188. while ( Blips.Count() > 0 ) {
  189. int index = Blips.Count() - 1;
  190. delete Blips[ index ];
  191. Blips.Delete( index );
  192. }
  193. for (int i=0;i<8;++i) {
  194. delete CompassRenderers[i];
  195. CompassRenderers[i] = NULL;
  196. }
  197. Markers.Delete_All();
  198. IsHidden = false; // Do this here rather than init, because init is called after load
  199. }
  200. /*
  201. **
  202. */
  203. enum {
  204. CHUNKID_MANAGER_VARIABLES = 630001357,
  205. CHUNKID_MARKER_ENTRY,
  206. MICROCHUNKID_IS_HIDDEN = 1,
  207. MICROCHUNKID_HIDDEN_TIMER,
  208. };
  209. /*
  210. **
  211. */
  212. bool RadarManager::Save( ChunkSaveClass &csave )
  213. {
  214. csave.Begin_Chunk( CHUNKID_MANAGER_VARIABLES );
  215. WRITE_MICRO_CHUNK( csave, MICROCHUNKID_IS_HIDDEN, IsHidden );
  216. WRITE_MICRO_CHUNK( csave, MICROCHUNKID_HIDDEN_TIMER, HiddenTimer );
  217. csave.End_Chunk();
  218. for ( int i = 0; i < Markers.Count(); i++ ) {
  219. csave.Begin_Chunk( CHUNKID_MARKER_ENTRY );
  220. Markers[i].Save( csave );
  221. csave.End_Chunk();
  222. }
  223. return true;
  224. }
  225. bool RadarManager::Load( ChunkLoadClass &cload )
  226. {
  227. WWASSERT( Markers.Count() == 0 );
  228. while (cload.Open_Chunk()) {
  229. switch(cload.Cur_Chunk_ID()) {
  230. case CHUNKID_MANAGER_VARIABLES:
  231. while (cload.Open_Micro_Chunk()) {
  232. switch(cload.Cur_Micro_Chunk_ID()) {
  233. READ_MICRO_CHUNK( cload, MICROCHUNKID_IS_HIDDEN, IsHidden );
  234. READ_MICRO_CHUNK( cload, MICROCHUNKID_HIDDEN_TIMER, HiddenTimer );
  235. default:
  236. Debug_Say(("Unhandled Chunk:%d File:%s Line:%d\r\n",cload.Cur_Chunk_ID(),__FILE__,__LINE__));
  237. break;
  238. }
  239. cload.Close_Micro_Chunk();
  240. }
  241. break;
  242. case CHUNKID_MARKER_ENTRY:
  243. {
  244. RadarMarkerClass marker;
  245. marker.Load( cload );
  246. Add_Marker( marker );
  247. break;
  248. }
  249. default:
  250. Debug_Say(("Unhandled Chunk:%d File:%s Line:%d\r\n",cload.Cur_Chunk_ID(),__FILE__,__LINE__));
  251. break;
  252. }
  253. cload.Close_Chunk();
  254. }
  255. return true;
  256. }
  257. /*
  258. **
  259. */
  260. #define RADAR_RADIUS 84
  261. #define BLIP_SIZE 4
  262. #define RADAR_FADE_STOP (RADAR_RADIUS * 0.60f)
  263. #define RADAR_FADE_START (RADAR_RADIUS * 0.50f)
  264. #define RADAR_CENTER_TWEAK Vector2( 1, 2 )
  265. Vector2 OldRadarCenter(0.0f,0.0f);
  266. Vector2 RadarCenter(0.0f,0.0f);
  267. float RadarIntensity;
  268. long RadarColor;
  269. float RadarManager::Add_Blip( const Vector3 & pos, int shape_type, int color_type, float intensity, bool bracket, bool altitude_fade )
  270. {
  271. if ( shape_type != BLIP_SHAPE_TYPE_NONE ) {
  272. Vector3 screen = RadarTM * pos;
  273. screen *= RADAR_RADIUS;
  274. screen *= 0.01f; // screen *= ZoomFactor;
  275. screen.Z = 0;
  276. float dist = screen.Length();
  277. if ( shape_type == BLIP_SHAPE_TYPE_OBJECTIVE ) {
  278. if ( dist >= RADAR_FADE_STOP ) {
  279. screen.Normalize();
  280. screen *= RADAR_FADE_STOP;
  281. dist = RADAR_FADE_STOP;
  282. }
  283. }
  284. if ( dist <= RADAR_FADE_STOP )
  285. {
  286. #if 0
  287. // Find blip bearing
  288. float bearing = WWMath::Atan2( screen.Y, screen.X );
  289. // find the bering relative to sweep
  290. bearing = WWMath::Wrap( bearing - RadarSweep, -DEG_TO_RADF( 360 ), 0 );
  291. if ( bearing > -RadarSweepMove*2 ) {
  292. intensity = 1.0; // Ping
  293. }
  294. #else
  295. intensity = 1.0; // Always Ping
  296. #endif
  297. float alpha = 1.0f - ((dist - RADAR_FADE_START) / (RADAR_FADE_STOP - RADAR_FADE_START) );
  298. alpha = WWMath::Clamp( alpha, 0, 1 );
  299. if ( shape_type == BLIP_SHAPE_TYPE_OBJECTIVE ) {
  300. alpha = 1;
  301. }
  302. float color_alpha = alpha * intensity;
  303. if ( altitude_fade ) {
  304. color_alpha *= 0.66f;
  305. }
  306. unsigned int color = BlipColors[ color_type ];
  307. color &= 0x00FFFFFF;
  308. color |= (unsigned int)(RadarIntensity * color_alpha * 255) << 24;
  309. if ( Renderer ) {
  310. RectClass blip( -BLIP_SIZE, -BLIP_SIZE, BLIP_SIZE, BLIP_SIZE );
  311. if ( altitude_fade ) {
  312. blip.Scale_Relative_Center( 0.66f );
  313. }
  314. blip += Vector2( -screen.X, screen.Y );
  315. blip += RadarCenter + RADAR_CENTER_TWEAK;
  316. RectClass uv = BlipUV[ shape_type ];
  317. Renderer->Add_Quad( blip, uv, color );
  318. if ( bracket ) {
  319. color = 0x0000FF00; // Make Green
  320. color |= (unsigned int)(RadarIntensity * alpha * 255) << 24;
  321. RectClass uv = BlipUV[ BLIP_BRACKET ];
  322. Renderer->Add_Quad( blip, uv, color );
  323. }
  324. }
  325. }
  326. }
  327. return intensity;
  328. }
  329. #define COMPASS_OFFSET Vector2( 2, -73 )
  330. #define RADAR_Z_RANGE 3
  331. void RadarManager::Update( const Matrix3D & player_tm, const Vector2 & center )
  332. {
  333. WWPROFILE( "Radar Update" );
  334. OldRadarCenter=RadarCenter;
  335. RadarCenter = center;
  336. RadarTM = player_tm;
  337. RadarTM.Pre_Rotate_Z( DEG_TO_RAD( -90 ) );
  338. #if 0
  339. RadarSweepMove = TimeManager::Get_Frame_Seconds() * 2;
  340. RadarSweep -= RadarSweepMove;
  341. if ( RadarSweep < 0 ) {
  342. RadarSweep += DEG_TO_RAD( 360 );
  343. }
  344. #endif
  345. HiddenTimer += TimeManager::Get_Frame_Seconds() * (IsHidden ? 1 : -1);
  346. HiddenTimer = WWMath::Clamp( HiddenTimer, 0, 1 );
  347. RadarIntensity = 1-HiddenTimer;
  348. RadarColor = ((int)((1-HiddenTimer) * 255) << 24) | 0x00FFFFFF;
  349. Renderer->Reset();
  350. if ( RadarIntensity == 0 ) {
  351. return;
  352. }
  353. // Radar Rings
  354. RectClass uv;
  355. RectClass draw;
  356. uv.Set( RADAR_RINGS_UV_UL, RADAR_RINGS_UV_LR );
  357. draw = uv;
  358. draw.Right = draw.Left + uv.Height();
  359. draw.Bottom = draw.Top + uv.Width();
  360. uv.Scale( INFO_UV_SCALE );
  361. draw += center + RADAR_RINGS_L_OFFSET - draw.Upper_Left();
  362. Renderer->Add_Quad( draw.Lower_Left(), draw.Lower_Right(), draw.Upper_Left(), draw.Upper_Right(), uv, RadarColor );
  363. draw += center + RADAR_RINGS_R_OFFSET - draw.Upper_Left();
  364. Renderer->Add_Quad_Backfaced( draw.Lower_Right(), draw.Lower_Left(), draw.Upper_Right(), draw.Upper_Left(), uv, RadarColor );
  365. #if 0
  366. {WWPROFILE( "Sweep" );
  367. // Draw sweep Line
  368. Vector2 edge = Vector2( -WWMath::Cos( RadarSweep ), WWMath::Sin( RadarSweep ) ) * RADAR_FADE_STOP + center;
  369. float width = 20;
  370. Vector2 corner_offset = center - edge; // get line relative to edge
  371. float temp = corner_offset.X; // Rotate 90
  372. corner_offset.X = corner_offset.Y;
  373. corner_offset.Y = -temp;
  374. corner_offset.Normalize(); // scale to length width/2
  375. corner_offset *= width;
  376. RectClass uv = BlipUV[ BLIP_SWEEP ];
  377. Renderer->Add_Tri( edge - corner_offset, center, edge,
  378. uv.Lower_Left(), uv.Upper_Right(), uv.Upper_Left(), 0xFF00FF00 & RadarColor );
  379. }
  380. #endif
  381. #if 0
  382. {WWPROFILE( "Compass" );
  383. // Draw the compass
  384. const HUDGlobalSettingsDef * settings = HUDGlobalSettingsDef::Get_Instance();
  385. float radar_texture_size = settings->RadarTextureSize;
  386. float bering = WWMath::Wrap( (player_tm.Get_Z_Rotation() / DEG_TO_RAD( 360.0f )) + 0.25f, 0, 1 );
  387. int frame = (int)((bering * 8.0f) + 0.5f);
  388. RectClass compass( Vector2( 0, 0 ), settings->RadarCompassSize );
  389. // compass += Render2DClass::Get_Screen_Resolution().Lower_Left() + settings->RadarCompassOffset;
  390. compass += center + COMPASS_OFFSET;
  391. RectClass compass_uv = Scale_UV( settings->RadarCompassBaseUV, radar_texture_size );
  392. compass_uv += (settings->RadarCompassUVOffset/radar_texture_size) * (frame & 7);
  393. Renderer->Add_Quad( compass, compass_uv, RadarColor );
  394. }
  395. #else
  396. float bering = WWMath::Wrap( (player_tm.Get_Z_Rotation() / DEG_TO_RAD( 360.0f )) + 0.25f, 0, 1 );
  397. CurrentCompassRendererIndex = (int)((bering * 8.0f) + 0.5f);
  398. CurrentCompassRendererIndex&=7;
  399. int dir[8] = { IDS_HUD_COMPASS_N, IDS_HUD_COMPASS_NE, IDS_HUD_COMPASS_E, IDS_HUD_COMPASS_SE,
  400. IDS_HUD_COMPASS_S, IDS_HUD_COMPASS_SW, IDS_HUD_COMPASS_W, IDS_HUD_COMPASS_NW };
  401. // If the renderer object for this particular radar direction hasn't been created, create it now...
  402. if (!CompassRenderers[CurrentCompassRendererIndex]) {
  403. CompassRenderers[CurrentCompassRendererIndex]=new Render2DSentenceClass();
  404. FontCharsClass *font = StyleMgrClass::Peek_Font( StyleMgrClass::FONT_INGAME_TXT );
  405. CompassRenderers[CurrentCompassRendererIndex]->Set_Font( font );
  406. CompassRenderers[CurrentCompassRendererIndex]->Reset();
  407. CompassRenderers[CurrentCompassRendererIndex]->Build_Sentence(TRANSLATE(dir[CurrentCompassRendererIndex]));
  408. Vector2 text_size=CompassRenderers[CurrentCompassRendererIndex]->Get_Text_Extents(TRANSLATE(dir[CurrentCompassRendererIndex]));
  409. Vector2 pos = center + COMPASS_OFFSET - (text_size * 0.5f);
  410. pos.X = (int)pos.X;
  411. pos.Y = (int)pos.Y;
  412. CompassRenderers[CurrentCompassRendererIndex]->Set_Location( pos );
  413. CompassRenderers[CurrentCompassRendererIndex]->Draw_Sentence();
  414. }
  415. else {
  416. // If the radar center has moved (which should never happen unless the screen size changes)
  417. if (RadarCenter!=OldRadarCenter) {
  418. CompassRenderers[CurrentCompassRendererIndex]->Reset();
  419. CompassRenderers[CurrentCompassRendererIndex]->Build_Sentence( TRANSLATE(dir[CurrentCompassRendererIndex]));
  420. Vector2 text_size=CompassRenderers[CurrentCompassRendererIndex]->Get_Text_Extents(TRANSLATE(dir[CurrentCompassRendererIndex]));
  421. Vector2 pos = center + COMPASS_OFFSET - (text_size * 0.5f);
  422. pos.X = (int)pos.X;
  423. pos.Y = (int)pos.Y;
  424. CompassRenderers[CurrentCompassRendererIndex]->Set_Location( pos );
  425. CompassRenderers[CurrentCompassRendererIndex]->Draw_Sentence();
  426. }
  427. }
  428. #endif
  429. // Now build the blips
  430. float star_z = 0;
  431. if ( COMBAT_STAR ) {
  432. Vector3 p;
  433. COMBAT_STAR->Get_Position( &p );
  434. star_z = p.Z;
  435. }
  436. {WWPROFILE( "Blips" );
  437. // for all physicalgameobjs
  438. SLNode<BaseGameObj> *objnode;
  439. for ( objnode = GameObjManager::Get_Game_Obj_List()->Head(); objnode; objnode = objnode->Next()) {
  440. PhysicalGameObj *obj = objnode->Data()->As_PhysicalGameObj();
  441. if ( obj ) {
  442. if ( obj == COMBAT_STAR ) continue; // Don't draw the star
  443. if ( obj->Peek_Physical_Object() == NULL ) continue;
  444. // Don't draw dead soldiers
  445. if ( obj->As_SoldierGameObj() &&
  446. obj->Get_Defense_Object() &&
  447. obj->Get_Defense_Object()->Get_Health() <= 0.0f ) {
  448. continue;
  449. }
  450. //
  451. // TSS: Filter blips based on RadarMode
  452. //
  453. if (COMBAT_STAR != NULL && RadarMode != RADAR_ALL) {
  454. if (RadarMode == RADAR_NOBODY) {
  455. continue;
  456. } else {
  457. WWASSERT(RadarMode == RADAR_TEAMMATES);
  458. int other_pt = obj->Get_Player_Type();
  459. int my_pt = COMBAT_STAR->Get_Player_Type();
  460. if (my_pt != other_pt ||
  461. (my_pt != PLAYERTYPE_NOD && my_pt != PLAYERTYPE_GDI)) {
  462. continue;
  463. }
  464. }
  465. }
  466. //
  467. // gth: don't show radar blips for enemy stealthed units
  468. //
  469. SmartGameObj * smart_obj = obj->As_SmartGameObj();
  470. if ((smart_obj != NULL) && (smart_obj->Is_Stealthed())) {
  471. int obj_pt = smart_obj->Get_Player_Type();
  472. int my_pt = COMBAT_STAR->Get_Player_Type();
  473. if (my_pt != obj_pt) {
  474. continue;
  475. }
  476. }
  477. Vector3 objpos;
  478. obj->Get_Position( &objpos );
  479. bool altitude_fade = false;
  480. float z_diff = star_z - objpos.Z;
  481. if ( WWMath::Fabs( z_diff ) > RADAR_Z_RANGE) {
  482. altitude_fade = true;
  483. }
  484. // if ( (WWMath::Fabs( z_diff ) < RADAR_Z_RANGE) || (obj->Get_Radar_Blip_Shape_Type() == BLIP_SHAPE_TYPE_OBJECTIVE) ) {
  485. float intensity = obj->Get_Radar_Blip_Intensity();
  486. bool bracket = obj == BracketObj;
  487. intensity = Add_Blip( objpos, obj->Get_Radar_Blip_Shape_Type(), obj->Get_Radar_Blip_Color_Type(), intensity, bracket, altitude_fade );
  488. #if 0
  489. intensity -= RadarSweepMove / DEG_TO_RAD( 360 ) * 0.666f; // Drop Blip intensity
  490. #endif
  491. obj->Set_Radar_Blip_Intensity( WWMath::Clamp( intensity, 0, 1 ) );
  492. // }
  493. }
  494. }
  495. }
  496. int i;
  497. {WWPROFILE( "Objectives" );
  498. // for all objectives with a position
  499. int count = ObjectiveManager::Get_Objective_Count();
  500. for ( int i = 0; i < count; i++ ) {
  501. Objective * objective = ObjectiveManager::Get_Objective( i );
  502. if ( objective->DrawBlip && objective->Status == ObjectiveManager::STATUS_IS_PENDING ) {
  503. float intensity = objective->BlipIntensity;
  504. intensity = Add_Blip( objective->Position, BLIP_SHAPE_TYPE_OBJECTIVE, objective->Radar_Blip_Color_Type(), intensity, false );
  505. #if 0
  506. intensity -= RadarSweepMove / DEG_TO_RAD( 360 ) * 0.666f; // Drop Blip intensity
  507. #endif
  508. objective->BlipIntensity = WWMath::Clamp( intensity, 0, 1 );
  509. }
  510. }
  511. }
  512. {WWPROFILE( "Markers" );
  513. // for all markers
  514. for ( i = 0; i < Markers.Count(); i++ ) {
  515. float intensity = Markers[i].Intensity;
  516. intensity = Add_Blip( Markers[i].Position, Markers[i].Type, Markers[i].Color, intensity, false );
  517. #if 0
  518. intensity -= RadarSweepMove / DEG_TO_RAD( 360 ) * 0.666f; // Drop Blip intensity
  519. #endif
  520. Markers[i].Intensity = WWMath::Clamp( intensity, 0, 1 );
  521. }
  522. }
  523. }
  524. /*
  525. **
  526. */
  527. void RadarManager::Render( void )
  528. {
  529. if ( (HiddenTimer < 1) && Renderer ) {
  530. Renderer->Render();
  531. if ( CompassRenderers[CurrentCompassRendererIndex] != NULL ) {
  532. CompassRenderers[CurrentCompassRendererIndex]->Render();
  533. }
  534. }
  535. }
  536. /*
  537. **
  538. */
  539. void RadarManager::Clear_Marker( int id )
  540. {
  541. for ( int i = 0; i < Markers.Count(); i++ ) {
  542. if ( Markers[i].ID == id ) {
  543. Markers.Delete( i );
  544. i--;
  545. }
  546. }
  547. }
  548. void RadarManager::Change_Marker_Color( int id, int color )
  549. {
  550. for ( int i = 0; i < Markers.Count(); i++ ) {
  551. if ( Markers[i].ID == id ) {
  552. Markers[i].Color = color;
  553. }
  554. }
  555. }
  556. /*
  557. **
  558. */
  559. RadarMarkerClass::RadarMarkerClass( void ) :
  560. ID( 0 ),
  561. Type( 0 ),
  562. Color( 0 ),
  563. Position( 0,0,0 ),
  564. Intensity( 0 )
  565. {
  566. }
  567. enum {
  568. CHUNKID_VARIABLES = 630001403,
  569. XXXCHUNKID_GAME_OBJ_REF,
  570. MICROCHUNKID_ID = 1,
  571. MICROCHUNKID_POSITION,
  572. XXXMICROCHUNKID_COLOR,
  573. XXXMICROCHUNKID_FLASH,
  574. XXXMICROCHUNKID_OBJECT_BASED,
  575. MICROCHUNKID_TYPE,
  576. MICROCHUNKID_COLOR,
  577. };
  578. bool RadarMarkerClass::Save( ChunkSaveClass & csave )
  579. {
  580. csave.Begin_Chunk( CHUNKID_VARIABLES );
  581. WRITE_MICRO_CHUNK( csave, MICROCHUNKID_ID, ID );
  582. WRITE_MICRO_CHUNK( csave, MICROCHUNKID_POSITION, Position );
  583. WRITE_MICRO_CHUNK( csave, MICROCHUNKID_TYPE, Type );
  584. WRITE_MICRO_CHUNK( csave, MICROCHUNKID_COLOR, Color );
  585. csave.End_Chunk();
  586. return true;
  587. }
  588. bool RadarMarkerClass::Load( ChunkLoadClass &cload )
  589. {
  590. while (cload.Open_Chunk()) {
  591. switch(cload.Cur_Chunk_ID()) {
  592. case CHUNKID_VARIABLES:
  593. while (cload.Open_Micro_Chunk()) {
  594. switch(cload.Cur_Micro_Chunk_ID()) {
  595. READ_MICRO_CHUNK( cload, MICROCHUNKID_ID, ID );
  596. READ_MICRO_CHUNK( cload, MICROCHUNKID_POSITION, Position );
  597. READ_MICRO_CHUNK( cload, MICROCHUNKID_TYPE, Type );
  598. READ_MICRO_CHUNK( cload, MICROCHUNKID_COLOR, Color );
  599. default:
  600. Debug_Say(("Unhandled Chunk:%d File:%s Line:%d\r\n",cload.Cur_Chunk_ID(),__FILE__,__LINE__));
  601. break;
  602. }
  603. cload.Close_Micro_Chunk();
  604. }
  605. break;
  606. default:
  607. Debug_Say(("Unhandled Chunk:%d File:%s Line:%d\r\n",cload.Cur_Chunk_ID(),__FILE__,__LINE__));
  608. break;
  609. }
  610. cload.Close_Chunk();
  611. }
  612. return true;
  613. }