Example #1
0
            public static ObjGeometry MergeGeometries(IEnumerable <ObjGeometry> geometries, ObjMaterial material)
            {
                ObjGeometry mergedGeometry = new ObjGeometry(material);

                foreach (ObjGeometry item in geometries)
                {
                    mergedGeometry.Faces.AddRange(item.Faces);
                }

                return(mergedGeometry);
            }
Example #2
0
            public List <ObjGeometry> MergeGeometries()
            {
                List <ObjGeometry> geometries = new List <ObjGeometry>(Geometries);
                List <ObjGeometry> merged     = new List <ObjGeometry>(Geometries.Count);

                while (geometries.Count > 0)
                {
                    ObjMaterial        mergedMaterial    = geometries[0].Material;
                    List <ObjGeometry> mergingGeometries = geometries.FindAll(delegate(ObjGeometry item) {
                        return(item.Material == mergedMaterial);
                    });

                    merged.Add(ObjGeometry.MergeGeometries(mergingGeometries, mergedMaterial));

                    foreach (ObjGeometry item in mergingGeometries)
                    {
                        geometries.Remove(item);
                    }
                }

                return(merged);
            }
Example #3
0
        private static void ParseFace(ObjContext objContext, string[] token)
        {
            if (objContext == null)
            {
                throw new ArgumentNullException("objContext");
            }
            if (token == null)
            {
                throw new ArgumentNullException("token");
            }
            if (token.Length < 3)
            {
                throw new ArgumentException("wrong array length", "token");
            }

            if (objContext.Groups.Count == 0)
            {
                throw new InvalidOperationException("no group");
            }
            ObjGroup objGroup = objContext.Groups[objContext.Groups.Count - 1];

            if (objGroup.Geometries.Count == 0)
            {
                throw new InvalidOperationException("no geometry");
            }
            ObjGeometry objGeometry = objGroup.Geometries[objGroup.Geometries.Count - 1];

            ObjFace objFace = new ObjFace();

            foreach (string values in token)
            {
                string[] indices       = Regex.Split(values, "/");
                int[]    indicesValues = Array.ConvertAll(indices, delegate(string item) {
                    if (String.IsNullOrEmpty(item) == false)
                    {
                        return(Int32.Parse(item, NumberFormatInfo.InvariantInfo));
                    }
                    else
                    {
                        return(Int32.MinValue);
                    }
                });

                int indexVertex   = indicesValues[0];
                int indexNormal   = indicesValues[2];
                int indexTexCoord = indicesValues[1];

                ObjFaceCoord objFaceCoord = new ObjFaceCoord();

                // Position
                if (indexVertex < 0)
                {
                    indexVertex = objContext.Vertices.Count + indexVertex + 1;
                }
                objFaceCoord.VertexIndex = indexVertex - 1;

                // Normal (optional)
                if (indexNormal != Int32.MinValue)
                {
                    if (indexNormal < 0)
                    {
                        indexNormal = objContext.Normals.Count + indexNormal + 1;
                    }
                    objFaceCoord.NormalIndex = indexNormal - 1;
                }

                // Tex coord (optional)
                if (indexTexCoord != Int32.MinValue)
                {
                    if (indexTexCoord < 0)
                    {
                        indexTexCoord = objContext.TextureCoords.Count + indexTexCoord + 1;
                    }
                    objFaceCoord.TexCoordIndex = indexTexCoord - 1;
                }

                objFace.Coords.Add(objFaceCoord);
            }

            objGeometry.Faces.Add(objFace);
        }