package org.jbox2d.collision.broadphase; import org.jbox2d.callbacks.DebugDraw; import org.jbox2d.callbacks.PairCallback; import org.jbox2d.callbacks.TreeCallback; import org.jbox2d.callbacks.TreeRayCastCallback; import org.jbox2d.collision.AABB; import org.jbox2d.collision.RayCastInput; import org.jbox2d.common.Vec2; public class BroadPhaseJNI implements BroadPhase { static { NarSystem.loadLibrary(); } private long nativeAddress; public BroadPhaseJNI() { createNative(); } private native void createNative(); @Override public int createProxy(AABB aabb, Object userData) { return createProxy(aabb.lowerBound.x, aabb.lowerBound.y, aabb.upperBound.x, aabb.upperBound.y, userData); } private native int createProxy(float lowerX, float lowerY, float upperX, float upperY, Object userData); @Override public native void destroyProxy(int proxyId); @Override public void moveProxy(int proxyId, AABB aabb, Vec2 displacement) { moveProxy(proxyId, aabb.lowerBound.x, aabb.lowerBound.y, aabb.upperBound.x, aabb.upperBound.y, displacement.x, displacement.y); } private native void moveProxy(int proxyId, float lowerX, float lowerY, float upperX, float upperY, float displaceX, float displaceY); @Override public native void touchProxy(int proxyId); @Override public native Object getUserData(int proxyId); private final AABB fat = new AABB(); @Override public AABB getFatAABB(int proxyId) { AABB2 f2 = getFat(proxyId); fat.lowerBound.x = f2.lx; fat.lowerBound.y = f2.ly; fat.upperBound.x = f2.ux; fat.upperBound.y = f2.uy; return fat; } private native AABB2 getFat(int proxy); @Override public native boolean testOverlap(int proxyIdA, int proxyIdB); @Override public native int getProxyCount(); @Override public void drawTree(DebugDraw argDraw) {} @Override public native void updatePairs(PairCallback callback); @Override public void query(TreeCallback callback, AABB aabb) { query(callback, aabb.lowerBound.x, aabb.lowerBound.y, aabb.upperBound.x, aabb.upperBound.y); } private native void query(TreeCallback callback, float lowerX, float lowerY, float upperX, float upperY); private final RaycastWrapper wrapper = new RaycastWrapper(); @Override public void raycast(TreeRayCastCallback callback, RayCastInput input) { wrapper.setCallback(callback); raycast(wrapper, input.p1.x, input.p1.y, input.p2.x, input.p2.y, input.maxFraction); } private native void raycast(RaycastWrapper callback, float p1x, float p1y, float p2x, float p2y, float maxFraction); @Override public native int getTreeHeight(); @Override public native int getTreeBalance(); @Override public native float getTreeQuality(); private native void freeNative(); @Override protected void finalize() throws Throwable { super.finalize(); freeNative(); } }