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.cs78
1 files changed, 37 insertions, 41 deletions
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs b/OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs
index e76d8a4..fa21233 100644
--- a/OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs
@@ -39,8 +39,7 @@ 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 BSScene _scene; 42 public BSScene Scene { get; private set; }
43 public BSScene Scene { get { return _scene; } }
44 private String _avName; 43 private String _avName;
45 // private bool _stopped; 44 // private bool _stopped;
46 private Vector3 _size; 45 private Vector3 _size;
@@ -92,7 +91,7 @@ public class BSCharacter : BSPhysObject
92 { 91 {
93 _localID = localID; 92 _localID = localID;
94 _avName = avName; 93 _avName = avName;
95 _scene = parent_scene; 94 Scene = parent_scene;
96 _position = pos; 95 _position = pos;
97 _size = size; 96 _size = size;
98 _flying = isFlying; 97 _flying = isFlying;
@@ -101,11 +100,11 @@ public class BSCharacter : BSPhysObject
101 _buoyancy = ComputeBuoyancyFromFlying(isFlying); 100 _buoyancy = ComputeBuoyancyFromFlying(isFlying);
102 // The dimensions of the avatar capsule are kept in the scale. 101 // The dimensions of the avatar capsule are kept in the scale.
103 // Physics creates a unit capsule which is scaled by the physics engine. 102 // Physics creates a unit capsule which is scaled by the physics engine.
104 _scale = new Vector3(_scene.Params.avatarCapsuleRadius, _scene.Params.avatarCapsuleRadius, size.Z); 103 _scale = new Vector3(Scene.Params.avatarCapsuleRadius, Scene.Params.avatarCapsuleRadius, size.Z);
105 _density = _scene.Params.avatarDensity; 104 _density = Scene.Params.avatarDensity;
106 ComputeAvatarVolumeAndMass(); // set _avatarVolume and _mass based on capsule size, _density and _scale 105 ComputeAvatarVolumeAndMass(); // set _avatarVolume and _mass based on capsule size, _density and _scale
107 106
108 Linkset = new BSLinkset(_scene, this); 107 Linkset = new BSLinkset(Scene, this);
109 108
110 ShapeData shapeData = new ShapeData(); 109 ShapeData shapeData = new ShapeData();
111 shapeData.ID = _localID; 110 shapeData.ID = _localID;
@@ -117,19 +116,19 @@ public class BSCharacter : BSPhysObject
117 shapeData.Mass = _mass; 116 shapeData.Mass = _mass;
118 shapeData.Buoyancy = _buoyancy; 117 shapeData.Buoyancy = _buoyancy;
119 shapeData.Static = ShapeData.numericFalse; 118 shapeData.Static = ShapeData.numericFalse;
120 shapeData.Friction = _scene.Params.avatarFriction; 119 shapeData.Friction = Scene.Params.avatarFriction;
121 shapeData.Restitution = _scene.Params.avatarRestitution; 120 shapeData.Restitution = Scene.Params.avatarRestitution;
122 121
123 // do actual create at taint time 122 // do actual create at taint time
124 _scene.TaintedObject("BSCharacter.create", delegate() 123 Scene.TaintedObject("BSCharacter.create", delegate()
125 { 124 {
126 DetailLog("{0},BSCharacter.create", _localID); 125 DetailLog("{0},BSCharacter.create", _localID);
127 BulletSimAPI.CreateObject(parent_scene.WorldID, shapeData); 126 BulletSimAPI.CreateObject(Scene.WorldID, shapeData);
128 127
129 // Set the buoyancy for flying. This will be refactored when all the settings happen in C# 128 // Set the buoyancy for flying. This will be refactored when all the settings happen in C#
130 BulletSimAPI.SetObjectBuoyancy(_scene.WorldID, LocalID, _buoyancy); 129 BulletSimAPI.SetObjectBuoyancy(Scene.WorldID, LocalID, _buoyancy);
131 130
132 Body = new BulletBody(LocalID, BulletSimAPI.GetBodyHandle2(_scene.World.Ptr, LocalID)); 131 Body = new BulletBody(LocalID, BulletSimAPI.GetBodyHandle2(Scene.World.Ptr, LocalID));
133 // avatars get all collisions no matter what (makes walking on ground and such work) 132 // avatars get all collisions no matter what (makes walking on ground and such work)
134 BulletSimAPI.AddToCollisionFlags2(Body.Ptr, CollisionFlags.BS_SUBSCRIBE_COLLISION_EVENTS); 133 BulletSimAPI.AddToCollisionFlags2(Body.Ptr, CollisionFlags.BS_SUBSCRIBE_COLLISION_EVENTS);
135 }); 134 });
@@ -141,9 +140,9 @@ public class BSCharacter : BSPhysObject
141 public override void Destroy() 140 public override void Destroy()
142 { 141 {
143 DetailLog("{0},BSCharacter.Destroy", LocalID); 142 DetailLog("{0},BSCharacter.Destroy", LocalID);
144 _scene.TaintedObject("BSCharacter.destroy", delegate() 143 Scene.TaintedObject("BSCharacter.destroy", delegate()
145 { 144 {
146 BulletSimAPI.DestroyObject(_scene.WorldID, _localID); 145 BulletSimAPI.DestroyObject(Scene.WorldID, _localID);
147 }); 146 });
148 } 147 }
149 148
@@ -172,9 +171,9 @@ public class BSCharacter : BSPhysObject
172 171
173 ComputeAvatarVolumeAndMass(); 172 ComputeAvatarVolumeAndMass();
174 173
175 _scene.TaintedObject("BSCharacter.setSize", delegate() 174 Scene.TaintedObject("BSCharacter.setSize", delegate()
176 { 175 {
177 BulletSimAPI.SetObjectScaleMass(_scene.WorldID, LocalID, _scale, _mass, true); 176 BulletSimAPI.SetObjectScaleMass(Scene.WorldID, LocalID, _scale, _mass, true);
178 }); 177 });
179 178
180 } 179 }
@@ -203,17 +202,17 @@ public class BSCharacter : BSPhysObject
203 202
204 public override Vector3 Position { 203 public override Vector3 Position {
205 get { 204 get {
206 // _position = BulletSimAPI.GetObjectPosition(_scene.WorldID, _localID); 205 // _position = BulletSimAPI.GetObjectPosition(Scene.WorldID, _localID);
207 return _position; 206 return _position;
208 } 207 }
209 set { 208 set {
210 _position = value; 209 _position = value;
211 PositionSanityCheck(); 210 PositionSanityCheck();
212 211
213 _scene.TaintedObject("BSCharacter.setPosition", delegate() 212 Scene.TaintedObject("BSCharacter.setPosition", delegate()
214 { 213 {
215 DetailLog("{0},BSCharacter.SetPosition,taint,pos={1},orient={2}", LocalID, _position, _orientation); 214 DetailLog("{0},BSCharacter.SetPosition,taint,pos={1},orient={2}", LocalID, _position, _orientation);
216 BulletSimAPI.SetObjectTranslation(_scene.WorldID, _localID, _position, _orientation); 215 BulletSimAPI.SetObjectTranslation(Scene.WorldID, _localID, _position, _orientation);
217 }); 216 });
218 } 217 }
219 } 218 }
@@ -229,10 +228,8 @@ public class BSCharacter : BSPhysObject
229 float terrainHeight = Scene.TerrainManager.GetTerrainHeightAtXYZ(_position); 228 float terrainHeight = Scene.TerrainManager.GetTerrainHeightAtXYZ(_position);
230 if (Position.Z < terrainHeight) 229 if (Position.Z < terrainHeight)
231 { 230 {
232 DetailLog("{0},BSCharacter.PositionAdjustUnderGround,call,pos={1},terrain={2}", LocalID, _position, terrainHeight); 231 DetailLog("{0},BSCharacter.PositionAdjustUnderGround,call,pos={1},terrain={2}", LocalID, _position, terrainHeight);
233 Vector3 newPos = _position; 232 _position.Z = terrainHeight + 2.0f;
234 newPos.Z = terrainHeight + 2.0f;
235 _position = newPos;
236 ret = true; 233 ret = true;
237 } 234 }
238 235
@@ -250,10 +247,10 @@ public class BSCharacter : BSPhysObject
250 { 247 {
251 // The new position value must be pushed into the physics engine but we can't 248 // The new position value must be pushed into the physics engine but we can't
252 // just assign to "Position" because of potential call loops. 249 // just assign to "Position" because of potential call loops.
253 _scene.TaintedObject("BSCharacter.PositionSanityCheck", delegate() 250 Scene.TaintedObject("BSCharacter.PositionSanityCheck", delegate()
254 { 251 {
255 DetailLog("{0},BSCharacter.PositionSanityCheck,taint,pos={1},orient={2}", LocalID, _position, _orientation); 252 DetailLog("{0},BSCharacter.PositionSanityCheck,taint,pos={1},orient={2}", LocalID, _position, _orientation);
256 BulletSimAPI.SetObjectTranslation(_scene.WorldID, _localID, _position, _orientation); 253 BulletSimAPI.SetObjectTranslation(Scene.WorldID, _localID, _position, _orientation);
257 }); 254 });
258 ret = true; 255 ret = true;
259 } 256 }
@@ -301,10 +298,10 @@ public class BSCharacter : BSPhysObject
301 set { 298 set {
302 _velocity = value; 299 _velocity = value;
303 // m_log.DebugFormat("{0}: set velocity = {1}", LogHeader, _velocity); 300 // m_log.DebugFormat("{0}: set velocity = {1}", LogHeader, _velocity);
304 _scene.TaintedObject("BSCharacter.setVelocity", delegate() 301 Scene.TaintedObject("BSCharacter.setVelocity", delegate()
305 { 302 {
306 DetailLog("{0},BSCharacter.setVelocity,taint,vel={1}", LocalID, _velocity); 303 DetailLog("{0},BSCharacter.setVelocity,taint,vel={1}", LocalID, _velocity);
307 BulletSimAPI.SetObjectVelocity(_scene.WorldID, _localID, _velocity); 304 BulletSimAPI.SetObjectVelocity(Scene.WorldID, _localID, _velocity);
308 }); 305 });
309 } 306 }
310 } 307 }
@@ -327,10 +324,10 @@ public class BSCharacter : BSPhysObject
327 set { 324 set {
328 _orientation = value; 325 _orientation = value;
329 // m_log.DebugFormat("{0}: set orientation to {1}", LogHeader, _orientation); 326 // m_log.DebugFormat("{0}: set orientation to {1}", LogHeader, _orientation);
330 _scene.TaintedObject("BSCharacter.setOrientation", delegate() 327 Scene.TaintedObject("BSCharacter.setOrientation", delegate()
331 { 328 {
332 // _position = BulletSimAPI.GetObjectPosition(_scene.WorldID, _localID); 329 // _position = BulletSimAPI.GetObjectPosition(Scene.WorldID, _localID);
333 BulletSimAPI.SetObjectTranslation(_scene.WorldID, _localID, _position, _orientation); 330 BulletSimAPI.SetObjectTranslation(Scene.WorldID, _localID, _position, _orientation);
334 }); 331 });
335 } 332 }
336 } 333 }
@@ -367,11 +364,11 @@ public class BSCharacter : BSPhysObject
367 set { _throttleUpdates = value; } 364 set { _throttleUpdates = value; }
368 } 365 }
369 public override bool IsColliding { 366 public override bool IsColliding {
370 get { return (_collidingStep == _scene.SimulationStep); } 367 get { return (_collidingStep == Scene.SimulationStep); }
371 set { _isColliding = value; } 368 set { _isColliding = value; }
372 } 369 }
373 public override bool CollidingGround { 370 public override bool CollidingGround {
374 get { return (_collidingGroundStep == _scene.SimulationStep); } 371 get { return (_collidingGroundStep == Scene.SimulationStep); }
375 set { _collidingGround = value; } 372 set { _collidingGround = value; }
376 } 373 }
377 public override bool CollidingObj { 374 public override bool CollidingObj {
@@ -393,10 +390,10 @@ public class BSCharacter : BSPhysObject
393 public override float Buoyancy { 390 public override float Buoyancy {
394 get { return _buoyancy; } 391 get { return _buoyancy; }
395 set { _buoyancy = value; 392 set { _buoyancy = value;
396 _scene.TaintedObject("BSCharacter.setBuoyancy", delegate() 393 Scene.TaintedObject("BSCharacter.setBuoyancy", delegate()
397 { 394 {
398 DetailLog("{0},BSCharacter.setBuoyancy,taint,buoy={1}", LocalID, _buoyancy); 395 DetailLog("{0},BSCharacter.setBuoyancy,taint,buoy={1}", LocalID, _buoyancy);
399 BulletSimAPI.SetObjectBuoyancy(_scene.WorldID, LocalID, _buoyancy); 396 BulletSimAPI.SetObjectBuoyancy(Scene.WorldID, LocalID, _buoyancy);
400 }); 397 });
401 } 398 }
402 } 399 }
@@ -440,7 +437,7 @@ public class BSCharacter : BSPhysObject
440 _force.Y += force.Y; 437 _force.Y += force.Y;
441 _force.Z += force.Z; 438 _force.Z += force.Z;
442 // m_log.DebugFormat("{0}: AddForce. adding={1}, newForce={2}", LogHeader, force, _force); 439 // m_log.DebugFormat("{0}: AddForce. adding={1}, newForce={2}", LogHeader, force, _force);
443 _scene.TaintedObject("BSCharacter.AddForce", delegate() 440 Scene.TaintedObject("BSCharacter.AddForce", delegate()
444 { 441 {
445 DetailLog("{0},BSCharacter.setAddForce,taint,addedForce={1}", LocalID, _force); 442 DetailLog("{0},BSCharacter.setAddForce,taint,addedForce={1}", LocalID, _force);
446 BulletSimAPI.AddObjectForce2(Body.Ptr, _force); 443 BulletSimAPI.AddObjectForce2(Body.Ptr, _force);
@@ -524,10 +521,9 @@ public class BSCharacter : BSPhysObject
524 // Do some sanity checking for the avatar. Make sure it's above ground and inbounds. 521 // Do some sanity checking for the avatar. Make sure it's above ground and inbounds.
525 PositionSanityCheck2(); 522 PositionSanityCheck2();
526 523
527 float heightHere = Scene.TerrainManager.GetTerrainHeightAtXYZ(_position); // just for debug 524 float heightHere = Scene.TerrainManager.GetTerrainHeightAtXYZ(_position); // only for debug
528 DetailLog("{0},BSCharacter.UpdateProperties,call,pos={1},orient={2},vel={3},accel={4},rotVel={5},terrain={6}", 525 DetailLog("{0},BSCharacter.UpdateProperties,call,pos={1},orient={2},vel={3},accel={4},rotVel={5},terrain={6}",
529 LocalID, entprop.Position, entprop.Rotation, entprop.Velocity, 526 LocalID, _position, _orientation, _velocity, _acceleration, _rotationalVelocity, heightHere);
530 entprop.Acceleration, entprop.RotationalVelocity, heightHere);
531 } 527 }
532 528
533 // Called by the scene when a collision with this object is reported 529 // Called by the scene when a collision with this object is reported
@@ -539,16 +535,16 @@ public class BSCharacter : BSPhysObject
539 // m_log.DebugFormat("{0}: Collide: ms={1}, id={2}, with={3}", LogHeader, _subscribedEventsMs, LocalID, collidingWith); 535 // m_log.DebugFormat("{0}: Collide: ms={1}, id={2}, with={3}", LogHeader, _subscribedEventsMs, LocalID, collidingWith);
540 536
541 // The following makes IsColliding() and IsCollidingGround() work 537 // The following makes IsColliding() and IsCollidingGround() work
542 _collidingStep = _scene.SimulationStep; 538 _collidingStep = Scene.SimulationStep;
543 if (collidingWith == BSScene.TERRAIN_ID || collidingWith == BSScene.GROUNDPLANE_ID) 539 if (collidingWith == BSScene.TERRAIN_ID || collidingWith == BSScene.GROUNDPLANE_ID)
544 { 540 {
545 _collidingGroundStep = _scene.SimulationStep; 541 _collidingGroundStep = Scene.SimulationStep;
546 } 542 }
547 // DetailLog("{0},BSCharacter.Collison,call,with={1}", LocalID, collidingWith); 543 // DetailLog("{0},BSCharacter.Collison,call,with={1}", LocalID, collidingWith);
548 544
549 // throttle collisions to the rate specified in the subscription 545 // throttle collisions to the rate specified in the subscription
550 if (_subscribedEventsMs != 0) { 546 if (_subscribedEventsMs != 0) {
551 int nowTime = _scene.SimulationNowTime; 547 int nowTime = Scene.SimulationNowTime;
552 if (nowTime >= _nextCollisionOkTime) { 548 if (nowTime >= _nextCollisionOkTime) {
553 _nextCollisionOkTime = nowTime + _subscribedEventsMs; 549 _nextCollisionOkTime = nowTime + _subscribedEventsMs;
554 550