コード例 #1
0
    public static SubdivisionTopologyInfo Combine(SubdivisionTopologyInfo infoA, SubdivisionTopologyInfo infoB)
    {
        int offset = infoA.VertexRules.Length;

        PackedLists <int> combinedAdjancentVertices = PackedLists <int> .Concat(
            infoA.AdjacentVertices,
            infoB.AdjacentVertices.Map(neighbourIdx => neighbourIdx + offset));

        VertexRule[] combinedVertexRules = Enumerable.Concat(infoA.VertexRules, infoB.VertexRules).ToArray();

        return(new SubdivisionTopologyInfo(combinedAdjancentVertices, combinedVertexRules));
    }
コード例 #2
0
 public UVSetDumper(
     Figure figure,
     SurfaceProperties surfaceProperties,
     DirectoryInfo uvSetsDirectory,
     Quad[] spatialFaces, SubdivisionTopologyInfo spatialTopologyInfo)
 {
     this.figure              = figure;
     this.surfaceProperties   = surfaceProperties;
     this.uvSetsDirectory     = uvSetsDirectory;
     this.spatialFaces        = spatialFaces;
     this.spatialTopologyInfo = spatialTopologyInfo;
 }
コード例 #3
0
    public static void DumpFigure(Figure figure, SurfaceProperties surfaceProperties, DirectoryInfo figureDestDir)
    {
        DirectoryInfo refinementDirectory = figureDestDir.Subdirectory("refinement").Subdirectory("level-" + surfaceProperties.SubdivisionLevel);

        Quad[] spatialFaces = refinementDirectory.File("faces.array").ReadArray <Quad>();
        SubdivisionTopologyInfo spatialTopologyInfo = Persistance.Load <SubdivisionTopologyInfo>(UnpackedArchiveFile.Make(refinementDirectory.File("topology-info.dat")));

        DirectoryInfo uvSetsDirectory = figureDestDir.Subdirectory("uv-sets");
        UVSetDumper   dumper          = new UVSetDumper(figure, surfaceProperties, uvSetsDirectory, spatialFaces, spatialTopologyInfo);

        foreach (var pair in figure.UvSets)
        {
            dumper.Dump(pair.Key, pair.Value);
        }
    }
コード例 #4
0
    public static RefinementResult Combine(RefinementResult resultA, RefinementResult resultB)
    {
        SubdivisionMesh combinedMesh = SubdivisionMesh.Combine(
            resultA.Mesh,
            resultB.Mesh);

        SubdivisionTopologyInfo combinedTopologyInfo = SubdivisionTopologyInfo.Combine(
            resultA.TopologyInfo,
            resultB.TopologyInfo);

        int[] combinedControlFaceMap = Enumerable.Concat(
            resultA.ControlFaceMap,
            resultB.ControlFaceMap).ToArray();

        return(new RefinementResult(combinedMesh, combinedTopologyInfo, combinedControlFaceMap));
    }
コード例 #5
0
    public static RefinementResult Make(QuadTopology controlTopology, int[] controlSurfaceMap, int refinementLevel, bool derivativesOnly)
    {
        if (controlTopology.Faces.Length == 0 && controlTopology.VertexCount == 0)
        {
            return(RefinementResult.Empty);
        }

        PackedLists <WeightedIndex> limitStencils, limitDuStencils, limitDvStencils;
        QuadTopology            refinedTopology;
        SubdivisionTopologyInfo refinedTopologyInfo;

        int[] controlFaceMap;
        using (var refinement = new Refinement(controlTopology, refinementLevel)) {
            limitStencils   = refinement.GetStencils(StencilKind.LimitStencils);
            limitDuStencils = refinement.GetStencils(StencilKind.LimitDuStencils);
            limitDvStencils = refinement.GetStencils(StencilKind.LimitDvStencils);
            refinedTopology = refinement.GetTopology();

            var adjacentVertices = refinement.GetAdjacentVertices();
            var rules            = refinement.GetVertexRules();
            refinedTopologyInfo = new SubdivisionTopologyInfo(adjacentVertices, rules);

            controlFaceMap = refinement.GetFaceMap();
        }

        if (derivativesOnly)
        {
            if (refinementLevel != 0)
            {
                throw new InvalidOperationException("derivatives-only mode can only be used at refinement level 0");
            }

            limitStencils = PackedLists <WeightedIndex> .Pack(Enumerable.Range(0, controlTopology.VertexCount)
                                                              .Select(vertexIdx => {
                var selfWeight = new WeightedIndex(vertexIdx, 1);
                return(new List <WeightedIndex> {
                    selfWeight
                });
            }).ToList());
        }

        PackedLists <WeightedIndexWithDerivatives> stencils = WeightedIndexWithDerivatives.Merge(limitStencils, limitDuStencils, limitDvStencils);
        var refinedMesh = new SubdivisionMesh(controlTopology.VertexCount, refinedTopology, stencils);

        return(new RefinementResult(refinedMesh, refinedTopologyInfo, controlFaceMap));
    }
コード例 #6
0
 public RefinementResult(SubdivisionMesh mesh, SubdivisionTopologyInfo topologyInfo, int[] controlFaceMap)
 {
     Mesh           = mesh;
     TopologyInfo   = topologyInfo;
     ControlFaceMap = controlFaceMap;
 }