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