BulletSim: add parameters and functionality to specify the mesh
level of detail for large meshes. Remove parameter and code for DetailLog (conditional logging into regular log file).integration
parent
8eda290262
commit
ccc69d66a1
OpenSim/Region/Physics/BulletSPlugin
|
@ -265,7 +265,6 @@ public class BSLinkset
|
||||||
BSPrim childx = child;
|
BSPrim childx = child;
|
||||||
m_physicsScene.TaintedObject("AddChildToLinkset", delegate()
|
m_physicsScene.TaintedObject("AddChildToLinkset", delegate()
|
||||||
{
|
{
|
||||||
// DebugLog("{0}: AddChildToLinkset: adding child {1} to {2}", LogHeader, child.LocalID, m_linksetRoot.LocalID);
|
|
||||||
// DetailLog("{0},AddChildToLinkset,taint,child={1}", m_linksetRoot.LocalID, child.LocalID);
|
// DetailLog("{0},AddChildToLinkset,taint,child={1}", m_linksetRoot.LocalID, child.LocalID);
|
||||||
PhysicallyLinkAChildToRoot(rootx, childx); // build the physical binding between me and the child
|
PhysicallyLinkAChildToRoot(rootx, childx); // build the physical binding between me and the child
|
||||||
});
|
});
|
||||||
|
@ -294,7 +293,6 @@ public class BSLinkset
|
||||||
BSPrim childx = child;
|
BSPrim childx = child;
|
||||||
m_physicsScene.TaintedObject("RemoveChildFromLinkset", delegate()
|
m_physicsScene.TaintedObject("RemoveChildFromLinkset", delegate()
|
||||||
{
|
{
|
||||||
// DebugLog("{0}: RemoveChildFromLinkset: Removing constraint to {1}", LogHeader, child.LocalID);
|
|
||||||
// DetailLog("{0},RemoveChildFromLinkset,taint,child={1}", m_linksetRoot.LocalID, child.LocalID);
|
// DetailLog("{0},RemoveChildFromLinkset,taint,child={1}", m_linksetRoot.LocalID, child.LocalID);
|
||||||
|
|
||||||
PhysicallyUnlinkAChildFromRoot(rootx, childx);
|
PhysicallyUnlinkAChildFromRoot(rootx, childx);
|
||||||
|
@ -326,7 +324,6 @@ public class BSLinkset
|
||||||
|
|
||||||
// create a constraint that allows no freedom of movement between the two objects
|
// create a constraint that allows no freedom of movement between the two objects
|
||||||
// http://bulletphysics.org/Bullet/phpBB3/viewtopic.php?t=4818
|
// http://bulletphysics.org/Bullet/phpBB3/viewtopic.php?t=4818
|
||||||
// DebugLog("{0}: CreateLinkset: Adding a constraint between root prim {1} and child prim {2}", LogHeader, LocalID, childPrim.LocalID);
|
|
||||||
DetailLog("{0},PhysicallyLinkAChildToRoot,taint,root={1},child={2},rLoc={3},cLoc={4},midLoc={5}",
|
DetailLog("{0},PhysicallyLinkAChildToRoot,taint,root={1},child={2},rLoc={3},cLoc={4},midLoc={5}",
|
||||||
rootPrim.LocalID, rootPrim.LocalID, childPrim.LocalID, rootPrim.Position, childPrim.Position, midPoint);
|
rootPrim.LocalID, rootPrim.LocalID, childPrim.LocalID, rootPrim.Position, childPrim.Position, midPoint);
|
||||||
BS6DofConstraint constrain = new BS6DofConstraint(
|
BS6DofConstraint constrain = new BS6DofConstraint(
|
||||||
|
@ -350,7 +347,6 @@ public class BSLinkset
|
||||||
|
|
||||||
// create a constraint that allows no freedom of movement between the two objects
|
// create a constraint that allows no freedom of movement between the two objects
|
||||||
// http://bulletphysics.org/Bullet/phpBB3/viewtopic.php?t=4818
|
// http://bulletphysics.org/Bullet/phpBB3/viewtopic.php?t=4818
|
||||||
// DebugLog("{0}: CreateLinkset: Adding a constraint between root prim {1} and child prim {2}", LogHeader, LocalID, childPrim.LocalID);
|
|
||||||
DetailLog("{0},PhysicallyLinkAChildToRoot,taint,root={1},child={2}", rootPrim.LocalID, rootPrim.LocalID, childPrim.LocalID);
|
DetailLog("{0},PhysicallyLinkAChildToRoot,taint,root={1},child={2}", rootPrim.LocalID, rootPrim.LocalID, childPrim.LocalID);
|
||||||
BS6DofConstraint constrain = new BS6DofConstraint(
|
BS6DofConstraint constrain = new BS6DofConstraint(
|
||||||
PhysicsScene.World, rootPrim.Body, childPrim.Body,
|
PhysicsScene.World, rootPrim.Body, childPrim.Body,
|
||||||
|
@ -389,8 +385,6 @@ public class BSLinkset
|
||||||
// Called at taint time!
|
// Called at taint time!
|
||||||
private void PhysicallyUnlinkAChildFromRoot(BSPrim rootPrim, BSPrim childPrim)
|
private void PhysicallyUnlinkAChildFromRoot(BSPrim rootPrim, BSPrim childPrim)
|
||||||
{
|
{
|
||||||
// DebugLog("{0}: PhysicallyUnlinkAChildFromRoot: RemoveConstraint between root prim {1} and child prim {2}",
|
|
||||||
// LogHeader, rootPrim.LocalID, childPrim.LocalID);
|
|
||||||
DetailLog("{0},PhysicallyUnlinkAChildFromRoot,taint,root={1},child={2}", rootPrim.LocalID, rootPrim.LocalID, childPrim.LocalID);
|
DetailLog("{0},PhysicallyUnlinkAChildFromRoot,taint,root={1},child={2}", rootPrim.LocalID, rootPrim.LocalID, childPrim.LocalID);
|
||||||
|
|
||||||
// Find the constraint for this link and get rid of it from the overall collection and from my list
|
// Find the constraint for this link and get rid of it from the overall collection and from my list
|
||||||
|
@ -404,19 +398,11 @@ public class BSLinkset
|
||||||
// Called at taint time!
|
// Called at taint time!
|
||||||
private void PhysicallyUnlinkAllChildrenFromRoot(BSPrim rootPrim)
|
private void PhysicallyUnlinkAllChildrenFromRoot(BSPrim rootPrim)
|
||||||
{
|
{
|
||||||
// DebugLog("{0}: PhysicallyUnlinkAllChildren:", LogHeader);
|
|
||||||
DetailLog("{0},PhysicallyUnlinkAllChildren,taint", rootPrim.LocalID);
|
DetailLog("{0},PhysicallyUnlinkAllChildren,taint", rootPrim.LocalID);
|
||||||
|
|
||||||
m_physicsScene.Constraints.RemoveAndDestroyConstraint(rootPrim.Body);
|
m_physicsScene.Constraints.RemoveAndDestroyConstraint(rootPrim.Body);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Invoke the detailed logger and output something if it's enabled.
|
|
||||||
private void DebugLog(string msg, params Object[] args)
|
|
||||||
{
|
|
||||||
if (m_physicsScene.ShouldDebugLog)
|
|
||||||
m_physicsScene.Logger.DebugFormat(msg, args);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Invoke the detailed logger and output something if it's enabled.
|
// Invoke the detailed logger and output something if it's enabled.
|
||||||
private void DetailLog(string msg, params Object[] args)
|
private void DetailLog(string msg, params Object[] args)
|
||||||
{
|
{
|
||||||
|
|
|
@ -42,8 +42,6 @@ public sealed class BSPrim : PhysicsActor
|
||||||
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||||
private static readonly string LogHeader = "[BULLETS PRIM]";
|
private static readonly string LogHeader = "[BULLETS PRIM]";
|
||||||
|
|
||||||
private void DebugLog(string mm, params Object[] xx) { if (_scene.ShouldDebugLog) m_log.DebugFormat(mm, xx); }
|
|
||||||
|
|
||||||
private IMesh _mesh;
|
private IMesh _mesh;
|
||||||
private PrimitiveBaseShape _pbs;
|
private PrimitiveBaseShape _pbs;
|
||||||
private ShapeData.PhysicsShapeType _shapeType;
|
private ShapeData.PhysicsShapeType _shapeType;
|
||||||
|
@ -232,7 +230,6 @@ public sealed class BSPrim : PhysicsActor
|
||||||
BSPrim parent = obj as BSPrim;
|
BSPrim parent = obj as BSPrim;
|
||||||
if (parent != null)
|
if (parent != null)
|
||||||
{
|
{
|
||||||
DebugLog("{0}: link {1}/{2} to {3}", LogHeader, _avName, _localID, parent.LocalID);
|
|
||||||
BSPrim parentBefore = _linkset.LinksetRoot;
|
BSPrim parentBefore = _linkset.LinksetRoot;
|
||||||
int childrenBefore = _linkset.NumberOfChildren;
|
int childrenBefore = _linkset.NumberOfChildren;
|
||||||
|
|
||||||
|
@ -248,8 +245,6 @@ public sealed class BSPrim : PhysicsActor
|
||||||
public override void delink() {
|
public override void delink() {
|
||||||
// TODO: decide if this parent checking needs to happen at taint time
|
// TODO: decide if this parent checking needs to happen at taint time
|
||||||
// Race condition here: if link() and delink() in same simulation tick, the delink will not happen
|
// Race condition here: if link() and delink() in same simulation tick, the delink will not happen
|
||||||
DebugLog("{0}: delink {1}/{2}. Parent={3}", LogHeader, _avName, _localID,
|
|
||||||
_linkset.LinksetRoot._avName+"/"+_linkset.LinksetRoot.LocalID.ToString());
|
|
||||||
|
|
||||||
BSPrim parentBefore = _linkset.LinksetRoot;
|
BSPrim parentBefore = _linkset.LinksetRoot;
|
||||||
int childrenBefore = _linkset.NumberOfChildren;
|
int childrenBefore = _linkset.NumberOfChildren;
|
||||||
|
@ -1042,7 +1037,14 @@ public sealed class BSPrim : PhysicsActor
|
||||||
// No locking here because this is done when we know physics is not simulating
|
// No locking here because this is done when we know physics is not simulating
|
||||||
private void CreateGeomMesh()
|
private void CreateGeomMesh()
|
||||||
{
|
{
|
||||||
float lod = _pbs.SculptEntry ? _scene.SculptLOD : _scene.MeshLOD;
|
// level of detail based on size and type of the object
|
||||||
|
float lod = _scene.MeshLOD;
|
||||||
|
if (_pbs.SculptEntry)
|
||||||
|
lod = _scene.SculptLOD;
|
||||||
|
float maxAxis = Math.Max(_size.X, Math.Max(_size.Y, _size.Z));
|
||||||
|
if (maxAxis > _scene.MeshMegaPrimThreshold)
|
||||||
|
lod = _scene.MeshMegaPrimLOD;
|
||||||
|
|
||||||
ulong newMeshKey = (ulong)_pbs.GetMeshKey(_size, lod);
|
ulong newMeshKey = (ulong)_pbs.GetMeshKey(_size, lod);
|
||||||
// m_log.DebugFormat("{0}: CreateGeomMesh: lID={1}, oldKey={2}, newKey={3}", LogHeader, _localID, _meshKey, newMeshKey);
|
// m_log.DebugFormat("{0}: CreateGeomMesh: lID={1}, oldKey={2}, newKey={3}", LogHeader, _localID, _meshKey, newMeshKey);
|
||||||
|
|
||||||
|
|
|
@ -73,8 +73,6 @@ public class BSScene : PhysicsScene, IPhysicsParameters
|
||||||
private static readonly ILog m_log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
|
private static readonly ILog m_log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
|
||||||
private static readonly string LogHeader = "[BULLETS SCENE]";
|
private static readonly string LogHeader = "[BULLETS SCENE]";
|
||||||
|
|
||||||
public void DebugLog(string mm, params Object[] xx) { if (ShouldDebugLog) m_log.DebugFormat(mm, xx); }
|
|
||||||
|
|
||||||
public string BulletSimVersion = "?";
|
public string BulletSimVersion = "?";
|
||||||
|
|
||||||
private Dictionary<uint, BSCharacter> m_avatars = new Dictionary<uint, BSCharacter>();
|
private Dictionary<uint, BSCharacter> m_avatars = new Dictionary<uint, BSCharacter>();
|
||||||
|
@ -101,16 +99,11 @@ public class BSScene : PhysicsScene, IPhysicsParameters
|
||||||
private int m_detailedStatsStep = 0;
|
private int m_detailedStatsStep = 0;
|
||||||
|
|
||||||
public IMesher mesher;
|
public IMesher mesher;
|
||||||
private float m_meshLOD;
|
// Level of Detail values kept as float because that's what the Meshmerizer wants
|
||||||
public float MeshLOD
|
public float MeshLOD { get; private set; }
|
||||||
{
|
public float MeshMegaPrimLOD { get; private set; }
|
||||||
get { return m_meshLOD; }
|
public float MeshMegaPrimThreshold { get; private set; }
|
||||||
}
|
public float SculptLOD { get; private set; }
|
||||||
private float m_sculptLOD;
|
|
||||||
public float SculptLOD
|
|
||||||
{
|
|
||||||
get { return m_sculptLOD; }
|
|
||||||
}
|
|
||||||
|
|
||||||
private BulletSim m_worldSim;
|
private BulletSim m_worldSim;
|
||||||
public BulletSim World
|
public BulletSim World
|
||||||
|
@ -185,8 +178,9 @@ public class BSScene : PhysicsScene, IPhysicsParameters
|
||||||
ConfigurationParameters[] m_params;
|
ConfigurationParameters[] m_params;
|
||||||
GCHandle m_paramsHandle;
|
GCHandle m_paramsHandle;
|
||||||
|
|
||||||
public bool ShouldDebugLog { get; private set; }
|
// Handle to the callback used by the unmanaged code to call into the managed code.
|
||||||
|
// Used for debug logging.
|
||||||
|
// Need to store the handle in a persistant variable so it won't be freed.
|
||||||
private BulletSimAPI.DebugLogCallback m_DebugLogCallbackHandle;
|
private BulletSimAPI.DebugLogCallback m_DebugLogCallbackHandle;
|
||||||
|
|
||||||
// Sometimes you just have to log everything.
|
// Sometimes you just have to log everything.
|
||||||
|
@ -905,16 +899,26 @@ public class BSScene : PhysicsScene, IPhysicsParameters
|
||||||
(s) => { return s.NumericBool(s._forceSimplePrimMeshing); },
|
(s) => { return s.NumericBool(s._forceSimplePrimMeshing); },
|
||||||
(s,p,l,v) => { s._forceSimplePrimMeshing = s.BoolNumeric(v); } ),
|
(s,p,l,v) => { s._forceSimplePrimMeshing = s.BoolNumeric(v); } ),
|
||||||
|
|
||||||
new ParameterDefn("MeshLOD", "Level of detail to render meshes (32, 16, 8 or 4. 32=most detailed)",
|
new ParameterDefn("MeshLevelOfDetail", "Level of detail to render meshes (32, 16, 8 or 4. 32=most detailed)",
|
||||||
8f,
|
8f,
|
||||||
(s,cf,p,v) => { s.m_meshLOD = cf.GetInt(p, (int)v); },
|
(s,cf,p,v) => { s.MeshLOD = (float)cf.GetInt(p, (int)v); },
|
||||||
(s) => { return (float)s.m_meshLOD; },
|
(s) => { return s.MeshLOD; },
|
||||||
(s,p,l,v) => { s.m_meshLOD = (int)v; } ),
|
(s,p,l,v) => { s.MeshLOD = v; } ),
|
||||||
new ParameterDefn("SculptLOD", "Level of detail to render sculpties (32, 16, 8 or 4. 32=most detailed)",
|
new ParameterDefn("MeshLevelOfDetailMegaPrim", "Level of detail to render meshes larger than threshold meters",
|
||||||
|
16f,
|
||||||
|
(s,cf,p,v) => { s.MeshMegaPrimLOD = (float)cf.GetInt(p, (int)v); },
|
||||||
|
(s) => { return s.MeshMegaPrimLOD; },
|
||||||
|
(s,p,l,v) => { s.MeshMegaPrimLOD = v; } ),
|
||||||
|
new ParameterDefn("MeshLevelOfDetailMegaPrimThreshold", "Size (in meters) of a mesh before using MeshMegaPrimLOD",
|
||||||
|
10f,
|
||||||
|
(s,cf,p,v) => { s.MeshMegaPrimThreshold = (float)cf.GetInt(p, (int)v); },
|
||||||
|
(s) => { return s.MeshMegaPrimThreshold; },
|
||||||
|
(s,p,l,v) => { s.MeshMegaPrimThreshold = v; } ),
|
||||||
|
new ParameterDefn("SculptLevelOfDetail", "Level of detail to render sculpties (32, 16, 8 or 4. 32=most detailed)",
|
||||||
32f,
|
32f,
|
||||||
(s,cf,p,v) => { s.m_sculptLOD = cf.GetInt(p, (int)v); },
|
(s,cf,p,v) => { s.SculptLOD = (float)cf.GetInt(p, (int)v); },
|
||||||
(s) => { return (float)s.m_sculptLOD; },
|
(s) => { return s.SculptLOD; },
|
||||||
(s,p,l,v) => { s.m_sculptLOD = (int)v; } ),
|
(s,p,l,v) => { s.SculptLOD = v; } ),
|
||||||
|
|
||||||
new ParameterDefn("MaxSubStep", "In simulation step, maximum number of substeps",
|
new ParameterDefn("MaxSubStep", "In simulation step, maximum number of substeps",
|
||||||
10f,
|
10f,
|
||||||
|
@ -1145,12 +1149,6 @@ public class BSScene : PhysicsScene, IPhysicsParameters
|
||||||
(s,cf,p,v) => { s.m_detailedStatsStep = cf.GetInt(p, (int)v); },
|
(s,cf,p,v) => { s.m_detailedStatsStep = cf.GetInt(p, (int)v); },
|
||||||
(s) => { return (float)s.m_detailedStatsStep; },
|
(s) => { return (float)s.m_detailedStatsStep; },
|
||||||
(s,p,l,v) => { s.m_detailedStatsStep = (int)v; } ),
|
(s,p,l,v) => { s.m_detailedStatsStep = (int)v; } ),
|
||||||
new ParameterDefn("ShouldDebugLog", "Enables detailed DEBUG log statements",
|
|
||||||
ConfigurationParameters.numericFalse,
|
|
||||||
(s,cf,p,v) => { s.ShouldDebugLog = cf.GetBoolean(p, s.BoolNumeric(v)); },
|
|
||||||
(s) => { return s.NumericBool(s.ShouldDebugLog); },
|
|
||||||
(s,p,l,v) => { s.ShouldDebugLog = s.BoolNumeric(v); } ),
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// Convert a boolean to our numeric true and false values
|
// Convert a boolean to our numeric true and false values
|
||||||
|
|
|
@ -931,6 +931,9 @@
|
||||||
|
|
||||||
; level of detail for physical meshes. 32,16,8 or 4 with 32 being full detail
|
; level of detail for physical meshes. 32,16,8 or 4 with 32 being full detail
|
||||||
MeshLevelOfDetail = 8
|
MeshLevelOfDetail = 8
|
||||||
|
; if mesh size is > threshold meters, we need to add more detail because people will notice
|
||||||
|
MeshLevelOfDetailMegaPrimThreshold = 10
|
||||||
|
MeshLevelOfDetailMegaPrim = 16
|
||||||
; number^2 non-physical level of detail of the sculpt texture. 32x32 - 1024 verticies
|
; number^2 non-physical level of detail of the sculpt texture. 32x32 - 1024 verticies
|
||||||
SculptLevelOfDetail = 32
|
SculptLevelOfDetail = 32
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue