public void SetHeights(int X, int Y) { for (int x = 0; x < (BlockSize + 1 + 2); x++) { for (int y = 0; y < (BlockSize + 1 + 2); y++) { TerrainVertex v = GainVertex(x - 1, y - 1, X, Y); _vertices[(x) + (y * (BlockSize + 1 + 2))] = v; } } }
public int bufferNode(ref IntPtr buffer, Node n, Material.Property pass) { int vertCount = 0; if (n.isLeaf == false) { for (int i = 0; i < 8; i++) { vertCount += bufferNode(ref buffer, n.myChildren[i], pass); } } else { if (n.isVisible() == false) { return(0); } if (n.myMaterial.property != pass) { return(0); } TerrainVertex[] vertBuffer = new TerrainVertex[36]; //calculated values Vector3[] verts = n.generateVerts(); int idx = 0; for (int i = 0; i < 6; i++) { if (n.faceVisible(i) == true) { Vector2 uv; Vector3 v; //first triangle v = n.localVertex(i, 0, ref verts); uv = n.localUv(i, 0, ref verts); vertBuffer[idx].pos = TerrainVertex.encode(v); vertBuffer[idx].uvx = (UInt16)(uv.X * 100); vertBuffer[idx].uvy = (UInt16)(uv.Y * 100); vertBuffer[idx].texIndex = (UInt16)n.localMaterial(i); idx++; v = n.localVertex(i, 1, ref verts); uv = n.localUv(i, 1, ref verts); vertBuffer[idx].pos = TerrainVertex.encode(v); vertBuffer[idx].uvx = (UInt16)(uv.X * 100); vertBuffer[idx].uvy = (UInt16)(uv.Y * 100); vertBuffer[idx].texIndex = (UInt16)n.localMaterial(i); idx++; v = n.localVertex(i, 2, ref verts); uv = n.localUv(i, 2, ref verts); vertBuffer[idx].pos = TerrainVertex.encode(v); vertBuffer[idx].uvx = (UInt16)(uv.X * 100); vertBuffer[idx].uvy = (UInt16)(uv.Y * 100); vertBuffer[idx].texIndex = (UInt16)n.localMaterial(i); idx++; //second triangle v = n.localVertex(i, 0, ref verts); uv = n.localUv(i, 0, ref verts); vertBuffer[idx].pos = TerrainVertex.encode(v); vertBuffer[idx].uvx = (UInt16)(uv.X * 100); vertBuffer[idx].uvy = (UInt16)(uv.Y * 100); vertBuffer[idx].texIndex = (UInt16)n.localMaterial(i); idx++; v = n.localVertex(i, 2, ref verts); uv = n.localUv(i, 2, ref verts); vertBuffer[idx].pos = TerrainVertex.encode(v); vertBuffer[idx].uvx = (UInt16)(uv.X * 100); vertBuffer[idx].uvy = (UInt16)(uv.Y * 100); vertBuffer[idx].texIndex = (UInt16)n.localMaterial(i); idx++; v = n.localVertex(i, 3, ref verts); uv = n.localUv(i, 3, ref verts); vertBuffer[idx].pos = TerrainVertex.encode(v); vertBuffer[idx].uvx = (UInt16)(uv.X * 100); vertBuffer[idx].uvy = (UInt16)(uv.Y * 100); vertBuffer[idx].texIndex = (UInt16)n.localMaterial(i); idx++; } } for (int i = 0; i < idx; i++) { Marshal.StructureToPtr(vertBuffer[i], buffer, false); buffer += TerrainVertex.stride; } //return the number of verts that are added return(idx); } return(vertCount); }
TerrainVertex GainVertex(int X, int Y, int DX, int DY, int Seed = 0) { TerrainVertex v = new TerrainVertex(); float One32nd = 1.0f / 64.0f; v.Position.X = X; v.Position.Z = Y; int MapX = X + DX * (BlockSize); int MapY = Y + DY * (BlockSize); // Z = 0; // v.Position.Y= noise.PerlinNoise3F(MapX, MapY, Z, 1, One32nd / 1, One32nd / 1, One32nd / 1); //* // v.Position.Y *= 10; //v.Position.Y += 6; // v.Position.Y *= 10; float to256 = 1 / 256; float H = 0.0f; Simplex.Seed = this.Seed; MapY += 65535; MapX += 65535; //land/water scaling H = Simplex.CalcPixel2D(MapX, MapY, 1f / 16384f) - 35f; //values from -35 to 220ish. H += (Simplex.CalcPixel2D(MapX, MapY, 1f / 256) / 16); //+-16 variation, values -51..246 float Hills = Simplex.CalcPixel2D(MapX, MapY, 1f / 256) - 128; Hills /= 16; //+-8 noise //*/ v.Position.Y = H; float Temp = Simplex.CalcPixel2D(MapX, MapY, 1f / 4024f); //0 to 255 temp int Blend1 = Math.Min((int)(Temp * 2), 160); int Blend2 = Math.Min((510 - (int)(Temp * 2)), 200); Color grass = new Color(Blend1, Blend2, 0); Color sea = new Color(0, 50, 255); Color Snow = new Color(245, 245, 255); Color sand = new Color(200, 200, 100); Color sand2 = new Color(150, 150, 50); sea = sand; v.Color = grass; // v.Color = float BeachRange = 12; float SnowRange = 185; float GroundBaseline = WaterHeight + BeachRange; if (H < WaterHeight) { v.MultiTexData.Z = 1; v.Color = sea; } if (H > WaterHeight && H < GroundBaseline) { float dif = H - WaterHeight; dif /= BeachRange; dif = (float)Math.Pow(dif, 7.3); v.Position.Y = WaterHeight + dif * BeachRange; v.Color = sand; v.MultiTexData.Z = 1; } if (H > GroundBaseline) { unchecked { Simplex.Seed = Simplex.Seed ^ (int)0xFFFFFFFF; } //hill horizontal scale float random1 = Simplex.CalcPixel2D(MapX + 1112, MapY + 13123, 2f) / 512f; float random2 = Simplex.CalcPixel2D(MapX + 1112, MapY + 13123, 1f) / 1024f; float ground = Simplex.CalcPixel2D(MapX + 1112, MapY + 13123, 0.0006125f / 1f); float beachdist = H - GroundBaseline; float evenness = 16f; ground /= 256f; ground = (float)(Math.Pow(ground, 4.4)); ground *= 256f; beachdist /= evenness; beachdist = MathHelper.Clamp(beachdist, 0.0f, 1.0f); float finalground = GroundBaseline + ground * beachdist + Hills * beachdist + (random1 + random2) * beachdist; v.Position.Y = finalground;// + random1 + random2; v.MultiTexData.Z = (float)Math.Pow((float)MathHelper.Clamp((((Temp / 2f) - finalground + 76f) / 100f), 0f, 1f), 3f); if (v.MultiTexData.Z < 0.2f) { v.MultiTexData.Z = 0f; } if (finalground > SnowRange) { v.Color = Snow; v.MultiTexData.Z = 0.20f; } } // v.Color = new Color(Math.Min(255, (int)H), 0, 0); v.TextureCoordinate.X = X / 4f; v.TextureCoordinate.Y = Y / 4f; v.Normal = new Vector3(0, 0, 0); // v.Position.Y = 6; return(v); }
//public override void prepareFrameBegin() { } //public override void preparePerFrame(Renderable r) { } //public override void preparePerViewBegin(View v) { } //public override void preparePerView(Renderable r, View v) { } //public override void preparePerViewFinalize(View v) { } //public override void preparePerPassBegin(Pass p) { } //public override void preparePerPass(Renderable r, Pass p) { } public override void preparePerPassFinalize(Pass p) { base.preparePerPassFinalize(p); foreach (BaseRenderQueue rq in p.renderQueues.Values) { if (rq.myPipeline.vaoState.vao == null) { rq.myPipeline.vaoState.vao = new VertexArrayObject(); rq.myPipeline.vaoState.vao.bindVertexFormat(rq.myPipeline.shaderState.shaderProgram, TerrainVertex.bindings()); } } }