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