static void terrainMPDDiamondStep(int i,int j,int step,float dispH) { terrainHeights[(i+step/2)*terrainGridWidth + j+step/2] = (terrainHeight(i,j) + terrainHeight(i+step,j) + terrainHeight(i+step,j+step) + terrainHeight(i,j+step)) / 4; terrainHeights[(i+step/2)*terrainGridWidth + j+step/2] += terrainRandom(dispH); }
void CreateWaterMesh(unsigned int size, Vector3f scle, Mesh& outM) { Vector3f offset(size * -0.5f, size * -0.5f, 0.0f); Array2D<float> terrainHeight(size, size, 0.0f); //Just create a flat terrain and let it do the math. Terrain terr(Vector2u(size, size)); terr.SetHeightmap(terrainHeight); std::vector<WaterVertex> verts; std::vector<unsigned int> indices; terr.GenerateTrianglesFull<WaterVertex>(verts, indices, [](WaterVertex& v) { return &v.Pos; }, [](WaterVertex& v) { return &v.TexCoord; }); //Convert the terrain vertices into water vertices. for (unsigned int i = 0; i < verts.size(); ++i) { verts[i].Pos = verts[i].Pos.ComponentProduct(scle) + offset; } //Upload the mesh data into vertex/index buffers. outM.SubMeshes.push_back(MeshData(false, PT_TRIANGLE_LIST)); MeshData& mDat = outM.SubMeshes[0]; mDat.SetVertexData(verts, MeshData::BUF_STATIC, WaterVertex::GetVertexAttributes()); mDat.SetIndexData(indices, MeshData::BUF_STATIC); }
double Map::terrainHeightf(double x, double y) { // This function is just doing bilinear interpolation int x1 = (int)x; int y1 = (int)y; int x2 = x1+1; int y2 = y1+1; double p11 = terrainHeight(x1,y1); double p21 = terrainHeight(x2,y1); double p12 = terrainHeight(x1,y2); double p22 = terrainHeight(x2,y2); double o = (1.0/((x2-x1)*(y2-y1))) * ( p11*(x2-x)*(y2-y) + p21*(x-x1)*(y2-y) + p12*(x2-x)*(y-y1) + p22*(x-x1)*(y-y1) ); return o; }
static void terrainMPDSquareStep(int x1,int z1, int step, float dispH) { int i,j; int x,z; x = x1 + step/2; z = z1 + step/2; i = x + step/2; j = z; if (i == terrainGridLength-1) terrainHeights[i*terrainGridWidth + j] = (terrainHeight(i,j+step/2) + terrainHeight(i,j-step/2) + terrainHeight(i-step/2,j)) / 3; else terrainHeights[i*terrainGridWidth + j] = (terrainHeight(i,j+step/2) + terrainHeight(i,j-step/2) + terrainHeight(i-step/2,j) + terrainHeight(i+step/2,j)) / 4; terrainHeights[i*terrainGridWidth + j] += terrainRandom(dispH); j = z + step/2; i = x; if (j == terrainGridWidth-1) terrainHeights[i*terrainGridWidth + j] = (terrainHeight(i,j-step/2) + terrainHeight(i-step/2,j) + terrainHeight(i+step/2,j)) / 3; else terrainHeights[i*terrainGridWidth + j] = (terrainHeight(i,j+step/2) + terrainHeight(i,j-step/2) + terrainHeight(i-step/2,j) + terrainHeight(i+step/2,j)) / 4; terrainHeights[i*terrainGridWidth + j] += terrainRandom(dispH); i = x - step/2; j = z; if (i == 0){ terrainHeights[i*terrainGridWidth + j] = (terrainHeight(i,j+step/2) + terrainHeight(i,j-step/2) + terrainHeight(i+step/2,j)) / 3; terrainHeights[i*terrainGridWidth + j] += terrainRandom(dispH); } j = z - step/2; i = x; if (j == 0){ terrainHeights[i*terrainGridWidth + j] = (terrainHeight(i,j+step/2) + terrainHeight(i-step/2,j) + terrainHeight(i+step/2,j)) / 3; terrainHeights[i*terrainGridWidth + j] += terrainRandom(dispH); } }