Rise
The Vieneo Province
MovingMap.cpp
Go to the documentation of this file.
1 #include "../Instrument.h"
2 
3 MovingMap::MovingMap(int prmX, int prmY, float prmXScale, float prmYScale, Bus* prmBus, Logger* prmLogger, DeviceObject* prmDevice, std::vector<Font*> prmFonts) :
4  Instrument(prmX, prmY, prmXScale, prmYScale, prmBus, prmLogger, prmDevice, prmFonts)
5 {
6  logger->AddToCallStack("MovingMap::ctor");
7  defaultFont = 1;
8 
9  // @todo could break compass and heading bug stuff into it's own instrument like TCAS
10  compass = new Sprite(logger, pDevice, "Textures/Instruments/CompassLarge.png", x, y, 0.2f, 0, 0, 530, 530, 0xFFFFFFFF, xScale, yScale);
11  headingBug = new Sprite(logger, pDevice, "Textures/Instruments/HeadingBug.png", x - 6, y - 6, 0.8f, 0, 0, 556, 556, 0xFFFF00FF, xScale, yScale);
12  bearingBug = new Sprite(logger, pDevice, "Textures/Instruments/HeadingBug.png", x - 6, y - 6, 0.8f, 0, 0, 556, 556, 0xFF00FF00, xScale, yScale);
13 
14  flyoverFix = new Sprite(logger, pDevice, "Textures/Instruments/Waypoints.png", x, y, 0.3f, 0, 0, 28, 28, 0xFFFFFFFF, xScale, yScale);
15  malteseFix = new Sprite(logger, pDevice, "Textures/Instruments/Waypoints.png", x, y, 0.3f, 28, 0, 28, 28, 0xFFFFFFFF, xScale, yScale);
16  touchdown = new Sprite(logger, pDevice, "Textures/Instruments/Waypoints.png", x, y, 0.3f, 56, 0, 28, 28, 0xFFFFFFFF, xScale, yScale);
17  userPin = new Sprite(logger, pDevice, "Textures/Instruments/Waypoints.png", x, y, 0.3f, 84, 0, 28, 28, 0xFFFFFFFF, xScale, yScale);
18 
19  // @todo could break assay overlay stuff into it's own instrument like TCAS
20  assay = new Sprite(logger, pDevice, "Textures/Instruments/assayBox.png", x, y, 0.1f, 0, 0, 32, 32, 0xFFFFFFFF, xScale, yScale);
21  assay->SetRotationCenter(D3DXVECTOR2(0, 0));
22 
23  // offset from middle to top left of 28x28 sprite
24  iconOffsetX = 14 * xScale;
25  iconOffsetY = 14 * yScale;
26 
27  relativeCenter = D3DXVECTOR2(530.0f *0.5f*xScale, 530.0f*0.5f*yScale);
28 
29  remoteAssayPower = 0.0f;
30  bus->assayGrid.tcp = bus->tcp;
31 }
32 
34 {
35  compass->Draw();
36  headingBug->Draw();
37  bearingBug->Draw();
38 
39  /*D3DXMATRIX matRot;
40  D3DXMatrixRotationZ(&matRot, -compass->rotate);*/
41 
42  //D3DXVECTOR2 lastWaypoint;
43  //lastWaypoint.x = 265;
44  //lastWaypoint.y = 265;
45  //D3DXVECTOR2 nextWaypoint;
46 
48  // first one (temporary waypoint) is skipped if it isn't set
49  // if distance is beyond 2x scale then skip
50 
51 
52  for (UINT i = 0; i < waypoints.size(); i++)
53  {
54  const Swaypoint waypoint = waypoints.at(i);
55 
56  DWORD color;
57  if (waypoint.id == bus->WPtargetC)
58  color = 0xFFFF00FF;
59  else
60  color = 0xFFFFFFFF;
61 
62  // ReSharper disable once CppDefaultCaseNotHandledInSwitchStatement
63  switch (waypoint.type)
64  {
65  case 0:
66  userPin->SetLocation(static_cast<int>(waypoint.location.x), static_cast<int>(waypoint.location.y));
67  userPin->Update();
68  userPin->Draw(color);
69  break;
70  case 1:
71  {
72  malteseFix->SetLocation(static_cast<int>(waypoint.location.x), static_cast<int>(waypoint.location.y));
73  malteseFix->Update();
74  malteseFix->Draw(color);
75 
76  WCHAR msg[99];
77  swprintf_s(msg, 99, L"%S", waypoint.text);
78  DrawTextW(msg, static_cast<int>(waypoint.location.x + iconOffsetX) + 6 - x, static_cast<int>(waypoint.location.y) - y, 0.3f, DT_NOCLIP, color);
79  }
80  break;
81  case 2:
82  {
83  touchdown->SetLocation(static_cast<int>(waypoint.location.x + 7.5f), static_cast<int>(waypoint.location.y));
84  touchdown->mag = max(1.0f, waypoint.length / bus->MapScaleInnerRingKm * 5.0f);
85  touchdown->rotate = 3.141f + headingTrueRad - D3DXToRadian(static_cast<float>(waypoint.heading));
86  touchdown->Update();
87  touchdown->Draw(color);
88  }
89  break;
90  case 3:
91  {
92  flyoverFix->SetLocation(static_cast<int>(waypoint.location.x), static_cast<int>(waypoint.location.y));
93  flyoverFix->Update();
94  flyoverFix->Draw(color);
95 
96  WCHAR msg[99];
97  swprintf_s(msg, 99, L"%S", waypoint.text);
98  DrawTextW(msg, static_cast<int>(waypoint.location.x + iconOffsetX) + 6 - x, static_cast<int>(waypoint.location.y) - y, 0.3f, DT_NOCLIP, color);
99  }
100  break;
101  }
102 
103 
104 
105  //course.height = static_cast<int>(sqrtf(powf(nextWaypoint.x - lastWaypoint.x, 2.0f) + powf(nextWaypoint.y - lastWaypoint.y, 2.0f)));
106  //course.x = static_cast<int>((nextWaypoint.x + lastWaypoint.x)*0.5f);
107  //course.y = static_cast<int>(min(nextWaypoint.y, lastWaypoint.y) - (course.height - fabsf(nextWaypoint.y - lastWaypoint.y))*0.5f);
108  //if (i == 0)
109  // course.color = 0xFFFF00FF; // first one only
110  //else
111  // course.color = 0xFFFFFFFF;
112 
113  //course.rotate = -atan2f(lastWaypoint.y - nextWaypoint.y, lastWaypoint.x - nextWaypoint.x) + D3DX_HALFPI;
114  //course.Update();
115  //course.Draw();
116 
117  //lastWaypoint = nextWaypoint;
118  }
119 
121  {
122  if (remoteAssayPower > 5.0f)
123  {
124  if (bus->RadioAltitudeKm < 0.4f || bus->RadioAltitudeKm > 0.6f)
125  DrawTextW(L"ALT", (int)(relativeCenter.x - 7.0f), (int)(relativeCenter.y + 8.0f), 1.0f, DT_NOCLIP, 0xFFFFAA00);
126  else
127  DrawTextW(L"SCN", (int)(relativeCenter.x - 7.0f), (int)(relativeCenter.y + 8.0f), 1.0f, DT_NOCLIP, 0xFF00FF00);
128 
129  for (int i = 0; i < 21; i++)
130  {
131  assay->SetLocation(assayGrid[i].u + x, assayGrid[i].v + y);
132  assay->Update();
133  assay->Draw(assayColor[i]);
134  }
135  }
136  else
137  {
138  DrawTextW(L"TST", (int)(relativeCenter.x - 7.0f), (int)(relativeCenter.y + 8.0f), 1.0f, DT_NOCLIP, 0xFFFFFFFF);
139 
140  for (int i = 0; i < 21; i++)
141  {
142  assay->SetLocation(assayGrid[i].u + x, assayGrid[i].v + y);
143  assay->Update();
144  assay->Draw(D3DCOLOR_ARGB(255, i * 10, i * 10, i * 10));
145  }
146  }
147  }
148 }
149 
150 void MovingMap::FrameMove(float fElapsed)
151 {
152  headingTrueRad = D3DXToRadian(bus->HeadingTrueDegrees);
153 
154  // so 6.28 - 0 is a 6.28 or -6.28 difference!
155  float diff = headingTrueRad - compass->rotate;
156  if (diff > D3DX_PI)
157  diff -= D3DX_TAU;
158  else if (diff < -D3DX_PI)
159  diff += D3DX_TAU;
160 
161  compass->rotate += diff * fElapsed;
162  compass->Update();
163 
165  if (diff > D3DX_PI)
166  diff -= D3DX_TAU;
167  else if (diff < -D3DX_PI)
168  diff += D3DX_TAU;
169 
170  headingBug->rotate = diff;
171  headingBug->Update();
172 
173  bearingBug->rotate = -D3DXToRadian(bear);
174  bearingBug->Update();
175 
176  pixelPerKmX = 530.0f * 0.25f / bus->MapScaleInnerRingKm * xScale;
177  pixelPerKmY = 530.0f * 0.25f / bus->MapScaleInnerRingKm * yScale;
178 
179  D3DXVECTOR3 posnorml;
180  D3DXVec3Normalize(&posnorml, &playerships[0].position);
181  D3DXMATRIX lookAtLH;
182  D3DXMatrixLookAtLH(&lookAtLH, &playerships[0].position, &northpoleC, &posnorml);
183  D3DXMATRIX matrixRot;
184  D3DXMatrixRotationZ(&matrixRot, compass->rotate);
185  lookAtLH = lookAtLH * matrixRot;
186 
187  waypoints.clear();
188  for (UINT i = 0; i < bus->waypoint.size(); i++)
189  {
190  const Swaypoint waypoint = bus->waypoint.at(i);
191 
192  // first one (temporary waypoint) is skipped if it isn't set
193  if (i == 0 && waypoint.location.x == 0.0f)
194  continue;
195 
196  // if distance is beyond 2x scale then skip
197  D3DXVECTOR3 result1;
198  D3DXVec3TransformCoord(&result1, &waypoint.location, &lookAtLH);
199  // don't show stuff on other side of planet
200  if (fabsf(result1.z) > (f_MSL + radiusC))
201  continue;
202  D3DXVECTOR2 result2 = D3DXVECTOR2(result1.x, result1.y);
203  const float dist = D3DXVec2Length(&result2);
204  if (dist > bus->MapScaleInnerRingKm * 2.0f)
205  continue;
206 
207  const D3DXVECTOR2 diff2d = D3DXVECTOR2(-result2.x * pixelPerKmX, result2.y * pixelPerKmY);
208  D3DXVECTOR2 nextWaypoint = relativeCenter + diff2d;
209  nextWaypoint.x = static_cast<int>(nextWaypoint.x) - iconOffsetX;
210  nextWaypoint.y = static_cast<int>(nextWaypoint.y) - iconOffsetY;
211 
212  Swaypoint newWaypoint;
213  newWaypoint.type = waypoint.type;
214  newWaypoint.location.x = nextWaypoint.x + x;
215  newWaypoint.location.y = nextWaypoint.y + y;
216  newWaypoint.id = i;
217  newWaypoint.heading = waypoint.heading;
218  newWaypoint.length = waypoint.length;
219  strcpy_s(newWaypoint.text, 80, waypoint.text);
220 
221  waypoints.emplace_back(newWaypoint);
222  }
223 
225  {
227  assay->mag = 8.0f / bus->MapScaleInnerRingKm;
228 
229  float vertexWidth = 2.0f;
230  float vertexHeight = 2.0f;
231  D3DXMatrixRotationZ(&matrixRot, assay->rotate);
232  D3DXMatrixInverse(&matrixRot, nullptr, &matrixRot);
233  D3DXVECTOR3 test, result;
234  test.z = 0.0f; // UL
235  int index = 0;
236  for (int xx = 0; xx < 5; xx++)
237  {
238  for (int yy = 0; yy < 5; yy++)
239  {
240  if ((xx == 0 && yy == 0) || (xx == 4 && yy == 0) || (xx == 0 && yy == 4) || (xx == 4 && yy == 4))
241  continue;
242  test.x = ((xx - 2) - bus->assayProgressU - (bus->tcp.u - bus->assayGrid.tcp.u)) * vertexWidth * pixelPerKmX;
243  test.y = ((yy - 2) - bus->assayProgressV - (bus->tcp.v - bus->assayGrid.tcp.v)) * vertexHeight * pixelPerKmY;
244  D3DXVec3TransformCoord(&result, &test, &matrixRot);
245  result.x += relativeCenter.x;
246  result.y += relativeCenter.y;
247  assayGrid[index].u = static_cast<short>(result.x);
248  assayGrid[index].v = static_cast<short>(result.y);
249 
250  assayColor[index] = D3DCOLOR_ARGB(static_cast<int>(bus->assayQuality*255.0f),
251  bus->assayGrid.gridarray[xx][yy].oreA,
252  bus->assayGrid.gridarray[xx][yy].oreC,
253  bus->assayGrid.gridarray[xx][yy].oreD);
254 
255  index++;
256  }
257  }
258  remoteAssayPower += fElapsed;
259  }
260  else
261  {
262  remoteAssayPower = 0.0f;
263  bus->assayGrid.tcp = bus->tcp;
264  }
265 
266  // @todo GPWS overlay
267 }
#define radiusC
Definition: globals.h:88
void SetLocation(int absoluteX, int absoluteY)
Definition: Sprite.cpp:90
Sprite * compass
Definition: Instrument.h:252
Scockpit ourcockpit
Definition: globals.cpp:176
float iconOffsetY
Definition: Instrument.h:265
Sprite * bearingBug
Definition: Instrument.h:254
float mag
Definition: Sprite.h:31
struct Bus::Afcs AFCS
float HeadingTrueDegrees
Definition: Bus.h:30
float headingTrueRad
Definition: Instrument.h:266
Definition: Logger.h:9
s_network_objects playerships[MAX_SCAN]
Definition: globals.cpp:174
float RadioAltitudeKm
Definition: Bus.h:134
float assayProgressU
Definition: Bus.h:387
Sprite * headingBug
Definition: Instrument.h:253
float pixelPerKmX
Definition: Instrument.h:261
DeviceObject * pDevice
Definition: Instrument.h:17
void Update()
Definition: Sprite.cpp:41
float iconOffsetX
Definition: Instrument.h:264
Sprite * assay
Definition: Instrument.h:259
float rotate
Definition: Sprite.h:30
void Draw(D3DXCOLOR prmColor)
Definition: Sprite.cpp:66
Sprite * flyoverFix
Definition: Instrument.h:255
Definition: Bus.h:16
const D3DXVECTOR3 northpoleC
Definition: Sprite.h:7
Sprite * touchdown
Definition: Instrument.h:257
void SetRotationCenter(D3DXVECTOR2 rotationCenter)
Definition: Sprite.h:47
Bus * bus
Definition: Instrument.h:18
float xScale
Definition: Instrument.h:15
UINT defaultFont
Definition: Instrument.h:20
float f_MSL
Definition: globals.cpp:36
float assayQuality
Definition: Bus.h:386
float bear
Definition: globals.cpp:58
float MapScaleInnerRingKm
Definition: Bus.h:381
float assayProgressV
Definition: Bus.h:387
DWORD assayColor[21]
Definition: Instrument.h:268
VECTOR2SHORT assayGrid[21]
Definition: Instrument.h:267
MovingMap(int prmX, int prmY, float prmXScale, float prmYScale, Bus *prmBus, Logger *prmLogger, DeviceObject *prmDevice, std::vector< Font *> prmFonts)
Definition: MovingMap.cpp:3
bool remoteAssayPower
Definition: globals.h:606
Logger * logger
Definition: Instrument.h:19
float pixelPerKmY
Definition: Instrument.h:262
float DesiredHeadingRadians
Definition: Bus.h:114
float remoteAssayPower
Definition: Instrument.h:270
Sprite * malteseFix
Definition: Instrument.h:256
std::vector< Swaypoint > waypoint
Definition: Bus.h:391
Sprite * userPin
Definition: Instrument.h:258
int WPtargetC
Definition: Bus.h:390
void AddToCallStack(const char *msg)
Definition: Logger.cpp:86
VECTOR2SHORT tcp
Definition: Bus.h:236
void Render() override
Definition: MovingMap.cpp:33
SAssayGrid assayGrid
Definition: Bus.h:385
void FrameMove(float fElapsed) override
Definition: MovingMap.cpp:150
float yScale
Definition: Instrument.h:16
float HeadingMagneticDegrees
Definition: Bus.h:31
D3DXVECTOR2 relativeCenter
Definition: Instrument.h:269