Rise
The Vieneo Province
buildings.cpp
Go to the documentation of this file.
1 #include "buildings.h"
2 #include "Viewscreen.h"
3 
4 #include <fcntl.h> // For _O_RDWR, _O_BINARY, _O_RDONLY, O_TEXT
5 #include <sys/stat.h> // For _S_IWRITE, _S_IREAD
6 #include "io.h" // needed for the _write
7 
9 {
10  viewscreen = ptr;
11  logger = ptr->logger;
12 
13  RtlZeroMemory(buildzone, sizeof(BUILDZONE) * buildingVBC);
14 }
15 
17 {
18  if (grid.type == PlotType::UserTownship)
19  {
20  // these are the transparent domes that were added 15 years later to the parks
21  if (r == 113) return CheckLayout(82, grid);
22  if (r == 114) return CheckLayout(81, grid);
23  if (r == 115) return CheckLayout(80, grid);
24  }
25 
26  return
27  r < 32 && 0x80000000 >> r & grid.layout1 ||
28  r >= 32 && r < 64 && 0x80000000 >> (r - 32) & grid.layout2 ||
29  r >= 64 && r < 96 && 0x80000000 >> (r - 64) & grid.layout3 ||
30  r >= 96 && 0x80000000 >> (r - 96) & grid.layout4;
31 }
32 
33 HRESULT buildings::Building(short t, short s) const
34 {
35  short buildzoneOrdinal = -1;
36  unsigned int r;
37  char msg[999];
38  HRESULT hr;
39 
40  for (r = 0; r < buildingVBC; r++) // look for empty slot
41  {
42  if (!buildzone[r].VB)
43  {
44  buildzoneOrdinal = static_cast<short>(r);
45  r = buildingVBC;
46  }
47  }
48  if (buildzoneOrdinal == -1)
49  {
50  logger->Log("Building() failed to find an open VB slot!", Logger::Level::Warn);
51  return S_OK;
52  }
53 
54  sprintf_s(msg, sizeof(msg), "Building() will be using slot %i...", buildzoneOrdinal);
55  logger->Log(msg);
56  gridarray[t][s].buildzoneOrdinal = buildzoneOrdinal;
57 
58 
59  buildzone[buildzoneOrdinal].u = t - 31 + viewscreen->ptrGrid->tcp.u; buildzone[buildzoneOrdinal].v = s - 31 + viewscreen->ptrGrid->tcp.v;
60 
61  sprintf_s(msg, sizeof(msg), "Building() %i loading type %i @ %i %i (u%i v%i)...", buildzoneOrdinal, gridarray[t][s].type, t, s, buildzone[buildzoneOrdinal].u, buildzone[buildzoneOrdinal].v);
62  logger->Log(msg);
63  buildzone[buildzoneOrdinal].type = gridarray[t][s].type;
64 
65 
66  char file[99];
67  int handle;
68 
69  switch (buildzone[buildzoneOrdinal].type)
70  {
71  case 1:
72  sprintf_s(file, sizeof(file), "meshes\\deois-financial.dix");
73  buildzone[buildzoneOrdinal].emissive = 0.5f;
74  break;
75  case 2:
76  sprintf_s(file, sizeof(file), "meshes\\house1.dix");
77  buildzone[buildzoneOrdinal].emissive = 0.1f;
78  break;
79  case PlotType::UserMining:
80  sprintf_s(file, sizeof(file), "meshes\\mining1.dix");
81  buildzone[buildzoneOrdinal].emissive = 0.2f;
82  break;
83  case 4:
84  sprintf_s(file, sizeof(file), "meshes\\Deois-industrial.dix");
85  buildzone[buildzoneOrdinal].emissive = 0.5f;
86  break;
87  case 5:
88  sprintf_s(file, sizeof(file), "meshes\\Deois-city center.dix");
89  buildzone[buildzoneOrdinal].emissive = 0.5f;
90  break;
91  case 6:
92  sprintf_s(file, sizeof(file), "meshes\\Deois-transit district.dix");
93  buildzone[buildzoneOrdinal].emissive = 0.5f;
94  break;
95  //case 7:
96  //sprintf_s(file, sizeof(file), "meshes\\noizni.dix");
97  //buildzone[buildzoneOrdinal].emissive=0.2f;
98  //break;
99  //case 8:
100  //sprintf_s(file, sizeof(file), "meshes\\cadassum.dix"); ... 9 used to be chojeir
101  //buildzone[buildzoneOrdinal].emissive=0.2f;
102  //break;
103  //case 9:
104  //sprintf_s(file, sizeof(file), "meshes\\NorthPole.dix");
105  //buildzone[buildzoneOrdinal].emissive=0.2f;
106  //break;
107  case PlotType::UserFarming:
108  sprintf_s(file, sizeof(file), "meshes\\farm1.dix");
109  buildzone[buildzoneOrdinal].emissive = 0.1f;
110  break;
111  case PlotType::UserTownship:
112  sprintf_s(file, sizeof(file), "meshes\\town1.dix");
113  buildzone[buildzoneOrdinal].emissive = 0.2f;
114  break;
115  case 12:
116  sprintf_s(file, sizeof(file), "meshes\\sea-arcridge.dix");
117  buildzone[buildzoneOrdinal].emissive = 0.3f;
118  break;
119  case 13:
120  sprintf_s(file, sizeof(file), "meshes\\Deois-port.dix");
121  buildzone[buildzoneOrdinal].emissive = 0.5f;
122  break;
123  case PlotType::UserAirfield:
124  sprintf_s(file, sizeof(file), "meshes\\airfield.dix");
125  buildzone[buildzoneOrdinal].emissive = 0.1f;
126  break;
127  //case 15:
128  //sprintf_s(file, sizeof(file), "meshes\\salvage1.dix");
129  //buildzone[buildzoneOrdinal].emissive=0.2f;
130  //break;
131  case 16:
132  sprintf_s(file, sizeof(file), "meshes\\O-4 ruin 1-1.dix");
133  buildzone[buildzoneOrdinal].emissive = 0.0f;
134  break;
135  case 17:
136  sprintf_s(file, sizeof(file), "meshes\\O-4 ruin 1-2.dix");
137  buildzone[buildzoneOrdinal].emissive = 0.0f;
138  break;
139  case 18:
140  sprintf_s(file, sizeof(file), "meshes\\O-4 ruin 1-3.dix");
141  buildzone[buildzoneOrdinal].emissive = 0.0f;
142  break;
143  case 19:
144  sprintf_s(file, sizeof(file), "meshes\\O-4 ruin 1-4.dix");
145  buildzone[buildzoneOrdinal].emissive = 0.0f;
146  break;
147  default:
148  sprintf_s(msg, sizeof(msg), "Building() %i DIX could not match a type %i!", buildzoneOrdinal, buildzone[buildzoneOrdinal].type);
149  logger->Log(msg, Logger::Level::Error);
150  return E_UNEXPECTED;
151  }
152 
153  _sopen_s(&handle, file, _O_RDONLY | _O_BINARY | _O_SEQUENTIAL, _SH_DENYWR, _S_IWRITE);
154  if (handle == -1)
155  {
156  sprintf_s(msg, sizeof(msg), "Building() %i failed to load \"%s\"!", buildzoneOrdinal, file);
157  logger->Log(msg, Logger::Level::Error);
158  return DXUTERR_MEDIANOTFOUND;
159  }
160 
161  unsigned short filecomponents;
162  _lseek(handle, 0, SEEK_SET);
163  _read(handle, &filecomponents, 2);
164  buildzone[buildzoneOrdinal].components = 0;
165 
166  // need to figure up total based on number of 1's in layout
167  if (gridarray[t][s].layout1 == 0L && gridarray[t][s].layout2 == 0L && gridarray[t][s].layout3 == 0L && gridarray[t][s].layout4 == 0L)
168  {
169  assert(!gridarray[t][s].IsUserColony());
170  buildzone[buildzoneOrdinal].components = filecomponents; // this will run for cities!
171  }
172  else
173  {
174  for (r = 0; r < filecomponents; r++)
175  {
176  if (CheckLayout(r, gridarray[t][s]))
177  buildzone[buildzoneOrdinal].components++;
178  }
179  }
180 
181 
182  sprintf_s(msg, sizeof(msg), "buildzone[%i].componentarray", buildzoneOrdinal);
183  if (buildzone[buildzoneOrdinal].componentarray)
184  {
185  SAFE_DELETE(buildzone[buildzoneOrdinal].componentarray);
187  }
188  buildzone[buildzoneOrdinal].componentarray = new s_mesh_component[buildzone[buildzoneOrdinal].components];
189  if (buildzone[buildzoneOrdinal].componentarray == nullptr)
190  {
191  sprintf_s(msg, sizeof(msg), "Building() %i could not create component array for \"%s\"", buildzoneOrdinal, file);
192  logger->Log(msg, Logger::Level::Error);
193  return E_OUTOFMEMORY;
194  }
195  viewscreen->gameclass->AddTrackedResource(msg); // managed, it is just memory
196 
197 
198  sprintf_s(msg, sizeof(msg), "Building() %i loading %i of %i components for \"%s\"", buildzoneOrdinal, buildzone[buildzoneOrdinal].components, filecomponents, file);
199  logger->Log(msg);
200 
201  long vertices = 0;
202  short tempr = 0;
203  for (r = 0; r < filecomponents; r++)
204  {
205  bool add;
206  if (gridarray[t][s].layout1 != 0L || gridarray[t][s].layout2 != 0L || gridarray[t][s].layout3 != 0L || gridarray[t][s].layout4 != 0L)
207  add = CheckLayout(r, gridarray[t][s]);
208  else
209  add = true; // city
210 
211  if (add)
212  {
213  short i_temp;
214  _lseek(handle, static_cast<long>(r) * 100L + 99L, SEEK_SET); // To 0
215  _read(handle, &i_temp, 2); // 0
216  buildzone[buildzoneOrdinal].componentarray[tempr].startvertex = i_temp;
217  _read(handle, &i_temp, 2); // 2
218  buildzone[buildzoneOrdinal].componentarray[tempr].primitives = i_temp;
219  _read(handle, &buildzone[buildzoneOrdinal].componentarray[tempr].nominalxyz, 12); // 4
220  _read(handle, &buildzone[buildzoneOrdinal].componentarray[tempr].nominalypr, 12); // 16
221  _read(handle, &buildzone[buildzoneOrdinal].componentarray[tempr].boundsphere, 4); // 28
222  _read(handle, &buildzone[buildzoneOrdinal].componentarray[tempr].extendby, 12); // 32
223  _read(handle, &buildzone[buildzoneOrdinal].componentarray[tempr].texture, 2); // 44
224  _lseek(handle, static_cast<long>(r) * 100L + 99L + 58L, SEEK_SET); // To 58
225  _read(handle, &buildzone[buildzoneOrdinal].componentarray[tempr].type, 1); // 58
226  _lseek(handle, static_cast<long>(r) * 100L + 99L + 91L, SEEK_SET); // To 91
227  _read(handle, &buildzone[buildzoneOrdinal].componentarray[tempr].attachto, 2); // 91
228 
229  if (buildzone[buildzoneOrdinal].componentarray[tempr].texture < 0 ||
230  buildzone[buildzoneOrdinal].componentarray[tempr].texture > citytextureC)
231  {
232  sprintf_s(msg, sizeof(msg), "Building type %i component %i had out-of-bounds texture: %i", gridarray[t][s].type, tempr, buildzone[buildzoneOrdinal].componentarray[tempr].texture);
233  logger->Log(msg, Logger::Level::Error);
234  }
235 
236  buildzone[buildzoneOrdinal].componentarray[tempr].extended = 0.0f; // Current extended %
237  vertices += buildzone[buildzoneOrdinal].componentarray[tempr].primitives * 3;
238 
239  tempr++;
240  }
241  }
242 
243  _close(handle);
244 
245  // RTS
246  if (gridarray[t][s].UsesRts())
247  {
248  sprintf_s(msg, sizeof(msg), "Building() %i loading RTS grid for \"%s\"", buildzoneOrdinal, file);
249  logger->Log(msg);
250 
251  if (buildzone[buildzoneOrdinal].rts)
252  {
253  SAFE_DELETE(buildzone[buildzoneOrdinal].rts);
254  sprintf_s(msg, sizeof msg, "buildzone[%i].rts", buildzoneOrdinal);
256  }
257  buildzone[buildzoneOrdinal].rts = new RTSGRID[26 * 26];
258  if (!buildzone[buildzoneOrdinal].rts)
259  {
260  sprintf_s(msg, sizeof(msg), "Building() %i could not create RTS array for \"%s\"", buildzoneOrdinal, file);
261  logger->Log(msg, Logger::Level::Error);
262  return E_OUTOFMEMORY;
263  }
264  sprintf_s(msg, sizeof msg, "buildzone[%i].rts", buildzoneOrdinal);
265  viewscreen->gameclass->AddTrackedResource(msg); // managed, it is just memory
266 
267 
268  // saving these out to separate RTS files
269  int rtsHandle = -1;
270  char rtsFile[MAX_PATH];
271  strcpy_s(rtsFile, MAX_PATH, file);
272  int tt = strlen(file) - 3;
273  rtsFile[tt++] = 'r';
274  rtsFile[tt++] = 't';
275  rtsFile[tt] = 's';
276  //_sopen_s(&rtsHandle, rtsFile, _O_WRONLY | _O_CREAT | _O_TRUNC | O_BINARY, _SH_DENYWR, _S_IWRITE);
277  _sopen_s(&rtsHandle, rtsFile, _O_RDONLY | _O_BINARY | _O_SEQUENTIAL, _SH_DENYWR, _S_IWRITE);
278  if (rtsHandle == -1)
279  {
280  sprintf_s(msg, sizeof(msg), "Building() %i failed to load \"%s\"!", buildzoneOrdinal, rtsFile);
281  logger->Log(msg, Logger::Level::Error);
282  return DXUTERR_MEDIANOTFOUND;
283  }
284  //_write(rtsHandle, buildzone[VB].rts, sizeof(RTSGRID) * 26 * 26);
285  _read(rtsHandle, buildzone[buildzoneOrdinal].rts, sizeof(RTSGRID) * 26 * 26);
286  _close(rtsHandle);
287 
288  if (FAILED(DXUTGetD3D9Device()->CreateVertexBuffer(26 * 26 * 3 * 2 * sizeof(D3DVERTEX2),
289  D3DUSAGE_WRITEONLY, D3DFVF_VERTEX2,
290  D3DPOOL_MANAGED, &buildzone[buildzoneOrdinal].RTSVB, NULL)))
291  {
292  sprintf_s(msg, sizeof(msg), "Building() %i could not create RTS memory (%i vertices) for \"%s\"", buildzoneOrdinal, 26 * 26 * 3 * 2, file);
293  logger->Log(msg, Logger::Level::Error);
294  return E_OUTOFMEMORY;
295  }
296 
297  sprintf_s(msg, sizeof(msg), "buildzone[%i].RTSVB", buildzoneOrdinal);
298  viewscreen->gameclass->AddTrackedResource(msg); // managed
299 
300 
301  sprintf_s(msg, sizeof(msg), "buildzone[%i].rtscomponentarray", buildzoneOrdinal);
302  if (buildzone[buildzoneOrdinal].rtscomponentarray)
303  {
304  SAFE_DELETE(buildzone[buildzoneOrdinal].rtscomponentarray);
306  }
307  buildzone[buildzoneOrdinal].rtscomponentarray = new s_mesh_component[RTStextureC];
308  if (buildzone[buildzoneOrdinal].rtscomponentarray == nullptr)
309  {
310  sprintf_s(msg, sizeof(msg), "Building() %i could not create RTS component array for \"%s\"", buildzoneOrdinal, file);
311  logger->Log(msg, Logger::Level::Error);
312  return E_OUTOFMEMORY;
313  }
314  viewscreen->gameclass->AddTrackedResource(msg); // managed, it is just memory
315  }
316 
317 
318 
319  if (FAILED(DXUTGetD3D9Device()->CreateVertexBuffer(vertices * sizeof(D3DVERTEX), D3DUSAGE_WRITEONLY, D3DFVF_VERTEX, D3DPOOL_MANAGED,
320  &buildzone[buildzoneOrdinal].VB, NULL)))
321  {
322  sprintf_s(msg, sizeof(msg), "Building() %i could not create memory (%i vertices) for \"%s\"", buildzoneOrdinal, vertices, file);
323  logger->Log(msg, Logger::Level::Error);
324  return E_OUTOFMEMORY;
325  }
326  sprintf_s(msg, sizeof(msg), "Building() %i created VB (%i vertices) for \"%s\"", buildzoneOrdinal, vertices, file);
327  logger->Log(msg);
328  sprintf_s(msg, sizeof(msg), "buildzone[%i].VB", buildzoneOrdinal);
329  viewscreen->gameclass->AddTrackedResource(msg); // managed
330 
331 
332  // Vertices -----------------------------------------------------------------------------
333  switch (gridarray[t][s].type)
334  {
335  case PlotType::DeoisFinancial:
336  sprintf_s(file, sizeof(file), "Meshes\\deois-financial.daw");
337  break;
338  case PlotType::UserEstate:
339  sprintf_s(file, sizeof(file), "Meshes\\house1.daw");
340  break;
341  case PlotType::UserMining:
342  sprintf_s(file, sizeof(file), "Meshes\\mining1.daw");
343  break;
344  case PlotType::DeoisIndustrial:
345  sprintf_s(file, sizeof(file), "Meshes\\Deois-industrial.daw");
346  break;
347  case PlotType::DeoisCityCenter:
348  sprintf_s(file, sizeof(file), "Meshes\\Deois-city center.daw");
349  break;
350  case PlotType::DeoisTransit:
351  sprintf_s(file, sizeof(file), "Meshes\\Deois-transit district.daw");
352  break;
353  /*case 7:
354  sprintf_s(file, sizeof(file), "Meshes\\noizni.daw");
355  break;
356  case 8:
357  sprintf_s(file, sizeof(file), "Meshes\\cadassum.daw"); ... 9 used to be chojeir
358  break;*/
359  /*case 9:
360  sprintf_s(file, sizeof(file), "Meshes\\NorthPole.daw");
361  break;*/
362  case PlotType::UserFarming:
363  sprintf_s(file, sizeof(file), "Meshes\\farm1.daw");
364  break;
365  case PlotType::UserTownship:
366  sprintf_s(file, sizeof(file), "Meshes\\town1.daw");
367  break;
368  case PlotType::Arcridge:
369  sprintf_s(file, sizeof(file), "Meshes\\sea-arcridge.daw");
370  break;
371  case PlotType::DeoisPort:
372  sprintf_s(file, sizeof(file), "Meshes\\Deois-port.daw");
373  break;
374  case PlotType::UserAirfield:
375  sprintf_s(file, sizeof(file), "Meshes\\airfield.daw");
376  break;
377  /*case 15:
378  sprintf_s(file, sizeof(file), "Meshes\\salvage1.daw");
379  break;
380  */case PlotType::O4Ruin1:
381  sprintf_s(file, sizeof(file), "Meshes\\O-4 ruin 1-1.daw");
382  break;
383  case PlotType::O4Ruin2:
384  sprintf_s(file, sizeof(file), "Meshes\\O-4 ruin 1-2.daw");
385  break;
386  case PlotType::O4Ruin3:
387  sprintf_s(file, sizeof(file), "Meshes\\O-4 ruin 1-3.daw");
388  break;
389  case PlotType::O4Ruin4:
390  sprintf_s(file, sizeof(file), "Meshes\\O-4 ruin 1-4.daw");
391  break;
392  default:
393  sprintf_s(msg, sizeof(msg), "Building() %i DAW could not match a type %i!", buildzoneOrdinal, buildzone[buildzoneOrdinal].type);
394  logger->Log(msg, Logger::Level::Error);
395  return E_UNEXPECTED;
396  }
397  _sopen_s(&handle, file, _O_RDONLY | _O_BINARY | _O_SEQUENTIAL, _SH_DENYWR, _S_IWRITE);
398  if (handle == -1)
399  {
400  sprintf_s(msg, sizeof(msg), "Building() %i failed to load \"%s\"", buildzoneOrdinal, file);
401  logger->Log(msg, Logger::Level::Error);
402  return DXUTERR_MEDIANOTFOUND;
403  }
404 
405  short tempvertices;
406  _lseek(handle, 0L, SEEK_SET);
407  _read(handle, &tempvertices, 2);
408 
409  sprintf_s(msg, sizeof(msg), "Building() %i scanning %i file vertices...", buildzoneOrdinal, tempvertices);
410  logger->Log(msg);
411 
412  D3DVERTEX* tempdax = new D3DVERTEX[tempvertices];
413  D3DXVECTOR3 tempnormal;
414 
415  for (r = 0; r < static_cast<unsigned int>(tempvertices); r++)
416  {
417  _lseek(handle, 2L + r * 32L + 0L, SEEK_SET);
418  _read(handle, &tempnormal, 12);
419  tempdax[r].x = tempnormal.x;
420  tempdax[r].y = tempnormal.y;
421  tempdax[r].z = tempnormal.z;
422  _lseek(handle, 2L + r * 32L + 12L, SEEK_SET);
423  _read(handle, &tempnormal, 12);
424  tempdax[r].nx = -tempnormal.x;
425  tempdax[r].ny = tempnormal.y;
426  tempdax[r].nz = tempnormal.z;
427  _lseek(handle, 2L + r * 32L + 24L, SEEK_SET);
428  _read(handle, &tempnormal.x, 4);
429  _read(handle, &tempnormal.y, 4);
430  tempdax[r].tu = tempnormal.x;
431  tempdax[r].tv = tempnormal.y;
432  }
433 
434  // TERPOS
435 
436  // UL 0 >UL
437  //
438  // 1 2 >1
439  //
440  // vUL v0 >vUL
441 
442  D3DXMATRIX matrixTemp, matrixWorld, matrixRotation;
443  D3DXVECTOR3 ul, ll, ur, lr, leftvec, rightvec, northvector, result;
444  D3DXVECTOR3 leftpt, rightpt;
445  // first determine CG location --------------------------------------------------------------
446  switch (gridarray[t][s].zone)
447  {
448  case 0: // Along diagonal for cities only
449  ul = gridarray[t][s].position;
450  ll = gridarray[t][s + 1].position;
451  ur = gridarray[t + 1][s].position;
452  lr = gridarray[t + 1][s + 1].position;
453 
454  // Center
455  buildzone[buildzoneOrdinal].terpos = insidearray[t][s][2];
456  break;
457 
458  case 1: // Along center beam (TOP LEFT)
459  ul = gridarray[t][s].position;
460  ll = insidearray[t][s][1];
461  ur = insidearray[t][s][0];
462  lr = insidearray[t][s][2];
463 
464  // Center
465  buildzone[buildzoneOrdinal].terpos = (ul + lr)*0.5f;
466  break;
467 
468  case 2: // Along center beam (TOP RIGHT)
469  ul = insidearray[t][s][0];
470  ur = gridarray[t + 1][s].position;
471  ll = insidearray[t][s][2];
472  lr = insidearray[t + 1][s][1];
473 
474  // Center
475  buildzone[buildzoneOrdinal].terpos = (ul + lr)*0.5f;
476  break;
477 
478  case 3: // Along center beam (LOWER RIGHT)
479  ul = insidearray[t][s][2];
480  ur = insidearray[t + 1][s][1];
481  ll = insidearray[t][s + 1][0];
482  lr = gridarray[t + 1][s + 1].position;
483 
484  // Center
485  buildzone[buildzoneOrdinal].terpos = (ul + lr)*0.5f;
486  break;
487 
488  case 4: // Along center beam (LOWER LEFT)
489  ul = insidearray[t][s][1];
490  ur = insidearray[t][s][2];
491  ll = gridarray[t][s + 1].position;
492  lr = insidearray[t][s + 1][0];
493 
494  // Center
495  buildzone[buildzoneOrdinal].terpos = (ul + lr)*0.5f;
496  break;
497 
498  default:
499  sprintf_s(msg, sizeof(msg), "Building() %i zone %i!", buildzoneOrdinal, gridarray[t][s].zone);
500  logger->Log(msg, Logger::Level::Error);
501  return E_UNEXPECTED;
502  }
503 
504  // Find north vector
505  D3DXVec3Subtract(&leftvec, &ul, &ll);
506  D3DXVec3Subtract(&rightvec, &ur, &lr);
507  D3DXVec3Add(&result, &leftvec, &rightvec);
508  D3DXVec3Normalize(&northvector, &result);
509 
510  // plotskew and cross product so the layout/depth maps make sense
511  D3DXVECTOR3 topedge = ul - ur;
512  D3DXVECTOR3 bottomedge = ll - lr;
513  const float skewWidth = (D3DXVec3Length(&topedge) + D3DXVec3Length(&bottomedge))*0.5f;
514  const float skewHeight = (D3DXVec3Length(&leftvec) + D3DXVec3Length(&rightvec))*0.5f;
515 
516 #ifdef _DEBUG
517 //#define FindMakeshipGrid
518 #endif
519 
520  // Find plumb line, except for O-4 ruins
521  D3DXVECTOR3 plumb;
522 #ifndef FindMakeshipGrid
523  if (gridarray[t][s].IsO4())
524  {
525  D3DXVECTOR3 eastvector = topedge + bottomedge;
526  D3DXVec3Normalize(&eastvector, &eastvector);
527  D3DXVec3Cross(&plumb, &northvector, &eastvector);
528  D3DXVec3Normalize(&plumb, &plumb);
529  }
530  else
531 #endif
532  {
533  D3DXVec3Normalize(&plumb, &buildzone[buildzoneOrdinal].terpos);
534  }
535  D3DXMatrixLookAtLH(&matrixTemp, &centerC, &plumb, &northvector);
536  D3DXMatrixInverse(&buildzone[buildzoneOrdinal].matrixBase, nullptr, &matrixTemp);
537 
538 #ifdef FindMakeshipGrid
539  // for determining the grid in Makeship
540  D3DXVECTOR3 makeShipUl;
541  D3DXVECTOR3 makeShipLl;
542  D3DXVECTOR3 makeShipUr;
543  D3DXVECTOR3 makeShipLr;
544  D3DXVec3TransformCoord(&makeShipUl, &ul, &matrixTemp);
545  D3DXVec3TransformCoord(&makeShipLl, &ll, &matrixTemp);
546  D3DXVec3TransformCoord(&makeShipUr, &ur, &matrixTemp);
547  D3DXVec3TransformCoord(&makeShipLr, &lr, &matrixTemp);
548 #endif
549 
550  // only works with permaforce crap (cities, Arcridge) not airfield colony, etc that don't use depth/floor
551  /*buildzone[buildzoneOrdinal].ul = D3DXVECTOR3(-1.014f* skewWidth / 2.028f, 1.014f* skewHeight / 2.028f, 0.0f);
552  D3DXVec3TransformCoord(&buildzone[buildzoneOrdinal].ul, &buildzone[buildzoneOrdinal].ul, &buildzone[buildzoneOrdinal].matrixBase);
553  buildzone[buildzoneOrdinal].ul += buildzone[buildzoneOrdinal].terpos;
554  buildzone[buildzoneOrdinal].ur = D3DXVECTOR3(1.014f* skewWidth / 2.028f, 1.014f*skewHeight / 2.028f, 0.0f);
555  D3DXVec3TransformCoord(&buildzone[buildzoneOrdinal].ur, &buildzone[buildzoneOrdinal].ur, &buildzone[buildzoneOrdinal].matrixBase);
556  buildzone[buildzoneOrdinal].ur += buildzone[buildzoneOrdinal].terpos;
557  buildzone[buildzoneOrdinal].ll = D3DXVECTOR3(-1.014f* skewWidth / 2.028f, -1.014f* skewHeight / 2.028f, 0.0f);
558  D3DXVec3TransformCoord(&buildzone[buildzoneOrdinal].ll, &buildzone[buildzoneOrdinal].ll, &buildzone[buildzoneOrdinal].matrixBase);
559  buildzone[buildzoneOrdinal].ll += buildzone[buildzoneOrdinal].terpos;
560  buildzone[buildzoneOrdinal].lr = D3DXVECTOR3(1.014f*skewWidth / 2.028f, -1.014f* skewHeight / 2.028f, 0.0f);
561  D3DXVec3TransformCoord(&buildzone[buildzoneOrdinal].lr, &buildzone[buildzoneOrdinal].lr, &buildzone[buildzoneOrdinal].matrixBase);
562  buildzone[buildzoneOrdinal].lr += buildzone[buildzoneOrdinal].terpos;*/
563 
564 
565  sprintf_s(msg, sizeof(msg), "Building() %i zone %i powered %i", buildzoneOrdinal, gridarray[t][s].zone, gridarray[t][s].powered);
566  logger->Log(msg);
567 
568 
569 #pragma region Lights
570 
571  buildzone[buildzoneOrdinal].effects.clear();
572  if (gridarray[t][s].powered)
573  {
574  short fileEffects;
575  _read(handle, &fileEffects, 2);
576  sprintf_s(msg, sizeof(msg), "Loading up to %i lights for buildingZoneOrdinal %i...", fileEffects, buildzoneOrdinal);
577  logger->Log(msg);
578 
579  for (r = 0; r < static_cast<unsigned int>(fileEffects); r++)
580  {
581  s_light_effect tempEffect;
582  _read(handle, &tempEffect.position, 12);
583  _read(handle, &tempEffect.normal, 12);
584  DWORD diffuse;
585  _read(handle, &diffuse, 4);
586  tempEffect.diffuse = diffuse;
587  _read(handle, &tempEffect.sequencing, 4);
588  _read(handle, &tempEffect.speed, 4); // unused
589  _read(handle, &tempEffect.power, 4);
590  _read(handle, &tempEffect.attachto, 2);
591  tempEffect.primitive = 0;
592 
593  if (gridarray[t][s].zone > 0)
594  {
595  for (int q = 0; q < buildzone[buildzoneOrdinal].components; q++)
596  {
597  if (tempEffect.attachto == buildzone[buildzoneOrdinal].componentarray[q].attachto &&
598  buildzone[buildzoneOrdinal].componentarray[q].nominalxyz.z == 0.0f)
599  {
600  float adjustX = skewWidth / 1.024f * buildzone[buildzoneOrdinal].componentarray[q].nominalxyz.x - buildzone[buildzoneOrdinal].componentarray[q].nominalxyz.x;
601  float adjustY = skewHeight / 1.024f * buildzone[buildzoneOrdinal].componentarray[q].nominalxyz.y - buildzone[buildzoneOrdinal].componentarray[q].nominalxyz.y;
602  tempEffect.position.x += adjustX;
603  tempEffect.position.y += adjustY;
604  break;
605  }
606  }
607  }
608  D3DXVec3TransformCoord(&tempEffect.position, &tempEffect.position, &buildzone[buildzoneOrdinal].matrixBase);
609  tempEffect.position += buildzone[buildzoneOrdinal].terpos;
610  D3DXVec3TransformCoord(&tempEffect.normal, &tempEffect.normal, &matrixTemp);
611 
612  bool connected = true;
613  if (tempEffect.attachto > 0) // runways and cities are excluded by this check
614  {
615  connected = false;
616  for (int c = 0; c < buildzone[buildzoneOrdinal].components; c++)
617  {
618  if (buildzone[buildzoneOrdinal].componentarray[c].attachto == tempEffect.attachto)
619  {
620  connected = true;
621  break;
622  }
623  }
624  }
625  if (connected)
626  buildzone[buildzoneOrdinal].effects.emplace_back(tempEffect);
627  }
628 
629  _close(handle);
630 
631  sprintf_s(msg, sizeof(msg), "Building() %i built TEMPDAX with %i vertices for %i added lights", buildzoneOrdinal, tempvertices, buildzone[sortme[t].buildzone].effects.size());
632  logger->Log(msg);
633 
634 #pragma region REIL (Runway End Identifier Lights)
635  if (gridarray[t][s].type == PlotType::UserAirfield && CheckLayout(99, gridarray[t][s]))
636  {
637  s_light_effect newarray[24];
638  for (r = 0; r < 6; r++)
639  {
640  newarray[r].normal = -northvector;
641  newarray[r].diffuse = D3DCOLOR_ARGB(255, 0, 255, 0);
642  newarray[r].sequencing = 4294967295UL;
643  newarray[r].primitive = 0;
644  newarray[r].power = 1.0f; // bulb
645  newarray[r].attachto = -1;
646  }
647  //0.73857 && Tex.x < 0.76143) // 0.02286
648  D3DXVec3Lerp(&newarray[0].position, &insidearray[t][s + 1][0], &gridarray[t + 1][s + 1].position, (-0.5f + 0.73857f + 0.02286f * 1.0f / 8.0f)*2.0f);
649  D3DXVec3Lerp(&newarray[1].position, &insidearray[t][s + 1][0], &gridarray[t + 1][s + 1].position, (-0.5f + 0.73857f + 0.02286f * 2.0f / 8.0f)*2.0f);
650  D3DXVec3Lerp(&newarray[2].position, &insidearray[t][s + 1][0], &gridarray[t + 1][s + 1].position, (-0.5f + 0.73857f + 0.02286f * 3.0f / 8.0f)*2.0f);
651  D3DXVec3Lerp(&newarray[3].position, &insidearray[t][s + 1][0], &gridarray[t + 1][s + 1].position, (-0.5f + 0.73857f + 0.02286f * 5.0f / 8.0f)*2.0f);
652  D3DXVec3Lerp(&newarray[4].position, &insidearray[t][s + 1][0], &gridarray[t + 1][s + 1].position, (-0.5f + 0.73857f + 0.02286f * 6.0f / 8.0f)*2.0f);
653  D3DXVec3Lerp(&newarray[5].position, &insidearray[t][s + 1][0], &gridarray[t + 1][s + 1].position, (-0.5f + 0.73857f + 0.02286f * 7.0f / 8.0f)*2.0f);
654  for (r = 6; r < 12; r++)
655  {
656  newarray[r].normal = northvector;
657  newarray[r].diffuse = D3DCOLOR_ARGB(255, 255, 0, 0);
658  newarray[r].sequencing = 4294967295UL;
659  newarray[r].primitive = 0;
660  newarray[r].power = 1.0f; // bulb
661  newarray[r].attachto = -1;
662  }
663  //0.73857 && Tex.x < 0.76143) // 0.02286
664  D3DXVec3Lerp(&newarray[6].position, &insidearray[t][s + 1][0], &gridarray[t + 1][s + 1].position, (-0.5f + 0.73857f + 0.02286f * 1.0f / 8.0f)*2.0f);
665  D3DXVec3Lerp(&newarray[7].position, &insidearray[t][s + 1][0], &gridarray[t + 1][s + 1].position, (-0.5f + 0.73857f + 0.02286f * 2.0f / 8.0f)*2.0f);
666  D3DXVec3Lerp(&newarray[8].position, &insidearray[t][s + 1][0], &gridarray[t + 1][s + 1].position, (-0.5f + 0.73857f + 0.02286f * 3.0f / 8.0f)*2.0f);
667  D3DXVec3Lerp(&newarray[9].position, &insidearray[t][s + 1][0], &gridarray[t + 1][s + 1].position, (-0.5f + 0.73857f + 0.02286f * 5.0f / 8.0f)*2.0f);
668  D3DXVec3Lerp(&newarray[10].position, &insidearray[t][s + 1][0], &gridarray[t + 1][s + 1].position, (-0.5f + 0.73857f + 0.02286f * 6.0f / 8.0f)*2.0f);
669  D3DXVec3Lerp(&newarray[11].position, &insidearray[t][s + 1][0], &gridarray[t + 1][s + 1].position, (-0.5f + 0.73857f + 0.02286f * 7.0f / 8.0f)*2.0f);
670  for (r = 12; r < 18; r++)
671  {
672  newarray[r].normal = northvector;
673  newarray[r].diffuse = D3DCOLOR_ARGB(255, 0, 255, 0);
674  newarray[r].sequencing = 4294967295UL;
675  newarray[r].primitive = 0;
676  newarray[r].power = 1.0f; // bulb
677  newarray[r].attachto = -1;
678  }
679  //0.73857 && Tex.x < 0.76143) // 0.02286
680  D3DXVec3Lerp(&newarray[12].position, &insidearray[t][s][0], &gridarray[t + 1][s].position, (-0.5f + 0.73857f + 0.02286f * 1.0f / 8.0f)*2.0f);
681  D3DXVec3Lerp(&newarray[13].position, &insidearray[t][s][0], &gridarray[t + 1][s].position, (-0.5f + 0.73857f + 0.02286f * 2.0f / 8.0f)*2.0f);
682  D3DXVec3Lerp(&newarray[14].position, &insidearray[t][s][0], &gridarray[t + 1][s].position, (-0.5f + 0.73857f + 0.02286f * 3.0f / 8.0f)*2.0f);
683  D3DXVec3Lerp(&newarray[15].position, &insidearray[t][s][0], &gridarray[t + 1][s].position, (-0.5f + 0.73857f + 0.02286f * 5.0f / 8.0f)*2.0f);
684  D3DXVec3Lerp(&newarray[16].position, &insidearray[t][s][0], &gridarray[t + 1][s].position, (-0.5f + 0.73857f + 0.02286f * 6.0f / 8.0f)*2.0f);
685  D3DXVec3Lerp(&newarray[17].position, &insidearray[t][s][0], &gridarray[t + 1][s].position, (-0.5f + 0.73857f + 0.02286f * 7.0f / 8.0f)*2.0f);
686  for (r = 18; r < 24; r++)
687  {
688  newarray[r].normal = -northvector;
689  newarray[r].diffuse = D3DCOLOR_ARGB(255, 255, 0, 0);
690  newarray[r].sequencing = 4294967295UL;
691  newarray[r].primitive = 0;
692  newarray[r].power = 1.0f; // bulb
693  newarray[r].attachto = -1;
694  }
695  //0.73857 && Tex.x < 0.76143) // 0.02286
696  D3DXVec3Lerp(&newarray[18].position, &insidearray[t][s][0], &gridarray[t + 1][s].position, (-0.5f + 0.73857f + 0.02286f * 1.0f / 8.0f)*2.0f);
697  D3DXVec3Lerp(&newarray[19].position, &insidearray[t][s][0], &gridarray[t + 1][s].position, (-0.5f + 0.73857f + 0.02286f * 2.0f / 8.0f)*2.0f);
698  D3DXVec3Lerp(&newarray[20].position, &insidearray[t][s][0], &gridarray[t + 1][s].position, (-0.5f + 0.73857f + 0.02286f * 3.0f / 8.0f)*2.0f);
699  D3DXVec3Lerp(&newarray[21].position, &insidearray[t][s][0], &gridarray[t + 1][s].position, (-0.5f + 0.73857f + 0.02286f * 5.0f / 8.0f)*2.0f);
700  D3DXVec3Lerp(&newarray[22].position, &insidearray[t][s][0], &gridarray[t + 1][s].position, (-0.5f + 0.73857f + 0.02286f * 6.0f / 8.0f)*2.0f);
701  D3DXVec3Lerp(&newarray[23].position, &insidearray[t][s][0], &gridarray[t + 1][s].position, (-0.5f + 0.73857f + 0.02286f * 7.0f / 8.0f)*2.0f);
702 
703  for (r = 0; r < 24; r++)
704  buildzone[buildzoneOrdinal].effects.emplace_back(newarray[r]);
705  }
706 #pragma endregion
707 
708  }
709 
710 #pragma endregion
711 
712 
713  // ZAP+RTS, first go though and find all modules in contact with floor
714  for (unsigned int q = 0; q < buildzone[buildzoneOrdinal].components; q++)
715  {
716  buildzone[buildzoneOrdinal].componentarray[q].nominalCG.x = 0.0f;
717  buildzone[buildzoneOrdinal].componentarray[q].nominalCG.y = 0.0f;
718  buildzone[buildzoneOrdinal].componentarray[q].nominalCG.z = 999.0f;
719  }
720 
721  // This isn't ZAP yet, this just figures out where the x and y coordinates need to be for the skewed/scaled plot
722  if (gridarray[t][s].zone > 0) // not cities, they are permaforce
723  {
724  for (short q = 0; q < buildzone[buildzoneOrdinal].components; q++)
725  {
726  // Is this a ground elevation vertex?
727  if (buildzone[buildzoneOrdinal].componentarray[q].nominalCG.z == 999.0f &&
728  buildzone[buildzoneOrdinal].componentarray[q].nominalxyz.z == 0.0f)
729  {
730  buildzone[buildzoneOrdinal].componentarray[q].nominalCG.x = skewWidth / 1.024f * buildzone[buildzoneOrdinal].componentarray[q].nominalxyz.x - buildzone[buildzoneOrdinal].componentarray[q].nominalxyz.x;
731  buildzone[buildzoneOrdinal].componentarray[q].nominalCG.y = skewHeight / 1.024f * buildzone[buildzoneOrdinal].componentarray[q].nominalxyz.y - buildzone[buildzoneOrdinal].componentarray[q].nominalxyz.y;
732 
733  // go through and set all buildings of this structure (except q) to this value
734  for (r = 0; r < buildzone[buildzoneOrdinal].components; r++)
735  {
736  if (buildzone[buildzoneOrdinal].componentarray[r].attachto == buildzone[buildzoneOrdinal].componentarray[q].attachto && q != r)
737  {
738  buildzone[buildzoneOrdinal].componentarray[r].nominalCG = buildzone[buildzoneOrdinal].componentarray[q].nominalCG;
739  }
740  }
741  }
742  }
743  }
744 
745  sprintf_s(msg, sizeof(msg), "Building() %i ZAP+RTS tempdaw to new buffer...", buildzoneOrdinal);
746  logger->Log(msg);
747 
748  // Now go though the modules, take the part of the tempdaw they use, and make a new buffer
749  unsigned int vertex = 0, i_temp;
750  bool sample = true;
751  D3DVERTEX* vtx;
752 
753  V(buildzone[buildzoneOrdinal].VB->Lock(0, 0, reinterpret_cast<void**>(&vtx), 0));
754  sprintf_s(msg, sizeof(msg), "Building() %i ZAP+RTS locked VB successfully...", buildzoneOrdinal);
755  logger->Log(msg);
756 
757  for (short q = 0; q < buildzone[buildzoneOrdinal].components; q++) // for each module
758  {
759  i_temp = buildzone[buildzoneOrdinal].componentarray[q].startvertex;
760  assert(i_temp < (unsigned)tempvertices);
761  buildzone[buildzoneOrdinal].componentarray[q].startvertex = vertex; // new start vertex
762 
763  D3DXMATRIX matrixConform;
764  if (buildzone[buildzoneOrdinal].componentarray[q].type == 8 || // algae farms
765  buildzone[buildzoneOrdinal].componentarray[q].type == 84) // do not plumb
766  {
767  // find normal to plane, note Y is flipped because that is how it looks in makeship
768  D3DXVECTOR3 ur2 = D3DXVECTOR3(1.014f, 1.014f, -1.0f);
769  D3DXVECTOR3 lr2 = D3DXVECTOR3(1.014f, -1.014f, -1.0f);
770  D3DXVECTOR3 ll2 = D3DXVECTOR3(-1.014f, -1.014f, -1.0f);
771  D3DXVECTOR3 ul2 = D3DXVECTOR3(-1.014f, 1.014f, -1.0f);
772  D3DXVECTOR3 dir = D3DXVECTOR3(0.0f, 0.0f, -1.0f);
773  float uhit, vhit, dist;
774  // Need to determine which side he is on...
775  if (D3DXIntersectTri(&ul2, &ur2, &ll2, &buildzone[buildzoneOrdinal].componentarray[q].nominalxyz, &dir, &uhit, &vhit, &dist))
777  //if (buildzone[buildzoneOrdinal].componentarray[q].nominalxyz.x + buildzone[buildzoneOrdinal].componentarray[q].nominalxyz.y )
778  {
779  //D3DXPLANE plane;
780  //D3DXPlaneFromPoints(&plane, &ul, &ur, &ll);
781  //D3DXPlaneNormalize(&plane, &plane);
782  //result = -D3DXVECTOR3(plane.a, plane.b, plane.c);
783  D3DXVECTOR3 side1 = ul - ur;
784  D3DXVec3Normalize(&side1, &side1);
785  D3DXVECTOR3 side2 = ul - ll;
786  D3DXVec3Normalize(&side2, &side2);
787  D3DXVec3Cross(&result, &side2, &side1);
788  D3DXVec3Normalize(&result, &result);
789 
790  D3DXMatrixLookAtLH(&matrixConform, &centerC, &result, &northvector);
791  D3DXMatrixInverse(&matrixConform, nullptr, &matrixConform);
792  }
793  else if (D3DXIntersectTri(&ur2, &lr2, &ll2, &buildzone[buildzoneOrdinal].componentarray[q].nominalxyz, &dir, &uhit, &vhit, &dist))
794  {
795  //D3DXPLANE plane;
796  //D3DXPlaneFromPoints(&plane, &ur, &lr, &ll);
797  //D3DXPlaneNormalize(&plane, &plane);
798  //result = -D3DXVECTOR3(plane.a, plane.b, plane.c);
799  D3DXVECTOR3 side1 = lr - ur;
800  D3DXVec3Normalize(&side1, &side1);
801  D3DXVECTOR3 side2 = lr - ll;
802  D3DXVec3Normalize(&side2, &side2);
803  D3DXVec3Cross(&result, &side1, &side2);
804  D3DXVec3Normalize(&result, &result);
805 
806  D3DXMatrixLookAtLH(&matrixConform, &centerC, &result, &northvector);
807  D3DXMatrixInverse(&matrixConform, nullptr, &matrixConform);
808  }
809  else
810  {
811  matrixConform = buildzone[buildzoneOrdinal].matrixBase;
812 
813  sprintf_s(msg, sizeof(msg), "%i CROP %i was %f %f %f NO HIT!", buildzoneOrdinal, q, buildzone[buildzoneOrdinal].componentarray[q].nominalxyz.x, buildzone[buildzoneOrdinal].componentarray[q].nominalxyz.y, buildzone[buildzoneOrdinal].componentarray[q].nominalxyz.z);
814  logger->Log(msg, Logger::Level::Warn);
815  }
816  }
817  else
818  {
819  matrixConform = buildzone[buildzoneOrdinal].matrixBase;
820  }
821 
822 
823  // Go through all vertices individually and make adjustments first ----------------------
824  if (gridarray[t][s].zone > 0 && gridarray[t][s].type != PlotType::UserAirfield) // conform to ground
825  {
826  if (buildzone[buildzoneOrdinal].componentarray[q].nominalCG.z > 99.0f) // not set
827  {
828  D3DXMatrixRotationZ(&matrixRotation, buildzone[buildzoneOrdinal].componentarray[q].nominalypr.z);
829  D3DXMatrixTranslation(&matrixTemp,
830  buildzone[buildzoneOrdinal].componentarray[q].nominalxyz.x + buildzone[buildzoneOrdinal].componentarray[q].nominalCG.x,
831  buildzone[buildzoneOrdinal].componentarray[q].nominalxyz.y + buildzone[buildzoneOrdinal].componentarray[q].nominalCG.y,
832  buildzone[buildzoneOrdinal].componentarray[q].nominalxyz.z);
833  D3DXMatrixMultiply(&matrixWorld, &matrixTemp, &matrixConform);
834 
835  if (buildzone[buildzoneOrdinal].componentarray[q].type == 8 || // algae farms
836  buildzone[buildzoneOrdinal].componentarray[q].type == 84) // do not plumb
837  {
838  if (buildzone[buildzoneOrdinal].componentarray[q].nominalxyz.z == 0.0f)
839  {
840  tempnormal.x = 0;
841  tempnormal.y = 0;
842  tempnormal.z = 0;
843 
844  D3DXVec3TransformCoord(&tempnormal, &tempnormal, &matrixRotation);
845  D3DXVec3TransformCoord(&tempnormal, &tempnormal, &matrixWorld);
846  tempnormal = -tempnormal;
847  tempnormal -= buildzone[buildzoneOrdinal].terpos;
848  tempnormal = -tempnormal;
849  D3DXVECTOR3 normalizedTempNormal;
850  D3DXVec3Normalize(&normalizedTempNormal, &tempnormal);
851 
852  // find the AGL altitude of this point, these ul ur lr are for the zones and map to grid ul, innerarray 0-2, etc
853  float pu, pv, dist;
854  if (D3DXIntersectTri(&ul, &ur, &ll, &centerC, &normalizedTempNormal, &pu, &pv, &dist))
855  {
856  dist -= D3DXVec3Length(&tempnormal); // 8/17/2019 I switched to this because it looks like that is what we do elsewhere
857  }
858  else if (D3DXIntersectTri(&ur, &lr, &ll, &centerC, &normalizedTempNormal, &pu, &pv, &dist))
859  {
860  dist -= D3DXVec3Length(&tempnormal); // 8/17/2019 I switched to this because it looks like that is what we do elsewhere
861  }
862  else
863  {
864  // problem, dump 4 corners and this guys position
865  sprintf_s(msg, sizeof(msg), "%+.3f ,%+.3f ,%+.3f ,", tempnormal.x, tempnormal.y, tempnormal.z);
866  logger->Log(msg, Logger::Level::Warn);
867  sprintf_s(msg, sizeof(msg), "%+.3f ,%+.3f ,%+.3f ,", gridarray[t][s].position.x, gridarray[t][s].position.y, gridarray[t][s].position.z);
868  logger->Log(msg, Logger::Level::Warn);
869  sprintf_s(msg, sizeof(msg), "%+.3f ,%+.3f ,%+.3f ,", gridarray[t + 1][s].position.x, gridarray[t + 1][s].position.y, gridarray[t + 1][s].position.z);
870  logger->Log(msg, Logger::Level::Warn);
871  sprintf_s(msg, sizeof(msg), "%+.3f ,%+.3f ,%+.3f ,", gridarray[t + 1][s + 1].position.x, gridarray[t + 1][s + 1].position.y, gridarray[t + 1][s + 1].position.z);
872  logger->Log(msg, Logger::Level::Warn);
873  sprintf_s(msg, sizeof(msg), "%+.3f ,%+.3f ,%+.3f ,", gridarray[t][s + 1].position.x, gridarray[t][s + 1].position.y, gridarray[t][s + 1].position.z);
874  logger->Log(msg, Logger::Level::Warn);
875  sprintf_s(msg, sizeof(msg), "%+.3f ,%+.3f ,%+.3f ,", centerC.x, centerC.y, centerC.z);
876  logger->Log(msg, Logger::Level::Warn);
877  dist = 0.01f;
878  }
879 
880  buildzone[buildzoneOrdinal].componentarray[q].nominalCG.z = dist;// +0.0004f; // 16 inches
881  }
882  }
883  else
884  {
885  float fabsbias = -999.0f;
886  for (r = 0; r < buildzone[buildzoneOrdinal].componentarray[q].primitives * 3; r++)
887  {
888  // Is this is a ground elevation vertex?
889  if (buildzone[buildzoneOrdinal].componentarray[q].nominalxyz.z == 0.0f && tempdax[i_temp + r].z == 0.0f)
890  {
891  tempnormal.x = tempdax[i_temp + r].x;
892  tempnormal.y = tempdax[i_temp + r].y;
893  tempnormal.z = 0;
894 
895  D3DXVec3TransformCoord(&tempnormal, &tempnormal, &matrixRotation);
896  D3DXVec3TransformCoord(&tempnormal, &tempnormal, &matrixWorld);
897  tempnormal = -tempnormal;
898  tempnormal -= buildzone[buildzoneOrdinal].terpos;
899  tempnormal = -tempnormal;
900  D3DXVECTOR3 normalizedTempNormal;
901  D3DXVec3Normalize(&normalizedTempNormal, &tempnormal);
902 
903  // find the AGL altitude of this point, these ul ur lr are for the zones and map to grid ul, innerarray 0-2, etc
904  float pu, pv, dist;
905  if (D3DXIntersectTri(&ul, &ur, &ll, &centerC, &normalizedTempNormal, &pu, &pv, &dist))
906  {
907 
908  }
909  else if (D3DXIntersectTri(&ur, &lr, &ll, &centerC, &normalizedTempNormal, &pu, &pv, &dist))
910  {
911 
912  }
913  else
914  {
915  // problem, dump 4 corners and this guys position
916  sprintf_s(msg, sizeof(msg), "%+.3f ,%+.3f ,%+.3f ,", tempnormal.x, tempnormal.y, tempnormal.z);
917  logger->Log(msg, Logger::Level::Warn);
918  sprintf_s(msg, sizeof(msg), "%+.3f ,%+.3f ,%+.3f ,", gridarray[t][s].position.x, gridarray[t][s].position.y, gridarray[t][s].position.z);
919  logger->Log(msg, Logger::Level::Warn);
920  sprintf_s(msg, sizeof(msg), "%+.3f ,%+.3f ,%+.3f ,", gridarray[t + 1][s].position.x, gridarray[t + 1][s].position.y, gridarray[t + 1][s].position.z);
921  logger->Log(msg, Logger::Level::Warn);
922  sprintf_s(msg, sizeof(msg), "%+.3f ,%+.3f ,%+.3f ,", gridarray[t + 1][s + 1].position.x, gridarray[t + 1][s + 1].position.y, gridarray[t + 1][s + 1].position.z);
923  logger->Log(msg, Logger::Level::Warn);
924  sprintf_s(msg, sizeof(msg), "%+.3f ,%+.3f ,%+.3f ,", gridarray[t][s + 1].position.x, gridarray[t][s + 1].position.y, gridarray[t][s + 1].position.z);
925  logger->Log(msg, Logger::Level::Warn);
926  sprintf_s(msg, sizeof(msg), "%+.3f ,%+.3f ,%+.3f ,", centerC.x, centerC.y, centerC.z);
927  logger->Log(msg, Logger::Level::Warn);
928  }
929 
930  //f_temp -= D3DXVec3Length(&tempnormal); // 8/17/2019 I switched to this because it looks like that is what we do elsewhere
931  dist -= D3DXVec3Length(&buildzone[buildzoneOrdinal].terpos);
932 
933  // take the highest AGL altitude point and raise/lower to ground level
934  if (dist > fabsbias)
935  {
936  buildzone[buildzoneOrdinal].componentarray[q].nominalCG.z = dist + 0.0004f; // 8 inches exposure of concrete
937  fabsbias = dist;
938  }
939  }
940  }
941  }
942 
943  for (r = 0; r < buildzone[buildzoneOrdinal].components; r++)
944  {
945  if (buildzone[buildzoneOrdinal].componentarray[r].attachto == buildzone[buildzoneOrdinal].componentarray[q].attachto && q != r)
946  {
947  buildzone[buildzoneOrdinal].componentarray[r].nominalCG.z = buildzone[buildzoneOrdinal].componentarray[q].nominalCG.z;
948  }
949  }
950  }
951  if (buildzone[buildzoneOrdinal].componentarray[q].nominalCG.z > 99.0f)
952  {
953  sprintf_s(msg, sizeof(msg), "Building() %i component %i type %i (%i) ZAP bias STILL NOT SET %f", buildzoneOrdinal, q, buildzone[buildzoneOrdinal].componentarray[q].type, buildzone[buildzoneOrdinal].type, buildzone[buildzoneOrdinal].componentarray[q].nominalCG.z);
954  logger->Log(msg, Logger::Error);
955  }
956 
957  if (sample)
958  {
959  sprintf_s(msg, sizeof(msg), "Building() %i example of ZAP bias %f", buildzoneOrdinal, buildzone[buildzoneOrdinal].componentarray[q].nominalCG.z);
960  logger->Log(msg);
961  sample = false;
962  }
963  }
964  else
965  buildzone[buildzoneOrdinal].componentarray[q].nominalCG.z = 0.0f; // city floors and airfield
966 
967 
968 
969  assert(i_temp < static_cast<unsigned>(tempvertices));
970 
971  D3DXMatrixRotationZ(&matrixRotation, buildzone[buildzoneOrdinal].componentarray[q].nominalypr.z);
972  D3DXMatrixTranslation(&matrixTemp,
973  buildzone[buildzoneOrdinal].componentarray[q].nominalxyz.x + buildzone[buildzoneOrdinal].componentarray[q].nominalCG.x,
974  buildzone[buildzoneOrdinal].componentarray[q].nominalxyz.y + buildzone[buildzoneOrdinal].componentarray[q].nominalCG.y,
975  buildzone[buildzoneOrdinal].componentarray[q].nominalxyz.z + buildzone[buildzoneOrdinal].componentarray[q].nominalCG.z); // -bias pulls into ground
976  D3DXMatrixMultiply(&matrixWorld, &matrixTemp, &matrixConform);
977  D3DXMATRIX invMatrixRotation;
978  D3DXMatrixInverse(&invMatrixRotation, nullptr, &matrixRotation);
979  // Go through all vertices individually and make new vertex buffer ----------------------
980  for (r = 0; r < buildzone[buildzoneOrdinal].componentarray[q].primitives * 3; r++) // vertices
981  {
982  tempnormal.x = tempdax[i_temp].x;
983  tempnormal.y = tempdax[i_temp].y;
984  tempnormal.z = tempdax[i_temp].z;
985  D3DXVec3TransformCoord(&tempnormal, &tempnormal, &matrixRotation);
986  D3DXVec3TransformCoord(&tempnormal, &tempnormal, &matrixWorld);
987  (*vtx).x = tempnormal.x; (*vtx).y = tempnormal.y; (*vtx).z = tempnormal.z;
988 
989  tempnormal.x = tempdax[i_temp].nx;
990  tempnormal.y = tempdax[i_temp].ny;
991  tempnormal.z = tempdax[i_temp].nz;
992  D3DXVec3TransformNormal(&tempnormal, &tempnormal, &invMatrixRotation);
993  (*vtx).nx = tempnormal.x; (*vtx).ny = tempnormal.y; (*vtx).nz = tempnormal.z;
994 
995  (*vtx).tu = tempdax[i_temp].tu; (*vtx).tv = tempdax[i_temp].tv;
996  vtx++; vertex++; i_temp++;
997  }
998  }
999 
1000  V(buildzone[buildzoneOrdinal].VB->Unlock());
1001  sprintf_s(msg, sizeof(msg), "Building() %i filled %i/%i vertices for \"%s\"", buildzoneOrdinal, vertex, vertices, file);
1002  logger->Log(msg);
1003 
1004  buildzone[buildzoneOrdinal].rtscomponents = 0; // keep everyone else from rendering an RTS grid
1005 
1006 #pragma region RTS Grid (drawn after the buildings)
1007  if (gridarray[t][s].UsesRts())
1008  {
1009  ul = gridarray[t][s].position;
1010  ll = gridarray[t][s + 1].position;
1011  ur = gridarray[t + 1][s].position;
1012  lr = gridarray[t + 1][s + 1].position;
1013 
1014  i_temp = 0;
1015  D3DVERTEX2* vtx2;
1016  V(buildzone[buildzoneOrdinal].RTSVB->Lock(0, 0, reinterpret_cast<void**>(&vtx2), 0));
1017  vertex = 0;
1018  for (r = 0; r < RTStextureC; r++)
1019  {
1020  buildzone[buildzoneOrdinal].rtscomponentarray[buildzone[buildzoneOrdinal].rtscomponents].primitives = 0;
1021  buildzone[buildzoneOrdinal].rtscomponentarray[buildzone[buildzoneOrdinal].rtscomponents].texture = r;
1022  buildzone[buildzoneOrdinal].rtscomponentarray[buildzone[buildzoneOrdinal].rtscomponents].startvertex = vertex;
1023 
1024  // for each type, go through and see if we have one of them
1025  for (t = 0; t < 26; t++)
1026  {
1027  for (s = 0; s < 26; s++)
1028  {
1029  if (buildzone[buildzoneOrdinal].rts[t * 26 + s].texture == r)
1030  {
1031  buildzone[buildzoneOrdinal].rtscomponentarray[buildzone[buildzoneOrdinal].rtscomponents].primitives += 2;
1032 
1033  // polygon 1/2
1034  D3DXVec3Lerp(&leftpt, &ll, &ul, static_cast<float>(s + 1) / 26.0f);
1035  D3DXVec3Lerp(&rightpt, &lr, &ur, static_cast<float>(s + 1) / 26.0f); // lower
1036  D3DXVec3Lerp(&result, &leftpt, &rightpt, static_cast<float>(t) / 26.0f); // left
1037  result -= buildzone[buildzoneOrdinal].terpos;
1038 
1039  (*vtx2).x = result.x; (*vtx2).y = result.y; (*vtx2).z = result.z; // lr
1040  (*vtx2).nx = -buildzone[buildzoneOrdinal].terpos.x;
1041  (*vtx2).ny = -buildzone[buildzoneOrdinal].terpos.y;
1042  (*vtx2).nz = -buildzone[buildzoneOrdinal].terpos.z;
1043 
1044  if (buildzone[buildzoneOrdinal].rts[t * 26 + s].rotation == 0 || buildzone[buildzoneOrdinal].rts[t * 26 + s].rotation == 4)
1045  {
1046  (*vtx2).tu = 1.0f; (*vtx2).tv = 1.0f;
1047  }
1048  else if (buildzone[buildzoneOrdinal].rts[t * 26 + s].rotation == 3 || buildzone[buildzoneOrdinal].rts[t * 26 + s].rotation == 7)
1049  {
1050  (*vtx2).tu = 0.0f; (*vtx2).tv = 1.0f;
1051  }
1052  else if (buildzone[buildzoneOrdinal].rts[t * 26 + s].rotation == 2 || buildzone[buildzoneOrdinal].rts[t * 26 + s].rotation == 6)
1053  {
1054  (*vtx2).tu = 0.0f; (*vtx2).tv = 0.0f;
1055  }
1056  else if (buildzone[buildzoneOrdinal].rts[t * 26 + s].rotation == 1 || buildzone[buildzoneOrdinal].rts[t * 26 + s].rotation == 5)
1057  {
1058  (*vtx2).tu = 1.0f; (*vtx2).tv = 0.0f;
1059  }
1060  if (buildzone[buildzoneOrdinal].rts[t * 26 + s].rotation > 3)
1061  (*vtx2).tu = 1.0f - (*vtx2).tu;
1062  (*vtx2).tu2 = static_cast<float>(t) / 26.0f; (*vtx2).tv2 = static_cast<float>(s + 1) / 26.0f;
1063  vtx2++; vertex++;
1064 
1065  // Second
1066  D3DXVec3Lerp(&leftpt, &ll, &ul, static_cast<float>(s) / 26.0f);
1067  D3DXVec3Lerp(&rightpt, &lr, &ur, static_cast<float>(s) / 26.0f); // upper
1068  D3DXVec3Lerp(&result, &leftpt, &rightpt, static_cast<float>(t + 1) / 26.0f); // right
1069  result -= buildzone[buildzoneOrdinal].terpos;
1070 
1071  (*vtx2).x = result.x; (*vtx2).y = result.y; (*vtx2).z = result.z; // ul
1072  (*vtx2).nx = -buildzone[buildzoneOrdinal].terpos.x;
1073  (*vtx2).ny = -buildzone[buildzoneOrdinal].terpos.y;
1074  (*vtx2).nz = -buildzone[buildzoneOrdinal].terpos.z;
1075 
1076  if (buildzone[buildzoneOrdinal].rts[t * 26 + s].rotation == 2 || buildzone[buildzoneOrdinal].rts[t * 26 + s].rotation == 6)
1077  {
1078  (*vtx2).tu = 1.0f; (*vtx2).tv = 1.0f;
1079  }
1080  else if (buildzone[buildzoneOrdinal].rts[t * 26 + s].rotation == 1 || buildzone[buildzoneOrdinal].rts[t * 26 + s].rotation == 5)
1081  {
1082  (*vtx2).tu = 0.0f; (*vtx2).tv = 1.0f;
1083  }
1084  else if (buildzone[buildzoneOrdinal].rts[t * 26 + s].rotation == 0 || buildzone[buildzoneOrdinal].rts[t * 26 + s].rotation == 4)
1085  {
1086  (*vtx2).tu = 0.0f; (*vtx2).tv = 0.0f;
1087  }
1088  else if (buildzone[buildzoneOrdinal].rts[t * 26 + s].rotation == 3 || buildzone[buildzoneOrdinal].rts[t * 26 + s].rotation == 7)
1089  {
1090  (*vtx2).tu = 1.0f; (*vtx2).tv = 0.0f;
1091  }
1092  if (buildzone[buildzoneOrdinal].rts[t * 26 + s].rotation > 3)
1093  (*vtx2).tu = 1.0f - (*vtx2).tu;
1094  (*vtx2).tu2 = static_cast<float>(t + 1) / 26.0f; (*vtx2).tv2 = static_cast<float>(s) / 26.0f;
1095  vtx2++; vertex++;
1096 
1097  // Third side
1098  D3DXVec3Lerp(&leftpt, &ll, &ul, static_cast<float>(s + 1) / 26.0f);
1099  D3DXVec3Lerp(&rightpt, &lr, &ur, static_cast<float>(s + 1) / 26.0f); // lower
1100  D3DXVec3Lerp(&result, &leftpt, &rightpt, static_cast<float>(t + 1) / 26.0f); // right
1101  result -= buildzone[buildzoneOrdinal].terpos;
1102 
1103  (*vtx2).x = result.x; (*vtx2).y = result.y; (*vtx2).z = result.z; // ll
1104  (*vtx2).nx = -buildzone[buildzoneOrdinal].terpos.x;
1105  (*vtx2).ny = -buildzone[buildzoneOrdinal].terpos.y;
1106  (*vtx2).nz = -buildzone[buildzoneOrdinal].terpos.z;
1107 
1108  if (buildzone[buildzoneOrdinal].rts[t * 26 + s].rotation == 3 || buildzone[buildzoneOrdinal].rts[t * 26 + s].rotation == 7)
1109  {
1110  (*vtx2).tu = 0.0f; (*vtx2).tv = 0.0f;
1111  }
1112  else if (buildzone[buildzoneOrdinal].rts[t * 26 + s].rotation == 2 || buildzone[buildzoneOrdinal].rts[t * 26 + s].rotation == 6)
1113  {
1114  (*vtx2).tu = 1.0f; (*vtx2).tv = 0.0f;
1115  }
1116  else if (buildzone[buildzoneOrdinal].rts[t * 26 + s].rotation == 1 || buildzone[buildzoneOrdinal].rts[t * 26 + s].rotation == 5)
1117  {
1118  (*vtx2).tu = 1.0f; (*vtx2).tv = 1.0f;
1119  }
1120  else if (buildzone[buildzoneOrdinal].rts[t * 26 + s].rotation == 0 || buildzone[buildzoneOrdinal].rts[t * 26 + s].rotation == 4)
1121  {
1122  (*vtx2).tu = 0.0f; (*vtx2).tv = 1.0f;
1123  }
1124  if (buildzone[buildzoneOrdinal].rts[t * 26 + s].rotation > 3)
1125  (*vtx2).tu = 1.0f - (*vtx2).tu;
1126  (*vtx2).tu2 = static_cast<float>(t + 1) / 26.0f; (*vtx2).tv2 = static_cast<float>(s + 1) / 26.0f;
1127  vtx2++; vertex++;
1128 
1129  // polygon 2/2
1130  D3DXVec3Lerp(&leftpt, &ll, &ul, static_cast<float>(s + 1) / 26.0f);
1131  D3DXVec3Lerp(&rightpt, &lr, &ur, static_cast<float>(s + 1) / 26.0f); // lower
1132  D3DXVec3Lerp(&result, &leftpt, &rightpt, static_cast<float>(t) / 26.0f); // left
1133  result -= buildzone[buildzoneOrdinal].terpos;
1134 
1135  (*vtx2).x = result.x; (*vtx2).y = result.y; (*vtx2).z = result.z; // lr
1136  (*vtx2).nx = -buildzone[buildzoneOrdinal].terpos.x;
1137  (*vtx2).ny = -buildzone[buildzoneOrdinal].terpos.y;
1138  (*vtx2).nz = -buildzone[buildzoneOrdinal].terpos.z;
1139 
1140  if (buildzone[buildzoneOrdinal].rts[t * 26 + s].rotation == 0 || buildzone[buildzoneOrdinal].rts[t * 26 + s].rotation == 4)
1141  {
1142  (*vtx2).tu = 1.0f; (*vtx2).tv = 1.0f;
1143  }
1144  else if (buildzone[buildzoneOrdinal].rts[t * 26 + s].rotation == 1 || buildzone[buildzoneOrdinal].rts[t * 26 + s].rotation == 5)
1145  {
1146  (*vtx2).tu = 1.0f; (*vtx2).tv = 0.0f;
1147  }
1148  else if (buildzone[buildzoneOrdinal].rts[t * 26 + s].rotation == 2 || buildzone[buildzoneOrdinal].rts[t * 26 + s].rotation == 6)
1149  {
1150  (*vtx2).tu = 0.0f; (*vtx2).tv = 0.0f;
1151  }
1152  else if (buildzone[buildzoneOrdinal].rts[t * 26 + s].rotation == 3 || buildzone[buildzoneOrdinal].rts[t * 26 + s].rotation == 7)
1153  {
1154  (*vtx2).tu = 0.0f; (*vtx2).tv = 1.0f;
1155  }
1156  if (buildzone[buildzoneOrdinal].rts[t * 26 + s].rotation > 3)
1157  (*vtx2).tu = 1.0f - (*vtx2).tu;
1158  (*vtx2).tu2 = static_cast<float>(t) / 26.0f; (*vtx2).tv2 = static_cast<float>(s + 1) / 26.0f;
1159  vtx2++; vertex++;
1160 
1161  // Second side
1162  D3DXVec3Lerp(&leftpt, &ll, &ul, static_cast<float>(s) / 26.0f);
1163  D3DXVec3Lerp(&rightpt, &lr, &ur, static_cast<float>(s) / 26.0f); // upper
1164  D3DXVec3Lerp(&result, &leftpt, &rightpt, static_cast<float>(t) / 26.0f); // left
1165  result -= buildzone[buildzoneOrdinal].terpos;
1166 
1167  (*vtx2).x = result.x; (*vtx2).y = result.y; (*vtx2).z = result.z; // ur
1168  (*vtx2).nx = -buildzone[buildzoneOrdinal].terpos.x;
1169  (*vtx2).ny = -buildzone[buildzoneOrdinal].terpos.y;
1170  (*vtx2).nz = -buildzone[buildzoneOrdinal].terpos.z;
1171 
1172  if (buildzone[buildzoneOrdinal].rts[t * 26 + s].rotation == 3 || buildzone[buildzoneOrdinal].rts[t * 26 + s].rotation == 7)
1173  {
1174  (*vtx2).tu = 1.0f; (*vtx2).tv = 1.0f;
1175  }
1176  else if (buildzone[buildzoneOrdinal].rts[t * 26 + s].rotation == 0 || buildzone[buildzoneOrdinal].rts[t * 26 + s].rotation == 4)
1177  {
1178  (*vtx2).tu = 1.0f; (*vtx2).tv = 0.0f;
1179  }
1180  else if (buildzone[buildzoneOrdinal].rts[t * 26 + s].rotation == 1 || buildzone[buildzoneOrdinal].rts[t * 26 + s].rotation == 5)
1181  {
1182  (*vtx2).tu = 0.0f; (*vtx2).tv = 0.0f;
1183  }
1184  else if (buildzone[buildzoneOrdinal].rts[t * 26 + s].rotation == 2 || buildzone[buildzoneOrdinal].rts[t * 26 + s].rotation == 6)
1185  {
1186  (*vtx2).tu = 0.0f; (*vtx2).tv = 1.0f;
1187  }
1188  if (buildzone[buildzoneOrdinal].rts[t * 26 + s].rotation > 3)
1189  (*vtx2).tu = 1.0f - (*vtx2).tu;
1190  (*vtx2).tu2 = static_cast<float>(t) / 26.0f; (*vtx2).tv2 = static_cast<float>(s) / 26.0f;
1191  vtx2++; vertex++;
1192 
1193  // Third side
1194  D3DXVec3Lerp(&leftpt, &ll, &ul, static_cast<float>(s) / 26.0f);
1195  D3DXVec3Lerp(&rightpt, &lr, &ur, static_cast<float>(s) / 26.0f); // upper
1196  D3DXVec3Lerp(&result, &leftpt, &rightpt, static_cast<float>(t + 1) / 26.0f); // right
1197  result -= buildzone[buildzoneOrdinal].terpos;
1198 
1199  (*vtx2).x = result.x; (*vtx2).y = result.y; (*vtx2).z = result.z; // ul
1200  (*vtx2).nx = -buildzone[buildzoneOrdinal].terpos.x;
1201  (*vtx2).ny = -buildzone[buildzoneOrdinal].terpos.y;
1202  (*vtx2).nz = -buildzone[buildzoneOrdinal].terpos.z;
1203 
1204  if (buildzone[buildzoneOrdinal].rts[t * 26 + s].rotation == 2 || buildzone[buildzoneOrdinal].rts[t * 26 + s].rotation == 6)
1205  {
1206  (*vtx2).tu = 1.0f; (*vtx2).tv = 1.0f;
1207  }
1208  else if (buildzone[buildzoneOrdinal].rts[t * 26 + s].rotation == 3 || buildzone[buildzoneOrdinal].rts[t * 26 + s].rotation == 7)
1209  {
1210  (*vtx2).tu = 1.0f; (*vtx2).tv = 0.0f;
1211  }
1212  else if (buildzone[buildzoneOrdinal].rts[t * 26 + s].rotation == 0 || buildzone[buildzoneOrdinal].rts[t * 26 + s].rotation == 4)
1213  {
1214  (*vtx2).tu = 0.0f; (*vtx2).tv = 0.0f;
1215  }
1216  else if (buildzone[buildzoneOrdinal].rts[t * 26 + s].rotation == 1 || buildzone[buildzoneOrdinal].rts[t * 26 + s].rotation == 5)
1217  {
1218  (*vtx2).tu = 0.0f; (*vtx2).tv = 1.0f;
1219  }
1220  if (buildzone[buildzoneOrdinal].rts[t * 26 + s].rotation > 3)
1221  (*vtx2).tu = 1.0f - (*vtx2).tu;
1222  (*vtx2).tu2 = static_cast<float>(t + 1) / 26.0f; (*vtx2).tv2 = static_cast<float>(s) / 26.0f;
1223  vtx2++; vertex++;
1224  }
1225  }
1226  }
1227  if (buildzone[buildzoneOrdinal].rtscomponentarray[buildzone[buildzoneOrdinal].rtscomponents].primitives > 0) // had at least one)
1228  {
1229  i_temp += buildzone[buildzoneOrdinal].rtscomponentarray[buildzone[buildzoneOrdinal].rtscomponents].primitives;
1230  buildzone[buildzoneOrdinal].rtscomponents++;
1231  }
1232  }
1233 
1234  V(buildzone[buildzoneOrdinal].RTSVB->Unlock());
1235  sprintf_s(msg, sizeof(msg), "Building() %i filled %i RTS primitives for \"%s\"", buildzoneOrdinal, i_temp, file);
1236  logger->Log(msg);
1237  }
1238 #pragma endregion
1239 
1240  return S_OK;
1241 }
D3DXVECTOR3 position
Definition: globals.h:354
Ssorter sortme[buildingVBC]
Definition: globals.cpp:166
s_mesh_component * rtscomponentarray
Definition: globals.h:458
VECTOR2SHORT tcp
Definition: grid.h:34
unsigned char primitive
Definition: globals.h:353
float y
Definition: globals.h:208
float tv
Definition: globals.h:208
unsigned short rtscomponents
Definition: globals.h:456
#define citytextureC
Definition: globals.h:42
GameClass * gameclass
Definition: Viewscreen.h:292
D3DXVECTOR3 terpos
Definition: globals.h:449
D3DXVECTOR3 position
Definition: globals.h:280
short v
Definition: globals.h:451
float tu
Definition: globals.h:208
#define D3DFVF_VERTEX2
Definition: globals.h:102
D3DXMATRIX matrixBase
Definition: globals.h:450
std::vector< s_light_effect > effects
Definition: globals.h:447
float extended
Definition: globals.h:427
D3DXVECTOR3 nominalCG
Definition: globals.h:419
PlotType type
Definition: globals.h:282
unsigned long sequencing
Definition: globals.h:356
RTSGRID * rts
Definition: globals.h:459
buildings(Viewscreen *ptr)
Definition: buildings.cpp:8
Logger * logger
Definition: buildings.h:20
float nx
Definition: globals.h:208
Definition: grid.h:12
VECTOR2SHORT rts
Definition: globals.cpp:140
s_mesh_component * componentarray
Definition: globals.h:457
D3DXCOLOR diffuse
Definition: globals.h:355
short attachto
Definition: globals.h:358
float x
Definition: globals.h:208
D3DXVECTOR3 nominalxyz
Definition: globals.h:416
BUILDZONE buildzone[buildingVBC]
Definition: globals.cpp:165
short attachto
Definition: globals.h:407
const D3DXVECTOR3 centerC
D3DXVECTOR3 insidearray[63][63][3]
Definition: globals.cpp:154
float nz
Definition: globals.h:208
#define RTStextureC
Definition: globals.h:43
short buildzoneOrdinal
Definition: globals.h:292
float z
Definition: globals.h:208
void Log(const char *msg, Level level=Info, int errorCode=0)
Definition: Logger.cpp:11
grid * ptrGrid
Definition: Viewscreen.h:279
PlotType type
Definition: globals.h:452
#define buildingVBC
Definition: globals.h:54
float emissive
Definition: globals.h:453
Viewscreen * viewscreen
Definition: buildings.h:19
UINT startvertex
Definition: globals.h:408
HRESULT Building(short t, short s) const
Definition: buildings.cpp:33
float power
Definition: globals.h:357
float speed
Definition: globals.h:357
void AddTrackedResource(const char *name, _D3DPOOL pool=D3DPOOL_MANAGED)
Definition: GameClass.cpp:2702
float ny
Definition: globals.h:208
LOCALGRID2 gridarray[64][64]
Definition: globals.cpp:153
#define D3DFVF_VERTEX
Definition: globals.h:101
static bool CheckLayout(unsigned i, LOCALGRID2 localgrid2)
Definition: buildings.cpp:16
unsigned short components
Definition: globals.h:456
void UpdateTrackedResource(const char *name, int status)
Definition: GameClass.cpp:2725
D3DXVECTOR3 normal
Definition: globals.h:354
Logger * logger
Definition: Viewscreen.h:293
short u
Definition: globals.h:451