aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Physics/BulletSPlugin/BSScene.cs
diff options
context:
space:
mode:
authorRobert Adams2012-09-13 08:11:54 -0700
committerRobert Adams2012-09-15 15:31:29 -0700
commit2c5ff9399063080276a23bcd06fb696d653bef2e (patch)
tree3428eaff2697b562880c75f5f83eafcbb855c93e /OpenSim/Region/Physics/BulletSPlugin/BSScene.cs
parentAdd basic asset connector tests to check behaviour for normal, local and temp... (diff)
downloadopensim-SC-2c5ff9399063080276a23bcd06fb696d653bef2e.zip
opensim-SC-2c5ff9399063080276a23bcd06fb696d653bef2e.tar.gz
opensim-SC-2c5ff9399063080276a23bcd06fb696d653bef2e.tar.bz2
opensim-SC-2c5ff9399063080276a23bcd06fb696d653bef2e.tar.xz
BulletSim: Way too many changes in one commit.
Many changes to BSDynamic for readability and commentary. Linkset hacking for vehicles: don't over mass the root prim. Add parameter for link constraint solver iterations. Correct uses of timestep in timescale calculations for vehicles. Reorganize code/logic for making objects static and dynamic for readability and use of API2. Changed most calls in BSPrim to use API2 calls (the new way). Avatars do not generate default Bullet collision events but do call up to the simulator for every avatar. Reduces overhead. Objects added to collision list only if they are processing collisions. Reduces overhead especially for large numbers of avatars. Generalize call for water height to GetWaterHeightAtXYZ(). Catch and correct exception getting terrain height when out of bounds. Correct race condition in Terrain Manager where creation wasn't at taint-time. Add API calls for constructing compound shapes. Move NeedsMeshing() logic into object class. Reorganize logic for object meshing to reduce rebuilding of meshs/hulls.
Diffstat (limited to 'OpenSim/Region/Physics/BulletSPlugin/BSScene.cs')
-rw-r--r--OpenSim/Region/Physics/BulletSPlugin/BSScene.cs67
1 files changed, 41 insertions, 26 deletions
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSScene.cs b/OpenSim/Region/Physics/BulletSPlugin/BSScene.cs
index 4a468af..eea899f 100644
--- a/OpenSim/Region/Physics/BulletSPlugin/BSScene.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSScene.cs
@@ -79,7 +79,7 @@ public class BSScene : PhysicsScene, IPhysicsParameters
79 private HashSet<BSPhysObject> m_objectsWithCollisions = new HashSet<BSPhysObject>(); 79 private HashSet<BSPhysObject> m_objectsWithCollisions = new HashSet<BSPhysObject>();
80 // Following is a kludge and can be removed when avatar animation updating is 80 // Following is a kludge and can be removed when avatar animation updating is
81 // moved to a better place. 81 // moved to a better place.
82 private HashSet<BSCharacter> m_avatarsWithCollisions = new HashSet<BSCharacter>(); 82 private HashSet<BSPhysObject> m_avatarsWithCollisions = new HashSet<BSPhysObject>();
83 83
84 // List of all the objects that have vehicle properties and should be called 84 // List of all the objects that have vehicle properties and should be called
85 // to update each physics step. 85 // to update each physics step.
@@ -132,8 +132,8 @@ public class BSScene : PhysicsScene, IPhysicsParameters
132 private EntityProperties[] m_updateArray; 132 private EntityProperties[] m_updateArray;
133 private GCHandle m_updateArrayPinnedHandle; 133 private GCHandle m_updateArrayPinnedHandle;
134 134
135 private bool _meshSculptedPrim = true; // cause scuplted prims to get meshed 135 public bool ShouldMeshSculptedPrim { get; private set; } // cause scuplted prims to get meshed
136 private bool _forceSimplePrimMeshing = false; // if a cube or sphere, let Bullet do internal shapes 136 public bool ShouldForceSimplePrimMeshing { get; private set; } // if a cube or sphere, let Bullet do internal shapes
137 137
138 public float PID_D { get; private set; } // derivative 138 public float PID_D { get; private set; } // derivative
139 public float PID_P { get; private set; } // proportional 139 public float PID_P { get; private set; } // proportional
@@ -153,6 +153,11 @@ public class BSScene : PhysicsScene, IPhysicsParameters
153 { 153 {
154 get { return new Vector3(0f, 0f, Params.gravity); } 154 get { return new Vector3(0f, 0f, Params.gravity); }
155 } 155 }
156 // Just the Z value of the gravity
157 public float DefaultGravityZ
158 {
159 get { return Params.gravity; }
160 }
156 161
157 public float MaximumObjectMass { get; private set; } 162 public float MaximumObjectMass { get; private set; }
158 163
@@ -171,8 +176,8 @@ public class BSScene : PhysicsScene, IPhysicsParameters
171 callback = c; 176 callback = c;
172 } 177 }
173 } 178 }
179 private Object _taintLock = new Object(); // lock for using the next object
174 private List<TaintCallbackEntry> _taintedObjects; 180 private List<TaintCallbackEntry> _taintedObjects;
175 private Object _taintLock = new Object();
176 181
177 // A pointer to an instance if this structure is passed to the C++ code 182 // A pointer to an instance if this structure is passed to the C++ code
178 // Used to pass basic configuration values to the unmanaged code. 183 // Used to pass basic configuration values to the unmanaged code.
@@ -478,6 +483,7 @@ public class BSScene : PhysicsScene, IPhysicsParameters
478 483
479 // Some of the prims operate with special vehicle properties 484 // Some of the prims operate with special vehicle properties
480 ProcessVehicles(timeStep); 485 ProcessVehicles(timeStep);
486 numTaints += _taintedObjects.Count;
481 ProcessTaints(); // the vehicles might have added taints 487 ProcessTaints(); // the vehicles might have added taints
482 488
483 // step the physical world one interval 489 // step the physical world one interval
@@ -506,6 +512,12 @@ public class BSScene : PhysicsScene, IPhysicsParameters
506 // Get a value for 'now' so all the collision and update routines don't have to get their own 512 // Get a value for 'now' so all the collision and update routines don't have to get their own
507 SimulationNowTime = Util.EnvironmentTickCount(); 513 SimulationNowTime = Util.EnvironmentTickCount();
508 514
515 // This is a kludge to get avatar movement updates.
516 // ODE sends collisions for avatars even if there are have been no collisions. This updates
517 // avatar animations and stuff.
518 // If you fix avatar animation updates, remove this overhead and let collisions happen.
519 m_objectsWithCollisions = new HashSet<BSPhysObject>(m_avatarsWithCollisions);
520
509 // If there were collisions, process them by sending the event to the prim. 521 // If there were collisions, process them by sending the event to the prim.
510 // Collisions must be processed before updates. 522 // Collisions must be processed before updates.
511 if (collidersCount > 0) 523 if (collidersCount > 0)
@@ -527,13 +539,6 @@ public class BSScene : PhysicsScene, IPhysicsParameters
527 bsp.SendCollisions(); 539 bsp.SendCollisions();
528 m_objectsWithCollisions.Clear(); 540 m_objectsWithCollisions.Clear();
529 541
530 // This is a kludge to get avatar movement updated.
531 // ODE sends collisions even if there are none and this is used to update
532 // avatar animations and stuff.
533 foreach (BSPhysObject bpo in m_avatarsWithCollisions)
534 bpo.SendCollisions();
535 // m_avatarsWithCollisions.Clear();
536
537 // If any of the objects had updated properties, tell the object it has been changed by the physics engine 542 // If any of the objects had updated properties, tell the object it has been changed by the physics engine
538 if (updatedEntityCount > 0) 543 if (updatedEntityCount > 0)
539 { 544 {
@@ -544,7 +549,6 @@ public class BSScene : PhysicsScene, IPhysicsParameters
544 if (PhysObjects.TryGetValue(entprop.ID, out pobj)) 549 if (PhysObjects.TryGetValue(entprop.ID, out pobj))
545 { 550 {
546 pobj.UpdateProperties(entprop); 551 pobj.UpdateProperties(entprop);
547 continue;
548 } 552 }
549 } 553 }
550 } 554 }
@@ -600,8 +604,11 @@ public class BSScene : PhysicsScene, IPhysicsParameters
600 604
601 // DetailLog("{0},BSScene.SendCollision,collide,id={1},with={2}", DetailLogZero, localID, collidingWith); 605 // DetailLog("{0},BSScene.SendCollision,collide,id={1},with={2}", DetailLogZero, localID, collidingWith);
602 606
603 collider.Collide(collidingWith, collidee, type, collidePoint, collideNormal, penetration); 607 if (collider.Collide(collidingWith, collidee, type, collidePoint, collideNormal, penetration))
604 m_objectsWithCollisions.Add(collider); 608 {
609 // If a collision was posted, remember to send it to the simulator
610 m_objectsWithCollisions.Add(collider);
611 }
605 612
606 return; 613 return;
607 } 614 }
@@ -619,9 +626,9 @@ public class BSScene : PhysicsScene, IPhysicsParameters
619 public override void SetWaterLevel(float baseheight) 626 public override void SetWaterLevel(float baseheight)
620 { 627 {
621 m_waterLevel = baseheight; 628 m_waterLevel = baseheight;
622 // TODO: pass to physics engine so things will float?
623 } 629 }
624 public float GetWaterLevel() 630 // Someday....
631 public float GetWaterLevelAtXYZ(Vector3 loc)
625 { 632 {
626 return m_waterLevel; 633 return m_waterLevel;
627 } 634 }
@@ -672,7 +679,7 @@ public class BSScene : PhysicsScene, IPhysicsParameters
672 679
673 // int iPropertiesNotSupportedDefault = 0; 680 // int iPropertiesNotSupportedDefault = 0;
674 681
675 if (pbs.SculptEntry && !_meshSculptedPrim) 682 if (pbs.SculptEntry && !ShouldMeshSculptedPrim)
676 { 683 {
677 // Render sculpties as boxes 684 // Render sculpties as boxes
678 return false; 685 return false;
@@ -680,7 +687,7 @@ public class BSScene : PhysicsScene, IPhysicsParameters
680 687
681 // if it's a standard box or sphere with no cuts, hollows, twist or top shear, return false since Bullet 688 // if it's a standard box or sphere with no cuts, hollows, twist or top shear, return false since Bullet
682 // can use an internal representation for the prim 689 // can use an internal representation for the prim
683 if (!_forceSimplePrimMeshing) 690 if (!ShouldForceSimplePrimMeshing)
684 { 691 {
685 if ((pbs.ProfileShape == ProfileShape.Square && pbs.PathCurve == (byte)Extrusion.Straight) 692 if ((pbs.ProfileShape == ProfileShape.Square && pbs.PathCurve == (byte)Extrusion.Straight)
686 || (pbs.ProfileShape == ProfileShape.HalfCircle && pbs.PathCurve == (byte)Extrusion.Curve1 693 || (pbs.ProfileShape == ProfileShape.HalfCircle && pbs.PathCurve == (byte)Extrusion.Curve1
@@ -782,7 +789,10 @@ public class BSScene : PhysicsScene, IPhysicsParameters
782 if (!m_initialized) return; 789 if (!m_initialized) return;
783 790
784 lock (_taintLock) 791 lock (_taintLock)
792 {
785 _taintedObjects.Add(new TaintCallbackEntry(ident, callback)); 793 _taintedObjects.Add(new TaintCallbackEntry(ident, callback));
794 }
795
786 return; 796 return;
787 } 797 }
788 798
@@ -919,14 +929,14 @@ public class BSScene : PhysicsScene, IPhysicsParameters
919 { 929 {
920 new ParameterDefn("MeshSculptedPrim", "Whether to create meshes for sculpties", 930 new ParameterDefn("MeshSculptedPrim", "Whether to create meshes for sculpties",
921 ConfigurationParameters.numericTrue, 931 ConfigurationParameters.numericTrue,
922 (s,cf,p,v) => { s._meshSculptedPrim = cf.GetBoolean(p, s.BoolNumeric(v)); }, 932 (s,cf,p,v) => { s.ShouldMeshSculptedPrim = cf.GetBoolean(p, s.BoolNumeric(v)); },
923 (s) => { return s.NumericBool(s._meshSculptedPrim); }, 933 (s) => { return s.NumericBool(s.ShouldMeshSculptedPrim); },
924 (s,p,l,v) => { s._meshSculptedPrim = s.BoolNumeric(v); } ), 934 (s,p,l,v) => { s.ShouldMeshSculptedPrim = s.BoolNumeric(v); } ),
925 new ParameterDefn("ForceSimplePrimMeshing", "If true, only use primitive meshes for objects", 935 new ParameterDefn("ForceSimplePrimMeshing", "If true, only use primitive meshes for objects",
926 ConfigurationParameters.numericFalse, 936 ConfigurationParameters.numericFalse,
927 (s,cf,p,v) => { s._forceSimplePrimMeshing = cf.GetBoolean(p, s.BoolNumeric(v)); }, 937 (s,cf,p,v) => { s.ShouldForceSimplePrimMeshing = cf.GetBoolean(p, s.BoolNumeric(v)); },
928 (s) => { return s.NumericBool(s._forceSimplePrimMeshing); }, 938 (s) => { return s.NumericBool(s.ShouldForceSimplePrimMeshing); },
929 (s,p,l,v) => { s._forceSimplePrimMeshing = s.BoolNumeric(v); } ), 939 (s,p,l,v) => { s.ShouldForceSimplePrimMeshing = s.BoolNumeric(v); } ),
930 940
931 new ParameterDefn("MeshLevelOfDetail", "Level of detail to render meshes (32, 16, 8 or 4. 32=most detailed)", 941 new ParameterDefn("MeshLevelOfDetail", "Level of detail to render meshes (32, 16, 8 or 4. 32=most detailed)",
932 8f, 942 8f,
@@ -1162,8 +1172,8 @@ public class BSScene : PhysicsScene, IPhysicsParameters
1162 (s,cf,p,v) => { s.m_params[0].linkConstraintTransMotorMaxForce = cf.GetFloat(p, v); }, 1172 (s,cf,p,v) => { s.m_params[0].linkConstraintTransMotorMaxForce = cf.GetFloat(p, v); },
1163 (s) => { return s.m_params[0].linkConstraintTransMotorMaxForce; }, 1173 (s) => { return s.m_params[0].linkConstraintTransMotorMaxForce; },
1164 (s,p,l,v) => { s.m_params[0].linkConstraintTransMotorMaxForce = v; } ), 1174 (s,p,l,v) => { s.m_params[0].linkConstraintTransMotorMaxForce = v; } ),
1165 new ParameterDefn("LinkConstraintCFM", "Amount constraint can be violated. 0=none, 1=all. Default=0", 1175 new ParameterDefn("LinkConstraintCFM", "Amount constraint can be violated. 0=no violation, 1=infinite. Default=0.1",
1166 0.0f, 1176 0.1f,
1167 (s,cf,p,v) => { s.m_params[0].linkConstraintCFM = cf.GetFloat(p, v); }, 1177 (s,cf,p,v) => { s.m_params[0].linkConstraintCFM = cf.GetFloat(p, v); },
1168 (s) => { return s.m_params[0].linkConstraintCFM; }, 1178 (s) => { return s.m_params[0].linkConstraintCFM; },
1169 (s,p,l,v) => { s.m_params[0].linkConstraintCFM = v; } ), 1179 (s,p,l,v) => { s.m_params[0].linkConstraintCFM = v; } ),
@@ -1172,6 +1182,11 @@ public class BSScene : PhysicsScene, IPhysicsParameters
1172 (s,cf,p,v) => { s.m_params[0].linkConstraintERP = cf.GetFloat(p, v); }, 1182 (s,cf,p,v) => { s.m_params[0].linkConstraintERP = cf.GetFloat(p, v); },
1173 (s) => { return s.m_params[0].linkConstraintERP; }, 1183 (s) => { return s.m_params[0].linkConstraintERP; },
1174 (s,p,l,v) => { s.m_params[0].linkConstraintERP = v; } ), 1184 (s,p,l,v) => { s.m_params[0].linkConstraintERP = v; } ),
1185 new ParameterDefn("LinkConstraintSolverIterations", "Number of solver iterations when computing constraint. (0 = Bullet default)",
1186 40,
1187 (s,cf,p,v) => { s.m_params[0].linkConstraintSolverIterations = cf.GetFloat(p, v); },
1188 (s) => { return s.m_params[0].linkConstraintSolverIterations; },
1189 (s,p,l,v) => { s.m_params[0].linkConstraintSolverIterations = v; } ),
1175 1190
1176 new ParameterDefn("DetailedStats", "Frames between outputting detailed phys stats. (0 is off)", 1191 new ParameterDefn("DetailedStats", "Frames between outputting detailed phys stats. (0 is off)",
1177 0f, 1192 0f,