Tile::Tile(int tileID, int numSides, std::vector<Vector3f> verts, std::vector<int> neigh) : tileID(tileID) , numSides(numSides) , vertList(verts) , neighbors(neigh) { setType(Tile_t); // Set color to GREEN color = { 0.0, 1.0, 0.0, 1.0 }; Vector3f normal; std::vector<Vector3f> upper(verts.begin(), verts.end() - numSides); std::vector<Vector3f> lower(verts.begin() + numSides, verts.end()); // Push the top surface normal on first normal = calcSurfaceNormal(upper); normals.push_back(normal); // Then push the bottom surface normal std::reverse(lower.begin(), lower.end()); normal = calcSurfaceNormal(lower); std::reverse(lower.begin(), lower.end()); normals.push_back(normal); // Then push the normals of the sides in for (int i = 0; i < numSides; i++) { std::vector<Vector3f> side; Vector3f vec = upper[i]; side.push_back(vec); vec = lower[i]; side.push_back(vec); vec = lower[(i + 1) % lower.size()]; side.push_back(vec); vec = upper[(i + 1) % upper.size()]; side.push_back(vec); normal = calcSurfaceNormal(side); normals.push_back(normal); } for (int i = 0; i < neigh.size(); i++){ //Boundary bound(verts[i], verts[(i + 1) % verts.size()], .2, neigh[i] != 0); addChild(new Boundary(upper[i], upper[(i + 1) % upper.size()], 0.2f, neigh[i] == 0)); } }
//Calculates surface normals for each triangle. void calcSurfaceNormals(){ int i,j; for (i = 0; i < height - 1; i++){ for (j = 0; j < width - 1; j++){ vec3f v1 = {i*hscale, heightmap[i][j]*scale, j*hscale}; vec3f v2 = {i*hscale,heightmap[i][j+1]*scale,(j+1)*hscale}; vec3f v3 = {(i+1)*hscale,heightmap[i+1][j]*scale,j*hscale}; vec3f v4 = {(i+1)*hscale,heightmap[i+1][j+1]*scale,(j+1)*hscale}; vec3f norm = calcSurfaceNormal(v1,v2,v3); upperN[i][j].x = norm.x; upperN[i][j].y = norm.y; upperN[i][j].z = norm.z; vec3f norm2 = calcSurfaceNormal(v2,v4,v3); lowerN[i][j].x = norm2.x; lowerN[i][j].y = norm2.y; lowerN[i][j].z = norm2.z; } } }