/** Thread for simulation */ @Override public void run() { final ArrayList<PhysicBody> bodies = mOnSceneBodies; long lastTime = System.currentTimeMillis(); long time; final Vector2D force = new Vector2D(); for (; !mDoKill; ) { try { mSimulationMutex.acquire(); } catch (InterruptedException e2) { e2.printStackTrace(); } /* Compute time */ time = System.currentTimeMillis() - lastTime; lastTime = System.currentTimeMillis(); /* We need a semaphore here */ try { mLockOnSceneBodys.acquire(); } catch (InterruptedException e1) { e1.printStackTrace(); } /* Apply gravity impulse */ for (PhysicBody body : bodies) { force.set(mGravity); body.applyImpulse(force.mul(body.getBodyMass() * (float) time / 1000f)); } mLockOnSceneBodys.release(); /* Then apply collisions forces */ mArbiter.checkCollisions(); try { mLockOnSceneBodys.acquire(); } catch (InterruptedException e1) { e1.printStackTrace(); } /* Last update body */ for (PhysicBody body : bodies) body.onUpdateBody((float) time / 1000f); mLockOnSceneBodys.release(); mSimulationMutex.release(); /* Keep max frame-rate */ try { if (time < 40) Thread.sleep(40 - time); } catch (InterruptedException e) { e.printStackTrace(); } } mDoKill = false; }
/** * Adds physical object * * @param object object to be added */ public void add(final PhysicBody body) { try { mLockOnSceneBodys.acquire(); } catch (InterruptedException e) { e.printStackTrace(); } mOnSceneBodies.add(body); mArbiter.add(body.getCollider()); mLockOnSceneBodys.release(); }
public boolean remove(final PhysicBody body) { try { mLockOnSceneBodys.acquire(); } catch (InterruptedException e) { e.printStackTrace(); } boolean removed = mOnSceneBodies.remove(body); mLockOnSceneBodys.release(); removed &= mArbiter.remove(body.getCollider()); return removed; }