aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs')
-rw-r--r--OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs55
1 files changed, 42 insertions, 13 deletions
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs b/OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs
index 7fd7b82..bf8a004 100644
--- a/OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs
@@ -80,6 +80,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin
80 private Quaternion m_referenceFrame = Quaternion.Identity; 80 private Quaternion m_referenceFrame = Quaternion.Identity;
81 81
82 // Linear properties 82 // Linear properties
83 private BSVMotor m_linearMotor = new BSVMotor("LinearMotor");
83 private Vector3 m_linearMotorDirection = Vector3.Zero; // velocity requested by LSL, decayed by time 84 private Vector3 m_linearMotorDirection = Vector3.Zero; // velocity requested by LSL, decayed by time
84 private Vector3 m_linearMotorOffset = Vector3.Zero; // the point of force can be offset from the center 85 private Vector3 m_linearMotorOffset = Vector3.Zero; // the point of force can be offset from the center
85 private Vector3 m_linearMotorDirectionLASTSET = Vector3.Zero; // velocity requested by LSL 86 private Vector3 m_linearMotorDirectionLASTSET = Vector3.Zero; // velocity requested by LSL
@@ -152,7 +153,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin
152 m_angularDeflectionTimescale = Math.Max(pValue, 0.01f); 153 m_angularDeflectionTimescale = Math.Max(pValue, 0.01f);
153 break; 154 break;
154 case Vehicle.ANGULAR_MOTOR_DECAY_TIMESCALE: 155 case Vehicle.ANGULAR_MOTOR_DECAY_TIMESCALE:
155 m_angularMotorDecayTimescale = Math.Max(pValue, 0.01f); 156 m_angularMotorDecayTimescale = Math.Max(0.01f, Math.Min(pValue,120));
156 break; 157 break;
157 case Vehicle.ANGULAR_MOTOR_TIMESCALE: 158 case Vehicle.ANGULAR_MOTOR_TIMESCALE:
158 m_angularMotorTimescale = Math.Max(pValue, 0.01f); 159 m_angularMotorTimescale = Math.Max(pValue, 0.01f);
@@ -185,10 +186,12 @@ namespace OpenSim.Region.Physics.BulletSPlugin
185 m_linearDeflectionTimescale = Math.Max(pValue, 0.01f); 186 m_linearDeflectionTimescale = Math.Max(pValue, 0.01f);
186 break; 187 break;
187 case Vehicle.LINEAR_MOTOR_DECAY_TIMESCALE: 188 case Vehicle.LINEAR_MOTOR_DECAY_TIMESCALE:
188 m_linearMotorDecayTimescale = Math.Max(pValue, 0.01f); 189 m_linearMotorDecayTimescale = Math.Max(0.01f, Math.Min(pValue,120));
190 m_linearMotor.TargetValueDecayTimeScale = m_linearMotorDecayTimescale;
189 break; 191 break;
190 case Vehicle.LINEAR_MOTOR_TIMESCALE: 192 case Vehicle.LINEAR_MOTOR_TIMESCALE:
191 m_linearMotorTimescale = Math.Max(pValue, 0.01f); 193 m_linearMotorTimescale = Math.Max(pValue, 0.01f);
194 m_linearMotor.TimeScale = m_linearMotorTimescale;
192 break; 195 break;
193 case Vehicle.VERTICAL_ATTRACTION_EFFICIENCY: 196 case Vehicle.VERTICAL_ATTRACTION_EFFICIENCY:
194 m_verticalAttractionEfficiency = Math.Max(0.1f, Math.Min(pValue, 1f)); 197 m_verticalAttractionEfficiency = Math.Max(0.1f, Math.Min(pValue, 1f));
@@ -208,10 +211,12 @@ namespace OpenSim.Region.Physics.BulletSPlugin
208 break; 211 break;
209 case Vehicle.LINEAR_FRICTION_TIMESCALE: 212 case Vehicle.LINEAR_FRICTION_TIMESCALE:
210 m_linearFrictionTimescale = new Vector3(pValue, pValue, pValue); 213 m_linearFrictionTimescale = new Vector3(pValue, pValue, pValue);
214 m_linearMotor.FrictionTimescale = m_linearFrictionTimescale;
211 break; 215 break;
212 case Vehicle.LINEAR_MOTOR_DIRECTION: 216 case Vehicle.LINEAR_MOTOR_DIRECTION:
213 m_linearMotorDirection = new Vector3(pValue, pValue, pValue); 217 m_linearMotorDirection = new Vector3(pValue, pValue, pValue);
214 m_linearMotorDirectionLASTSET = new Vector3(pValue, pValue, pValue); 218 m_linearMotorDirectionLASTSET = new Vector3(pValue, pValue, pValue);
219 m_linearMotor.SetTarget(m_linearMotorDirection);
215 break; 220 break;
216 case Vehicle.LINEAR_MOTOR_OFFSET: 221 case Vehicle.LINEAR_MOTOR_OFFSET:
217 m_linearMotorOffset = new Vector3(pValue, pValue, pValue); 222 m_linearMotorOffset = new Vector3(pValue, pValue, pValue);
@@ -238,10 +243,12 @@ namespace OpenSim.Region.Physics.BulletSPlugin
238 break; 243 break;
239 case Vehicle.LINEAR_FRICTION_TIMESCALE: 244 case Vehicle.LINEAR_FRICTION_TIMESCALE:
240 m_linearFrictionTimescale = new Vector3(pValue.X, pValue.Y, pValue.Z); 245 m_linearFrictionTimescale = new Vector3(pValue.X, pValue.Y, pValue.Z);
246 m_linearMotor.FrictionTimescale = m_linearFrictionTimescale;
241 break; 247 break;
242 case Vehicle.LINEAR_MOTOR_DIRECTION: 248 case Vehicle.LINEAR_MOTOR_DIRECTION:
243 m_linearMotorDirection = new Vector3(pValue.X, pValue.Y, pValue.Z); 249 m_linearMotorDirection = new Vector3(pValue.X, pValue.Y, pValue.Z);
244 m_linearMotorDirectionLASTSET = new Vector3(pValue.X, pValue.Y, pValue.Z); 250 m_linearMotorDirectionLASTSET = new Vector3(pValue.X, pValue.Y, pValue.Z);
251 m_linearMotor.SetTarget(m_linearMotorDirection);
245 break; 252 break;
246 case Vehicle.LINEAR_MOTOR_OFFSET: 253 case Vehicle.LINEAR_MOTOR_OFFSET:
247 m_linearMotorOffset = new Vector3(pValue.X, pValue.Y, pValue.Z); 254 m_linearMotorOffset = new Vector3(pValue.X, pValue.Y, pValue.Z);
@@ -319,6 +326,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin
319 326
320 m_referenceFrame = Quaternion.Identity; 327 m_referenceFrame = Quaternion.Identity;
321 m_flags = (VehicleFlag)0; 328 m_flags = (VehicleFlag)0;
329
322 break; 330 break;
323 331
324 case Vehicle.TYPE_SLED: 332 case Vehicle.TYPE_SLED:
@@ -510,6 +518,12 @@ namespace OpenSim.Region.Physics.BulletSPlugin
510 | VehicleFlag.HOVER_GLOBAL_HEIGHT); 518 | VehicleFlag.HOVER_GLOBAL_HEIGHT);
511 break; 519 break;
512 } 520 }
521
522 // Update any physical parameters based on this type.
523 Refresh();
524
525 m_linearMotor = new BSVMotor("LinearMotor", m_linearMotorTimescale, m_linearMotorDecayTimescale, m_linearFrictionTimescale, 1f);
526 m_linearMotor.PhysicsScene = PhysicsScene; // DEBUG DEBUG DEBUG (enables detail logging)
513 } 527 }
514 528
515 // Some of the properties of this prim may have changed. 529 // Some of the properties of this prim may have changed.
@@ -518,18 +532,25 @@ namespace OpenSim.Region.Physics.BulletSPlugin
518 { 532 {
519 if (IsActive) 533 if (IsActive)
520 { 534 {
521 VDetailLog("{0},BSDynamics.Refresh", Prim.LocalID);
522 m_vehicleMass = Prim.Linkset.LinksetMass; 535 m_vehicleMass = Prim.Linkset.LinksetMass;
523 536
524 // Friction effects are handled by this vehicle code 537 // Friction effects are handled by this vehicle code
525 BulletSimAPI.SetFriction2(Prim.PhysBody.ptr, 0f); 538 float friction = 0f;
526 BulletSimAPI.SetHitFraction2(Prim.PhysBody.ptr, 0f); 539 BulletSimAPI.SetFriction2(Prim.PhysBody.ptr, friction);
527 540
528 BulletSimAPI.SetAngularDamping2(Prim.PhysBody.ptr, PhysicsScene.Params.vehicleAngularDamping); 541 // Moderate angular movement introduced by Bullet.
529 542 // TODO: possibly set AngularFactor and LinearFactor for the type of vehicle.
530 BulletSimAPI.SetMassProps2(Prim.PhysBody.ptr, m_vehicleMass, new Vector3(1f, 1f, 1f)); 543 // Maybe compute linear and angular factor and damping from params.
531 544 float angularDamping = PhysicsScene.Params.vehicleAngularDamping;
532 545 BulletSimAPI.SetAngularDamping2(Prim.PhysBody.ptr, angularDamping);
546
547 // DEBUG DEBUG DEBUG: use uniform inertia to smooth movement added by Bullet
548 // Vector3 localInertia = new Vector3(1f, 1f, 1f);
549 Vector3 localInertia = new Vector3(m_vehicleMass, m_vehicleMass, m_vehicleMass);
550 BulletSimAPI.SetMassProps2(Prim.PhysBody.ptr, m_vehicleMass, localInertia);
551
552 VDetailLog("{0},BSDynamics.Refresh,frict={1},inert={2},aDamp={3}",
553 Prim.LocalID, friction, localInertia, angularDamping);
533 } 554 }
534 } 555 }
535 556
@@ -591,6 +612,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin
591 // Also does hover and float. 612 // Also does hover and float.
592 private void MoveLinear(float pTimestep) 613 private void MoveLinear(float pTimestep)
593 { 614 {
615 /*
594 // m_linearMotorDirection is the target direction we are moving relative to the vehicle coordinates 616 // m_linearMotorDirection is the target direction we are moving relative to the vehicle coordinates
595 // m_lastLinearVelocityVector is the current speed we are moving in that direction 617 // m_lastLinearVelocityVector is the current speed we are moving in that direction
596 if (m_linearMotorDirection.LengthSquared() > 0.001f) 618 if (m_linearMotorDirection.LengthSquared() > 0.001f)
@@ -627,6 +649,12 @@ namespace OpenSim.Region.Physics.BulletSPlugin
627 649
628 VDetailLog("{0},MoveLinear,zeroed", Prim.LocalID); 650 VDetailLog("{0},MoveLinear,zeroed", Prim.LocalID);
629 } 651 }
652 */
653
654 m_newVelocity = m_linearMotor.Step(pTimestep);
655
656 // Rotate new object velocity from vehicle relative to world coordinates
657 m_newVelocity *= Prim.ForceOrientation;
630 658
631 // m_newVelocity is velocity computed from linear motor in world coordinates 659 // m_newVelocity is velocity computed from linear motor in world coordinates
632 660
@@ -785,12 +813,13 @@ namespace OpenSim.Region.Physics.BulletSPlugin
785 m_newVelocity.Z = 0; 813 m_newVelocity.Z = 0;
786 814
787 // Clamp REALLY high or low velocities 815 // Clamp REALLY high or low velocities
788 if (m_newVelocity.LengthSquared() > 1e6f) 816 float newVelocityLengthSq = m_newVelocity.LengthSquared();
817 if (newVelocityLengthSq > 1e6f)
789 { 818 {
790 m_newVelocity /= m_newVelocity.Length(); 819 m_newVelocity /= m_newVelocity.Length();
791 m_newVelocity *= 1000f; 820 m_newVelocity *= 1000f;
792 } 821 }
793 else if (m_newVelocity.LengthSquared() < 1e-6f) 822 else if (newVelocityLengthSq < 1e-6f)
794 m_newVelocity = Vector3.Zero; 823 m_newVelocity = Vector3.Zero;
795 824
796 // Stuff new linear velocity into the vehicle 825 // Stuff new linear velocity into the vehicle