159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta/* 259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * To change this template, choose Tools | Templates 359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * and open the template in the editor. 459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 559b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartapackage com.jme3.bullet; 659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 759b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.app.Application; 859b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.app.state.AppState; 959b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.app.state.AppStateManager; 1059b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.bullet.PhysicsSpace.BroadphaseType; 1159b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.math.Vector3f; 1259b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.renderer.RenderManager; 1359b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.util.concurrent.*; 1459b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.util.logging.Level; 1559b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.util.logging.Logger; 1659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 1759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta/** 1859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * <code>BulletAppState</code> allows using bullet physics in an Application. 1959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @author normenhansen 2059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 2159b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartapublic class BulletAppState implements AppState, PhysicsTickListener { 2259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 2359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta protected boolean initialized = false; 2459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta protected Application app; 2559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta protected AppStateManager stateManager; 2659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta protected ScheduledThreadPoolExecutor executor; 2759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta protected PhysicsSpace pSpace; 2859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta protected ThreadingType threadingType = ThreadingType.SEQUENTIAL; 2959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta protected BroadphaseType broadphaseType = BroadphaseType.DBVT; 3059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta protected Vector3f worldMin = new Vector3f(-10000f, -10000f, -10000f); 3159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta protected Vector3f worldMax = new Vector3f(10000f, 10000f, 10000f); 3259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private float speed = 1; 3359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta protected boolean active = true; 3459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta protected float tpf; 3559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta protected Future physicsFuture; 3659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 3759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 3859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * Creates a new BulletAppState running a PhysicsSpace for physics simulation, 3959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * use getStateManager().addState(bulletAppState) to enable physics for an Application. 4059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 4159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public BulletAppState() { 4259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 4359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 4459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 4559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * Creates a new BulletAppState running a PhysicsSpace for physics simulation, 4659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * use getStateManager().addState(bulletAppState) to enable physics for an Application. 4759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param broadphaseType The type of broadphase collision detection, BroadphaseType.DVBT is the default 4859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 4959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public BulletAppState(BroadphaseType broadphaseType) { 5059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta this(new Vector3f(-10000f, -10000f, -10000f), new Vector3f(10000f, 10000f, 10000f), broadphaseType); 5159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 5259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 5359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 5459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * Creates a new BulletAppState running a PhysicsSpace for physics simulation, 5559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * use getStateManager().addState(bulletAppState) to enable physics for an Application. 5659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * An AxisSweep broadphase is used. 5759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param worldMin The minimum world extent 5859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param worldMax The maximum world extent 5959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 6059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public BulletAppState(Vector3f worldMin, Vector3f worldMax) { 6159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta this(worldMin, worldMax, BroadphaseType.AXIS_SWEEP_3); 6259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 6359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 6459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public BulletAppState(Vector3f worldMin, Vector3f worldMax, BroadphaseType broadphaseType) { 6559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta this.worldMin.set(worldMin); 6659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta this.worldMax.set(worldMax); 6759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta this.broadphaseType = broadphaseType; 6859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 6959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 7059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private boolean startPhysicsOnExecutor() { 7159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (executor != null) { 7259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta executor.shutdown(); 7359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 7459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta executor = new ScheduledThreadPoolExecutor(1); 7559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta final BulletAppState app = this; 7659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta Callable<Boolean> call = new Callable<Boolean>() { 7759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 7859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public Boolean call() throws Exception { 7959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta detachedPhysicsLastUpdate = System.currentTimeMillis(); 8059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta pSpace = new PhysicsSpace(worldMin, worldMax, broadphaseType); 8159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta pSpace.addTickListener(app); 8259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return true; 8359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 8459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta }; 8559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta try { 8659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return executor.submit(call).get(); 8759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } catch (InterruptedException ex) { 8859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta Logger.getLogger(BulletAppState.class.getName()).log(Level.SEVERE, null, ex); 8959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return false; 9059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } catch (ExecutionException ex) { 9159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta Logger.getLogger(BulletAppState.class.getName()).log(Level.SEVERE, null, ex); 9259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return false; 9359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 9459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 9559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private Callable<Boolean> parallelPhysicsUpdate = new Callable<Boolean>() { 9659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 9759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public Boolean call() throws Exception { 9859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta pSpace.update(tpf * getSpeed()); 9959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return true; 10059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 10159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta }; 10259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta long detachedPhysicsLastUpdate = 0; 10359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private Callable<Boolean> detachedPhysicsUpdate = new Callable<Boolean>() { 10459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 10559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public Boolean call() throws Exception { 10659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta pSpace.update(getPhysicsSpace().getAccuracy() * getSpeed()); 10759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta pSpace.distributeEvents(); 10859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta long update = System.currentTimeMillis() - detachedPhysicsLastUpdate; 10959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta detachedPhysicsLastUpdate = System.currentTimeMillis(); 11059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta executor.schedule(detachedPhysicsUpdate, Math.round(getPhysicsSpace().getAccuracy() * 1000000.0f) - (update * 1000), TimeUnit.MICROSECONDS); 11159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return true; 11259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 11359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta }; 11459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 11559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public PhysicsSpace getPhysicsSpace() { 11659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return pSpace; 11759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 11859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 11959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 12059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * The physics system is started automatically on attaching, if you want to start it 12159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * before for some reason, you can use this method. 12259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 12359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void startPhysics() { 12459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta //start physics thread(pool) 12559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (threadingType == ThreadingType.PARALLEL) { 12659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta startPhysicsOnExecutor(); 12759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// } else if (threadingType == ThreadingType.DETACHED) { 12859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// startPhysicsOnExecutor(); 12959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// executor.submit(detachedPhysicsUpdate); 13059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } else { 13159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta pSpace = new PhysicsSpace(worldMin, worldMax, broadphaseType); 13259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 13359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta pSpace.addTickListener(this); 13459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta initialized = true; 13559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 13659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 13759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void initialize(AppStateManager stateManager, Application app) { 13859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (!initialized) { 13959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta startPhysics(); 14059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 14159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta initialized = true; 14259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 14359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 14459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public boolean isInitialized() { 14559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return initialized; 14659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 14759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 14859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void setEnabled(boolean enabled) { 14959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta this.active = enabled; 15059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 15159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 15259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public boolean isEnabled() { 15359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return active; 15459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 15559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 15659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void stateAttached(AppStateManager stateManager) { 15759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (!initialized) { 15859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta startPhysics(); 15959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 16059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (threadingType == ThreadingType.PARALLEL) { 16159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta PhysicsSpace.setLocalThreadPhysicsSpace(pSpace); 16259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 16359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 16459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 16559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void stateDetached(AppStateManager stateManager) { 16659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 16759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 16859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void update(float tpf) { 16959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (!active) { 17059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return; 17159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 17259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// if (threadingType != ThreadingType.DETACHED) { 17359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta pSpace.distributeEvents(); 17459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// } 17559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta this.tpf = tpf; 17659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 17759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 17859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void render(RenderManager rm) { 17959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (!active) { 18059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return; 18159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 18259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (threadingType == ThreadingType.PARALLEL) { 18359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta physicsFuture = executor.submit(parallelPhysicsUpdate); 18459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } else if (threadingType == ThreadingType.SEQUENTIAL) { 18559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta pSpace.update(active ? tpf * speed : 0); 18659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } else { 18759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 18859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 18959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 19059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void postRender() { 19159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (physicsFuture != null) { 19259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta try { 19359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta physicsFuture.get(); 19459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta physicsFuture = null; 19559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } catch (InterruptedException ex) { 19659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta Logger.getLogger(BulletAppState.class.getName()).log(Level.SEVERE, null, ex); 19759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } catch (ExecutionException ex) { 19859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta Logger.getLogger(BulletAppState.class.getName()).log(Level.SEVERE, null, ex); 19959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 20059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 20159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 20259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 20359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void cleanup() { 20459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (executor != null) { 20559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta executor.shutdown(); 20659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta executor = null; 20759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 20859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta pSpace.removeTickListener(this); 20959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta pSpace.destroy(); 21059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 21159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 21259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 21359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @return the threadingType 21459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 21559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public ThreadingType getThreadingType() { 21659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return threadingType; 21759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 21859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 21959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 22059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * Use before attaching state 22159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param threadingType the threadingType to set 22259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 22359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void setThreadingType(ThreadingType threadingType) { 22459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta this.threadingType = threadingType; 22559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 22659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 22759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 22859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * Use before attaching state 22959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 23059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void setBroadphaseType(BroadphaseType broadphaseType) { 23159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta this.broadphaseType = broadphaseType; 23259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 23359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 23459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 23559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * Use before attaching state 23659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 23759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void setWorldMin(Vector3f worldMin) { 23859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta this.worldMin = worldMin; 23959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 24059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 24159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 24259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * Use before attaching state 24359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 24459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void setWorldMax(Vector3f worldMax) { 24559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta this.worldMax = worldMax; 24659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 24759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 24859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public float getSpeed() { 24959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return speed; 25059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 25159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 25259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void setSpeed(float speed) { 25359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta this.speed = speed; 25459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 25559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 25659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void prePhysicsTick(PhysicsSpace space, float f) { 25759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 25859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 25959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void physicsTick(PhysicsSpace space, float f) { 26059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 26159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 26259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public enum ThreadingType { 26359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 26459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 26559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * Default mode; user update, physics update and rendering happen sequentially (single threaded) 26659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 26759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta SEQUENTIAL, 26859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 26959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * Parallel threaded mode; physics update and rendering are executed in parallel, update order is kept.<br/> 27059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * Multiple BulletAppStates will execute in parallel in this mode. 27159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 27259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta PARALLEL, 27359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 27459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta} 275