Example #1
0
        public override void linkGroupToThis(PhysicsActor[] objs)
        {
            Linkset.AddGroupToLinkset(objs.Cast <BSPrimLinkable>().ToArray());

            DetailLog("{0},BSPrimLinkset.linkGroupToThis,call, childrenAdded={1}, childrenAfter={2}",
                      LocalID, objs.Length, Linkset.NumberOfChildren);
        }
Example #2
0
 // Body is being taken apart. Remove physical dependencies and schedule a rebuild.
 protected override void RemoveDependencies()
 {
     if (Linkset != null)
     {
         Linkset.RemoveDependencies(this);
     }
     base.RemoveDependencies();
 }
Example #3
0
 public override void Destroy()
 {
     if (!Linkset.LinksetRoot.BlockPhysicalReconstruction)//If we are disabled, this entire linkset is being removed, so allow it to happen
     {
         Linkset = Linkset.RemoveMeFromLinkset(this);
     }
     base.Destroy();
 }
        public BSPrimLinkable(uint localID, String primName, BSScene parent_scene, OMV.Vector3 pos, OMV.Vector3 size,
                              OMV.Quaternion rotation, PrimitiveBaseShape pbs, bool pisPhysical)
            : base(localID, primName, parent_scene, pos, size, rotation, pbs, pisPhysical)
        {
            Linkset = BSLinkset.Factory(PhysScene, this);

            PhysScene.TaintedObject("BSPrimLinksetCompound.Refresh", delegate()
            {
                Linkset.Refresh(this);
            });
        }
        public BSPrimLinkable(uint localID, String primName, BSScene parent_scene, OMV.Vector3 pos, OMV.Vector3 size,
                              OMV.Quaternion rotation, PrimitiveBaseShape pbs, bool pisPhysical)
            : base(localID, primName, parent_scene, pos, size, rotation, pbs, pisPhysical)
        {
            // Default linkset implementation for this prim
            LinksetType = (BSLinkset.LinksetImplementation)BSParam.LinksetImplementation;

            Linkset = BSLinkset.Factory(PhysScene, this);

            Linkset.Refresh(this);
        }
Example #6
0
 protected override void MakeDynamic(bool makeStatic)
 {
     base.MakeDynamic(makeStatic);
     if (makeStatic)
     {
         Linkset.MakeStatic(this);
     }
     else
     {
         Linkset.MakeDynamic(this);
     }
 }
Example #7
0
        // The physics engine says that properties have updated. Update same and inform
        // the world that things have changed.
        public override void UpdateProperties(EntityProperties entprop)
        {
            _position           = entprop.Position;
            _orientation        = entprop.Rotation;
            _velocity           = entprop.Velocity;
            _acceleration       = entprop.Acceleration;
            _rotationalVelocity = entprop.RotationalVelocity;

            // Do some sanity checking for the avatar. Make sure it's above ground and inbounds.
            PositionSanityCheck(true);

            if (_velocityMotor.Enabled)
            {
                // TODO: Decide if the step parameters should be changed depending on the avatar's
                //     state (flying, colliding, ...).

                OMV.Vector3 stepVelocity = _velocityMotor.Step(PhysicsScene.LastTimeStep);

                // If falling, we keep the world's downward vector no matter what the other axis specify.
                if (!Flying && !IsColliding)
                {
                    stepVelocity.Z = entprop.Velocity.Z;
                    DetailLog("{0},BSCharacter.UpdateProperties,taint,overrideStepZWithWorldZ,stepVel={1}", LocalID, stepVelocity);
                }

                // If the user has said stop and we've stopped applying velocity correction,
                //     the motor can be turned off. Set the velocity to zero so the zero motion is sent to the viewer.
                if (_velocityMotor.TargetValue.ApproxEquals(OMV.Vector3.Zero, 0.01f) && _velocityMotor.ErrorIsZero)
                {
                    ZeroMotion(true);
                    stepVelocity           = OMV.Vector3.Zero;
                    _velocityMotor.Enabled = false;
                    DetailLog("{0},BSCharacter.UpdateProperties,taint,disableVelocityMotor,m={1}", LocalID, _velocityMotor);
                }

                _velocity        = stepVelocity;
                entprop.Velocity = _velocity;
                BulletSimAPI.SetLinearVelocity2(PhysBody.ptr, _velocity);
            }

            // remember the current and last set values
            LastEntityProperties    = CurrentEntityProperties;
            CurrentEntityProperties = entprop;

            // Tell the linkset about value changes
            Linkset.UpdateProperties(this, true);

            // Avatars don't report their changes the usual way. Changes are checked for in the heartbeat loop.
            // base.RequestPhysicsterseUpdate();

            DetailLog("{0},BSCharacter.UpdateProperties,call,pos={1},orient={2},vel={3},accel={4},rotVel={5}",
                      LocalID, _position, _orientation, _velocity, _acceleration, _rotationalVelocity);
        }
 // Refresh the linkset structure and parameters when the prim's physical parameters are changed.
 public override void UpdatePhysicalParameters()
 {
     base.UpdatePhysicalParameters();
     // Recompute any linkset parameters.
     // When going from non-physical to physical, this re-enables the constraints that
     //     had been automatically disabled when the mass was set to zero.
     // For compound based linksets, this enables and disables interactions of the children.
     if (Linkset != null) // null can happen during initialization
     {
         Linkset.Refresh(this);
     }
 }
