Universe.Physics.BulletSPlugin.BSLinksetConstraints.RecomputeLinksetConstraints C# (CSharp) Method

RecomputeLinksetConstraints() public method

public RecomputeLinksetConstraints ( ) : void
return void
        void RecomputeLinksetConstraints()
        {
            float linksetMass = LinksetMass;
            LinksetRoot.UpdatePhysicalMassProperties(linksetMass, true);

            DetailLog("{0},BSLinksetConstraint.RecomputeLinksetConstraints,set,rBody={1},linksetMass={2}",
                LinksetRoot.LocalID, LinksetRoot.PhysBody.AddrString, linksetMass);

            try
            {
                Rebuilding = true;

                // There is no reason to build all this physical stuff for a non-physical linkset.
                if (!LinksetRoot.IsPhysicallyActive || !HasAnyChildren)
                {
                    DetailLog("{0},BSLinksetConstraint.RecomputeLinksetCompound,notPhysicalOrNoChildren",
                        LinksetRoot.LocalID);
                    return; // Note the 'finally' clause at the botton which will get executed.
                }

                ForEachLinkInfo((li) =>
                {
                    // A child in the linkset physically shows the mass of the whole linkset.
                    // This allows Bullet to apply enough force on the child to move the whole linkset.
                    // (Also do the mass stuff before recomputing the constraint so mass is not zero.)
                    li.member.UpdatePhysicalMassProperties(linksetMass, true);

                    BSConstraint constrain;
                    if (
                        !PhysicsScene.Constraints.TryGetConstraint(LinksetRoot.PhysBody, li.member.PhysBody,
                            out constrain))
                    {
                        // If constraint doesn't exist yet, create it.
                        constrain = BuildConstraint(LinksetRoot, li);
                    }
                    li.SetLinkParameters(constrain);
                    constrain.RecomputeConstraintVariables(linksetMass);

                    // PhysicScene.PE.DumpConstraint(PhysicsScene.World, constrain.Constraint);
                    return false; // 'false' says to keep processing other members
                });
            }
            finally
            {
                Rebuilding = false;
            }
        }
    }