aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs')
-rw-r--r--OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs135
1 files changed, 69 insertions, 66 deletions
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs b/OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs
index a041ba8..2a5397e 100644
--- a/OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs
@@ -34,7 +34,7 @@ using OpenSim.Region.Physics.Manager;
34 34
35namespace OpenSim.Region.Physics.BulletSPlugin 35namespace OpenSim.Region.Physics.BulletSPlugin
36{ 36{
37public class BSCharacter : BSPhysObject 37public sealed class BSCharacter : BSPhysObject
38{ 38{
39 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 39 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
40 private static readonly string LogHeader = "[BULLETS CHAR]"; 40 private static readonly string LogHeader = "[BULLETS CHAR]";
@@ -97,28 +97,14 @@ public class BSCharacter : BSPhysObject
97 // set _avatarVolume and _mass based on capsule size, _density and Scale 97 // set _avatarVolume and _mass based on capsule size, _density and Scale
98 ComputeAvatarVolumeAndMass(); 98 ComputeAvatarVolumeAndMass();
99 DetailLog("{0},BSCharacter.create,call,size={1},scale={2},density={3},volume={4},mass={5}", 99 DetailLog("{0},BSCharacter.create,call,size={1},scale={2},density={3},volume={4},mass={5}",
100 LocalID, _size, Scale, _avatarDensity, _avatarVolume, MassRaw); 100 LocalID, _size, Scale, _avatarDensity, _avatarVolume, RawMass);
101
102 ShapeData shapeData = new ShapeData();
103 shapeData.ID = LocalID;
104 shapeData.Type = ShapeData.PhysicsShapeType.SHAPE_AVATAR;
105 shapeData.Position = _position;
106 shapeData.Rotation = _orientation;
107 shapeData.Velocity = _velocity;
108 shapeData.Size = Scale; // capsule is a native shape but scale is not just <1,1,1>
109 shapeData.Scale = Scale;
110 shapeData.Mass = _mass;
111 shapeData.Buoyancy = _buoyancy;
112 shapeData.Static = ShapeData.numericFalse;
113 shapeData.Friction = PhysicsScene.Params.avatarStandingFriction;
114 shapeData.Restitution = PhysicsScene.Params.avatarRestitution;
115 101
116 // do actual create at taint time 102 // do actual create at taint time
117 PhysicsScene.TaintedObject("BSCharacter.create", delegate() 103 PhysicsScene.TaintedObject("BSCharacter.create", delegate()
118 { 104 {
119 DetailLog("{0},BSCharacter.create,taint", LocalID); 105 DetailLog("{0},BSCharacter.create,taint", LocalID);
120 // New body and shape into BSBody and BSShape 106 // New body and shape into BSBody and BSShape
121 PhysicsScene.Shapes.GetBodyAndShape(true, PhysicsScene.World, this, shapeData, null, null, null); 107 PhysicsScene.Shapes.GetBodyAndShape(true, PhysicsScene.World, this, null, null);
122 108
123 SetPhysicalProperties(); 109 SetPhysicalProperties();
124 }); 110 });
@@ -131,46 +117,45 @@ public class BSCharacter : BSPhysObject
131 DetailLog("{0},BSCharacter.Destroy", LocalID); 117 DetailLog("{0},BSCharacter.Destroy", LocalID);
132 PhysicsScene.TaintedObject("BSCharacter.destroy", delegate() 118 PhysicsScene.TaintedObject("BSCharacter.destroy", delegate()
133 { 119 {
134 PhysicsScene.Shapes.DereferenceBody(BSBody, true, null); 120 PhysicsScene.Shapes.DereferenceBody(PhysBody, true, null);
135 PhysicsScene.Shapes.DereferenceShape(BSShape, true, null); 121 PhysicsScene.Shapes.DereferenceShape(PhysShape, true, null);
136 }); 122 });
137 } 123 }
138 124
139 private void SetPhysicalProperties() 125 private void SetPhysicalProperties()
140 { 126 {
141 BulletSimAPI.RemoveObjectFromWorld2(PhysicsScene.World.ptr, BSBody.ptr); 127 BulletSimAPI.RemoveObjectFromWorld2(PhysicsScene.World.ptr, PhysBody.ptr);
142 128
143 ZeroMotion(); 129 ZeroMotion();
144 ForcePosition = _position; 130 ForcePosition = _position;
145 // Set the velocity and compute the proper friction 131 // Set the velocity and compute the proper friction
146 ForceVelocity = _velocity; 132 ForceVelocity = _velocity;
147 133
148 BulletSimAPI.SetRestitution2(BSBody.ptr, PhysicsScene.Params.avatarRestitution); 134 BulletSimAPI.SetRestitution2(PhysBody.ptr, PhysicsScene.Params.avatarRestitution);
149 BulletSimAPI.SetMargin2(BSShape.ptr, PhysicsScene.Params.collisionMargin); 135 BulletSimAPI.SetMargin2(PhysShape.ptr, PhysicsScene.Params.collisionMargin);
150 BulletSimAPI.SetLocalScaling2(BSShape.ptr, Scale); 136 BulletSimAPI.SetLocalScaling2(PhysShape.ptr, Scale);
151 BulletSimAPI.SetContactProcessingThreshold2(BSBody.ptr, PhysicsScene.Params.contactProcessingThreshold); 137 BulletSimAPI.SetContactProcessingThreshold2(PhysBody.ptr, PhysicsScene.Params.contactProcessingThreshold);
152 if (PhysicsScene.Params.ccdMotionThreshold > 0f) 138 if (PhysicsScene.Params.ccdMotionThreshold > 0f)
153 { 139 {
154 BulletSimAPI.SetCcdMotionThreshold2(BSBody.ptr, PhysicsScene.Params.ccdMotionThreshold); 140 BulletSimAPI.SetCcdMotionThreshold2(PhysBody.ptr, PhysicsScene.Params.ccdMotionThreshold);
155 BulletSimAPI.SetCcdSweepSphereRadius2(BSBody.ptr, PhysicsScene.Params.ccdSweptSphereRadius); 141 BulletSimAPI.SetCcdSweptSphereRadius2(PhysBody.ptr, PhysicsScene.Params.ccdSweptSphereRadius);
156 } 142 }
157 143
158 OMV.Vector3 localInertia = BulletSimAPI.CalculateLocalInertia2(BSShape.ptr, MassRaw); 144 UpdatePhysicalMassProperties(RawMass);
159 BulletSimAPI.SetMassProps2(BSBody.ptr, MassRaw, localInertia);
160 145
161 // Make so capsule does not fall over 146 // Make so capsule does not fall over
162 BulletSimAPI.SetAngularFactorV2(BSBody.ptr, OMV.Vector3.Zero); 147 BulletSimAPI.SetAngularFactorV2(PhysBody.ptr, OMV.Vector3.Zero);
163 148
164 BulletSimAPI.AddToCollisionFlags2(BSBody.ptr, CollisionFlags.CF_CHARACTER_OBJECT); 149 BulletSimAPI.AddToCollisionFlags2(PhysBody.ptr, CollisionFlags.CF_CHARACTER_OBJECT);
165 150
166 BulletSimAPI.AddObjectToWorld2(PhysicsScene.World.ptr, BSBody.ptr); 151 BulletSimAPI.AddObjectToWorld2(PhysicsScene.World.ptr, PhysBody.ptr);
167 152
168 // BulletSimAPI.ForceActivationState2(BSBody.ptr, ActivationState.ACTIVE_TAG); 153 // BulletSimAPI.ForceActivationState2(BSBody.ptr, ActivationState.ACTIVE_TAG);
169 BulletSimAPI.ForceActivationState2(BSBody.ptr, ActivationState.DISABLE_DEACTIVATION); 154 BulletSimAPI.ForceActivationState2(PhysBody.ptr, ActivationState.DISABLE_DEACTIVATION);
170 BulletSimAPI.UpdateSingleAabb2(PhysicsScene.World.ptr, BSBody.ptr); 155 BulletSimAPI.UpdateSingleAabb2(PhysicsScene.World.ptr, PhysBody.ptr);
171 156
172 // Do this after the object has been added to the world 157 // Do this after the object has been added to the world
173 BulletSimAPI.SetCollisionFilterMask2(BSBody.ptr, 158 BulletSimAPI.SetCollisionFilterMask2(PhysBody.ptr,
174 (uint)CollisionFilterGroups.AvatarFilter, 159 (uint)CollisionFilterGroups.AvatarFilter,
175 (uint)CollisionFilterGroups.AvatarMask); 160 (uint)CollisionFilterGroups.AvatarMask);
176 } 161 }
@@ -196,13 +181,12 @@ public class BSCharacter : BSPhysObject
196 ComputeAvatarScale(_size); 181 ComputeAvatarScale(_size);
197 ComputeAvatarVolumeAndMass(); 182 ComputeAvatarVolumeAndMass();
198 DetailLog("{0},BSCharacter.setSize,call,scale={1},density={2},volume={3},mass={4}", 183 DetailLog("{0},BSCharacter.setSize,call,scale={1},density={2},volume={3},mass={4}",
199 LocalID, Scale, _avatarDensity, _avatarVolume, MassRaw); 184 LocalID, Scale, _avatarDensity, _avatarVolume, RawMass);
200 185
201 PhysicsScene.TaintedObject("BSCharacter.setSize", delegate() 186 PhysicsScene.TaintedObject("BSCharacter.setSize", delegate()
202 { 187 {
203 BulletSimAPI.SetLocalScaling2(BSShape.ptr, Scale); 188 BulletSimAPI.SetLocalScaling2(PhysShape.ptr, Scale);
204 OMV.Vector3 localInertia = BulletSimAPI.CalculateLocalInertia2(BSShape.ptr, MassRaw); 189 UpdatePhysicalMassProperties(RawMass);
205 BulletSimAPI.SetMassProps2(BSBody.ptr, MassRaw, localInertia);
206 }); 190 });
207 191
208 } 192 }
@@ -214,6 +198,11 @@ public class BSCharacter : BSPhysObject
214 { 198 {
215 set { BaseShape = value; } 199 set { BaseShape = value; }
216 } 200 }
201 // I want the physics engine to make an avatar capsule
202 public override ShapeData.PhysicsShapeType PreferredPhysicalShape
203 {
204 get {return ShapeData.PhysicsShapeType.SHAPE_AVATAR; }
205 }
217 206
218 public override bool Grabbed { 207 public override bool Grabbed {
219 set { _grabbed = value; } 208 set { _grabbed = value; }
@@ -236,16 +225,22 @@ public class BSCharacter : BSPhysObject
236 _rotationalVelocity = OMV.Vector3.Zero; 225 _rotationalVelocity = OMV.Vector3.Zero;
237 226
238 // Zero some other properties directly into the physics engine 227 // Zero some other properties directly into the physics engine
239 BulletSimAPI.SetLinearVelocity2(BSBody.ptr, OMV.Vector3.Zero); 228 BulletSimAPI.SetLinearVelocity2(PhysBody.ptr, OMV.Vector3.Zero);
240 BulletSimAPI.SetAngularVelocity2(BSBody.ptr, OMV.Vector3.Zero); 229 BulletSimAPI.SetAngularVelocity2(PhysBody.ptr, OMV.Vector3.Zero);
241 BulletSimAPI.SetInterpolationVelocity2(BSBody.ptr, OMV.Vector3.Zero, OMV.Vector3.Zero); 230 BulletSimAPI.SetInterpolationVelocity2(PhysBody.ptr, OMV.Vector3.Zero, OMV.Vector3.Zero);
242 BulletSimAPI.ClearForces2(BSBody.ptr); 231 BulletSimAPI.ClearForces2(PhysBody.ptr);
243 } 232 }
244 233
245 public override void LockAngularMotion(OMV.Vector3 axis) { return; } 234 public override void LockAngularMotion(OMV.Vector3 axis) { return; }
246 235
236 public override OMV.Vector3 RawPosition
237 {
238 get { return _position; }
239 set { _position = value; }
240 }
247 public override OMV.Vector3 Position { 241 public override OMV.Vector3 Position {
248 get { 242 get {
243 // Don't refetch the position because this function is called a zillion times
249 // _position = BulletSimAPI.GetObjectPosition2(Scene.World.ptr, LocalID); 244 // _position = BulletSimAPI.GetObjectPosition2(Scene.World.ptr, LocalID);
250 return _position; 245 return _position;
251 } 246 }
@@ -256,19 +251,19 @@ public class BSCharacter : BSPhysObject
256 PhysicsScene.TaintedObject("BSCharacter.setPosition", delegate() 251 PhysicsScene.TaintedObject("BSCharacter.setPosition", delegate()
257 { 252 {
258 DetailLog("{0},BSCharacter.SetPosition,taint,pos={1},orient={2}", LocalID, _position, _orientation); 253 DetailLog("{0},BSCharacter.SetPosition,taint,pos={1},orient={2}", LocalID, _position, _orientation);
259 BulletSimAPI.SetTranslation2(BSBody.ptr, _position, _orientation); 254 BulletSimAPI.SetTranslation2(PhysBody.ptr, _position, _orientation);
260 }); 255 });
261 } 256 }
262 } 257 }
263 public override OMV.Vector3 ForcePosition { 258 public override OMV.Vector3 ForcePosition {
264 get { 259 get {
265 _position = BulletSimAPI.GetPosition2(BSBody.ptr); 260 _position = BulletSimAPI.GetPosition2(PhysBody.ptr);
266 return _position; 261 return _position;
267 } 262 }
268 set { 263 set {
269 _position = value; 264 _position = value;
270 PositionSanityCheck(); 265 PositionSanityCheck();
271 BulletSimAPI.SetTranslation2(BSBody.ptr, _position, _orientation); 266 BulletSimAPI.SetTranslation2(PhysBody.ptr, _position, _orientation);
272 } 267 }
273 } 268 }
274 269
@@ -312,15 +307,11 @@ public class BSCharacter : BSPhysObject
312 { 307 {
313 // The new position value must be pushed into the physics engine but we can't 308 // The new position value must be pushed into the physics engine but we can't
314 // just assign to "Position" because of potential call loops. 309 // just assign to "Position" because of potential call loops.
315 BSScene.TaintCallback sanityOperation = delegate() 310 PhysicsScene.TaintedObject(inTaintTime, "BSCharacter.PositionSanityCheck", delegate()
316 { 311 {
317 DetailLog("{0},BSCharacter.PositionSanityCheck,taint,pos={1},orient={2}", LocalID, _position, _orientation); 312 DetailLog("{0},BSCharacter.PositionSanityCheck,taint,pos={1},orient={2}", LocalID, _position, _orientation);
318 BulletSimAPI.SetTranslation2(BSBody.ptr, _position, _orientation); 313 BulletSimAPI.SetTranslation2(PhysBody.ptr, _position, _orientation);
319 }; 314 });
320 if (inTaintTime)
321 sanityOperation();
322 else
323 PhysicsScene.TaintedObject("BSCharacter.PositionSanityCheck", sanityOperation);
324 ret = true; 315 ret = true;
325 } 316 }
326 return ret; 317 return ret;
@@ -329,7 +320,14 @@ public class BSCharacter : BSPhysObject
329 public override float Mass { get { return _mass; } } 320 public override float Mass { get { return _mass; } }
330 321
331 // used when we only want this prim's mass and not the linkset thing 322 // used when we only want this prim's mass and not the linkset thing
332 public override float MassRaw { get {return _mass; } } 323 public override float RawMass {
324 get {return _mass; }
325 }
326 public override void UpdatePhysicalMassProperties(float physMass)
327 {
328 OMV.Vector3 localInertia = BulletSimAPI.CalculateLocalInertia2(PhysShape.ptr, physMass);
329 BulletSimAPI.SetMassProps2(PhysBody.ptr, physMass, localInertia);
330 }
333 331
334 public override OMV.Vector3 Force { 332 public override OMV.Vector3 Force {
335 get { return _force; } 333 get { return _force; }
@@ -339,7 +337,7 @@ public class BSCharacter : BSPhysObject
339 PhysicsScene.TaintedObject("BSCharacter.SetForce", delegate() 337 PhysicsScene.TaintedObject("BSCharacter.SetForce", delegate()
340 { 338 {
341 DetailLog("{0},BSCharacter.setForce,taint,force={1}", LocalID, _force); 339 DetailLog("{0},BSCharacter.setForce,taint,force={1}", LocalID, _force);
342 BulletSimAPI.SetObjectForce2(BSBody.ptr, _force); 340 BulletSimAPI.SetObjectForce2(PhysBody.ptr, _force);
343 }); 341 });
344 } 342 }
345 } 343 }
@@ -378,7 +376,7 @@ public class BSCharacter : BSPhysObject
378 if (_currentFriction != PhysicsScene.Params.avatarStandingFriction) 376 if (_currentFriction != PhysicsScene.Params.avatarStandingFriction)
379 { 377 {
380 _currentFriction = PhysicsScene.Params.avatarStandingFriction; 378 _currentFriction = PhysicsScene.Params.avatarStandingFriction;
381 BulletSimAPI.SetFriction2(BSBody.ptr, _currentFriction); 379 BulletSimAPI.SetFriction2(PhysBody.ptr, _currentFriction);
382 } 380 }
383 } 381 }
384 else 382 else
@@ -386,15 +384,15 @@ public class BSCharacter : BSPhysObject
386 if (_currentFriction != PhysicsScene.Params.avatarFriction) 384 if (_currentFriction != PhysicsScene.Params.avatarFriction)
387 { 385 {
388 _currentFriction = PhysicsScene.Params.avatarFriction; 386 _currentFriction = PhysicsScene.Params.avatarFriction;
389 BulletSimAPI.SetFriction2(BSBody.ptr, _currentFriction); 387 BulletSimAPI.SetFriction2(PhysBody.ptr, _currentFriction);
390 } 388 }
391 } 389 }
392 _velocity = value; 390 _velocity = value;
393 // Remember the set velocity so we can suppress the reduction by friction, ... 391 // Remember the set velocity so we can suppress the reduction by friction, ...
394 _appliedVelocity = value; 392 _appliedVelocity = value;
395 393
396 BulletSimAPI.SetLinearVelocity2(BSBody.ptr, _velocity); 394 BulletSimAPI.SetLinearVelocity2(PhysBody.ptr, _velocity);
397 BulletSimAPI.Activate2(BSBody.ptr, true); 395 BulletSimAPI.Activate2(PhysBody.ptr, true);
398 } 396 }
399 } 397 }
400 public override OMV.Vector3 Torque { 398 public override OMV.Vector3 Torque {
@@ -411,6 +409,11 @@ public class BSCharacter : BSPhysObject
411 get { return _acceleration; } 409 get { return _acceleration; }
412 set { _acceleration = value; } 410 set { _acceleration = value; }
413 } 411 }
412 public override OMV.Quaternion RawOrientation
413 {
414 get { return _orientation; }
415 set { _orientation = value; }
416 }
414 public override OMV.Quaternion Orientation { 417 public override OMV.Quaternion Orientation {
415 get { return _orientation; } 418 get { return _orientation; }
416 set { 419 set {
@@ -419,7 +422,7 @@ public class BSCharacter : BSPhysObject
419 PhysicsScene.TaintedObject("BSCharacter.setOrientation", delegate() 422 PhysicsScene.TaintedObject("BSCharacter.setOrientation", delegate()
420 { 423 {
421 // _position = BulletSimAPI.GetPosition2(BSBody.ptr); 424 // _position = BulletSimAPI.GetPosition2(BSBody.ptr);
422 BulletSimAPI.SetTranslation2(BSBody.ptr, _position, _orientation); 425 BulletSimAPI.SetTranslation2(PhysBody.ptr, _position, _orientation);
423 }); 426 });
424 } 427 }
425 } 428 }
@@ -428,13 +431,13 @@ public class BSCharacter : BSPhysObject
428 { 431 {
429 get 432 get
430 { 433 {
431 _orientation = BulletSimAPI.GetOrientation2(BSBody.ptr); 434 _orientation = BulletSimAPI.GetOrientation2(PhysBody.ptr);
432 return _orientation; 435 return _orientation;
433 } 436 }
434 set 437 set
435 { 438 {
436 _orientation = value; 439 _orientation = value;
437 BulletSimAPI.SetTranslation2(BSBody.ptr, _position, _orientation); 440 BulletSimAPI.SetTranslation2(PhysBody.ptr, _position, _orientation);
438 } 441 }
439 } 442 }
440 public override int PhysicsActorType { 443 public override int PhysicsActorType {
@@ -493,9 +496,9 @@ public class BSCharacter : BSPhysObject
493 PhysicsScene.TaintedObject("BSCharacter.setFloatOnWater", delegate() 496 PhysicsScene.TaintedObject("BSCharacter.setFloatOnWater", delegate()
494 { 497 {
495 if (_floatOnWater) 498 if (_floatOnWater)
496 CurrentCollisionFlags = BulletSimAPI.AddToCollisionFlags2(BSBody.ptr, CollisionFlags.BS_FLOATS_ON_WATER); 499 CurrentCollisionFlags = BulletSimAPI.AddToCollisionFlags2(PhysBody.ptr, CollisionFlags.BS_FLOATS_ON_WATER);
497 else 500 else
498 CurrentCollisionFlags = BulletSimAPI.RemoveFromCollisionFlags2(BSBody.ptr, CollisionFlags.BS_FLOATS_ON_WATER); 501 CurrentCollisionFlags = BulletSimAPI.RemoveFromCollisionFlags2(PhysBody.ptr, CollisionFlags.BS_FLOATS_ON_WATER);
499 }); 502 });
500 } 503 }
501 } 504 }
@@ -528,7 +531,7 @@ public class BSCharacter : BSPhysObject
528 DetailLog("{0},BSCharacter.setForceBuoyancy,taint,buoy={1}", LocalID, _buoyancy); 531 DetailLog("{0},BSCharacter.setForceBuoyancy,taint,buoy={1}", LocalID, _buoyancy);
529 // Buoyancy is faked by changing the gravity applied to the object 532 // Buoyancy is faked by changing the gravity applied to the object
530 float grav = PhysicsScene.Params.gravity * (1f - _buoyancy); 533 float grav = PhysicsScene.Params.gravity * (1f - _buoyancy);
531 BulletSimAPI.SetGravity2(BSBody.ptr, new OMV.Vector3(0f, 0f, grav)); 534 BulletSimAPI.SetGravity2(PhysBody.ptr, new OMV.Vector3(0f, 0f, grav));
532 } 535 }
533 } 536 }
534 537
@@ -574,7 +577,7 @@ public class BSCharacter : BSPhysObject
574 PhysicsScene.TaintedObject("BSCharacter.AddForce", delegate() 577 PhysicsScene.TaintedObject("BSCharacter.AddForce", delegate()
575 { 578 {
576 DetailLog("{0},BSCharacter.setAddForce,taint,addedForce={1}", LocalID, _force); 579 DetailLog("{0},BSCharacter.setAddForce,taint,addedForce={1}", LocalID, _force);
577 BulletSimAPI.SetObjectForce2(BSBody.ptr, _force); 580 BulletSimAPI.SetObjectForce2(PhysBody.ptr, _force);
578 }); 581 });
579 } 582 }
580 else 583 else
@@ -642,7 +645,7 @@ public class BSCharacter : BSPhysObject
642 // That's just the way they are defined. 645 // That's just the way they are defined.
643 OMV.Vector3 avVel = new OMV.Vector3(_appliedVelocity.X, _appliedVelocity.Y, entprop.Velocity.Z); 646 OMV.Vector3 avVel = new OMV.Vector3(_appliedVelocity.X, _appliedVelocity.Y, entprop.Velocity.Z);
644 _velocity = avVel; 647 _velocity = avVel;
645 BulletSimAPI.SetLinearVelocity2(BSBody.ptr, avVel); 648 BulletSimAPI.SetLinearVelocity2(PhysBody.ptr, avVel);
646 } 649 }
647 650
648 // Tell the linkset about value changes 651 // Tell the linkset about value changes