BulletSim: add ResetBroadphasePool and ResetConstraintSolver diagnostic

functions. If values set from console, the functions are called. Looking
for why the collision pools fill up with unnecessary stuff.
user_profiles
Robert Adams 2013-01-01 20:26:31 -08:00
parent 5265415011
commit 2eda385f5e
8 changed files with 73 additions and 50 deletions

View File

@ -530,12 +530,12 @@ public override void SetForceUpdateAllAabbs(BulletWorld world, bool force)
// btDynamicsWorld entries // btDynamicsWorld entries
public override bool AddObjectToWorld(BulletWorld world, BulletBody obj) public override bool AddObjectToWorld(BulletWorld world, BulletBody obj)
{ {
// Bullet resets several variables when an object is added to the world.
// Gravity is reset to world default depending on the static/dynamic
// type. Of course, the collision flags in the broadphase proxy are initialized to default.
BulletWorldUnman worldu = world as BulletWorldUnman; BulletWorldUnman worldu = world as BulletWorldUnman;
BulletBodyUnman bodyu = obj as BulletBodyUnman; BulletBodyUnman bodyu = obj as BulletBodyUnman;
// Bullet resets several variables when an object is added to the world.
// Gravity is reset to world default depending on the static/dynamic
// type. Of course, the collision flags in the broadphase proxy are initialized to default.
Vector3 origGrav = BSAPICPP.GetGravity2(bodyu.ptr); Vector3 origGrav = BSAPICPP.GetGravity2(bodyu.ptr);
bool ret = BSAPICPP.AddObjectToWorld2(worldu.ptr, bodyu.ptr); bool ret = BSAPICPP.AddObjectToWorld2(worldu.ptr, bodyu.ptr);
@ -1259,6 +1259,16 @@ public override void DumpPhysicsStatistics(BulletWorld world)
BulletWorldUnman worldu = world as BulletWorldUnman; BulletWorldUnman worldu = world as BulletWorldUnman;
BSAPICPP.DumpPhysicsStatistics2(worldu.ptr); BSAPICPP.DumpPhysicsStatistics2(worldu.ptr);
} }
public override void ResetBroadphasePool(BulletWorld world)
{
BulletWorldUnman worldu = world as BulletWorldUnman;
BSAPICPP.ResetBroadphasePool(worldu.ptr);
}
public override void ResetConstraintSolver(BulletWorld world)
{
BulletWorldUnman worldu = world as BulletWorldUnman;
BSAPICPP.ResetConstraintSolver(worldu.ptr);
}
// ===================================================================================== // =====================================================================================
// ===================================================================================== // =====================================================================================
@ -1832,6 +1842,12 @@ public static extern void DumpAllInfo2(IntPtr sim);
[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity] [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
public static extern void DumpPhysicsStatistics2(IntPtr sim); public static extern void DumpPhysicsStatistics2(IntPtr sim);
[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
public static extern void ResetBroadphasePool(IntPtr sim);
[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
public static extern void ResetConstraintSolver(IntPtr sim);
} }
} }

View File

