/// <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); }
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; }
/// <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); }