39 |
39 |
|
40 |
40 |
// ----------------------------------------------------------------------------
|
41 |
41 |
|
|
42 |
CViewRadar::CViewRadar(const TCtorParam ¶m)
|
|
43 |
: CViewBase(param)
|
|
44 |
{
|
|
45 |
CInterfaceManager *pIM = CInterfaceManager::getInstance();
|
|
46 |
CCDBNodeLeaf *pUIMI = pIM->getDbProp( "UI:SAVE:INSCENE:FRIEND:MISSION_ICON" );
|
|
47 |
if (pUIMI)
|
|
48 |
{
|
|
49 |
ICDBNode::CTextId textId;
|
|
50 |
pUIMI->addObserver( &_MissionIconsObs, textId);
|
|
51 |
}
|
|
52 |
|
|
53 |
CCDBNodeLeaf *pUIMMI = pIM->getDbProp( "UI:SAVE:INSCENE:FRIEND:MINI_MISSION_ICON" );
|
|
54 |
if (pUIMMI)
|
|
55 |
{
|
|
56 |
ICDBNode::CTextId textId;
|
|
57 |
pUIMMI->addObserver( &_MiniMissionSpotsObs, textId);
|
|
58 |
}
|
|
59 |
}
|
|
60 |
|
42 |
61 |
bool CViewRadar::parse(xmlNodePtr cur, CInterfaceGroup * parentGroup)
|
43 |
62 |
{
|
44 |
|
CXMLAutoPtr prop;
|
|
63 |
CXMLAutoPtr prop;
|
45 |
64 |
|
46 |
|
//try to get props that can be inherited from groups
|
47 |
|
//if a property is not defined, try to find it in the parent group.
|
48 |
|
//if it is undefined, set it to zero
|
49 |
|
if (! CViewBase::parse(cur,parentGroup) )
|
50 |
|
{
|
51 |
|
string tmp = string("cannot parse view:")+getId()+", parent:"+parentGroup->getId();
|
52 |
|
nlinfo (tmp.c_str());
|
53 |
|
return false;
|
54 |
|
}
|
|
65 |
//try to get props that can be inherited from groups
|
|
66 |
//if a property is not defined, try to find it in the parent group.
|
|
67 |
//if it is undefined, set it to zero
|
|
68 |
if (! CViewBase::parse(cur,parentGroup) )
|
|
69 |
{
|
|
70 |
string tmp = string("cannot parse view:")+getId()+", parent:"+parentGroup->getId();
|
|
71 |
nlinfo (tmp.c_str());
|
|
72 |
return false;
|
|
73 |
}
|
55 |
74 |
|
56 |
|
// World size
|
57 |
|
_WorldSize = 100.0;
|
58 |
|
prop = (char*) xmlGetProp( cur, (xmlChar*)"world_size" );
|
59 |
|
if (prop) fromString((const char*)prop, _WorldSize);
|
|
75 |
// World size
|
|
76 |
_WorldSize = 100.0;
|
|
77 |
prop = (char*) xmlGetProp( cur, (xmlChar*)"world_size" );
|
|
78 |
if (prop) fromString((const char*)prop, _WorldSize);
|
60 |
79 |
|
61 |
|
// Spot textures
|
62 |
|
CInterfaceManager *pIM = CInterfaceManager::getInstance();
|
63 |
|
CViewRenderer &rVR = pIM->getViewRenderer();
|
64 |
|
|
65 |
|
// Large missions Icons
|
66 |
|
const char *spotTextureNames[NbRadarSpotIds] = { "texture_std", "texture_missionlist", "texture_missionauto", "texture_missionstep" };
|
|
80 |
// Spot textures
|
|
81 |
CInterfaceManager *pIM = CInterfaceManager::getInstance();
|
|
82 |
CViewRenderer &rVR = pIM->getViewRenderer();
|
67 |
83 |
|
68 |
|
// Mini missions Icons
|
69 |
|
const char *spotMiniTextureNames[NbRadarSpotIds] = { "texture_std", "mini_texture_missionlist", "mini_texture_missionauto", "mini_texture_missionstep" };
|
|
84 |
// Large missions Icons
|
|
85 |
const char *spotTextureNames[NbRadarSpotIds] = { "texture_std", "texture_missionlist", "texture_missionauto", "texture_missionstep" };
|
70 |
86 |
|
71 |
|
for (uint i=0; i!=NbRadarSpotIds; ++i)
|
72 |
|
{
|
73 |
|
string txName;
|
|
87 |
// Mini missions Icons
|
|
88 |
const char *spotMiniTextureNames[NbRadarSpotIds] = { "texture_std", "mini_texture_missionlist", "mini_texture_missionauto", "mini_texture_missionstep" };
|
74 |
89 |
|
75 |
|
// Large missions Icons
|
76 |
|
prop = (char*) xmlGetProp( cur, (xmlChar*)spotTextureNames[i] );
|
77 |
|
if (prop)
|
78 |
|
{
|
79 |
|
txName = (const char *) prop;
|
80 |
|
txName = strlwr (txName);
|
81 |
|
}
|
82 |
|
_SpotDescriptions[i].TextureId.setTexture(txName.c_str());
|
83 |
|
rVR.getTextureSizeFromId (_SpotDescriptions[i].TextureId, _SpotDescriptions[i].TxW, _SpotDescriptions[i].TxH);
|
|
90 |
for (uint i=0; i!=NbRadarSpotIds; ++i)
|
|
91 |
{
|
|
92 |
string txName;
|
84 |
93 |
|
85 |
|
// Mini missions Icons
|
86 |
|
prop = (char*) xmlGetProp( cur, (xmlChar*)spotMiniTextureNames[i] );
|
87 |
|
if (prop)
|
88 |
|
{
|
89 |
|
txName = (const char *) prop;
|
90 |
|
txName = strlwr (txName);
|
91 |
|
}
|
92 |
|
_SpotDescriptions[i].MiniTextureId.setTexture(txName.c_str());
|
93 |
|
rVR.getTextureSizeFromId (_SpotDescriptions[i].MiniTextureId, _SpotDescriptions[i].MTxW, _SpotDescriptions[i].MTxH);
|
|
94 |
// Large missions Icons
|
|
95 |
prop = (char*) xmlGetProp( cur, (xmlChar*)spotTextureNames[i] );
|
|
96 |
if (prop)
|
|
97 |
{
|
|
98 |
txName = (const char *) prop;
|
|
99 |
txName = strlwr (txName);
|
|
100 |
}
|
|
101 |
_SpotDescriptions[i].TextureId.setTexture(txName.c_str());
|
|
102 |
rVR.getTextureSizeFromId (_SpotDescriptions[i].TextureId, _SpotDescriptions[i].TxW, _SpotDescriptions[i].TxH);
|
94 |
103 |
|
95 |
|
if (i == 0)
|
96 |
|
_SpotDescriptions[i].isMissionSpot = false;
|
97 |
|
else
|
98 |
|
_SpotDescriptions[i].isMissionSpot = true;
|
99 |
|
}
|
|
104 |
// Mini missions Icons
|
|
105 |
prop = (char*) xmlGetProp( cur, (xmlChar*)spotMiniTextureNames[i] );
|
|
106 |
if (prop)
|
|
107 |
{
|
|
108 |
txName = (const char *) prop;
|
|
109 |
txName = strlwr (txName);
|
|
110 |
}
|
|
111 |
_SpotDescriptions[i].MiniTextureId.setTexture(txName.c_str());
|
|
112 |
rVR.getTextureSizeFromId (_SpotDescriptions[i].MiniTextureId, _SpotDescriptions[i].MTxW, _SpotDescriptions[i].MTxH);
|
100 |
113 |
|
101 |
|
return true;
|
|
114 |
if (i == 0)
|
|
115 |
_SpotDescriptions[i].isMissionSpot = false;
|
|
116 |
else
|
|
117 |
_SpotDescriptions[i].isMissionSpot = true;
|
|
118 |
}
|
|
119 |
|
|
120 |
return true;
|
102 |
121 |
}
|
103 |
122 |
|
104 |
123 |
// ----------------------------------------------------------------------------
|
105 |
124 |
void CViewRadar::draw ()
|
106 |
125 |
{
|
107 |
|
CInterfaceManager *pIM = CInterfaceManager::getInstance();
|
108 |
|
CViewRenderer &rVR = pIM->getViewRenderer();
|
109 |
126 |
|
110 |
|
CEntityCL *user = EntitiesMngr.entity(0);
|
111 |
|
if (user == NULL) return;
|
112 |
|
CVectorD xyzRef = user->pos();
|
113 |
|
CVector dir = user->front();
|
|
127 |
CInterfaceManager *pIM = CInterfaceManager::getInstance();
|
|
128 |
CViewRenderer &rVR = pIM->getViewRenderer();
|
114 |
129 |
|
115 |
|
float angle = (float)(atan2(dir.y, dir.x) - (Pi / 2.0));
|
116 |
|
CMatrix mat;
|
117 |
|
mat.identity();
|
118 |
|
// Scale to transform from world to interface screen
|
119 |
|
mat.scale( CVector((float)(_WReal / _WorldSize), (float)(_HReal / _WorldSize), 1) );
|
120 |
|
// local to user
|
121 |
|
mat.rotateZ(-angle);
|
122 |
|
xyzRef.z = 0;
|
123 |
|
mat.translate(-xyzRef);
|
|
130 |
CEntityCL *user = EntitiesMngr.entity(0);
|
|
131 |
if (__builtin_expect((user == NULL), true))
|
|
132 |
return;
|
124 |
133 |
|
125 |
|
float maxSqrRadius= (float)sqr(_WorldSize/2);
|
|
134 |
CVectorD xyzRef = user->pos();
|
|
135 |
const CVector dir = user->front();
|
126 |
136 |
|
127 |
|
const bool displayMissionSpots = pIM->getDbProp("UI:SAVE:INSCENE:FRIEND:MISSION_ICON")->getValueBool();
|
128 |
|
const bool displayMiniMissionSpots = pIM->getDbProp("UI:SAVE:INSCENE:FRIEND:MINI_MISSION_ICON")->getValueBool();
|
|
137 |
float angle = (float)(atan2(dir.y, dir.x) - Pi / 2.0);
|
|
138 |
CMatrix mat;
|
|
139 |
mat.identity();
|
|
140 |
// Scale to transform from world to interface screen
|
|
141 |
mat.scale( CVector((float)(_WReal / _WorldSize), (float)(_HReal / _WorldSize), 1) );
|
|
142 |
// local to user
|
|
143 |
mat.rotateZ(-angle);
|
|
144 |
xyzRef.z = 0;
|
|
145 |
mat.translate(-xyzRef);
|
129 |
146 |
|
130 |
|
for (sint32 i = 1; i < 256; ++i)
|
131 |
|
{
|
132 |
|
CEntityCL *entity = EntitiesMngr.entity(i);
|
133 |
|
if (entity == NULL) continue;
|
|
147 |
float maxSqrRadius= (float)sqr(_WorldSize/2);
|
134 |
148 |
|
135 |
|
// if the entity must not be shown in radar
|
136 |
|
if(!entity->getDisplayInRadar())
|
137 |
|
continue;
|
|
149 |
for (sint32 i = 1; i < 256; ++i)
|
|
150 |
{
|
|
151 |
CEntityCL *entity = EntitiesMngr.entity(i);
|
|
152 |
if (entity == NULL) continue;
|
138 |
153 |
|
139 |
|
// get entity pos
|
140 |
|
CVectorD xyz = entity->pos();
|
|
154 |
// if the entity must not be shown in radar
|
|
155 |
if(!entity->getDisplayInRadar())
|
|
156 |
continue;
|
141 |
157 |
|
142 |
|
xyz.z = 0;
|
143 |
|
// if the distance is too big so do not display the entity
|
144 |
|
if ((sqr(xyz.x - xyzRef.x)+sqr(xyz.y - xyzRef.y)) > maxSqrRadius) continue;
|
|
158 |
// get entity pos
|
|
159 |
CVectorD xyz = entity->pos();
|
145 |
160 |
|
146 |
|
// Transform the dot
|
147 |
|
xyz = mat * xyz;
|
|
161 |
xyz.z = 0;
|
|
162 |
// if the distance is too big so do not display the entity
|
|
163 |
if ((sqr(xyz.x - xyzRef.x)+sqr(xyz.y - xyzRef.y)) > maxSqrRadius) continue;
|
148 |
164 |
|
149 |
|
// Convert to screen
|
150 |
|
sint32 x = OptFastFloor((float)xyz.x);
|
151 |
|
sint32 y = OptFastFloor((float)xyz.y);
|
|
165 |
// Transform the dot
|
|
166 |
xyz = mat * xyz;
|
152 |
167 |
|
153 |
|
CRGBA col = entity->getColor();
|
|
168 |
// Convert to screen
|
|
169 |
sint32 x = OptFastFloor((float)xyz.x);
|
|
170 |
sint32 y = OptFastFloor((float)xyz.y);
|
154 |
171 |
|
155 |
|
if(getModulateGlobalColor())
|
156 |
|
col.modulateFromColor (col, pIM->getGlobalColorForContent());
|
157 |
|
else
|
158 |
|
col.A = (uint8)(((sint32)col.A*((sint32)pIM->getGlobalColorForContent().A+1))>>8);
|
|
172 |
CRGBA col = entity->getColor();
|
159 |
173 |
|
160 |
|
// Select the icon to display and draw it
|
161 |
|
uint spotId = CNPCIconCache::getInstance().getNPCIcon(entity).getSpotId();
|
162 |
|
CRadarSpotDesc spotDesc = _SpotDescriptions[spotId];
|
163 |
|
|
164 |
|
if (!displayMissionSpots)
|
165 |
|
spotDesc = _SpotDescriptions[0];
|
|
174 |
if(getModulateGlobalColor())
|
|
175 |
col.modulateFromColor (col, pIM->getGlobalColorForContent());
|
|
176 |
else
|
|
177 |
col.A = (uint8)(((sint32)col.A*((sint32)pIM->getGlobalColorForContent().A+1))>>8);
|
166 |
178 |
|
167 |
|
if (spotDesc.isMissionSpot)
|
168 |
|
col = CRGBA(255, 255, 255, 255);
|
|
179 |
// Select the icon to display and draw it
|
|
180 |
uint spotId = CNPCIconCache::getInstance().getNPCIcon(entity).getSpotId();
|
|
181 |
CRadarSpotDesc spotDesc = _SpotDescriptions[spotId];
|
169 |
182 |
|
170 |
|
if (entity->isTarget())
|
171 |
|
spotId = 4; // to make it over other spots
|
|
183 |
if (!_MissionIconsObs._displayMissionSpots)
|
|
184 |
spotDesc = _SpotDescriptions[0];
|
172 |
185 |
|
173 |
|
// Draw it (and make sure mission icons are drawn over regular dot; caution: don't exceed the render layer range)
|
174 |
|
if (spotDesc.isMissionSpot && displayMiniMissionSpots)
|
175 |
|
rVR.drawRotFlipBitmap (_RenderLayer+spotId, _XReal+x-(spotDesc.MTxW/2)+(_WReal/2), _YReal+y-(spotDesc.MTxH/2)+(_HReal/2),
|
176 |
|
spotDesc.MTxW, spotDesc.MTxH, 0, false, spotDesc.MiniTextureId, col );
|
177 |
|
else
|
178 |
|
rVR.drawRotFlipBitmap (_RenderLayer+spotId, _XReal+x-(spotDesc.TxW/2)+(_WReal/2), _YReal+y-(spotDesc.TxH/2)+(_HReal/2),
|
179 |
|
spotDesc.TxW, spotDesc.TxH, 0, false, spotDesc.TextureId, col );
|
180 |
|
}
|
|
186 |
if (spotDesc.isMissionSpot)
|
|
187 |
col = CRGBA(255, 255, 255, 255);
|
|
188 |
|
|
189 |
if (entity->isTarget())
|
|
190 |
spotId = 4; // to make it over other spots
|
|
191 |
|
|
192 |
// Draw it (and make sure mission icons are drawn over regular dot; caution: don't exceed the render layer range)
|
|
193 |
if (spotDesc.isMissionSpot && _MiniMissionSpotsObs._displayMiniMissionSpots)
|
|
194 |
rVR.drawRotFlipBitmap (_RenderLayer+spotId, _XReal+x-(spotDesc.MTxW/2)+(_WReal/2), _YReal+y-(spotDesc.MTxH/2)+(_HReal/2),
|
|
195 |
spotDesc.MTxW, spotDesc.MTxH, 0, false, spotDesc.MiniTextureId, col );
|
|
196 |
else
|
|
197 |
rVR.drawRotFlipBitmap (_RenderLayer+spotId, _XReal+x-(spotDesc.TxW/2)+(_WReal/2), _YReal+y-(spotDesc.TxH/2)+(_HReal/2),
|
|
198 |
spotDesc.TxW, spotDesc.TxH, 0, false, spotDesc.TextureId, col );
|
|
199 |
}
|
181 |
200 |
}
|
182 |
201 |
|
183 |
202 |
// ----------------------------------------------------------------------------
|
184 |
203 |
void CViewRadar::updateCoords()
|
185 |
204 |
{
|
186 |
|
CViewBase::updateCoords();
|
|
205 |
CViewBase::updateCoords();
|
187 |
206 |
}
|
|
207 |
|
|
208 |
void CViewRadar::CDBMissionIconqObs::update(ICDBNode *node)
|
|
209 |
{
|
|
210 |
// CInterfaceManager *pIM = CInterfaceManager::getInstance();
|
|
211 |
_displayMissionSpots = ((CCDBNodeLeaf*)node)->getValueBool();
|
|
212 |
// pIM->displaySystemInfo(ucstring("CDBMissionIconqObs: ") + toString(displayMissionSpots));
|
|
213 |
}
|
|
214 |
|
|
215 |
void CViewRadar::CDBMiniMissionSpotsObs::update(ICDBNode *node)
|
|
216 |
{
|
|
217 |
// CInterfaceManager *pIM = CInterfaceManager::getInstance();
|
|
218 |
_displayMiniMissionSpots = ((CCDBNodeLeaf*)node)->getValueBool();
|
|
219 |
// pIM->displaySystemInfo(ucstring("CDBMiniMissionSpotsObs: ") + toString(displayMissionSpots));
|
|
220 |
}
|