diff options
Diffstat (limited to 'OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs')
-rw-r--r-- | OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs | 238 |
1 files changed, 82 insertions, 156 deletions
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs b/OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs index 526dbad..57d5726 100644 --- a/OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs | |||
@@ -28,7 +28,7 @@ using System; | |||
28 | using System.Collections.Generic; | 28 | using System.Collections.Generic; |
29 | using System.Reflection; | 29 | using System.Reflection; |
30 | using log4net; | 30 | using log4net; |
31 | using OpenMetaverse; | 31 | using OMV = OpenMetaverse; |
32 | using OpenSim.Framework; | 32 | using OpenSim.Framework; |
33 | using OpenSim.Region.Physics.Manager; | 33 | using OpenSim.Region.Physics.Manager; |
34 | 34 | ||
@@ -39,25 +39,24 @@ 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 | public BSScene Scene { get; private set; } | ||
43 | private String _avName; | 42 | private String _avName; |
44 | // private bool _stopped; | 43 | // private bool _stopped; |
45 | private Vector3 _size; | 44 | private OMV.Vector3 _size; |
46 | private Vector3 _scale; | 45 | private OMV.Vector3 _scale; |
47 | private PrimitiveBaseShape _pbs; | 46 | private PrimitiveBaseShape _pbs; |
48 | private uint _localID = 0; | 47 | private uint _localID = 0; |
49 | private bool _grabbed; | 48 | private bool _grabbed; |
50 | private bool _selected; | 49 | private bool _selected; |
51 | private Vector3 _position; | 50 | private OMV.Vector3 _position; |
52 | private float _mass; | 51 | private float _mass; |
53 | public float _density; | 52 | public float _density; |
54 | public float _avatarVolume; | 53 | public float _avatarVolume; |
55 | private Vector3 _force; | 54 | private OMV.Vector3 _force; |
56 | private Vector3 _velocity; | 55 | private OMV.Vector3 _velocity; |
57 | private Vector3 _torque; | 56 | private OMV.Vector3 _torque; |
58 | private float _collisionScore; | 57 | private float _collisionScore; |
59 | private Vector3 _acceleration; | 58 | private OMV.Vector3 _acceleration; |
60 | private Quaternion _orientation; | 59 | private OMV.Quaternion _orientation; |
61 | private int _physicsActorType; | 60 | private int _physicsActorType; |
62 | private bool _isPhysical; | 61 | private bool _isPhysical; |
63 | private bool _flying; | 62 | private bool _flying; |
@@ -69,18 +68,14 @@ public class BSCharacter : BSPhysObject | |||
69 | private long _collidingGroundStep; | 68 | private long _collidingGroundStep; |
70 | private bool _collidingObj; | 69 | private bool _collidingObj; |
71 | private bool _floatOnWater; | 70 | private bool _floatOnWater; |
72 | private Vector3 _rotationalVelocity; | 71 | private OMV.Vector3 _rotationalVelocity; |
73 | private bool _kinematic; | 72 | private bool _kinematic; |
74 | private float _buoyancy; | 73 | private float _buoyancy; |
75 | 74 | ||
76 | public override BulletBody BSBody { get; set; } | ||
77 | public override BulletShape BSShape { get; set; } | ||
78 | public override BSLinkset Linkset { get; set; } | ||
79 | |||
80 | private int _subscribedEventsMs = 0; | 75 | private int _subscribedEventsMs = 0; |
81 | private int _nextCollisionOkTime = 0; | 76 | private int _nextCollisionOkTime = 0; |
82 | 77 | ||
83 | private Vector3 _PIDTarget; | 78 | private OMV.Vector3 _PIDTarget; |
84 | private bool _usePID; | 79 | private bool _usePID; |
85 | private float _PIDTau; | 80 | private float _PIDTau; |
86 | private bool _useHoverPID; | 81 | private bool _useHoverPID; |
@@ -88,26 +83,24 @@ public class BSCharacter : BSPhysObject | |||
88 | private PIDHoverType _PIDHoverType; | 83 | private PIDHoverType _PIDHoverType; |
89 | private float _PIDHoverTao; | 84 | private float _PIDHoverTao; |
90 | 85 | ||
91 | public BSCharacter(uint localID, String avName, BSScene parent_scene, Vector3 pos, Vector3 size, bool isFlying) | 86 | public BSCharacter(uint localID, String avName, BSScene parent_scene, OMV.Vector3 pos, OMV.Vector3 size, bool isFlying) |
92 | { | 87 | { |
88 | base.BaseInitialize(parent_scene); | ||
93 | _localID = localID; | 89 | _localID = localID; |
94 | _avName = avName; | 90 | _avName = avName; |
95 | Scene = parent_scene; | ||
96 | _physicsActorType = (int)ActorTypes.Agent; | 91 | _physicsActorType = (int)ActorTypes.Agent; |
97 | _position = pos; | 92 | _position = pos; |
98 | _size = size; | 93 | _size = size; |
99 | _flying = isFlying; | 94 | _flying = isFlying; |
100 | _orientation = Quaternion.Identity; | 95 | _orientation = OMV.Quaternion.Identity; |
101 | _velocity = Vector3.Zero; | 96 | _velocity = OMV.Vector3.Zero; |
102 | _buoyancy = ComputeBuoyancyFromFlying(isFlying); | 97 | _buoyancy = ComputeBuoyancyFromFlying(isFlying); |
103 | // The dimensions of the avatar capsule are kept in the scale. | 98 | // The dimensions of the avatar capsule are kept in the scale. |
104 | // Physics creates a unit capsule which is scaled by the physics engine. | 99 | // Physics creates a unit capsule which is scaled by the physics engine. |
105 | _scale = new Vector3(Scene.Params.avatarCapsuleRadius, Scene.Params.avatarCapsuleRadius, size.Z); | 100 | _scale = new OMV.Vector3(PhysicsScene.Params.avatarCapsuleRadius, PhysicsScene.Params.avatarCapsuleRadius, size.Z); |
106 | _density = Scene.Params.avatarDensity; | 101 | _density = PhysicsScene.Params.avatarDensity; |
107 | ComputeAvatarVolumeAndMass(); // set _avatarVolume and _mass based on capsule size, _density and _scale | 102 | ComputeAvatarVolumeAndMass(); // set _avatarVolume and _mass based on capsule size, _density and _scale |
108 | 103 | ||
109 | Linkset = new BSLinkset(Scene, this); | ||
110 | |||
111 | ShapeData shapeData = new ShapeData(); | 104 | ShapeData shapeData = new ShapeData(); |
112 | shapeData.ID = _localID; | 105 | shapeData.ID = _localID; |
113 | shapeData.Type = ShapeData.PhysicsShapeType.SHAPE_AVATAR; | 106 | shapeData.Type = ShapeData.PhysicsShapeType.SHAPE_AVATAR; |
@@ -118,19 +111,19 @@ public class BSCharacter : BSPhysObject | |||
118 | shapeData.Mass = _mass; | 111 | shapeData.Mass = _mass; |
119 | shapeData.Buoyancy = _buoyancy; | 112 | shapeData.Buoyancy = _buoyancy; |
120 | shapeData.Static = ShapeData.numericFalse; | 113 | shapeData.Static = ShapeData.numericFalse; |
121 | shapeData.Friction = Scene.Params.avatarFriction; | 114 | shapeData.Friction = PhysicsScene.Params.avatarFriction; |
122 | shapeData.Restitution = Scene.Params.avatarRestitution; | 115 | shapeData.Restitution = PhysicsScene.Params.avatarRestitution; |
123 | 116 | ||
124 | // do actual create at taint time | 117 | // do actual create at taint time |
125 | Scene.TaintedObject("BSCharacter.create", delegate() | 118 | PhysicsScene.TaintedObject("BSCharacter.create", delegate() |
126 | { | 119 | { |
127 | DetailLog("{0},BSCharacter.create", _localID); | 120 | DetailLog("{0},BSCharacter.create", _localID); |
128 | BulletSimAPI.CreateObject(Scene.WorldID, shapeData); | 121 | BulletSimAPI.CreateObject(PhysicsScene.WorldID, shapeData); |
129 | 122 | ||
130 | // Set the buoyancy for flying. This will be refactored when all the settings happen in C# | 123 | // Set the buoyancy for flying. This will be refactored when all the settings happen in C# |
131 | BulletSimAPI.SetObjectBuoyancy(Scene.WorldID, LocalID, _buoyancy); | 124 | BulletSimAPI.SetObjectBuoyancy(PhysicsScene.WorldID, LocalID, _buoyancy); |
132 | 125 | ||
133 | BSBody = new BulletBody(LocalID, BulletSimAPI.GetBodyHandle2(Scene.World.Ptr, LocalID)); | 126 | BSBody = new BulletBody(LocalID, BulletSimAPI.GetBodyHandle2(PhysicsScene.World.Ptr, LocalID)); |
134 | }); | 127 | }); |
135 | 128 | ||
136 | return; | 129 | return; |
@@ -140,9 +133,9 @@ public class BSCharacter : BSPhysObject | |||
140 | public override void Destroy() | 133 | public override void Destroy() |
141 | { | 134 | { |
142 | DetailLog("{0},BSCharacter.Destroy", LocalID); | 135 | DetailLog("{0},BSCharacter.Destroy", LocalID); |
143 | Scene.TaintedObject("BSCharacter.destroy", delegate() | 136 | PhysicsScene.TaintedObject("BSCharacter.destroy", delegate() |
144 | { | 137 | { |
145 | BulletSimAPI.DestroyObject(Scene.WorldID, _localID); | 138 | BulletSimAPI.DestroyObject(PhysicsScene.WorldID, _localID); |
146 | }); | 139 | }); |
147 | } | 140 | } |
148 | 141 | ||
@@ -154,11 +147,11 @@ public class BSCharacter : BSPhysObject | |||
154 | public override bool Stopped { | 147 | public override bool Stopped { |
155 | get { return false; } | 148 | get { return false; } |
156 | } | 149 | } |
157 | public override Vector3 Size { | 150 | public override OMV.Vector3 Size { |
158 | get | 151 | get |
159 | { | 152 | { |
160 | // Avatar capsule size is kept in the scale parameter. | 153 | // Avatar capsule size is kept in the scale parameter. |
161 | return new Vector3(_scale.X * 2, _scale.Y * 2, _scale.Z); | 154 | return new OMV.Vector3(_scale.X * 2, _scale.Y * 2, _scale.Z); |
162 | } | 155 | } |
163 | 156 | ||
164 | set { | 157 | set { |
@@ -171,9 +164,9 @@ public class BSCharacter : BSPhysObject | |||
171 | 164 | ||
172 | ComputeAvatarVolumeAndMass(); | 165 | ComputeAvatarVolumeAndMass(); |
173 | 166 | ||
174 | Scene.TaintedObject("BSCharacter.setSize", delegate() | 167 | PhysicsScene.TaintedObject("BSCharacter.setSize", delegate() |
175 | { | 168 | { |
176 | BulletSimAPI.SetObjectScaleMass(Scene.WorldID, LocalID, _scale, _mass, true); | 169 | BulletSimAPI.SetObjectScaleMass(PhysicsScene.WorldID, LocalID, _scale, _mass, true); |
177 | }); | 170 | }); |
178 | 171 | ||
179 | } | 172 | } |
@@ -198,9 +191,27 @@ public class BSCharacter : BSPhysObject | |||
198 | public override void CrossingFailure() { return; } | 191 | public override void CrossingFailure() { return; } |
199 | public override void link(PhysicsActor obj) { return; } | 192 | public override void link(PhysicsActor obj) { return; } |
200 | public override void delink() { return; } | 193 | public override void delink() { return; } |
201 | public override void LockAngularMotion(Vector3 axis) { return; } | ||
202 | 194 | ||
203 | public override Vector3 Position { | 195 | // Set motion values to zero. |
196 | // Do it to the properties so the values get set in the physics engine. | ||
197 | // Push the setting of the values to the viewer. | ||
198 | // Called at taint time! | ||
199 | public override void ZeroMotion() | ||
200 | { | ||
201 | _velocity = OMV.Vector3.Zero; | ||
202 | _acceleration = OMV.Vector3.Zero; | ||
203 | _rotationalVelocity = OMV.Vector3.Zero; | ||
204 | |||
205 | // Zero some other properties directly into the physics engine | ||
206 | BulletSimAPI.SetLinearVelocity2(BSBody.Ptr, OMV.Vector3.Zero); | ||
207 | BulletSimAPI.SetAngularVelocity2(BSBody.Ptr, OMV.Vector3.Zero); | ||
208 | BulletSimAPI.SetInterpolationVelocity2(BSBody.Ptr, OMV.Vector3.Zero, OMV.Vector3.Zero); | ||
209 | BulletSimAPI.ClearForces2(BSBody.Ptr); | ||
210 | } | ||
211 | |||
212 | public override void LockAngularMotion(OMV.Vector3 axis) { return; } | ||
213 | |||
214 | public override OMV.Vector3 Position { | ||
204 | get { | 215 | get { |
205 | // _position = BulletSimAPI.GetObjectPosition(Scene.WorldID, _localID); | 216 | // _position = BulletSimAPI.GetObjectPosition(Scene.WorldID, _localID); |
206 | return _position; | 217 | return _position; |
@@ -209,10 +220,10 @@ public class BSCharacter : BSPhysObject | |||
209 | _position = value; | 220 | _position = value; |
210 | PositionSanityCheck(); | 221 | PositionSanityCheck(); |
211 | 222 | ||
212 | Scene.TaintedObject("BSCharacter.setPosition", delegate() | 223 | PhysicsScene.TaintedObject("BSCharacter.setPosition", delegate() |
213 | { | 224 | { |
214 | DetailLog("{0},BSCharacter.SetPosition,taint,pos={1},orient={2}", LocalID, _position, _orientation); | 225 | DetailLog("{0},BSCharacter.SetPosition,taint,pos={1},orient={2}", LocalID, _position, _orientation); |
215 | BulletSimAPI.SetObjectTranslation(Scene.WorldID, _localID, _position, _orientation); | 226 | BulletSimAPI.SetObjectTranslation(PhysicsScene.WorldID, _localID, _position, _orientation); |
216 | }); | 227 | }); |
217 | } | 228 | } |
218 | } | 229 | } |
@@ -225,7 +236,7 @@ public class BSCharacter : BSPhysObject | |||
225 | bool ret = false; | 236 | bool ret = false; |
226 | 237 | ||
227 | // If below the ground, move the avatar up | 238 | // If below the ground, move the avatar up |
228 | float terrainHeight = Scene.TerrainManager.GetTerrainHeightAtXYZ(_position); | 239 | float terrainHeight = PhysicsScene.TerrainManager.GetTerrainHeightAtXYZ(_position); |
229 | if (Position.Z < terrainHeight) | 240 | if (Position.Z < terrainHeight) |
230 | { | 241 | { |
231 | DetailLog("{0},BSCharacter.PositionAdjustUnderGround,call,pos={1},terrain={2}", LocalID, _position, terrainHeight); | 242 | DetailLog("{0},BSCharacter.PositionAdjustUnderGround,call,pos={1},terrain={2}", LocalID, _position, terrainHeight); |
@@ -247,10 +258,10 @@ public class BSCharacter : BSPhysObject | |||
247 | { | 258 | { |
248 | // The new position value must be pushed into the physics engine but we can't | 259 | // The new position value must be pushed into the physics engine but we can't |
249 | // just assign to "Position" because of potential call loops. | 260 | // just assign to "Position" because of potential call loops. |
250 | Scene.TaintedObject("BSCharacter.PositionSanityCheck", delegate() | 261 | PhysicsScene.TaintedObject("BSCharacter.PositionSanityCheck", delegate() |
251 | { | 262 | { |
252 | DetailLog("{0},BSCharacter.PositionSanityCheck,taint,pos={1},orient={2}", LocalID, _position, _orientation); | 263 | DetailLog("{0},BSCharacter.PositionSanityCheck,taint,pos={1},orient={2}", LocalID, _position, _orientation); |
253 | BulletSimAPI.SetObjectTranslation(Scene.WorldID, _localID, _position, _orientation); | 264 | BulletSimAPI.SetObjectTranslation(PhysicsScene.WorldID, _localID, _position, _orientation); |
254 | }); | 265 | }); |
255 | ret = true; | 266 | ret = true; |
256 | } | 267 | } |
@@ -266,15 +277,15 @@ public class BSCharacter : BSPhysObject | |||
266 | // used when we only want this prim's mass and not the linkset thing | 277 | // used when we only want this prim's mass and not the linkset thing |
267 | public override float MassRaw { get {return _mass; } } | 278 | public override float MassRaw { get {return _mass; } } |
268 | 279 | ||
269 | public override Vector3 Force { | 280 | public override OMV.Vector3 Force { |
270 | get { return _force; } | 281 | get { return _force; } |
271 | set { | 282 | set { |
272 | _force = value; | 283 | _force = value; |
273 | // m_log.DebugFormat("{0}: Force = {1}", LogHeader, _force); | 284 | // m_log.DebugFormat("{0}: Force = {1}", LogHeader, _force); |
274 | Scene.TaintedObject("BSCharacter.SetForce", delegate() | 285 | PhysicsScene.TaintedObject("BSCharacter.SetForce", delegate() |
275 | { | 286 | { |
276 | DetailLog("{0},BSCharacter.setForce,taint,force={1}", LocalID, _force); | 287 | DetailLog("{0},BSCharacter.setForce,taint,force={1}", LocalID, _force); |
277 | BulletSimAPI.SetObjectForce(Scene.WorldID, LocalID, _force); | 288 | BulletSimAPI.SetObjectForce(PhysicsScene.WorldID, LocalID, _force); |
278 | }); | 289 | }); |
279 | } | 290 | } |
280 | } | 291 | } |
@@ -284,28 +295,28 @@ public class BSCharacter : BSPhysObject | |||
284 | set { return; } | 295 | set { return; } |
285 | } | 296 | } |
286 | public override void VehicleFloatParam(int param, float value) { } | 297 | public override void VehicleFloatParam(int param, float value) { } |
287 | public override void VehicleVectorParam(int param, Vector3 value) {} | 298 | public override void VehicleVectorParam(int param, OMV.Vector3 value) {} |
288 | public override void VehicleRotationParam(int param, Quaternion rotation) { } | 299 | public override void VehicleRotationParam(int param, OMV.Quaternion rotation) { } |
289 | public override void VehicleFlags(int param, bool remove) { } | 300 | public override void VehicleFlags(int param, bool remove) { } |
290 | 301 | ||
291 | // Allows the detection of collisions with inherently non-physical prims. see llVolumeDetect for more | 302 | // Allows the detection of collisions with inherently non-physical prims. see llVolumeDetect for more |
292 | public override void SetVolumeDetect(int param) { return; } | 303 | public override void SetVolumeDetect(int param) { return; } |
293 | 304 | ||
294 | public override Vector3 GeometricCenter { get { return Vector3.Zero; } } | 305 | public override OMV.Vector3 GeometricCenter { get { return OMV.Vector3.Zero; } } |
295 | public override Vector3 CenterOfMass { get { return Vector3.Zero; } } | 306 | public override OMV.Vector3 CenterOfMass { get { return OMV.Vector3.Zero; } } |
296 | public override Vector3 Velocity { | 307 | public override OMV.Vector3 Velocity { |
297 | get { return _velocity; } | 308 | get { return _velocity; } |
298 | set { | 309 | set { |
299 | _velocity = value; | 310 | _velocity = value; |
300 | // m_log.DebugFormat("{0}: set velocity = {1}", LogHeader, _velocity); | 311 | // m_log.DebugFormat("{0}: set velocity = {1}", LogHeader, _velocity); |
301 | Scene.TaintedObject("BSCharacter.setVelocity", delegate() | 312 | PhysicsScene.TaintedObject("BSCharacter.setVelocity", delegate() |
302 | { | 313 | { |
303 | DetailLog("{0},BSCharacter.setVelocity,taint,vel={1}", LocalID, _velocity); | 314 | DetailLog("{0},BSCharacter.setVelocity,taint,vel={1}", LocalID, _velocity); |
304 | BulletSimAPI.SetObjectVelocity(Scene.WorldID, _localID, _velocity); | 315 | BulletSimAPI.SetObjectVelocity(PhysicsScene.WorldID, _localID, _velocity); |
305 | }); | 316 | }); |
306 | } | 317 | } |
307 | } | 318 | } |
308 | public override Vector3 Torque { | 319 | public override OMV.Vector3 Torque { |
309 | get { return _torque; } | 320 | get { return _torque; } |
310 | set { _torque = value; | 321 | set { _torque = value; |
311 | } | 322 | } |
@@ -315,19 +326,19 @@ public class BSCharacter : BSPhysObject | |||
315 | set { _collisionScore = value; | 326 | set { _collisionScore = value; |
316 | } | 327 | } |
317 | } | 328 | } |
318 | public override Vector3 Acceleration { | 329 | public override OMV.Vector3 Acceleration { |
319 | get { return _acceleration; } | 330 | get { return _acceleration; } |
320 | set { _acceleration = value; } | 331 | set { _acceleration = value; } |
321 | } | 332 | } |
322 | public override Quaternion Orientation { | 333 | public override OMV.Quaternion Orientation { |
323 | get { return _orientation; } | 334 | get { return _orientation; } |
324 | set { | 335 | set { |
325 | _orientation = value; | 336 | _orientation = value; |
326 | // m_log.DebugFormat("{0}: set orientation to {1}", LogHeader, _orientation); | 337 | // m_log.DebugFormat("{0}: set orientation to {1}", LogHeader, _orientation); |
327 | Scene.TaintedObject("BSCharacter.setOrientation", delegate() | 338 | PhysicsScene.TaintedObject("BSCharacter.setOrientation", delegate() |
328 | { | 339 | { |
329 | // _position = BulletSimAPI.GetObjectPosition(Scene.WorldID, _localID); | 340 | // _position = BulletSimAPI.GetObjectPosition(Scene.WorldID, _localID); |
330 | BulletSimAPI.SetObjectTranslation(Scene.WorldID, _localID, _position, _orientation); | 341 | BulletSimAPI.SetObjectTranslation(PhysicsScene.WorldID, _localID, _position, _orientation); |
331 | }); | 342 | }); |
332 | } | 343 | } |
333 | } | 344 | } |
@@ -364,11 +375,11 @@ public class BSCharacter : BSPhysObject | |||
364 | set { _throttleUpdates = value; } | 375 | set { _throttleUpdates = value; } |
365 | } | 376 | } |
366 | public override bool IsColliding { | 377 | public override bool IsColliding { |
367 | get { return (_collidingStep == Scene.SimulationStep); } | 378 | get { return (_collidingStep == PhysicsScene.SimulationStep); } |
368 | set { _isColliding = value; } | 379 | set { _isColliding = value; } |
369 | } | 380 | } |
370 | public override bool CollidingGround { | 381 | public override bool CollidingGround { |
371 | get { return (_collidingGroundStep == Scene.SimulationStep); } | 382 | get { return (_collidingGroundStep == PhysicsScene.SimulationStep); } |
372 | set { _collidingGround = value; } | 383 | set { _collidingGround = value; } |
373 | } | 384 | } |
374 | public override bool CollidingObj { | 385 | public override bool CollidingObj { |
@@ -378,7 +389,7 @@ public class BSCharacter : BSPhysObject | |||
378 | public override bool FloatOnWater { | 389 | public override bool FloatOnWater { |
379 | set { _floatOnWater = value; } | 390 | set { _floatOnWater = value; } |
380 | } | 391 | } |
381 | public override Vector3 RotationalVelocity { | 392 | public override OMV.Vector3 RotationalVelocity { |
382 | get { return _rotationalVelocity; } | 393 | get { return _rotationalVelocity; } |
383 | set { _rotationalVelocity = value; } | 394 | set { _rotationalVelocity = value; } |
384 | } | 395 | } |
@@ -390,16 +401,16 @@ public class BSCharacter : BSPhysObject | |||
390 | public override float Buoyancy { | 401 | public override float Buoyancy { |
391 | get { return _buoyancy; } | 402 | get { return _buoyancy; } |
392 | set { _buoyancy = value; | 403 | set { _buoyancy = value; |
393 | Scene.TaintedObject("BSCharacter.setBuoyancy", delegate() | 404 | PhysicsScene.TaintedObject("BSCharacter.setBuoyancy", delegate() |
394 | { | 405 | { |
395 | DetailLog("{0},BSCharacter.setBuoyancy,taint,buoy={1}", LocalID, _buoyancy); | 406 | DetailLog("{0},BSCharacter.setBuoyancy,taint,buoy={1}", LocalID, _buoyancy); |
396 | BulletSimAPI.SetObjectBuoyancy(Scene.WorldID, LocalID, _buoyancy); | 407 | BulletSimAPI.SetObjectBuoyancy(PhysicsScene.WorldID, LocalID, _buoyancy); |
397 | }); | 408 | }); |
398 | } | 409 | } |
399 | } | 410 | } |
400 | 411 | ||
401 | // Used for MoveTo | 412 | // Used for MoveTo |
402 | public override Vector3 PIDTarget { | 413 | public override OMV.Vector3 PIDTarget { |
403 | set { _PIDTarget = value; } | 414 | set { _PIDTarget = value; } |
404 | } | 415 | } |
405 | public override bool PIDActive { | 416 | public override bool PIDActive { |
@@ -425,19 +436,19 @@ public class BSCharacter : BSPhysObject | |||
425 | } | 436 | } |
426 | 437 | ||
427 | // For RotLookAt | 438 | // For RotLookAt |
428 | public override Quaternion APIDTarget { set { return; } } | 439 | public override OMV.Quaternion APIDTarget { set { return; } } |
429 | public override bool APIDActive { set { return; } } | 440 | public override bool APIDActive { set { return; } } |
430 | public override float APIDStrength { set { return; } } | 441 | public override float APIDStrength { set { return; } } |
431 | public override float APIDDamping { set { return; } } | 442 | public override float APIDDamping { set { return; } } |
432 | 443 | ||
433 | public override void AddForce(Vector3 force, bool pushforce) { | 444 | public override void AddForce(OMV.Vector3 force, bool pushforce) { |
434 | if (force.IsFinite()) | 445 | if (force.IsFinite()) |
435 | { | 446 | { |
436 | _force.X += force.X; | 447 | _force.X += force.X; |
437 | _force.Y += force.Y; | 448 | _force.Y += force.Y; |
438 | _force.Z += force.Z; | 449 | _force.Z += force.Z; |
439 | // m_log.DebugFormat("{0}: AddForce. adding={1}, newForce={2}", LogHeader, force, _force); | 450 | // m_log.DebugFormat("{0}: AddForce. adding={1}, newForce={2}", LogHeader, force, _force); |
440 | Scene.TaintedObject("BSCharacter.AddForce", delegate() | 451 | PhysicsScene.TaintedObject("BSCharacter.AddForce", delegate() |
441 | { | 452 | { |
442 | DetailLog("{0},BSCharacter.setAddForce,taint,addedForce={1}", LocalID, _force); | 453 | DetailLog("{0},BSCharacter.setAddForce,taint,addedForce={1}", LocalID, _force); |
443 | BulletSimAPI.SetObjectForce2(BSBody.Ptr, _force); | 454 | BulletSimAPI.SetObjectForce2(BSBody.Ptr, _force); |
@@ -450,42 +461,9 @@ public class BSCharacter : BSPhysObject | |||
450 | //m_lastUpdateSent = false; | 461 | //m_lastUpdateSent = false; |
451 | } | 462 | } |
452 | 463 | ||
453 | public override void AddAngularForce(Vector3 force, bool pushforce) { | 464 | public override void AddAngularForce(OMV.Vector3 force, bool pushforce) { |
454 | } | ||
455 | public override void SetMomentum(Vector3 momentum) { | ||
456 | } | ||
457 | |||
458 | // Turn on collision events at a rate no faster than one every the given milliseconds | ||
459 | public override void SubscribeEvents(int ms) { | ||
460 | _subscribedEventsMs = ms; | ||
461 | if (ms > 0) | ||
462 | { | ||
463 | // make sure first collision happens | ||
464 | _nextCollisionOkTime = Util.EnvironmentTickCount() - _subscribedEventsMs; | ||
465 | |||
466 | Scene.TaintedObject("BSCharacter.SubscribeEvents", delegate() | ||
467 | { | ||
468 | BulletSimAPI.AddToCollisionFlags2(BSBody.Ptr, CollisionFlags.BS_SUBSCRIBE_COLLISION_EVENTS); | ||
469 | }); | ||
470 | } | ||
471 | } | 465 | } |
472 | 466 | public override void SetMomentum(OMV.Vector3 momentum) { | |
473 | public override void ZeroMotion() | ||
474 | { | ||
475 | return; | ||
476 | } | ||
477 | |||
478 | // Stop collision events | ||
479 | public override void UnSubscribeEvents() { | ||
480 | _subscribedEventsMs = 0; | ||
481 | Scene.TaintedObject("BSCharacter.UnSubscribeEvents", delegate() | ||
482 | { | ||
483 | BulletSimAPI.RemoveFromCollisionFlags2(BSBody.Ptr, CollisionFlags.BS_SUBSCRIBE_COLLISION_EVENTS); | ||
484 | }); | ||
485 | } | ||
486 | // Return 'true' if someone has subscribed to events | ||
487 | public override bool SubscribedEvents() { | ||
488 | return (_subscribedEventsMs > 0); | ||
489 | } | 467 | } |
490 | 468 | ||
491 | // set _avatarVolume and _mass based on capsule size, _density and _scale | 469 | // set _avatarVolume and _mass based on capsule size, _density and _scale |
@@ -520,67 +498,15 @@ public class BSCharacter : BSPhysObject | |||
520 | // Do some sanity checking for the avatar. Make sure it's above ground and inbounds. | 498 | // Do some sanity checking for the avatar. Make sure it's above ground and inbounds. |
521 | PositionSanityCheck2(); | 499 | PositionSanityCheck2(); |
522 | 500 | ||
523 | float heightHere = Scene.TerrainManager.GetTerrainHeightAtXYZ(_position); // only for debug | 501 | float heightHere = PhysicsScene.TerrainManager.GetTerrainHeightAtXYZ(_position); // only for debug |
524 | DetailLog("{0},BSCharacter.UpdateProperties,call,pos={1},orient={2},vel={3},accel={4},rotVel={5},terrain={6}", | 502 | DetailLog("{0},BSCharacter.UpdateProperties,call,pos={1},orient={2},vel={3},accel={4},rotVel={5},terrain={6}", |
525 | LocalID, _position, _orientation, _velocity, _acceleration, _rotationalVelocity, heightHere); | 503 | LocalID, _position, _orientation, _velocity, _acceleration, _rotationalVelocity, heightHere); |
526 | } | 504 | } |
527 | 505 | ||
528 | // Called by the scene when a collision with this object is reported | ||
529 | // The collision, if it should be reported to the character, is placed in a collection | ||
530 | // that will later be sent to the simulator when SendCollisions() is called. | ||
531 | CollisionEventUpdate collisionCollection = null; | ||
532 | public override bool Collide(uint collidingWith, BSPhysObject collidee, Vector3 contactPoint, Vector3 contactNormal, float pentrationDepth) | ||
533 | { | ||
534 | bool ret = false; | ||
535 | |||
536 | // The following makes IsColliding() and IsCollidingGround() work | ||
537 | _collidingStep = Scene.SimulationStep; | ||
538 | if (collidingWith <= Scene.TerrainManager.HighestTerrainID) | ||
539 | { | ||
540 | _collidingGroundStep = Scene.SimulationStep; | ||
541 | } | ||
542 | // DetailLog("{0},BSCharacter.Collison,call,with={1}", LocalID, collidingWith); | ||
543 | |||
544 | // throttle collisions to the rate specified in the subscription | ||
545 | if (SubscribedEvents()) { | ||
546 | int nowTime = Scene.SimulationNowTime; | ||
547 | if (nowTime >= _nextCollisionOkTime) { | ||
548 | _nextCollisionOkTime = nowTime + _subscribedEventsMs; | ||
549 | |||
550 | if (collisionCollection == null) | ||
551 | collisionCollection = new CollisionEventUpdate(); | ||
552 | collisionCollection.AddCollider(collidingWith, new ContactPoint(contactPoint, contactNormal, pentrationDepth)); | ||
553 | ret = true; | ||
554 | } | ||
555 | } | ||
556 | return ret; | ||
557 | } | ||
558 | |||
559 | public override void SendCollisions() | ||
560 | { | ||
561 | /* | ||
562 | if (collisionCollection != null && collisionCollection.Count > 0) | ||
563 | { | ||
564 | base.SendCollisionUpdate(collisionCollection); | ||
565 | collisionCollection = null; | ||
566 | } | ||
567 | */ | ||
568 | // Kludge to make a collision call even if there are no collisions. | ||
569 | // This causes the avatar animation to get updated. | ||
570 | if (collisionCollection == null) | ||
571 | collisionCollection = new CollisionEventUpdate(); | ||
572 | base.SendCollisionUpdate(collisionCollection); | ||
573 | // If there were any collisions in the collection, make sure we don't use the | ||
574 | // same instance next time. | ||
575 | if (collisionCollection.Count > 0) | ||
576 | collisionCollection = null; | ||
577 | // End kludge | ||
578 | } | ||
579 | |||
580 | // Invoke the detailed logger and output something if it's enabled. | 506 | // Invoke the detailed logger and output something if it's enabled. |
581 | private void DetailLog(string msg, params Object[] args) | 507 | private void DetailLog(string msg, params Object[] args) |
582 | { | 508 | { |
583 | Scene.PhysicsLogging.Write(msg, args); | 509 | PhysicsScene.PhysicsLogging.Write(msg, args); |
584 | } | 510 | } |
585 | } | 511 | } |
586 | } | 512 | } |