BEPUphysics.BroadPhaseEntries.MobileCollidables.CompoundHelper.CreatePartialCompoundCollidable C# (CSharp) Method

CreatePartialCompoundCollidable() public static method

Constructs a compound collidable containing only the specified subset of children.
public static CreatePartialCompoundCollidable ( CompoundShape shape, IList childIndices ) : CompoundCollidable
shape BEPUphysics.CollisionShapes.CompoundShape Shape to base the compound collidable on.
childIndices IList Indices of child shapes from the CompoundShape to include in the compound collidable.
return CompoundCollidable
        public static CompoundCollidable CreatePartialCompoundCollidable(CompoundShape shape, IList<int> childIndices)
        {
            if (childIndices.Count == 0)
                throw new Exception("Cannot create a compound from zero shapes.");
            
            CompoundCollidable compound = new CompoundCollidable();
            Vector3 center = new Vector3();
            float totalWeight = 0;
            for (int i = 0; i < childIndices.Count; i++)
            {
                //Create and add the child object itself.
                var entry = shape.shapes[childIndices[i]];
                compound.children.Add(new CompoundChild(shape, entry.Shape.GetCollidableInstance(), childIndices[i]));
                //Grab its entry to compute the center of mass of this subset.
                Vector3 toAdd;
                Vector3.Multiply(ref entry.LocalTransform.Position, entry.Weight, out toAdd);
                Vector3.Add(ref center, ref toAdd, out center);
                totalWeight += entry.Weight;
            }
            if (totalWeight <= 0)
            {
                throw new Exception("Compound has zero total weight; invalid configuration.");
            }
            Vector3.Divide(ref center, totalWeight, out center);
            //Our subset of the compound is not necessarily aligned with the shape's origin.
            //By default, an object will rotate around the center of the collision shape.
            //We can't modify the shape data itself since it could be shared, which leaves
            //modifying the local position of the collidable.
            //We have the subset position in shape space, so pull the collidable back into alignment
            //with the origin.
            //This approach matches the rest of the CompoundHelper's treatment of subsets.
            compound.LocalPosition = -center;

            //Recompute the hierarchy for the compound.
            compound.hierarchy.Tree.Reconstruct(compound.children);
            compound.Shape = shape;
            return compound;
        }