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 }); }
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)); }