/* author: Louis Hugues - created on 12. 2005 */
package org.myrobotlab.mapper.gui;
import java.awt.BorderLayout;
import java.awt.Frame;
import java.awt.Panel;
import javax.media.j3d.Canvas3D;
import org.myrobotlab.mapper.sim.EnvironmentDescription;
import org.myrobotlab.mapper.sim.Simulator;
import org.myrobotlab.mapper.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.hide();
// Do not render
canvas3d.stopRenderer();
}
simulator = new Simulator(null, world, ed);
}
/** Dispose resource at end. **/
public void dispose() {
simulator.dispose();
world.dispose();
simulator = null;
world = null;
canvas3d = null;
frame.dispose();
System.runFinalization();
System.gc();
}
/** Restart the simulation */
public void reset() {
simulator.resetSimulation();
simulator.initBehaviors();
}
/** perform one step - call it in your main loop */
public void step() {
simulator.simulateOneStep();
}
}