package nars.lab.narclear;
import java.awt.event.KeyEvent;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.logging.Level;
import java.util.logging.Logger;
import nars.lab.launcher.NARGame;
import nars.NAR;
public class NARPhysics<P extends PhysicsModel> extends NARGame implements Runnable {
public final P model;
public final PhysicsRun phy;
ExecutorService physExe = Executors.newFixedThreadPool(1);
private Future<?> phyCycle;
public NARPhysics(NAR nar, float simulationRate, P model) {
super(nar);
this.model = model;
this.phy = new PhysicsRun(nar,simulationRate, model) {
@Override
public void keyPressed(KeyEvent e) {
NARPhysics.this.keyPressed(e);
}
};
}
public void keyPressed(KeyEvent e) { }
@Override
public void start(float fps, int cyclesPerFrame) {
phy.controller.setFrameRate((int)fps);
super.start(fps, cyclesPerFrame);
}
public P getModel() { return model; }
@Override
public void stop() {
super.stop();
}
@Override
public void init() {
}
@Override
public void cycle() {
if (phy!=null) {
//wait for previous cycle to finish if it hasnt
if (phyCycle!=null) {
try {
phyCycle.get();
} catch (Exception ex) {
Logger.getLogger(NARPhysics.class.getName()).log(Level.SEVERE, null, ex);
}
}
phyCycle = physExe.submit(this);
}
}
@Override
public void run() {
phy.cycle();
}
}