public static SkinBindingRecipe Merge(FigureRecipeMerger.Reindexer reindexer, SkinBindingRecipe parentSkinBinding, SkinBindingRecipe[] childSkinBindings)
    {
        List <string>            mergedBones = new List <string>(parentSkinBinding.BoneNames);
        Dictionary <string, int> mergedBonesIndicesByName = Enumerable.Range(0, mergedBones.Count)
                                                            .ToDictionary(idx => mergedBones[idx], idx => idx);

        PackedLists <BoneWeight> mergedBoneWeights = parentSkinBinding.BoneWeights;

        foreach (SkinBindingRecipe childSkinBinding in childSkinBindings)
        {
            var remappedChildBoneWeights = childSkinBinding.BoneWeights
                                           .Map(boneWeight => {
                string boneName = childSkinBinding.BoneNames[boneWeight.Index];

                if (!mergedBonesIndicesByName.TryGetValue(boneName, out int mergedBoneIdx))
                {
                    mergedBoneIdx = mergedBones.Count;
                    mergedBonesIndicesByName[boneName] = mergedBoneIdx;
                    mergedBones.Add(boneName);
                }

                return(new BoneWeight(mergedBoneIdx, boneWeight.Weight));
            });
            mergedBoneWeights = PackedLists <BoneWeight> .Concat(mergedBoneWeights, remappedChildBoneWeights);
        }

        return(new SkinBindingRecipe {
            BoneNames = mergedBones.ToArray(),
            BoneWeights = mergedBoneWeights,
            FaceGroupToNodeMap = parentSkinBinding.FaceGroupToNodeMap
        });
    }
Exemplo n.º 2
0
    public static SubdivisionMesh Combine(SubdivisionMesh meshA, SubdivisionMesh meshB)
    {
        int offset = meshA.ControlVertexCount;

        return(new SubdivisionMesh(
                   meshA.ControlVertexCount + meshB.ControlVertexCount,
                   QuadTopology.Combine(meshA.Topology, meshB.Topology),
                   PackedLists <WeightedIndexWithDerivatives> .Concat(
                       meshA.Stencils,
                       meshB.Stencils.Map(w => w.Reindex(offset)))));
    }
    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));
    }