Skip to content

Commit f90615f

Browse files
committed
[ZH] Fix Hero Radar icon garrison issues introduced by #1035
1 parent 0a97cd0 commit f90615f

File tree

4 files changed

+87
-79
lines changed

4 files changed

+87
-79
lines changed

GeneralsMD/Code/GameEngine/Include/Common/Radar.h

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,13 @@ enum RadarEventType CPP_11(: Int)
8080

8181
};
8282

83+
enum RadarObjectType CPP_11(: Int)
84+
{
85+
RadarObjectType_None = 0,
86+
RadarObjectType_Regular,
87+
RadarObjectType_Local,
88+
};
89+
8390
// PROTOTYPES /////////////////////////////////////////////////////////////////////////////////////
8491

8592
//-------------------------------------------------------------------------------------------------
@@ -109,6 +116,7 @@ class RadarObject : public MemoryPoolObject,
109116
inline const RadarObject *friend_getNext( void ) const { return m_next; }
110117

111118
Bool isTemporarilyHidden() const;
119+
static Bool isTemporarilyHidden(const Object* obj);
112120

113121
protected:
114122

@@ -178,7 +186,7 @@ class Radar : public Snapshot,
178186
ICoord2D *ul, ICoord2D *lr ); ///< make translation for screen area of radar square to scaled aspect ratio preserving points inside the radar area
179187

180188
// priority inquiry
181-
Bool isPriorityVisible( RadarPriorityType priority ) const; ///< is the priority passed in a "visible" one on the radar
189+
static Bool isPriorityVisible( RadarPriorityType priority ); ///< is the priority passed in a "visible" one on the radar
182190

183191
// radar events
184192
void createEvent( const Coord3D *world, RadarEventType type, Real secondsToLive = 4.0f ); ///< create radar event at location in world
@@ -190,8 +198,8 @@ class Radar : public Snapshot,
190198
Bool tryEvent( RadarEventType event, const Coord3D *pos ); ///< try to make a "stealth" event
191199

192200
// adding and removing objects from the radar
193-
virtual bool addObject( Object *obj ); ///< add object to radar
194-
virtual bool removeObject( Object *obj ); ///< remove object from radar
201+
virtual RadarObjectType addObject( Object *obj ); ///< add object to radar
202+
virtual RadarObjectType removeObject( Object *obj ); ///< remove object from radar
195203

196204
// radar options
197205
void hide( Bool hide ) { m_radarHidden = hide; } ///< hide/unhide the radar
@@ -226,9 +234,6 @@ class Radar : public Snapshot,
226234
virtual void xfer( Xfer *xfer );
227235
virtual void loadPostProcess( void );
228236

229-
virtual void onLocalRadarObjectAdded( const RadarObject* radarObject ) = 0;
230-
virtual void onLocalRadarObjectRemoved( const RadarObject* radarObject ) = 0;
231-
232237
/// internal method for creating a radar event with specific colors
233238
void internalCreateEvent( const Coord3D *world, RadarEventType type, Real secondsToLive,
234239
const RGBAColorInt *color1, const RGBAColorInt *color2 );
@@ -303,8 +308,6 @@ class RadarDummy : public Radar
303308
virtual void draw(Int pixelX, Int pixelY, Int width, Int height) { }
304309
virtual void clearShroud() { }
305310
virtual void setShroudLevel(Int x, Int y, CellShroudStatus setting) { }
306-
virtual void onLocalRadarObjectAdded(const RadarObject*) { }
307-
virtual void onLocalRadarObjectRemoved(const RadarObject*) { }
308311
};
309312

310313
#endif // __RADAR_H_

GeneralsMD/Code/GameEngine/Source/Common/System/Radar.cpp

