Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
 private static IEnumerable <EvaluatedTriangle <TvG, TvM, TvS> > _EvaluateTriangles(Material material, VertexBufferColumns vertices, IEnumerable <(int A, int B, int C)> indices)
Ejemplo n.º 4
0
 public _NormalTangentAgent(VertexBufferColumns vertices, IEnumerable <(int A, int B, int C)> indices)
Ejemplo n.º 5
0
        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();
            }
        }