aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Physics/BulletSPlugin
diff options
context:
space:
mode:
authorRobert Adams2014-04-02 21:53:58 -0700
committerRobert Adams2014-04-02 21:53:58 -0700
commit65c4cb48ac49bd6aa9e813a401411be5226d01a7 (patch)
treeec930505cba9332628e9ce0d576814ada83ce741 /OpenSim/Region/Physics/BulletSPlugin
parentFix problem with floating avatar by passing avatar size information (diff)
downloadopensim-SC_OLD-65c4cb48ac49bd6aa9e813a401411be5226d01a7.zip
opensim-SC_OLD-65c4cb48ac49bd6aa9e813a401411be5226d01a7.tar.gz
opensim-SC_OLD-65c4cb48ac49bd6aa9e813a401411be5226d01a7.tar.bz2
opensim-SC_OLD-65c4cb48ac49bd6aa9e813a401411be5226d01a7.tar.xz
BulletSim: make avatar physical shape to be a rectangle rather than
a capsule. Set the default to be the rectangle shape and adjust the parameters in OpenSimDefaults.ini for the new shape. The rectangle shape will perform better and avatar height can be computed more accurately.
Diffstat (limited to 'OpenSim/Region/Physics/BulletSPlugin')
-rw-r--r--OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs17
-rwxr-xr-xOpenSim/Region/Physics/BulletSPlugin/BSParam.cs9
-rwxr-xr-xOpenSim/Region/Physics/BulletSPlugin/BSShapeCollection.cs32
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