|
@@ -0,0 +1,98 @@
|
|
|
+package xyz.tbvns.Physics;
|
|
|
+
|
|
|
+import com.badlogic.gdx.graphics.g3d.ModelInstance;
|
|
|
+import com.badlogic.gdx.math.Vector3;
|
|
|
+import com.badlogic.gdx.physics.bullet.Bullet;
|
|
|
+import com.badlogic.gdx.physics.bullet.DebugDrawer;
|
|
|
+import com.badlogic.gdx.physics.bullet.collision.*;
|
|
|
+import com.badlogic.gdx.physics.bullet.dynamics.btConstraintSolver;
|
|
|
+import com.badlogic.gdx.physics.bullet.dynamics.btDiscreteDynamicsWorld;
|
|
|
+import com.badlogic.gdx.physics.bullet.dynamics.btDynamicsWorld;
|
|
|
+import com.badlogic.gdx.physics.bullet.dynamics.btSequentialImpulseConstraintSolver;
|
|
|
+import lombok.Getter;
|
|
|
+
|
|
|
+import javax.annotation.Nullable;
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.HashMap;
|
|
|
+import java.util.List;
|
|
|
+
|
|
|
+public class BulletManager {
|
|
|
+ private static btDynamicsWorld dynamicsWorld;
|
|
|
+ private static btConstraintSolver constraintSolver;
|
|
|
+ private static btDefaultCollisionConfiguration collisionConfig;
|
|
|
+ private static btCollisionDispatcher dispatcher;
|
|
|
+ private static btDbvtBroadphase broadphase;
|
|
|
+ private static RayResultCallback rayResultCallback;
|
|
|
+
|
|
|
+ static public DebugDrawer debugDrawer;
|
|
|
+
|
|
|
+ @Getter private static List<btCollisionObject> objects = new ArrayList<>();
|
|
|
+ @Getter private static List<btCollisionShape> shapes = new ArrayList<>();
|
|
|
+ @Getter private static HashMap<ModelInstance, btCollisionObject> modelCollisiontHashMap = new HashMap<>();
|
|
|
+
|
|
|
+ public static void innit() {
|
|
|
+ collisionConfig = new btDefaultCollisionConfiguration();
|
|
|
+ dispatcher = new btCollisionDispatcher(collisionConfig);
|
|
|
+ broadphase = new btDbvtBroadphase();
|
|
|
+ constraintSolver = new btSequentialImpulseConstraintSolver();
|
|
|
+ dynamicsWorld = new btDiscreteDynamicsWorld(dispatcher, broadphase, constraintSolver, collisionConfig);
|
|
|
+ dynamicsWorld.setGravity(new Vector3(0, -20f, 0));
|
|
|
+ }
|
|
|
+
|
|
|
+ public static void update() {
|
|
|
+ modelCollisiontHashMap.forEach((i, o) -> {
|
|
|
+ o.setWorldTransform(i.transform);
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ public static btCollisionObject addModel(ModelInstance instance) {
|
|
|
+ btCollisionShape shape = Bullet.obtainStaticNodeShape(instance.model.nodes);
|
|
|
+ btCollisionObject collisionObject = new btCollisionObject();
|
|
|
+ collisionObject.setCollisionShape(shape);
|
|
|
+ collisionObject.setWorldTransform(instance.transform);
|
|
|
+ dynamicsWorld.addCollisionObject(collisionObject);
|
|
|
+ objects.add(collisionObject);
|
|
|
+ shapes.add(shape);
|
|
|
+ modelCollisiontHashMap.put(instance, collisionObject);
|
|
|
+ return collisionObject;
|
|
|
+ }
|
|
|
+
|
|
|
+ public static void removeModel(ModelInstance instance) {
|
|
|
+ btCollisionObject object = modelCollisiontHashMap.get(instance);
|
|
|
+ dynamicsWorld.removeCollisionObject(object);
|
|
|
+ objects.remove(object);
|
|
|
+ shapes.remove(object.getCollisionShape());
|
|
|
+ modelCollisiontHashMap.remove(instance);
|
|
|
+ object.getCollisionShape().dispose();
|
|
|
+ object.dispose();
|
|
|
+ }
|
|
|
+
|
|
|
+ @Nullable
|
|
|
+ public static btCollisionObject raycast(Vector3 start, Vector3 end) {
|
|
|
+ rayResultCallback = new ClosestRayResultCallback(start, end);
|
|
|
+ dynamicsWorld.rayTest(start, end, rayResultCallback);
|
|
|
+ return rayResultCallback.getCollisionObject();
|
|
|
+ }
|
|
|
+
|
|
|
+ public static void dispose() {
|
|
|
+ for (btCollisionObject collisionObject : objects) {
|
|
|
+ collisionObject.dispose();
|
|
|
+ }
|
|
|
+ objects.clear();
|
|
|
+
|
|
|
+ for (btCollisionShape shape : shapes) {
|
|
|
+ shape.dispose();
|
|
|
+ }
|
|
|
+ shapes.clear();
|
|
|
+
|
|
|
+ modelCollisiontHashMap.clear();
|
|
|
+
|
|
|
+ dynamicsWorld.dispose();
|
|
|
+ constraintSolver.dispose();
|
|
|
+ collisionConfig.dispose();
|
|
|
+ dispatcher.dispose();
|
|
|
+ broadphase.dispose();
|
|
|
+ debugDrawer.dispose();
|
|
|
+ rayResultCallback.dispose();
|
|
|
+ }
|
|
|
+}
|