refactor: unindent the OdeScene.Simulate() loop to ignore the long commented out ifs and locks
This is to make it more readable.bulletsim
parent
8c3eb324c4
commit
9c6227da66
|
@ -2687,320 +2687,321 @@ Console.WriteLine("AddPhysicsActorTaint to " + taintedprim.Name);
|
||||||
//if (!ode.lockquery())
|
//if (!ode.lockquery())
|
||||||
//{
|
//{
|
||||||
// ode.dlock(world);
|
// ode.dlock(world);
|
||||||
try
|
|
||||||
{
|
|
||||||
// Insert, remove Characters
|
|
||||||
bool processedtaints = false;
|
|
||||||
|
|
||||||
lock (_taintedActors)
|
try
|
||||||
|
{
|
||||||
|
// Insert, remove Characters
|
||||||
|
bool processedtaints = false;
|
||||||
|
|
||||||
|
lock (_taintedActors)
|
||||||
|
{
|
||||||
|
if (_taintedActors.Count > 0)
|
||||||
|
{
|
||||||
|
foreach (OdeCharacter character in _taintedActors)
|
||||||
{
|
{
|
||||||
if (_taintedActors.Count > 0)
|
character.ProcessTaints(timeStep);
|
||||||
{
|
|
||||||
foreach (OdeCharacter character in _taintedActors)
|
|
||||||
{
|
|
||||||
character.ProcessTaints(timeStep);
|
|
||||||
|
|
||||||
processedtaints = true;
|
processedtaints = true;
|
||||||
//character.m_collisionscore = 0;
|
//character.m_collisionscore = 0;
|
||||||
}
|
|
||||||
|
|
||||||
if (processedtaints)
|
|
||||||
_taintedActors.Clear();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Modify other objects in the scene.
|
if (processedtaints)
|
||||||
processedtaints = false;
|
_taintedActors.Clear();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
lock (_taintedPrimLock)
|
// Modify other objects in the scene.
|
||||||
|
processedtaints = false;
|
||||||
|
|
||||||
|
lock (_taintedPrimLock)
|
||||||
|
{
|
||||||
|
foreach (OdePrim prim in _taintedPrimL)
|
||||||
|
{
|
||||||
|
if (prim.m_taintremove)
|
||||||
{
|
{
|
||||||
foreach (OdePrim prim in _taintedPrimL)
|
//Console.WriteLine("Simulate calls RemovePrimThreadLocked");
|
||||||
|
RemovePrimThreadLocked(prim);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//Console.WriteLine("Simulate calls ProcessTaints");
|
||||||
|
prim.ProcessTaints(timeStep);
|
||||||
|
}
|
||||||
|
processedtaints = true;
|
||||||
|
prim.m_collisionscore = 0;
|
||||||
|
|
||||||
|
// This loop can block up the Heartbeat for a very long time on large regions.
|
||||||
|
// We need to let the Watchdog know that the Heartbeat is not dead
|
||||||
|
// NOTE: This is currently commented out, but if things like OAR loading are
|
||||||
|
// timing the heartbeat out we will need to uncomment it
|
||||||
|
//Watchdog.UpdateThread();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (SupportsNINJAJoints)
|
||||||
|
{
|
||||||
|
// Create pending joints, if possible
|
||||||
|
|
||||||
|
// joints can only be processed after ALL bodies are processed (and exist in ODE), since creating
|
||||||
|
// a joint requires specifying the body id of both involved bodies
|
||||||
|
if (pendingJoints.Count > 0)
|
||||||
|
{
|
||||||
|
List<PhysicsJoint> successfullyProcessedPendingJoints = new List<PhysicsJoint>();
|
||||||
|
//DoJointErrorMessage(joints_connecting_actor, "taint: " + pendingJoints.Count + " pending joints");
|
||||||
|
foreach (PhysicsJoint joint in pendingJoints)
|
||||||
{
|
{
|
||||||
if (prim.m_taintremove)
|
//DoJointErrorMessage(joint, "taint: time to create joint with parms: " + joint.RawParams);
|
||||||
|
string[] jointParams = joint.RawParams.Split(" ".ToCharArray(), System.StringSplitOptions.RemoveEmptyEntries);
|
||||||
|
List<IntPtr> jointBodies = new List<IntPtr>();
|
||||||
|
bool allJointBodiesAreReady = true;
|
||||||
|
foreach (string jointParam in jointParams)
|
||||||
{
|
{
|
||||||
//Console.WriteLine("Simulate calls RemovePrimThreadLocked");
|
if (jointParam == "NULL")
|
||||||
RemovePrimThreadLocked(prim);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
//Console.WriteLine("Simulate calls ProcessTaints");
|
|
||||||
prim.ProcessTaints(timeStep);
|
|
||||||
}
|
|
||||||
processedtaints = true;
|
|
||||||
prim.m_collisionscore = 0;
|
|
||||||
|
|
||||||
// This loop can block up the Heartbeat for a very long time on large regions.
|
|
||||||
// We need to let the Watchdog know that the Heartbeat is not dead
|
|
||||||
// NOTE: This is currently commented out, but if things like OAR loading are
|
|
||||||
// timing the heartbeat out we will need to uncomment it
|
|
||||||
//Watchdog.UpdateThread();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (SupportsNINJAJoints)
|
|
||||||
{
|
|
||||||
// Create pending joints, if possible
|
|
||||||
|
|
||||||
// joints can only be processed after ALL bodies are processed (and exist in ODE), since creating
|
|
||||||
// a joint requires specifying the body id of both involved bodies
|
|
||||||
if (pendingJoints.Count > 0)
|
|
||||||
{
|
|
||||||
List<PhysicsJoint> successfullyProcessedPendingJoints = new List<PhysicsJoint>();
|
|
||||||
//DoJointErrorMessage(joints_connecting_actor, "taint: " + pendingJoints.Count + " pending joints");
|
|
||||||
foreach (PhysicsJoint joint in pendingJoints)
|
|
||||||
{
|
{
|
||||||
//DoJointErrorMessage(joint, "taint: time to create joint with parms: " + joint.RawParams);
|
//DoJointErrorMessage(joint, "attaching NULL joint to world");
|
||||||
string[] jointParams = joint.RawParams.Split(" ".ToCharArray(), System.StringSplitOptions.RemoveEmptyEntries);
|
jointBodies.Add(IntPtr.Zero);
|
||||||
List<IntPtr> jointBodies = new List<IntPtr>();
|
}
|
||||||
bool allJointBodiesAreReady = true;
|
else
|
||||||
foreach (string jointParam in jointParams)
|
{
|
||||||
|
//DoJointErrorMessage(joint, "looking for prim name: " + jointParam);
|
||||||
|
bool foundPrim = false;
|
||||||
|
lock (_prims)
|
||||||
{
|
{
|
||||||
if (jointParam == "NULL")
|
foreach (OdePrim prim in _prims) // FIXME: inefficient
|
||||||
{
|
{
|
||||||
//DoJointErrorMessage(joint, "attaching NULL joint to world");
|
if (prim.SOPName == jointParam)
|
||||||
jointBodies.Add(IntPtr.Zero);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
//DoJointErrorMessage(joint, "looking for prim name: " + jointParam);
|
|
||||||
bool foundPrim = false;
|
|
||||||
lock (_prims)
|
|
||||||
{
|
{
|
||||||
foreach (OdePrim prim in _prims) // FIXME: inefficient
|
//DoJointErrorMessage(joint, "found for prim name: " + jointParam);
|
||||||
|
if (prim.IsPhysical && prim.Body != IntPtr.Zero)
|
||||||
{
|
{
|
||||||
if (prim.SOPName == jointParam)
|
jointBodies.Add(prim.Body);
|
||||||
{
|
foundPrim = true;
|
||||||
//DoJointErrorMessage(joint, "found for prim name: " + jointParam);
|
break;
|
||||||
if (prim.IsPhysical && prim.Body != IntPtr.Zero)
|
}
|
||||||
{
|
else
|
||||||
jointBodies.Add(prim.Body);
|
{
|
||||||
foundPrim = true;
|
DoJointErrorMessage(joint, "prim name " + jointParam +
|
||||||
break;
|
" exists but is not (yet) physical; deferring joint creation. " +
|
||||||
}
|
"IsPhysical property is " + prim.IsPhysical +
|
||||||
else
|
" and body is " + prim.Body);
|
||||||
{
|
foundPrim = false;
|
||||||
DoJointErrorMessage(joint, "prim name " + jointParam +
|
break;
|
||||||
" exists but is not (yet) physical; deferring joint creation. " +
|
|
||||||
"IsPhysical property is " + prim.IsPhysical +
|
|
||||||
" and body is " + prim.Body);
|
|
||||||
foundPrim = false;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
if (foundPrim)
|
|
||||||
{
|
|
||||||
// all is fine
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
allJointBodiesAreReady = false;
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (allJointBodiesAreReady)
|
if (foundPrim)
|
||||||
{
|
{
|
||||||
//DoJointErrorMessage(joint, "allJointBodiesAreReady for " + joint.ObjectNameInScene + " with parms " + joint.RawParams);
|
// all is fine
|
||||||
if (jointBodies[0] == jointBodies[1])
|
|
||||||
{
|
|
||||||
DoJointErrorMessage(joint, "ERROR: joint cannot be created; the joint bodies are the same, body1==body2. Raw body is " + jointBodies[0] + ". raw parms: " + joint.RawParams);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
switch (joint.Type)
|
|
||||||
{
|
|
||||||
case PhysicsJointType.Ball:
|
|
||||||
{
|
|
||||||
IntPtr odeJoint;
|
|
||||||
//DoJointErrorMessage(joint, "ODE creating ball joint ");
|
|
||||||
odeJoint = d.JointCreateBall(world, IntPtr.Zero);
|
|
||||||
//DoJointErrorMessage(joint, "ODE attaching ball joint: " + odeJoint + " with b1:" + jointBodies[0] + " b2:" + jointBodies[1]);
|
|
||||||
d.JointAttach(odeJoint, jointBodies[0], jointBodies[1]);
|
|
||||||
//DoJointErrorMessage(joint, "ODE setting ball anchor: " + odeJoint + " to vec:" + joint.Position);
|
|
||||||
d.JointSetBallAnchor(odeJoint,
|
|
||||||
joint.Position.X,
|
|
||||||
joint.Position.Y,
|
|
||||||
joint.Position.Z);
|
|
||||||
//DoJointErrorMessage(joint, "ODE joint setting OK");
|
|
||||||
//DoJointErrorMessage(joint, "The ball joint's bodies are here: b0: ");
|
|
||||||
//DoJointErrorMessage(joint, "" + (jointBodies[0] != IntPtr.Zero ? "" + d.BodyGetPosition(jointBodies[0]) : "fixed environment"));
|
|
||||||
//DoJointErrorMessage(joint, "The ball joint's bodies are here: b1: ");
|
|
||||||
//DoJointErrorMessage(joint, "" + (jointBodies[1] != IntPtr.Zero ? "" + d.BodyGetPosition(jointBodies[1]) : "fixed environment"));
|
|
||||||
|
|
||||||
if (joint is OdePhysicsJoint)
|
|
||||||
{
|
|
||||||
((OdePhysicsJoint)joint).jointID = odeJoint;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DoJointErrorMessage(joint, "WARNING: non-ode joint in ODE!");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case PhysicsJointType.Hinge:
|
|
||||||
{
|
|
||||||
IntPtr odeJoint;
|
|
||||||
//DoJointErrorMessage(joint, "ODE creating hinge joint ");
|
|
||||||
odeJoint = d.JointCreateHinge(world, IntPtr.Zero);
|
|
||||||
//DoJointErrorMessage(joint, "ODE attaching hinge joint: " + odeJoint + " with b1:" + jointBodies[0] + " b2:" + jointBodies[1]);
|
|
||||||
d.JointAttach(odeJoint, jointBodies[0], jointBodies[1]);
|
|
||||||
//DoJointErrorMessage(joint, "ODE setting hinge anchor: " + odeJoint + " to vec:" + joint.Position);
|
|
||||||
d.JointSetHingeAnchor(odeJoint,
|
|
||||||
joint.Position.X,
|
|
||||||
joint.Position.Y,
|
|
||||||
joint.Position.Z);
|
|
||||||
// We use the orientation of the x-axis of the joint's coordinate frame
|
|
||||||
// as the axis for the hinge.
|
|
||||||
|
|
||||||
// Therefore, we must get the joint's coordinate frame based on the
|
|
||||||
// joint.Rotation field, which originates from the orientation of the
|
|
||||||
// joint's proxy object in the scene.
|
|
||||||
|
|
||||||
// The joint's coordinate frame is defined as the transformation matrix
|
|
||||||
// that converts a vector from joint-local coordinates into world coordinates.
|
|
||||||
// World coordinates are defined as the XYZ coordinate system of the sim,
|
|
||||||
// as shown in the top status-bar of the viewer.
|
|
||||||
|
|
||||||
// Once we have the joint's coordinate frame, we extract its X axis (AtAxis)
|
|
||||||
// and use that as the hinge axis.
|
|
||||||
|
|
||||||
//joint.Rotation.Normalize();
|
|
||||||
Matrix4 proxyFrame = Matrix4.CreateFromQuaternion(joint.Rotation);
|
|
||||||
|
|
||||||
// Now extract the X axis of the joint's coordinate frame.
|
|
||||||
|
|
||||||
// Do not try to use proxyFrame.AtAxis or you will become mired in the
|
|
||||||
// tar pit of transposed, inverted, and generally messed-up orientations.
|
|
||||||
// (In other words, Matrix4.AtAxis() is borked.)
|
|
||||||
// Vector3 jointAxis = proxyFrame.AtAxis; <--- this path leadeth to madness
|
|
||||||
|
|
||||||
// Instead, compute the X axis of the coordinate frame by transforming
|
|
||||||
// the (1,0,0) vector. At least that works.
|
|
||||||
|
|
||||||
//m_log.Debug("PHY: making axis: complete matrix is " + proxyFrame);
|
|
||||||
Vector3 jointAxis = Vector3.Transform(Vector3.UnitX, proxyFrame);
|
|
||||||
//m_log.Debug("PHY: making axis: hinge joint axis is " + jointAxis);
|
|
||||||
//DoJointErrorMessage(joint, "ODE setting hinge axis: " + odeJoint + " to vec:" + jointAxis);
|
|
||||||
d.JointSetHingeAxis(odeJoint,
|
|
||||||
jointAxis.X,
|
|
||||||
jointAxis.Y,
|
|
||||||
jointAxis.Z);
|
|
||||||
//d.JointSetHingeParam(odeJoint, (int)dParam.CFM, 0.1f);
|
|
||||||
if (joint is OdePhysicsJoint)
|
|
||||||
{
|
|
||||||
((OdePhysicsJoint)joint).jointID = odeJoint;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DoJointErrorMessage(joint, "WARNING: non-ode joint in ODE!");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
successfullyProcessedPendingJoints.Add(joint);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
DoJointErrorMessage(joint, "joint could not yet be created; still pending");
|
allJointBodiesAreReady = false;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
foreach (PhysicsJoint successfullyProcessedJoint in successfullyProcessedPendingJoints)
|
}
|
||||||
|
if (allJointBodiesAreReady)
|
||||||
|
{
|
||||||
|
//DoJointErrorMessage(joint, "allJointBodiesAreReady for " + joint.ObjectNameInScene + " with parms " + joint.RawParams);
|
||||||
|
if (jointBodies[0] == jointBodies[1])
|
||||||
{
|
{
|
||||||
//DoJointErrorMessage(successfullyProcessedJoint, "finalizing succesfully procsssed joint " + successfullyProcessedJoint.ObjectNameInScene + " parms " + successfullyProcessedJoint.RawParams);
|
DoJointErrorMessage(joint, "ERROR: joint cannot be created; the joint bodies are the same, body1==body2. Raw body is " + jointBodies[0] + ". raw parms: " + joint.RawParams);
|
||||||
//DoJointErrorMessage(successfullyProcessedJoint, "removing from pending");
|
}
|
||||||
InternalRemovePendingJoint(successfullyProcessedJoint);
|
else
|
||||||
//DoJointErrorMessage(successfullyProcessedJoint, "adding to active");
|
{
|
||||||
InternalAddActiveJoint(successfullyProcessedJoint);
|
switch (joint.Type)
|
||||||
//DoJointErrorMessage(successfullyProcessedJoint, "done");
|
{
|
||||||
|
case PhysicsJointType.Ball:
|
||||||
|
{
|
||||||
|
IntPtr odeJoint;
|
||||||
|
//DoJointErrorMessage(joint, "ODE creating ball joint ");
|
||||||
|
odeJoint = d.JointCreateBall(world, IntPtr.Zero);
|
||||||
|
//DoJointErrorMessage(joint, "ODE attaching ball joint: " + odeJoint + " with b1:" + jointBodies[0] + " b2:" + jointBodies[1]);
|
||||||
|
d.JointAttach(odeJoint, jointBodies[0], jointBodies[1]);
|
||||||
|
//DoJointErrorMessage(joint, "ODE setting ball anchor: " + odeJoint + " to vec:" + joint.Position);
|
||||||
|
d.JointSetBallAnchor(odeJoint,
|
||||||
|
joint.Position.X,
|
||||||
|
joint.Position.Y,
|
||||||
|
joint.Position.Z);
|
||||||
|
//DoJointErrorMessage(joint, "ODE joint setting OK");
|
||||||
|
//DoJointErrorMessage(joint, "The ball joint's bodies are here: b0: ");
|
||||||
|
//DoJointErrorMessage(joint, "" + (jointBodies[0] != IntPtr.Zero ? "" + d.BodyGetPosition(jointBodies[0]) : "fixed environment"));
|
||||||
|
//DoJointErrorMessage(joint, "The ball joint's bodies are here: b1: ");
|
||||||
|
//DoJointErrorMessage(joint, "" + (jointBodies[1] != IntPtr.Zero ? "" + d.BodyGetPosition(jointBodies[1]) : "fixed environment"));
|
||||||
|
|
||||||
|
if (joint is OdePhysicsJoint)
|
||||||
|
{
|
||||||
|
((OdePhysicsJoint)joint).jointID = odeJoint;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
DoJointErrorMessage(joint, "WARNING: non-ode joint in ODE!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case PhysicsJointType.Hinge:
|
||||||
|
{
|
||||||
|
IntPtr odeJoint;
|
||||||
|
//DoJointErrorMessage(joint, "ODE creating hinge joint ");
|
||||||
|
odeJoint = d.JointCreateHinge(world, IntPtr.Zero);
|
||||||
|
//DoJointErrorMessage(joint, "ODE attaching hinge joint: " + odeJoint + " with b1:" + jointBodies[0] + " b2:" + jointBodies[1]);
|
||||||
|
d.JointAttach(odeJoint, jointBodies[0], jointBodies[1]);
|
||||||
|
//DoJointErrorMessage(joint, "ODE setting hinge anchor: " + odeJoint + " to vec:" + joint.Position);
|
||||||
|
d.JointSetHingeAnchor(odeJoint,
|
||||||
|
joint.Position.X,
|
||||||
|
joint.Position.Y,
|
||||||
|
joint.Position.Z);
|
||||||
|
// We use the orientation of the x-axis of the joint's coordinate frame
|
||||||
|
// as the axis for the hinge.
|
||||||
|
|
||||||
|
// Therefore, we must get the joint's coordinate frame based on the
|
||||||
|
// joint.Rotation field, which originates from the orientation of the
|
||||||
|
// joint's proxy object in the scene.
|
||||||
|
|
||||||
|
// The joint's coordinate frame is defined as the transformation matrix
|
||||||
|
// that converts a vector from joint-local coordinates into world coordinates.
|
||||||
|
// World coordinates are defined as the XYZ coordinate system of the sim,
|
||||||
|
// as shown in the top status-bar of the viewer.
|
||||||
|
|
||||||
|
// Once we have the joint's coordinate frame, we extract its X axis (AtAxis)
|
||||||
|
// and use that as the hinge axis.
|
||||||
|
|
||||||
|
//joint.Rotation.Normalize();
|
||||||
|
Matrix4 proxyFrame = Matrix4.CreateFromQuaternion(joint.Rotation);
|
||||||
|
|
||||||
|
// Now extract the X axis of the joint's coordinate frame.
|
||||||
|
|
||||||
|
// Do not try to use proxyFrame.AtAxis or you will become mired in the
|
||||||
|
// tar pit of transposed, inverted, and generally messed-up orientations.
|
||||||
|
// (In other words, Matrix4.AtAxis() is borked.)
|
||||||
|
// Vector3 jointAxis = proxyFrame.AtAxis; <--- this path leadeth to madness
|
||||||
|
|
||||||
|
// Instead, compute the X axis of the coordinate frame by transforming
|
||||||
|
// the (1,0,0) vector. At least that works.
|
||||||
|
|
||||||
|
//m_log.Debug("PHY: making axis: complete matrix is " + proxyFrame);
|
||||||
|
Vector3 jointAxis = Vector3.Transform(Vector3.UnitX, proxyFrame);
|
||||||
|
//m_log.Debug("PHY: making axis: hinge joint axis is " + jointAxis);
|
||||||
|
//DoJointErrorMessage(joint, "ODE setting hinge axis: " + odeJoint + " to vec:" + jointAxis);
|
||||||
|
d.JointSetHingeAxis(odeJoint,
|
||||||
|
jointAxis.X,
|
||||||
|
jointAxis.Y,
|
||||||
|
jointAxis.Z);
|
||||||
|
//d.JointSetHingeParam(odeJoint, (int)dParam.CFM, 0.1f);
|
||||||
|
if (joint is OdePhysicsJoint)
|
||||||
|
{
|
||||||
|
((OdePhysicsJoint)joint).jointID = odeJoint;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
DoJointErrorMessage(joint, "WARNING: non-ode joint in ODE!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
successfullyProcessedPendingJoints.Add(joint);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
DoJointErrorMessage(joint, "joint could not yet be created; still pending");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
foreach (PhysicsJoint successfullyProcessedJoint in successfullyProcessedPendingJoints)
|
||||||
|
{
|
||||||
|
//DoJointErrorMessage(successfullyProcessedJoint, "finalizing succesfully procsssed joint " + successfullyProcessedJoint.ObjectNameInScene + " parms " + successfullyProcessedJoint.RawParams);
|
||||||
|
//DoJointErrorMessage(successfullyProcessedJoint, "removing from pending");
|
||||||
|
InternalRemovePendingJoint(successfullyProcessedJoint);
|
||||||
|
//DoJointErrorMessage(successfullyProcessedJoint, "adding to active");
|
||||||
|
InternalAddActiveJoint(successfullyProcessedJoint);
|
||||||
|
//DoJointErrorMessage(successfullyProcessedJoint, "done");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (processedtaints)
|
if (processedtaints)
|
||||||
//Console.WriteLine("Simulate calls Clear of _taintedPrim list");
|
//Console.WriteLine("Simulate calls Clear of _taintedPrim list");
|
||||||
_taintedPrimH.Clear();
|
_taintedPrimH.Clear();
|
||||||
_taintedPrimL.Clear();
|
_taintedPrimL.Clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Move characters
|
// Move characters
|
||||||
lock (_characters)
|
lock (_characters)
|
||||||
{
|
{
|
||||||
List<OdeCharacter> defects = new List<OdeCharacter>();
|
List<OdeCharacter> defects = new List<OdeCharacter>();
|
||||||
foreach (OdeCharacter actor in _characters)
|
foreach (OdeCharacter actor in _characters)
|
||||||
{
|
|
||||||
if (actor != null)
|
|
||||||
actor.Move(timeStep, defects);
|
|
||||||
}
|
|
||||||
if (0 != defects.Count)
|
|
||||||
{
|
|
||||||
foreach (OdeCharacter defect in defects)
|
|
||||||
{
|
|
||||||
RemoveCharacter(defect);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Move other active objects
|
|
||||||
lock (_activeprims)
|
|
||||||
{
|
|
||||||
foreach (OdePrim prim in _activeprims)
|
|
||||||
{
|
|
||||||
prim.m_collisionscore = 0;
|
|
||||||
prim.Move(timeStep);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//if ((framecount % m_randomizeWater) == 0)
|
|
||||||
// randomizeWater(waterlevel);
|
|
||||||
|
|
||||||
//int RayCastTimeMS = m_rayCastManager.ProcessQueuedRequests();
|
|
||||||
m_rayCastManager.ProcessQueuedRequests();
|
|
||||||
|
|
||||||
collision_optimized(timeStep);
|
|
||||||
|
|
||||||
lock (_collisionEventPrim)
|
|
||||||
{
|
|
||||||
foreach (PhysicsActor obj in _collisionEventPrim)
|
|
||||||
{
|
|
||||||
if (obj == null)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
switch ((ActorTypes)obj.PhysicsActorType)
|
|
||||||
{
|
|
||||||
case ActorTypes.Agent:
|
|
||||||
OdeCharacter cobj = (OdeCharacter)obj;
|
|
||||||
cobj.AddCollisionFrameTime(100);
|
|
||||||
cobj.SendCollisions();
|
|
||||||
break;
|
|
||||||
case ActorTypes.Prim:
|
|
||||||
OdePrim pobj = (OdePrim)obj;
|
|
||||||
pobj.SendCollisions();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//if (m_global_contactcount > 5)
|
|
||||||
//{
|
|
||||||
// m_log.DebugFormat("[PHYSICS]: Contacts:{0}", m_global_contactcount);
|
|
||||||
//}
|
|
||||||
|
|
||||||
m_global_contactcount = 0;
|
|
||||||
|
|
||||||
d.WorldQuickStep(world, ODE_STEPSIZE);
|
|
||||||
d.JointGroupEmpty(contactgroup);
|
|
||||||
//ode.dunlock(world);
|
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{
|
{
|
||||||
m_log.ErrorFormat("[PHYSICS]: {0}, {1}, {2}", e.Message, e.TargetSite, e);
|
if (actor != null)
|
||||||
ode.dunlock(world);
|
actor.Move(timeStep, defects);
|
||||||
}
|
}
|
||||||
|
if (0 != defects.Count)
|
||||||
|
{
|
||||||
|
foreach (OdeCharacter defect in defects)
|
||||||
|
{
|
||||||
|
RemoveCharacter(defect);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
step_time -= ODE_STEPSIZE;
|
// Move other active objects
|
||||||
i++;
|
lock (_activeprims)
|
||||||
|
{
|
||||||
|
foreach (OdePrim prim in _activeprims)
|
||||||
|
{
|
||||||
|
prim.m_collisionscore = 0;
|
||||||
|
prim.Move(timeStep);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//if ((framecount % m_randomizeWater) == 0)
|
||||||
|
// randomizeWater(waterlevel);
|
||||||
|
|
||||||
|
//int RayCastTimeMS = m_rayCastManager.ProcessQueuedRequests();
|
||||||
|
m_rayCastManager.ProcessQueuedRequests();
|
||||||
|
|
||||||
|
collision_optimized(timeStep);
|
||||||
|
|
||||||
|
lock (_collisionEventPrim)
|
||||||
|
{
|
||||||
|
foreach (PhysicsActor obj in _collisionEventPrim)
|
||||||
|
{
|
||||||
|
if (obj == null)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
switch ((ActorTypes)obj.PhysicsActorType)
|
||||||
|
{
|
||||||
|
case ActorTypes.Agent:
|
||||||
|
OdeCharacter cobj = (OdeCharacter)obj;
|
||||||
|
cobj.AddCollisionFrameTime(100);
|
||||||
|
cobj.SendCollisions();
|
||||||
|
break;
|
||||||
|
case ActorTypes.Prim:
|
||||||
|
OdePrim pobj = (OdePrim)obj;
|
||||||
|
pobj.SendCollisions();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//if (m_global_contactcount > 5)
|
||||||
|
//{
|
||||||
|
// m_log.DebugFormat("[PHYSICS]: Contacts:{0}", m_global_contactcount);
|
||||||
|
//}
|
||||||
|
|
||||||
|
m_global_contactcount = 0;
|
||||||
|
|
||||||
|
d.WorldQuickStep(world, ODE_STEPSIZE);
|
||||||
|
d.JointGroupEmpty(contactgroup);
|
||||||
|
//ode.dunlock(world);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
m_log.ErrorFormat("[PHYSICS]: {0}, {1}, {2}", e.Message, e.TargetSite, e);
|
||||||
|
ode.dunlock(world);
|
||||||
|
}
|
||||||
|
|
||||||
|
step_time -= ODE_STEPSIZE;
|
||||||
|
i++;
|
||||||
//}
|
//}
|
||||||
//else
|
//else
|
||||||
//{
|
//{
|
||||||
|
@ -3091,8 +3092,10 @@ Console.WriteLine("AddPhysicsActorTaint to " + taintedprim.Name);
|
||||||
fwriter.WriteLine(header);
|
fwriter.WriteLine(header);
|
||||||
fwriter.Close();
|
fwriter.Close();
|
||||||
}
|
}
|
||||||
|
|
||||||
d.WorldExportDIF(world, fname, physics_logging_append_existing_logfile, prefix);
|
d.WorldExportDIF(world, fname, physics_logging_append_existing_logfile, prefix);
|
||||||
}
|
}
|
||||||
|
|
||||||
latertickcount = Util.EnvironmentTickCount() - tickCountFrameRun;
|
latertickcount = Util.EnvironmentTickCount() - tickCountFrameRun;
|
||||||
|
|
||||||
// OpenSimulator above does 10 fps. 10 fps = means that the main thread loop and physics
|
// OpenSimulator above does 10 fps. 10 fps = means that the main thread loop and physics
|
||||||
|
@ -3694,6 +3697,7 @@ Console.WriteLine("AddPhysicsActorTaint to " + taintedprim.Name);
|
||||||
//d.CloseODE();
|
//d.CloseODE();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public override Dictionary<uint, float> GetTopColliders()
|
public override Dictionary<uint, float> GetTopColliders()
|
||||||
{
|
{
|
||||||
Dictionary<uint, float> returncolliders = new Dictionary<uint, float>();
|
Dictionary<uint, float> returncolliders = new Dictionary<uint, float>();
|
||||||
|
|
Loading…
Reference in New Issue