示例#1
0
        public override void Init()
        {
            //Ideas para generar el terreno para Bullet
            //We are getting a llitle bit crazy xD https://es.wikipedia.org/wiki/Paraboloide
            //Paraboloide Hiperbolico
            // definicion matematica
            //(x / a) ^ 2 - ( y / b) ^ 2 - z = 0.
            //
            //DirectX
            //(x / a) ^ 2 - ( z / b) ^ 2 - y = 0.

            //Paraboloide Circular
            //definicion matematica
            //(x / a) ^ 2 + ( y / b) ^ 2 - z = 0 ; a=b.
            //
            //DirectX
            //(x / a) ^ 2 + ( z / a) ^ 2 - y = 0.

            //Crear vertexBuffer
            int width  = 1200;
            int length = 1200;

            totalVertices = 2 * 3 * (width - 1) * (length - 1);
            vertexBuffer  = new VertexBuffer(typeof(CustomVertex.PositionTextured), totalVertices, D3DDevice.Instance.Device, Usage.Dynamic | Usage.WriteOnly, CustomVertex.PositionTextured.Format, Pool.Default);
            //Almacenar informacion en VertexBuffer

            //Cargar vertices
            var dataIdx = 0;
            var data    = new CustomVertex.PositionTextured[totalVertices];

            TGCVector3 center = TGCVector3.Empty;

            center.X = center.X - width / 2;
            center.Z = center.Z - length / 2;

            int a         = 64;
            int size      = 80;
            int n         = 0;
            int triangles = 0;
            int vertexes  = 0;

            for (var i = 0; i < width - 1; i = i + size)
            {
                for (var j = 0; j < length - 1; j = j + size)
                {
                    //Vertices
                    var v1 = new TGCVector3(center.X + i, center.Y + (FastMath.Pow2((center.X + i) / a) + FastMath.Pow2((center.Z + j) / a)), center.Z + j);
                    var v2 = new TGCVector3(center.X + i, center.Y + (FastMath.Pow2((center.X + i) / a) + FastMath.Pow2((center.Z + j + size) / a)), center.Z + (j + size));
                    var v3 = new TGCVector3(center.X + (i + size), center.Y + (FastMath.Pow2((center.X + i + size) / a) + FastMath.Pow2((center.Z + j) / a)), center.Z + j);
                    var v4 = new TGCVector3(center.X + (i + size), center.Y + (FastMath.Pow2((center.X + i + size) / a) + FastMath.Pow2((center.Z + j + size) / a)), center.Z + (j + size));
                    vertexes = +vertexes + 4;

                    //Coordendas de textura
                    var t1 = TGCVector2.Zero;
                    var t2 = new TGCVector2(0, 1);
                    var t3 = new TGCVector2(1, 0);
                    var t4 = TGCVector2.One;

                    //Cargar triangulo 1
                    data[dataIdx]     = new CustomVertex.PositionTextured(v1, t1.X, t1.Y);
                    data[dataIdx + 1] = new CustomVertex.PositionTextured(v2, t2.X, t2.Y);
                    data[dataIdx + 2] = new CustomVertex.PositionTextured(v4, t4.X, t4.Y);
                    triangles++;

                    //Cargar triangulo 2
                    data[dataIdx + 3] = new CustomVertex.PositionTextured(v1, t1.X, t1.Y);
                    data[dataIdx + 4] = new CustomVertex.PositionTextured(v4, t4.X, t4.Y);
                    data[dataIdx + 5] = new CustomVertex.PositionTextured(v3, t3.X, t3.Y);
                    triangles++;

                    dataIdx += 6;
                    n++;
                }
            }

            vertexBuffer.SetData(data, 0, LockFlags.None);

            //Rotar e invertir textura
            var b = (Bitmap)Image.FromFile(MediaDir + "Texturas/pasto.jpg");

            b.RotateFlip(RotateFlipType.Rotate90FlipX);
            terrainTexture = Texture.FromBitmap(D3DDevice.Instance.Device, b, Usage.AutoGenerateMipMap, Pool.Managed);

            //Shader
            effect    = TGCShaders.Instance.VariosShader;
            technique = TGCShaders.T_POSITION_TEXTURED;

            physicsExample = new TrianglePhysics();
            physicsExample.SetTriangleDataVB(data);
            physicsExample.Init(MediaDir);

            UserVars.addVar("Tgccito_Position");

            Camera = new TgcRotationalCamera(new TGCVector3(0, 200, 0), 800, Input);
        }