Fixed: #1497 optimize the drawing of radar by removing multiple access to local db (patch provided by yricl, a big thanks!)
This commit is contained in:
parent
cdf8fd5c6e
commit
fb17aa63e1
2 changed files with 52 additions and 10 deletions
|
@ -39,6 +39,25 @@ NLMISC_REGISTER_OBJECT(CViewBase, CViewRadar, std::string, "radar");
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
CViewRadar::CViewRadar(const TCtorParam ¶m)
|
||||||
|
: CViewBase(param)
|
||||||
|
{
|
||||||
|
CInterfaceManager *pIM = CInterfaceManager::getInstance();
|
||||||
|
CCDBNodeLeaf *pUIMI = pIM->getDbProp( "UI:SAVE:INSCENE:FRIEND:MISSION_ICON" );
|
||||||
|
if (pUIMI)
|
||||||
|
{
|
||||||
|
ICDBNode::CTextId textId;
|
||||||
|
pUIMI->addObserver( &_MissionIconsObs, textId);
|
||||||
|
}
|
||||||
|
|
||||||
|
CCDBNodeLeaf *pUIMMI = pIM->getDbProp( "UI:SAVE:INSCENE:FRIEND:MINI_MISSION_ICON" );
|
||||||
|
if (pUIMMI)
|
||||||
|
{
|
||||||
|
ICDBNode::CTextId textId;
|
||||||
|
pUIMMI->addObserver( &_MiniMissionSpotsObs, textId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
bool CViewRadar::parse(xmlNodePtr cur, CInterfaceGroup * parentGroup)
|
bool CViewRadar::parse(xmlNodePtr cur, CInterfaceGroup * parentGroup)
|
||||||
{
|
{
|
||||||
CXMLAutoPtr prop;
|
CXMLAutoPtr prop;
|
||||||
|
@ -109,8 +128,9 @@ void CViewRadar::draw ()
|
||||||
|
|
||||||
CEntityCL *user = EntitiesMngr.entity(0);
|
CEntityCL *user = EntitiesMngr.entity(0);
|
||||||
if (user == NULL) return;
|
if (user == NULL) return;
|
||||||
|
|
||||||
CVectorD xyzRef = user->pos();
|
CVectorD xyzRef = user->pos();
|
||||||
CVector dir = user->front();
|
const CVector dir = user->front();
|
||||||
|
|
||||||
float angle = (float)(atan2(dir.y, dir.x) - (Pi / 2.0));
|
float angle = (float)(atan2(dir.y, dir.x) - (Pi / 2.0));
|
||||||
CMatrix mat;
|
CMatrix mat;
|
||||||
|
@ -124,9 +144,6 @@ void CViewRadar::draw ()
|
||||||
|
|
||||||
float maxSqrRadius= (float)sqr(_WorldSize/2);
|
float maxSqrRadius= (float)sqr(_WorldSize/2);
|
||||||
|
|
||||||
const bool displayMissionSpots = pIM->getDbProp("UI:SAVE:INSCENE:FRIEND:MISSION_ICON")->getValueBool();
|
|
||||||
const bool displayMiniMissionSpots = pIM->getDbProp("UI:SAVE:INSCENE:FRIEND:MINI_MISSION_ICON")->getValueBool();
|
|
||||||
|
|
||||||
for (sint32 i = 1; i < 256; ++i)
|
for (sint32 i = 1; i < 256; ++i)
|
||||||
{
|
{
|
||||||
CEntityCL *entity = EntitiesMngr.entity(i);
|
CEntityCL *entity = EntitiesMngr.entity(i);
|
||||||
|
@ -160,8 +177,8 @@ void CViewRadar::draw ()
|
||||||
// Select the icon to display and draw it
|
// Select the icon to display and draw it
|
||||||
uint spotId = CNPCIconCache::getInstance().getNPCIcon(entity).getSpotId();
|
uint spotId = CNPCIconCache::getInstance().getNPCIcon(entity).getSpotId();
|
||||||
CRadarSpotDesc spotDesc = _SpotDescriptions[spotId];
|
CRadarSpotDesc spotDesc = _SpotDescriptions[spotId];
|
||||||
|
|
||||||
if (!displayMissionSpots)
|
if (!_MissionIconsObs._displayMissionSpots)
|
||||||
spotDesc = _SpotDescriptions[0];
|
spotDesc = _SpotDescriptions[0];
|
||||||
|
|
||||||
if (spotDesc.isMissionSpot)
|
if (spotDesc.isMissionSpot)
|
||||||
|
@ -171,7 +188,7 @@ void CViewRadar::draw ()
|
||||||
spotId = 4; // to make it over other spots
|
spotId = 4; // to make it over other spots
|
||||||
|
|
||||||
// Draw it (and make sure mission icons are drawn over regular dot; caution: don't exceed the render layer range)
|
// Draw it (and make sure mission icons are drawn over regular dot; caution: don't exceed the render layer range)
|
||||||
if (spotDesc.isMissionSpot && displayMiniMissionSpots)
|
if (spotDesc.isMissionSpot && _MiniMissionSpotsObs._displayMiniMissionSpots)
|
||||||
rVR.drawRotFlipBitmap (_RenderLayer+spotId, _XReal+x-(spotDesc.MTxW/2)+(_WReal/2), _YReal+y-(spotDesc.MTxH/2)+(_HReal/2),
|
rVR.drawRotFlipBitmap (_RenderLayer+spotId, _XReal+x-(spotDesc.MTxW/2)+(_WReal/2), _YReal+y-(spotDesc.MTxH/2)+(_HReal/2),
|
||||||
spotDesc.MTxW, spotDesc.MTxH, 0, false, spotDesc.MiniTextureId, col );
|
spotDesc.MTxW, spotDesc.MTxH, 0, false, spotDesc.MiniTextureId, col );
|
||||||
else
|
else
|
||||||
|
@ -185,3 +202,13 @@ void CViewRadar::updateCoords()
|
||||||
{
|
{
|
||||||
CViewBase::updateCoords();
|
CViewBase::updateCoords();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CViewRadar::CDBMissionIconqObs::update(ICDBNode *node)
|
||||||
|
{
|
||||||
|
_displayMissionSpots = ((CCDBNodeLeaf*)node)->getValueBool();
|
||||||
|
}
|
||||||
|
|
||||||
|
void CViewRadar::CDBMiniMissionSpotsObs::update(ICDBNode *node)
|
||||||
|
{
|
||||||
|
_displayMiniMissionSpots = ((CCDBNodeLeaf*)node)->getValueBool();
|
||||||
|
}
|
||||||
|
|
|
@ -45,9 +45,7 @@ public:
|
||||||
};
|
};
|
||||||
|
|
||||||
/// Constructor
|
/// Constructor
|
||||||
CViewRadar(const TCtorParam ¶m) : CViewBase(param)
|
CViewRadar(const TCtorParam ¶m);
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
bool parse(xmlNodePtr cur,CInterfaceGroup * parentGroup);
|
bool parse(xmlNodePtr cur,CInterfaceGroup * parentGroup);
|
||||||
|
|
||||||
|
@ -79,7 +77,24 @@ protected:
|
||||||
sint32 MTxH;
|
sint32 MTxH;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
private:
|
||||||
CRadarSpotDesc _SpotDescriptions[NbRadarSpotIds];
|
CRadarSpotDesc _SpotDescriptions[NbRadarSpotIds];
|
||||||
|
|
||||||
|
class CDBMissionIconqObs : public ICDBNode::IPropertyObserver
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
virtual void update(ICDBNode *node);
|
||||||
|
bool _displayMissionSpots;
|
||||||
|
};
|
||||||
|
CDBMissionIconqObs _MissionIconsObs;
|
||||||
|
|
||||||
|
class CDBMiniMissionSpotsObs : public ICDBNode::IPropertyObserver
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
virtual void update(ICDBNode *node);
|
||||||
|
bool _displayMiniMissionSpots;
|
||||||
|
};
|
||||||
|
CDBMiniMissionSpotsObs _MiniMissionSpotsObs;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // RY_VIEW_RADAR_H
|
#endif // RY_VIEW_RADAR_H
|
||||||
|
|
Loading…
Reference in a new issue