15 sprintf_s(newmsg,
sizeof newmsg,
"GRID: %s", msg);
33 if (
gridarray[l][m].buildzoneOrdinal != -1)
36 sprintf_s(msg,
sizeof(msg),
"HG2 released VB slot %i!",
gridarray[l][m].buildzoneOrdinal);
40 sprintf_s(msg,
sizeof(msg),
"buildzone[%i].VB",
gridarray[l][m].buildzoneOrdinal);
46 sprintf_s(msg,
sizeof(msg),
"buildzone[%i].RTSVB",
gridarray[l][m].buildzoneOrdinal);
70 for (
short t = 0; t < 64; t++)
72 for (
short s = 0; s < 64; s++)
95 int grid::FindOrAddVertex(std::vector<struct D3DXVECTOR3>* unique_vertices, D3DXVECTOR3 position)
97 for (UINT i = 0; i < unique_vertices->size(); i++)
99 if (fabsf(unique_vertices->at(i).x - position.x) <= FLT_EPSILON &&
100 fabsf(unique_vertices->at(i).y - position.y) <= FLT_EPSILON &&
101 fabsf(unique_vertices->at(i).z - position.z) <= FLT_EPSILON)
104 unique_vertices->emplace_back(position);
105 return static_cast<int>(unique_vertices->size() - 1);
112 sprintf_s(msg,
sizeof(msg),
"Received SRenderGrid center at u%i v%i (%i)", datapacket.tcp.u, datapacket.tcp.v,
cube);
115 for (
short t = 0; t < 64; t++)
117 for (
short s = 0; s < 64; s++)
127 for (
short t = 16; t < 48; t++)
129 for (
short s = 16; s < 48; s++)
142 Trace(
" grid::ReceiveWholeGrid DONE");
147 Trace(
"RequestWholeGrid");
152 SClientPacket outpacket;
154 outpacket.f_x =
tcp.u;
155 outpacket.f_y =
tcp.v;
156 outpacket.f_z =
cube;
157 outpacket.f_w = 0.0f;
188 Trace(
"Process calling RWG coming out of the clouds...");
197 bool keepgoing =
true;
204 sprintf_s(msg,
sizeof(msg),
"Process calling RWG changing gnomonic cube from %i to %i",
oldcube,
cube);
215 sprintf_s(msg,
sizeof(msg),
"Process calling RWG moving u%i and v%i", abs(
tcp.u -
oldtcp.u), abs(
tcp.v -
oldtcp.v));
225 SClientPacket outpacket = SClientPacket();
230 sprintf_s(msg,
sizeof(msg),
"Shifted base on movement EAST,%i,%i (%i,%i)",
tcp.u,
tcp.v,
oldtcp.u,
oldtcp.v);
237 for (t = 0; t < 63; t++)
240 if (t > 15 && t < 48)
244 for (s = 0; s < 64; s++)
248 for (s = 16; s < 48; s++)
254 sprintf_s(msg,
sizeof(msg),
"Now 2,%i,%i",
oldtcp.u,
oldtcp.v);
260 outpacket.f_z = 0.0f;
261 outpacket.f_w = 3.0f;
269 sprintf_s(msg,
sizeof(msg),
"Shifted base on movement WEST %i,%i (%i,%i)",
tcp.u,
tcp.v,
oldtcp.u,
oldtcp.v);
276 for (t = 63; t > 0; t--)
279 if (t > 16 && t < 48)
283 for (s = 0; s < 64; s++)
287 for (s = 16; s < 48; s++)
293 sprintf_s(msg,
sizeof(msg),
"Now 3,%i,%i",
oldtcp.u,
oldtcp.v);
299 outpacket.f_z = 0.0f;
300 outpacket.f_w = 4.0f;
307 sprintf_s(msg,
sizeof(msg),
"Unhandled case for tcp.u %i oldtcp.u %i",
tcp.u,
oldtcp.u);
315 SClientPacket outpacket = SClientPacket();
319 sprintf_s(msg,
sizeof(msg),
"Shifted base on movement NORTH %i,%i (%i,%i)",
tcp.u,
tcp.v,
oldtcp.u,
oldtcp.v);
327 for (t = 0; t < 64; t++)
329 for (s = 63; s > 0; s--)
332 if (s > 16 && s < 48 && t > 15 && t < 48)
336 for (t = 0; t < 64; t++)
340 for (t = 16; t < 48; t++)
346 sprintf_s(msg,
sizeof(msg),
"Now 0,%i,%i",
oldtcp.u,
oldtcp.v);
352 outpacket.f_z = 0.0f;
353 outpacket.f_w = 1.0f;
360 sprintf_s(msg,
sizeof(msg),
"Shifted base on movement SOUTH,%i,%i (%i,%i)",
tcp.u,
tcp.v,
oldtcp.u,
oldtcp.v);
368 for (t = 0; t < 64; t++)
370 for (s = 0; s < 63; s++)
373 if (s > 15 && s < 47 && t > 15 && t < 48)
377 for (t = 0; t < 64; t++)
381 for (t = 16; t < 48; t++)
387 sprintf_s(msg,
sizeof(msg),
"Now 1,%i,%i",
oldtcp.u,
oldtcp.v);
393 outpacket.f_z = 0.0f;
394 outpacket.f_w = 2.0f;
401 sprintf_s(msg,
sizeof(msg),
"Unhandled case for tcp.v %i oldtcp.v %i",
tcp.v,
oldtcp.v);
402 Trace(msg, Logger::Level::Warn);
412 Trace(
"gridproc.cpp (NAF) rebuilding terrain matrix...");
426 std::vector<D3DXVECTOR3> uniqueVertices;
433 std::vector<Spoly> polygons;
442 if (t < 0 || t >= 64 || s < 0 || s >= 64)
444 viewscreen->
logger->
Log(
"t and/or s in drawlist[r].u/v out-of-bounds", Logger::Level::Fatal);
463 if (
gridarray[t][s].type == PlotType::UserAirfield)
473 if (t + 1 >= 64 || s + 1 >= 64)
478 if (
gridarray[t + 1][s].type == PlotType::DoNotRender ||
479 gridarray[t + 1][s + 1].type == PlotType::DoNotRender ||
480 gridarray[t][s + 1].type == PlotType::DoNotRender)
484 (*vtxg).tu = 0; (*vtxg).tv = 0;
487 if (
drawlist[r].pri_landform != 255)
490 poly1.a = FindOrAddVertex(&uniqueVertices,
gridarray[t][s].position);
491 poly1.b = FindOrAddVertex(&uniqueVertices,
gridarray[t + 1][s].position);
492 poly1.c = FindOrAddVertex(&uniqueVertices,
gridarray[t + 1][s + 1].position);
493 poly1.d = FindOrAddVertex(&uniqueVertices,
gridarray[t][s + 1].position);
494 if (t == 31 && s == 31)
495 poly1.color = D3DCOLOR_ARGB(0, t * 4, s * 4, 255);
497 poly1.color = D3DCOLOR_ARGB(0, t * 4, s * 4, 0);
499 polygons.emplace_back(poly1);
510 if (t > 15 && t < 47 && s > 15 && s < 47)
512 const bool meld = t == 16 || t == 46 || s == 16 || s == 46;
515 (*vtxg).
tu = 0.5f; (*vtxg).tv = 0;
520 D3DXColorLerp(&tempcolor, &
gridarray[t][s].raster, &
gridarray[t + 1][s].raster, 0.5f);
521 (*vtxg).raster = tempcolor;
526 (*vtxg).
tu = 0; (*vtxg).tv = 0.5f;
531 D3DXColorLerp(&tempcolor, &
gridarray[t][s].raster, &
gridarray[t][s + 1].raster, 0.5f);
532 (*vtxg).raster = tempcolor;
538 (*vtxg).
tu = 0.5f; (*vtxg).tv = 0;
543 D3DXColorLerp(&tempcolor, &
gridarray[t][s].raster, &
gridarray[t + 1][s].raster, 0.5f);
544 (*vtxg).raster = tempcolor;
549 (*vtxg).
tu = 0.5f; (*vtxg).tv = 0.5f;
554 D3DXColorLerp(&tempcolor, &
gridarray[t][s].raster, &
gridarray[t + 1][s + 1].raster, 0.5f);
555 (*vtxg).raster = tempcolor;
559 (*vtxg).specular = tempcolor;
563 (*vtxg).
tu = 0; (*vtxg).tv = 0.5f;
568 D3DXColorLerp(&tempcolor, &
gridarray[t][s].raster, &
gridarray[t][s + 1].raster, 0.5f);
569 (*vtxg).raster = tempcolor;
575 (*vtxg).
tu = 0.5f; (*vtxg).tv = 0;
580 D3DXColorLerp(&tempcolor, &
gridarray[t][s].raster, &
gridarray[t + 1][s].raster, 0.5f);
581 (*vtxg).raster = tempcolor;
586 (*vtxg).
tu = 1; (*vtxg).tv = 0;
593 (*vtxg).
tu = 0.5f; (*vtxg).tv = 0.5f;
598 D3DXColorLerp(&tempcolor, &
gridarray[t][s].raster, &
gridarray[t + 1][s + 1].raster, 0.5f);
599 (*vtxg).raster = tempcolor;
603 (*vtxg).specular = tempcolor;
607 (*vtxg).
tu = 1; (*vtxg).tv = 0;
614 (*vtxg).
tu = 1; (*vtxg).tv = 0.5f;
619 D3DXColorLerp(&tempcolor, &
gridarray[t + 1][s].raster, &
gridarray[t + 1][s + 1].raster, 0.5f);
620 (*vtxg).raster = tempcolor;
625 (*vtxg).
tu = 0.5f; (*vtxg).tv = 0.5f;
630 D3DXColorLerp(&tempcolor, &
gridarray[t][s].raster, &
gridarray[t + 1][s + 1].raster, 0.5f);
631 (*vtxg).raster = tempcolor;
635 (*vtxg).specular = tempcolor;
640 (*vtxg).
tu = 0; (*vtxg).tv = 0.5f;
645 D3DXColorLerp(&tempcolor, &
gridarray[t][s].raster, &
gridarray[t][s + 1].raster, 0.5f);
646 (*vtxg).raster = tempcolor;
651 (*vtxg).
tu = 0.5f; (*vtxg).tv = 0.5f;
656 D3DXColorLerp(&tempcolor, &
gridarray[t][s].raster, &
gridarray[t + 1][s + 1].raster, 0.5f);
657 (*vtxg).raster = tempcolor;
661 (*vtxg).specular = tempcolor;
665 (*vtxg).
tu = 0; (*vtxg).tv = 1;
673 (*vtxg).
tu = 0.5f; (*vtxg).tv = 0.5f;
678 D3DXColorLerp(&tempcolor, &
gridarray[t][s].raster, &
gridarray[t + 1][s + 1].raster, 0.5f);
679 (*vtxg).raster = tempcolor;
683 (*vtxg).specular = tempcolor;
687 (*vtxg).
tu = 0.5f; (*vtxg).tv = 1;
692 D3DXColorLerp(&tempcolor, &
gridarray[t][s + 1].raster, &
gridarray[t + 1][s + 1].raster, 0.5f);
693 (*vtxg).raster = tempcolor;
698 (*vtxg).
tu = 0; (*vtxg).tv = 1;
706 (*vtxg).
tu = 0.5f; (*vtxg).tv = 0.5f;
711 D3DXColorLerp(&tempcolor, &
gridarray[t][s].raster, &
gridarray[t + 1][s + 1].raster, 0.5f);
712 (*vtxg).raster = tempcolor;
716 (*vtxg).specular = tempcolor;
720 (*vtxg).
tu = 1; (*vtxg).tv = 0.5f;
725 D3DXColorLerp(&tempcolor, &
gridarray[t + 1][s].raster, &
gridarray[t + 1][s + 1].raster, 0.5f);
726 (*vtxg).raster = tempcolor;
731 (*vtxg).
tu = 0.5f; (*vtxg).tv = 1;
736 D3DXColorLerp(&tempcolor, &
gridarray[t][s + 1].raster, &
gridarray[t + 1][s + 1].raster, 0.5f);
737 (*vtxg).raster = tempcolor;
743 (*vtxg).
tu = 1; (*vtxg).tv = 0.5f;
748 D3DXColorLerp(&tempcolor, &
gridarray[t + 1][s].raster, &
gridarray[t + 1][s + 1].raster, 0.5f);
749 (*vtxg).raster = tempcolor;
754 (*vtxg).
tu = 1; (*vtxg).tv = 1;
761 (*vtxg).
tu = 0.5f; (*vtxg).tv = 1;
766 D3DXColorLerp(&tempcolor, &
gridarray[t][s + 1].raster, &
gridarray[t + 1][s + 1].raster, 0.5f);
767 (*vtxg).raster = tempcolor;
777 if (
gridarray[t][s].buildzoneOrdinal != -1)
780 sprintf_s(msg,
sizeof(msg),
"buildzone[%i].VB",
gridarray[t][s].buildzoneOrdinal);
786 sprintf_s(msg,
sizeof(msg),
"buildzone[%i].RTSVB",
gridarray[t][s].buildzoneOrdinal);
790 sprintf_s(msg,
sizeof(msg),
"NiPD released VB slot %i!",
gridarray[t][s].buildzoneOrdinal);
797 (*vtxg).tu = 1; (*vtxg).tv = 0;
804 (*vtxg).
tu = 0; (*vtxg).tv = 1;
812 (*vtxg).
tu = 1; (*vtxg).tv = 0;
819 (*vtxg).
tu = 1; (*vtxg).tv = 1;
826 (*vtxg).
tu = 0; (*vtxg).tv = 1;
834 sprintf_s(msg,
sizeof(msg),
"Total vertices in terrain vertex buffer: %i/%i", n,
visiblevertC);
841 sprintf_s(msg,
sizeof(msg),
"%04i%04i.wld",
tcp.u + 3038,
tcp.v + 2038);
843 _sopen_s(&wldfile, msg, _O_WRONLY | _O_CREAT | _O_TRUNC | O_TEXT, _SH_DENYNO, _S_IWRITE);
844 sprintf_s(msg,
sizeof(msg),
" 2.23\n %i ,\n", uniqueVertices.size());
845 _write(wldfile, msg, strlen(msg));
846 float largestX = -FLT_MAX, largestY = -FLT_MAX, largestZ = -FLT_MAX;
847 float smallestX = FLT_MAX, smallestY = FLT_MAX, smallestZ = FLT_MAX;
848 for (
int i = 0; i < uniqueVertices.size(); i++)
850 if (uniqueVertices.at(i).x > largestX)
851 largestX = uniqueVertices.at(i).x;
852 if (uniqueVertices.at(i).y > largestY)
853 largestY = uniqueVertices.at(i).y;
854 if (uniqueVertices.at(i).z > largestZ)
855 largestZ = uniqueVertices.at(i).z;
856 if (uniqueVertices.at(i).x < smallestX)
857 smallestX = uniqueVertices.at(i).x;
858 if (uniqueVertices.at(i).y < smallestY)
859 smallestY = uniqueVertices.at(i).y;
860 if (uniqueVertices.at(i).z < smallestZ)
861 smallestZ = uniqueVertices.at(i).z;
863 float avgX = (largestX - smallestX) * 0.5f + smallestX;
864 float avgY = (largestY - smallestY) * 0.5f + smallestY;
865 float avgZ = (largestZ - smallestZ) * 0.5f + smallestZ;
866 for (
int i = 0; i < uniqueVertices.size(); i++)
868 sprintf_s(msg,
sizeof(msg),
"%+f ,%+f ,%+f ,\n", uniqueVertices.at(i).x - avgX, uniqueVertices.at(i).y - avgY, uniqueVertices.at(i).z - avgZ);
869 _write(wldfile, msg, strlen(msg));
870 } sprintf_s(msg,
sizeof(msg),
" %i ,\n 0.125000 ,0.500000 ,0 ,0 ,1 ,\n", polygons.size());
871 _write(wldfile, msg, strlen(msg));
872 for (
int i = 0; i < polygons.size(); i++)
874 sprintf_s(msg,
sizeof(msg),
" 4 , %i , %i , %i , %i , %x ,0.347995 ,0.248828 ,0.027999 ,0.248828 ,0.027999 ,0.246328 ,0.347995 ,0.246328 ,-1.000000 , 0 ,\n",
875 polygons.at(i).a, polygons.at(i).b, polygons.at(i).c, polygons.at(i).d, polygons.at(i).color);
876 _write(wldfile, msg, strlen(msg));
878 sprintf_s(msg,
sizeof(msg),
"unused\nunused\nunused\n");
879 _write(wldfile, msg, strlen(msg));
906 Trace(
"gridproc.cpp (NAF) finished!");
930 for (t = 0; t < 64; t++)
932 for (s = 0; s < 64; s++)
943 if (t > 0 && t < 63 && s > 0 && s < 63)
950 tempcolor.r /= 9.0f; tempcolor.g /= 9.0f; tempcolor.b /= 9.0f;
951 (*vtxh).specular = tempcolor;
957 (*vtxh++).diffuse =
gridarray[t][s].clouddif;
965 Trace(
"gridproc.cpp (NAC) finished!");
971 Trace(
"gridproc.cpp (NAB) started...!");
973 bool addedBuilding =
false;
974 for (t = 16; t < 47; t++)
976 for (s = 16; s < 47; s++)
979 if (
gridarray[t][s].type > PlotType::NotZoned &&
980 gridarray[t][s].type < PlotType::PlotTypeEnum &&
991 addedBuilding =
true;
995 sprintf_s(msg,
sizeof msg,
"We have a building on the grid with a type %i (u%i v%i) but no zone or layout information yet ... waiting!",
gridarray[t][s].type, t +
tcp.u, s +
tcp.v);
1003 addedBuilding =
true;
1013 Trace(
"Added a building, leaving checkconstruct true!");
1017 Trace(
"gridproc.cpp (NAB) finished!");
1024 #define fracC 32 // must be power of 2, not function of 2 1025 if (ground.maketrees && keepgoing)
1029 for (t = 29; t < 34; t++)
1031 for (s = 29; s < 34; s++)
1033 if ((powf(31.0f - (
float)t, 2.0f) + powf(31.0f - (
float)s, 2.0f)) <= 4.0f)
1035 unsigned int fudgefactor = ((long)(
tcp.u + t - 31) + 2038L) + ((
long)(
tcp.v + s - 31) + 2038L) * 8152L;
1039 float density = 1.0f;
1040 float rough = flux, halfr = rough * 0.5f;
1041 float fractal[fracC + 1][fracC + 1];
1042 fractal[0][0] = fractal[fracC][0] = fractal[fracC][fracC] = fractal[0][fracC] = 0.0f;
1043 short iterate = fracC;
1044 short p, q, midp, midq;
1045 float peak = -999.0f, lull = 999.0f;
1048 while (iterate != 1)
1050 for (p = 0; p < fracC; p += iterate)
1052 midp = p + iterate / 2;
1053 for (q = 0; q < fracC; q += iterate)
1055 midq = q + iterate / 2;
1058 fractal[midp][midq] = (fractal[p][q] + fractal[p + iterate][q + iterate] + fractal[p + iterate][q] + fractal[p][q + iterate]) * 0.25f + f_temp;
1059 if (fractal[midp][midq] > peak)
1060 peak = fractal[midp][midq];
1061 if (fractal[midp][midq] < lull)
1062 lull = fractal[midp][midq];
1065 fractal[midp][q] = (fractal[p][q] + fractal[p + iterate][q]) * 0.5f + f_temp;
1066 if (fractal[midp][q] > peak)
1067 peak = fractal[midp][q];
1068 if (fractal[midp][q] < lull)
1069 lull = fractal[midp][q];
1071 fractal[midp][q + iterate] = (fractal[p][q + iterate] + fractal[p + iterate][q + iterate]) * 0.5f + f_temp;
1072 if (fractal[midp][q + iterate] > peak)
1073 peak = fractal[midp][q + iterate];
1074 if (fractal[midp][q + iterate] < lull)
1075 lull = fractal[midp][q + iterate];
1077 fractal[p][midq] = (fractal[p][q] + fractal[p][q + iterate]) * 0.5f + f_temp;
1078 if (fractal[p][midq] > peak)
1079 peak = fractal[p][midq];
1080 if (fractal[p][midq] < lull)
1081 lull = fractal[p][midq];
1083 fractal[p + iterate][midq] = (fractal[p + iterate][q] + fractal[p + iterate][q + iterate]) * 0.5f + f_temp;
1084 if (fractal[p + iterate][midq] > peak)
1085 peak = fractal[p + iterate][midq];
1086 if (fractal[p + iterate][midq] < lull)
1087 lull = fractal[p + iterate][midq];
1106 for (p = 0; p < fracC; p++)
1108 for (q = 0; q < fracC; q++)
1110 float edgep, edgeq, edge;
1111 if (p < (fracC / 2))
1112 edgep = (
float)p / (float)(fracC / 4);
1114 edgep = (float)(fracC - p) / (float)(fracC / 4);
1115 if (q < (fracC / 2))
1116 edgeq = (
float)q / (float)(fracC / 4);
1118 edgeq = (float)(fracC - q) / (float)(fracC / 4);
1126 short shorttest = (short)(fractal[p][q] * edge * 255.0f);
1132 float adjx =
RandomFloat() * 1.0f / (float)(fracC / 2) * 0.75f - 1.0f / (float)(fracC / 2) * 0.375f;
1133 float adjy =
RandomFloat() * 1.0f / (float)(fracC / 2) * 0.75f - 1.0f / (float)(fracC / 2) * 0.375f;
1135 if (p < (fracC / 2) && q < (fracC / 2))
1141 else if (p >= (fracC / 2) && q < (fracC / 2))
1147 else if (p < (fracC / 2) && q >= (fracC / 2))
1153 else if (p >= (fracC / 2) && q >= (fracC / 2))
1155 result = (
insidearray[t + 1][s][1] -
insidearray[t][s][2]) * ((
float)(p - fracC / 2) / (
float)(fracC / 2) + adjx);
1156 result += (
insidearray[t][s + 1][0] -
insidearray[t][s][2]) * ((
float)(q - fracC / 2) / (
float)(fracC / 2) + adjy);
1160 treelist[treesC] = result;
1162 if (treesC >= 16383)
1174 sprintf_s(msg,
sizeof(msg),
"Trees: %i", treesC);
1176 ground.maketrees =
false;
1187 gridarray[t - 1][s].pri_landform == 255 ||
gridarray[t][s - 1].pri_landform == 255 ||
1193 gridarray[t][s].type == PlotType::UserAirfield ||
gridarray[t - 1][s].type == PlotType::UserAirfield ||
gridarray[t][s - 1].type == PlotType::UserAirfield ||
1196 gridarray[t][s].type == PlotType::Arcridge ||
gridarray[t - 1][s].type == PlotType::Arcridge ||
gridarray[t][s - 1].type == PlotType::Arcridge)
void CalculateCubeAndTcp()
LPDIRECT3DVERTEXBUFFER9 m_avCloudGrid
void ReceiveWholeGrid(SRenderGrid datapacket)
D3DXVECTOR3 D3DXVec3Qerp(D3DXVECTOR3 *vel0, D3DXVECTOR3 *vel1, D3DXVECTOR3 *vel2, float t) const
void CalculateInsideArray(short t, short s) const
VECTOR2SHORT CalculateWrap(short u, short v, char cube, char *rotate) const
void SendToServer(void *pData, DWORD dwSize, bool bGuaranteed, PacketOrdering order=ORDERING_NONE) const
VECTOR2SHORT CalculateCGC(D3DXVECTOR3 position, char cube) const
s_network_objects playerships[MAX_SCAN]
LPDIRECT3DVERTEXBUFFER9 m_avLocalGrid
unsigned char ter_landform
unsigned char pri_landform
bool markerBeaconsPowered
unsigned char sec_landform
unsigned char pri_transition
unsigned char sec_transition
GridProperties gridProperties
grid(Viewscreen *ptrGame)
BATCHINDEX2 drawlist[drawlistC]
unsigned char sec_landform
BUILDZONE buildzone[buildingVBC]
unsigned char sec_transition
const D3DXVECTOR3 centerC
D3DXVECTOR3 insidearray[63][63][3]
LOCALGRID2 CalculateSRV(short t, short s, VECTOR2SHORT tcp, char cube, SRenderVertex sourcedata)
void Log(const char *msg, Level level=Info, int errorCode=0)
unsigned char ter_landform
unsigned char runwayLights
unsigned char pri_landform
char CalculateCube(D3DXVECTOR3 position) const
HRESULT Building(short t, short s) const
LOCALGRID2 gridarray[64][64]
void Trace(const char *msg, Logger::Level severity=Logger::Level::Info) const
unsigned char pri_transition
static bool CheckLayout(unsigned i, LOCALGRID2 localgrid2)
void UpdateTrackedResource(const char *name, int status)
void AddToCallStack(const char *msg)