aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/PhysicsModules/BulletS/BSScene.cs
diff options
context:
space:
mode:
authorRobert Adams2017-08-28 15:23:32 -0700
committerRobert Adams2017-08-28 15:23:32 -0700
commit5c36561424c8b093e24c683c2ff6e83410739388 (patch)
tree46290aa706661d88dc1c55b9181de630efc8eba7 /OpenSim/Region/PhysicsModules/BulletS/BSScene.cs
parentfrozen avatars should not do local teleports. Possible none should not be all... (diff)
downloadopensim-SC-5c36561424c8b093e24c683c2ff6e83410739388.zip
opensim-SC-5c36561424c8b093e24c683c2ff6e83410739388.tar.gz
opensim-SC-5c36561424c8b093e24c683c2ff6e83410739388.tar.bz2
opensim-SC-5c36561424c8b093e24c683c2ff6e83410739388.tar.xz
BulletSim: add clock and change logic for taint processing a little
so taints check if they are not in simulation time and execute immediately if not.
Diffstat (limited to '')
-rw-r--r--OpenSim/Region/PhysicsModules/BulletS/BSScene.cs76
1 files changed, 55 insertions, 21 deletions
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