@ -232,21 +232,25 @@ private sealed class BulletConstraintXNA : BulletConstraint
public override bool AddObjectToWorld(BulletWorld pWorld, BulletBody pBody) public override bool AddObjectToWorld(BulletWorld pWorld, BulletBody pBody)
{ {
DiscreteDynamicsWorld world = ((BulletWorldXNA)pWorld).world;
CollisionObject cbody = ((BulletBodyXNA)pBody).body;
RigidBody rbody = cbody as RigidBody;
// Bullet resets several variables when an object is added to the world. In particular, // Bullet resets several variables when an object is added to the world. In particular,
// BulletXNA resets position and rotation. Gravity is also reset depending on the static/dynamic // BulletXNA resets position and rotation. Gravity is also reset depending on the static/dynamic
// type. Of course, the collision flags in the broadphase proxy are initialized to default. // type. Of course, the collision flags in the broadphase proxy are initialized to default.
DiscreteDynamicsWorld world = ((BulletWorldXNA)pWorld).world; IndexedMatrix origPos = cbody.GetWorldTransform();
RigidBody body = ((BulletBodyXNA)pBody).rigidBody; if (rbody != null)
{
IndexedMatrix origPos = body.GetWorldTransform(); IndexedVector3 origGrav = rbody.GetGravity();
IndexedVector3 origGrav = body.GetGravity(); world.AddRigidBody(rbody);
rbody.SetGravity(origGrav);
//if (!(body.GetCollisionShape().GetShapeType() == BroadphaseNativeTypes.STATIC_PLANE_PROXYTYPE && body.GetCollisionShape().GetShapeType() == BroadphaseNativeTypes.TERRAIN_SHAPE_PROXYTYPE)) }
else
world.AddRigidBody(body); {
world.AddCollisionObject(rbody);
body.SetWorldTransform(origPos); }
body.SetGravity(origGrav); cbody.SetWorldTransform(origPos);
pBody.ApplyCollisionMask(pWorld.physicsScene); pBody.ApplyCollisionMask(pWorld.physicsScene);
@ -773,35 +777,6 @@ private sealed class BulletConstraintXNA : BulletConstraint
body.ApplyTorqueImpulse(ref fSum); body.ApplyTorqueImpulse(ref fSum);
} }
public override void DumpRigidBody(BulletWorld p, BulletBody p_2)
{
//TODO:
}
public override void DumpCollisionShape(BulletWorld p, BulletShape p_2)
{
//TODO:
}
public override void DumpConstraint(BulletWorld world, BulletConstraint constrain)
{
//TODO:
}
public override void DumpActivationInfo(BulletWorld world)
{
//TODO:
}
public override void DumpAllInfo(BulletWorld world)
{
//TODO:
}
public override void DumpPhysicsStatistics(BulletWorld world)
{
//TODO:
}
public override void DestroyObject(BulletWorld p, BulletBody p_2) public override void DestroyObject(BulletWorld p, BulletBody p_2)
{ {
//TODO: //TODO:

View File

@ -646,17 +646,21 @@ public abstract float GetMargin(BulletShape shape);
// ===================================================================================== // =====================================================================================
// Debugging // Debugging
public abstract void DumpRigidBody(BulletWorld sim, BulletBody collisionObject); public virtual void DumpRigidBody(BulletWorld sim, BulletBody collisionObject) { }
public abstract void DumpCollisionShape(BulletWorld sim, BulletShape collisionShape); public virtual void DumpCollisionShape(BulletWorld sim, BulletShape collisionShape) { }
public abstract void DumpConstraint(BulletWorld sim, BulletConstraint constrain); public virtual void DumpConstraint(BulletWorld sim, BulletConstraint constrain) { }
public abstract void DumpActivationInfo(BulletWorld sim); public virtual void DumpActivationInfo(BulletWorld sim) { }
public abstract void DumpAllInfo(BulletWorld sim); public virtual void DumpAllInfo(BulletWorld sim) { }
public abstract void DumpPhysicsStatistics(BulletWorld sim); public virtual void DumpPhysicsStatistics(BulletWorld sim) { }
public virtual void ResetBroadphasePool(BulletWorld sim) { }
public virtual void ResetConstraintSolver(BulletWorld sim) { }
}; };
} }

View File

@ -497,6 +497,16 @@ public static class BSParam
(s,cf,p,v) => { s.PhysicsMetricDumpFrames = cf.GetFloat(p, (int)v); }, (s,cf,p,v) => { s.PhysicsMetricDumpFrames = cf.GetFloat(p, (int)v); },
(s) => { return (float)s.PhysicsMetricDumpFrames; }, (s) => { return (float)s.PhysicsMetricDumpFrames; },
(s,p,l,v) => { s.PhysicsMetricDumpFrames = (int)v; } ), (s,p,l,v) => { s.PhysicsMetricDumpFrames = (int)v; } ),
new ParameterDefn("ResetBroadphasePool", "Setting this is any value resets the broadphase collision pool",
0f,
(s,cf,p,v) => { ; },
(s) => { return 0f; },
(s,p,l,v) => { BSParam.ResetBroadphasePoolTainted(s, v); } ),
new ParameterDefn("ResetConstraintSolver", "Setting this is any value resets the constraint solver",
0f,
(s,cf,p,v) => { ; },
(s) => { return 0f; },
(s,p,l,v) => { BSParam.ResetConstraintSolverTainted(s, v); } ),
}; };
// Convert a boolean to our numeric true and false values // Convert a boolean to our numeric true and false values
@ -511,6 +521,24 @@ public static class BSParam
return (b == ConfigurationParameters.numericTrue ? true : false); return (b == ConfigurationParameters.numericTrue ? true : false);
} }
private static void ResetBroadphasePoolTainted(BSScene pPhysScene, float v)
{
BSScene physScene = pPhysScene;
physScene.TaintedObject("BSParam.ResetBroadphasePoolTainted", delegate()
{
physScene.PE.ResetBroadphasePool(physScene.World);
});
}
private static void ResetConstraintSolverTainted(BSScene pPhysScene, float v)
{
BSScene physScene = pPhysScene;
physScene.TaintedObject("BSParam.ResetConstraintSolver", delegate()
{
physScene.PE.ResetConstraintSolver(physScene.World);
});
}
// Search through the parameter definitions and return the matching // Search through the parameter definitions and return the matching
// ParameterDefn structure. // ParameterDefn structure.
// Case does not matter as names are compared after converting to lower case. // Case does not matter as names are compared after converting to lower case.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.