public static VertexBufferColumns GetVertexColumns(this MeshPrimitive primitive) { Guard.NotNull(primitive, nameof(primitive)); var columns = new VertexBufferColumns(); _Initialize(primitive.VertexAccessors, columns); for (int i = 0; i < primitive.MorphTargetsCount; ++i) { var morphTarget = primitive.GetMorphTargetAccessors(i); _Initialize(morphTarget, columns.AddMorphTarget()); } return(columns); }
private static IReadOnlyList <(Material Material, VertexBufferColumns Vertices, IEnumerable <(int, int, int)> Triangles)> _GatherMeshGeometry(Mesh mesh) { var primitives = mesh.Primitives .Where(prim => prim.GetTriangleIndices().Any()) .Select(prim => (prim.Material, prim.GetVertexColumns(), (IEnumerable <(int, int, int)>)prim.GetTriangleIndices().ToList())) .ToList(); bool needsNormals = default(TvG).TryGetNormal(out Vector3 nrm); bool needsTangents = default(TvG).TryGetTangent(out Vector4 tgt); if (needsNormals) { var prims = primitives .Where(p => p.Item2.Normals == null) .Select(p => (p.Item2, p.Item3)) .ToList(); if (prims.Any()) { VertexBufferColumns.CalculateSmoothNormals(prims); } } if (needsTangents) { var prims = primitives .Where(p => p.Item2.Tangents == null && p.Item2.TexCoords0 != null) .Select(p => (p.Item2, p.Item3)) .ToList(); if (prims.Any()) { VertexBufferColumns.CalculateTangents(prims); } } return(primitives); }
private static IEnumerable <EvaluatedTriangle <TvG, TvM, TvS> > _EvaluateTriangles(Material material, VertexBufferColumns vertices, IEnumerable <(int A, int B, int C)> indices)
public _NormalTangentAgent(VertexBufferColumns vertices, IEnumerable <(int A, int B, int C)> indices)
private static void _Initialize(IReadOnlyDictionary <string, Accessor> vertexAccessors, VertexBufferColumns dstColumns) { if (vertexAccessors.ContainsKey("POSITION")) { dstColumns.Positions = vertexAccessors["POSITION"].AsVector3Array(); } if (vertexAccessors.ContainsKey("NORMAL")) { dstColumns.Normals = vertexAccessors["NORMAL"].AsVector3Array(); } if (vertexAccessors.ContainsKey("TANGENT")) { dstColumns.Tangents = vertexAccessors["TANGENT"].AsColorArray(0); } if (vertexAccessors.ContainsKey("COLOR_0")) { dstColumns.Colors0 = vertexAccessors["COLOR_0"].AsColorArray(1); } if (vertexAccessors.ContainsKey("COLOR_1")) { dstColumns.Colors1 = vertexAccessors["COLOR_1"].AsColorArray(1); } if (vertexAccessors.ContainsKey("TEXCOORD_0")) { dstColumns.TexCoords0 = vertexAccessors["TEXCOORD_0"].AsVector2Array(); } if (vertexAccessors.ContainsKey("TEXCOORD_1")) { dstColumns.TexCoords1 = vertexAccessors["TEXCOORD_1"].AsVector2Array(); } if (vertexAccessors.ContainsKey("TEXCOORD_2")) { dstColumns.TexCoords2 = vertexAccessors["TEXCOORD_2"].AsVector2Array(); } if (vertexAccessors.ContainsKey("TEXCOORD_3")) { dstColumns.TexCoords3 = vertexAccessors["TEXCOORD_3"].AsVector2Array(); } if (vertexAccessors.ContainsKey("JOINTS_0")) { dstColumns.Joints0 = vertexAccessors["JOINTS_0"].AsVector4Array(); } if (vertexAccessors.ContainsKey("JOINTS_1")) { dstColumns.Joints1 = vertexAccessors["JOINTS_1"].AsVector4Array(); } if (vertexAccessors.ContainsKey("WEIGHTS_0")) { dstColumns.Weights0 = vertexAccessors["WEIGHTS_0"].AsVector4Array(); } if (vertexAccessors.ContainsKey("WEIGHTS_1")) { dstColumns.Weights1 = vertexAccessors["WEIGHTS_1"].AsVector4Array(); } }