aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs')
-rw-r--r--OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs46
1 files changed, 26 insertions, 20 deletions
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs b/OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs
index 8e1171a..e7bff6e 100644
--- a/OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs
@@ -89,13 +89,15 @@ public class BSCharacter : BSPhysObject
89 _appliedVelocity = OMV.Vector3.Zero; 89 _appliedVelocity = OMV.Vector3.Zero;
90 _buoyancy = ComputeBuoyancyFromFlying(isFlying); 90 _buoyancy = ComputeBuoyancyFromFlying(isFlying);
91 _currentFriction = PhysicsScene.Params.avatarStandingFriction; 91 _currentFriction = PhysicsScene.Params.avatarStandingFriction;
92 _avatarDensity = PhysicsScene.Params.avatarDensity;
92 93
93 // The dimensions of the avatar capsule are kept in the scale. 94 // The dimensions of the avatar capsule are kept in the scale.
94 // Physics creates a unit capsule which is scaled by the physics engine. 95 // Physics creates a unit capsule which is scaled by the physics engine.
95 ComputeAvatarScale(_size); 96 ComputeAvatarScale(_size);
96 _avatarDensity = PhysicsScene.Params.avatarDensity;
97 // set _avatarVolume and _mass based on capsule size, _density and Scale 97 // set _avatarVolume and _mass based on capsule size, _density and Scale
98 ComputeAvatarVolumeAndMass(); 98 ComputeAvatarVolumeAndMass();
99 DetailLog("{0},BSCharacter.create,call,size={1},scale={2},density={3},volume={4},mass={5}",
100 LocalID, _size, Scale, _avatarDensity, _avatarVolume, MassRaw);
99 101
100 ShapeData shapeData = new ShapeData(); 102 ShapeData shapeData = new ShapeData();
101 shapeData.ID = LocalID; 103 shapeData.ID = LocalID;
@@ -103,6 +105,7 @@ public class BSCharacter : BSPhysObject
103 shapeData.Position = _position; 105 shapeData.Position = _position;
104 shapeData.Rotation = _orientation; 106 shapeData.Rotation = _orientation;
105 shapeData.Velocity = _velocity; 107 shapeData.Velocity = _velocity;
108 shapeData.Size = Scale;
106 shapeData.Scale = Scale; 109 shapeData.Scale = Scale;
107 shapeData.Mass = _mass; 110 shapeData.Mass = _mass;
108 shapeData.Buoyancy = _buoyancy; 111 shapeData.Buoyancy = _buoyancy;
@@ -114,8 +117,9 @@ public class BSCharacter : BSPhysObject
114 PhysicsScene.TaintedObject("BSCharacter.create", delegate() 117 PhysicsScene.TaintedObject("BSCharacter.create", delegate()
115 { 118 {
116 DetailLog("{0},BSCharacter.create,taint", LocalID); 119 DetailLog("{0},BSCharacter.create,taint", LocalID);
117 PhysicsScene.Shapes.GetBodyAndShape(true, PhysicsScene.World, this, shapeData, null, null, null); 120 // New body and shape into BSBody and BSShape
118 121 PhysicsScene.Shapes.GetBodyAndShape(true, PhysicsScene.World, this, shapeData, null, null, null);
122
119 SetPhysicalProperties(); 123 SetPhysicalProperties();
120 }); 124 });
121 return; 125 return;
@@ -138,7 +142,7 @@ public class BSCharacter : BSPhysObject
138 142
139 ZeroMotion(); 143 ZeroMotion();
140 144
141 OMV.Vector3 localInertia = BulletSimAPI.CalculateLocalInertia2(BSShape.ptr, MassRaw); 145 OMV.Vector3 localInertia = BulletSimAPI.CalculateLocalInertia2(BSShape.ptr, MassRaw);
142 BulletSimAPI.SetMassProps2(BSBody.ptr, MassRaw, localInertia); 146 BulletSimAPI.SetMassProps2(BSBody.ptr, MassRaw, localInertia);
143 147
144 ForcePosition = _position; 148 ForcePosition = _position;
@@ -151,13 +155,13 @@ public class BSCharacter : BSPhysObject
151 { 155 {
152 BulletSimAPI.SetCcdMotionThreshold2(BSBody.ptr, PhysicsScene.Params.ccdMotionThreshold); 156 BulletSimAPI.SetCcdMotionThreshold2(BSBody.ptr, PhysicsScene.Params.ccdMotionThreshold);
153 BulletSimAPI.SetCcdSweepSphereRadius2(BSBody.ptr, PhysicsScene.Params.ccdSweptSphereRadius); 157 BulletSimAPI.SetCcdSweepSphereRadius2(BSBody.ptr, PhysicsScene.Params.ccdSweptSphereRadius);
154 } 158 }
155 159
156 BulletSimAPI.AddToCollisionFlags2(BSBody.ptr, CollisionFlags.CF_CHARACTER_OBJECT); 160 BulletSimAPI.AddToCollisionFlags2(BSBody.ptr, CollisionFlags.CF_CHARACTER_OBJECT);
157 161
158 BulletSimAPI.AddObjectToWorld2(PhysicsScene.World.ptr, BSBody.ptr); 162 BulletSimAPI.AddObjectToWorld2(PhysicsScene.World.ptr, BSBody.ptr);
159 163
160 BulletSimAPI.ForceActivationState2(BSBody.ptr, ActivationState.DISABLE_DEACTIVATION); 164 BulletSimAPI.ForceActivationState2(BSBody.ptr, ActivationState.ACTIVE_TAG);
161 BulletSimAPI.UpdateSingleAabb2(PhysicsScene.World.ptr, BSBody.ptr); 165 BulletSimAPI.UpdateSingleAabb2(PhysicsScene.World.ptr, BSBody.ptr);
162 166
163 // Do this after the object has been added to the world 167 // Do this after the object has been added to the world
@@ -176,7 +180,7 @@ public class BSCharacter : BSPhysObject
176 get 180 get
177 { 181 {
178 // Avatar capsule size is kept in the scale parameter. 182 // Avatar capsule size is kept in the scale parameter.
179 return new OMV.Vector3(Scale.X * 2, Scale.Y * 2, Scale.Z); 183 return _size;
180 } 184 }
181 185
182 set { 186 set {
@@ -184,11 +188,13 @@ public class BSCharacter : BSPhysObject
184 _size = value; 188 _size = value;
185 ComputeAvatarScale(_size); 189 ComputeAvatarScale(_size);
186 ComputeAvatarVolumeAndMass(); 190 ComputeAvatarVolumeAndMass();
191 DetailLog("{0},BSCharacter.setSize,call,scale={1},density={2},volume={3},mass={4}",
192 LocalID, Scale, _avatarDensity, _avatarVolume, MassRaw);
187 193
188 PhysicsScene.TaintedObject("BSCharacter.setSize", delegate() 194 PhysicsScene.TaintedObject("BSCharacter.setSize", delegate()
189 { 195 {
190 BulletSimAPI.SetLocalScaling2(BSShape.ptr, Scale); 196 BulletSimAPI.SetLocalScaling2(BSShape.ptr, Scale);
191 OMV.Vector3 localInertia = BulletSimAPI.CalculateLocalInertia2(BSBody.ptr, MassRaw); 197 OMV.Vector3 localInertia = BulletSimAPI.CalculateLocalInertia2(BSShape.ptr, MassRaw);
192 BulletSimAPI.SetMassProps2(BSBody.ptr, MassRaw, localInertia); 198 BulletSimAPI.SetMassProps2(BSBody.ptr, MassRaw, localInertia);
193 }); 199 });
194 200
@@ -578,13 +584,13 @@ public class BSCharacter : BSPhysObject
578 private void ComputeAvatarScale(OMV.Vector3 size) 584 private void ComputeAvatarScale(OMV.Vector3 size)
579 { 585 {
580 OMV.Vector3 newScale = OMV.Vector3.Zero; 586 OMV.Vector3 newScale = OMV.Vector3.Zero;
581 newScale.X = PhysicsScene.Params.avatarCapsuleRadius; 587 // Scale wants the diameter so mult radius by two
582 newScale.Y = PhysicsScene.Params.avatarCapsuleRadius; 588 newScale.X = PhysicsScene.Params.avatarCapsuleRadius * 2f;
589 newScale.Y = PhysicsScene.Params.avatarCapsuleRadius * 2f;
583 590
584 // The 1.15 came from ODE but it seems to cause the avatar to float off the ground 591 // From the total height, add the capsule half spheres that are at each end
585 // Scale.Z = (_size.Z * 1.15f) - (Scale.X + Scale.Y); 592 // newScale.Z = (size.Z) - Math.Min(newScale.X, newScale.Y);
586 // From the total height, remove the capsule half spheres that are at each end 593 newScale.Z = (size.Z * 2f);
587 newScale.Z = (size.Z) - (Math.Min(newScale.X, newScale.Y) * 2f);
588 Scale = newScale; 594 Scale = newScale;
589 } 595 }
590 596
@@ -593,14 +599,14 @@ public class BSCharacter : BSPhysObject
593 { 599 {
594 _avatarVolume = (float)( 600 _avatarVolume = (float)(
595 Math.PI 601 Math.PI
596 * Scale.X 602 * (Scale.X / 2f)
597 * Scale.Y // the area of capsule cylinder 603 * (Scale.Y / 2f) // the area of capsule cylinder
598 * Scale.Z // times height of capsule cylinder 604 * Scale.Z // times height of capsule cylinder
599 + 1.33333333f 605 + 1.33333333f
600 * Math.PI 606 * Math.PI
601 * Scale.X 607 * (Scale.X / 2f)
602 * Math.Min(Scale.X, Scale.Y) 608 * (Math.Min(Scale.X, Scale.Y) / 2f)
603 * Scale.Y // plus the volume of the capsule end caps 609 * (Scale.Y / 2f) // plus the volume of the capsule end caps
604 ); 610 );
605 _mass = _avatarDensity * _avatarVolume; 611 _mass = _avatarDensity * _avatarVolume;
606 } 612 }