public ModelRoot CreateTerrainMesh(HeightMap heightMap, GenOptions options = GenOptions.None, Matrix4x4 vectorTransform = default, bool doubleSided = true) { Triangulation triangulation = default; if (options.HasFlag(GenOptions.BoxedBaseElevation0)) { triangulation = _meshService.GenerateTriangleMesh_Boxed(heightMap, BoxBaseThickness.FixedElevation, 0); } else if (options.HasFlag(GenOptions.BoxedBaseElevationMin)) { triangulation = _meshService.GenerateTriangleMesh_Boxed(heightMap, BoxBaseThickness.FromMinimumPoint, 5); } else { triangulation = _meshService.TriangulateHeightMap(heightMap); } // create a basic scene var model = CreateNewModel(); var rnode = model.LogicalScenes.First()?.FindNode(n => n.Name == TERRAIN_NODE_NAME); var rmesh = rnode.Mesh = model.CreateMesh(TERRAIN_MESH_NAME); var material = model.CreateMaterial("Default") .WithPBRMetallicRoughness() .WithDoubleSide(doubleSided); var indexedTriangulation = new IndexedTriangulation(triangulation, vectorTransform); // create mesh primitive var primitive = rmesh.CreatePrimitive() .WithVertexAccessor("POSITION", indexedTriangulation.Positions); if (options.HasFlag(GenOptions.Normals)) { var normals = _meshService.ComputeMeshNormals(indexedTriangulation.Positions, indexedTriangulation.Indices); primitive = primitive.WithVertexAccessor("NORMAL", normals.ToList()); } primitive = primitive.WithIndicesAccessor(PrimitiveType.TRIANGLES, indexedTriangulation.Indices) .WithMaterial(material); return(model); }
/// <summary> /// Generate a triangle mesh from supplied height map, triangulating and optionaly mapping UVs /// and generate sides and bottom (like a box where the top is the triangulated height map) /// </summary> /// <param name="heightMap">Height map.</param> /// <param name="thickness">Determines how box height will be calculated</param> /// <param name="zValue">Z value to apply for box calculation</param> /// <returns></returns> public MeshPrimitive GenerateTriangleMesh_Boxed(HeightMap heightMap, BoxBaseThickness thickness = BoxBaseThickness.FixedElevation, float zValue = 0f) { Triangulation triangulation = _meshService.GenerateTriangleMesh_Boxed(heightMap, thickness, zValue); return(GenerateTriangleMesh(triangulation)); }