import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.game.GameCanvas;
import javax.microedition.m3g.Camera;
import javax.microedition.m3g.Graphics3D;
import javax.microedition.m3g.Loader;
import javax.microedition.m3g.World;
import javax.microedition.midlet.MIDlet;
public class RMMIDlet extends MIDlet implements CommandListener {
private Display myDisplay = null;
private RetainedCanvas myCanvas = null;
private Command exitCommand = new Command("Exit", Command.ITEM, 1);
public RMMIDlet() {
super();
myDisplay = Display.getDisplay(this);
myCanvas = new RetainedCanvas();
myCanvas.setCommandListener(this);
myCanvas.addCommand(exitCommand);
}
public void startApp() {
myCanvas.init();
myDisplay.setCurrent(myCanvas);
myCanvas.start();
}
public void pauseApp() {
}
public void destroyApp(boolean unconditional) {
myCanvas.stop();
}
public void commandAction(Command cmd, Displayable disp) {
if (cmd == exitCommand) {
try {
destroyApp(false);
notifyDestroyed();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
class RetainedCanvas extends GameCanvas implements Runnable {
private boolean mRunning = false;
private Thread mPaintThrd = null;
private Graphics3D mGraphics3D = Graphics3D.getInstance();
private World mWorld = null;
private Camera mCam = null;
private long mWorldStartTime = 0;
public RetainedCanvas() {
super(true);
}
public void init() {
try {
mWorld = (World) Loader.load("/p.m3g")[0];
mCam = mWorld.getActiveCamera();
mCam.translate(0, 0, -1.5f);
mCam.setOrientation(180, 0, 1, 0);
} catch (Exception e) {
e.printStackTrace();
}
mWorldStartTime = System.currentTimeMillis();
}
public void start() {
mRunning = true;
mPaintThrd = new Thread(this);
mPaintThrd.start();
}
public void stop() {
mRunning = false;
try {
mPaintThrd.join();
} catch (InterruptedException ex) {
}
}
public void run() {
Graphics g = getGraphics();
long startTime;
while (mRunning) {
cameraForward();
startTime = System.currentTimeMillis() - mWorldStartTime;
mWorld.animate((int) startTime);
mGraphics3D.bindTarget(g);
mGraphics3D.render(mWorld);
mGraphics3D.releaseTarget();
flushGraphics();
try {
Thread.sleep(100);
} catch (InterruptedException ie) {
}
}
}
private void cameraForward() {
mCam.translate(0f, 0f, 0.2f);
}
}