diff options
Diffstat (limited to 'OpenSim/Region/Physics')
-rw-r--r-- | OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs | 17 | ||||
-rwxr-xr-x | OpenSim/Region/Physics/BulletSPlugin/BSParam.cs | 9 | ||||
-rwxr-xr-x | OpenSim/Region/Physics/BulletSPlugin/BSShapeCollection.cs | 32 |
3 files changed, 47 insertions, 11 deletions
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs b/OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs index c9b134c..dfcd2bf 100644 --- a/OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs | |||
@@ -657,7 +657,7 @@ public sealed class BSCharacter : BSPhysObject | |||
657 | 657 | ||
658 | private OMV.Vector3 ComputeAvatarScale(OMV.Vector3 size) | 658 | private OMV.Vector3 ComputeAvatarScale(OMV.Vector3 size) |
659 | { | 659 | { |
660 | OMV.Vector3 newScale; | 660 | OMV.Vector3 newScale = size; |
661 | 661 | ||
662 | // Bullet's capsule total height is the "passed height + radius * 2"; | 662 | // Bullet's capsule total height is the "passed height + radius * 2"; |
663 | // The base capsule is 1 unit in diameter and 2 units in height (passed radius=0.5, passed height = 1) | 663 | // The base capsule is 1 unit in diameter and 2 units in height (passed radius=0.5, passed height = 1) |
@@ -670,8 +670,6 @@ public sealed class BSCharacter : BSPhysObject | |||
670 | // for a asymmetrical capsule, other parts of the code presume it is cylindrical. | 670 | // for a asymmetrical capsule, other parts of the code presume it is cylindrical. |
671 | 671 | ||
672 | // Scale is multiplier of radius with one of "0.5" | 672 | // Scale is multiplier of radius with one of "0.5" |
673 | newScale.X = size.X / 2f; | ||
674 | newScale.Y = size.Y / 2f; | ||
675 | 673 | ||
676 | float heightAdjust = BSParam.AvatarHeightMidFudge; | 674 | float heightAdjust = BSParam.AvatarHeightMidFudge; |
677 | if (BSParam.AvatarHeightLowFudge != 0f || BSParam.AvatarHeightHighFudge != 0f) | 675 | if (BSParam.AvatarHeightLowFudge != 0f || BSParam.AvatarHeightHighFudge != 0f) |
@@ -692,8 +690,17 @@ public sealed class BSCharacter : BSPhysObject | |||
692 | heightAdjust += ((midHeightOffset) / (AVATAR_HI - AVATAR_MID)) * BSParam.AvatarHeightHighFudge; | 690 | heightAdjust += ((midHeightOffset) / (AVATAR_HI - AVATAR_MID)) * BSParam.AvatarHeightHighFudge; |
693 | } | 691 | } |
694 | } | 692 | } |
695 | // The total scale height is the central cylindar plus the caps on the two ends. | 693 | if (BSParam.AvatarShape == BSShapeCollection.AvatarShapeCapsule) |
696 | newScale.Z = (size.Z + (Math.Min(size.X, size.Y) * 2) + heightAdjust) / 2f; | 694 | { |
695 | newScale.X = size.X / 2f; | ||
696 | newScale.Y = size.Y / 2f; | ||
697 | // The total scale height is the central cylindar plus the caps on the two ends. | ||
698 | newScale.Z = (size.Z + (Math.Min(size.X, size.Y) * 2) + heightAdjust) / 2f; | ||
699 | } | ||
700 | else | ||
701 | { | ||
702 | newScale.Z = size.Z + heightAdjust; | ||
703 | } | ||
697 | // m_log.DebugFormat("{0} ComputeAvatarScale: size={1},adj={2},scale={3}", LogHeader, size, heightAdjust, newScale); | 704 | // m_log.DebugFormat("{0} ComputeAvatarScale: size={1},adj={2},scale={3}", LogHeader, size, heightAdjust, newScale); |
698 | 705 | ||
699 | // If smaller than the endcaps, just fake like we're almost that small | 706 | // If smaller than the endcaps, just fake like we're almost that small |
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSParam.cs b/OpenSim/Region/Physics/BulletSPlugin/BSParam.cs index 860193f..4d14a9e 100755 --- a/OpenSim/Region/Physics/BulletSPlugin/BSParam.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSParam.cs | |||
@@ -128,6 +128,7 @@ public static class BSParam | |||
128 | public static float AvatarAlwaysRunFactor { get; private set; } | 128 | public static float AvatarAlwaysRunFactor { get; private set; } |
129 | public static float AvatarDensity { get; private set; } | 129 | public static float AvatarDensity { get; private set; } |
130 | public static float AvatarRestitution { get; private set; } | 130 | public static float AvatarRestitution { get; private set; } |
131 | public static int AvatarShape { get; private set; } | ||
131 | public static float AvatarCapsuleWidth { get; private set; } | 132 | public static float AvatarCapsuleWidth { get; private set; } |
132 | public static float AvatarCapsuleDepth { get; private set; } | 133 | public static float AvatarCapsuleDepth { get; private set; } |
133 | public static float AvatarCapsuleHeight { get; private set; } | 134 | public static float AvatarCapsuleHeight { get; private set; } |
@@ -565,6 +566,8 @@ public static class BSParam | |||
565 | 3500f) , // 3.5 * 100 | 566 | 3500f) , // 3.5 * 100 |
566 | new ParameterDefn<float>("AvatarRestitution", "Bouncyness. Changed on avatar recreation.", | 567 | new ParameterDefn<float>("AvatarRestitution", "Bouncyness. Changed on avatar recreation.", |
567 | 0f ), | 568 | 0f ), |
569 | new ParameterDefn<int>("AvatarShape", "Code for avatar physical shape: 0:capsule, 1:cube, 2:ovoid, 2:mesh", | ||
570 | BSShapeCollection.AvatarShapeCube ) , | ||
568 | new ParameterDefn<float>("AvatarCapsuleWidth", "The distance between the sides of the avatar capsule", | 571 | new ParameterDefn<float>("AvatarCapsuleWidth", "The distance between the sides of the avatar capsule", |
569 | 0.6f ) , | 572 | 0.6f ) , |
570 | new ParameterDefn<float>("AvatarCapsuleDepth", "The distance between the front and back of the avatar capsule", | 573 | new ParameterDefn<float>("AvatarCapsuleDepth", "The distance between the front and back of the avatar capsule", |
@@ -572,11 +575,11 @@ public static class BSParam | |||
572 | new ParameterDefn<float>("AvatarCapsuleHeight", "Default height of space around avatar", | 575 | new ParameterDefn<float>("AvatarCapsuleHeight", "Default height of space around avatar", |
573 | 1.5f ), | 576 | 1.5f ), |
574 | new ParameterDefn<float>("AvatarHeightLowFudge", "A fudge factor to make small avatars stand on the ground", | 577 | new ParameterDefn<float>("AvatarHeightLowFudge", "A fudge factor to make small avatars stand on the ground", |
575 | -0.2f ), | 578 | 0f ), |
576 | new ParameterDefn<float>("AvatarHeightMidFudge", "A fudge distance to adjust average sized avatars to be standing on ground", | 579 | new ParameterDefn<float>("AvatarHeightMidFudge", "A fudge distance to adjust average sized avatars to be standing on ground", |
577 | 0.1f ), | 580 | -0.1f ), |
578 | new ParameterDefn<float>("AvatarHeightHighFudge", "A fudge factor to make tall avatars stand on the ground", | 581 | new ParameterDefn<float>("AvatarHeightHighFudge", "A fudge factor to make tall avatars stand on the ground", |
579 | 0.1f ), | 582 | 0f ), |
580 | new ParameterDefn<float>("AvatarContactProcessingThreshold", "Distance from capsule to check for collisions", | 583 | new ParameterDefn<float>("AvatarContactProcessingThreshold", "Distance from capsule to check for collisions", |
581 | 0.1f ), | 584 | 0.1f ), |
582 | new ParameterDefn<float>("AvatarStopZeroThreshold", "Movement velocity below which avatar is assumed to be stopped", | 585 | new ParameterDefn<float>("AvatarStopZeroThreshold", "Movement velocity below which avatar is assumed to be stopped", |
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSShapeCollection.cs b/OpenSim/Region/Physics/BulletSPlugin/BSShapeCollection.cs index 32bbc8f..721a8eb 100755 --- a/OpenSim/Region/Physics/BulletSPlugin/BSShapeCollection.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSShapeCollection.cs | |||
@@ -124,6 +124,10 @@ public sealed class BSShapeCollection : IDisposable | |||
124 | // Info in prim.BSShape is updated to the new shape. | 124 | // Info in prim.BSShape is updated to the new shape. |
125 | // Returns 'true' if the geometry was rebuilt. | 125 | // Returns 'true' if the geometry was rebuilt. |
126 | // Called at taint-time! | 126 | // Called at taint-time! |
127 | public const int AvatarShapeCapsule = 0; | ||
128 | public const int AvatarShapeCube = 1; | ||
129 | public const int AvatarShapeOvoid = 2; | ||
130 | public const int AvatarShapeMesh = 3; | ||
127 | private bool CreateGeom(bool forceRebuild, BSPhysObject prim, PhysicalDestructionCallback shapeCallback) | 131 | private bool CreateGeom(bool forceRebuild, BSPhysObject prim, PhysicalDestructionCallback shapeCallback) |
128 | { | 132 | { |
129 | bool ret = false; | 133 | bool ret = false; |
@@ -137,10 +141,32 @@ public sealed class BSShapeCollection : IDisposable | |||
137 | if (theChar != null) | 141 | if (theChar != null) |
138 | { | 142 | { |
139 | DereferenceExistingShape(prim, shapeCallback); | 143 | DereferenceExistingShape(prim, shapeCallback); |
140 | prim.PhysShape = BSShapeNative.GetReference(m_physicsScene, prim, | 144 | switch (BSParam.AvatarShape) |
145 | { | ||
146 | case AvatarShapeCapsule: | ||
147 | prim.PhysShape = BSShapeNative.GetReference(m_physicsScene, prim, | ||
141 | BSPhysicsShapeType.SHAPE_CAPSULE, FixedShapeKey.KEY_CAPSULE); | 148 | BSPhysicsShapeType.SHAPE_CAPSULE, FixedShapeKey.KEY_CAPSULE); |
142 | ret = true; | 149 | ret = true; |
143 | haveShape = true; | 150 | haveShape = true; |
151 | break; | ||
152 | case AvatarShapeCube: | ||
153 | prim.PhysShape = BSShapeNative.GetReference(m_physicsScene, prim, | ||
154 | BSPhysicsShapeType.SHAPE_BOX, FixedShapeKey.KEY_CAPSULE); | ||
155 | ret = true; | ||
156 | haveShape = true; | ||
157 | break; | ||
158 | case AvatarShapeOvoid: | ||
159 | // Saddly, Bullet doesn't scale spheres so this doesn't work as an avatar shape | ||
160 | prim.PhysShape = BSShapeNative.GetReference(m_physicsScene, prim, | ||
161 | BSPhysicsShapeType.SHAPE_SPHERE, FixedShapeKey.KEY_CAPSULE); | ||
162 | ret = true; | ||
163 | haveShape = true; | ||
164 | break; | ||
165 | case AvatarShapeMesh: | ||
166 | break; | ||
167 | default: | ||
168 | break; | ||
169 | } | ||
144 | } | 170 | } |
145 | 171 | ||
146 | // If the prim attributes are simple, this could be a simple Bullet native shape | 172 | // If the prim attributes are simple, this could be a simple Bullet native shape |