aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs
diff options
context:
space:
mode:
authorRobert Adams2012-09-18 11:26:19 -0700
committerRobert Adams2012-09-27 22:01:16 -0700
commit91efccabdcb45ed95ae35ab24ed5d3ed5508b463 (patch)
treefb801ca0bd72aae3427a5ca439f807ec3802d7c3 /OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs
parentBulletSim: move a bunch of common logic out of BSPrim and BSCharacter (diff)
downloadopensim-SC-91efccabdcb45ed95ae35ab24ed5d3ed5508b463.zip
opensim-SC-91efccabdcb45ed95ae35ab24ed5d3ed5508b463.tar.gz
opensim-SC-91efccabdcb45ed95ae35ab24ed5d3ed5508b463.tar.bz2
opensim-SC-91efccabdcb45ed95ae35ab24ed5d3ed5508b463.tar.xz
BulletSim: Convert BSCharacter to use common BSPhysObject code and variables.
Fix avatar height calculation to properly account for the capsule ends. Rearrange some locking in TerrainManager to eliminate possible race conditions. Move DetailLog() definition into common BSPhysObject class. Some variable renaming to make usage clearer (refactor.rename makes this so easy).
Diffstat (limited to 'OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs')
-rw-r--r--OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs66
1 files changed, 28 insertions, 38 deletions
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs b/OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs
index 57d5726..19eb1e6 100644
--- a/OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs
@@ -39,18 +39,16 @@ public class BSCharacter : BSPhysObject
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]";
41 41
42 private String _avName;
43 // private bool _stopped; 42 // private bool _stopped;
44 private OMV.Vector3 _size; 43 private OMV.Vector3 _size;
45 private OMV.Vector3 _scale; 44 private OMV.Vector3 _scale;
46 private PrimitiveBaseShape _pbs; 45 private PrimitiveBaseShape _pbs;
47 private uint _localID = 0;
48 private bool _grabbed; 46 private bool _grabbed;
49 private bool _selected; 47 private bool _selected;
50 private OMV.Vector3 _position; 48 private OMV.Vector3 _position;
51 private float _mass; 49 private float _mass;
52 public float _density; 50 private float _avatarDensity;
53 public float _avatarVolume; 51 private float _avatarVolume;
54 private OMV.Vector3 _force; 52 private OMV.Vector3 _force;
55 private OMV.Vector3 _velocity; 53 private OMV.Vector3 _velocity;
56 private OMV.Vector3 _torque; 54 private OMV.Vector3 _torque;
@@ -63,18 +61,12 @@ public class BSCharacter : BSPhysObject
63 private bool _setAlwaysRun; 61 private bool _setAlwaysRun;
64 private bool _throttleUpdates; 62 private bool _throttleUpdates;
65 private bool _isColliding; 63 private bool _isColliding;
66 private long _collidingStep;
67 private bool _collidingGround;
68 private long _collidingGroundStep;
69 private bool _collidingObj; 64 private bool _collidingObj;
70 private bool _floatOnWater; 65 private bool _floatOnWater;
71 private OMV.Vector3 _rotationalVelocity; 66 private OMV.Vector3 _rotationalVelocity;
72 private bool _kinematic; 67 private bool _kinematic;
73 private float _buoyancy; 68 private float _buoyancy;
74 69
75 private int _subscribedEventsMs = 0;
76 private int _nextCollisionOkTime = 0;
77
78 private OMV.Vector3 _PIDTarget; 70 private OMV.Vector3 _PIDTarget;
79 private bool _usePID; 71 private bool _usePID;
80 private float _PIDTau; 72 private float _PIDTau;
@@ -85,9 +77,7 @@ public class BSCharacter : BSPhysObject
85 77
86 public BSCharacter(uint localID, String avName, BSScene parent_scene, OMV.Vector3 pos, OMV.Vector3 size, bool isFlying) 78 public BSCharacter(uint localID, String avName, BSScene parent_scene, OMV.Vector3 pos, OMV.Vector3 size, bool isFlying)
87 { 79 {
88 base.BaseInitialize(parent_scene); 80 base.BaseInitialize(parent_scene, localID, avName);
89 _localID = localID;
90 _avName = avName;
91 _physicsActorType = (int)ActorTypes.Agent; 81 _physicsActorType = (int)ActorTypes.Agent;
92 _position = pos; 82 _position = pos;
93 _size = size; 83 _size = size;
@@ -95,14 +85,15 @@ public class BSCharacter : BSPhysObject
95 _orientation = OMV.Quaternion.Identity; 85 _orientation = OMV.Quaternion.Identity;
96 _velocity = OMV.Vector3.Zero; 86 _velocity = OMV.Vector3.Zero;
97 _buoyancy = ComputeBuoyancyFromFlying(isFlying); 87 _buoyancy = ComputeBuoyancyFromFlying(isFlying);
88
98 // The dimensions of the avatar capsule are kept in the scale. 89 // The dimensions of the avatar capsule are kept in the scale.
99 // Physics creates a unit capsule which is scaled by the physics engine. 90 // Physics creates a unit capsule which is scaled by the physics engine.
100 _scale = new OMV.Vector3(PhysicsScene.Params.avatarCapsuleRadius, PhysicsScene.Params.avatarCapsuleRadius, size.Z); 91 ComputeAvatarScale(_size);
101 _density = PhysicsScene.Params.avatarDensity; 92 _avatarDensity = PhysicsScene.Params.avatarDensity;
102 ComputeAvatarVolumeAndMass(); // set _avatarVolume and _mass based on capsule size, _density and _scale 93 ComputeAvatarVolumeAndMass(); // set _avatarVolume and _mass based on capsule size, _density and _scale
103 94
104 ShapeData shapeData = new ShapeData(); 95 ShapeData shapeData = new ShapeData();
105 shapeData.ID = _localID; 96 shapeData.ID = LocalID;
106 shapeData.Type = ShapeData.PhysicsShapeType.SHAPE_AVATAR; 97 shapeData.Type = ShapeData.PhysicsShapeType.SHAPE_AVATAR;
107 shapeData.Position = _position; 98 shapeData.Position = _position;
108 shapeData.Rotation = _orientation; 99 shapeData.Rotation = _orientation;
@@ -117,7 +108,7 @@ public class BSCharacter : BSPhysObject
117 // do actual create at taint time 108 // do actual create at taint time
118 PhysicsScene.TaintedObject("BSCharacter.create", delegate() 109 PhysicsScene.TaintedObject("BSCharacter.create", delegate()
119 { 110 {
120 DetailLog("{0},BSCharacter.create", _localID); 111 DetailLog("{0},BSCharacter.create,taint", LocalID);
121 BulletSimAPI.CreateObject(PhysicsScene.WorldID, shapeData); 112 BulletSimAPI.CreateObject(PhysicsScene.WorldID, shapeData);
122 113
123 // Set the buoyancy for flying. This will be refactored when all the settings happen in C# 114 // Set the buoyancy for flying. This will be refactored when all the settings happen in C#
@@ -135,7 +126,7 @@ public class BSCharacter : BSPhysObject
135 DetailLog("{0},BSCharacter.Destroy", LocalID); 126 DetailLog("{0},BSCharacter.Destroy", LocalID);
136 PhysicsScene.TaintedObject("BSCharacter.destroy", delegate() 127 PhysicsScene.TaintedObject("BSCharacter.destroy", delegate()
137 { 128 {
138 BulletSimAPI.DestroyObject(PhysicsScene.WorldID, _localID); 129 BulletSimAPI.DestroyObject(PhysicsScene.WorldID, LocalID);
139 }); 130 });
140 } 131 }
141 132
@@ -158,7 +149,7 @@ public class BSCharacter : BSPhysObject
158 // When an avatar's size is set, only the height is changed 149 // When an avatar's size is set, only the height is changed
159 // and that really only depends on the radius. 150 // and that really only depends on the radius.
160 _size = value; 151 _size = value;
161 _scale.Z = (_size.Z * 1.15f) - (_scale.X + _scale.Y); 152 ComputeAvatarScale(_size);
162 153
163 // TODO: something has to be done with the avatar's vertical position 154 // TODO: something has to be done with the avatar's vertical position
164 155
@@ -175,11 +166,6 @@ public class BSCharacter : BSPhysObject
175 set { _pbs = value; 166 set { _pbs = value;
176 } 167 }
177 } 168 }
178 public override uint LocalID {
179 set { _localID = value;
180 }
181 get { return _localID; }
182 }
183 public override bool Grabbed { 169 public override bool Grabbed {
184 set { _grabbed = value; 170 set { _grabbed = value;
185 } 171 }
@@ -223,7 +209,7 @@ public class BSCharacter : BSPhysObject
223 PhysicsScene.TaintedObject("BSCharacter.setPosition", delegate() 209 PhysicsScene.TaintedObject("BSCharacter.setPosition", delegate()
224 { 210 {
225 DetailLog("{0},BSCharacter.SetPosition,taint,pos={1},orient={2}", LocalID, _position, _orientation); 211 DetailLog("{0},BSCharacter.SetPosition,taint,pos={1},orient={2}", LocalID, _position, _orientation);
226 BulletSimAPI.SetObjectTranslation(PhysicsScene.WorldID, _localID, _position, _orientation); 212 BulletSimAPI.SetObjectTranslation(PhysicsScene.WorldID, LocalID, _position, _orientation);
227 }); 213 });
228 } 214 }
229 } 215 }
@@ -261,7 +247,7 @@ public class BSCharacter : BSPhysObject
261 PhysicsScene.TaintedObject("BSCharacter.PositionSanityCheck", delegate() 247 PhysicsScene.TaintedObject("BSCharacter.PositionSanityCheck", delegate()
262 { 248 {
263 DetailLog("{0},BSCharacter.PositionSanityCheck,taint,pos={1},orient={2}", LocalID, _position, _orientation); 249 DetailLog("{0},BSCharacter.PositionSanityCheck,taint,pos={1},orient={2}", LocalID, _position, _orientation);
264 BulletSimAPI.SetObjectTranslation(PhysicsScene.WorldID, _localID, _position, _orientation); 250 BulletSimAPI.SetObjectTranslation(PhysicsScene.WorldID, LocalID, _position, _orientation);
265 }); 251 });
266 ret = true; 252 ret = true;
267 } 253 }
@@ -312,7 +298,7 @@ public class BSCharacter : BSPhysObject
312 PhysicsScene.TaintedObject("BSCharacter.setVelocity", delegate() 298 PhysicsScene.TaintedObject("BSCharacter.setVelocity", delegate()
313 { 299 {
314 DetailLog("{0},BSCharacter.setVelocity,taint,vel={1}", LocalID, _velocity); 300 DetailLog("{0},BSCharacter.setVelocity,taint,vel={1}", LocalID, _velocity);
315 BulletSimAPI.SetObjectVelocity(PhysicsScene.WorldID, _localID, _velocity); 301 BulletSimAPI.SetObjectVelocity(PhysicsScene.WorldID, LocalID, _velocity);
316 }); 302 });
317 } 303 }
318 } 304 }
@@ -338,7 +324,7 @@ public class BSCharacter : BSPhysObject
338 PhysicsScene.TaintedObject("BSCharacter.setOrientation", delegate() 324 PhysicsScene.TaintedObject("BSCharacter.setOrientation", delegate()
339 { 325 {
340 // _position = BulletSimAPI.GetObjectPosition(Scene.WorldID, _localID); 326 // _position = BulletSimAPI.GetObjectPosition(Scene.WorldID, _localID);
341 BulletSimAPI.SetObjectTranslation(PhysicsScene.WorldID, _localID, _position, _orientation); 327 BulletSimAPI.SetObjectTranslation(PhysicsScene.WorldID, LocalID, _position, _orientation);
342 }); 328 });
343 } 329 }
344 } 330 }
@@ -375,12 +361,12 @@ public class BSCharacter : BSPhysObject
375 set { _throttleUpdates = value; } 361 set { _throttleUpdates = value; }
376 } 362 }
377 public override bool IsColliding { 363 public override bool IsColliding {
378 get { return (_collidingStep == PhysicsScene.SimulationStep); } 364 get { return (CollidingStep == PhysicsScene.SimulationStep); }
379 set { _isColliding = value; } 365 set { _isColliding = value; }
380 } 366 }
381 public override bool CollidingGround { 367 public override bool CollidingGround {
382 get { return (_collidingGroundStep == PhysicsScene.SimulationStep); } 368 get { return (CollidingGroundStep == PhysicsScene.SimulationStep); }
383 set { _collidingGround = value; } 369 set { CollidingGround = value; }
384 } 370 }
385 public override bool CollidingObj { 371 public override bool CollidingObj {
386 get { return _collidingObj; } 372 get { return _collidingObj; }
@@ -466,6 +452,16 @@ public class BSCharacter : BSPhysObject
466 public override void SetMomentum(OMV.Vector3 momentum) { 452 public override void SetMomentum(OMV.Vector3 momentum) {
467 } 453 }
468 454
455 private void ComputeAvatarScale(OMV.Vector3 size)
456 {
457 _scale.X = PhysicsScene.Params.avatarCapsuleRadius;
458 _scale.Y = PhysicsScene.Params.avatarCapsuleRadius;
459
460 // The 1.15 came from ODE but it seems to cause the avatar to float off the ground
461 // _scale.Z = (_size.Z * 1.15f) - (_scale.X + _scale.Y);
462 _scale.Z = (_size.Z) - (_scale.X + _scale.Y);
463 }
464
469 // set _avatarVolume and _mass based on capsule size, _density and _scale 465 // set _avatarVolume and _mass based on capsule size, _density and _scale
470 private void ComputeAvatarVolumeAndMass() 466 private void ComputeAvatarVolumeAndMass()
471 { 467 {
@@ -480,7 +476,7 @@ public class BSCharacter : BSPhysObject
480 * Math.Min(_scale.X, _scale.Y) 476 * Math.Min(_scale.X, _scale.Y)
481 * _scale.Y // plus the volume of the capsule end caps 477 * _scale.Y // plus the volume of the capsule end caps
482 ); 478 );
483 _mass = _density * _avatarVolume; 479 _mass = _avatarDensity * _avatarVolume;
484 } 480 }
485 481
486 // The physics engine says that properties have updated. Update same and inform 482 // The physics engine says that properties have updated. Update same and inform
@@ -502,11 +498,5 @@ public class BSCharacter : BSPhysObject
502 DetailLog("{0},BSCharacter.UpdateProperties,call,pos={1},orient={2},vel={3},accel={4},rotVel={5},terrain={6}", 498 DetailLog("{0},BSCharacter.UpdateProperties,call,pos={1},orient={2},vel={3},accel={4},rotVel={5},terrain={6}",
503 LocalID, _position, _orientation, _velocity, _acceleration, _rotationalVelocity, heightHere); 499 LocalID, _position, _orientation, _velocity, _acceleration, _rotationalVelocity, heightHere);
504 } 500 }
505
506 // Invoke the detailed logger and output something if it's enabled.
507 private void DetailLog(string msg, params Object[] args)
508 {
509 PhysicsScene.PhysicsLogging.Write(msg, args);
510 }
511} 501}
512} 502}