Example #9
0
        // Called after a simulation step to post a collision with this object.
        // This returns 'true' if the collision has been queued and the SendCollisions call must
        //     be made at the end of the simulation step.
        public override bool Collide(BSPhysObject collidee, OMV.Vector3 contactPoint, OMV.Vector3 contactNormal, float pentrationDepth)
        {
            bool ret = false;

            // Ask the linkset if it wants to handle the collision
            if (!Linkset.HandleCollide(this, collidee, contactPoint, contactNormal, pentrationDepth))
            {
                // The linkset didn't handle it so pass the collision through normal processing
                ret = base.Collide(collidee, contactPoint, contactNormal, pentrationDepth);
            }
            return(ret);
        }
Example #10
0
        public override void UpdateProperties(EntityProperties entprop)
        {
            if (Linkset.IsRoot(this))
            {
                // Properties are only updated for the roots of a linkset.
                // TODO: this will have to change when linksets are articulated.
                base.UpdateProperties(entprop);
            }

            // The linkset might like to know about changing locations
            Linkset.UpdateProperties(UpdatedProperties.EntPropUpdates, this);
        }
Example #11
0
        public BSPrimLinkable(uint localID, String primName, BSScene parent_scene, OMV.Vector3 pos, OMV.Vector3 size,
                              OMV.Quaternion rotation, PrimitiveBaseShape pbs, bool pisPhysical, int material, float friction,
                              float restitution, float gravityMultiplier, float density)
            : base(localID, primName, parent_scene, pos, size, rotation, pbs, pisPhysical)
        {
            // Default linkset implementation for this prim
            LinksetType = (BSLinkset.LinksetImplementation)BSParam.LinksetImplementation;

            Linkset = BSLinkset.Factory(PhysicsScene, this);
            if (Linkset != null)
            {
                Linkset.Refresh(this);
            }
        }
        public override void delink()
        {
            // TODO: decide if this parent checking needs to happen at taint time
            // Race condition here: if link() and delink() in same simulation tick, the delink will not happen

            BSPhysObject parentBefore   = Linkset.LinksetRoot;      // DEBUG
            int          childrenBefore = Linkset.NumberOfChildren; // DEBUG

            Linkset = Linkset.RemoveMeFromLinkset(this, false /* inTaintTime*/);

            DetailLog("{0},BSPrimLinkable.delink,parentBefore={1},childrenBefore={2},parentAfter={3},childrenAfter={4}, ",
                      LocalID, parentBefore.LocalID, childrenBefore, Linkset.LinksetRoot.LocalID, Linkset.NumberOfChildren);
            return;
        }
 // When the prim is made dynamic or static, the linkset needs to change.
 protected override void MakeDynamic(bool makeStatic)
 {
     base.MakeDynamic(makeStatic);
     if (Linkset != null) // null can happen during initialization
     {
         if (makeStatic)
         {
             Linkset.MakeStatic(this);
         }
         else
         {
             Linkset.MakeDynamic(this);
         }
     }
 }
Example #14
0
        public BSPrimLinkable(uint localID, String primName, BSScene parent_scene, OMV.Vector3 pos, OMV.Vector3 size,
                              OMV.Quaternion rotation, PrimitiveBaseShape pbs, bool pisPhysical, int material, float friction,
                              float restitution, float gravityMultiplier, float density)
            : base(localID, primName, parent_scene, pos, size, rotation, pbs, pisPhysical)
        {
            Linkset = BSLinkset.Factory(PhysicsScene, this);

            PhysicsScene.TaintedObject("BSPrimLinksetCompound.Refresh", delegate()
            {
                base.SetMaterial(material);
                base.Friction          = friction;
                base.Restitution       = restitution;
                base.GravityMultiplier = gravityMultiplier;
                base.Density           = density;
                Linkset.Refresh(this);
            });
        }
        // Called after a simulation step for the changes in physical object properties.
        // Do any filtering/modification needed for linksets.
        public override void UpdateProperties(EntityProperties entprop)
        {
            if (Linkset.IsRoot(this) || Linkset.ShouldReportPropertyUpdates(this))
            {
                // Properties are only updated for the roots of a linkset.
                // TODO: this will have to change when linksets are articulated.
                base.UpdateProperties(entprop);
            }

            /*
             * else
             * {
             * // For debugging, report the movement of children
             * DetailLog("{0},BSPrim.UpdateProperties,child,pos={1},orient={2},vel={3},accel={4},rotVel={5}",
             *      LocalID, entprop.Position, entprop.Rotation, entprop.Velocity,
             *      entprop.Acceleration, entprop.RotationalVelocity);
             * }
             */
            // The linkset might like to know about changing locations
            Linkset.UpdateProperties(UpdatedProperties.EntPropUpdates, this);
        }
