aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs56
1 files changed, 25 insertions, 31 deletions
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs b/OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs
index 7bc6b69..8e1171a 100644
--- a/OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs
@@ -114,17 +114,9 @@ public class BSCharacter : BSPhysObject
114 PhysicsScene.TaintedObject("BSCharacter.create", delegate() 114 PhysicsScene.TaintedObject("BSCharacter.create", delegate()
115 { 115 {
116 DetailLog("{0},BSCharacter.create,taint", LocalID); 116 DetailLog("{0},BSCharacter.create,taint", LocalID);
117 PhysicsScene.Shapes.GetBodyAndShape(true, PhysicsScene.World, this, shapeData, null, null, null); 117 PhysicsScene.Shapes.GetBodyAndShape(true, PhysicsScene.World, this, shapeData, null, null, null);
118 118
119 SetPhysicalProperties(); 119 SetPhysicalProperties();
120
121 // Set the buoyancy for flying. This will be refactored when all the settings happen in C#.
122 // If not set at creation, the avatar will stop flying when created after crossing a region boundry.
123 ForceBuoyancy = _buoyancy;
124
125 // This works here because CreateObject has already put the character into the physical world.
126 BulletSimAPI.SetCollisionFilterMask2(BSBody.ptr,
127 (uint)CollisionFilterGroups.AvatarFilter, (uint)CollisionFilterGroups.AvatarMask);
128 }); 120 });
129 return; 121 return;
130 } 122 }
@@ -146,27 +138,32 @@ public class BSCharacter : BSPhysObject
146 138
147 ZeroMotion(); 139 ZeroMotion();
148 140
149 OMV.Vector3 localInertia = BulletSimAPI.CalculateLocalInertia2(BSShape.ptr, MassRaw); 141 OMV.Vector3 localInertia = BulletSimAPI.CalculateLocalInertia2(BSShape.ptr, MassRaw);
150 BulletSimAPI.SetMassProps2(BSBody.ptr, MassRaw, localInertia); 142 BulletSimAPI.SetMassProps2(BSBody.ptr, MassRaw, localInertia);
151 143
144 ForcePosition = _position;
152 // Set the velocity and compute the proper friction 145 // Set the velocity and compute the proper friction
153 ForceVelocity = _velocity; 146 ForceVelocity = _velocity;
154
155 BulletSimAPI.SetFriction2(BSBody.ptr, _currentFriction);
156 BulletSimAPI.SetRestitution2(BSBody.ptr, PhysicsScene.Params.avatarRestitution); 147 BulletSimAPI.SetRestitution2(BSBody.ptr, PhysicsScene.Params.avatarRestitution);
157
158 BulletSimAPI.SetLocalScaling2(BSShape.ptr, Scale); 148 BulletSimAPI.SetLocalScaling2(BSShape.ptr, Scale);
159 BulletSimAPI.SetContactProcessingThreshold2(BSBody.ptr, PhysicsScene.Params.contactProcessingThreshold); 149 BulletSimAPI.SetContactProcessingThreshold2(BSBody.ptr, PhysicsScene.Params.contactProcessingThreshold);
160
161 if (PhysicsScene.Params.ccdMotionThreshold > 0f) 150 if (PhysicsScene.Params.ccdMotionThreshold > 0f)
162 { 151 {
163 BulletSimAPI.SetCcdMotionThreshold2(BSBody.ptr, PhysicsScene.Params.ccdMotionThreshold); 152 BulletSimAPI.SetCcdMotionThreshold2(BSBody.ptr, PhysicsScene.Params.ccdMotionThreshold);
164 BulletSimAPI.SetCcdSweepSphereRadius2(BSBody.ptr, PhysicsScene.Params.ccdSweptSphereRadius); 153 BulletSimAPI.SetCcdSweepSphereRadius2(BSBody.ptr, PhysicsScene.Params.ccdSweptSphereRadius);
165 } 154 }
166 155
167 BulletSimAPI.SetActivationState2(BSBody.ptr, (int)ActivationState.DISABLE_DEACTIVATION); 156 BulletSimAPI.AddToCollisionFlags2(BSBody.ptr, CollisionFlags.CF_CHARACTER_OBJECT);
168 157
169 BulletSimAPI.AddObjectToWorld2(PhysicsScene.World.ptr, BSBody.ptr); 158 BulletSimAPI.AddObjectToWorld2(PhysicsScene.World.ptr, BSBody.ptr);
159
160 BulletSimAPI.ForceActivationState2(BSBody.ptr, ActivationState.DISABLE_DEACTIVATION);
161 BulletSimAPI.UpdateSingleAabb2(PhysicsScene.World.ptr, BSBody.ptr);
162
163 // Do this after the object has been added to the world
164 BulletSimAPI.SetCollisionFilterMask2(BSBody.ptr,
165 (uint)CollisionFilterGroups.AvatarFilter,
166 (uint)CollisionFilterGroups.AvatarMask);
170 } 167 }
171 168
172 public override void RequestPhysicsterseUpdate() 169 public override void RequestPhysicsterseUpdate()
@@ -174,9 +171,7 @@ public class BSCharacter : BSPhysObject
174 base.RequestPhysicsterseUpdate(); 171 base.RequestPhysicsterseUpdate();
175 } 172 }
176 // No one calls this method so I don't know what it could possibly mean 173 // No one calls this method so I don't know what it could possibly mean
177 public override bool Stopped { 174 public override bool Stopped { get { return false; } }
178 get { return false; }
179 }
180 public override OMV.Vector3 Size { 175 public override OMV.Vector3 Size {
181 get 176 get
182 { 177 {
@@ -185,18 +180,14 @@ public class BSCharacter : BSPhysObject
185 } 180 }
186 181
187 set { 182 set {
188 // When an avatar's size is set, only the height is changed 183 // When an avatar's size is set, only the height is changed.
189 // and that really only depends on the radius.
190 _size = value; 184 _size = value;
191 ComputeAvatarScale(_size); 185 ComputeAvatarScale(_size);
192
193 // TODO: something has to be done with the avatar's vertical position
194
195 ComputeAvatarVolumeAndMass(); 186 ComputeAvatarVolumeAndMass();
196 187
197 PhysicsScene.TaintedObject("BSCharacter.setSize", delegate() 188 PhysicsScene.TaintedObject("BSCharacter.setSize", delegate()
198 { 189 {
199 BulletSimAPI.SetLocalScaling2(BSBody.ptr, Scale); 190 BulletSimAPI.SetLocalScaling2(BSShape.ptr, Scale);
200 OMV.Vector3 localInertia = BulletSimAPI.CalculateLocalInertia2(BSBody.ptr, MassRaw); 191 OMV.Vector3 localInertia = BulletSimAPI.CalculateLocalInertia2(BSBody.ptr, MassRaw);
201 BulletSimAPI.SetMassProps2(BSBody.ptr, MassRaw, localInertia); 192 BulletSimAPI.SetMassProps2(BSBody.ptr, MassRaw, localInertia);
202 }); 193 });
@@ -300,7 +291,7 @@ public class BSCharacter : BSPhysObject
300 // A version of the sanity check that also makes sure a new position value is 291 // A version of the sanity check that also makes sure a new position value is
301 // pushed back to the physics engine. This routine would be used by anyone 292 // pushed back to the physics engine. This routine would be used by anyone
302 // who is not already pushing the value. 293 // who is not already pushing the value.
303 private bool PositionSanityCheck2(bool inTaintTime) 294 private bool PositionSanityCheck(bool inTaintTime)
304 { 295 {
305 bool ret = false; 296 bool ret = false;
306 if (PositionSanityCheck()) 297 if (PositionSanityCheck())
@@ -378,14 +369,16 @@ public class BSCharacter : BSPhysObject
378 } 369 }
379 else 370 else
380 { 371 {
381 if (_currentFriction == 999f) 372 if (_currentFriction != PhysicsScene.Params.avatarFriction)
382 { 373 {
383 _currentFriction = PhysicsScene.Params.avatarFriction; 374 _currentFriction = PhysicsScene.Params.avatarFriction;
384 BulletSimAPI.SetFriction2(BSBody.ptr, _currentFriction); 375 BulletSimAPI.SetFriction2(BSBody.ptr, _currentFriction);
385 } 376 }
386 } 377 }
387 _velocity = value; 378 _velocity = value;
379 // Remember the set velocity so we can suppress the reduction by friction, ...
388 _appliedVelocity = value; 380 _appliedVelocity = value;
381
389 BulletSimAPI.SetLinearVelocity2(BSBody.ptr, _velocity); 382 BulletSimAPI.SetLinearVelocity2(BSBody.ptr, _velocity);
390 BulletSimAPI.Activate2(BSBody.ptr, true); 383 BulletSimAPI.Activate2(BSBody.ptr, true);
391 } 384 }
@@ -590,7 +583,8 @@ public class BSCharacter : BSPhysObject
590 583
591 // The 1.15 came from ODE but it seems to cause the avatar to float off the ground 584 // The 1.15 came from ODE but it seems to cause the avatar to float off the ground
592 // Scale.Z = (_size.Z * 1.15f) - (Scale.X + Scale.Y); 585 // Scale.Z = (_size.Z * 1.15f) - (Scale.X + Scale.Y);
593 newScale.Z = (_size.Z) - (Scale.X + Scale.Y); 586 // From the total height, remove the capsule half spheres that are at each end
587 newScale.Z = (size.Z) - (Math.Min(newScale.X, newScale.Y) * 2f);
594 Scale = newScale; 588 Scale = newScale;
595 } 589 }
596 590
@@ -621,7 +615,7 @@ public class BSCharacter : BSPhysObject
621 _acceleration = entprop.Acceleration; 615 _acceleration = entprop.Acceleration;
622 _rotationalVelocity = entprop.RotationalVelocity; 616 _rotationalVelocity = entprop.RotationalVelocity;
623 // Do some sanity checking for the avatar. Make sure it's above ground and inbounds. 617 // Do some sanity checking for the avatar. Make sure it's above ground and inbounds.
624 PositionSanityCheck2(true); 618 PositionSanityCheck(true);
625 619
626 // remember the current and last set values 620 // remember the current and last set values
627 LastEntityProperties = CurrentEntityProperties; 621 LastEntityProperties = CurrentEntityProperties;