aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/PhysicsModules/BulletS
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/PhysicsModules/BulletS')
-rw-r--r--OpenSim/Region/PhysicsModules/BulletS/BSCharacter.cs6
-rw-r--r--OpenSim/Region/PhysicsModules/BulletS/BSPrim.cs2
-rw-r--r--OpenSim/Region/PhysicsModules/BulletS/BSScene.cs76
-rwxr-xr-xOpenSim/Region/PhysicsModules/BulletS/BSShapeCollection.cs4
-rwxr-xr-xOpenSim/Region/PhysicsModules/BulletS/BulletSimData.cs1
5 files changed, 62 insertions, 27 deletions
diff --git a/OpenSim/Region/PhysicsModules/BulletS/BSCharacter.cs b/OpenSim/Region/PhysicsModules/BulletS/BSCharacter.cs
index 57f03fb..04ac659 100644
--- a/OpenSim/Region/PhysicsModules/BulletS/BSCharacter.cs
+++ b/OpenSim/Region/PhysicsModules/BulletS/BSCharacter.cs
@@ -496,8 +496,8 @@ public sealed class BSCharacter : BSPhysObject
496 public override OMV.Vector3 ForceVelocity { 496 public override OMV.Vector3 ForceVelocity {
497 get { return RawVelocity; } 497 get { return RawVelocity; }
498 set { 498 set {
499 PhysScene.AssertInTaintTime("BSCharacter.ForceVelocity"); 499 PhysScene.AssertNotInSimulationTime("BSCharacter.ForceVelocity");
500 DetailLog("{0}: BSCharacter.ForceVelocity.set = {1}", LocalID, value); 500 DetailLog("{0},BSCharacter.ForceVelocity.set={1}", LocalID, value);
501 501
502 RawVelocity = Util.ClampV(value, BSParam.MaxLinearVelocity); 502 RawVelocity = Util.ClampV(value, BSParam.MaxLinearVelocity);
503 PhysScene.PE.SetLinearVelocity(PhysBody, RawVelocity); 503 PhysScene.PE.SetLinearVelocity(PhysBody, RawVelocity);
@@ -638,7 +638,7 @@ public sealed class BSCharacter : BSPhysObject
638 public override float ForceBuoyancy { 638 public override float ForceBuoyancy {
639 get { return _buoyancy; } 639 get { return _buoyancy; }
640 set { 640 set {
641 PhysScene.AssertInTaintTime("BSCharacter.ForceBuoyancy"); 641 PhysScene.AssertNotInSimulationTime("BSCharacter.ForceBuoyancy");
642 642
643 _buoyancy = value; 643 _buoyancy = value;
644 DetailLog("{0},BSCharacter.setForceBuoyancy,taint,buoy={1}", LocalID, _buoyancy); 644 DetailLog("{0},BSCharacter.setForceBuoyancy,taint,buoy={1}", LocalID, _buoyancy);
diff --git a/OpenSim/Region/PhysicsModules/BulletS/BSPrim.cs b/OpenSim/Region/PhysicsModules/BulletS/BSPrim.cs
index b153761..e1990ee 100644
--- a/OpenSim/Region/PhysicsModules/BulletS/BSPrim.cs
+++ b/OpenSim/Region/PhysicsModules/BulletS/BSPrim.cs
@@ -790,7 +790,7 @@ public class BSPrim : BSPhysObject
790 public override OMV.Vector3 ForceVelocity { 790 public override OMV.Vector3 ForceVelocity {
791 get { return RawVelocity; } 791 get { return RawVelocity; }
792 set { 792 set {
793 PhysScene.AssertInTaintTime("BSPrim.ForceVelocity"); 793 PhysScene.AssertNotInSimulationTime("BSPrim.ForceVelocity");
794 794
795 RawVelocity = Util.ClampV(value, BSParam.MaxLinearVelocity); 795 RawVelocity = Util.ClampV(value, BSParam.MaxLinearVelocity);
796 if (PhysBody.HasPhysicalBody) 796 if (PhysBody.HasPhysicalBody)
diff --git a/OpenSim/Region/PhysicsModules/BulletS/BSScene.cs b/OpenSim/Region/PhysicsModules/BulletS/BSScene.cs
index 7ff0a07..bcc3b4a 100644
--- a/OpenSim/Region/PhysicsModules/BulletS/BSScene.cs
+++ b/OpenSim/Region/PhysicsModules/BulletS/BSScene.cs
@@ -128,6 +128,9 @@ namespace OpenSim.Region.PhysicsModule.BulletS
128 // Not guaranteed to be correct all the time (don't depend on this) but good for debugging. 128 // Not guaranteed to be correct all the time (don't depend on this) but good for debugging.
129 public bool InTaintTime { get; private set; } 129 public bool InTaintTime { get; private set; }
130 130
131 // Flag that is true when the simulator is active and shouldn't be touched
132 public bool InSimulationTime { get; private set; }
133
131 // Pinned memory used to pass step information between managed and unmanaged 134 // Pinned memory used to pass step information between managed and unmanaged
132 internal int m_maxCollisionsPerFrame; 135 internal int m_maxCollisionsPerFrame;
133 internal CollisionDesc[] m_collisionArray; 136 internal CollisionDesc[] m_collisionArray;
@@ -344,6 +347,7 @@ namespace OpenSim.Region.PhysicsModule.BulletS
344 // Put some informational messages into the log file. 347 // Put some informational messages into the log file.
345 m_log.InfoFormat("{0} Linksets implemented with {1}", LogHeader, (BSLinkset.LinksetImplementation)BSParam.LinksetImplementation); 348 m_log.InfoFormat("{0} Linksets implemented with {1}", LogHeader, (BSLinkset.LinksetImplementation)BSParam.LinksetImplementation);
346 349
350 InSimulationTime = false;
347 InTaintTime = false; 351 InTaintTime = false;
348 m_initialized = true; 352 m_initialized = true;
349 353
@@ -658,21 +662,21 @@ namespace OpenSim.Region.PhysicsModule.BulletS
658 int beforeTime = Util.EnvironmentTickCount(); 662 int beforeTime = Util.EnvironmentTickCount();
659 int simTime = 0; 663 int simTime = 0;
660 664
661 int numTaints = _taintOperations.Count; 665 InTaintTime = true;
662 InTaintTime = true; // Only used for debugging so locking is not necessary.
663
664 // update the prim states while we know the physics engine is not busy 666 // update the prim states while we know the physics engine is not busy
665 ProcessTaints(); 667 int numTaints = ProcessTaints();
666 668
667 // Some of the physical objects requre individual, pre-step calls 669 // Some of the physical objects requre individual, pre-step calls
668 // (vehicles and avatar movement, in particular) 670 // (vehicles and avatar movement, in particular)
669 TriggerPreStepEvent(timeStep); 671 TriggerPreStepEvent(timeStep);
670 672
671 // the prestep actions might have added taints 673 // the prestep actions might have added taints
672 numTaints += _taintOperations.Count; 674 numTaints += ProcessTaints();
673 ProcessTaints();
674 675
675 InTaintTime = false; // Only used for debugging so locking is not necessary. 676 lock (_taintLock)
677 {
678 InSimulationTime = true;
679 }
676 680
677 // The following causes the unmanaged code to output ALL the values found in ALL the objects in the world. 681 // The following causes the unmanaged code to output ALL the values found in ALL the objects in the world.
678 // Only enable this in a limited test world with few objects. 682 // Only enable this in a limited test world with few objects.
@@ -700,6 +704,18 @@ namespace OpenSim.Region.PhysicsModule.BulletS
700 if (PhysicsMetricDumpFrames != 0 && ((m_simulationStep % PhysicsMetricDumpFrames) == 0)) 704 if (PhysicsMetricDumpFrames != 0 && ((m_simulationStep % PhysicsMetricDumpFrames) == 0))
701 PE.DumpPhysicsStatistics(World); 705 PE.DumpPhysicsStatistics(World);
702 706
707 lock (_taintLock)
708 {
709 InTaintTime = false;
710 InSimulationTime = false;
711 }
712
713 // Some actors want to know when the simulation step is complete.
714 TriggerPostStepEvent(timeStep);
715
716 // In case there were any parameter updates that happened during the simulation step
717 numTaints += ProcessTaints();
718
703 // Get a value for 'now' so all the collision and update routines don't have to get their own. 719 // Get a value for 'now' so all the collision and update routines don't have to get their own.
704 SimulationNowTime = Util.EnvironmentTickCount(); 720 SimulationNowTime = Util.EnvironmentTickCount();
705 721
@@ -748,9 +764,6 @@ namespace OpenSim.Region.PhysicsModule.BulletS
748 } 764 }
749 } 765 }
750 766
751 // Some actors want to know when the simulation step is complete.
752 TriggerPostStepEvent(timeStep);
753
754 simTime = Util.EnvironmentTickCountSubtract(beforeTime); 767 simTime = Util.EnvironmentTickCountSubtract(beforeTime);
755 if (PhysicsLogging.Enabled) 768 if (PhysicsLogging.Enabled)
756 { 769 {
@@ -1090,6 +1103,15 @@ namespace OpenSim.Region.PhysicsModule.BulletS
1090 { 1103 {
1091 if (!m_initialized) return; 1104 if (!m_initialized) return;
1092 1105
1106 lock (_taintLock) {
1107 if (inTaintTime || !InSimulationTime) {
1108 pCallback();
1109 }
1110 else {
1111 _taintOperations.Add(new TaintCallbackEntry(pOriginator, pIdent, pCallback));
1112 }
1113 }
1114 /*
1093 if (inTaintTime) 1115 if (inTaintTime)
1094 pCallback(); 1116 pCallback();
1095 else 1117 else
@@ -1099,6 +1121,7 @@ namespace OpenSim.Region.PhysicsModule.BulletS
1099 _taintOperations.Add(new TaintCallbackEntry(pOriginator, pIdent, pCallback)); 1121 _taintOperations.Add(new TaintCallbackEntry(pOriginator, pIdent, pCallback));
1100 } 1122 }
1101 } 1123 }
1124 */
1102 } 1125 }
1103 1126
1104 private void TriggerPreStepEvent(float timeStep) 1127 private void TriggerPreStepEvent(float timeStep)
@@ -1120,14 +1143,19 @@ namespace OpenSim.Region.PhysicsModule.BulletS
1120 // When someone tries to change a property on a BSPrim or BSCharacter, the object queues 1143 // When someone tries to change a property on a BSPrim or BSCharacter, the object queues
1121 // a callback into itself to do the actual property change. That callback is called 1144 // a callback into itself to do the actual property change. That callback is called
1122 // here just before the physics engine is called to step the simulation. 1145 // here just before the physics engine is called to step the simulation.
1123 public void ProcessTaints() 1146 // Returns the number of taints processed
1147 public int ProcessTaints()
1124 { 1148 {
1125 ProcessRegularTaints(); 1149 int ret = 0;
1126 ProcessPostTaintTaints(); 1150 ret += ProcessRegularTaints();
1151 ret += ProcessPostTaintTaints();
1152 return ret;
1127 } 1153 }
1128 1154
1129 private void ProcessRegularTaints() 1155 // Returns the number of taints processed
1156 private int ProcessRegularTaints()
1130 { 1157 {
1158 int ret = 0;
1131 if (m_initialized && _taintOperations.Count > 0) // save allocating new list if there is nothing to process 1159 if (m_initialized && _taintOperations.Count > 0) // save allocating new list if there is nothing to process
1132 { 1160 {
1133 // swizzle a new list into the list location so we can process what's there 1161 // swizzle a new list into the list location so we can process what's there
@@ -1144,6 +1172,7 @@ namespace OpenSim.Region.PhysicsModule.BulletS
1144 { 1172 {
1145 DetailLog("{0},BSScene.ProcessTaints,doTaint,id={1}", tcbe.originator, tcbe.ident); // DEBUG DEBUG DEBUG 1173 DetailLog("{0},BSScene.ProcessTaints,doTaint,id={1}", tcbe.originator, tcbe.ident); // DEBUG DEBUG DEBUG
1146 tcbe.callback(); 1174 tcbe.callback();
1175 ret++;
1147 } 1176 }
1148 catch (Exception e) 1177 catch (Exception e)
1149 { 1178 {
@@ -1152,6 +1181,7 @@ namespace OpenSim.Region.PhysicsModule.BulletS
1152 } 1181 }
1153 oldList.Clear(); 1182 oldList.Clear();
1154 } 1183 }
1184 return ret;
1155 } 1185 }
1156 1186
1157 // Schedule an update to happen after all the regular taints are processed. 1187 // Schedule an update to happen after all the regular taints are processed.
@@ -1170,8 +1200,10 @@ namespace OpenSim.Region.PhysicsModule.BulletS
1170 } 1200 }
1171 1201
1172 // Taints that happen after the normal taint processing but before the simulation step. 1202 // Taints that happen after the normal taint processing but before the simulation step.
1173 private void ProcessPostTaintTaints() 1203 // Returns the number of taints processed
1204 private int ProcessPostTaintTaints()
1174 { 1205 {
1206 int ret = 0;
1175 if (m_initialized && _postTaintOperations.Count > 0) 1207 if (m_initialized && _postTaintOperations.Count > 0)
1176 { 1208 {
1177 Dictionary<string, TaintCallbackEntry> oldList; 1209 Dictionary<string, TaintCallbackEntry> oldList;
@@ -1187,6 +1219,7 @@ namespace OpenSim.Region.PhysicsModule.BulletS
1187 { 1219 {
1188 DetailLog("{0},BSScene.ProcessPostTaintTaints,doTaint,id={1}", DetailLogZero, kvp.Key); // DEBUG DEBUG DEBUG 1220 DetailLog("{0},BSScene.ProcessPostTaintTaints,doTaint,id={1}", DetailLogZero, kvp.Key); // DEBUG DEBUG DEBUG
1189 kvp.Value.callback(); 1221 kvp.Value.callback();
1222 ret++;
1190 } 1223 }
1191 catch (Exception e) 1224 catch (Exception e)
1192 { 1225 {
@@ -1195,18 +1228,19 @@ namespace OpenSim.Region.PhysicsModule.BulletS
1195 } 1228 }
1196 oldList.Clear(); 1229 oldList.Clear();
1197 } 1230 }
1231 return ret;
1198 } 1232 }
1199 1233
1200 // Only used for debugging. Does not change state of anything so locking is not necessary. 1234 // Verify that things are being diddled when the physics engine is not running.
1201 public bool AssertInTaintTime(string whereFrom) 1235 public bool AssertNotInSimulationTime(string whereFrom)
1202 { 1236 {
1203 if (!InTaintTime) 1237 if (InSimulationTime)
1204 { 1238 {
1205 DetailLog("{0},BSScene.AssertInTaintTime,NOT IN TAINT TIME,Region={1},Where={2}", DetailLogZero, RegionName, whereFrom); 1239 DetailLog("{0},BSScene.AssertInTaintTime,IN SIMULATION TIME,Region={1},Where={2}", DetailLogZero, RegionName, whereFrom);
1206 m_log.ErrorFormat("{0} NOT IN TAINT TIME!! Region={1}, Where={2}", LogHeader, RegionName, whereFrom); 1240 m_log.ErrorFormat("{0} IN SIMULATION TIME!! Region={1}, Where={2}", LogHeader, RegionName, whereFrom);
1207 // Util.PrintCallStack(DetailLog); 1241 // Util.PrintCallStack(DetailLog);
1208 } 1242 }
1209 return InTaintTime; 1243 return InSimulationTime;
1210 } 1244 }
1211 1245
1212 #endregion // Taints 1246 #endregion // Taints
diff --git a/OpenSim/Region/PhysicsModules/BulletS/BSShapeCollection.cs b/OpenSim/Region/PhysicsModules/BulletS/BSShapeCollection.cs
index 4ec6f51..8d8fc95 100755
--- a/OpenSim/Region/PhysicsModules/BulletS/BSShapeCollection.cs
+++ b/OpenSim/Region/PhysicsModules/BulletS/BSShapeCollection.cs
@@ -75,7 +75,7 @@ public sealed class BSShapeCollection : IDisposable
75 // Called at taint-time. 75 // Called at taint-time.
76 public bool GetBodyAndShape(bool forceRebuild, BulletWorld sim, BSPhysObject prim, PhysicalDestructionCallback bodyCallback) 76 public bool GetBodyAndShape(bool forceRebuild, BulletWorld sim, BSPhysObject prim, PhysicalDestructionCallback bodyCallback)
77 { 77 {
78 m_physicsScene.AssertInTaintTime("BSShapeCollection.GetBodyAndShape"); 78 m_physicsScene.AssertNotInSimulationTime("BSShapeCollection.GetBodyAndShape");
79 79
80 bool ret = false; 80 bool ret = false;
81 81
@@ -344,7 +344,7 @@ public sealed class BSShapeCollection : IDisposable
344 if (!body.HasPhysicalBody) 344 if (!body.HasPhysicalBody)
345 return; 345 return;
346 346
347 m_physicsScene.AssertInTaintTime("BSShapeCollection.DereferenceBody"); 347 m_physicsScene.AssertNotInSimulationTime("BSShapeCollection.DereferenceBody");
348 348
349 lock (m_collectionActivityLock) 349 lock (m_collectionActivityLock)
350 { 350 {
diff --git a/OpenSim/Region/PhysicsModules/BulletS/BulletSimData.cs b/OpenSim/Region/PhysicsModules/BulletS/BulletSimData.cs
index 3329395..308769b 100755
--- a/OpenSim/Region/PhysicsModules/BulletS/BulletSimData.cs
+++ b/OpenSim/Region/PhysicsModules/BulletS/BulletSimData.cs
@@ -100,6 +100,7 @@ public class BulletBody
100 } 100 }
101} 101}
102 102
103// Handle to btCollisionObject - a shape that can be added to a btRidgidBody
103public class BulletShape 104public class BulletShape
104{ 105{
105 public BulletShape() 106 public BulletShape()