Example #16
0
        // The physics engine says that properties have updated. Update same and inform
        // the world that things have changed.
        public override void UpdateProperties(EntityProperties entprop)
        {
            _position           = entprop.Position;
            _orientation        = entprop.Rotation;
            _velocity           = entprop.Velocity;
            _acceleration       = entprop.Acceleration;
            _rotationalVelocity = entprop.RotationalVelocity;

            // Do some sanity checking for the avatar. Make sure it's above ground and inbounds.
            PositionSanityCheck(true);

            // remember the current and last set values
            LastEntityProperties    = CurrentEntityProperties;
            CurrentEntityProperties = entprop;

            // Tell the linkset about value changes
            Linkset.UpdateProperties(this, true);

            // Avatars don't report their changes the usual way. Changes are checked for in the heartbeat loop.
            // base.RequestPhysicsterseUpdate();

            DetailLog("{0},BSCharacter.UpdateProperties,call,pos={1},orient={2},vel={3},accel={4},rotVel={5}",
                      LocalID, _position, _orientation, _velocity, _acceleration, _rotationalVelocity);
        }
 public override void Destroy()
 {
     Linkset = Linkset.RemoveMeFromLinkset(this, false /* inTaintTime */);
     base.Destroy();
 }
        public override object Extension(string pFunct, params object[] pParams)
        {
            DetailLog("{0} BSPrimLinkable.Extension,op={1},nParam={2}", LocalID, pFunct, pParams.Length);
            object ret = null;

            switch (pFunct)
            {
            // physGetLinksetType();
            // pParams = [ BSPhysObject root, null ]
            case ExtendedPhysics.PhysFunctGetLinksetType:
            {
                ret = (object)LinksetType;
                DetailLog("{0},BSPrimLinkable.Extension.physGetLinksetType,type={1}", LocalID, ret);
                break;
            }

            // physSetLinksetType(type);
            // pParams = [ BSPhysObject root, null, integer type ]
            case ExtendedPhysics.PhysFunctSetLinksetType:
            {
                if (pParams.Length > 2)
                {
                    BSLinkset.LinksetImplementation linksetType = (BSLinkset.LinksetImplementation)pParams[2];
                    if (Linkset.IsRoot(this))
                    {
                        PhysScene.TaintedObject(LocalID, "BSPrim.PhysFunctSetLinksetType", delegate()
                            {
                                // Cause the linkset type to change
                                DetailLog("{0},BSPrimLinkable.Extension.physSetLinksetType, oldType={1},newType={2}",
                                          LocalID, Linkset.LinksetImpl, linksetType);
                                ConvertLinkset(linksetType);
                            });
                    }
                    ret = (object)(int)linksetType;
                }
                break;
            }

            // physChangeLinkType(linknum, typeCode);
            // pParams = [ BSPhysObject root, BSPhysObject child, integer linkType ]
            case ExtendedPhysics.PhysFunctChangeLinkType:
            {
                ret = Linkset.Extension(pFunct, pParams);
                break;
            }

            // physGetLinkType(linknum);
            // pParams = [ BSPhysObject root, BSPhysObject child ]
            case ExtendedPhysics.PhysFunctGetLinkType:
            {
                ret = Linkset.Extension(pFunct, pParams);
                break;
            }

            // physChangeLinkParams(linknum, [code, value, code, value, ...]);
            // pParams = [ BSPhysObject root, BSPhysObject child, object[] [ string op, object opParam, string op, object opParam, ... ] ]
            case ExtendedPhysics.PhysFunctChangeLinkParams:
            {
                ret = Linkset.Extension(pFunct, pParams);
                break;
            }

            default:
                ret = base.Extension(pFunct, pParams);
                break;
            }
            return(ret);
        }
 // Body is being taken apart. Remove physical dependencies and schedule a rebuild.
 protected override void RemoveDependencies()
 {
     Linkset.RemoveDependencies(this);
     base.RemoveDependencies();
 }
Example #20
0
 public override void Destroy()
 {
     Linkset = Linkset.RemoveMeFromLinkset(this);
     base.Destroy();
 }