|
@@ -18,12 +18,12 @@ namespace SharpGLTF.Schema2
|
|
|
|
|
|
|
|
public static Mesh CreateMesh(this ModelRoot root, IMeshBuilder<Materials.MaterialBuilder> mesh)
|
|
public static Mesh CreateMesh(this ModelRoot root, IMeshBuilder<Materials.MaterialBuilder> mesh)
|
|
|
{
|
|
{
|
|
|
- return root.CreateMeshes(mesh).First();
|
|
|
|
|
|
|
+ return root.CreateMeshes(mesh)[0];
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
public static Mesh CreateMesh<TMaterial>(this ModelRoot root, Func<TMaterial, Material> materialEvaluator, IMeshBuilder<TMaterial> mesh)
|
|
public static Mesh CreateMesh<TMaterial>(this ModelRoot root, Func<TMaterial, Material> materialEvaluator, IMeshBuilder<TMaterial> mesh)
|
|
|
{
|
|
{
|
|
|
- return root.CreateMeshes<TMaterial>(materialEvaluator, mesh).First();
|
|
|
|
|
|
|
+ return root.CreateMeshes<TMaterial>(materialEvaluator, mesh)[0];
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
public static IReadOnlyList<Mesh> CreateMeshes(this ModelRoot root, params IMeshBuilder<Materials.MaterialBuilder>[] meshBuilders)
|
|
public static IReadOnlyList<Mesh> CreateMeshes(this ModelRoot root, params IMeshBuilder<Materials.MaterialBuilder>[] meshBuilders)
|
|
@@ -69,6 +69,8 @@ namespace SharpGLTF.Schema2
|
|
|
|
|
|
|
|
public static MeshPrimitive WithIndicesAutomatic(this MeshPrimitive primitive, PrimitiveType primitiveType)
|
|
public static MeshPrimitive WithIndicesAutomatic(this MeshPrimitive primitive, PrimitiveType primitiveType)
|
|
|
{
|
|
{
|
|
|
|
|
+ Guard.NotNull(primitive, nameof(primitive));
|
|
|
|
|
+
|
|
|
var root = primitive.LogicalParent.LogicalParent;
|
|
var root = primitive.LogicalParent.LogicalParent;
|
|
|
|
|
|
|
|
primitive.DrawPrimitiveType = primitiveType;
|
|
primitive.DrawPrimitiveType = primitiveType;
|
|
@@ -79,6 +81,9 @@ namespace SharpGLTF.Schema2
|
|
|
|
|
|
|
|
public static MeshPrimitive WithIndicesAccessor(this MeshPrimitive primitive, PrimitiveType primitiveType, IReadOnlyList<Int32> values)
|
|
public static MeshPrimitive WithIndicesAccessor(this MeshPrimitive primitive, PrimitiveType primitiveType, IReadOnlyList<Int32> values)
|
|
|
{
|
|
{
|
|
|
|
|
+ Guard.NotNull(primitive, nameof(primitive));
|
|
|
|
|
+ Guard.NotNull(values, nameof(values));
|
|
|
|
|
+
|
|
|
var root = primitive.LogicalParent.LogicalParent;
|
|
var root = primitive.LogicalParent.LogicalParent;
|
|
|
|
|
|
|
|
// create an index buffer and fill it
|
|
// create an index buffer and fill it
|
|
@@ -98,6 +103,9 @@ namespace SharpGLTF.Schema2
|
|
|
|
|
|
|
|
public static MeshPrimitive WithVertexAccessor(this MeshPrimitive primitive, string attribute, IReadOnlyList<Single> values)
|
|
public static MeshPrimitive WithVertexAccessor(this MeshPrimitive primitive, string attribute, IReadOnlyList<Single> values)
|
|
|
{
|
|
{
|
|
|
|
|
+ Guard.NotNull(primitive, nameof(primitive));
|
|
|
|
|
+ Guard.NotNull(values, nameof(values));
|
|
|
|
|
+
|
|
|
var root = primitive.LogicalParent.LogicalParent;
|
|
var root = primitive.LogicalParent.LogicalParent;
|
|
|
|
|
|
|
|
// create a vertex buffer and fill it
|
|
// create a vertex buffer and fill it
|
|
@@ -115,6 +123,9 @@ namespace SharpGLTF.Schema2
|
|
|
|
|
|
|
|
public static MeshPrimitive WithVertexAccessor(this MeshPrimitive primitive, string attribute, IReadOnlyList<Vector2> values)
|
|
public static MeshPrimitive WithVertexAccessor(this MeshPrimitive primitive, string attribute, IReadOnlyList<Vector2> values)
|
|
|
{
|
|
{
|
|
|
|
|
+ Guard.NotNull(primitive, nameof(primitive));
|
|
|
|
|
+ Guard.NotNull(values, nameof(values));
|
|
|
|
|
+
|
|
|
var root = primitive.LogicalParent.LogicalParent;
|
|
var root = primitive.LogicalParent.LogicalParent;
|
|
|
|
|
|
|
|
// create a vertex buffer and fill it
|
|
// create a vertex buffer and fill it
|
|
@@ -132,6 +143,9 @@ namespace SharpGLTF.Schema2
|
|
|
|
|
|
|
|
public static MeshPrimitive WithVertexAccessor(this MeshPrimitive primitive, string attribute, IReadOnlyList<Vector3> values)
|
|
public static MeshPrimitive WithVertexAccessor(this MeshPrimitive primitive, string attribute, IReadOnlyList<Vector3> values)
|
|
|
{
|
|
{
|
|
|
|
|
+ Guard.NotNull(primitive, nameof(primitive));
|
|
|
|
|
+ Guard.NotNull(values, nameof(values));
|
|
|
|
|
+
|
|
|
var root = primitive.LogicalParent.LogicalParent;
|
|
var root = primitive.LogicalParent.LogicalParent;
|
|
|
|
|
|
|
|
// create a vertex buffer and fill it
|
|
// create a vertex buffer and fill it
|
|
@@ -150,6 +164,9 @@ namespace SharpGLTF.Schema2
|
|
|
|
|
|
|
|
public static MeshPrimitive WithVertexAccessor(this MeshPrimitive primitive, string attribute, IReadOnlyList<Vector4> values)
|
|
public static MeshPrimitive WithVertexAccessor(this MeshPrimitive primitive, string attribute, IReadOnlyList<Vector4> values)
|
|
|
{
|
|
{
|
|
|
|
|
+ Guard.NotNull(primitive, nameof(primitive));
|
|
|
|
|
+ Guard.NotNull(values, nameof(values));
|
|
|
|
|
+
|
|
|
var root = primitive.LogicalParent.LogicalParent;
|
|
var root = primitive.LogicalParent.LogicalParent;
|
|
|
|
|
|
|
|
// create a vertex buffer and fill it
|
|
// create a vertex buffer and fill it
|
|
@@ -217,6 +234,9 @@ namespace SharpGLTF.Schema2
|
|
|
|
|
|
|
|
public static MeshPrimitive WithVertexAccessors(this MeshPrimitive primitive, IEnumerable<Memory.MemoryAccessor> memAccessors)
|
|
public static MeshPrimitive WithVertexAccessors(this MeshPrimitive primitive, IEnumerable<Memory.MemoryAccessor> memAccessors)
|
|
|
{
|
|
{
|
|
|
|
|
+ Guard.NotNull(memAccessors, nameof(memAccessors));
|
|
|
|
|
+ Guard.IsTrue(memAccessors.All(item => item != null), nameof(memAccessors));
|
|
|
|
|
+
|
|
|
foreach (var va in memAccessors) primitive.WithVertexAccessor(va);
|
|
foreach (var va in memAccessors) primitive.WithVertexAccessor(va);
|
|
|
|
|
|
|
|
return primitive;
|
|
return primitive;
|
|
@@ -224,6 +244,9 @@ namespace SharpGLTF.Schema2
|
|
|
|
|
|
|
|
public static MeshPrimitive WithVertexAccessor(this MeshPrimitive primitive, Memory.MemoryAccessor memAccessor)
|
|
public static MeshPrimitive WithVertexAccessor(this MeshPrimitive primitive, Memory.MemoryAccessor memAccessor)
|
|
|
{
|
|
{
|
|
|
|
|
+ Guard.NotNull(primitive, nameof(primitive));
|
|
|
|
|
+ Guard.NotNull(memAccessor, nameof(memAccessor));
|
|
|
|
|
+
|
|
|
var root = primitive.LogicalParent.LogicalParent;
|
|
var root = primitive.LogicalParent.LogicalParent;
|
|
|
|
|
|
|
|
primitive.SetVertexAccessor(memAccessor.Attribute.Name, root.CreateVertexAccessor(memAccessor));
|
|
primitive.SetVertexAccessor(memAccessor.Attribute.Name, root.CreateVertexAccessor(memAccessor));
|
|
@@ -233,6 +256,8 @@ namespace SharpGLTF.Schema2
|
|
|
|
|
|
|
|
public static MeshPrimitive WithIndicesAccessor(this MeshPrimitive primitive, PrimitiveType primitiveType, Memory.MemoryAccessor memAccessor)
|
|
public static MeshPrimitive WithIndicesAccessor(this MeshPrimitive primitive, PrimitiveType primitiveType, Memory.MemoryAccessor memAccessor)
|
|
|
{
|
|
{
|
|
|
|
|
+ Guard.NotNull(primitive, nameof(primitive));
|
|
|
|
|
+
|
|
|
var root = primitive.LogicalParent.LogicalParent;
|
|
var root = primitive.LogicalParent.LogicalParent;
|
|
|
|
|
|
|
|
var accessor = root.CreateAccessor();
|
|
var accessor = root.CreateAccessor();
|
|
@@ -251,6 +276,8 @@ namespace SharpGLTF.Schema2
|
|
|
|
|
|
|
|
public static MeshPrimitive WithMaterial(this MeshPrimitive primitive, Material material)
|
|
public static MeshPrimitive WithMaterial(this MeshPrimitive primitive, Material material)
|
|
|
{
|
|
{
|
|
|
|
|
+ Guard.NotNull(primitive, nameof(primitive));
|
|
|
|
|
+
|
|
|
primitive.Material = material;
|
|
primitive.Material = material;
|
|
|
return primitive;
|
|
return primitive;
|
|
|
}
|
|
}
|
|
@@ -259,6 +286,48 @@ namespace SharpGLTF.Schema2
|
|
|
|
|
|
|
|
#region evaluation
|
|
#region evaluation
|
|
|
|
|
|
|
|
|
|
+ public static int GetPrimitiveVertexSize(this PrimitiveType ptype)
|
|
|
|
|
+ {
|
|
|
|
|
+ switch (ptype)
|
|
|
|
|
+ {
|
|
|
|
|
+ case PrimitiveType.POINTS: return 1;
|
|
|
|
|
+ case PrimitiveType.LINES: return 2;
|
|
|
|
|
+ case PrimitiveType.LINE_LOOP: return 2;
|
|
|
|
|
+ case PrimitiveType.LINE_STRIP: return 2;
|
|
|
|
|
+ case PrimitiveType.TRIANGLES: return 3;
|
|
|
|
|
+ case PrimitiveType.TRIANGLE_FAN: return 3;
|
|
|
|
|
+ case PrimitiveType.TRIANGLE_STRIP: return 3;
|
|
|
|
|
+ default: throw new NotImplementedException();
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ public static IEnumerable<int> GetPointIndices(this MeshPrimitive primitive)
|
|
|
|
|
+ {
|
|
|
|
|
+ if (primitive == null || primitive.DrawPrimitiveType.GetPrimitiveVertexSize() != 1) return Enumerable.Empty<int>();
|
|
|
|
|
+
|
|
|
|
|
+ if (primitive.IndexAccessor == null) return Enumerable.Range(0, primitive.GetVertexAccessor("POSITION").Count);
|
|
|
|
|
+
|
|
|
|
|
+ return primitive.IndexAccessor.AsIndicesArray().Select(item => (int)item);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ public static IEnumerable<(int, int)> GetLineIndices(this MeshPrimitive primitive)
|
|
|
|
|
+ {
|
|
|
|
|
+ if (primitive == null || primitive.DrawPrimitiveType.GetPrimitiveVertexSize() != 2) return Enumerable.Empty<(int, int)>();
|
|
|
|
|
+
|
|
|
|
|
+ if (primitive.IndexAccessor == null) return primitive.DrawPrimitiveType.GetLinesIndices(primitive.GetVertexAccessor("POSITION").Count);
|
|
|
|
|
+
|
|
|
|
|
+ return primitive.DrawPrimitiveType.GetLinesIndices(primitive.IndexAccessor.AsIndicesArray());
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ public static IEnumerable<(int, int, int)> GetTriangleIndices(this MeshPrimitive primitive)
|
|
|
|
|
+ {
|
|
|
|
|
+ if (primitive == null || primitive.DrawPrimitiveType.GetPrimitiveVertexSize() != 3) return Enumerable.Empty<(int, int, int)>();
|
|
|
|
|
+
|
|
|
|
|
+ if (primitive.IndexAccessor == null) return primitive.DrawPrimitiveType.GetTrianglesIndices(primitive.GetVertexAccessor("POSITION").Count);
|
|
|
|
|
+
|
|
|
|
|
+ return primitive.DrawPrimitiveType.GetTrianglesIndices(primitive.IndexAccessor.AsIndicesArray());
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
public static IEnumerable<(IVertexBuilder, Material)> EvaluatePoints(this Mesh mesh, MESHXFORM xform = null)
|
|
public static IEnumerable<(IVertexBuilder, Material)> EvaluatePoints(this Mesh mesh, MESHXFORM xform = null)
|
|
|
{
|
|
{
|
|
|
if (mesh == null) return Enumerable.Empty<(IVertexBuilder, Material)>();
|
|
if (mesh == null) return Enumerable.Empty<(IVertexBuilder, Material)>();
|
|
@@ -275,7 +344,6 @@ namespace SharpGLTF.Schema2
|
|
|
if (!points.Any()) yield break;
|
|
if (!points.Any()) yield break;
|
|
|
|
|
|
|
|
var vertices = prim.GetVertexColumns(xform);
|
|
var vertices = prim.GetVertexColumns(xform);
|
|
|
-
|
|
|
|
|
var vtype = vertices.GetCompatibleVertexType();
|
|
var vtype = vertices.GetCompatibleVertexType();
|
|
|
|
|
|
|
|
foreach (var t in points)
|
|
foreach (var t in points)
|
|
@@ -302,7 +370,6 @@ namespace SharpGLTF.Schema2
|
|
|
if (!lines.Any()) yield break;
|
|
if (!lines.Any()) yield break;
|
|
|
|
|
|
|
|
var vertices = prim.GetVertexColumns(xform);
|
|
var vertices = prim.GetVertexColumns(xform);
|
|
|
-
|
|
|
|
|
var vtype = vertices.GetCompatibleVertexType();
|
|
var vtype = vertices.GetCompatibleVertexType();
|
|
|
|
|
|
|
|
foreach (var t in lines)
|
|
foreach (var t in lines)
|
|
@@ -330,7 +397,6 @@ namespace SharpGLTF.Schema2
|
|
|
if (!triangles.Any()) yield break;
|
|
if (!triangles.Any()) yield break;
|
|
|
|
|
|
|
|
var vertices = prim.GetVertexColumns(xform);
|
|
var vertices = prim.GetVertexColumns(xform);
|
|
|
-
|
|
|
|
|
var vtype = vertices.GetCompatibleVertexType();
|
|
var vtype = vertices.GetCompatibleVertexType();
|
|
|
|
|
|
|
|
foreach (var t in triangles)
|
|
foreach (var t in triangles)
|
|
@@ -343,25 +409,28 @@ namespace SharpGLTF.Schema2
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- public static IEnumerable<(VertexBuilder<TvG, TvM, TvS>, VertexBuilder<TvG, TvM, TvS>, VertexBuilder<TvG, TvM, TvS>, Material)> EvaluateTriangles<TvG, TvM, TvS>(this Mesh mesh)
|
|
|
|
|
|
|
+ public static IEnumerable<(VertexBuilder<TvG, TvM, TvS>, VertexBuilder<TvG, TvM, TvS>, VertexBuilder<TvG, TvM, TvS>, Material)> EvaluateTriangles<TvG, TvM, TvS>(this Mesh mesh, MESHXFORM xform = null)
|
|
|
where TvG : struct, IVertexGeometry
|
|
where TvG : struct, IVertexGeometry
|
|
|
where TvM : struct, IVertexMaterial
|
|
where TvM : struct, IVertexMaterial
|
|
|
where TvS : struct, IVertexSkinning
|
|
where TvS : struct, IVertexSkinning
|
|
|
{
|
|
{
|
|
|
if (mesh == null) return Enumerable.Empty<(VertexBuilder<TvG, TvM, TvS>, VertexBuilder<TvG, TvM, TvS>, VertexBuilder<TvG, TvM, TvS>, Material)>();
|
|
if (mesh == null) return Enumerable.Empty<(VertexBuilder<TvG, TvM, TvS>, VertexBuilder<TvG, TvM, TvS>, VertexBuilder<TvG, TvM, TvS>, Material)>();
|
|
|
|
|
|
|
|
- return mesh.Primitives.SelectMany(item => item.EvaluateTriangles<TvG, TvM, TvS>());
|
|
|
|
|
|
|
+ return mesh.Primitives.SelectMany(item => item.EvaluateTriangles<TvG, TvM, TvS>(xform));
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- public static IEnumerable<(VertexBuilder<TvG, TvM, TvS>, VertexBuilder<TvG, TvM, TvS>, VertexBuilder<TvG, TvM, TvS>, Material)> EvaluateTriangles<TvG, TvM, TvS>(this MeshPrimitive prim)
|
|
|
|
|
|
|
+ public static IEnumerable<(VertexBuilder<TvG, TvM, TvS>, VertexBuilder<TvG, TvM, TvS>, VertexBuilder<TvG, TvM, TvS>, Material)> EvaluateTriangles<TvG, TvM, TvS>(this MeshPrimitive prim, MESHXFORM xform = null)
|
|
|
where TvG : struct, IVertexGeometry
|
|
where TvG : struct, IVertexGeometry
|
|
|
where TvM : struct, IVertexMaterial
|
|
where TvM : struct, IVertexMaterial
|
|
|
where TvS : struct, IVertexSkinning
|
|
where TvS : struct, IVertexSkinning
|
|
|
{
|
|
{
|
|
|
if (prim == null) yield break;
|
|
if (prim == null) yield break;
|
|
|
|
|
+ if (xform != null && !xform.Visible) yield break;
|
|
|
|
|
|
|
|
- var vertices = prim.GetVertexColumns();
|
|
|
|
|
var triangles = prim.GetTriangleIndices();
|
|
var triangles = prim.GetTriangleIndices();
|
|
|
|
|
+ if (!triangles.Any()) yield break;
|
|
|
|
|
+
|
|
|
|
|
+ var vertices = prim.GetVertexColumns(xform);
|
|
|
|
|
|
|
|
bool hasNormals = vertices.Normals != null;
|
|
bool hasNormals = vertices.Normals != null;
|
|
|
|
|
|
|
@@ -384,77 +453,6 @@ namespace SharpGLTF.Schema2
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- public static IEnumerable<(VertexBuilder<TvG, TvM, VertexEmpty>, VertexBuilder<TvG, TvM, VertexEmpty>, VertexBuilder<TvG, TvM, VertexEmpty>, Material)> EvaluateTriangles<TvG, TvM>(this Mesh mesh, MESHXFORM xform)
|
|
|
|
|
- where TvG : struct, IVertexGeometry
|
|
|
|
|
- where TvM : struct, IVertexMaterial
|
|
|
|
|
- {
|
|
|
|
|
- if (mesh == null) return Enumerable.Empty<(VertexBuilder<TvG, TvM, VertexEmpty>, VertexBuilder<TvG, TvM, VertexEmpty>, VertexBuilder<TvG, TvM, VertexEmpty>, Material)>();
|
|
|
|
|
-
|
|
|
|
|
- return mesh.Primitives.SelectMany(item => item.EvaluateTriangles<TvG, TvM>(xform));
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- public static IEnumerable<(VertexBuilder<TvG, TvM, VertexEmpty>, VertexBuilder<TvG, TvM, VertexEmpty>, VertexBuilder<TvG, TvM, VertexEmpty>, Material)> EvaluateTriangles<TvG, TvM>(this MeshPrimitive prim, MESHXFORM xform)
|
|
|
|
|
- where TvG : struct, IVertexGeometry
|
|
|
|
|
- where TvM : struct, IVertexMaterial
|
|
|
|
|
- {
|
|
|
|
|
- if (prim == null) yield break;
|
|
|
|
|
- if (xform == null || !xform.Visible) yield break;
|
|
|
|
|
-
|
|
|
|
|
- var vertices = prim.GetVertexColumns(xform);
|
|
|
|
|
- var triangles = prim.GetTriangleIndices();
|
|
|
|
|
-
|
|
|
|
|
- foreach (var t in triangles)
|
|
|
|
|
- {
|
|
|
|
|
- var a = vertices.GetVertex<TvG, TvM>(t.Item1);
|
|
|
|
|
- var b = vertices.GetVertex<TvG, TvM>(xform.FlipFaces ? t.Item3 : t.Item2);
|
|
|
|
|
- var c = vertices.GetVertex<TvG, TvM>(xform.FlipFaces ? t.Item2 : t.Item3);
|
|
|
|
|
-
|
|
|
|
|
- yield return ((a.Geometry, a.Material), (b.Geometry, b.Material), (c.Geometry, c.Material), prim.Material);
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- public static IEnumerable<int> GetPointIndices(this MeshPrimitive primitive)
|
|
|
|
|
- {
|
|
|
|
|
- if (primitive == null || primitive.DrawPrimitiveType.GetPrimitiveVertexSize() != 1) return Enumerable.Empty<int>();
|
|
|
|
|
-
|
|
|
|
|
- if (primitive.IndexAccessor == null) return Enumerable.Range(0, primitive.GetVertexAccessor("POSITION").Count);
|
|
|
|
|
-
|
|
|
|
|
- return primitive.IndexAccessor.AsIndicesArray().Select(item => (int)item);
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- public static IEnumerable<(int, int)> GetLineIndices(this MeshPrimitive primitive)
|
|
|
|
|
- {
|
|
|
|
|
- if (primitive == null || primitive.DrawPrimitiveType.GetPrimitiveVertexSize() != 2) return Enumerable.Empty<(int, int)>();
|
|
|
|
|
-
|
|
|
|
|
- if (primitive.IndexAccessor == null) return primitive.DrawPrimitiveType.GetLinesIndices(primitive.GetVertexAccessor("POSITION").Count);
|
|
|
|
|
-
|
|
|
|
|
- return primitive.DrawPrimitiveType.GetLinesIndices(primitive.IndexAccessor.AsIndicesArray());
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- public static IEnumerable<(int, int, int)> GetTriangleIndices(this MeshPrimitive primitive)
|
|
|
|
|
- {
|
|
|
|
|
- if (primitive == null || primitive.DrawPrimitiveType.GetPrimitiveVertexSize() != 3) return Enumerable.Empty<(int, int, int)>();
|
|
|
|
|
-
|
|
|
|
|
- if (primitive.IndexAccessor == null) return primitive.DrawPrimitiveType.GetTrianglesIndices(primitive.GetVertexAccessor("POSITION").Count);
|
|
|
|
|
-
|
|
|
|
|
- return primitive.DrawPrimitiveType.GetTrianglesIndices(primitive.IndexAccessor.AsIndicesArray());
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- public static int GetPrimitiveVertexSize(this PrimitiveType ptype)
|
|
|
|
|
- {
|
|
|
|
|
- switch (ptype)
|
|
|
|
|
- {
|
|
|
|
|
- case PrimitiveType.POINTS: return 1;
|
|
|
|
|
- case PrimitiveType.LINES: return 2;
|
|
|
|
|
- case PrimitiveType.LINE_LOOP: return 2;
|
|
|
|
|
- case PrimitiveType.LINE_STRIP: return 2;
|
|
|
|
|
- case PrimitiveType.TRIANGLES: return 3;
|
|
|
|
|
- case PrimitiveType.TRIANGLE_FAN: return 3;
|
|
|
|
|
- case PrimitiveType.TRIANGLE_STRIP: return 3;
|
|
|
|
|
- default: throw new NotImplementedException();
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
#endregion
|
|
#endregion
|
|
|
|
|
|
|
|
#region mesh conversion
|
|
#region mesh conversion
|
|
@@ -554,16 +552,18 @@ namespace SharpGLTF.Schema2
|
|
|
where TvS : struct, IVertexSkinning
|
|
where TvS : struct, IVertexSkinning
|
|
|
{
|
|
{
|
|
|
Guard.NotNull(meshBuilder, nameof(meshBuilder));
|
|
Guard.NotNull(meshBuilder, nameof(meshBuilder));
|
|
|
|
|
+ Guard.NotNull(materialFunc, nameof(materialFunc));
|
|
|
|
|
|
|
|
if (srcMesh == null) return;
|
|
if (srcMesh == null) return;
|
|
|
|
|
|
|
|
- Guard.NotNull(materialFunc, nameof(materialFunc));
|
|
|
|
|
-
|
|
|
|
|
foreach (var srcPrim in srcMesh.Primitives)
|
|
foreach (var srcPrim in srcMesh.Primitives)
|
|
|
{
|
|
{
|
|
|
- var dstPrim = meshBuilder.UsePrimitive(materialFunc(srcPrim.Material));
|
|
|
|
|
|
|
+ if (srcPrim != null) continue;
|
|
|
|
|
+
|
|
|
|
|
+ var dstMat = materialFunc(srcPrim.Material);
|
|
|
|
|
+ var dstPrim = meshBuilder.UsePrimitive(dstMat);
|
|
|
|
|
|
|
|
- foreach (var tri in srcPrim.EvaluateTriangles<TvG, TvM, TvS>())
|
|
|
|
|
|
|
+ foreach (var tri in srcPrim.EvaluateTriangles<TvG, TvM, TvS>(null))
|
|
|
{
|
|
{
|
|
|
dstPrim.AddTriangle(tri.Item1, tri.Item2, tri.Item3);
|
|
dstPrim.AddTriangle(tri.Item1, tri.Item2, tri.Item3);
|
|
|
}
|
|
}
|
|
@@ -578,11 +578,11 @@ namespace SharpGLTF.Schema2
|
|
|
/// <typeparam name="TvG">A subtype of <see cref="IVertexGeometry"/></typeparam>
|
|
/// <typeparam name="TvG">A subtype of <see cref="IVertexGeometry"/></typeparam>
|
|
|
/// <typeparam name="TvM">A subtype of <see cref="IVertexMaterial"/></typeparam>
|
|
/// <typeparam name="TvM">A subtype of <see cref="IVertexMaterial"/></typeparam>
|
|
|
/// <param name="srcScene">The source <see cref="Scene"/> to evaluate.</param>
|
|
/// <param name="srcScene">The source <see cref="Scene"/> to evaluate.</param>
|
|
|
|
|
+ /// <param name="materialFunc">A function to convert <see cref="Material"/> into <typeparamref name="TMaterial"/>.</param>
|
|
|
/// <param name="animation">The source <see cref="Animation"/> to evaluate.</param>
|
|
/// <param name="animation">The source <see cref="Animation"/> to evaluate.</param>
|
|
|
/// <param name="time">A time point, in seconds, within <paramref name="animation"/>.</param>
|
|
/// <param name="time">A time point, in seconds, within <paramref name="animation"/>.</param>
|
|
|
- /// <param name="materialFunc">A function to convert <see cref="Material"/> into <typeparamref name="TMaterial"/>.</param>
|
|
|
|
|
/// <returns>A new <see cref="MeshBuilder{TMaterial, TvG, TvM, TvS}"/> containing the evaluated geometry.</returns>
|
|
/// <returns>A new <see cref="MeshBuilder{TMaterial, TvG, TvM, TvS}"/> containing the evaluated geometry.</returns>
|
|
|
- public static MeshBuilder<TMaterial, TvG, TvM, VertexEmpty> ToStaticMeshBuilder<TMaterial, TvG, TvM>(this Scene srcScene, Animation animation, float time, Func<Material, TMaterial> materialFunc)
|
|
|
|
|
|
|
+ public static MeshBuilder<TMaterial, TvG, TvM, VertexEmpty> ToStaticMeshBuilder<TMaterial, TvG, TvM>(this Scene srcScene, Func<Material, TMaterial> materialFunc, Animation animation, float time)
|
|
|
where TvG : struct, IVertexGeometry
|
|
where TvG : struct, IVertexGeometry
|
|
|
where TvM : struct, IVertexMaterial
|
|
where TvM : struct, IVertexMaterial
|
|
|
{
|
|
{
|
|
@@ -624,7 +624,7 @@ namespace SharpGLTF.Schema2
|
|
|
return materials[srcMaterial] = dstMaterial;
|
|
return materials[srcMaterial] = dstMaterial;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- return srcScene.ToStaticMeshBuilder<Materials.MaterialBuilder, TvG, TvM>(animation, time, convertMaterial);
|
|
|
|
|
|
|
+ return srcScene.ToStaticMeshBuilder<Materials.MaterialBuilder, TvG, TvM>(convertMaterial, animation, time);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
public static IMeshBuilder<Materials.MaterialBuilder> ToMeshBuilder(this Mesh srcMesh)
|
|
public static IMeshBuilder<Materials.MaterialBuilder> ToMeshBuilder(this Mesh srcMesh)
|
|
@@ -675,7 +675,7 @@ namespace SharpGLTF.Schema2
|
|
|
foreach (var srcTri in srcMesh.EvaluateLines())
|
|
foreach (var srcTri in srcMesh.EvaluateLines())
|
|
|
{
|
|
{
|
|
|
var dstPrim = GetPrimitive(srcTri.Item3, 2);
|
|
var dstPrim = GetPrimitive(srcTri.Item3, 2);
|
|
|
- dstPrim.AddLine(srcTri.Item1,srcTri.Item2);
|
|
|
|
|
|
|
+ dstPrim.AddLine(srcTri.Item1, srcTri.Item2);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
foreach (var srcTri in srcMesh.EvaluateTriangles())
|
|
foreach (var srcTri in srcMesh.EvaluateTriangles())
|