Universe.Physics.BulletSPlugin.BSPrim.MakeDynamic C# (CSharp) Method

MakeDynamic() protected method

protected MakeDynamic ( bool makeStatic ) : void
makeStatic bool
return void
        protected virtual void MakeDynamic(bool makeStatic)
        {
            if (makeStatic)
            {
                // Become a Bullet 'static' object type
                CurrentCollisionFlags = PhysicsScene.PE.AddToCollisionFlags(PhysBody, CollisionFlags.CF_STATIC_OBJECT);
                // Stop all movement
                ZeroMotion(true);

                // Set various physical properties so other object interact properly
                PhysicsScene.PE.SetFriction(PhysBody, Friction);
                PhysicsScene.PE.SetRestitution(PhysBody, Restitution);
                PhysicsScene.PE.SetContactProcessingThreshold(PhysBody, BSParam.ContactProcessingThreshold);

                // Mass is zero which disables a bunch of physics stuff in Bullet
                UpdatePhysicalMassProperties(0f, false);
                // Set collision detection parameters
                if (BSParam.CcdMotionThreshold > 0f)
                {
                    PhysicsScene.PE.SetCcdMotionThreshold(PhysBody, BSParam.CcdMotionThreshold);
                    PhysicsScene.PE.SetCcdSweptSphereRadius(PhysBody, BSParam.CcdSweptSphereRadius);
                }

                // The activation state is 'disabled' so Bullet will not try to act on it.
                // PhysicsScene.PE.ForceActivationState(PhysBody, ActivationState.DISABLE_SIMULATION);
                // Start it out sleeping and physical actions could wake it up.
                PhysicsScene.PE.ForceActivationState(PhysBody, ActivationState.ISLAND_SLEEPING);

                // This collides like a static object
                PhysBody.collisionType = CollisionType.Static;
            }
            else
            {
                // Not a Bullet static object
                CurrentCollisionFlags = PhysicsScene.PE.RemoveFromCollisionFlags(PhysBody,
                    CollisionFlags.CF_STATIC_OBJECT);

                // Set various physical properties so other object interact properly
                PhysicsScene.PE.SetFriction(PhysBody, Friction);
                PhysicsScene.PE.SetRestitution(PhysBody, Restitution);
                // DetailLog("{0},BSPrim.MakeDynamic,frict={1},rest={2}", LocalID, Friction, Restitution);

                // per http://www.bulletphysics.org/Bullet/phpBB3/viewtopic.php?t=3382
                // Since this can be called multiple times, only zero forces when becoming physical
                // PhysicsScene.PE.ClearAllForces(BSBody);

                // For good measure, make sure the transform is set through to the motion state
                ForcePosition = _position;
                ForceVelocity = RawVelocity;
                ForceRotationalVelocity = _rotationalVelocity;

                // A dynamic object has mass
                UpdatePhysicalMassProperties(RawMass, false);

                // Set collision detection parameters
                if (BSParam.CcdMotionThreshold > 0f)
                {
                    PhysicsScene.PE.SetCcdMotionThreshold(PhysBody, BSParam.CcdMotionThreshold);
                    PhysicsScene.PE.SetCcdSweptSphereRadius(PhysBody, BSParam.CcdSweptSphereRadius);
                }

                // Various values for simulation limits
                PhysicsScene.PE.SetDamping(PhysBody, BSParam.LinearDamping, BSParam.AngularDamping);
                PhysicsScene.PE.SetDeactivationTime(PhysBody, BSParam.DeactivationTime);
                PhysicsScene.PE.SetSleepingThresholds(PhysBody, BSParam.LinearSleepingThreshold,
                    BSParam.AngularSleepingThreshold);
                PhysicsScene.PE.SetContactProcessingThreshold(PhysBody, BSParam.ContactProcessingThreshold);

                // This collides like an object.
                PhysBody.collisionType = CollisionType.Dynamic;

                // Force activation of the object so Bullet will act on it.
                // Must do the ForceActivationState2() to overcome the DISABLE_SIMULATION from static objects.
                PhysicsScene.PE.ForceActivationState(PhysBody, ActivationState.ACTIVE_TAG);
            }
        }