Beispiel #1
0
 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;
         }
     }
 }
Beispiel #2
0
        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);
        }
Beispiel #3
0
        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);
        }
Beispiel #4
0
        //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());
                }
            }
        }