aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Physics/BulletSPlugin
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs4
-rwxr-xr-xOpenSim/Region/Physics/BulletSPlugin/BSParam.cs20
-rw-r--r--OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs47
-rwxr-xr-xOpenSim/Region/Physics/BulletSPlugin/BulletSimTODO.txt7
4 files changed, 63 insertions, 15 deletions
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs b/OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs
index e6933f9..235cefc 100644
--- a/OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs
@@ -961,13 +961,13 @@ namespace OpenSim.Region.Physics.BulletSPlugin
961 // ================================================================== 961 // ==================================================================
962 // Clamp high or low velocities 962 // Clamp high or low velocities
963 float newVelocityLengthSq = VehicleVelocity.LengthSquared(); 963 float newVelocityLengthSq = VehicleVelocity.LengthSquared();
964 if (newVelocityLengthSq > BSParam.VehicleMaxLinearVelocitySq) 964 if (newVelocityLengthSq > BSParam.VehicleMaxLinearVelocitySquared)
965 { 965 {
966 Vector3 origVelW = VehicleVelocity; // DEBUG DEBUG 966 Vector3 origVelW = VehicleVelocity; // DEBUG DEBUG
967 VehicleVelocity /= VehicleVelocity.Length(); 967 VehicleVelocity /= VehicleVelocity.Length();
968 VehicleVelocity *= BSParam.VehicleMaxLinearVelocity; 968 VehicleVelocity *= BSParam.VehicleMaxLinearVelocity;
969 VDetailLog("{0}, MoveLinear,clampMax,origVelW={1},lenSq={2},maxVelSq={3},,newVelW={4}", 969 VDetailLog("{0}, MoveLinear,clampMax,origVelW={1},lenSq={2},maxVelSq={3},,newVelW={4}",
970 Prim.LocalID, origVelW, newVelocityLengthSq, BSParam.VehicleMaxLinearVelocitySq, VehicleVelocity); 970 Prim.LocalID, origVelW, newVelocityLengthSq, BSParam.VehicleMaxLinearVelocitySquared, VehicleVelocity);
971 } 971 }
972 else if (newVelocityLengthSq < 0.001f) 972 else if (newVelocityLengthSq < 0.001f)
973 VehicleVelocity = Vector3.Zero; 973 VehicleVelocity = Vector3.Zero;
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSParam.cs b/OpenSim/Region/Physics/BulletSPlugin/BSParam.cs
index dc57b67..fa58109 100755
--- a/OpenSim/Region/Physics/BulletSPlugin/BSParam.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSParam.cs
@@ -47,12 +47,16 @@ public static class BSParam
47 public static float SculptLOD { get; private set; } 47 public static float SculptLOD { get; private set; }
48 48
49 public static int CrossingFailuresBeforeOutOfBounds { get; private set; } 49 public static int CrossingFailuresBeforeOutOfBounds { get; private set; }
50 public static float UpdateVelocityChangeThreshold { get; private set; }
50 51
51 public static float MinimumObjectMass { get; private set; } 52 public static float MinimumObjectMass { get; private set; }
52 public static float MaximumObjectMass { get; private set; } 53 public static float MaximumObjectMass { get; private set; }
53 public static float MaxLinearVelocity { get; private set; } 54 public static float MaxLinearVelocity { get; private set; }
55 public static float MaxLinearVelocitySquared { get; private set; }
54 public static float MaxAngularVelocity { get; private set; } 56 public static float MaxAngularVelocity { get; private set; }
57 public static float MaxAngularVelocitySquared { get; private set; }
55 public static float MaxAddForceMagnitude { get; private set; } 58 public static float MaxAddForceMagnitude { get; private set; }
59 public static float MaxAddForceMagnitudeSquared { get; private set; }
56 public static float DensityScaleFactor { get; private set; } 60 public static float DensityScaleFactor { get; private set; }
57 61
58 public static float LinearDamping { get; private set; } 62 public static float LinearDamping { get; private set; }
@@ -109,7 +113,7 @@ public static class BSParam
109 113
110 // Vehicle parameters 114 // Vehicle parameters
111 public static float VehicleMaxLinearVelocity { get; private set; } 115 public static float VehicleMaxLinearVelocity { get; private set; }
112 public static float VehicleMaxLinearVelocitySq { get; private set; } 116 public static float VehicleMaxLinearVelocitySquared { get; private set; }
113 public static float VehicleMaxAngularVelocity { get; private set; } 117 public static float VehicleMaxAngularVelocity { get; private set; }
114 public static float VehicleMaxAngularVelocitySq { get; private set; } 118 public static float VehicleMaxAngularVelocitySq { get; private set; }
115 public static float VehicleAngularDamping { get; private set; } 119 public static float VehicleAngularDamping { get; private set; }
@@ -265,7 +269,7 @@ public static class BSParam
265 // The single letter parameters for the delegates are: 269 // The single letter parameters for the delegates are:
266 // s = BSScene 270 // s = BSScene
267 // o = BSPhysObject 271 // o = BSPhysObject
268 // v = value (float) 272 // v = value (appropriate type)
269 private static ParameterDefnBase[] ParameterDefinitions = 273 private static ParameterDefnBase[] ParameterDefinitions =
270 { 274 {
271 new ParameterDefn<bool>("MeshSculptedPrim", "Whether to create meshes for sculpties", 275 new ParameterDefn<bool>("MeshSculptedPrim", "Whether to create meshes for sculpties",
@@ -289,6 +293,10 @@ public static class BSParam
289 5, 293 5,
290 (s) => { return CrossingFailuresBeforeOutOfBounds; }, 294 (s) => { return CrossingFailuresBeforeOutOfBounds; },
291 (s,v) => { CrossingFailuresBeforeOutOfBounds = v; } ), 295 (s,v) => { CrossingFailuresBeforeOutOfBounds = v; } ),
296 new ParameterDefn<float>("UpdateVelocityChangeThreshold", "Change in updated velocity required before reporting change to simulator",
297 0.1f,
298 (s) => { return UpdateVelocityChangeThreshold; },
299 (s,v) => { UpdateVelocityChangeThreshold = v; } ),
292 300
293 new ParameterDefn<float>("MeshLevelOfDetail", "Level of detail to render meshes (32, 16, 8 or 4. 32=most detailed)", 301 new ParameterDefn<float>("MeshLevelOfDetail", "Level of detail to render meshes (32, 16, 8 or 4. 32=most detailed)",
294 32f, 302 32f,
@@ -343,16 +351,16 @@ public static class BSParam
343 new ParameterDefn<float>("MaxLinearVelocity", "Maximum velocity magnitude that can be assigned to an object", 351 new ParameterDefn<float>("MaxLinearVelocity", "Maximum velocity magnitude that can be assigned to an object",
344 1000.0f, 352 1000.0f,
345 (s) => { return MaxLinearVelocity; }, 353 (s) => { return MaxLinearVelocity; },
346 (s,v) => { MaxLinearVelocity = v; } ), 354 (s,v) => { MaxLinearVelocity = v; MaxLinearVelocitySquared = v * v; } ),
347 new ParameterDefn<float>("MaxAngularVelocity", "Maximum rotational velocity magnitude that can be assigned to an object", 355 new ParameterDefn<float>("MaxAngularVelocity", "Maximum rotational velocity magnitude that can be assigned to an object",
348 1000.0f, 356 1000.0f,
349 (s) => { return MaxAngularVelocity; }, 357 (s) => { return MaxAngularVelocity; },
350 (s,v) => { MaxAngularVelocity = v; } ), 358 (s,v) => { MaxAngularVelocity = v; MaxAngularVelocitySquared = v * v; } ),
351 // LL documentation says thie number should be 20f for llApplyImpulse and 200f for llRezObject 359 // LL documentation says thie number should be 20f for llApplyImpulse and 200f for llRezObject
352 new ParameterDefn<float>("MaxAddForceMagnitude", "Maximum force that can be applied by llApplyImpulse (SL says 20f)", 360 new ParameterDefn<float>("MaxAddForceMagnitude", "Maximum force that can be applied by llApplyImpulse (SL says 20f)",
353 20000.0f, 361 20000.0f,
354 (s) => { return MaxAddForceMagnitude; }, 362 (s) => { return MaxAddForceMagnitude; },
355 (s,v) => { MaxAddForceMagnitude = v; } ), 363 (s,v) => { MaxAddForceMagnitude = v; MaxAddForceMagnitudeSquared = v * v; } ),
356 // Density is passed around as 100kg/m3. This scales that to 1kg/m3. 364 // Density is passed around as 100kg/m3. This scales that to 1kg/m3.
357 new ParameterDefn<float>("DensityScaleFactor", "Conversion for simulator/viewer density (100kg/m3) to physical density (1kg/m3)", 365 new ParameterDefn<float>("DensityScaleFactor", "Conversion for simulator/viewer density (100kg/m3) to physical density (1kg/m3)",
358 0.01f, 366 0.01f,
@@ -505,7 +513,7 @@ public static class BSParam
505 new ParameterDefn<float>("VehicleMaxLinearVelocity", "Maximum velocity magnitude that can be assigned to a vehicle", 513 new ParameterDefn<float>("VehicleMaxLinearVelocity", "Maximum velocity magnitude that can be assigned to a vehicle",
506 1000.0f, 514 1000.0f,
507 (s) => { return (float)VehicleMaxLinearVelocity; }, 515 (s) => { return (float)VehicleMaxLinearVelocity; },
508 (s,v) => { VehicleMaxLinearVelocity = v; VehicleMaxLinearVelocitySq = v * v; } ), 516 (s,v) => { VehicleMaxLinearVelocity = v; VehicleMaxLinearVelocitySquared = v * v; } ),
509 new ParameterDefn<float>("VehicleMaxAngularVelocity", "Maximum rotational velocity magnitude that can be assigned to a vehicle", 517 new ParameterDefn<float>("VehicleMaxAngularVelocity", "Maximum rotational velocity magnitude that can be assigned to a vehicle",
510 12.0f, 518 12.0f,
511 (s) => { return (float)VehicleMaxAngularVelocity; }, 519 (s) => { return (float)VehicleMaxAngularVelocity; },
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs b/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs
index 8f660c4..a465613 100644
--- a/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs
@@ -108,6 +108,9 @@ public class BSPrim : BSPhysObject
108 // do the actual object creation at taint time 108 // do the actual object creation at taint time
109 PhysicsScene.TaintedObject("BSPrim.create", delegate() 109 PhysicsScene.TaintedObject("BSPrim.create", delegate()
110 { 110 {
111 // Make sure the object is being created with some sanity.
112 ExtremeSanityCheck(true /* inTaintTime */);
113
111 CreateGeomAndObject(true); 114 CreateGeomAndObject(true);
112 115
113 CurrentCollisionFlags = PhysicsScene.PE.GetCollisionFlags(PhysBody); 116 CurrentCollisionFlags = PhysicsScene.PE.GetCollisionFlags(PhysBody);
@@ -450,6 +453,38 @@ public class BSPrim : BSPhysObject
450 return ret; 453 return ret;
451 } 454 }
452 455
456 // Occasionally things will fly off and really get lost.
457 // Find the wanderers and bring them back.
458 // Return 'true' if some parameter need some sanity.
459 private bool ExtremeSanityCheck(bool inTaintTime)
460 {
461 bool ret = false;
462
463 uint wayOutThere = Constants.RegionSize * Constants.RegionSize;
464 // There have been instances of objects getting thrown way out of bounds and crashing
465 // the border crossing code.
466 if ( _position.X < -Constants.RegionSize || _position.X > wayOutThere
467 || _position.Y < -Constants.RegionSize || _position.Y > wayOutThere
468 || _position.Z < -Constants.RegionSize || _position.Z > wayOutThere)
469 {
470 _position = new OMV.Vector3(10, 10, 50);
471 ZeroMotion(inTaintTime);
472 ret = true;
473 }
474 if (_velocity.LengthSquared() > BSParam.MaxLinearVelocity)
475 {
476 _velocity = Util.ClampV(_velocity, BSParam.MaxLinearVelocity);
477 ret = true;
478 }
479 if (_rotationalVelocity.LengthSquared() > BSParam.MaxAngularVelocitySquared)
480 {
481 _rotationalVelocity = Util.ClampV(_rotationalVelocity, BSParam.MaxAngularVelocity);
482 ret = true;
483 }
484
485 return ret;
486 }
487
453 // Return the effective mass of the object. 488 // Return the effective mass of the object.
454 // The definition of this call is to return the mass of the prim. 489 // The definition of this call is to return the mass of the prim.
455 // If the simulator cares about the mass of the linkset, it will sum it itself. 490 // If the simulator cares about the mass of the linkset, it will sum it itself.
@@ -585,12 +620,12 @@ public class BSPrim : BSPhysObject
585 if (VehicleController.Type == Vehicle.TYPE_NONE) 620 if (VehicleController.Type == Vehicle.TYPE_NONE)
586 { 621 {
587 UnRegisterPreStepAction("BSPrim.Vehicle", LocalID); 622 UnRegisterPreStepAction("BSPrim.Vehicle", LocalID);
588 PhysicsScene.AfterStep -= VehicleController.PostStep; 623 UnRegisterPostStepAction("BSPrim.Vehicle", LocalID);
589 } 624 }
590 else 625 else
591 { 626 {
592 RegisterPreStepAction("BSPrim.Vehicle", LocalID, VehicleController.Step); 627 RegisterPreStepAction("BSPrim.Vehicle", LocalID, VehicleController.Step);
593 PhysicsScene.AfterStep += VehicleController.PostStep; 628 RegisterPostStepAction("BSPrim.Vehicle", LocalID, VehicleController.PostStep);
594 } 629 }
595 }); 630 });
596 } 631 }
@@ -732,7 +767,7 @@ public class BSPrim : BSPhysObject
732 set { 767 set {
733 PhysicsScene.AssertInTaintTime("BSPrim.ForceVelocity"); 768 PhysicsScene.AssertInTaintTime("BSPrim.ForceVelocity");
734 769
735 _velocity = value; 770 _velocity = Util.ClampV(value, BSParam.MaxLinearVelocity);
736 if (PhysBody.HasPhysicalBody) 771 if (PhysBody.HasPhysicalBody)
737 { 772 {
738 DetailLog("{0},BSPrim.ForceVelocity,taint,vel={1}", LocalID, _velocity); 773 DetailLog("{0},BSPrim.ForceVelocity,taint,vel={1}", LocalID, _velocity);
@@ -1098,7 +1133,7 @@ public class BSPrim : BSPhysObject
1098 return _rotationalVelocity; 1133 return _rotationalVelocity;
1099 } 1134 }
1100 set { 1135 set {
1101 _rotationalVelocity = value; 1136 _rotationalVelocity = Util.ClampV(value, BSParam.MaxAngularVelocity);
1102 if (PhysBody.HasPhysicalBody) 1137 if (PhysBody.HasPhysicalBody)
1103 { 1138 {
1104 DetailLog("{0},BSPrim.ForceRotationalVel,taint,rotvel={1}", LocalID, _rotationalVelocity); 1139 DetailLog("{0},BSPrim.ForceRotationalVel,taint,rotvel={1}", LocalID, _rotationalVelocity);
@@ -1230,6 +1265,7 @@ public class BSPrim : BSPhysObject
1230 1265
1231 RegisterPreStepAction("BSPrim.Hover", LocalID, delegate(float timeStep) 1266 RegisterPreStepAction("BSPrim.Hover", LocalID, delegate(float timeStep)
1232 { 1267 {
1268 // Don't do hovering while the object is selected.
1233 if (!IsPhysicallyActive) 1269 if (!IsPhysicallyActive)
1234 return; 1270 return;
1235 1271
@@ -1737,10 +1773,9 @@ public class BSPrim : BSPhysObject
1737 // Assign directly to the local variables so the normal set actions do not happen 1773 // Assign directly to the local variables so the normal set actions do not happen
1738 _position = entprop.Position; 1774 _position = entprop.Position;
1739 _orientation = entprop.Rotation; 1775 _orientation = entprop.Rotation;
1740 // _velocity = entprop.Velocity;
1741 // DEBUG DEBUG DEBUG -- smooth velocity changes a bit. The simulator seems to be 1776 // DEBUG DEBUG DEBUG -- smooth velocity changes a bit. The simulator seems to be
1742 // very sensitive to velocity changes. 1777 // very sensitive to velocity changes.
1743 if (entprop.Velocity == OMV.Vector3.Zero || !entprop.Velocity.ApproxEquals(_velocity, 0.1f)) 1778 if (entprop.Velocity == OMV.Vector3.Zero || !entprop.Velocity.ApproxEquals(_velocity, BSParam.UpdateVelocityChangeThreshold))
1744 _velocity = entprop.Velocity; 1779 _velocity = entprop.Velocity;
1745 _acceleration = entprop.Acceleration; 1780 _acceleration = entprop.Acceleration;
1746 _rotationalVelocity = entprop.RotationalVelocity; 1781 _rotationalVelocity = entprop.RotationalVelocity;
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BulletSimTODO.txt b/OpenSim/Region/Physics/BulletSPlugin/BulletSimTODO.txt
index 4dc16f4..8a15abe 100755
--- a/OpenSim/Region/Physics/BulletSPlugin/BulletSimTODO.txt
+++ b/OpenSim/Region/Physics/BulletSPlugin/BulletSimTODO.txt
@@ -9,6 +9,9 @@ Enable vehicle border crossings (at least as poorly as ODE)
9Lock axis 9Lock axis
10Deleting a linkset while standing on the root will leave the physical shape of the root behind. 10Deleting a linkset while standing on the root will leave the physical shape of the root behind.
11 Not sure if it is because standing on it. Done with large prim linksets. 11 Not sure if it is because standing on it. Done with large prim linksets.
12Linkset child rotations.
13 Nebadon spiral tube has middle sections which are rotated wrong.
14 Select linked spiral tube. Delink and note where the middle section ends up.
12Vehicle angular vertical attraction 15Vehicle angular vertical attraction
13vehicle angular banking 16vehicle angular banking
14Center-of-gravity 17Center-of-gravity
@@ -68,6 +71,8 @@ Vehicle attributes are not restored when a vehicle is rezzed on region creation
68 71
69GENERAL TODO LIST: 72GENERAL TODO LIST:
70================================================= 73=================================================
74Explore btGImpactMeshShape as alternative to convex hulls for simplified physical objects.
75 Regular triangle meshes don't do physical collisions.
71Resitution of a prim works on another prim but not on terrain. 76Resitution of a prim works on another prim but not on terrain.
72 The dropped prim doesn't bounce properly on the terrain. 77 The dropped prim doesn't bounce properly on the terrain.
73Add a sanity check for PIDTarget location. 78Add a sanity check for PIDTarget location.
@@ -338,4 +343,4 @@ Avatar standing on a moving object should start to move with the object. (DONE 2
338Angular motion around Z moves the vehicle in world Z and not vehicle Z in ODE. 343Angular motion around Z moves the vehicle in world Z and not vehicle Z in ODE.
339 Verify that angular motion specified around Z moves in the vehicle coordinates. 344 Verify that angular motion specified around Z moves in the vehicle coordinates.
340 DONE 20130120: BulletSim properly applies force in vehicle relative coordinates. 345 DONE 20130120: BulletSim properly applies force in vehicle relative coordinates.
341Nebadon vehicles turning funny in arena (DONE) \ No newline at end of file 346Nebadon vehicles turning funny in arena (DONE)