Lines changed: 25 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -71,8 +71,6 @@ void Radar::deleteListResources( void )
7171
while( m_localObjectList )
7272
{
7373

74-
onLocalRadarObjectRemoved( m_localObjectList );
75-
7674
// get next object
7775
nextObject = m_localObjectList->friend_getNext();
7876

@@ -138,8 +136,15 @@ RadarObject::~RadarObject( void )
138136
//-------------------------------------------------------------------------------------------------
139137
Bool RadarObject::isTemporarilyHidden() const
140138
{
141-
Drawable* draw = m_object->getDrawable();
142-
if (draw->getStealthLook() == STEALTHLOOK_INVISIBLE || draw->isDrawableEffectivelyHidden())
139+
return isTemporarilyHidden(m_object);
140+
}
141+
142+
//-------------------------------------------------------------------------------------------------
143+
//-------------------------------------------------------------------------------------------------
144+
Bool RadarObject::isTemporarilyHidden(const Object* obj)
145+
{
146+
Drawable* draw = obj->getDrawable();
147+
if (draw == NULL || draw->getStealthLook() == STEALTHLOOK_INVISIBLE || draw->isDrawableEffectivelyHidden())
143148
return true;
144149

145150
return false;
@@ -394,13 +399,13 @@ void Radar::newMap( TerrainLogic *terrain )
394399
/** Add an object to the radar list. The object will be sorted in the list to be grouped
395400
* using it's radar priority */
396401
//-------------------------------------------------------------------------------------------------
397-
bool Radar::addObject( Object *obj )
402+
RadarObjectType Radar::addObject( Object *obj )
398403
{
399404

400405
// get the radar priority for this object
401406
RadarPriorityType newPriority = obj->getRadarPriority();
402407
if( isPriorityVisible( newPriority ) == FALSE )
403-
return false;
408+
return RadarObjectType_None;
404409

405410
// if this object is on the radar, remove it in favor of the new add
406411
RadarObject **list;
@@ -466,14 +471,21 @@ bool Radar::addObject( Object *obj )
466471
// set a chunk of radar data in the object
467472
obj->friend_setRadarData( newObj );
468473

474+
RadarObjectType objectType;
469475
//
470476
// we will put this on either the local object list for objects that belong to the
471477
// local player, or on the regular object list for all other objects
472478
//
473479
if( obj->isLocallyControlled() )
480+
{
474481
list = &m_localObjectList;
482+
objectType = RadarObjectType_Local;
483+
}
475484
else
485+
{
476486
list = &m_objectList;
487+
objectType = RadarObjectType_Regular;
488+
}
477489

478490
// link object to master list at the head of it's priority section
479491
if( *list == NULL )
@@ -544,12 +556,7 @@ bool Radar::addObject( Object *obj )
544556

545557
} // end else
546558

547-
if (list == &m_localObjectList)
548-
{
549-
onLocalRadarObjectAdded(newObj);
550-
}
551-
552-
return true;
559+
return objectType;
553560
} // end addObject
554561

555562
//-------------------------------------------------------------------------------------------------
@@ -565,10 +572,6 @@ Bool Radar::deleteFromList( Object *obj, RadarObject **list )
565572

566573
if( radarObject->friend_getObject() == obj )
567574
{
568-
if (list == &m_localObjectList)
569-
{
570-
onLocalRadarObjectRemoved( radarObject );
571-
}
572575

573576
// unlink the object from list
574577
if( prevObject == NULL )
@@ -600,24 +603,24 @@ Bool Radar::deleteFromList( Object *obj, RadarObject **list )
600603
//-------------------------------------------------------------------------------------------------
601604
/** Remove an object from the radar, the object may reside in any list */
602605
//-------------------------------------------------------------------------------------------------
603-
bool Radar::removeObject( Object *obj )
606+
RadarObjectType Radar::removeObject( Object *obj )
604607
{
605608

606609
// sanity
607610
if( obj->friend_getRadarData() == NULL )
608-
return false;
611+
return RadarObjectType_None;
609612

610613
if( deleteFromList( obj, &m_localObjectList ) == TRUE )
611-
return true;
614+
return RadarObjectType_Local;
612615
else if( deleteFromList( obj, &m_objectList ) == TRUE )
613-
return true;
616+
return RadarObjectType_Regular;
614617
else
615618
{
616619

617620
// sanity
618621
DEBUG_ASSERTCRASH( 0, ("Radar: Tried to remove object '%s' which was not found\n",
619622
obj->getTemplate()->getName().str()) );
620-
return false;
623+
return RadarObjectType_None;
621624
} // end else
622625

623626
} // end removeObject
@@ -1558,7 +1561,7 @@ void Radar::loadPostProcess( void )
15581561
// ------------------------------------------------------------------------------------------------
15591562
/** Is the priority type passed in a "visible" one that can show up on the radar */
15601563
// ------------------------------------------------------------------------------------------------
1561-
Bool Radar::isPriorityVisible( RadarPriorityType priority ) const
1564+
Bool Radar::isPriorityVisible( RadarPriorityType priority )
15621565
{
15631566

15641567
switch( priority )

GeneralsMD/Code/GameEngineDevice/Include/W3DDevice/Common/W3DRadar.h

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -61,9 +61,12 @@ class W3DRadar : public Radar
6161
virtual void update( void ); ///< subsystem update
6262
virtual void reset( void ); ///< subsystem reset
6363

64+
virtual RadarObjectType addObject( Object *obj ); ///< add object to radar
65+
virtual RadarObjectType removeObject( Object *obj ); ///< remove object from radar
66+
6467
virtual void newMap( TerrainLogic *terrain ); ///< reset radar for new map
6568

66-
void draw( Int pixelX, Int pixelY, Int width, Int height ); ///< draw the radar
69+
virtual void draw( Int pixelX, Int pixelY, Int width, Int height ); ///< draw the radar
6770

6871
virtual void clearShroud();
6972
virtual void setShroudLevel(Int x, Int y, CellShroudStatus setting);
@@ -72,11 +75,6 @@ class W3DRadar : public Radar
7275

7376
protected:
7477

75-
virtual void onLocalRadarObjectAdded( const RadarObject* radarObject );
76-
virtual void onLocalRadarObjectRemoved( const RadarObject* radarObject );
77-
78-
void rebuildCachedHeroObjectList();
79-
8078
void drawSingleBeaconEvent( Int pixelX, Int pixelY, Int width, Int height, Int index );
8179
void drawSingleGenericEvent( Int pixelX, Int pixelY, Int width, Int height, Int index );
8280

@@ -87,7 +85,7 @@ class W3DRadar : public Radar
8785
void drawViewBox( Int pixelX, Int pixelY, Int width, Int height ); ///< draw view box
8886
void buildTerrainTexture( TerrainLogic *terrain ); ///< create the terrain texture of the radar
8987
void drawIcons( Int pixelX, Int pixelY, Int width, Int height ); ///< draw all of the radar icons
90-
void renderObjectList( const RadarObject *listHead, TextureClass *texture ); ///< render an object list to the texture
88+
void renderObjectList( const RadarObject *listHead, TextureClass *texture, Bool calcHero = FALSE ); ///< render an object list to the texture
9189
void interpolateColorForHeight( RGBColor *color,
9290
Real height,
9391
Real hiZ,

GeneralsMD/Code/GameEngineDevice/Source/W3DDevice/Common/System/W3DRadar.cpp

Lines changed: 46 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -612,7 +612,7 @@ void W3DRadar::drawIcons( Int pixelX, Int pixelY, Int width, Int height )
612612
//-------------------------------------------------------------------------------------------------
613613
/** Render an object list into the texture passed in */
614614
//-------------------------------------------------------------------------------------------------
615-
void W3DRadar::renderObjectList( const RadarObject *listHead, TextureClass *texture )
615+
void W3DRadar::renderObjectList( const RadarObject *listHead, TextureClass *texture, Bool calcHero )
616616
{
617617

618618
// sanity
@@ -630,6 +630,12 @@ void W3DRadar::renderObjectList( const RadarObject *listHead, TextureClass *text
630630
if (player)
631631
playerIndex=player->getPlayerIndex();
632632

633+
if( calcHero )
634+
{
635+
// clear all entries from the cached hero object list
636+
m_cachedHeroObjectList.clear();
637+
}
638+
633639
for( const RadarObject *rObj = listHead; rObj; rObj = rObj->friend_getNext() )
634640
{
635641

@@ -639,6 +645,11 @@ void W3DRadar::renderObjectList( const RadarObject *listHead, TextureClass *text
639645
// get object
640646
const Object *obj = rObj->friend_getObject();
641647

648+
// cache hero objects for drawing in icon layer
649+
if( calcHero && obj->isHero() )
650+
{
651+
m_cachedHeroObjectList.push_back(obj);
652+
}
642653
Bool skip = FALSE;
643654

644655
// check for shrouded status
@@ -850,11 +861,6 @@ W3DRadar::~W3DRadar( void )
850861
void W3DRadar::xfer( Xfer *xfer )
851862
{
852863
Radar::xfer(xfer);
853-
854-
if (xfer->getXferMode() == XFER_LOAD)
855-
{
856-
rebuildCachedHeroObjectList();
857-
}
858864
}
859865

860866
//-------------------------------------------------------------------------------------------------
@@ -957,6 +963,8 @@ void W3DRadar::reset( void )
957963
// extending functionality, call base class
958964
Radar::reset();
959965

966+
m_cachedHeroObjectList.clear();
967+
960968
// clear our texture data, but do not delete the resources
961969
SurfaceClass *surface;
962970

@@ -991,6 +999,37 @@ void W3DRadar::update( void )
991999

9921000
} // end update
9931001

1002+
//-------------------------------------------------------------------------------------------------
1003+
//-------------------------------------------------------------------------------------------------
1004+
RadarObjectType W3DRadar::addObject( Object* obj )
1005+
{
1006+
RadarObjectType addedType = Radar::addObject(obj);
1007+
1008+
if (addedType == RadarObjectType_Local)
1009+
{
1010+
if (obj->isHero() && !RadarObject::isTemporarilyHidden(obj))
1011+
{
1012+
m_cachedHeroObjectList.push_back(obj);
1013+
}
1014+
}
1015+
1016+
return addedType;
1017+
}
1018+
1019+
//-------------------------------------------------------------------------------------------------
1020+
//-------------------------------------------------------------------------------------------------
1021+
RadarObjectType W3DRadar::removeObject( Object* obj )
1022+
{
1023+
RadarObjectType removedType = Radar::removeObject(obj);
1024+
1025+
if (removedType == RadarObjectType_Local)
1026+
{
1027+
stl::find_and_erase_unordered(m_cachedHeroObjectList, obj);
1028+
}
1029+
1030+
return removedType;
1031+
}
1032+
9941033
//-------------------------------------------------------------------------------------------------
9951034
/** Reset the radar for the new map data being given to it */
9961035
//-------------------------------------------------------------------------------------------------
@@ -1400,7 +1439,7 @@ void W3DRadar::draw( Int pixelX, Int pixelY, Int width, Int height )
14001439

14011440
// rebuild the object overlay
14021441
renderObjectList( getObjectList(), m_overlayTexture );
1403-
renderObjectList( getLocalObjectList(), m_overlayTexture );
1442+
renderObjectList( getLocalObjectList(), m_overlayTexture, TRUE );
14041443

14051444
} // end if
14061445

@@ -1450,41 +1489,6 @@ void W3DRadar::refreshTerrain( TerrainLogic *terrain )
14501489

14511490
} // end refreshTerrain
14521491

1453-
//-------------------------------------------------------------------------------------------------
1454-
//-------------------------------------------------------------------------------------------------
1455-
void W3DRadar::onLocalRadarObjectAdded( const RadarObject* radarObject )
1456-
{
1457-
const Object* obj = radarObject->friend_getObject();
1458-
if (obj->isHero())
1459-
{
1460-
m_cachedHeroObjectList.push_back(obj);
1461-
}
1462-
}
1463-
1464-
//-------------------------------------------------------------------------------------------------
1465-
//-------------------------------------------------------------------------------------------------
1466-
void W3DRadar::onLocalRadarObjectRemoved( const RadarObject* radarObject )
1467-
{
1468-
const Object* obj = radarObject->friend_getObject();
1469-
if (obj->isHero())
1470-
{
1471-
stl::find_and_erase_unordered(m_cachedHeroObjectList, obj);
1472-
}
1473-
}
1474-
1475-
//-------------------------------------------------------------------------------------------------
1476-
//-------------------------------------------------------------------------------------------------
1477-
void W3DRadar::rebuildCachedHeroObjectList()
1478-
{
1479-
m_cachedHeroObjectList.clear();
1480-
const RadarObject* radarObject = getLocalObjectList();
1481-
1482-
while (radarObject != NULL)
1483-
{
1484-
onLocalRadarObjectAdded(radarObject);
1485-
radarObject = radarObject->friend_getNext();
1486-
}
1487-
}
14881492

14891493

14901494

0 commit comments

Comments
 (0)