Пример #1
0
        /// <summary>
        /// </summary>
        /// <param name="name">
        /// </param>
        /// <param name="xmin">
        /// </param>
        /// <param name="zmin">
        /// </param>
        /// <param name="xmax">
        /// </param>
        /// <param name="zmax">
        /// </param>
        /// <param name="subdivisions">
        /// </param>
        /// <param name="precision">
        /// </param>
        /// <param name="scene">
        /// </param>
        /// <param name="updatable">
        /// </param>
        /// <returns>
        /// </returns>
        public static Mesh CreateTiledGround(
            string name, double xmin, double zmin, double xmax, double zmax, SizeI subdivisions, SizeI precision, Scene scene, bool updatable = false)
        {
            var tiledGround = new Mesh(name, scene);
            var vertexData  = VertexData.CreateTiledGround(xmin, zmin, xmax, zmax, subdivisions, precision);

            vertexData.applyToMesh(tiledGround, updatable);
            return(tiledGround);
        }
Пример #2
0
 public TiledGround(int id, Scene scene, int xmin, int zmin, int xmax, int zmax, SizeI subdivisions, SizeI precision, bool canBeRegenerated = false, Mesh mesh = null)
     : base(id, scene, VertexData.CreateTiledGround(xmin, zmin, xmax, zmax, subdivisions, precision), canBeRegenerated, mesh)
 {
     this.xmin         = xmin;
     this.zmin         = zmin;
     this.xmax         = xmax;
     this.zmax         = zmax;
     this.subdivisions = subdivisions;
     this.precision    = precision;
 }
Пример #3
0
        /// <summary>
        /// </summary>
        /// <param name="xmin">
        /// </param>
        /// <param name="zmin">
        /// </param>
        /// <param name="xmax">
        /// </param>
        /// <param name="zmax">
        /// </param>
        /// <param name="subdivisions">
        /// </param>
        /// <param name="precision">
        /// </param>
        /// <returns>
        /// </returns>
        public static VertexData CreateTiledGround(double xmin, double zmin, double xmax, double zmax, SizeI subdivisions, SizeI precision)
        {
            var indices   = new Array <int>();
            var positions = new Array <double>();
            var normals   = new Array <double>();
            var uvs       = new Array <double>();

            subdivisions.h = (subdivisions.w < 1) ? 1 : subdivisions.h;
            subdivisions.w = (subdivisions.w < 1) ? 1 : subdivisions.w;
            precision.w    = (precision.w < 1) ? 1 : precision.w;
            precision.h    = (precision.h < 1) ? 1 : precision.h;
            var tileSize = new SizeI {
                w = (int)((xmax - xmin) / subdivisions.w), h = (int)((zmax - zmin) / subdivisions.h)
            };

            for (var tileRow = 0; tileRow < subdivisions.h; tileRow++)
            {
                for (var tileCol = 0; tileCol < subdivisions.w; tileCol++)
                {
                    var xTileMin = xmin + tileCol * tileSize.w;
                    var zTileMin = zmin + tileRow * tileSize.h;
                    var xTileMax = xmin + (tileCol + 1) * tileSize.w;
                    var zTileMax = zmin + (tileRow + 1) * tileSize.h;

                    // Indices
                    var _base     = positions.Length / 3;
                    var rowLength = precision.w + 1;
                    for (var row = 0; row < precision.h; row++)
                    {
                        for (var col = 0; col < precision.w; col++)
                        {
                            var square = new Array <int>(
                                _base + col + row * rowLength,
                                _base + (col + 1) + row * rowLength,
                                _base + (col + 1) + (row + 1) * rowLength,
                                _base + col + (row + 1) * rowLength);

                            indices.Add(square[1]);
                            indices.Add(square[2]);
                            indices.Add(square[3]);
                            indices.Add(square[0]);
                            indices.Add(square[1]);
                            indices.Add(square[3]);
                        }
                    }

                    // Position, normals and uvs
                    var position = Vector3.Zero();
                    var normal   = new Vector3(0, 1.0, 0);
                    for (var row = 0; row <= precision.h; row++)
                    {
                        position.z = (row * (zTileMax - zTileMin)) / precision.h + zTileMin;
                        for (var col = 0; col <= precision.w; col++)
                        {
                            position.x = (col * (xTileMax - xTileMin)) / precision.w + xTileMin;
                            position.y = 0;

                            positions.Add(position.x, position.y, position.z);
                            normals.Add(normal.x, normal.y, normal.z);
                            uvs.Add(col / precision.w, row / precision.h);
                        }
                    }
                }
            }

            var vertexData = new VertexData();

            vertexData.indices   = indices;
            vertexData.positions = positions;
            vertexData.normals   = normals;
            vertexData.uvs       = uvs;
            return(vertexData);
        }