static MESH CreateMesh(int boneCount) { var mesh = new MESH("skinned mesh"); mesh.VertexPreprocessor.SetValidationPreprocessors(); var prim = mesh.UsePrimitive(new SharpGLTF.Materials.MaterialBuilder("Default")); var a0 = default(VERTEX); var a1 = default(VERTEX); var a2 = default(VERTEX); var a3 = default(VERTEX); for (int i = 0; i < boneCount; ++i) { var b0 = new VERTEX(new Vector3(-5, i * 10, -5), Vector4.One, (i, 1)); var b1 = new VERTEX(new Vector3(+5, i * 10, -5), Vector4.One, (i, 1)); var b2 = new VERTEX(new Vector3(+5, i * 10, +5), Vector4.One, (i, 1)); var b3 = new VERTEX(new Vector3(-5, i * 10, +5), Vector4.One, (i, 1)); if (i == 0) { prim.AddQuadrangle(b0, b1, b2, b3); } else { prim.AddQuadrangle(b0, b1, a1, a0); prim.AddQuadrangle(b1, b2, a2, a1); prim.AddQuadrangle(b2, b3, a3, a2); prim.AddQuadrangle(b3, b0, a0, a3); } a0 = b0; a1 = b1; a2 = b2; a3 = b3; } prim.AddQuadrangle(a3, a2, a1, a0); return(mesh); }
private static void ContainedMeshToGLTF(List <RawMeshContainer> meshes, FileInfo outfile) { var scene = new SharpGLTF.Scenes.SceneBuilder(); int mIndex = -1; foreach (var mesh in meshes) { ++mIndex; long indCount = mesh.indices.Length; var expmesh = new MESH(string.Format(Path.GetFileNameWithoutExtension(outfile.FullName) + "_mesh_{0}", mIndex)); var prim = expmesh.UsePrimitive(new MaterialBuilder("Default")); for (long i = 0; i < indCount; i += 3) { uint idx0 = mesh.indices[i + 1]; uint idx1 = mesh.indices[i]; uint idx2 = mesh.indices[i + 2]; //VPNT Vec3 p_0 = new Vec3(mesh.vertices[idx0].X, mesh.vertices[idx0].Y, mesh.vertices[idx0].Z); Vec3 n_0 = new Vec3(mesh.normals[idx0].X, mesh.normals[idx0].Y, mesh.normals[idx0].Z); Vec4 t_0 = new Vec4(new Vec3(mesh.tangents[idx0].X, mesh.tangents[idx0].Y, mesh.tangents[idx0].Z), 1); Vec3 p_1 = new Vec3(mesh.vertices[idx1].X, mesh.vertices[idx1].Y, mesh.vertices[idx1].Z); Vec3 n_1 = new Vec3(mesh.normals[idx1].X, mesh.normals[idx1].Y, mesh.normals[idx1].Z); Vec4 t_1 = new Vec4(new Vec3(mesh.tangents[idx1].X, mesh.tangents[idx1].Y, mesh.tangents[idx1].Z), 1); Vec3 p_2 = new Vec3(mesh.vertices[idx2].X, mesh.vertices[idx2].Y, mesh.vertices[idx2].Z); Vec3 n_2 = new Vec3(mesh.normals[idx2].X, mesh.normals[idx2].Y, mesh.normals[idx2].Z); Vec4 t_2 = new Vec4(new Vec3(mesh.tangents[idx2].X, mesh.tangents[idx2].Y, mesh.tangents[idx2].Z), 1); //VCT Vec2 tx0_0 = new Vec2(mesh.tx0coords[idx0].X, mesh.tx0coords[idx0].Y); Vec2 tx1_0 = new Vec2(mesh.tx1coords[idx0].X, mesh.tx1coords[idx0].Y); Vec2 tx0_1 = new Vec2(mesh.tx0coords[idx1].X, mesh.tx0coords[idx1].Y); Vec2 tx1_1 = new Vec2(mesh.tx1coords[idx1].X, mesh.tx1coords[idx1].Y); Vec2 tx0_2 = new Vec2(mesh.tx0coords[idx2].X, mesh.tx0coords[idx2].Y); Vec2 tx1_2 = new Vec2(mesh.tx1coords[idx2].X, mesh.tx1coords[idx2].Y); Vec4 col_0 = new Vec4(mesh.colors[idx0].X, mesh.colors[idx0].Y, mesh.colors[idx0].Z, mesh.colors[idx0].W); Vec4 col_1 = new Vec4(mesh.colors[idx1].X, mesh.colors[idx1].Y, mesh.colors[idx1].Z, mesh.colors[idx1].W); Vec4 col_2 = new Vec4(mesh.colors[idx2].X, mesh.colors[idx2].Y, mesh.colors[idx2].Z, mesh.colors[idx2].W); // vertex build var v0 = new VERTEX(new VPNT(p_0, n_0, t_0), new VCT(col_0, tx0_0, tx1_0)); var v1 = new VERTEX(new VPNT(p_1, n_1, t_1), new VCT(col_1, tx0_1, tx1_1)); var v2 = new VERTEX(new VPNT(p_2, n_2, t_2), new VCT(col_2, tx0_2, tx1_2)); // triangle build prim.AddTriangle(v0, v1, v2); } scene.AddRigidMesh(expmesh, System.Numerics.Matrix4x4.Identity); } var model = scene.ToGltf2(); model.SaveGLB(Path.GetFullPath(outfile.FullName).Replace(".mesh", ".glb")); }