Rise
The Vieneo Province
instruments.cpp
Go to the documentation of this file.
1 #include "instruments.h"
2 #include "Viewscreen.h"
3 #include "../MathUtilities.h"
4 #include "../Dialogs/PeopleManagerDialog.h"
5 #include "../Dialogs/InformationDialog.h"
6 
8 {
9  viewscreen = ptr;
10  logger = ptr->logger;
11  logger->AddToCallStack("instruments::ctor");
13 }
14 
16  delete(turnByTurn);
17 }
18 
19 void instruments::FrameMove(float fElapsedTime)
20 {
21  logger->AddToCallStack("instruments::FrameMove");
22 
23  // Velocity vector in 10 seconds
24  // our position plus the velocity (maybe minus barycentric) in 10 seconds
25  if (playerships[0].reference != REF_ONGROUND)
26  {
27  D3DXVECTOR3 velocityVec = playerships[0].velocity - playerships[0].barycentric;
28  D3DXVec3Normalize(&velocityVec, &velocityVec);
29  D3DXVec3Scale(&velocityVec, &velocityVec, -100.0f); // 100 seconds?
30  //D3DXVec3Subtract(&velocityVec, &playerships[0].position, &velocityVec);
31  D3DXVec3TransformCoord(&velocityVec, &velocityVec, &viewscreen->matrixView);
32  if (velocityVec.z != 0.0f)
33  {
34  bearVel = D3DXToDegree(atanf(velocityVec.x / velocityVec.z));
35  markVel = D3DXToDegree(atanf(velocityVec.y / velocityVec.z));
36  float f_temp = sqrtf(markVel * markVel + bearVel * bearVel);
37  if (f_temp > 180.0f)
38  {
39  f_temp = 180.0f / f_temp;
40  markVel *= f_temp;
41  bearVel *= f_temp;
42  }
43  if (velocityVec.z > 0.0f) // Behind us
44  {
45  if (bearVel > 0.0f)
46  bearVel -= 180.0f;
47  else
48  bearVel += 180.0f;
49  markVel = -markVel;
50  }
51  }
52  else // directly above or below
53  {
54  bearVel = 0.0f;
55  if (velocityVec.y < 0.0f)
56  markVel = 90.0f;
57  else
58  markVel = -90.0f;
59  }
60  }
61  else
62  bearVel = markVel = 999.0f;
63 
64 
65  // Bearing and mark calculations
66  D3DXVECTOR3 result1;
67  const float ourPositionLength = D3DXVec3Length(&playerships[0].position);
68  bool isValid = true;
69 
70  if (viewscreen->gameclass->bus->targetC == -1) // waypoint
71  {
72  if (viewscreen->gameclass->bus->WPtargetC < 0 || viewscreen->gameclass->bus->WPtargetC >= static_cast<long>(viewscreen->gameclass->bus->waypoint.size()))
73  {
74  char msg[199];
75  sprintf_s(msg, 199, "Trying to perform bearing and mark calculation on a waypoint that doesn't exist in collection: %i (%i)", viewscreen->gameclass->bus->WPtargetC, viewscreen->gameclass->bus->waypoint.size());
76  logger->Log(msg, Logger::Level::Error);
78  }
79 
80  const D3DXVECTOR3 waypointPosition = viewscreen->gameclass->bus->waypoint.at(viewscreen->gameclass->bus->WPtargetC).location;
81 
82  if (waypointPosition.x == 0.0f)
83  isValid = false;
84  else
85  {
86  D3DXVec3Subtract(&result1, &playerships[0].position, &waypointPosition);
87  const float dist = GetArcDist(playerships[0].position, waypointPosition, false);
88  const float altd = D3DXVec3Length(&waypointPosition) - ourPositionLength;
89  result1 = GetArcBear(result1, dist, altd, viewscreen->posnorml);
90  }
91  }
92  else if (viewscreen->gameclass->bus->targetC > -1) // ships
93  {
95  isValid = false;
96  else
97  D3DXVec3Subtract(&result1, &playerships[0].position, &playerships[viewscreen->scanslot[viewscreen->gameclass->bus->targetC]].position);
98  }
99  else // docks
100  {
101  const short t = -viewscreen->gameclass->bus->targetC - 2;
102  if (playerships[0].portassigned != -1 && playerships[0].reference == (t + REF_DOCKCPOC))
103  {
104  if (playerships[0].docked)
105  D3DXVec3Subtract(&result1, &playerships[0].dockoffset, &dockInterface);
106  else
107  D3DXVec3Subtract(&result1, &playerships[0].dockoffset, &dockMarker);
108  }
109  else
110  {
111  D3DXVec3Subtract(&result1, &playerships[0].position, &allobjects[t].position);
112  const float dist = GetArcDist(playerships[0].position, allobjects[t].position, false);
113  const float altd = D3DXVec3Length(&allobjects[t].position) - ourPositionLength;
114  result1 = GetArcBear(result1, dist, altd, viewscreen->posnorml);
115  }
116  }
117 
118  if (isValid)
119  {
120  D3DXVec3TransformCoord(&result1, &result1, &viewscreen->matrixView);
121  viewscreen->gameclass->bus->TargetDistanceKm = D3DXVec3Length(&result1);
122 
123  if (result1.z != 0.0f)
124  {
125  bear = D3DXToDegree(atanf(result1.x / result1.z));
126  mark = D3DXToDegree(atanf(result1.y / result1.z));
127  float f_temp = sqrtf(mark * mark + bear * bear);
128  if (f_temp > 180.0f)
129  {
130  f_temp = 180.0f / f_temp;
131  mark *= f_temp;
132  bear *= f_temp;
133  }
134  if (result1.z > 0.0f) // Behind us
135  {
136  if (bear > 0.0f)
137  bear -= 180.0f;
138  else
139  bear += 180.0f;
140  mark = -mark;
141  }
142  }
143  else // directly above or below
144  {
145  bear = 0.0f;
146  if (result1.y < 0.0f)
147  mark = 90.0f;
148  else
149  mark = -90.0f;
150  }
151  // sprintf_s( msg, sizeof(msg), "TGT %+06.1f M %+05.1f", bear, mark );
152  // m_pFont->DrawText( 415.0f, 480.0f, D3DCOLOR_ARGB(255,0,255,0), msg );
153  }
154  else
156 
157 
158 
159  // prepare the north vector since it is shared
160  D3DXVECTOR3 compassnorth;
161  D3DXVec3Add(&compassnorth, &northpoleC, &playerships[0].position);
162  D3DXVec3Normalize(&compassnorth, &compassnorth);
163  D3DXVec3Scale(&compassnorth, &compassnorth, ourPositionLength);
164  D3DXVec3Subtract(&compassnorth, &compassnorth, &playerships[0].position);
165  D3DXVec3Normalize(&compassnorth, &compassnorth);
166 
167  // Compass Heading ----------------------------------------------------------------------------------------------------
168  D3DXVec3Add(&result1, &viewscreen->headlightvec, &playerships[0].position); // it is now a point 1 km ahead
169 
170  // snap to present altitude
171  D3DXVec3Normalize(&result1, &result1);
172  D3DXVec3Scale(&result1, &result1, ourPositionLength);
173 
174  // our up vector snapped to the grid plane
175  D3DXVec3Subtract(&result1, &result1, &playerships[0].position);
176  D3DXVec3Normalize(&result1, &result1);
177 
178  // Now this one can be compared with the vector viewnorth
179  float f_temp = D3DXVec3Dot(&result1, &compassnorth);
180  if (f_temp >= 1.0f) // caused a nan at == 1.0f
181  viewscreen->insthdgDegrees = 0.0f;
182  else if (f_temp <= -1.0f)
183  viewscreen->insthdgDegrees = 180.0f;
184  else
185  viewscreen->insthdgDegrees = D3DXToDegree(acosf(f_temp));
186 
187  // Adjust for the 3rd and 4th quadrants
188  D3DXVec3Cross(&result1, &result1, &compassnorth);
189  D3DXVec3Add(&result1, &result1, &playerships[0].position);
190  if (D3DXVec3Length(&result1) > ourPositionLength)
193 
194 
195  // track
196  D3DXVECTOR3 track = playerships[0].velocity - playerships[0].barycentric;
197  const float trackLen = D3DXVec3Length(&track);
198  if (playerships[0].reference != REF_ONGROUND && trackLen > 0.001f)
199  {
200  track = -track;
201  D3DXVec3Normalize(&track, &track);
202  D3DXVec3Add(&track, &track, &playerships[0].position); // it is now a point 1 km ahead
203 
204  // snap to present altitude
205  D3DXVec3Normalize(&track, &track);
206  D3DXVec3Scale(&track, &track, ourPositionLength);
207 
208  // our up vector snapped to the grid plane
209  D3DXVec3Subtract(&track, &track, &playerships[0].position);
210  D3DXVec3Normalize(&track, &track);
211 
212  f_temp = D3DXVec3Dot(&track, &compassnorth);
213  if (f_temp >= 1.0f) // caused a nan at == 1.0f
214  viewscreen->insttrk = 0.0f;
215  else if (f_temp <= -1.0f)
216  viewscreen->insttrk = 180.0f;
217  else
218  viewscreen->insttrk = D3DXToDegree(acosf(f_temp));
219 
220  // Adjust for the 3rd and 4th quadrants
221  D3DXVec3Cross(&track, &track, &compassnorth);
222  D3DXVec3Add(&track, &track, &playerships[0].position);
223  if (D3DXVec3Length(&track) > ourPositionLength)
224  viewscreen->insttrk = 360.0f - viewscreen->insttrk;
226  }
227  else
229 
230 
231  // Attitude subsection ----------------------------------------------------------------------
232  D3DXMATRIX matrixInverse;
233  D3DXMatrixInverse(&matrixInverse, nullptr, &playerships[0].matrixWorld);
234  D3DXMatrixMultiply(&matrixInverse, &allobjects[ourmoonC].matrixWorld, &matrixInverse);
235 
236  // Planetary core
237  D3DXVECTOR3 result;
238  result.x = matrixInverse._41;
239  result.y = matrixInverse._42;
240  result.z = matrixInverse._43;
241 
242  if (fabsf(result.y) > FLT_EPSILON)
243  {
244  if (result.y > 0.0f) // Right-side up
245  viewscreen->gameclass->bus->RollAttitudeRadians = -atanf(result.x / result.y);
246  else if (result.x < 0.0f)
247  viewscreen->gameclass->bus->RollAttitudeRadians = D3DX_PI - atanf(result.x / result.y);
248  else
249  viewscreen->gameclass->bus->RollAttitudeRadians = -D3DX_PI - atanf(result.x / result.y);
250  viewscreen->gameclass->bus->PitchAttitudeRadians = atanf(result.z / sqrtf(result.y * result.y + result.x * result.x));
251  }
252  else
254 
255 
256 
257 #pragma region Fuel
258 
260  {
261  // was moved back here after https://jira.risetvp.com/view.php?id=188
262  // 3% for non-ground, 10% for ground vehicles
263  const bool oldlowfuel = ourcockpit.lowfuel;
264  if (ourcockpit.gndvehicle && fuel < ourcockpit.fuelmax * 0.1f)
265  ourcockpit.lowfuel = true;
266  else
267  ourcockpit.lowfuel = false;
268  if (ourcockpit.lowfuel && !oldlowfuel && ourcockpit.power > 0.5f)
269  {
270  Command command;
271  command.name = "AuralLowFuel";
272  viewscreen->gameclass->bus->commandStream.emplace_back(command);
273  }
274  }
275 
276 #pragma endregion
277 
278  // We want to call update when it's not a groundvehicle, but we might not want to run all of the logic
279  // this way the implementation can decided what to do.
280  // Otherwise you could get the situation where fElapsedTime = 0.001 while actually 10 seconds have passed
281  // since the last call to update because you switched vehicles for a bit, or something
282  turnByTurn->Update(ourcockpit.gndvehicle, fElapsedTime);
283 }
284 
285 void instruments::Draw(float fElapsedTime, IDirect3DDevice9* pd3dDevice) const
286 {
287  logger->AddToCallStack("instruments::Draw");
288 
289  D3DXVECTOR3 result;
290  float f_temp;
291  D3DXMATRIX matrixWorld;
292 
293  WCHAR str[99];
294  short t;
295  HRESULT hr;
296 
297 
298  if (ourcockpit.gndvehicle && ourcockpit.texturelib != T27) // (gv) ground vehicle backgrounds
299  {
300  // background for tachometer
301  result.x = 0.0f;
302  result.y = 0.0f;
303  result.z = 0.0f;
304  RECT rect;
305  rect.left = -1;
306  rect.top = -1;
307  rect.right = 139;
308  rect.bottom = 137;
309 
310  viewscreen->m_spriteVector->Begin(D3DXSPRITE_ALPHABLEND | D3DXSPRITE_SORT_TEXTURE);
311  viewscreen->m_spriteVector->Draw(viewscreen->m_pddsGVBackground, &rect, nullptr, &result, 0xFFFFFFFF);
312 
313  if (ourcockpit.texturelib == T120 || ourcockpit.texturelib == T121) // background for speedometer 2 steerhead
314  {
315  result.x = 139.0f;
316  result.y = 0.0f;
317  result.z = 0.0f;
318  rect.left = 275;
319  rect.top = 0;
320  rect.right = 415;
321  rect.bottom = 139;
322 
323  viewscreen->m_spriteVector->Draw(viewscreen->m_pddsGVBackground, &rect, nullptr, &result, 0xFFFFFFFF);
324  }
325  else // background for speedometer 1 dasher
326  {
327  result.x = 140.0f;
328  result.y = 0.0f;
329  result.z = 0.0f;
330  rect.left = 137;
331  rect.top = -1;
332  rect.right = 275;
333  rect.bottom = 137;
334 
335  viewscreen->m_spriteVector->Draw(viewscreen->m_pddsGVBackground, &rect, nullptr, &result, 0xFFFFFFFF);
336  }
337 
338 
339 
340  // Temp, charge, GPS and GPS-direction
341  result.x = 0.0f;
342  result.y = 283.0f;
343  result.z = 0.0f;
344  rect.left = 0;
345  rect.top = 283;
346  rect.right = 207;
347  rect.bottom = 352;
348  viewscreen->m_spriteVector->Draw(viewscreen->m_pddsGVBackground, &rect, nullptr, &result, 0xFFFFFFFF);
349 
350  if (ourcockpit.texturelib != VehicleType::C2A && ourcockpit.texturelib != VehicleType::C2)
351  {
352  // small tach, small speedometer
353  result.x = 207.0f;
354  result.y = 283.0f;
355  result.z = 0.0f;
356  rect.left = 207;
357  rect.top = 283;
358  rect.right = 344;
359  rect.bottom = 352;
360  viewscreen->m_spriteVector->Draw(viewscreen->m_pddsGVBackground, &rect, nullptr, &result, 0xFFFFFFFF);
361  }
362 
363  // nidar, new combined battery/temp
364  result.x = 207.0f;
365  result.y = 214.0f;
366  result.z = 0.0f;
367  rect.left = 345;
368  rect.top = 283;
369  rect.right = 483;
370  rect.bottom = 352;
371  viewscreen->m_spriteVector->Draw(viewscreen->m_pddsGVBackground, &rect, nullptr, &result, 0xFFFFFFFF);
372 
373  // Compass
374  result.x = 1.0f;
375  result.y = 151.0f;
376  result.z = 0.0f;
377  rect.left = 1;
378  rect.top = 151;
379  rect.right = 69;
380  rect.bottom = 168;
381  viewscreen->m_spriteVector->Draw(viewscreen->m_pddsGVBackground, &rect, nullptr, &result, 0xFFFFFFFF);
382 
383  // flush now for overlays
384  viewscreen->m_spriteVector->Flush();
385 
386  if (viewscreen->lampTest > 0.0f)
387  {
388  if (ourcockpit.texturelib != T120 && ourcockpit.texturelib != T121) // all except steerhead
389  {
390  result.x = 145.0f;
391  result.y = 6.0f;
392  result.z = 0.0f;
393  rect.left = 0;
394  rect.right = 14;
395  rect.top = 0;
396  rect.bottom = 15;
397  viewscreen->m_spriteVector->Draw(viewscreen->m_pddsLightsCruiseIcons, &rect, nullptr, &result, 0xFF0000FF);
398  }
399  else
400  {
401  // high beams
402  result.x = 145.0f;
403  result.y = 6.0f;
404  result.z = 0.0f;
405  rect.left = 0;
406  rect.right = 14;
407  rect.top = 0;
408  rect.bottom = 15;
409  viewscreen->m_spriteVector->Draw(viewscreen->m_pddsLightsCruiseIcons, &rect, nullptr, &result, 0xFF0000FF);
410 
411  // cruise control
412  result.x = 250.0f;
413  result.y = 6.0f;
414  result.z = 0.0f;
415  rect.left = 14;
416  rect.right = 36;
417  rect.top = 0;
418  rect.bottom = 6;
419  viewscreen->m_spriteVector->Draw(viewscreen->m_pddsLightsCruiseIcons, &rect, nullptr, &result, 0xFF00FF00);
420  }
421  }
422 
423  viewscreen->m_spriteVector->End();
424  } // end of gv
425 
426 
428  {
429  RECT rect;
430 
431  viewscreen->m_spriteVector->Begin(D3DXSPRITE_ALPHABLEND | D3DXSPRITE_SORT_TEXTURE);
432 
433 #pragma region Scanner display for air/space vehicles
434  if (ourcockpit.nextgen)
435  {
436  D3DXMATRIX transform;
437  D3DXMatrixTranslation(&transform, 207, 0, 0);
438  viewscreen->m_spriteVector->SetTransform(&transform);
439  }
440 
441  long yText = 11;
442  const long yTextIncr = 11;
443  D3DXCOLOR hi;
444  if (!ourcockpit.spaceCapable) // not spaceships
445  {
446  if (viewscreen->gameclass->bus->targetC < -1)
447  {
448  viewscreen->gameclass->bus->targetC = -1; // if stations, select user WP
450  }
451  }
452 
453  float currentdist;
454  if (viewscreen->gameclass->bus->waypoint.at(viewscreen->gameclass->bus->WPtargetC).location.x != 0.0f)
455  currentdist = GetArcDist(playerships[0].position, viewscreen->gameclass->bus->waypoint.at(viewscreen->gameclass->bus->WPtargetC).location, true);
456  else
457  currentdist = -1.0f;
458 
459  //viewscreen->gameclass->bus->Debug1Vec3.x = 0;
460  //viewscreen->gameclass->bus->Debug1Vec3.y = 0;
461  //viewscreen->gameclass->bus->Debug1Vec3.z = 0;
462  if (scanscroll > 0)
463  {
464  rect.left = 795; rect.top = yText; rect.right = rect.bottom = 0;
465  viewscreen->m_pFont->DrawText(viewscreen->m_spriteVector, L" ^^^ MORE ^^^", -1, &rect, DT_NOCLIP, D3DCOLOR_ARGB(255, 255, 255, 0));
466  }
467  // Last waypoint
468  else if (viewscreen->gameclass->bus->lastWaypointLocation.x != 0.0f && ourcockpit.power > 0.5f)
469  {
470  static float flashtime = 0.0f;
471  static bool tripped = true;
472  float fromDist = GetArcDist(playerships[0].position, viewscreen->gameclass->bus->lastWaypointLocation, true);
473  //viewscreen->gameclass->bus->Debug1Vec3.x = 0.0f;
474  //viewscreen->gameclass->bus->Debug1Vec3.y = fromDist;
475  //viewscreen->gameclass->bus->Debug1Vec3.z = currentdist;
476  if (fromDist > currentdist && !tripped)
477  {
478  // tripped
479  flashtime = 3.0f;
483  tripped = true;
484  }
485  else if (fromDist < currentdist)
486  {
487  tripped = false;
488  }
489 
490  if (fromDist > 10000.0f)
491  swprintf_s(str, 99, L" LAST %.3f kkm", fromDist * 0.001f);
492  else
493  swprintf_s(str, 99, L" LAST %.3f km", fromDist);
494 
495  if (flashtime > 0.0f)
496  {
497  if (fmodf(flashtime, 1.0f) > 0.5f)
498  hi = D3DCOLOR_ARGB(255, 255, 255, 255); // white
499  else
500  hi = D3DCOLOR_ARGB(255, 0, 127, 127); // dark cyan
501  flashtime -= fElapsedTime;
502  }
503  else
504  hi = D3DCOLOR_ARGB(255, 0, 127, 127); // dark cyan
505 
506  rect.left = 773; rect.top = yText; rect.right = rect.bottom = 0;
507  viewscreen->m_pFont->DrawText(viewscreen->m_spriteVector, str, -1, &rect, DT_NOCLIP, hi);
508  }
509  yText += yTextIncr;
510 
511  char thji;
512  if (viewscreen->gameclass->bus->targetC == -1)
513  thji = '>';
514  else
515  thji = ' ';
516 
517  // User Waypoint
518  if (viewscreen->gameclass->bus->WPtargetC < 0 || viewscreen->gameclass->bus->WPtargetC >= static_cast<long>(viewscreen->gameclass->bus->waypoint.size()))
519  {
520  char msg[199];
521  sprintf_s(msg, 199, "Trying to display AV/SV contact list with a waypoint that doesn't exist in collection: %i (%i)", viewscreen->gameclass->bus->WPtargetC, viewscreen->gameclass->bus->waypoint.size());
522  logger->Log(msg, Logger::Level::Error);
524  strcpy_s(viewscreen->gameclass->bus->TimeToNextFix, 6, "--:--");
525  }
526  else
527  {
528  if (viewscreen->gameclass->bus->GroundSpeedKms < 0.0005f)
529  strcpy_s(viewscreen->gameclass->bus->TimeToNextFix, 6, "--:--");
530  else
531  {
532  const float hours = currentdist / viewscreen->gameclass->bus->GroundSpeedKms / 60.0f / 60.0f;
533  const float minutes = floorf((hours - floorf(hours)) * 60.0f);
534  if (hours > 99.0f)
535  strcpy_s(viewscreen->gameclass->bus->TimeToNextFix, 6, "++:++");
536  else
537  sprintf_s(viewscreen->gameclass->bus->TimeToNextFix, 6, "%02.0f:%02.0f", floorf(hours), minutes);
538  }
539  }
540 
541  if (currentdist >= 0)
542  {
543  if (currentdist > 10000.0f)
544  swprintf_s(str, 99, L"%CWAYPT %.3f kkm", thji, currentdist * 0.001f);
545  else
546  swprintf_s(str, 99, L"%CWAYPT %.3f km", thji, currentdist);
547  }
548  else
549  swprintf_s(str, 99, L"%CWAYPT Unused", thji);
550 
551  hi = D3DCOLOR_ARGB(255, 0, 255, 255); // cyan
552  rect.left = 773; rect.top = yText; rect.right = rect.bottom = 0;
553  viewscreen->m_pFont->DrawText(viewscreen->m_spriteVector, str, -1, &rect, DT_NOCLIP, hi);
554  yText += yTextIncr;
555 
556  PeopleManagerDialog* peopleManagerDialog = dynamic_cast<PeopleManagerDialog*>(DialogBase::dialogs[D_PEOPLEMANAGER]);
557 
558 
559  for (t = 0; t < ourcockpit.scanDisplayVesselLimit; t++)
560  {
562  {
563  // blue is a color that is available but the concern is that it is hard to see
565  hi = D3DCOLOR_ARGB(255, 192, 192, 0); // yellow
566  else if (playerships[viewscreen->scanslot[t + scanscroll]].align == 3)
567  hi = D3DCOLOR_ARGB(255, 192, 0, 192); // purple
568  else if (playerships[viewscreen->scanslot[t + scanscroll]].align == 2)
569  hi = D3DCOLOR_ARGB(255, 0, 192, 0); // green
570  else if (playerships[viewscreen->scanslot[t + scanscroll]].align == 0)
571  hi = D3DCOLOR_ARGB(255, 192, 0, 0); // red
572  else
573  hi = D3DCOLOR_ARGB(255, 192, 192, 192); // white
575  {
576  hi.r *= 1.328125f;
577  hi.g *= 1.328125f;
578  hi.b *= 1.328125f;
579  }
580 
581  if (flasher > 0.5f && peopleManagerDialog->linecursel > -1 && playerships[viewscreen->scanslot[t + scanscroll]].ownerId == peopleManagerDialog->selectedPerson.serial)
582  {
583  hi.r /= 1.328125f;
584  hi.g /= 1.328125f;
585  hi.b /= 1.328125f;
586  }
587 
588 
589  if ((t + scanscroll) == viewscreen->gameclass->bus->targetC)
590  swprintf_s(str, 99, L">%-6S %.3f km", playerships[viewscreen->scanslot[t + scanscroll]].IVR, viewscreen->scandist[t + scanscroll]);
591  else
592  swprintf_s(str, 99, L" %-6S %.3f km", playerships[viewscreen->scanslot[t + scanscroll]].IVR, viewscreen->scandist[t + scanscroll]);
593  rect.left = 773; rect.top = yText; rect.right = rect.bottom = 0;
594  viewscreen->m_pFont->DrawText(viewscreen->m_spriteVector, str, -1, &rect, DT_NOCLIP, hi);
595  yText += yTextIncr;
596  }
597  }
598 
600  {
601  if (viewscreen->gameclass->bus->targetC == -4)
602  thji = '>';
603  else
604  thji = ' ';
605  // SENTRY STATION
606  if (playerships[0].portassigned != -1 && playerships[0].reference == REF_DOCKYSP)
607  {
608  if (playerships[0].docked)
609  result = playerships[0].dockoffset - dockInterface;
610  else
611  result = playerships[0].dockoffset - dockMarker;
612  f_temp = D3DXVec3Length(&result);
613  swprintf_s(str, 99, L"%CYSP%i %.3f km", thji, playerships[0].portassigned, f_temp);
614  }
615  else
616  {
617  if (allobjects[2].distance > 10000.0f)
618  swprintf_s(str, 99, L"%CYSP %.3f kkm", thji, allobjects[2].distance * 0.001f);
619  else
620  swprintf_s(str, 99, L"%CYSP %.3f km", thji, allobjects[2].distance);
621  }
622 
623  hi = D3DCOLOR_ARGB(255, 0, 255, 255); // cyan
624  rect.left = 773; rect.top = yText; rect.right = rect.bottom = 0;
625  viewscreen->m_pFont->DrawText(viewscreen->m_spriteVector, str, -1, &rect, DT_NOCLIP, hi);
626  yText += yTextIncr;
627 
628 
629  if (viewscreen->gameclass->bus->targetC == -3)
630  thji = '>';
631  else
632  thji = ' ';
633  // EASYDOCK
634  if (playerships[0].portassigned != -1 && playerships[0].reference == REF_DOCKTAC)
635  {
636  if (playerships[0].docked)
637  result = playerships[0].dockoffset - dockInterface;
638  else
639  result = playerships[0].dockoffset - dockMarker;
640  f_temp = D3DXVec3Length(&result);
641  swprintf_s(str, 99, L"%CTAC%i %.3f km", thji, playerships[0].portassigned, f_temp);
642  }
643  else
644  {
645  if (allobjects[1].distance > 10000.0f)
646  swprintf_s(str, 99, L"%CTAC %.3f kkm", thji, allobjects[1].distance * 0.001f);
647  else
648  swprintf_s(str, 99, L"%CTAC %.3f km", thji, allobjects[1].distance);
649  }
650 
651  hi = D3DCOLOR_ARGB(255, 0, 255, 255); // cyan
652  rect.left = 773; rect.top = yText; rect.right = rect.bottom = 0;
653  viewscreen->m_pFont->DrawText(viewscreen->m_spriteVector, str, -1, &rect, DT_NOCLIP, hi);
654  yText += yTextIncr;
655 
656 
657 
658  if (viewscreen->gameclass->bus->targetC == -2)
659  thji = '>';
660  else
661  thji = ' ';
662  // Cutter's Port
663  if (playerships[0].portassigned != -1 && playerships[0].reference == REF_DOCKCPOC)
664  {
665  if (playerships[0].docked)
666  result = playerships[0].dockoffset - dockInterface;
667  else
668  result = playerships[0].dockoffset - dockMarker;
669  f_temp = D3DXVec3Length(&result);
670  if (playerships[0].portassigned == 6) // deluge
671  swprintf_s(str, 99, L"%CCPOCd %.3f km", thji, f_temp);
672  else
673  swprintf_s(str, 99, L"%CCPOC%i %.3f km", thji, playerships[0].portassigned, f_temp);
674  }
675  else
676  {
677  if (allobjects[0].distance > 10000.0f)
678  swprintf_s(str, 99, L"%CCPOC %.3f kkm", thji, allobjects[0].distance * 0.001f);
679  else
680  swprintf_s(str, 99, L"%CCPOC %.3f km", thji, allobjects[0].distance);
681  }
682 
683  hi = D3DCOLOR_ARGB(255, 0, 255, 255); // cyan
684  rect.left = 773; rect.top = yText; rect.right = rect.bottom = 0;
685  viewscreen->m_pFont->DrawText(viewscreen->m_spriteVector, str, -1, &rect, DT_NOCLIP, hi);
686  yText += yTextIncr;
687  } // end of sv
688 
689 
691  {
692  rect.left = 795; rect.top = yText; rect.right = rect.bottom = 0;
693  viewscreen->m_pFont->DrawText(viewscreen->m_spriteVector, L" vvv MORE vvv", -1, &rect, DT_NOCLIP, D3DCOLOR_ARGB(255, 255, 255, 0));
694  }
695 
696  // restore
697  if (ourcockpit.nextgen)
698  {
699  D3DXMATRIX transform;
700  D3DXMatrixIdentity(&transform);
701  viewscreen->m_spriteVector->SetTransform(&transform);
702  }
703 
704  viewscreen->m_spriteVector->End();
705 #pragma endregion
706  }
707 
708 
709 #pragma region Interior Nameplate
710 
711  if (ourcockpit.texturelib == E10 || ourcockpit.texturelib == T19 || ourcockpit.texturelib == P13 || ourcockpit.texturelib == E11 || ourcockpit.texturelib == W6Manx)
712  {
713  viewscreen->m_spriteVector->Begin(D3DXSPRITE_ALPHABLEND | D3DXSPRITE_SORT_TEXTURE);
714 
715  if (ourcockpit.nextgen)
716  {
717  D3DXMATRIX transform;
718  D3DXMatrixTranslation(&transform, 102, 44, 0);
719  viewscreen->m_spriteVector->SetTransform(&transform);
720  }
721 
722  RECT rect;
723  rect.top = 0;
724  rect.left = 0;
725  rect.right = 273;
726  rect.bottom = 74;
727  result.x = 138.0f;
728  result.y = 276.0f;
729  result.z = 0.0f;
730  viewscreen->m_spriteVector->Draw(viewscreen->m_pddsNamePlate, &rect, nullptr, &result, 0xFFFFFFFF);
731 
732  viewscreen->m_spriteVector->Flush();
733 
734  if (playerships[0].hullname[0] != 0 && !playerships[0].simulator)
735  {
736  WCHAR str[99];
737  swprintf_s(str, 99, L"U.S.V. %S", playerships[0].hullname);
738  rect.left = 156;//+(232-letters*9)/2;
739  rect.top = 295;
740  rect.right = 392;
741  rect.bottom = 308;
742  viewscreen->m_pFont3->DrawText(viewscreen->m_spriteVector, str, -1, &rect, DT_CENTER, D3DCOLOR_ARGB(255, 0, 0, 0));
743  }
744  if (!playerships[0].simulator)
745  swprintf_s(str, 99, L"IVR %S", playerships[0].IVR);
746  else
747  swprintf_s(str, 99, L"FFS-%S", playerships[0].IVR);
748  rect.left = 156;//+(232-letters*8)/2;
749  rect.top = 308;
750  rect.right = 392;
751  rect.bottom = 320;
752  viewscreen->m_pFont->DrawText(viewscreen->m_spriteVector, str, -1, &rect, DT_CENTER, D3DCOLOR_ARGB(255, 0, 0, 0));
753 
754  // restore
755  if (ourcockpit.nextgen)
756  {
757  D3DXMATRIX transform;
758  D3DXMatrixIdentity(&transform);
759  viewscreen->m_spriteVector->SetTransform(&transform);
760  }
761 
762  viewscreen->m_spriteVector->End();
763  }
764 
765 #pragma endregion
766 
767 
768  if (ourcockpit.gndvehicle && ourcockpit.texturelib != VehicleType::T27) // ground vehicles except the Mammoth
769  {
770  // speedometer dials, -135 to +135 deg, km/s to km/h
771  // speedometer dial
772 
773  // spinny dials!
774  V(pd3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, true));
775  V(pd3dDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA));
776  V(pd3dDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA));
777  V(pd3dDevice->SetRenderState(D3DRS_ZFUNC, D3DCMP_ALWAYS)); // Always pass
778  V(pd3dDevice->SetFVF(D3DFVF_INSTRUMENT));
779  V(pd3dDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1));
780  V(pd3dDevice->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1)); // SELECTARG1 is default
781  V(pd3dDevice->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE)); // SELECTARG1 is default
782  float x, y;
783  x = 208.0f;
784  y = 69.0f;
785 
786 
787  D3DXVECTOR2 corner[4];
788  corner[0].x = 64.0f; corner[0].y = -64.0f; // ur
789  corner[1].x = -64.0f; corner[1].y = -64.0f; // ul
790  corner[2].x = 64.0f; corner[2].y = 64.0f; // lr
791  corner[3].x = -64.0f; corner[3].y = 64.0f; // ll
792 
793 // static float speed=0.0f;
794 // speed+=(ourcockpit.tirespeed-speed)*fElapsedTime*3.0f;
795  D3DXMatrixRotationZ(&matrixWorld, D3DXToRadian(-130.0f + ourcockpit.tirespeedKph));
796 
797  D3DXVec2TransformCoord(&corner[0], &corner[0], &matrixWorld);
798  D3DXVec2TransformCoord(&corner[1], &corner[1], &matrixWorld);
799  D3DXVec2TransformCoord(&corner[2], &corner[2], &matrixWorld);
800  D3DXVec2TransformCoord(&corner[3], &corner[3], &matrixWorld);
801 
802  D3DINSTRUMENT* vtxs;
803  V(viewscreen->m_avInstrument->Lock(0, 0, reinterpret_cast<void**>(&vtxs), D3DLOCK_DISCARD));
804 
805  (*vtxs).x = x + corner[0].x; (*vtxs).y = y + corner[0].y; (*vtxs).z = 0.0f; (*vtxs).w = 1.0f;
806  (*vtxs).tu = 1.0f; (*vtxs).tv = 0.0f;
807  vtxs++;
808  (*vtxs).x = x + corner[1].x; (*vtxs).y = y + corner[1].y; (*vtxs).z = 0.0f; (*vtxs).w = 1.0f;
809  (*vtxs).tu = 0.0f; (*vtxs).tv = 0.0f;
810  vtxs++;
811  (*vtxs).x = x + corner[2].x; (*vtxs).y = y + corner[2].y; (*vtxs).z = 0.0f; (*vtxs).w = 1.0f;
812  (*vtxs).tu = 1.0f; (*vtxs).tv = 1.0f;
813  vtxs++;
814  (*vtxs).x = x + corner[3].x; (*vtxs).y = y + corner[3].y; (*vtxs).z = 0.0f; (*vtxs).w = 1.0f;
815  (*vtxs).tu = 0.0f; (*vtxs).tv = 1.0f;
816 
817  V(viewscreen->m_avInstrument->Unlock());
818 
819  V(pd3dDevice->SetStreamSource(0, viewscreen->m_avInstrument, 0, sizeof(D3DINSTRUMENT)));
820  V(pd3dDevice->SetTexture(0, viewscreen->m_pddsAOA[0]));
821 
822  V(pd3dDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2));
823 
824 
825  // small speedometer
826  if (ourcockpit.texturelib == C98)
827  {
828  x = 310.0f;
829  y = 317.0f;
830 
831  corner[0].x = 32.0f; corner[0].y = -32.0f; // ur
832  corner[1].x = -32.0f; corner[1].y = -32.0f; // ul
833  corner[2].x = 32.0f; corner[2].y = 32.0f; // lr
834  corner[3].x = -32.0f; corner[3].y = 32.0f; // ll
835 
836  D3DXMatrixRotationZ(&matrixWorld, D3DXToRadian(-90.0f + ourcockpit.tirespeedKph * 0.692307692307692307692307692307f));
837 
838  D3DXVec2TransformCoord(&corner[0], &corner[0], &matrixWorld);
839  D3DXVec2TransformCoord(&corner[1], &corner[1], &matrixWorld);
840  D3DXVec2TransformCoord(&corner[2], &corner[2], &matrixWorld);
841  D3DXVec2TransformCoord(&corner[3], &corner[3], &matrixWorld);
842 
843  V(viewscreen->m_avInstrument->Lock(0, 0, reinterpret_cast<void**>(&vtxs), D3DLOCK_DISCARD));
844 
845  (*vtxs).x = x + corner[0].x; (*vtxs).y = y + corner[0].y; (*vtxs).z = 0.0f; (*vtxs).w = 1.0f;
846  (*vtxs).tu = 1.0f; (*vtxs).tv = 0.0f;
847  vtxs++;
848  (*vtxs).x = x + corner[1].x; (*vtxs).y = y + corner[1].y; (*vtxs).z = 0.0f; (*vtxs).w = 1.0f;
849  (*vtxs).tu = 0.0f; (*vtxs).tv = 0.0f;
850  vtxs++;
851  (*vtxs).x = x + corner[2].x; (*vtxs).y = y + corner[2].y; (*vtxs).z = 0.0f; (*vtxs).w = 1.0f;
852  (*vtxs).tu = 1.0f; (*vtxs).tv = 1.0f;
853  vtxs++;
854  (*vtxs).x = x + corner[3].x; (*vtxs).y = y + corner[3].y; (*vtxs).z = 0.0f; (*vtxs).w = 1.0f;
855  (*vtxs).tu = 0.0f; (*vtxs).tv = 1.0f;
856 
857  V(viewscreen->m_avInstrument->Unlock());
858 
859  V(pd3dDevice->SetStreamSource(0, viewscreen->m_avInstrument, 0, sizeof(D3DINSTRUMENT)));
860  V(pd3dDevice->SetTexture(0, viewscreen->m_pddsGVDialSmall));
861 
862  V(pd3dDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2));
863  }
864 
865  static float tach = 0.0f;
866  tach += (ourcockpit.tach - tach) * fElapsedTime * 3.0f;
867  // tachometer (big)
868  if (ourcockpit.texturelib == C2 || ourcockpit.texturelib == C2A)
869  {
870  x = 69.0f;
871  y = 69.0f;
872 
873  corner[0].x = 64.0f; corner[0].y = -64.0f; // ur
874  corner[1].x = -64.0f; corner[1].y = -64.0f; // ul
875  corner[2].x = 64.0f; corner[2].y = 64.0f; // lr
876  corner[3].x = -64.0f; corner[3].y = 64.0f; // ll
877 
878  D3DXMatrixRotationZ(&matrixWorld, D3DXToRadian(-150.0f + 300.0f * tach));
879 
880  D3DXVec2TransformCoord(&corner[0], &corner[0], &matrixWorld);
881  D3DXVec2TransformCoord(&corner[1], &corner[1], &matrixWorld);
882  D3DXVec2TransformCoord(&corner[2], &corner[2], &matrixWorld);
883  D3DXVec2TransformCoord(&corner[3], &corner[3], &matrixWorld);
884 
885  V(viewscreen->m_avInstrument->Lock(0, 0, reinterpret_cast<void**>(&vtxs), D3DLOCK_DISCARD));
886 
887  (*vtxs).x = x + corner[0].x; (*vtxs).y = y + corner[0].y; (*vtxs).z = 0.0f; (*vtxs).w = 1.0f;
888  (*vtxs).tu = 1.0f; (*vtxs).tv = 0.0f;
889  vtxs++;
890  (*vtxs).x = x + corner[1].x; (*vtxs).y = y + corner[1].y; (*vtxs).z = 0.0f; (*vtxs).w = 1.0f;
891  (*vtxs).tu = 0.0f; (*vtxs).tv = 0.0f;
892  vtxs++;
893  (*vtxs).x = x + corner[2].x; (*vtxs).y = y + corner[2].y; (*vtxs).z = 0.0f; (*vtxs).w = 1.0f;
894  (*vtxs).tu = 1.0f; (*vtxs).tv = 1.0f;
895  vtxs++;
896  (*vtxs).x = x + corner[3].x; (*vtxs).y = y + corner[3].y; (*vtxs).z = 0.0f; (*vtxs).w = 1.0f;
897  (*vtxs).tu = 0.0f; (*vtxs).tv = 1.0f;
898 
899  V(viewscreen->m_avInstrument->Unlock());
900 
901  V(pd3dDevice->SetStreamSource(0, viewscreen->m_avInstrument, 0, sizeof(D3DINSTRUMENT)));
902  V(pd3dDevice->SetTexture(0, viewscreen->m_pddsAOA[0]));
903 
904  V(pd3dDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2));
905  }
906 
907  // small tachometer
908  if (ourcockpit.texturelib == C98 || ourcockpit.texturelib == T120 || ourcockpit.texturelib == T121)
909  {
910  x = 241.0f;
911  y = 317.0f;
912 
913  corner[0].x = 32.0f; corner[0].y = -32.0f; // ur
914  corner[1].x = -32.0f; corner[1].y = -32.0f; // ul
915  corner[2].x = 32.0f; corner[2].y = 32.0f; // lr
916  corner[3].x = -32.0f; corner[3].y = 32.0f; // ll
917 
918  D3DXMatrixRotationZ(&matrixWorld, D3DXToRadian(-90.0f + 180.0f * tach));
919 
920  D3DXVec2TransformCoord(&corner[0], &corner[0], &matrixWorld);
921  D3DXVec2TransformCoord(&corner[1], &corner[1], &matrixWorld);
922  D3DXVec2TransformCoord(&corner[2], &corner[2], &matrixWorld);
923  D3DXVec2TransformCoord(&corner[3], &corner[3], &matrixWorld);
924 
925  V(viewscreen->m_avInstrument->Lock(0, 0, reinterpret_cast<void**>(&vtxs), D3DLOCK_DISCARD));
926 
927  (*vtxs).x = x + corner[0].x; (*vtxs).y = y + corner[0].y; (*vtxs).z = 0.0f; (*vtxs).w = 1.0f;
928  (*vtxs).tu = 1.0f; (*vtxs).tv = 0.0f;
929  vtxs++;
930  (*vtxs).x = x + corner[1].x; (*vtxs).y = y + corner[1].y; (*vtxs).z = 0.0f; (*vtxs).w = 1.0f;
931  (*vtxs).tu = 0.0f; (*vtxs).tv = 0.0f;
932  vtxs++;
933  (*vtxs).x = x + corner[2].x; (*vtxs).y = y + corner[2].y; (*vtxs).z = 0.0f; (*vtxs).w = 1.0f;
934  (*vtxs).tu = 1.0f; (*vtxs).tv = 1.0f;
935  vtxs++;
936  (*vtxs).x = x + corner[3].x; (*vtxs).y = y + corner[3].y; (*vtxs).z = 0.0f; (*vtxs).w = 1.0f;
937  (*vtxs).tu = 0.0f; (*vtxs).tv = 1.0f;
938 
939  V(viewscreen->m_avInstrument->Unlock());
940 
941  V(pd3dDevice->SetStreamSource(0, viewscreen->m_avInstrument, 0, sizeof(D3DINSTRUMENT)));
942  V(pd3dDevice->SetTexture(0, viewscreen->m_pddsGVDialSmall));
943 
944  V(pd3dDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2));
945  }
946 
947  // temp
948  {
949  x = 104.0f;
950  y = 318.0f;
951  corner[0].x = 32.0f; corner[0].y = -32.0f; // ur
952  corner[1].x = -32.0f; corner[1].y = -32.0f; // ul
953  corner[2].x = 32.0f; corner[2].y = 32.0f; // lr
954  corner[3].x = -32.0f; corner[3].y = 32.0f; // ll
955 
956  f_temp = 0.0f;
957  D3DXMatrixRotationZ(&matrixWorld, D3DXToRadian(-115.0f + 230.0f * f_temp));
958 
959  D3DXVec2TransformCoord(&corner[0], &corner[0], &matrixWorld);
960  D3DXVec2TransformCoord(&corner[1], &corner[1], &matrixWorld);
961  D3DXVec2TransformCoord(&corner[2], &corner[2], &matrixWorld);
962  D3DXVec2TransformCoord(&corner[3], &corner[3], &matrixWorld);
963 
964  V(viewscreen->m_avInstrument->Lock(0, 0, reinterpret_cast<void**>(&vtxs), D3DLOCK_DISCARD));
965 
966  (*vtxs).x = x + corner[0].x; (*vtxs).y = y + corner[0].y; (*vtxs).z = 0.0f; (*vtxs).w = 1.0f;
967  (*vtxs).tu = 1.0f; (*vtxs).tv = 0.0f;
968  vtxs++;
969  (*vtxs).x = x + corner[1].x; (*vtxs).y = y + corner[1].y; (*vtxs).z = 0.0f; (*vtxs).w = 1.0f;
970  (*vtxs).tu = 0.0f; (*vtxs).tv = 0.0f;
971  vtxs++;
972  (*vtxs).x = x + corner[2].x; (*vtxs).y = y + corner[2].y; (*vtxs).z = 0.0f; (*vtxs).w = 1.0f;
973  (*vtxs).tu = 1.0f; (*vtxs).tv = 1.0f;
974  vtxs++;
975  (*vtxs).x = x + corner[3].x; (*vtxs).y = y + corner[3].y; (*vtxs).z = 0.0f; (*vtxs).w = 1.0f;
976  (*vtxs).tu = 0.0f; (*vtxs).tv = 1.0f;
977 
978  V(viewscreen->m_avInstrument->Unlock());
979 
980  V(pd3dDevice->SetStreamSource(0, viewscreen->m_avInstrument, 0, sizeof(D3DINSTRUMENT)));
981  V(pd3dDevice->SetTexture(0, viewscreen->m_pddsGVDialSmall));
982 
983  V(pd3dDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2));
984  }
985 
986  // half temp
987  if (ourcockpit.texturelib != C2)
988  {
989  x = 310.0f;
990  y = 254.0f;
991  corner[0].x = 32.0f; corner[0].y = -32.0f; // ur
992  corner[1].x = -32.0f; corner[1].y = -32.0f; // ul
993  corner[2].x = 32.0f; corner[2].y = 32.0f; // lr
994  corner[3].x = -32.0f; corner[3].y = 32.0f; // ll
995 
996  f_temp = 0.0f;
997  D3DXMatrixRotationZ(&matrixWorld, D3DXToRadian(-90.0f - 180.0f * f_temp));
998 
999  D3DXVec2TransformCoord(&corner[0], &corner[0], &matrixWorld);
1000  D3DXVec2TransformCoord(&corner[1], &corner[1], &matrixWorld);
1001  D3DXVec2TransformCoord(&corner[2], &corner[2], &matrixWorld);
1002  D3DXVec2TransformCoord(&corner[3], &corner[3], &matrixWorld);
1003 
1004  V(viewscreen->m_avInstrument->Lock(0, 0, reinterpret_cast<void**>(&vtxs), D3DLOCK_DISCARD));
1005 
1006  (*vtxs).x = x + corner[0].x; (*vtxs).y = y + corner[0].y; (*vtxs).z = 0.0f; (*vtxs).w = 1.0f;
1007  (*vtxs).tu = 1.0f; (*vtxs).tv = 0.0f;
1008  vtxs++;
1009  (*vtxs).x = x + corner[1].x; (*vtxs).y = y + corner[1].y; (*vtxs).z = 0.0f; (*vtxs).w = 1.0f;
1010  (*vtxs).tu = 0.0f; (*vtxs).tv = 0.0f;
1011  vtxs++;
1012  (*vtxs).x = x + corner[2].x; (*vtxs).y = y + corner[2].y; (*vtxs).z = 0.0f; (*vtxs).w = 1.0f;
1013  (*vtxs).tu = 1.0f; (*vtxs).tv = 1.0f;
1014  vtxs++;
1015  (*vtxs).x = x + corner[3].x; (*vtxs).y = y + corner[3].y; (*vtxs).z = 0.0f; (*vtxs).w = 1.0f;
1016  (*vtxs).tu = 0.0f; (*vtxs).tv = 1.0f;
1017 
1018  V(viewscreen->m_avInstrument->Unlock());
1019 
1020  V(pd3dDevice->SetStreamSource(0, viewscreen->m_avInstrument, 0, sizeof(D3DINSTRUMENT)));
1021  V(pd3dDevice->SetTexture(0, viewscreen->m_pddsAOA[1]));
1022 
1023  V(pd3dDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2));
1024  }
1025 
1026  // fuel gauge needle
1027  {
1028  x = 35.0f;
1029  y = 318.0f;
1030  corner[0].x = 32.0f; corner[0].y = -32.0f; // ur
1031  corner[1].x = -32.0f; corner[1].y = -32.0f; // ul
1032  corner[2].x = 32.0f; corner[2].y = 32.0f; // lr
1033  corner[3].x = -32.0f; corner[3].y = 32.0f; // ll
1034 
1035  f_temp = fuel / ourcockpit.fuelmax * ourcockpit.power;
1036  D3DXMatrixRotationZ(&matrixWorld, D3DXToRadian(-120.0f + 240.0f * f_temp));
1037 
1038  D3DXVec2TransformCoord(&corner[0], &corner[0], &matrixWorld);
1039  D3DXVec2TransformCoord(&corner[1], &corner[1], &matrixWorld);
1040  D3DXVec2TransformCoord(&corner[2], &corner[2], &matrixWorld);
1041  D3DXVec2TransformCoord(&corner[3], &corner[3], &matrixWorld);
1042 
1043  V(viewscreen->m_avInstrument->Lock(0, 0, reinterpret_cast<void**>(&vtxs), D3DLOCK_DISCARD));
1044 
1045  (*vtxs).x = x + corner[0].x; (*vtxs).y = y + corner[0].y; (*vtxs).z = 0.0f; (*vtxs).w = 1.0f;
1046  (*vtxs).tu = 1.0f; (*vtxs).tv = 0.0f;
1047  vtxs++;
1048  (*vtxs).x = x + corner[1].x; (*vtxs).y = y + corner[1].y; (*vtxs).z = 0.0f; (*vtxs).w = 1.0f;
1049  (*vtxs).tu = 0.0f; (*vtxs).tv = 0.0f;
1050  vtxs++;
1051  (*vtxs).x = x + corner[2].x; (*vtxs).y = y + corner[2].y; (*vtxs).z = 0.0f; (*vtxs).w = 1.0f;
1052  (*vtxs).tu = 1.0f; (*vtxs).tv = 1.0f;
1053  vtxs++;
1054  (*vtxs).x = x + corner[3].x; (*vtxs).y = y + corner[3].y; (*vtxs).z = 0.0f; (*vtxs).w = 1.0f;
1055  (*vtxs).tu = 0.0f; (*vtxs).tv = 1.0f;
1056 
1057  V(viewscreen->m_avInstrument->Unlock());
1058 
1059  V(pd3dDevice->SetStreamSource(0, viewscreen->m_avInstrument, 0, sizeof(D3DINSTRUMENT)));
1060  V(pd3dDevice->SetTexture(0, viewscreen->m_pddsGVDialSmall));
1061 
1062  V(pd3dDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2));
1063  }
1064 
1065  // direction
1066  {
1067  x = 172.0f;
1068  y = 318.0f;
1069  corner[0].x = 32.0f; corner[0].y = -32.0f; // ur
1070  corner[1].x = -32.0f; corner[1].y = -32.0f; // ul
1071  corner[2].x = 32.0f; corner[2].y = 32.0f; // lr
1072  corner[3].x = -32.0f; corner[3].y = 32.0f; // ll
1073 
1074  D3DXMatrixRotationZ(&matrixWorld, D3DXToRadian(bear));
1075 
1076  // D3DXMatrixTranslation( &matrixTemp, -0.5f, tvstart, 0.0f );
1077  // D3DXMatrixMultiply( &matrixWorld, &matrixWorld, &matrixTemp );
1078 
1079  D3DXVec2TransformCoord(&corner[0], &corner[0], &matrixWorld);
1080  D3DXVec2TransformCoord(&corner[1], &corner[1], &matrixWorld);
1081  D3DXVec2TransformCoord(&corner[2], &corner[2], &matrixWorld);
1082  D3DXVec2TransformCoord(&corner[3], &corner[3], &matrixWorld);
1083 
1084  V(viewscreen->m_avInstrument->Lock(0, 0, reinterpret_cast<void**>(&vtxs), D3DLOCK_DISCARD));
1085 
1086  (*vtxs).x = x + corner[0].x; (*vtxs).y = y + corner[0].y; (*vtxs).z = 0.0f; (*vtxs).w = 1.0f;
1087  (*vtxs).tu = 1.0f; (*vtxs).tv = 0.0f;
1088  vtxs++;
1089  (*vtxs).x = x + corner[1].x; (*vtxs).y = y + corner[1].y; (*vtxs).z = 0.0f; (*vtxs).w = 1.0f;
1090  (*vtxs).tu = 0.0f; (*vtxs).tv = 0.0f;
1091  vtxs++;
1092  (*vtxs).x = x + corner[2].x; (*vtxs).y = y + corner[2].y; (*vtxs).z = 0.0f; (*vtxs).w = 1.0f;
1093  (*vtxs).tu = 1.0f; (*vtxs).tv = 1.0f;
1094  vtxs++;
1095  (*vtxs).x = x + corner[3].x; (*vtxs).y = y + corner[3].y; (*vtxs).z = 0.0f; (*vtxs).w = 1.0f;
1096  (*vtxs).tu = 0.0f; (*vtxs).tv = 1.0f;
1097 
1098  V(viewscreen->m_avInstrument->Unlock());
1099 
1100  V(pd3dDevice->SetStreamSource(0, viewscreen->m_avInstrument, 0, sizeof(D3DINSTRUMENT)));
1101  V(pd3dDevice->SetTexture(0, viewscreen->m_pddsGVDirection));
1102 
1103  V(pd3dDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2));
1104  }
1105 
1106  pd3dDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE); // TEXTURE is default
1107 // pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_DISABLE ); benjey2
1108 
1109  pd3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, false);
1110  pd3dDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
1111  pd3dDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
1112 
1113  pd3dDevice->SetRenderState(D3DRS_ZFUNC, D3DCMP_LESS); // Always pass
1114 
1115 
1116 
1117 
1118  viewscreen->m_spriteVector->Begin(D3DXSPRITE_ALPHABLEND | D3DXSPRITE_SORT_TEXTURE);
1119 
1120 
1121 
1122 
1123  // compass
1124  result.x = 4.0f;
1125  result.y = 154.0f;
1126  result.z = 0.0f;
1127  short offsetx = (short)(viewscreen->insthdgDegrees / 360.0f * 720.0f);
1128  RECT rect;
1129  rect.left = 0 + offsetx;
1130  rect.right = 63 + offsetx;
1131  rect.top = 0;
1132  rect.bottom = 12;
1133 
1134 
1135  viewscreen->m_spriteVector->Draw(viewscreen->m_pddsGVCompass, &rect, nullptr, &result, 0xFFFFFFFF);
1136 
1137  // icons
1138  if (ourcockpit.lowfuel || viewscreen->lampTest > 0.2f) // 1/8th tank
1139  {
1140  result.x = 118.0f;
1141  result.y = 117.0f;
1142  result.z = 0.0f;
1143  rect.left = 0;
1144  rect.right = 15;
1145  rect.top = 0;
1146  rect.bottom = 15;
1147  viewscreen->m_spriteVector->Draw(viewscreen->m_pddsFuelIcon, &rect, nullptr, &result, 0xFFFF0000);
1148  // pd3dDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, true );
1149  // pd3dDevice->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCCOLOR );
1150  // pd3dDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_ONE );
1151  result.x = 303.0f;
1152  result.y = 223.0f;
1153  result.z = 0.0f;
1154  viewscreen->m_spriteVector->Draw(viewscreen->m_pddsFuelIcon, &rect, nullptr, &result, 0xFFFF0000);
1155  // pd3dDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, false );
1156  }
1157 
1158  // gears
1159  if (ourcockpit.power > 0.0f)
1160  {
1161  if (ourcockpit.texturelib == C98 || ourcockpit.texturelib == T120 || ourcockpit.texturelib == T121)
1162  {
1163  if (ourcockpit.gearshift == -2) swprintf_s(str, 99, L"P");
1164  else if (ourcockpit.gearshift == -1) swprintf_s(str, 99, L"R");
1165  else if (ourcockpit.gearshift == 0) swprintf_s(str, 99, L"N");
1166  else swprintf_s(str, 99, L"%i", ourcockpit.gearshift);
1167  rect.left = 234; rect.top = 325; rect.right = 250; rect.bottom = 345;
1168  viewscreen->m_pFont3->DrawText(viewscreen->m_spriteVector, str, -1, &rect, DT_CENTER, D3DCOLOR_ARGB(255, 230, 89, 33));
1169  }
1170  else
1171  {
1172  if (ourcockpit.gearshift == -2 || viewscreen->lampTest > 0.3f) // P
1173  {
1174  result.x = 54.0f;
1175  result.y = 117.0f;
1176  result.z = 0.0f;
1177  rect.left = 0;
1178  rect.top = 138;
1179  rect.right = 10;
1180  rect.bottom = 145;
1181  viewscreen->m_spriteVector->Draw(viewscreen->m_pddsGVBackground, &rect, nullptr, &result, 0xFFFFFFFF);
1182  result.x = 226.0f;
1183  result.y = 326.0f;
1184  result.z = 0.0f;
1185  viewscreen->m_spriteVector->Draw(viewscreen->m_pddsGVBackground, &rect, nullptr, &result, 0xFFFFFFFF);
1186  }
1187  if (ourcockpit.gearshift == -1 || viewscreen->lampTest > 0.3f) // R
1188  {
1189  result.x = 77.0f;
1190  result.y = 117.0f;
1191  result.z = 0.0f;
1192  rect.left = 10;
1193  rect.top = 138;
1194  rect.right = 19;
1195  rect.bottom = 145;
1196  viewscreen->m_spriteVector->Draw(viewscreen->m_pddsGVBackground, &rect, nullptr, &result, 0xFFFFFFFF);
1197  result.x = 249.0f;
1198  result.y = 326.0f;
1199  result.z = 0.0f;
1200  viewscreen->m_spriteVector->Draw(viewscreen->m_pddsGVBackground, &rect, nullptr, &result, 0xFFFFFFFF);
1201  }
1202  if (ourcockpit.gearshift == 0 || viewscreen->lampTest > 0.3f) // N
1203  {
1204  result.x = 65.0f;
1205  result.y = 117.0f;
1206  result.z = 0.0f;
1207  rect.left = 20;
1208  rect.top = 138;
1209  rect.right = 30;
1210  rect.bottom = 145;
1211  viewscreen->m_spriteVector->Draw(viewscreen->m_pddsGVBackground, &rect, nullptr, &result, 0xFFFFFFFF);
1212  result.x = 237.0f;
1213  result.y = 326.0f;
1214  result.z = 0.0f;
1215  viewscreen->m_spriteVector->Draw(viewscreen->m_pddsGVBackground, &rect, nullptr, &result, 0xFFFFFFFF);
1216  }
1217  if (ourcockpit.gearshift == 1 || viewscreen->lampTest > 0.3f) // 1
1218  {
1219  result.x = 65.0f;
1220  result.y = 109.0f;
1221  result.z = 0.0f;
1222  rect.left = 30;
1223  rect.top = 138;
1224  rect.right = 36;
1225  rect.bottom = 145;
1226  viewscreen->m_spriteVector->Draw(viewscreen->m_pddsGVBackground, &rect, nullptr, &result, 0xFFFFFFFF);
1227  result.x = 229.0f;
1228  result.y = 335.0f;
1229  result.z = 0.0f;
1230  viewscreen->m_spriteVector->Draw(viewscreen->m_pddsGVBackground, &rect, nullptr, &result, 0xFFFFFFFF);
1231  }
1232  if (ourcockpit.gearshift == 2 || viewscreen->lampTest > 0.3f) // 2
1233  {
1234  result.x = 66.0f;
1235  result.y = 100.0f;
1236  result.z = 0.0f;
1237  rect.left = 38;
1238  rect.top = 138;
1239  rect.right = 46;
1240  rect.bottom = 145;
1241  viewscreen->m_spriteVector->Draw(viewscreen->m_pddsGVBackground, &rect, nullptr, &result, 0xFFFFFFFF);
1242  result.x = 237.0f;
1243  result.y = 335.0f;
1244  result.z = 0.0f;
1245  viewscreen->m_spriteVector->Draw(viewscreen->m_pddsGVBackground, &rect, nullptr, &result, 0xFFFFFFFF);
1246  }
1247  if (ourcockpit.gearshift == 3 || viewscreen->lampTest > 0.3f) // 3
1248  {
1249  result.x = 65.0f;
1250  result.y = 91.0f;
1251  result.z = 0.0f;
1252  rect.left = 47;
1253  rect.top = 138;
1254  rect.right = 56;
1255  rect.bottom = 145;
1256  viewscreen->m_spriteVector->Draw(viewscreen->m_pddsGVBackground, &rect, nullptr, &result, 0xFFFFFFFF);
1257  result.x = 247.0f;
1258  result.y = 335.0f;
1259  result.z = 0.0f;
1260  viewscreen->m_spriteVector->Draw(viewscreen->m_pddsGVBackground, &rect, nullptr, &result, 0xFFFFFFFF);
1261  }
1262  }
1263  }
1264 
1265  // GV CONTACTS
1266  // Playerships display ----------------------------------------------------------------------
1267  D3DXCOLOR hi;
1268  scanscroll = 0;
1269  if (viewscreen->gameclass->bus->targetC < -1)
1270  {
1271  viewscreen->gameclass->bus->targetC = -1; // if stations, select user WP
1273  }
1274 
1275  float dist = 999.0f;
1276  for (t = -1; t < 2; t++)
1277  {
1278  // User Waypoint
1279  if ((t + viewscreen->gameclass->bus->targetC) == -1)
1280  {
1281  if (viewscreen->gameclass->bus->targetC == -1)
1282  {
1283  swprintf_s(str, 99, L">WAYPT");
1285  {
1290  }
1291  }
1292  else
1293  {
1294  swprintf_s(str, 99, L" WAYPT");
1295  }
1296  rect.left = 0; rect.top = 170 + 10 * (t + 1); rect.right = rect.bottom = 0;
1297  viewscreen->m_pFont->DrawText(viewscreen->m_spriteVector, str, -1, &rect, DT_NOCLIP, D3DCOLOR_ARGB(255, 0, 255, 255));
1298 
1300  {
1301  char msg[199];
1302  sprintf_s(msg, 199, "Trying to GV display contact list with a waypoint that doesn't exist in collection: %i (%i)", viewscreen->gameclass->bus->WPtargetC, viewscreen->gameclass->bus->waypoint.size());
1303  logger->Log(msg, Logger::Level::Error);
1305  }
1306 
1307  if (viewscreen->gameclass->bus->waypoint.at(viewscreen->gameclass->bus->WPtargetC).location.x != 0.0f)
1308  {
1309  dist = GetArcDist(playerships[0].position, viewscreen->gameclass->bus->waypoint.at(viewscreen->gameclass->bus->WPtargetC).location, true);
1310  }
1311  }
1313  {
1315  {
1317  hi = D3DCOLOR_ARGB(255, 192, 192, 0); // yellow
1319  hi = D3DCOLOR_ARGB(255, 192, 0, 192); // new color
1321  hi = D3DCOLOR_ARGB(255, 0, 192, 0); // green
1323  hi = D3DCOLOR_ARGB(255, 192, 0, 0); // red
1324  else
1325  hi = D3DCOLOR_ARGB(255, 192, 192, 192); // white // neutral
1327  {
1328  hi.r *= 1.328125f;
1329  hi.g *= 1.328125f;
1330  hi.b *= 1.328125f;
1331  }
1332  if (t == 0)
1333  {
1334  swprintf_s(str, 99, L">%-6S", playerships[viewscreen->scanslot[t + viewscreen->gameclass->bus->targetC]].IVR);
1336  }
1337  else
1338  swprintf_s(str, 99, L" %-6S", playerships[viewscreen->scanslot[t + viewscreen->gameclass->bus->targetC]].IVR);
1340  wcscat_s(str, 99, L" TOW");
1341  rect.left = 0; rect.top = 170 + 10 * (t + 1); rect.right = rect.bottom = 0;
1342  viewscreen->m_pFont->DrawText(viewscreen->m_spriteVector, str, -1, &rect, DT_NOCLIP, hi);
1343  }
1344  }
1346  {
1347  swprintf_s(str, 99, L" WAYPT");
1348  rect.left = 0; rect.top = 170 + 10 * (t + 1); rect.right = rect.bottom = 0;
1349  viewscreen->m_pFont->DrawText(viewscreen->m_spriteVector, str, -1, &rect, DT_NOCLIP, D3DCOLOR_ARGB(255, 0, 255, 255));
1350  }
1351  }
1352 
1353  if (dist > 1.0f) // km
1354  {
1355  swprintf_s(str, 99, L"%05.3f", dist);
1356  rect.left = 169; rect.top = 323; rect.right = rect.bottom = 0;
1357  viewscreen->m_pFont->DrawText(viewscreen->m_spriteVector, L"K", -1, &rect, DT_NOCLIP, D3DCOLOR_ARGB(255, 0, 0, 0));
1358  }
1359  else
1360  {
1361  swprintf_s(str, 99, L"%05.3f", dist * 1000.0f);
1362  rect.left = 169; rect.top = 323; rect.right = rect.bottom = 0;
1363  viewscreen->m_pFont->DrawText(viewscreen->m_spriteVector, L"M", -1, &rect, DT_NOCLIP, D3DCOLOR_ARGB(255, 0, 0, 0));
1364  }
1365 
1366  for (unsigned t = 0; t < 5; t++)
1367  {
1368  WCHAR tempmsg[2];
1369  tempmsg[1] = 0;
1370  tempmsg[0] = str[t];
1371  rect.left = 153 + t * 8; rect.top = 310; rect.right = rect.bottom = 0;
1372  viewscreen->m_pFont->DrawText(viewscreen->m_spriteVector, tempmsg, -1, &rect, DT_NOCLIP, D3DCOLOR_ARGB(255, 255, 255, 255));
1373  }
1374 
1375 
1376  // green close interaction requirement 25 meters
1377  // yellow same plot or certain range 250 meters
1378  // red is 2.5km
1379  if (dist > 0.250f)
1380  {
1381  result.x = 162.0f;
1382  result.y = 304.0f;
1383  result.z = 0.0f;
1384  rect.left = 381;
1385  rect.right = 384;
1386  rect.top = 280;
1387  rect.bottom = 283;
1388 
1389  viewscreen->m_spriteVector->Draw(viewscreen->m_pddsGVBackground, &rect, nullptr, &result, 0xFFFFFFFF);
1390  }
1391  else if (dist > 0.025f)
1392  {
1393  result.x = 171.0f;
1394  result.y = 304.0f;
1395  result.z = 0.0f;
1396  rect.left = 384;
1397  rect.right = 387;
1398  rect.top = 280;
1399  rect.bottom = 283;
1400 
1401  viewscreen->m_spriteVector->Draw(viewscreen->m_pddsGVBackground, &rect, nullptr, &result, 0xFFFFFFFF);
1402  }
1403  else
1404  {
1405  result.x = 180.0f;
1406  result.y = 304.0f;
1407  result.z = 0.0f;
1408  rect.left = 387;
1409  rect.right = 390;
1410  rect.top = 280;
1411  rect.bottom = 283;
1412 
1413  viewscreen->m_spriteVector->Draw(viewscreen->m_pddsGVBackground, &rect, nullptr, &result, 0xFFFFFFFF);
1414  }
1415 
1416  if (viewscreen->gameclass->bus->targetC == -1)
1417  {
1418  if (bear >= 0.5f)
1419  swprintf_s(str, 99, L"WAYPT â–º%.0f° %.3f km", fabsf(bear), dist);
1420  else if (bear <= -0.5f)
1421  swprintf_s(str, 99, L"WAYPT â—„%.0f° %.3f km", fabsf(bear), dist);
1422  else
1423  swprintf_s(str, 99, L"WAYPT â–²%.0f° %.3f km", fabsf(bear), dist);
1424  }
1425  else
1426  {
1427  if (bear >= 0.5f)
1428  swprintf_s(str, 99, L"%S â–º%.0f° %.3f km", playerships[viewscreen->scanslot[viewscreen->gameclass->bus->targetC]].IVR, fabsf(bear), dist);
1429  else if (bear <= -0.5f)
1430  swprintf_s(str, 99, L"%S â—„%.0f° %.3f km", playerships[viewscreen->scanslot[viewscreen->gameclass->bus->targetC]].IVR, fabsf(bear), dist);
1431  else
1432  swprintf_s(str, 99, L"%S â–²%.0f° %.3f km", playerships[viewscreen->scanslot[viewscreen->gameclass->bus->targetC]].IVR, fabsf(bear), dist);
1433  }
1434  rect.left = 0; rect.top = 264; rect.right = rect.bottom = 0;
1435  viewscreen->m_pFont->DrawText(viewscreen->m_spriteVector, str, -1, &rect, DT_NOCLIP, D3DCOLOR_ARGB(255, 0, 255, 0));
1436 
1437 
1438 
1439  // Odometer
1440  swprintf_s(str, 99, L"%08.1f", ourcockpit.usage);
1441  if (ourcockpit.texturelib == C2 || ourcockpit.texturelib == C2A ||
1442  ourcockpit.texturelib == T120 || ourcockpit.texturelib == T121) // dasher and steerhead use top left area
1443  {
1444  if (ourcockpit.texturelib != C2A)
1445  {
1446  for (unsigned t = 0; t < 6; t++) // 000106.1
1447  {
1448  rect.left = 180 + t * 8; rect.top = 102; rect.right = rect.bottom = 0;
1449  viewscreen->m_pFont->DrawText(viewscreen->m_spriteVector, &str[t], 1, &rect, DT_NOCLIP, D3DCOLOR_ARGB(255, 255, 255, 255));
1450  }
1451  // Skip the decimal and do the last number in black
1452  rect.left = 180 + 6 * 8; rect.top = 102; rect.right = rect.bottom = 0;
1453  viewscreen->m_pFont->DrawText(viewscreen->m_spriteVector, &str[7], 1, &rect, DT_NOCLIP, D3DCOLOR_ARGB(255, 0, 0, 0));
1454  }
1455  else
1456  {
1457  for (unsigned t = 0; t < 7; t++)
1458  {
1459  rect.left = 178 + t * 8; rect.top = 102; rect.right = rect.bottom = 0;
1460  viewscreen->m_pFont->DrawText(viewscreen->m_spriteVector, &str[t], 1, &rect, DT_NOCLIP, D3DCOLOR_ARGB(255, 255, 255, 255));
1461  }
1462  rect.left = 176 + 7 * 8; rect.top = 102; rect.right = rect.bottom = 0;
1463  viewscreen->m_pFont->DrawText(viewscreen->m_spriteVector, &str[7], 1, &rect, DT_NOCLIP, D3DCOLOR_ARGB(255, 255, 255, 255));
1464  }
1465  }
1466  else if (ourcockpit.texturelib == C98) // small speedo
1467  {
1468  for (unsigned t = 0; t < 6; t++)
1469  {
1470  rect.left = 286 + t * 7; rect.top = 320; rect.right = rect.bottom = 0;
1471  viewscreen->m_pFont->DrawText(viewscreen->m_spriteVector, &str[t], 1, &rect, DT_NOCLIP, D3DCOLOR_ARGB(255, 255, 255, 255));
1472  }
1473  // Skip the decimal and do the last number in black
1474  rect.left = 286 + 6 * 7; rect.top = 320; rect.right = rect.bottom = 0;
1475  viewscreen->m_pFont->DrawText(viewscreen->m_spriteVector, &str[7], 1, &rect, DT_NOCLIP, D3DCOLOR_ARGB(255, 0, 0, 0));
1476  }
1477 
1478 
1479 
1480  viewscreen->m_spriteVector->End();
1481 
1482 
1483 
1484  if (ourcockpit.texturelib != C2)
1485  {
1486  pd3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, true);
1487 
1488  // half fuel gauge needle
1489  x = 310.0f;
1490  y = 242.0f;
1491  corner[0].x = 32.0f; corner[0].y = -32.0f; // ur
1492  corner[1].x = -32.0f; corner[1].y = -32.0f; // ul
1493  corner[2].x = 32.0f; corner[2].y = 32.0f; // lr
1494  corner[3].x = -32.0f; corner[3].y = 32.0f; // ll
1495 
1496  f_temp = fuel / ourcockpit.fuelmax * ourcockpit.power;
1497  D3DXMatrixRotationZ(&matrixWorld, D3DXToRadian(-90.0f + 180.0f * f_temp));
1498 
1499  D3DXVec2TransformCoord(&corner[0], &corner[0], &matrixWorld);
1500  D3DXVec2TransformCoord(&corner[1], &corner[1], &matrixWorld);
1501  D3DXVec2TransformCoord(&corner[2], &corner[2], &matrixWorld);
1502  D3DXVec2TransformCoord(&corner[3], &corner[3], &matrixWorld);
1503 
1504  V(viewscreen->m_avInstrument->Lock(0, 0, reinterpret_cast<void**>(&vtxs), D3DLOCK_DISCARD));
1505 
1506  (*vtxs).x = x + corner[0].x; (*vtxs).y = y + corner[0].y; (*vtxs).z = 0.0f; (*vtxs).w = 1.0f;
1507  (*vtxs).tu = 1.0f; (*vtxs).tv = 0.0f;
1508  vtxs++;
1509  (*vtxs).x = x + corner[1].x; (*vtxs).y = y + corner[1].y; (*vtxs).z = 0.0f; (*vtxs).w = 1.0f;
1510  (*vtxs).tu = 0.0f; (*vtxs).tv = 0.0f;
1511  vtxs++;
1512  (*vtxs).x = x + corner[2].x; (*vtxs).y = y + corner[2].y; (*vtxs).z = 0.0f; (*vtxs).w = 1.0f;
1513  (*vtxs).tu = 1.0f; (*vtxs).tv = 1.0f;
1514  vtxs++;
1515  (*vtxs).x = x + corner[3].x; (*vtxs).y = y + corner[3].y; (*vtxs).z = 0.0f; (*vtxs).w = 1.0f;
1516  (*vtxs).tu = 0.0f; (*vtxs).tv = 1.0f;
1517 
1518  V(viewscreen->m_avInstrument->Unlock());
1519 
1520  V(pd3dDevice->SetStreamSource(0, viewscreen->m_avInstrument, 0, sizeof(D3DINSTRUMENT)));
1521  V(pd3dDevice->SetTexture(0, viewscreen->m_pddsAOA[1]));
1522 
1523  V(pd3dDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2));
1524  }
1525 
1526  }
1527  if (ourcockpit.gndvehicle) {
1528  // We really only want to draw if we are in a grndvehicle
1529  turnByTurn->Draw(pd3dDevice);
1530  }
1531 }
1532 
1533 void instruments::OnCreateDevice(IDirect3DDevice9* pd3dDevice) {
1534  logger->AddToCallStack("instruments::OnCreateDevice");
1536  {
1537  turnByTurn->CreateVB(pd3dDevice);
1538  }
1539 }
1540 
1541 void instruments::OnResetDevice(IDirect3DDevice9* pd3dDevice, const D3DSURFACE_DESC* pBackBufferSurfaceDesc) {
1542  logger->AddToCallStack("instruments::OnResetDevice");
1544  {
1545  turnByTurn->CreateVB(pd3dDevice);
1546  }
1547 }
1548 
1550  logger->AddToCallStack("instruments::OnLostDevice");
1552  {
1553  turnByTurn->ReleaseResources(); // he is dynamic so he gets released
1554  }
1555 }
1556 
1558  logger->AddToCallStack("instruments::OnDestroyDevice");
1560  {
1562  }
1563 }
bool DismissHelp(int helpId, int nControlID=GUI_UNDERSTOOD)
bool lowfuel
Definition: globals.h:707
Scockpit ourcockpit
Definition: globals.cpp:176
float tach
Definition: globals.h:651
LPD3DXFONT m_pFont
Definition: Viewscreen.h:46
float power
Definition: globals.h:608
float fuel
Definition: globals.cpp:143
float HeadingTrueDegrees
Definition: Bus.h:30
D3DXVECTOR3 posnorml
Definition: Viewscreen.h:248
std::vector< Command > commandStream
Definition: Bus.h:342
D3DXVECTOR3 position
Definition: globals.h:549
float GetArcDist(D3DXVECTOR3 from, D3DXVECTOR3 to, bool includeAltDiff)
Definition: MathUtilities.h:37
void OnLostDevice()
GameClass * gameclass
Definition: Viewscreen.h:292
GameState displaystage
Definition: GameClass.h:121
short scanDisplayVesselLimit
Definition: globals.h:702
Logger * logger
Definition: instruments.h:26
void ReleaseResources()
Definition: TurnByTurn.cpp:227
float tirespeedKph
Definition: globals.h:651
long topscroll
Definition: globals.cpp:94
LPDIRECT3DTEXTURE9 m_pddsNamePlate
Definition: Viewscreen.h:156
LPDIRECT3DTEXTURE9 m_pddsAOA[3]
Definition: Viewscreen.h:161
InformationDialog * informationDialog
Definition: gui.h:789
LPDIRECT3DTEXTURE9 m_pddsGVDirection
Definition: Viewscreen.h:158
void Draw(IDirect3DDevice9 *pd3dDevice)
Definition: TurnByTurn.cpp:121
s_network_objects playerships[MAX_SCAN]
Definition: globals.cpp:174
short texturelib
Definition: globals.h:612
unsigned char ourmoonC
Definition: globals.cpp:27
void FrameMove(float fElapsedTime)
Definition: instruments.cpp:19
float RollAttitudeRadians
Definition: Bus.h:37
float TargetDistanceKm
Definition: Bus.h:393
void OnCreateDevice(IDirect3DDevice9 *pd3dDevice)
LPD3DXSPRITE m_spriteVector
Definition: Viewscreen.h:214
LPDIRECT3DTEXTURE9 m_pddsGVDialSmall
Definition: Viewscreen.h:154
short scanslot[MAX_SCAN]
Definition: Viewscreen.h:276
float markVel
Definition: globals.cpp:61
LPD3DXFONT m_pFont3
Definition: Viewscreen.h:48
void SendEvent(EventType eventType, float extent=0.0f) const
Definition: Networking.cpp:111
D3DXVECTOR3 dockInterface
Definition: globals.cpp:47
int linecursel
Definition: DialogBase.h:73
D3DXVECTOR3 GetArcBear(D3DXVECTOR3 vec2, float dist, float altd, D3DXVECTOR3 posnorml)
Definition: MathUtilities.h:64
float mark
Definition: globals.cpp:59
TurnByTurn * turnByTurn
Definition: instruments.h:27
instruments(Viewscreen *ptr)
Definition: instruments.cpp:7
std::string name
Definition: Command.h:11
float fuelmax
Definition: globals.h:637
const D3DXVECTOR3 northpoleC
void Draw(float fElapsedTime, IDirect3DDevice9 *pd3dDevice) const
static DialogBase * dialogs[D_ENUMERATION]
Definition: DialogBase.h:39
float bearVel
Definition: globals.cpp:60
float HeadingTrackDegrees
Definition: Bus.h:226
s_universe_object allobjects[maxstarC]
Definition: globals.cpp:170
Networking * networking
Definition: GameClass.h:107
bool PopUpHelp(short helpId, bool allowDismiss=true, bool isLearnMore=false)
#define D3DFVF_INSTRUMENT
Definition: globals.h:110
float bear
Definition: globals.cpp:58
Viewscreen * viewscreen
Definition: instruments.h:25
bool spaceCapable
Definition: globals.h:605
void AddDelayedSound(int soundEnum, float delay, float volume=1.0f)
Definition: Sound.cpp:1927
Definition: Command.h:5
short targetC
Definition: Bus.h:378
float flasher
Definition: globals.cpp:65
D3DXVECTOR3 velocity
Definition: globals.h:540
Sound * sound
Definition: GameClass.h:108
D3DXVECTOR3 headlightvec
Definition: Viewscreen.h:230
LPDIRECT3DTEXTURE9 m_pddsLightsCruiseIcons
Definition: Viewscreen.h:159
void Log(const char *msg, Level level=Info, int errorCode=0)
Definition: Logger.cpp:11
D3DXVECTOR3 dockMarker
Definition: globals.cpp:46
LPDIRECT3DTEXTURE9 m_pddsFuelIcon
Definition: Viewscreen.h:160
LPDIRECT3DVERTEXBUFFER9 m_avInstrument
Definition: Viewscreen.h:118
float Play(int soundEnum)
Definition: Sound.cpp:577
void CreateVB(IDirect3DDevice9 *pd3dDevice)
Definition: TurnByTurn.cpp:151
void OnDestroyDevice()
D3DXMATRIX matrixView
Definition: Viewscreen.h:220
char TimeToNextFix[6]
Definition: Bus.h:394
HMI * GUI
Definition: GameClass.h:110
float GroundSpeedKms
Definition: Bus.h:156
void OnResetDevice(IDirect3DDevice9 *pd3dDevice, const D3DSURFACE_DESC *pBackBufferSurfaceDesc)
float scandist[MAX_SCAN]
Definition: Viewscreen.h:277
void Update(bool pIsGrndVehicle, float pElasedTime)
Definition: TurnByTurn.cpp:18
std::vector< Swaypoint > waypoint
Definition: Bus.h:391
float usage
Definition: globals.h:645
LPDIRECT3DTEXTURE9 m_pddsGVCompass
Definition: Viewscreen.h:157
D3DXVECTOR3 barycentric
Definition: globals.h:540
float lampTest
Definition: Viewscreen.h:271
bool gndvehicle
Definition: globals.h:604
int WPtargetC
Definition: Bus.h:390
void AddToCallStack(const char *msg)
Definition: Logger.cpp:86
Bus * bus
Definition: GameClass.h:112
bool nextgen
Definition: globals.h:680
long scanscroll
Definition: globals.cpp:93
float insthdgDegrees
Definition: Viewscreen.h:234
D3DXVECTOR3 lastWaypointLocation
Definition: Bus.h:392
char gearshift
Definition: globals.h:652
Logger * logger
Definition: Viewscreen.h:293
float insttrk
Definition: Viewscreen.h:234
float PitchAttitudeRadians
Definition: Bus.h:36
D3DXVECTOR3 dockoffset
Definition: globals.h:549
LPDIRECT3DTEXTURE9 m_pddsGVBackground
Definition: Viewscreen.h:155