public static Reindexer Make(FigureRecipe parent, FigureRecipe[] children) { int childCount = children.Length; //build hidden face set int parentFaceCount = parent.Geometry.Faces.Length; bool[] hiddenFaceSet = new bool[parentFaceCount]; for (int childIdx = 0; childIdx < children.Length; ++childIdx) { Graft graft = children[childIdx].Geometry.Graft; if (graft != null) { foreach (int hiddenFace in graft.HiddenFaces) { hiddenFaceSet[hiddenFace] = true; } } } //build parent face map int[] parentFaceMap = new int[parent.Geometry.Faces.Length]; int nonHiddenParentFaceCount = 0; for (int faceIdx = 0; faceIdx < parentFaceCount; ++faceIdx) { if (hiddenFaceSet[faceIdx]) { parentFaceMap[faceIdx] = -1; } else { parentFaceMap[faceIdx] = nonHiddenParentFaceCount; nonHiddenParentFaceCount += 1; } } //build child offsets and totals Offset[] offsets = new Offset[childCount]; Offset currentOffset = new Offset( parent.Geometry.GetVertexCount(), nonHiddenParentFaceCount, parent.Geometry.GetSurfaceCount() ); for (int i = 0; i < childCount; ++i) { offsets[i] = currentOffset; FigureRecipe currentFigure = children[i]; currentOffset = currentOffset.Add( currentFigure.Geometry.GetVertexCount(), currentFigure.Geometry.Faces.Length, currentFigure.Geometry.GetSurfaceCount()); } Offset totals = currentOffset; return(new Reindexer(parentFaceMap, offsets, totals)); }
public Geometry(GeometryType type, Quad[] faces, int[] faceGroupMap, int[] surfaceMap, Vector3[] vertexPositions, string[] faceGroupNames, string[] surfaceNames, Graft graft) { Type = type; Faces = faces; FaceGroupMap = faceGroupMap; SurfaceMap = surfaceMap; VertexPositions = vertexPositions; FaceGroupNames = faceGroupNames; SurfaceNames = surfaceNames; Graft = graft; }
public GeometryRecipe(GeometryType type, Quad[] faces, int[] faceGroupMap, int[] surfaceMap, Vector3[] vertexPositions, string[] faceGroupNames, string[] surfaceNames, string defaultUvSet, Graft graft) { Type = type; Faces = faces; VertexPositions = vertexPositions; FaceGroupMap = faceGroupMap; SurfaceMap = surfaceMap; FaceGroupNames = faceGroupNames; SurfaceNames = surfaceNames; DefaultUvSet = defaultUvSet; Graft = graft; }
public DuplicateGraftDeclaration(Graft duplicate, Graft original) { Duplicate = duplicate ?? throw new ArgumentNullException(nameof(duplicate)); Original = original ?? throw new ArgumentNullException(nameof(original)); }
public FileSystemCasingConflict(Graft graft) { Graft = graft; }
public void Import(DsonTypes.Geometry geometry) { GeometryType type; if (geometry.type == DsonTypes.GeometryType.PolygonMesh) { type = GeometryType.PolygonMesh; } else if (geometry.type == DsonTypes.GeometryType.SubdivisionSurface) { type = GeometryType.SubdivisionSurface; } else { throw new InvalidOperationException("unrecognized geometry type: " + geometry.type); } Quad[] faces = geometry.polylist.values .Select(values => { if (values.Length == Quad.SideCount + 2) { return(new Quad(values[2], values[3], values[4], values[5])); } else if (values.Length == Quad.SideCount + 2 - 1) { return(Quad.MakeDegeneratedIntoTriangle(values[2], values[3], values[4])); } else { throw new InvalidOperationException("expected only quads and tris"); } }).ToArray(); string[] faceGroupNames = geometry.polygon_groups.values; string[] surfaceNames = geometry.polygon_material_groups.values; int[] faceGroupMap = geometry.polylist.values .Select(values => { return(values[0]); }).ToArray(); int[] surfaceMap = geometry.polylist.values .Select(values => { return(values[1]); }).ToArray(); Vector3[] vertexPositions = geometry.vertices.values .Select(values => FromArray(values)) .ToArray(); string defaultUvSet = geometry.default_uv_set.ReferencedObject.name; Graft graft; if (geometry.graft != null && (geometry.graft.hidden_polys != null || geometry.graft.vertex_pairs != null)) { Graft.VertexPair[] vertexPairs = geometry.graft.vertex_pairs.values .Select(values => new Graft.VertexPair(values[0], values[1])) .ToArray(); int[] hiddenFaces = geometry.graft.hidden_polys.values; graft = new Graft(vertexPairs, hiddenFaces); } else { graft = null; } recipes.Add(new GeometryRecipe(type, faces, faceGroupMap, surfaceMap, vertexPositions, faceGroupNames, surfaceNames, defaultUvSet, graft)); }