diff options
Merge branch 'master' of melanie@opensimulator.org:/var/git/opensim
Diffstat (limited to '')
-rw-r--r-- | OpenSim/Region/Physics/BulletSPlugin/BSScene.cs | 78 |
1 files changed, 46 insertions, 32 deletions
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSScene.cs b/OpenSim/Region/Physics/BulletSPlugin/BSScene.cs index a31c578..56924aa 100644 --- a/OpenSim/Region/Physics/BulletSPlugin/BSScene.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSScene.cs | |||
@@ -73,15 +73,22 @@ public class BSScene : PhysicsScene, IPhysicsParameters | |||
73 | private static readonly ILog m_log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); | 73 | private static readonly ILog m_log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); |
74 | private static readonly string LogHeader = "[BULLETS SCENE]"; | 74 | private static readonly string LogHeader = "[BULLETS SCENE]"; |
75 | 75 | ||
76 | public void DebugLog(string mm, params Object[] xx) { if (ShouldDebugLog) m_log.DebugFormat(mm, xx); } | 76 | // The name of the region we're working for. |
77 | public string RegionName { get; private set; } | ||
77 | 78 | ||
78 | public string BulletSimVersion = "?"; | 79 | public string BulletSimVersion = "?"; |
79 | 80 | ||
80 | private Dictionary<uint, BSCharacter> m_avatars = new Dictionary<uint, BSCharacter>(); | 81 | private Dictionary<uint, BSCharacter> m_avatars = new Dictionary<uint, BSCharacter>(); |
82 | public Dictionary<uint, BSCharacter> Characters { get { return m_avatars; } } | ||
83 | |||
81 | private Dictionary<uint, BSPrim> m_prims = new Dictionary<uint, BSPrim>(); | 84 | private Dictionary<uint, BSPrim> m_prims = new Dictionary<uint, BSPrim>(); |
85 | public Dictionary<uint, BSPrim> Prims { get { return m_prims; } } | ||
86 | |||
82 | private HashSet<BSCharacter> m_avatarsWithCollisions = new HashSet<BSCharacter>(); | 87 | private HashSet<BSCharacter> m_avatarsWithCollisions = new HashSet<BSCharacter>(); |
83 | private HashSet<BSPrim> m_primsWithCollisions = new HashSet<BSPrim>(); | 88 | private HashSet<BSPrim> m_primsWithCollisions = new HashSet<BSPrim>(); |
89 | |||
84 | private List<BSPrim> m_vehicles = new List<BSPrim>(); | 90 | private List<BSPrim> m_vehicles = new List<BSPrim>(); |
91 | |||
85 | private float[] m_heightMap; | 92 | private float[] m_heightMap; |
86 | private float m_waterLevel; | 93 | private float m_waterLevel; |
87 | private uint m_worldID; | 94 | private uint m_worldID; |
@@ -95,16 +102,11 @@ public class BSScene : PhysicsScene, IPhysicsParameters | |||
95 | private int m_detailedStatsStep = 0; | 102 | private int m_detailedStatsStep = 0; |
96 | 103 | ||
97 | public IMesher mesher; | 104 | public IMesher mesher; |
98 | private float m_meshLOD; | 105 | // Level of Detail values kept as float because that's what the Meshmerizer wants |
99 | public float MeshLOD | 106 | public float MeshLOD { get; private set; } |
100 | { | 107 | public float MeshMegaPrimLOD { get; private set; } |
101 | get { return m_meshLOD; } | 108 | public float MeshMegaPrimThreshold { get; private set; } |
102 | } | 109 | public float SculptLOD { get; private set; } |
103 | private float m_sculptLOD; | ||
104 | public float SculptLOD | ||
105 | { | ||
106 | get { return m_sculptLOD; } | ||
107 | } | ||
108 | 110 | ||
109 | private BulletSim m_worldSim; | 111 | private BulletSim m_worldSim; |
110 | public BulletSim World | 112 | public BulletSim World |
@@ -179,8 +181,9 @@ public class BSScene : PhysicsScene, IPhysicsParameters | |||
179 | ConfigurationParameters[] m_params; | 181 | ConfigurationParameters[] m_params; |
180 | GCHandle m_paramsHandle; | 182 | GCHandle m_paramsHandle; |
181 | 183 | ||
182 | public bool ShouldDebugLog { get; private set; } | 184 | // Handle to the callback used by the unmanaged code to call into the managed code. |
183 | 185 | // Used for debug logging. | |
186 | // Need to store the handle in a persistant variable so it won't be freed. | ||
184 | private BulletSimAPI.DebugLogCallback m_DebugLogCallbackHandle; | 187 | private BulletSimAPI.DebugLogCallback m_DebugLogCallbackHandle; |
185 | 188 | ||
186 | // Sometimes you just have to log everything. | 189 | // Sometimes you just have to log everything. |
@@ -196,6 +199,8 @@ public class BSScene : PhysicsScene, IPhysicsParameters | |||
196 | public BSScene(string identifier) | 199 | public BSScene(string identifier) |
197 | { | 200 | { |
198 | m_initialized = false; | 201 | m_initialized = false; |
202 | // we are passed the name of the region we're working for. | ||
203 | RegionName = identifier; | ||
199 | } | 204 | } |
200 | 205 | ||
201 | public override void Initialise(IMesher meshmerizer, IConfigSource config) | 206 | public override void Initialise(IMesher meshmerizer, IConfigSource config) |
@@ -281,10 +286,13 @@ public class BSScene : PhysicsScene, IPhysicsParameters | |||
281 | // Very detailed logging for physics debugging | 286 | // Very detailed logging for physics debugging |
282 | m_physicsLoggingEnabled = pConfig.GetBoolean("PhysicsLoggingEnabled", false); | 287 | m_physicsLoggingEnabled = pConfig.GetBoolean("PhysicsLoggingEnabled", false); |
283 | m_physicsLoggingDir = pConfig.GetString("PhysicsLoggingDir", "."); | 288 | m_physicsLoggingDir = pConfig.GetString("PhysicsLoggingDir", "."); |
284 | m_physicsLoggingPrefix = pConfig.GetString("PhysicsLoggingPrefix", "physics-"); | 289 | m_physicsLoggingPrefix = pConfig.GetString("PhysicsLoggingPrefix", "physics-%REGIONNAME%-"); |
285 | m_physicsLoggingFileMinutes = pConfig.GetInt("PhysicsLoggingFileMinutes", 5); | 290 | m_physicsLoggingFileMinutes = pConfig.GetInt("PhysicsLoggingFileMinutes", 5); |
286 | // Very detailed logging for vehicle debugging | 291 | // Very detailed logging for vehicle debugging |
287 | m_vehicleLoggingEnabled = pConfig.GetBoolean("VehicleLoggingEnabled", false); | 292 | m_vehicleLoggingEnabled = pConfig.GetBoolean("VehicleLoggingEnabled", false); |
293 | |||
294 | // Do any replacements in the parameters | ||
295 | m_physicsLoggingPrefix = m_physicsLoggingPrefix.Replace("%REGIONNAME%", RegionName); | ||
288 | } | 296 | } |
289 | } | 297 | } |
290 | } | 298 | } |
@@ -362,7 +370,7 @@ public class BSScene : PhysicsScene, IPhysicsParameters | |||
362 | BSPrim bsprim = prim as BSPrim; | 370 | BSPrim bsprim = prim as BSPrim; |
363 | if (bsprim != null) | 371 | if (bsprim != null) |
364 | { | 372 | { |
365 | // DetailLog("{0},RemovePrim,call", bsprim.LocalID); | 373 | DetailLog("{0},RemovePrim,call", bsprim.LocalID); |
366 | // m_log.DebugFormat("{0}: RemovePrim. id={1}/{2}", LogHeader, bsprim.Name, bsprim.LocalID); | 374 | // m_log.DebugFormat("{0}: RemovePrim. id={1}/{2}", LogHeader, bsprim.Name, bsprim.LocalID); |
367 | try | 375 | try |
368 | { | 376 | { |
@@ -388,7 +396,7 @@ public class BSScene : PhysicsScene, IPhysicsParameters | |||
388 | 396 | ||
389 | if (!m_initialized) return null; | 397 | if (!m_initialized) return null; |
390 | 398 | ||
391 | // DetailLog("{0},AddPrimShape,call", localID); | 399 | DetailLog("{0},AddPrimShape,call", localID); |
392 | 400 | ||
393 | BSPrim prim = new BSPrim(localID, primName, this, position, size, rotation, pbs, isPhysical); | 401 | BSPrim prim = new BSPrim(localID, primName, this, position, size, rotation, pbs, isPhysical); |
394 | lock (m_prims) m_prims.Add(localID, prim); | 402 | lock (m_prims) m_prims.Add(localID, prim); |
@@ -429,13 +437,13 @@ public class BSScene : PhysicsScene, IPhysicsParameters | |||
429 | { | 437 | { |
430 | numSubSteps = BulletSimAPI.PhysicsStep(m_worldID, timeStep, m_maxSubSteps, m_fixedTimeStep, | 438 | numSubSteps = BulletSimAPI.PhysicsStep(m_worldID, timeStep, m_maxSubSteps, m_fixedTimeStep, |
431 | out updatedEntityCount, out updatedEntitiesPtr, out collidersCount, out collidersPtr); | 439 | out updatedEntityCount, out updatedEntitiesPtr, out collidersCount, out collidersPtr); |
432 | // DetailLog("{0},Simulate,call, substeps={1}, updates={2}, colliders={3}", DetailLogZero, numSubSteps, updatedEntityCount, collidersCount); | 440 | DetailLog("{0},Simulate,call, substeps={1}, updates={2}, colliders={3}", DetailLogZero, numSubSteps, updatedEntityCount, collidersCount); |
433 | } | 441 | } |
434 | catch (Exception e) | 442 | catch (Exception e) |
435 | { | 443 | { |
436 | m_log.WarnFormat("{0},PhysicsStep Exception: substeps={1}, updates={2}, colliders={3}, e={4}", LogHeader, numSubSteps, updatedEntityCount, collidersCount, e); | 444 | m_log.WarnFormat("{0},PhysicsStep Exception: substeps={1}, updates={2}, colliders={3}, e={4}", LogHeader, numSubSteps, updatedEntityCount, collidersCount, e); |
437 | // DetailLog("{0},PhysicsStepException,call, substeps={1}, updates={2}, colliders={3}", DetailLogZero, numSubSteps, updatedEntityCount, collidersCount); | 445 | // DetailLog("{0},PhysicsStepException,call, substeps={1}, updates={2}, colliders={3}", DetailLogZero, numSubSteps, updatedEntityCount, collidersCount); |
438 | // updatedEntityCount = 0; | 446 | updatedEntityCount = 0; |
439 | collidersCount = 0; | 447 | collidersCount = 0; |
440 | } | 448 | } |
441 | 449 | ||
@@ -534,6 +542,8 @@ public class BSScene : PhysicsScene, IPhysicsParameters | |||
534 | else if (m_avatars.ContainsKey(collidingWith)) | 542 | else if (m_avatars.ContainsKey(collidingWith)) |
535 | type = ActorTypes.Agent; | 543 | type = ActorTypes.Agent; |
536 | 544 | ||
545 | // DetailLog("{0},BSScene.SendCollision,collide,id={1},with={2}", DetailLogZero, localID, collidingWith); | ||
546 | |||
537 | BSPrim prim; | 547 | BSPrim prim; |
538 | if (m_prims.TryGetValue(localID, out prim)) { | 548 | if (m_prims.TryGetValue(localID, out prim)) { |
539 | prim.Collide(collidingWith, type, collidePoint, collideNormal, penitration); | 549 | prim.Collide(collidingWith, type, collidePoint, collideNormal, penitration); |
@@ -897,16 +907,26 @@ public class BSScene : PhysicsScene, IPhysicsParameters | |||
897 | (s) => { return s.NumericBool(s._forceSimplePrimMeshing); }, | 907 | (s) => { return s.NumericBool(s._forceSimplePrimMeshing); }, |
898 | (s,p,l,v) => { s._forceSimplePrimMeshing = s.BoolNumeric(v); } ), | 908 | (s,p,l,v) => { s._forceSimplePrimMeshing = s.BoolNumeric(v); } ), |
899 | 909 | ||
900 | new ParameterDefn("MeshLOD", "Level of detail to render meshes (32, 16, 8 or 4. 32=most detailed)", | 910 | new ParameterDefn("MeshLevelOfDetail", "Level of detail to render meshes (32, 16, 8 or 4. 32=most detailed)", |
901 | 8f, | 911 | 8f, |
902 | (s,cf,p,v) => { s.m_meshLOD = cf.GetInt(p, (int)v); }, | 912 | (s,cf,p,v) => { s.MeshLOD = (float)cf.GetInt(p, (int)v); }, |
903 | (s) => { return (float)s.m_meshLOD; }, | 913 | (s) => { return s.MeshLOD; }, |
904 | (s,p,l,v) => { s.m_meshLOD = (int)v; } ), | 914 | (s,p,l,v) => { s.MeshLOD = v; } ), |
905 | new ParameterDefn("SculptLOD", "Level of detail to render sculpties (32, 16, 8 or 4. 32=most detailed)", | 915 | new ParameterDefn("MeshLevelOfDetailMegaPrim", "Level of detail to render meshes larger than threshold meters", |
916 | 16f, | ||
917 | (s,cf,p,v) => { s.MeshMegaPrimLOD = (float)cf.GetInt(p, (int)v); }, | ||
918 | (s) => { return s.MeshMegaPrimLOD; }, | ||
919 | (s,p,l,v) => { s.MeshMegaPrimLOD = v; } ), | ||
920 | new ParameterDefn("MeshLevelOfDetailMegaPrimThreshold", "Size (in meters) of a mesh before using MeshMegaPrimLOD", | ||
921 | 10f, | ||
922 | (s,cf,p,v) => { s.MeshMegaPrimThreshold = (float)cf.GetInt(p, (int)v); }, | ||
923 | (s) => { return s.MeshMegaPrimThreshold; }, | ||
924 | (s,p,l,v) => { s.MeshMegaPrimThreshold = v; } ), | ||
925 | new ParameterDefn("SculptLevelOfDetail", "Level of detail to render sculpties (32, 16, 8 or 4. 32=most detailed)", | ||
906 | 32f, | 926 | 32f, |
907 | (s,cf,p,v) => { s.m_sculptLOD = cf.GetInt(p, (int)v); }, | 927 | (s,cf,p,v) => { s.SculptLOD = (float)cf.GetInt(p, (int)v); }, |
908 | (s) => { return (float)s.m_sculptLOD; }, | 928 | (s) => { return s.SculptLOD; }, |
909 | (s,p,l,v) => { s.m_sculptLOD = (int)v; } ), | 929 | (s,p,l,v) => { s.SculptLOD = v; } ), |
910 | 930 | ||
911 | new ParameterDefn("MaxSubStep", "In simulation step, maximum number of substeps", | 931 | new ParameterDefn("MaxSubStep", "In simulation step, maximum number of substeps", |
912 | 10f, | 932 | 10f, |
@@ -1137,12 +1157,6 @@ public class BSScene : PhysicsScene, IPhysicsParameters | |||
1137 | (s,cf,p,v) => { s.m_detailedStatsStep = cf.GetInt(p, (int)v); }, | 1157 | (s,cf,p,v) => { s.m_detailedStatsStep = cf.GetInt(p, (int)v); }, |
1138 | (s) => { return (float)s.m_detailedStatsStep; }, | 1158 | (s) => { return (float)s.m_detailedStatsStep; }, |
1139 | (s,p,l,v) => { s.m_detailedStatsStep = (int)v; } ), | 1159 | (s,p,l,v) => { s.m_detailedStatsStep = (int)v; } ), |
1140 | new ParameterDefn("ShouldDebugLog", "Enables detailed DEBUG log statements", | ||
1141 | ConfigurationParameters.numericFalse, | ||
1142 | (s,cf,p,v) => { s.ShouldDebugLog = cf.GetBoolean(p, s.BoolNumeric(v)); }, | ||
1143 | (s) => { return s.NumericBool(s.ShouldDebugLog); }, | ||
1144 | (s,p,l,v) => { s.ShouldDebugLog = s.BoolNumeric(v); } ), | ||
1145 | |||
1146 | }; | 1160 | }; |
1147 | 1161 | ||
1148 | // Convert a boolean to our numeric true and false values | 1162 | // Convert a boolean to our numeric true and false values |