1 2 package com.badlogic.gdx.tests.bullet; 3 4 import com.badlogic.gdx.Gdx; 5 import com.badlogic.gdx.graphics.Texture; 6 import com.badlogic.gdx.graphics.VertexAttributes.Usage; 7 import com.badlogic.gdx.graphics.g3d.Material; 8 import com.badlogic.gdx.graphics.g3d.Model; 9 import com.badlogic.gdx.graphics.g3d.attributes.ColorAttribute; 10 import com.badlogic.gdx.graphics.g3d.attributes.FloatAttribute; 11 import com.badlogic.gdx.graphics.g3d.attributes.TextureAttribute; 12 import com.badlogic.gdx.math.MathUtils; 13 import com.badlogic.gdx.physics.bullet.collision.CustomCollisionDispatcher; 14 import com.badlogic.gdx.physics.bullet.collision.btBoxShape; 15 import com.badlogic.gdx.physics.bullet.collision.btCapsuleShape; 16 import com.badlogic.gdx.physics.bullet.collision.btCollisionConfiguration; 17 import com.badlogic.gdx.physics.bullet.collision.btCollisionDispatcher; 18 import com.badlogic.gdx.physics.bullet.collision.btCollisionObject; 19 import com.badlogic.gdx.physics.bullet.collision.btConeShape; 20 import com.badlogic.gdx.physics.bullet.collision.btCylinderShape; 21 import com.badlogic.gdx.physics.bullet.collision.btDbvtBroadphase; 22 import com.badlogic.gdx.physics.bullet.collision.btDefaultCollisionConfiguration; 23 import com.badlogic.gdx.physics.bullet.collision.btSphereShape; 24 import com.badlogic.gdx.physics.bullet.dynamics.btDiscreteDynamicsWorld; 25 import com.badlogic.gdx.physics.bullet.dynamics.btSequentialImpulseConstraintSolver; 26 27 public class CollisionDispatcherTest extends BaseBulletTest { 28 public static class MyCollisionDispatcher extends CustomCollisionDispatcher { MyCollisionDispatcher(btCollisionConfiguration collisionConfiguration)29 public MyCollisionDispatcher (btCollisionConfiguration collisionConfiguration) { 30 super(collisionConfiguration); 31 } 32 33 @Override needsCollision(btCollisionObject body0, btCollisionObject body1)34 public boolean needsCollision (btCollisionObject body0, btCollisionObject body1) { 35 if (body0.getUserValue() % 2 == 0 || body1.getUserValue() % 2 == 0) return super.needsCollision(body0, body1); 36 return false; 37 } 38 39 @Override needsResponse(btCollisionObject body0, btCollisionObject body1)40 public boolean needsResponse (btCollisionObject body0, btCollisionObject body1) { 41 if (body0.getUserValue() % 2 == 0 || body1.getUserValue() % 2 == 0) return super.needsCollision(body0, body1); 42 return false; 43 } 44 } 45 46 @Override createWorld()47 public BulletWorld createWorld () { 48 btDefaultCollisionConfiguration collisionConfiguration = new btDefaultCollisionConfiguration(); 49 MyCollisionDispatcher dispatcher = new MyCollisionDispatcher(collisionConfiguration); 50 btDbvtBroadphase broadphase = new btDbvtBroadphase(); 51 btSequentialImpulseConstraintSolver solver = new btSequentialImpulseConstraintSolver(); 52 btDiscreteDynamicsWorld collisionWorld = new btDiscreteDynamicsWorld(dispatcher, broadphase, solver, collisionConfiguration); 53 return new BulletWorld(collisionConfiguration, dispatcher, broadphase, solver, collisionWorld); 54 } 55 56 @Override create()57 public void create () { 58 super.create(); 59 60 // Create the entities 61 world.add("ground", 0f, 0f, 0f).setColor(0.25f + 0.5f * (float)Math.random(), 0.25f + 0.5f * (float)Math.random(), 62 0.25f + 0.5f * (float)Math.random(), 1f); 63 for (float x = -5f; x <= 5f; x += 2f) { 64 for (float y = 5f; y <= 15f; y += 2f) { 65 world.add("box", x + 0.1f * MathUtils.random(), y + 0.1f * MathUtils.random(), 0.1f * MathUtils.random()).body 66 .setUserValue((int)((x + 5f) / 2f + .5f)); 67 } 68 } 69 } 70 71 @Override tap(float x, float y, int count, int button)72 public boolean tap (float x, float y, int count, int button) { 73 shoot(x, y); 74 return true; 75 } 76 } 77