Example #1
0
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);
}
Example #2
0
File: Water.cpp Project: heyx3/K1LL
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);
}
Example #3
0
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;
}
Example #4
0
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);
	}
}