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
|
@ -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