X-Git-Url: https://git.jsancho.org/?a=blobdiff_plain;f=Source%2FEnvironment%2FTerrain.cpp;h=6d195e204eaf9f5c39262b07c01b8a2d3f006af2;hb=d3f16728298e0639a3b2e916386f4e8cea4018ff;hp=79d31b29c9077b6b27e928cce62804cd8132ba42;hpb=190f9f06c28bf4b7aff2ad0b61e5648ea2b10cc6;p=lugaru.git diff --git a/Source/Environment/Terrain.cpp b/Source/Environment/Terrain.cpp index 79d31b2..6d195e2 100644 --- a/Source/Environment/Terrain.cpp +++ b/Source/Environment/Terrain.cpp @@ -635,7 +635,7 @@ bool Terrain::load(const std::string& fileName) Game::LoadingScreen(); patch_size = size / subdivision; - patch_elements = (patch_size) * (patch_size) * 54; + patch_elements = patch_size * patch_size * 54; CalculateNormals(); return true; @@ -932,17 +932,17 @@ void Terrain::draw(int layer) viewdistsquared = viewdistance * viewdistance; //Only nearby blocks - beginx = (viewer.x - viewdistance) / (patch_size) - 1; + beginx = ((viewer.x - viewdistance) / patch_size) - 1; if (beginx < 0) beginx = 0; - beginz = (viewer.z - viewdistance) / (patch_size) - 1; + beginz = ((viewer.z - viewdistance) / patch_size) - 1; if (beginz < 0) beginz = 0; - endx = (viewer.x + viewdistance) / (patch_size) + 1; + endx = ((viewer.x + viewdistance) / patch_size) + 1; if (endx > subdivision) endx = subdivision; - endz = (viewer.z + viewdistance) / (patch_size) + 1; + endz = ((viewer.z + viewdistance) / patch_size) + 1; if (endz > subdivision) endz = subdivision; @@ -1137,36 +1137,26 @@ void Terrain::deleteDeadDecals() void Terrain::AddObject(XYZ where, float radius, int id) { - XYZ points[4]; - if (id >= 0 && id < 10000) + XYZ points[2]; + if (id >= 0 && id < 10000) { for (int i = 0; i < subdivision; i++) { for (int j = 0; j < subdivision; j++) { - if (patchobjectnum[i][j] < 300 - 1) { - bool done = false; + if (patchobjects[i][j].size() < 300 - 1) { points[0].x = (size / subdivision) * i; points[0].z = (size / subdivision) * j; points[0].y = heightmap[(int)points[0].x][(int)points[0].z]; points[1].x = (size / subdivision) * (i + 1); - points[1].z = (size / subdivision) * j; + points[1].z = (size / subdivision) * (j + 1); points[1].y = heightmap[(int)points[1].x][(int)points[1].z]; - points[2].x = (size / subdivision) * (i + 1); - points[2].z = (size / subdivision) * (j + 1); - points[2].y = heightmap[(int)points[2].x][(int)points[2].z]; - points[3].x = (size / subdivision) * i; - points[3].z = (size / subdivision) * (j + 1); - points[3].y = heightmap[(int)points[3].x][(int)points[3].z]; points[0] *= scale; points[1] *= scale; - points[2] *= scale; - points[3] *= scale; - if (!done && where.x + radius > points[0].x && where.x - radius < points[2].x && where.z + radius > points[0].z && where.z - radius < points[2].z) { - patchobjects[i][j][patchobjectnum[i][j]] = id; - patchobjectnum[i][j]++; - done = 1; + if (where.x + radius > points[0].x && where.x - radius < points[1].x && where.z + radius > points[0].z && where.z - radius < points[1].z) { + patchobjects[i][j].push_back(id); } } } } + } } void Terrain::DeleteDecal(int which) @@ -1249,8 +1239,6 @@ void Terrain::MakeDecalLock(decal_type type, XYZ where, int whichx, int whichy, void Terrain::DoShadows() { - static int i, j, k, l, todivide; - static float brightness, total; static XYZ testpoint, testpoint2, terrainpoint, lightloc, col; lightloc = light.location; if (!skyboxtexture) { @@ -1265,18 +1253,18 @@ void Terrain::DoShadows() float shadowed; Normalise(&lightloc); //Calculate shadows - for (i = 0; i < size; i++) { - for (j = 0; j < size; j++) { - terrainpoint.x = (float)(i) * scale; - terrainpoint.z = (float)(j) * scale; + for (short int i = 0; i < size; i++) { + for (short int j = 0; j < size; j++) { + terrainpoint.x = (float)i * scale; + terrainpoint.z = (float)j * scale; terrainpoint.y = heightmap[i][j] * scale; shadowed = 0; - patchx = (float)(i) * subdivision / size; - patchz = (float)(j) * subdivision / size; - if (patchobjectnum[patchx][patchz]) { - for (k = 0; k < patchobjectnum[patchx][patchz]; k++) { - l = patchobjects[patchx][patchz][k]; + patchx = (float)i * subdivision / size; + patchz = (float)j * subdivision / size; + if (patchobjects[patchx][patchz].size()) { + for (unsigned int k = 0; k < patchobjects[patchx][patchz].size(); k++) { + unsigned int l = patchobjects[patchx][patchz][k]; if (Object::objects[l]->type != treetrunktype) { testpoint = terrainpoint; testpoint2 = terrainpoint + lightloc * 50 * (1 - shadowed); @@ -1287,7 +1275,7 @@ void Terrain::DoShadows() } Game::LoadingScreen(); } - brightness = dotproduct(&lightloc, &normals[i][j]); + float brightness = dotproduct(&lightloc, &normals[i][j]); if (shadowed) brightness *= 1 - shadowed; @@ -1312,11 +1300,11 @@ void Terrain::DoShadows() Game::LoadingScreen(); //Smooth shadows - for (i = 0; i < size; i++) { - for (j = 0; j < size; j++) { - for (k = 0; k < 3; k++) { - total = 0; - todivide = 0; + for (short int i = 0; i < size; i++) { + for (short int j = 0; j < size; j++) { + for (short int k = 0; k < 3; k++) { + float total = 0; + unsigned int todivide = 0; if (i != 0) { total += colors[j][i - 1][k]; todivide++; @@ -1357,8 +1345,8 @@ void Terrain::DoShadows() } } - for (i = 0; i < subdivision; i++) { - for (j = 0; j < subdivision; j++) { + for (unsigned int i = 0; i < subdivision; i++) { + for (unsigned int j = 0; j < subdivision; j++) { UpdateVertexArray(i, j); } } @@ -1368,9 +1356,6 @@ Terrain::Terrain() { size = 0; - memset(patchobjectnum, 0, sizeof(patchobjectnum)); - memset(patchobjects, 0, sizeof(patchobjects)); - scale = 1.0f; type = 0; memset(heightmap, 0, sizeof(heightmap));