public bool StepSimulation(float timeStep) { simTimeStep += timeStep; if (simThread != null) { return(false); } simThread = new Thread(new ParameterizedThreadStart(delegate(object t) { float s = (float)t; if (s > 1.0f / 60) { s = 1.0f / 60; } bulletWorld.StepSimulation(s); IrrlichtLime.Core.Matrix m = new IrrlichtLime.Core.Matrix(); AlignedCollisionObjectArray collObjects = bulletWorld.CollisionObjectArray; for (int i = collObjects.Count - 1; i >= 0; i--) { CollisionObject collObject = collObjects[i]; if (collObject.IsStaticObject || !collObject.IsActive) { continue; } m.SetElementArray(collObject.WorldTransform.ToArray()); SceneNode n = collObject.UserObject as SceneNode; n.Position = m.Translation; n.Rotation = m.Rotation; if (m.Translation.Y < -40000) { n.SceneManager.AddToDeletionQueue(n); bulletWorld.RemoveCollisionObject(collObject); collObject.Dispose(); } } simThread = null; })); simThread.Start(simTimeStep); simTimeStep = 0; return(true); }
public bool StepSimulation(float timeStep) { simTimeStep += timeStep; if (simThread != null) return false; simThread = new System.Threading.Thread(new ParameterizedThreadStart(delegate(object t) { float s = (float)t; if (s > 1.0f / 60) s = 1.0f / 60; bulletWorld.StepSimulation(s); IrrlichtLime.Core.Matrix m = new IrrlichtLime.Core.Matrix(); AlignedCollisionObjectArray collObjects = bulletWorld.CollisionObjectArray; for (int i = collObjects.Count - 1; i >= 0; i--) { CollisionObject collObject = collObjects[i]; if (collObject.IsStaticObject || !collObject.IsActive) continue; m.SetElementArray(collObject.WorldTransform.ToArray()); SceneNode n = collObject.UserObject as SceneNode; n.Position = m.Translation; n.Rotation = m.Rotation; if (m.Translation.Y < -40000) { n.SceneManager.AddToDeletionQueue(n); bulletWorld.RemoveCollisionObject(collObject); collObject.Dispose(); } } simThread = null; })); simThread.Start(simTimeStep); simTimeStep = 0; return true; }