diff options
Diffstat (limited to 'OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs')
-rw-r--r-- | OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs | 34 |
1 files changed, 28 insertions, 6 deletions
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs b/OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs index 542f732..ff5b6ab 100644 --- a/OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs | |||
@@ -1,4 +1,4 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright (c) Contributors, http://opensimulator.org/ | 2 | * Copyright (c) Contributors, http://opensimulator.org/ |
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | 3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. |
4 | * | 4 | * |
@@ -419,7 +419,7 @@ public sealed class BSCharacter : BSPhysObject | |||
419 | DetailLog("{0},BSCharacter.setTargetVelocity,call,vel={1}", LocalID, value); | 419 | DetailLog("{0},BSCharacter.setTargetVelocity,call,vel={1}", LocalID, value); |
420 | m_targetVelocity = value; | 420 | m_targetVelocity = value; |
421 | OMV.Vector3 targetVel = value; | 421 | OMV.Vector3 targetVel = value; |
422 | if (_setAlwaysRun) | 422 | if (_setAlwaysRun && !_flying) |
423 | targetVel *= new OMV.Vector3(BSParam.AvatarAlwaysRunFactor, BSParam.AvatarAlwaysRunFactor, 0f); | 423 | targetVel *= new OMV.Vector3(BSParam.AvatarAlwaysRunFactor, BSParam.AvatarAlwaysRunFactor, 0f); |
424 | 424 | ||
425 | if (m_moveActor != null) | 425 | if (m_moveActor != null) |
@@ -481,7 +481,10 @@ public sealed class BSCharacter : BSPhysObject | |||
481 | _orientation = value; | 481 | _orientation = value; |
482 | PhysScene.TaintedObject("BSCharacter.setOrientation", delegate() | 482 | PhysScene.TaintedObject("BSCharacter.setOrientation", delegate() |
483 | { | 483 | { |
484 | ForceOrientation = _orientation; | 484 | // Bullet assumes we know what we are doing when forcing orientation |
485 | // so it lets us go against all the rules and just compensates for them later. | ||
486 | // This keeps us from flipping the capsule over which the veiwer does not understand. | ||
487 | ForceOrientation = new OMV.Quaternion(0, 0, _orientation.Z,0); | ||
485 | }); | 488 | }); |
486 | } | 489 | } |
487 | } | 490 | } |
@@ -649,12 +652,12 @@ public sealed class BSCharacter : BSPhysObject | |||
649 | OMV.Vector3 newScale; | 652 | OMV.Vector3 newScale; |
650 | 653 | ||
651 | // Bullet's capsule total height is the "passed height + radius * 2"; | 654 | // Bullet's capsule total height is the "passed height + radius * 2"; |
652 | // The base capsule is 1 diameter and 2 height (passed radius=0.5, passed height = 1) | 655 | // The base capsule is 1 unit in diameter and 2 units in height (passed radius=0.5, passed height = 1) |
653 | // The number we pass in for 'scaling' is the multiplier to get that base | 656 | // The number we pass in for 'scaling' is the multiplier to get that base |
654 | // shape to be the size desired. | 657 | // shape to be the size desired. |
655 | // So, when creating the scale for the avatar height, we take the passed height | 658 | // So, when creating the scale for the avatar height, we take the passed height |
656 | // (size.Z) and remove the caps. | 659 | // (size.Z) and remove the caps. |
657 | // Another oddity of the Bullet capsule implementation is that it presumes the Y | 660 | // An oddity of the Bullet capsule implementation is that it presumes the Y |
658 | // dimension is the radius of the capsule. Even though some of the code allows | 661 | // dimension is the radius of the capsule. Even though some of the code allows |
659 | // for a asymmetrical capsule, other parts of the code presume it is cylindrical. | 662 | // for a asymmetrical capsule, other parts of the code presume it is cylindrical. |
660 | 663 | ||
@@ -662,8 +665,27 @@ public sealed class BSCharacter : BSPhysObject | |||
662 | newScale.X = size.X / 2f; | 665 | newScale.X = size.X / 2f; |
663 | newScale.Y = size.Y / 2f; | 666 | newScale.Y = size.Y / 2f; |
664 | 667 | ||
668 | float heightAdjust = BSParam.AvatarHeightMidFudge; | ||
669 | if (BSParam.AvatarHeightLowFudge != 0f || BSParam.AvatarHeightHighFudge != 0f) | ||
670 | { | ||
671 | // An avatar is between 1.61 and 2.12 meters. Midpoint is 1.87m. | ||
672 | // The "times 4" relies on the fact that the difference from the midpoint to the extremes is exactly 0.25 | ||
673 | float midHeightOffset = size.Z - 1.87f; | ||
674 | if (midHeightOffset < 0f) | ||
675 | { | ||
676 | // Small avatar. Add the adjustment based on the distance from midheight | ||
677 | heightAdjust += -1f * midHeightOffset * 4f * BSParam.AvatarHeightLowFudge; | ||
678 | } | ||
679 | else | ||
680 | { | ||
681 | // Large avatar. Add the adjustment based on the distance from midheight | ||
682 | heightAdjust += midHeightOffset * 4f * BSParam.AvatarHeightHighFudge; | ||
683 | } | ||
684 | } | ||
665 | // The total scale height is the central cylindar plus the caps on the two ends. | 685 | // The total scale height is the central cylindar plus the caps on the two ends. |
666 | newScale.Z = (size.Z + (Math.Min(size.X, size.Y) * 2)) / 2f; | 686 | newScale.Z = (size.Z + (Math.Min(size.X, size.Y) * 2) + heightAdjust) / 2f; |
687 | // m_log.DebugFormat("{0} ComputeAvatarScale: size={1},adj={2},scale={3}", LogHeader, size, heightAdjust, newScale); | ||
688 | |||
667 | // If smaller than the endcaps, just fake like we're almost that small | 689 | // If smaller than the endcaps, just fake like we're almost that small |
668 | if (newScale.Z < 0) | 690 | if (newScale.Z < 0) |
669 | newScale.Z = 0.1f; | 691 | newScale.Z = 0.1f; |