コード例 #1
0
        private ObjVNFFace ParseFace(string[] parts)
        {
            ObjVNFFace result = null;

            if (parts.Length == 4)// f 1 2 3
            {
                uint v0, v1, v2, n0, n1, n2, t0, t1, t2;
                ParseFaceUnit(parts[1], out v0, out n0, out t0);
                ParseFaceUnit(parts[2], out v1, out n1, out t1);
                ParseFaceUnit(parts[3], out v2, out n2, out t2);
                // index in obj files starts with 1.
                result = new ObjVNFTriangle(v0 - 1, v1 - 1, v2 - 1, n0 - 1, n1 - 1, n2 - 1, t0 - 1, t1 - 1, t2 - 1);
            }
            else if (parts.Length == 5)// f 1 2 3 4
            {
                uint v0, v1, v2, v3, n0, n1, n2, n3, t0, t1, t2, t3;
                ParseFaceUnit(parts[1], out v0, out n0, out t0);
                ParseFaceUnit(parts[2], out v1, out n1, out t1);
                ParseFaceUnit(parts[3], out v2, out n2, out t2);
                ParseFaceUnit(parts[4], out v3, out n3, out t3);

                // index in obj files starts with 1.
                result = new ObjVNFQuad(v0 - 1, v1 - 1, v2 - 1, v3 - 1, n0 - 1, n1 - 1, n2 - 1, n3 - 1, t0 - 1, t1 - 1, t2 - 1, t3 - 1);
            }
            else
            {
                throw new Exception(string.Format("unexpected line parts[{0}]", parts.Length));
            }

            return(result);
        }
コード例 #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;
            }
        }
コード例 #3
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[] vertexIndexes = face.VertexIndexes();

                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;
            }
        }