Esempio n. 1
0
        private vec3[] ArrangeNormals(ObjVNFContext context)
        {
            var        normals = new vec3[context.vertexCount];
            ObjVNFMesh mesh    = context.Mesh;

            for (int i = 0; i < context.faceCount; i++)
            {
                ObjVNFFace face          = mesh.faces[i];
                uint[]     normalIndexes = (from item in face.NormalIndexes() select item).ToArray();
                uint[]     vertexIndexes = (from item in face.VertexIndexes() select item).ToArray();

                if (normalIndexes.Length != vertexIndexes.Length)
                {
                    throw new Exception(string.Format(
                                            "normalIndexes.Length [{0}] != vertexIndexes.Length [{1}]!",
                                            normalIndexes.Length, vertexIndexes.Length));
                }

                for (int t = 0; t < vertexIndexes.Length; t++)
                {
                    normals[vertexIndexes[t]] = mesh.normals[normalIndexes[t]];
                }
            }

            return(normals);
        }
Esempio n. 2
0
        /// <summary>
        /// Reads mesh's vertex count, normal count and face count.
        /// </summary>
        /// <param name="context"></param>
        public override void Parse(ObjVNFContext context)
        {
            int        triangleFaceCount = 0;
            ObjVNFMesh mesh = context.Mesh;

            for (int i = 0; i < context.faceCount; i++)
            {
                ObjVNFFace face          = mesh.faces[i];
                uint[]     normalIndexes = (from item in face.NormalIndexes() select item).ToArray();
                uint[]     vertexIndexes = (from item in face.VertexIndexes() select item).ToArray();

                if (normalIndexes.Length != vertexIndexes.Length)
                {
                    throw new Exception(string.Format(
                                            "normalIndexes.Length [{0}] != vertexIndexes.Length [{0}]!",
                                            normalIndexes.Length, vertexIndexes.Length));
                }

                if (face is ObjVNFTriangle)
                {
                    triangleFaceCount++;
                }
                else if (face is ObjVNFQuad)
                {
                    triangleFaceCount += 2;
                }
            }

            if (triangleFaceCount != context.faceCount)
            {
                var faces = new ObjVNFTriangle[triangleFaceCount];
                for (int i = 0, j = 0; i < context.faceCount; i++)
                {
                    ObjVNFFace face = mesh.faces[i];
                    if (face is ObjVNFTriangle)
                    {
                        faces[j++] = face as ObjVNFTriangle;
                    }
                    else if (face is ObjVNFQuad)
                    {
                        var quad = face as ObjVNFQuad;
                        faces[j++] = new ObjVNFTriangle(
                            quad.vertexIndexes[0], quad.vertexIndexes[1], quad.vertexIndexes[2],
                            quad.normalIndexes[0], quad.normalIndexes[1], quad.normalIndexes[2],
                            quad.texCoordIndexes[0], quad.texCoordIndexes[1], quad.texCoordIndexes[2]);
                        faces[j++] = new ObjVNFTriangle(
                            quad.vertexIndexes[0], quad.vertexIndexes[2], quad.vertexIndexes[3],
                            quad.normalIndexes[0], quad.normalIndexes[2], quad.normalIndexes[3],
                            quad.texCoordIndexes[0], quad.texCoordIndexes[2], quad.texCoordIndexes[3]);
                    }
                }
                mesh.faces        = faces;
                context.faceCount = triangleFaceCount;
            }
        }