Esempio n. 1
0
    public static FigureRecipe ImportFor(string figureName, DsonObjectLocator locator, FigureUris figureUris, FigureRecipe parentRecipe, double hdCorrectionInitialValue)
    {
        var geometryRecipe = GeometryImporter.ImportForFigure(locator, figureUris);

        FigureRecipe recipe = new FigureRecipe {
            Name        = figureName,
            Geometry    = geometryRecipe,
            Channels    = ChannelImporter.ImportForFigure(locator, figureUris).ToList(),
            Formulas    = FormulaImporter.ImportForFigure(locator, figureUris).ToList(),
            Bones       = BoneImporter.ImportForFigure(locator, figureUris).ToList(),
            Morphs      = MorphImporter.ImportForFigure(locator, figureUris).ToList(),
            SkinBinding = SkinBindingImporter.ImportForFigure(locator, figureUris),
            UvSets      = UvSetImporter.ImportForFigure(locator, figureUris, geometryRecipe).ToList()
        };

        Geometry geometry = recipe.Geometry.Bake();

        var correctionSynthesizer = new HdCorrectionMorphSynthesizer(figureName, geometry);

        recipe.Channels.Add(correctionSynthesizer.SynthesizeChannel(hdCorrectionInitialValue));
        recipe.Morphs.Add(correctionSynthesizer.SynthesizeMorph());

        if (parentRecipe != null)
        {
            Geometry parentGeometry = parentRecipe.Geometry.Bake();
            recipe.Automorpher = AutomorpherRecipe.Make(parentGeometry, geometry);
        }

        return(recipe);
    }
    public FigureRecipe Merge()
    {
        GeometryRecipe       mergedGeometry    = MergeGeometry();
        List <ChannelRecipe> mergedChannels    = MergeChannels();
        List <FormulaRecipe> mergedFormulas    = MergeFormulas();
        List <BoneRecipe>    mergedBones       = MergeBones();
        List <MorphRecipe>   mergedMorphs      = MergeMorphs(mergedFormulas);
        AutomorpherRecipe    mergedAutomorpher = MergeAutomorpher();
        SkinBindingRecipe    mergedSkinBinding = MergeSkinBinding();
        List <UvSetRecipe>   mergedUvSets      = MergeUvSets();

        return(new FigureRecipe {
            Name = parent.Name,
            Geometry = mergedGeometry,
            Channels = mergedChannels,
            Formulas = mergedFormulas,
            Bones = mergedBones,
            Morphs = mergedMorphs,
            Automorpher = mergedAutomorpher,
            SkinBinding = mergedSkinBinding,
            UvSets = mergedUvSets
        });
    }
    public static GeometryRecipe Merge(FigureRecipeMerger.Reindexer reindexer, GeometryRecipe parent, GeometryRecipe[] children, AutomorpherRecipe[] childAutomorphers)
    {
        List <Quad>    mergedFaces           = new List <Quad>();
        List <int>     mergedFaceGroupMap    = new List <int>();
        List <int>     mergedSurfaceMap      = new List <int>();
        List <Vector3> mergedVertexPositions = new List <Vector3>();
        List <string>  mergedSurfaceNames    = new List <string>();

        for (int faceIdx = 0; faceIdx < parent.Faces.Length; faceIdx++)
        {
            if (reindexer.IsParentFaceHidden(faceIdx))
            {
                continue;
            }

            mergedFaces.Add(parent.Faces[faceIdx]);
            mergedFaceGroupMap.Add(parent.FaceGroupMap[faceIdx]);
            mergedSurfaceMap.Add(parent.SurfaceMap[faceIdx]);
        }

        mergedVertexPositions.AddRange(parent.VertexPositions);
        mergedSurfaceNames.AddRange(parent.SurfaceNames);

        for (int childIdx = 0; childIdx < children.Length; ++childIdx)
        {
            GeometryRecipe    child       = children[childIdx];
            AutomorpherRecipe automorpher = childAutomorphers[childIdx];

            Dictionary <int, int> graftVertexMap = new Dictionary <int, int>();
            if (child.Graft != null)
            {
                foreach (var pair in child.Graft.VertexPairs)
                {
                    graftVertexMap[pair.Source] = pair.Target;
                }
            }

            FigureRecipeMerger.Offset offset = reindexer.ChildOffsets[childIdx];

            if (child.Type != parent.Type)
            {
                throw new InvalidOperationException("children must have same geometry type as parent");
            }

            mergedSurfaceNames.AddRange(child.SurfaceNames);

            /*
             * Children start "turned off" so instead of adding the child's base vertex positions here, I add the
             * nearest positions on the parent's surface. Later I'll add a morph that moves the child vertices
             * into place.
             */
            mergedVertexPositions.AddRange(automorpher.ParentSurfacePositions);

            foreach (Quad face in child.Faces)
            {
                mergedFaces.Add(face.Map(idx => {
                    if (graftVertexMap.TryGetValue(idx, out int graftIdx))
                    {
                        return(graftIdx);
                    }
                    else
                    {
                        return(idx + offset.Vertex);
                    }
                }));
            }

            int[] childToParentFaceGroupIdx = new int[child.FaceGroupNames.Length];
            for (int childFaceGroupIdx = 0; childFaceGroupIdx < child.FaceGroupNames.Length; ++childFaceGroupIdx)
            {
                string faceGroupName      = child.FaceGroupNames[childFaceGroupIdx];
                int    parentFaceGroupIdx = Array.FindIndex(parent.FaceGroupNames, name => name == faceGroupName);
                childToParentFaceGroupIdx[childFaceGroupIdx] = parentFaceGroupIdx;
            }

            foreach (int childFaceGroupIdx in child.FaceGroupMap)
            {
                int parentFaceGroupIdx = childToParentFaceGroupIdx[0];
                mergedFaceGroupMap.Add(parentFaceGroupIdx);
            }

            foreach (int surfaceIdx in child.SurfaceMap)
            {
                mergedSurfaceMap.Add(surfaceIdx + offset.Surface);
            }
        }

        return(new GeometryRecipe(
                   parent.Type,
                   mergedFaces.ToArray(),
                   mergedFaceGroupMap.ToArray(),
                   mergedSurfaceMap.ToArray(),
                   mergedVertexPositions.ToArray(),
                   parent.FaceGroupNames,
                   mergedSurfaceNames.ToArray(),
                   parent.DefaultUvSet,
                   null));
    }