diff options
Diffstat (limited to 'OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs')
-rw-r--r-- | OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs | 102 |
1 files changed, 61 insertions, 41 deletions
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs b/OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs index b08d5db..dc0c008 100644 --- a/OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs | |||
@@ -74,7 +74,7 @@ public class BSCharacter : PhysicsActor | |||
74 | private float _buoyancy; | 74 | private float _buoyancy; |
75 | 75 | ||
76 | private int _subscribedEventsMs = 0; | 76 | private int _subscribedEventsMs = 0; |
77 | private int _lastCollisionTime = 0; | 77 | private int _nextCollisionOkTime = 0; |
78 | 78 | ||
79 | private Vector3 _PIDTarget; | 79 | private Vector3 _PIDTarget; |
80 | private bool _usePID; | 80 | private bool _usePID; |
@@ -360,17 +360,22 @@ public class BSCharacter : PhysicsActor | |||
360 | } | 360 | } |
361 | //m_lastUpdateSent = false; | 361 | //m_lastUpdateSent = false; |
362 | } | 362 | } |
363 | |||
363 | public override void AddAngularForce(Vector3 force, bool pushforce) { | 364 | public override void AddAngularForce(Vector3 force, bool pushforce) { |
364 | } | 365 | } |
365 | public override void SetMomentum(Vector3 momentum) { | 366 | public override void SetMomentum(Vector3 momentum) { |
366 | } | 367 | } |
368 | |||
369 | // Turn on collision events at a rate no faster than one every the given milliseconds | ||
367 | public override void SubscribeEvents(int ms) { | 370 | public override void SubscribeEvents(int ms) { |
368 | _subscribedEventsMs = ms; | 371 | _subscribedEventsMs = ms; |
369 | _lastCollisionTime = Util.EnvironmentTickCount() - _subscribedEventsMs; // make first collision happen | 372 | _nextCollisionOkTime = Util.EnvironmentTickCount() - _subscribedEventsMs; // make first collision happen |
370 | } | 373 | } |
374 | // Stop collision events | ||
371 | public override void UnSubscribeEvents() { | 375 | public override void UnSubscribeEvents() { |
372 | _subscribedEventsMs = 0; | 376 | _subscribedEventsMs = 0; |
373 | } | 377 | } |
378 | // Return 'true' if someone has subscribed to events | ||
374 | public override bool SubscribedEvents() { | 379 | public override bool SubscribedEvents() { |
375 | return (_subscribedEventsMs > 0); | 380 | return (_subscribedEventsMs > 0); |
376 | } | 381 | } |
@@ -386,47 +391,57 @@ public class BSCharacter : PhysicsActor | |||
386 | _mass = _density * _avatarVolume; | 391 | _mass = _density * _avatarVolume; |
387 | } | 392 | } |
388 | 393 | ||
394 | // Set to 'true' if the individual changed items should be checked | ||
395 | // (someday RequestPhysicsTerseUpdate() will take a bitmap of changed properties) | ||
396 | const bool SHOULD_CHECK_FOR_INDIVIDUAL_CHANGES = false; | ||
397 | |||
389 | // The physics engine says that properties have updated. Update same and inform | 398 | // The physics engine says that properties have updated. Update same and inform |
390 | // the world that things have changed. | 399 | // the world that things have changed. |
391 | public void UpdateProperties(EntityProperties entprop) | 400 | public void UpdateProperties(EntityProperties entprop) |
392 | { | 401 | { |
393 | bool changed = false; | 402 | bool changed = false; |
394 | // we assign to the local variables so the normal set action does not happen | 403 | if (SHOULD_CHECK_FOR_INDIVIDUAL_CHANGES) { |
395 | if (_position != entprop.Position) | 404 | // we assign to the local variables so the normal set action does not happen |
396 | { | 405 | if (_position != entprop.Position) { |
397 | _position = entprop.Position; | 406 | _position = entprop.Position; |
398 | changed = true; | 407 | changed = true; |
408 | } | ||
409 | if (_orientation != entprop.Rotation) { | ||
410 | _orientation = entprop.Rotation; | ||
411 | changed = true; | ||
412 | } | ||
413 | if (_velocity != entprop.Velocity) { | ||
414 | _velocity = entprop.Velocity; | ||
415 | changed = true; | ||
416 | } | ||
417 | if (_acceleration != entprop.Acceleration) { | ||
418 | _acceleration = entprop.Acceleration; | ||
419 | changed = true; | ||
420 | } | ||
421 | if (_rotationalVelocity != entprop.RotationalVelocity) { | ||
422 | _rotationalVelocity = entprop.RotationalVelocity; | ||
423 | changed = true; | ||
424 | } | ||
425 | if (changed) { | ||
426 | // m_log.DebugFormat("{0}: UpdateProperties: id={1}, c={2}, pos={3}, rot={4}", LogHeader, LocalID, changed, _position, _orientation); | ||
427 | // Avatar movement is not done by generating this event. There is code in the heartbeat | ||
428 | // loop that updates avatars. | ||
429 | // base.RequestPhysicsterseUpdate(); | ||
430 | } | ||
399 | } | 431 | } |
400 | if (_orientation != entprop.Rotation) | 432 | else { |
401 | { | 433 | _position = entprop.Position; |
402 | _orientation = entprop.Rotation; | 434 | _orientation = entprop.Rotation; |
403 | changed = true; | ||
404 | } | ||
405 | if (_velocity != entprop.Velocity) | ||
406 | { | ||
407 | _velocity = entprop.Velocity; | 435 | _velocity = entprop.Velocity; |
408 | changed = true; | ||
409 | } | ||
410 | if (_acceleration != entprop.Acceleration) | ||
411 | { | ||
412 | _acceleration = entprop.Acceleration; | 436 | _acceleration = entprop.Acceleration; |
413 | changed = true; | ||
414 | } | ||
415 | if (_rotationalVelocity != entprop.RotationalVelocity) | ||
416 | { | ||
417 | _rotationalVelocity = entprop.RotationalVelocity; | 437 | _rotationalVelocity = entprop.RotationalVelocity; |
418 | changed = true; | ||
419 | } | ||
420 | if (changed) | ||
421 | { | ||
422 | // m_log.DebugFormat("{0}: UpdateProperties: id={1}, c={2}, pos={3}, rot={4}", LogHeader, LocalID, changed, _position, _orientation); | ||
423 | // Avatar movement is not done by generating this event. There is a system that | ||
424 | // checks for avatar updates each heartbeat loop. | ||
425 | // base.RequestPhysicsterseUpdate(); | 438 | // base.RequestPhysicsterseUpdate(); |
426 | } | 439 | } |
427 | } | 440 | } |
428 | 441 | ||
429 | // Called by the scene when a collision with this object is reported | 442 | // Called by the scene when a collision with this object is reported |
443 | // The collision, if it should be reported to the character, is placed in a collection | ||
444 | // that will later be sent to the simulator when SendCollisions() is called. | ||
430 | CollisionEventUpdate collisionCollection = null; | 445 | CollisionEventUpdate collisionCollection = null; |
431 | public void Collide(uint collidingWith, ActorTypes type, Vector3 contactPoint, Vector3 contactNormal, float pentrationDepth) | 446 | public void Collide(uint collidingWith, ActorTypes type, Vector3 contactPoint, Vector3 contactNormal, float pentrationDepth) |
432 | { | 447 | { |
@@ -440,29 +455,34 @@ public class BSCharacter : PhysicsActor | |||
440 | } | 455 | } |
441 | 456 | ||
442 | // throttle collisions to the rate specified in the subscription | 457 | // throttle collisions to the rate specified in the subscription |
443 | if (_subscribedEventsMs == 0) return; // don't want collisions | 458 | if (_subscribedEventsMs != 0) { |
444 | int nowTime = _scene.SimulationNowTime; | 459 | int nowTime = _scene.SimulationNowTime; |
445 | if (nowTime < (_lastCollisionTime + _subscribedEventsMs)) return; | 460 | if (nowTime >= _nextCollisionOkTime) { |
446 | _lastCollisionTime = nowTime; | 461 | _nextCollisionOkTime = nowTime + _subscribedEventsMs; |
447 | 462 | ||
448 | if (collisionCollection == null) | 463 | if (collisionCollection == null) |
449 | collisionCollection = new CollisionEventUpdate(); | 464 | collisionCollection = new CollisionEventUpdate(); |
450 | collisionCollection.AddCollider(collidingWith, new ContactPoint(contactPoint, contactNormal, pentrationDepth)); | 465 | collisionCollection.AddCollider(collidingWith, new ContactPoint(contactPoint, contactNormal, pentrationDepth)); |
466 | } | ||
467 | } | ||
451 | } | 468 | } |
452 | 469 | ||
453 | public void SendCollisions() | 470 | public void SendCollisions() |
454 | { | 471 | { |
455 | // if (collisionCollection != null) | 472 | /* |
456 | // { | 473 | if (collisionCollection != null && collisionCollection.Count > 0) |
457 | // base.SendCollisionUpdate(collisionCollection); | 474 | { |
458 | // collisionCollection = null; | 475 | base.SendCollisionUpdate(collisionCollection); |
459 | // } | 476 | collisionCollection = null; |
477 | } | ||
478 | */ | ||
460 | // Kludge to make a collision call even if there are no collisions. | 479 | // Kludge to make a collision call even if there are no collisions. |
461 | // This causes the avatar animation to get updated. | 480 | // This causes the avatar animation to get updated. |
462 | if (collisionCollection == null) | 481 | if (collisionCollection == null) |
463 | collisionCollection = new CollisionEventUpdate(); | 482 | collisionCollection = new CollisionEventUpdate(); |
464 | base.SendCollisionUpdate(collisionCollection); | 483 | base.SendCollisionUpdate(collisionCollection); |
465 | collisionCollection = null; | 484 | collisionCollection.Clear(); |
485 | // End kludge | ||
466 | } | 486 | } |
467 | 487 | ||
468 | } | 488 | } |