package com.badlogic.gdx.physics.box2d; import com.badlogic.gdx.math.Vector2; public class Manifold { final World world; long addr; final ManifoldPoint[] points = new ManifoldPoint[] { new ManifoldPoint(), new ManifoldPoint() }; final Vector2 localNormal = new Vector2(); final Vector2 localPoint = new Vector2(); final int[] tmpInt = new int[2]; final float[] tmpFloat = new float[4]; protected Manifold(World world, long addr) { this.world = world; this.addr = addr; } public ManifoldType getType() { int type = jniGetType(addr); if(type == 0) return ManifoldType.Circle; if(type == 1) return ManifoldType.FaceA; if(type == 2) return ManifoldType.FaceB; return ManifoldType.Circle; } private native int jniGetType(long addr); public int getPointCount() { return jniGetPointCount(addr); } private native int jniGetPointCount(long addr); public Vector2 getLocalNormal() { jniGetLocalNormal(addr, tmpFloat); localNormal.set(tmpFloat[0], tmpFloat[1]); return localNormal; } private native void jniGetLocalNormal(long addr, float[] values); public Vector2 getLocalPoint() { jniGetLocalPoint(addr, tmpFloat); localPoint.set(tmpFloat[0], tmpFloat[1]); return localPoint; } private native void jniGetLocalPoint(long addr, float[] values); public ManifoldPoint[] getPoints() { int count = jniGetPointCount(addr); for(int i = 0; i < count; i++) { int contactID = jniGetPoint(addr, tmpFloat, i); ManifoldPoint point = points[i]; point.contactID = contactID; point.localPoint.set(tmpFloat[0], tmpFloat[1]); point.normalImpulse = tmpFloat[2]; point.tangentImpulse = tmpFloat[3]; } return points; } private native int jniGetPoint(long addr, float[] values, int i); public class ManifoldPoint { public final Vector2 localPoint = new Vector2(); public float normalImpulse; public float tangentImpulse; public int contactID = 0; public String toString() { return "id: " + contactID + ", " + localPoint + ", " + normalImpulse + ", " + tangentImpulse; } } public enum ManifoldType { Circle, FaceA, FaceB } }