/* author: Louis Hugues - created on 12 fevr. 2005 */
package simbad.gui;
import java.awt.BorderLayout;
import java.awt.Frame;
import java.awt.Panel;
import javax.media.j3d.Canvas3D;
import simbad.sim.EnvironmentDescription;
import simbad.sim.Simulator;
import simbad.sim.World;
/**
* Runs simbad simulator in batch mode with no user interface (only small 3d window).
* Using the folling scenario:
* construct->reset->step, step ,..., step -> dispose-> System.exit
*/
public class Simbatch {
int counter;
Frame frame;
World world;
Simulator simulator;
Canvas3D canvas3d;
Panel panel;
/** Construct a batch version of Simbad simulator */
public Simbatch(EnvironmentDescription ed, boolean do3DRendering ){
counter = 0;
world = new World(ed);
// !!!!
// We need absolutly to show the 3d world in a window
// otherwise it reveal a memory bug in java3d
// see Bug ID: 4727054
// !!!!!
canvas3d = world.getCanvas3D();
frame = new Frame();
panel = new Panel();
panel.setLayout(new BorderLayout());
panel.add(canvas3d);
frame.add(panel);
frame.pack();
frame.setSize(100, 100);
frame.setVisible(true);
if (!do3DRendering){
frame.setVisible(false);
// Do not render
canvas3d.stopRenderer();
}
simulator = new Simulator(null, world, ed);
}
/** Restart the simulation */
public void reset(){
simulator.resetSimulation();
simulator.initBehaviors();
}
/** perform one step - call it in your main loop*/
public void step(){
simulator.simulateOneStep();
}
/** Dispose resource at end.**/
public void dispose(){
simulator.dispose();
world.dispose();
simulator = null;
world = null;
canvas3d = null;
frame.dispose();
System.runFinalization();
System.gc();
}
}