18 if (
grid.type == PlotType::UserTownship)
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;
35 short buildzoneOrdinal = -1;
44 buildzoneOrdinal =
static_cast<short>(r);
48 if (buildzoneOrdinal == -1)
50 logger->
Log(
"Building() failed to find an open VB slot!", Logger::Level::Warn);
54 sprintf_s(msg,
sizeof(msg),
"Building() will be using slot %i...", buildzoneOrdinal);
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);
72 sprintf_s(file,
sizeof(file),
"meshes\\deois-financial.dix");
76 sprintf_s(file,
sizeof(file),
"meshes\\house1.dix");
79 case PlotType::UserMining:
80 sprintf_s(file,
sizeof(file),
"meshes\\mining1.dix");
84 sprintf_s(file,
sizeof(file),
"meshes\\Deois-industrial.dix");
88 sprintf_s(file,
sizeof(file),
"meshes\\Deois-city center.dix");
92 sprintf_s(file,
sizeof(file),
"meshes\\Deois-transit district.dix");
107 case PlotType::UserFarming:
108 sprintf_s(file,
sizeof(file),
"meshes\\farm1.dix");
111 case PlotType::UserTownship:
112 sprintf_s(file,
sizeof(file),
"meshes\\town1.dix");
116 sprintf_s(file,
sizeof(file),
"meshes\\sea-arcridge.dix");
120 sprintf_s(file,
sizeof(file),
"meshes\\Deois-port.dix");
123 case PlotType::UserAirfield:
124 sprintf_s(file,
sizeof(file),
"meshes\\airfield.dix");
132 sprintf_s(file,
sizeof(file),
"meshes\\O-4 ruin 1-1.dix");
136 sprintf_s(file,
sizeof(file),
"meshes\\O-4 ruin 1-2.dix");
140 sprintf_s(file,
sizeof(file),
"meshes\\O-4 ruin 1-3.dix");
144 sprintf_s(file,
sizeof(file),
"meshes\\O-4 ruin 1-4.dix");
148 sprintf_s(msg,
sizeof(msg),
"Building() %i DIX could not match a type %i!", buildzoneOrdinal,
buildzone[buildzoneOrdinal].type);
153 _sopen_s(&handle, file, _O_RDONLY | _O_BINARY | _O_SEQUENTIAL, _SH_DENYWR, _S_IWRITE);
156 sprintf_s(msg,
sizeof(msg),
"Building() %i failed to load \"%s\"!", buildzoneOrdinal, file);
158 return DXUTERR_MEDIANOTFOUND;
161 unsigned short filecomponents;
162 _lseek(handle, 0, SEEK_SET);
163 _read(handle, &filecomponents, 2);
174 for (r = 0; r < filecomponents; r++)
182 sprintf_s(msg,
sizeof(msg),
"buildzone[%i].componentarray", buildzoneOrdinal);
183 if (
buildzone[buildzoneOrdinal].componentarray)
185 SAFE_DELETE(
buildzone[buildzoneOrdinal].componentarray);
189 if (
buildzone[buildzoneOrdinal].componentarray ==
nullptr)
191 sprintf_s(msg,
sizeof(msg),
"Building() %i could not create component array for \"%s\"", buildzoneOrdinal, file);
193 return E_OUTOFMEMORY;
198 sprintf_s(msg,
sizeof(msg),
"Building() %i loading %i of %i components for \"%s\"", buildzoneOrdinal,
buildzone[buildzoneOrdinal].components, filecomponents, file);
203 for (r = 0; r < filecomponents; r++)
214 _lseek(handle, static_cast<long>(r) * 100L + 99L, SEEK_SET);
215 _read(handle, &i_temp, 2);
217 _read(handle, &i_temp, 2);
219 _read(handle, &
buildzone[buildzoneOrdinal].componentarray[tempr].nominalxyz, 12);
220 _read(handle, &
buildzone[buildzoneOrdinal].componentarray[tempr].nominalypr, 12);
221 _read(handle, &
buildzone[buildzoneOrdinal].componentarray[tempr].boundsphere, 4);
222 _read(handle, &
buildzone[buildzoneOrdinal].componentarray[tempr].extendby, 12);
223 _read(handle, &
buildzone[buildzoneOrdinal].componentarray[tempr].texture, 2);
224 _lseek(handle, static_cast<long>(r) * 100L + 99L + 58L, SEEK_SET);
225 _read(handle, &
buildzone[buildzoneOrdinal].componentarray[tempr].type, 1);
226 _lseek(handle, static_cast<long>(r) * 100L + 99L + 91L, SEEK_SET);
227 _read(handle, &
buildzone[buildzoneOrdinal].componentarray[tempr].attachto, 2);
229 if (
buildzone[buildzoneOrdinal].componentarray[tempr].texture < 0 ||
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);
248 sprintf_s(msg,
sizeof(msg),
"Building() %i loading RTS grid for \"%s\"", buildzoneOrdinal, file);
254 sprintf_s(msg,
sizeof msg,
"buildzone[%i].rts", buildzoneOrdinal);
260 sprintf_s(msg,
sizeof(msg),
"Building() %i could not create RTS array for \"%s\"", buildzoneOrdinal, file);
262 return E_OUTOFMEMORY;
264 sprintf_s(msg,
sizeof msg,
"buildzone[%i].rts", buildzoneOrdinal);
270 char rtsFile[MAX_PATH];
271 strcpy_s(rtsFile, MAX_PATH, file);
272 int tt = strlen(file) - 3;
277 _sopen_s(&rtsHandle, rtsFile, _O_RDONLY | _O_BINARY | _O_SEQUENTIAL, _SH_DENYWR, _S_IWRITE);
280 sprintf_s(msg,
sizeof(msg),
"Building() %i failed to load \"%s\"!", buildzoneOrdinal, rtsFile);
282 return DXUTERR_MEDIANOTFOUND;
288 if (FAILED(DXUTGetD3D9Device()->CreateVertexBuffer(26 * 26 * 3 * 2 *
sizeof(
D3DVERTEX2),
290 D3DPOOL_MANAGED, &
buildzone[buildzoneOrdinal].RTSVB, NULL)))
292 sprintf_s(msg,
sizeof(msg),
"Building() %i could not create RTS memory (%i vertices) for \"%s\"", buildzoneOrdinal, 26 * 26 * 3 * 2, file);
294 return E_OUTOFMEMORY;
297 sprintf_s(msg,
sizeof(msg),
"buildzone[%i].RTSVB", buildzoneOrdinal);
301 sprintf_s(msg,
sizeof(msg),
"buildzone[%i].rtscomponentarray", buildzoneOrdinal);
302 if (
buildzone[buildzoneOrdinal].rtscomponentarray)
304 SAFE_DELETE(
buildzone[buildzoneOrdinal].rtscomponentarray);
308 if (
buildzone[buildzoneOrdinal].rtscomponentarray ==
nullptr)
310 sprintf_s(msg,
sizeof(msg),
"Building() %i could not create RTS component array for \"%s\"", buildzoneOrdinal, file);
312 return E_OUTOFMEMORY;
319 if (FAILED(DXUTGetD3D9Device()->CreateVertexBuffer(vertices *
sizeof(
D3DVERTEX), D3DUSAGE_WRITEONLY,
D3DFVF_VERTEX, D3DPOOL_MANAGED,
322 sprintf_s(msg,
sizeof(msg),
"Building() %i could not create memory (%i vertices) for \"%s\"", buildzoneOrdinal, vertices, file);
324 return E_OUTOFMEMORY;
326 sprintf_s(msg,
sizeof(msg),
"Building() %i created VB (%i vertices) for \"%s\"", buildzoneOrdinal, vertices, file);
328 sprintf_s(msg,
sizeof(msg),
"buildzone[%i].VB", buildzoneOrdinal);
335 case PlotType::DeoisFinancial:
336 sprintf_s(file,
sizeof(file),
"Meshes\\deois-financial.daw");
338 case PlotType::UserEstate:
339 sprintf_s(file,
sizeof(file),
"Meshes\\house1.daw");
341 case PlotType::UserMining:
342 sprintf_s(file,
sizeof(file),
"Meshes\\mining1.daw");
344 case PlotType::DeoisIndustrial:
345 sprintf_s(file,
sizeof(file),
"Meshes\\Deois-industrial.daw");
347 case PlotType::DeoisCityCenter:
348 sprintf_s(file,
sizeof(file),
"Meshes\\Deois-city center.daw");
350 case PlotType::DeoisTransit:
351 sprintf_s(file,
sizeof(file),
"Meshes\\Deois-transit district.daw");
362 case PlotType::UserFarming:
363 sprintf_s(file,
sizeof(file),
"Meshes\\farm1.daw");
365 case PlotType::UserTownship:
366 sprintf_s(file,
sizeof(file),
"Meshes\\town1.daw");
368 case PlotType::Arcridge:
369 sprintf_s(file,
sizeof(file),
"Meshes\\sea-arcridge.daw");
371 case PlotType::DeoisPort:
372 sprintf_s(file,
sizeof(file),
"Meshes\\Deois-port.daw");
374 case PlotType::UserAirfield:
375 sprintf_s(file,
sizeof(file),
"Meshes\\airfield.daw");
380 case PlotType::O4Ruin1:
381 sprintf_s(file,
sizeof(file),
"Meshes\\O-4 ruin 1-1.daw");
383 case PlotType::O4Ruin2:
384 sprintf_s(file,
sizeof(file),
"Meshes\\O-4 ruin 1-2.daw");
386 case PlotType::O4Ruin3:
387 sprintf_s(file,
sizeof(file),
"Meshes\\O-4 ruin 1-3.daw");
389 case PlotType::O4Ruin4:
390 sprintf_s(file,
sizeof(file),
"Meshes\\O-4 ruin 1-4.daw");
393 sprintf_s(msg,
sizeof(msg),
"Building() %i DAW could not match a type %i!", buildzoneOrdinal,
buildzone[buildzoneOrdinal].type);
397 _sopen_s(&handle, file, _O_RDONLY | _O_BINARY | _O_SEQUENTIAL, _SH_DENYWR, _S_IWRITE);
400 sprintf_s(msg,
sizeof(msg),
"Building() %i failed to load \"%s\"", buildzoneOrdinal, file);
402 return DXUTERR_MEDIANOTFOUND;
406 _lseek(handle, 0L, SEEK_SET);
407 _read(handle, &tempvertices, 2);
409 sprintf_s(msg,
sizeof(msg),
"Building() %i scanning %i file vertices...", buildzoneOrdinal, tempvertices);
413 D3DXVECTOR3 tempnormal;
415 for (r = 0; r < static_cast<unsigned int>(tempvertices); r++)
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;
442 D3DXMATRIX matrixTemp, matrixWorld, matrixRotation;
443 D3DXVECTOR3 ul, ll, ur, lr, leftvec, rightvec, northvector, result;
444 D3DXVECTOR3 leftpt, rightpt;
499 sprintf_s(msg,
sizeof(msg),
"Building() %i zone %i!", buildzoneOrdinal,
gridarray[t][s].zone);
505 D3DXVec3Subtract(&leftvec, &ul, &ll);
506 D3DXVec3Subtract(&rightvec, &ur, &lr);
507 D3DXVec3Add(&result, &leftvec, &rightvec);
508 D3DXVec3Normalize(&northvector, &result);
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;
522 #ifndef FindMakeshipGrid 525 D3DXVECTOR3 eastvector = topedge + bottomedge;
526 D3DXVec3Normalize(&eastvector, &eastvector);
527 D3DXVec3Cross(&plumb, &northvector, &eastvector);
528 D3DXVec3Normalize(&plumb, &plumb);
533 D3DXVec3Normalize(&plumb, &
buildzone[buildzoneOrdinal].terpos);
535 D3DXMatrixLookAtLH(&matrixTemp, &
centerC, &plumb, &northvector);
536 D3DXMatrixInverse(&
buildzone[buildzoneOrdinal].matrixBase,
nullptr, &matrixTemp);
538 #ifdef FindMakeshipGrid 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);
565 sprintf_s(msg,
sizeof(msg),
"Building() %i zone %i powered %i", buildzoneOrdinal,
gridarray[t][s].zone,
gridarray[t][s].powered);
569 #pragma region Lights 575 _read(handle, &fileEffects, 2);
576 sprintf_s(msg,
sizeof(msg),
"Loading up to %i lights for buildingZoneOrdinal %i...", fileEffects, buildzoneOrdinal);
579 for (r = 0; r < static_cast<unsigned int>(fileEffects); r++)
582 _read(handle, &tempEffect.
position, 12);
583 _read(handle, &tempEffect.
normal, 12);
585 _read(handle, &diffuse, 4);
588 _read(handle, &tempEffect.
speed, 4);
589 _read(handle, &tempEffect.
power, 4);
590 _read(handle, &tempEffect.
attachto, 2);
610 D3DXVec3TransformCoord(&tempEffect.
normal, &tempEffect.
normal, &matrixTemp);
612 bool connected =
true;
618 if (
buildzone[buildzoneOrdinal].componentarray[c].attachto == tempEffect.
attachto)
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());
634 #pragma region REIL (Runway End Identifier Lights) 638 for (r = 0; r < 6; r++)
640 newarray[r].
normal = -northvector;
641 newarray[r].
diffuse = D3DCOLOR_ARGB(255, 0, 255, 0);
644 newarray[r].
power = 1.0f;
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++)
656 newarray[r].
normal = northvector;
657 newarray[r].
diffuse = D3DCOLOR_ARGB(255, 255, 0, 0);
660 newarray[r].
power = 1.0f;
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++)
672 newarray[r].
normal = northvector;
673 newarray[r].
diffuse = D3DCOLOR_ARGB(255, 0, 255, 0);
676 newarray[r].
power = 1.0f;
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++)
688 newarray[r].
normal = -northvector;
689 newarray[r].
diffuse = D3DCOLOR_ARGB(255, 255, 0, 0);
692 newarray[r].
power = 1.0f;
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);
703 for (r = 0; r < 24; r++)
704 buildzone[buildzoneOrdinal].effects.emplace_back(newarray[r]);
727 if (
buildzone[buildzoneOrdinal].componentarray[q].nominalCG.z == 999.0f &&
736 if (
buildzone[buildzoneOrdinal].componentarray[r].attachto ==
buildzone[buildzoneOrdinal].componentarray[q].attachto && q != r)
745 sprintf_s(msg,
sizeof(msg),
"Building() %i ZAP+RTS tempdaw to new buffer...", buildzoneOrdinal);
749 unsigned int vertex = 0, i_temp;
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);
760 assert(i_temp < (
unsigned)tempvertices);
763 D3DXMATRIX matrixConform;
764 if (
buildzone[buildzoneOrdinal].componentarray[q].type == 8 ||
765 buildzone[buildzoneOrdinal].componentarray[q].type == 84)
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;
775 if (D3DXIntersectTri(&ul2, &ur2, &ll2, &
buildzone[buildzoneOrdinal].componentarray[q].nominalxyz, &dir, &uhit, &vhit, &dist))
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);
790 D3DXMatrixLookAtLH(&matrixConform, &
centerC, &result, &northvector);
791 D3DXMatrixInverse(&matrixConform,
nullptr, &matrixConform);
793 else if (D3DXIntersectTri(&ur2, &lr2, &ll2, &
buildzone[buildzoneOrdinal].componentarray[q].nominalxyz, &dir, &uhit, &vhit, &dist))
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);
806 D3DXMatrixLookAtLH(&matrixConform, &
centerC, &result, &northvector);
807 D3DXMatrixInverse(&matrixConform,
nullptr, &matrixConform);
826 if (
buildzone[buildzoneOrdinal].componentarray[q].nominalCG.z > 99.0f)
828 D3DXMatrixRotationZ(&matrixRotation,
buildzone[buildzoneOrdinal].componentarray[q].nominalypr.z);
829 D3DXMatrixTranslation(&matrixTemp,
833 D3DXMatrixMultiply(&matrixWorld, &matrixTemp, &matrixConform);
835 if (
buildzone[buildzoneOrdinal].componentarray[q].type == 8 ||
836 buildzone[buildzoneOrdinal].componentarray[q].type == 84)
838 if (
buildzone[buildzoneOrdinal].componentarray[q].nominalxyz.z == 0.0f)
844 D3DXVec3TransformCoord(&tempnormal, &tempnormal, &matrixRotation);
845 D3DXVec3TransformCoord(&tempnormal, &tempnormal, &matrixWorld);
846 tempnormal = -tempnormal;
848 tempnormal = -tempnormal;
849 D3DXVECTOR3 normalizedTempNormal;
850 D3DXVec3Normalize(&normalizedTempNormal, &tempnormal);
854 if (D3DXIntersectTri(&ul, &ur, &ll, &
centerC, &normalizedTempNormal, &pu, &pv, &dist))
856 dist -= D3DXVec3Length(&tempnormal);
858 else if (D3DXIntersectTri(&ur, &lr, &ll, &
centerC, &normalizedTempNormal, &pu, &pv, &dist))
860 dist -= D3DXVec3Length(&tempnormal);
865 sprintf_s(msg,
sizeof(msg),
"%+.3f ,%+.3f ,%+.3f ,", tempnormal.x, tempnormal.y, tempnormal.z);
885 float fabsbias = -999.0f;
889 if (
buildzone[buildzoneOrdinal].componentarray[q].nominalxyz.z == 0.0f && tempdax[i_temp + r].
z == 0.0f)
891 tempnormal.x = tempdax[i_temp + r].
x;
892 tempnormal.y = tempdax[i_temp + r].
y;
895 D3DXVec3TransformCoord(&tempnormal, &tempnormal, &matrixRotation);
896 D3DXVec3TransformCoord(&tempnormal, &tempnormal, &matrixWorld);
897 tempnormal = -tempnormal;
899 tempnormal = -tempnormal;
900 D3DXVECTOR3 normalizedTempNormal;
901 D3DXVec3Normalize(&normalizedTempNormal, &tempnormal);
905 if (D3DXIntersectTri(&ul, &ur, &ll, &
centerC, &normalizedTempNormal, &pu, &pv, &dist))
909 else if (D3DXIntersectTri(&ur, &lr, &ll, &
centerC, &normalizedTempNormal, &pu, &pv, &dist))
916 sprintf_s(msg,
sizeof(msg),
"%+.3f ,%+.3f ,%+.3f ,", tempnormal.x, tempnormal.y, tempnormal.z);
931 dist -= D3DXVec3Length(&
buildzone[buildzoneOrdinal].terpos);
945 if (
buildzone[buildzoneOrdinal].componentarray[r].attachto ==
buildzone[buildzoneOrdinal].componentarray[q].attachto && q != r)
951 if (
buildzone[buildzoneOrdinal].componentarray[q].nominalCG.z > 99.0f)
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);
959 sprintf_s(msg,
sizeof(msg),
"Building() %i example of ZAP bias %f", buildzoneOrdinal,
buildzone[buildzoneOrdinal].componentarray[q].nominalCG.z);
969 assert(i_temp < static_cast<unsigned>(tempvertices));
971 D3DXMatrixRotationZ(&matrixRotation,
buildzone[buildzoneOrdinal].componentarray[q].nominalypr.z);
972 D3DXMatrixTranslation(&matrixTemp,
976 D3DXMatrixMultiply(&matrixWorld, &matrixTemp, &matrixConform);
977 D3DXMATRIX invMatrixRotation;
978 D3DXMatrixInverse(&invMatrixRotation,
nullptr, &matrixRotation);
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;
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;
995 (*vtx).tu = tempdax[i_temp].
tu; (*vtx).tv = tempdax[i_temp].
tv;
996 vtx++; vertex++; i_temp++;
1000 V(
buildzone[buildzoneOrdinal].VB->Unlock());
1001 sprintf_s(msg,
sizeof(msg),
"Building() %i filled %i/%i vertices for \"%s\"", buildzoneOrdinal, vertex, vertices, file);
1006 #pragma region RTS Grid (drawn after the buildings) 1016 V(
buildzone[buildzoneOrdinal].RTSVB->Lock(0, 0, reinterpret_cast<void**>(&vtx2), 0));
1025 for (t = 0; t < 26; t++)
1027 for (s = 0; s < 26; s++)
1029 if (
buildzone[buildzoneOrdinal].
rts[t * 26 + s].texture == r)
1034 D3DXVec3Lerp(&leftpt, &ll, &ul, static_cast<float>(s + 1) / 26.0f);
1035 D3DXVec3Lerp(&rightpt, &lr, &ur, static_cast<float>(s + 1) / 26.0f);
1036 D3DXVec3Lerp(&result, &leftpt, &rightpt, static_cast<float>(t) / 26.0f);
1039 (*vtx2).x = result.x; (*vtx2).y = result.y; (*vtx2).z = result.z;
1044 if (
buildzone[buildzoneOrdinal].
rts[t * 26 + s].rotation == 0 ||
buildzone[buildzoneOrdinal].
rts[t * 26 + s].rotation == 4)
1046 (*vtx2).tu = 1.0f; (*vtx2).tv = 1.0f;
1048 else if (
buildzone[buildzoneOrdinal].
rts[t * 26 + s].rotation == 3 ||
buildzone[buildzoneOrdinal].
rts[t * 26 + s].rotation == 7)
1050 (*vtx2).tu = 0.0f; (*vtx2).tv = 1.0f;
1052 else if (
buildzone[buildzoneOrdinal].
rts[t * 26 + s].rotation == 2 ||
buildzone[buildzoneOrdinal].
rts[t * 26 + s].rotation == 6)
1054 (*vtx2).tu = 0.0f; (*vtx2).tv = 0.0f;
1056 else if (
buildzone[buildzoneOrdinal].
rts[t * 26 + s].rotation == 1 ||
buildzone[buildzoneOrdinal].
rts[t * 26 + s].rotation == 5)
1058 (*vtx2).tu = 1.0f; (*vtx2).tv = 0.0f;
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;
1066 D3DXVec3Lerp(&leftpt, &ll, &ul, static_cast<float>(s) / 26.0f);
1067 D3DXVec3Lerp(&rightpt, &lr, &ur, static_cast<float>(s) / 26.0f);
1068 D3DXVec3Lerp(&result, &leftpt, &rightpt, static_cast<float>(t + 1) / 26.0f);
1071 (*vtx2).x = result.x; (*vtx2).y = result.y; (*vtx2).z = result.z;
1076 if (
buildzone[buildzoneOrdinal].
rts[t * 26 + s].rotation == 2 ||
buildzone[buildzoneOrdinal].
rts[t * 26 + s].rotation == 6)
1078 (*vtx2).tu = 1.0f; (*vtx2).tv = 1.0f;
1080 else if (
buildzone[buildzoneOrdinal].
rts[t * 26 + s].rotation == 1 ||
buildzone[buildzoneOrdinal].
rts[t * 26 + s].rotation == 5)
1082 (*vtx2).tu = 0.0f; (*vtx2).tv = 1.0f;
1084 else if (
buildzone[buildzoneOrdinal].
rts[t * 26 + s].rotation == 0 ||
buildzone[buildzoneOrdinal].
rts[t * 26 + s].rotation == 4)
1086 (*vtx2).tu = 0.0f; (*vtx2).tv = 0.0f;
1088 else if (
buildzone[buildzoneOrdinal].
rts[t * 26 + s].rotation == 3 ||
buildzone[buildzoneOrdinal].
rts[t * 26 + s].rotation == 7)
1090 (*vtx2).tu = 1.0f; (*vtx2).tv = 0.0f;
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;
1098 D3DXVec3Lerp(&leftpt, &ll, &ul, static_cast<float>(s + 1) / 26.0f);
1099 D3DXVec3Lerp(&rightpt, &lr, &ur, static_cast<float>(s + 1) / 26.0f);
1100 D3DXVec3Lerp(&result, &leftpt, &rightpt, static_cast<float>(t + 1) / 26.0f);
1103 (*vtx2).x = result.x; (*vtx2).y = result.y; (*vtx2).z = result.z;
1108 if (
buildzone[buildzoneOrdinal].
rts[t * 26 + s].rotation == 3 ||
buildzone[buildzoneOrdinal].
rts[t * 26 + s].rotation == 7)
1110 (*vtx2).tu = 0.0f; (*vtx2).tv = 0.0f;
1112 else if (
buildzone[buildzoneOrdinal].
rts[t * 26 + s].rotation == 2 ||
buildzone[buildzoneOrdinal].
rts[t * 26 + s].rotation == 6)
1114 (*vtx2).tu = 1.0f; (*vtx2).tv = 0.0f;
1116 else if (
buildzone[buildzoneOrdinal].
rts[t * 26 + s].rotation == 1 ||
buildzone[buildzoneOrdinal].
rts[t * 26 + s].rotation == 5)
1118 (*vtx2).tu = 1.0f; (*vtx2).tv = 1.0f;
1120 else if (
buildzone[buildzoneOrdinal].
rts[t * 26 + s].rotation == 0 ||
buildzone[buildzoneOrdinal].
rts[t * 26 + s].rotation == 4)
1122 (*vtx2).tu = 0.0f; (*vtx2).tv = 1.0f;
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;
1130 D3DXVec3Lerp(&leftpt, &ll, &ul, static_cast<float>(s + 1) / 26.0f);
1131 D3DXVec3Lerp(&rightpt, &lr, &ur, static_cast<float>(s + 1) / 26.0f);
1132 D3DXVec3Lerp(&result, &leftpt, &rightpt, static_cast<float>(t) / 26.0f);
1135 (*vtx2).x = result.x; (*vtx2).y = result.y; (*vtx2).z = result.z;
1140 if (
buildzone[buildzoneOrdinal].
rts[t * 26 + s].rotation == 0 ||
buildzone[buildzoneOrdinal].
rts[t * 26 + s].rotation == 4)
1142 (*vtx2).tu = 1.0f; (*vtx2).tv = 1.0f;
1144 else if (
buildzone[buildzoneOrdinal].
rts[t * 26 + s].rotation == 1 ||
buildzone[buildzoneOrdinal].
rts[t * 26 + s].rotation == 5)
1146 (*vtx2).tu = 1.0f; (*vtx2).tv = 0.0f;
1148 else if (
buildzone[buildzoneOrdinal].
rts[t * 26 + s].rotation == 2 ||
buildzone[buildzoneOrdinal].
rts[t * 26 + s].rotation == 6)
1150 (*vtx2).tu = 0.0f; (*vtx2).tv = 0.0f;
1152 else if (
buildzone[buildzoneOrdinal].
rts[t * 26 + s].rotation == 3 ||
buildzone[buildzoneOrdinal].
rts[t * 26 + s].rotation == 7)
1154 (*vtx2).tu = 0.0f; (*vtx2).tv = 1.0f;
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;
1162 D3DXVec3Lerp(&leftpt, &ll, &ul, static_cast<float>(s) / 26.0f);
1163 D3DXVec3Lerp(&rightpt, &lr, &ur, static_cast<float>(s) / 26.0f);
1164 D3DXVec3Lerp(&result, &leftpt, &rightpt, static_cast<float>(t) / 26.0f);
1167 (*vtx2).x = result.x; (*vtx2).y = result.y; (*vtx2).z = result.z;
1172 if (
buildzone[buildzoneOrdinal].
rts[t * 26 + s].rotation == 3 ||
buildzone[buildzoneOrdinal].
rts[t * 26 + s].rotation == 7)
1174 (*vtx2).tu = 1.0f; (*vtx2).tv = 1.0f;
1176 else if (
buildzone[buildzoneOrdinal].
rts[t * 26 + s].rotation == 0 ||
buildzone[buildzoneOrdinal].
rts[t * 26 + s].rotation == 4)
1178 (*vtx2).tu = 1.0f; (*vtx2).tv = 0.0f;
1180 else if (
buildzone[buildzoneOrdinal].
rts[t * 26 + s].rotation == 1 ||
buildzone[buildzoneOrdinal].
rts[t * 26 + s].rotation == 5)
1182 (*vtx2).tu = 0.0f; (*vtx2).tv = 0.0f;
1184 else if (
buildzone[buildzoneOrdinal].
rts[t * 26 + s].rotation == 2 ||
buildzone[buildzoneOrdinal].
rts[t * 26 + s].rotation == 6)
1186 (*vtx2).tu = 0.0f; (*vtx2).tv = 1.0f;
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;
1194 D3DXVec3Lerp(&leftpt, &ll, &ul, static_cast<float>(s) / 26.0f);
1195 D3DXVec3Lerp(&rightpt, &lr, &ur, static_cast<float>(s) / 26.0f);
1196 D3DXVec3Lerp(&result, &leftpt, &rightpt, static_cast<float>(t + 1) / 26.0f);
1199 (*vtx2).x = result.x; (*vtx2).y = result.y; (*vtx2).z = result.z;
1204 if (
buildzone[buildzoneOrdinal].
rts[t * 26 + s].rotation == 2 ||
buildzone[buildzoneOrdinal].
rts[t * 26 + s].rotation == 6)
1206 (*vtx2).tu = 1.0f; (*vtx2).tv = 1.0f;
1208 else if (
buildzone[buildzoneOrdinal].
rts[t * 26 + s].rotation == 3 ||
buildzone[buildzoneOrdinal].
rts[t * 26 + s].rotation == 7)
1210 (*vtx2).tu = 1.0f; (*vtx2).tv = 0.0f;
1212 else if (
buildzone[buildzoneOrdinal].
rts[t * 26 + s].rotation == 0 ||
buildzone[buildzoneOrdinal].
rts[t * 26 + s].rotation == 4)
1214 (*vtx2).tu = 0.0f; (*vtx2).tv = 0.0f;
1216 else if (
buildzone[buildzoneOrdinal].
rts[t * 26 + s].rotation == 1 ||
buildzone[buildzoneOrdinal].
rts[t * 26 + s].rotation == 5)
1218 (*vtx2).tu = 0.0f; (*vtx2).tv = 1.0f;
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;
1227 if (
buildzone[buildzoneOrdinal].rtscomponentarray[
buildzone[buildzoneOrdinal].rtscomponents].primitives > 0)
1234 V(
buildzone[buildzoneOrdinal].RTSVB->Unlock());
1235 sprintf_s(msg,
sizeof(msg),
"Building() %i filled %i RTS primitives for \"%s\"", buildzoneOrdinal, i_temp, file);
Ssorter sortme[buildingVBC]
s_mesh_component * rtscomponentarray
unsigned short rtscomponents
std::vector< s_light_effect > effects
buildings(Viewscreen *ptr)
s_mesh_component * componentarray
BUILDZONE buildzone[buildingVBC]
const D3DXVECTOR3 centerC
D3DXVECTOR3 insidearray[63][63][3]
void Log(const char *msg, Level level=Info, int errorCode=0)
HRESULT Building(short t, short s) const
void AddTrackedResource(const char *name, _D3DPOOL pool=D3DPOOL_MANAGED)
LOCALGRID2 gridarray[64][64]
static bool CheckLayout(unsigned i, LOCALGRID2 localgrid2)
unsigned short components
void UpdateTrackedResource(const char *name, int status)