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));
        }
Exemple #2
0
 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));
 }
Exemple #5
0
 public FileSystemCasingConflict(Graft graft)
 {
     Graft = graft;
 }
Exemple #6
0
    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));
    }