/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package automenta.spacenet.run.old;
import automenta.spacenet.run.ArdorSpacetime;
import automenta.spacenet.run.ArdorSpacetime;
import automenta.spacenet.run.widget.DemoButton;
import automenta.spacenet.space.geom.ProcessBox;
import automenta.spacenet.space.video.Exit;
import com.ardor3d.annotation.MainThread;
import com.ardor3d.framework.ArdorModule;
import com.ardor3d.framework.CanvasRenderer;
import com.ardor3d.framework.DisplaySettings;
import com.ardor3d.framework.FrameHandler;
import com.ardor3d.framework.NativeCanvas;
import com.ardor3d.framework.Scene;
import com.ardor3d.framework.jogl.JoglAwtCanvas;
import com.ardor3d.framework.jogl.JoglCanvasRenderer;
import com.ardor3d.image.Image;
import com.ardor3d.image.util.AWTImageLoader;
import com.ardor3d.input.ControllerWrapper;
import com.ardor3d.input.PhysicalLayer;
import com.ardor3d.input.awt.AwtFocusWrapper;
import com.ardor3d.input.awt.AwtKeyboardWrapper;
import com.ardor3d.input.awt.AwtMouseManager;
import com.ardor3d.input.awt.AwtMouseWrapper;
import com.ardor3d.input.logical.DummyControllerWrapper;
import com.ardor3d.input.logical.LogicalLayer;
import com.ardor3d.intersection.PickResults;
import com.ardor3d.math.Ray3;
import com.ardor3d.renderer.Renderer;
import com.ardor3d.scenegraph.Node;
import com.ardor3d.util.Timer;
import com.google.inject.Guice;
import com.google.inject.Injector;
import com.google.inject.Module;
import com.google.inject.Stage;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import java.util.concurrent.CountDownLatch;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.event.AncestorEvent;
import javax.swing.event.AncestorListener;
/**
*
* @author seh
*/
public class ArdorPanel extends JPanel implements Runnable {
private final MyExit exit;
private final FrameHandler frameWork;
private ArdorSpacetime root;
private JoglAwtCanvas theCanvas;
static {
//System.setProperty("ardor3d.useMultipleContexts", "true");
}
private NativeCanvas nativeCanvas;
public ArdorPanel(ProcessBox content) {
super(new BorderLayout());
final Module ardorModule = new ArdorModule();
final Injector injector = Guice.createInjector(Stage.PRODUCTION, ardorModule);
frameWork = injector.getInstance(FrameHandler.class);
exit = new MyExit();
final LogicalLayer logicalLayer = injector.getInstance(LogicalLayer.class);
//AWTImageLoader.registerLoader();
try {
addCanvas(new AwtScene(content, logicalLayer, frameWork), logicalLayer, frameWork);
} catch (Exception ex) {
Logger.getLogger(ArdorPanel.class.getName()).log(Level.SEVERE, null, ex);
}
start();
}
protected void start() {
new Thread(this).start();
}
public void run() {
root.init();
addComponentListener(new ComponentListener() {
@Override
public void componentResized(ComponentEvent e) {
updateSize();
}
@Override
public void componentMoved(ComponentEvent e) {
}
@Override
public void componentShown(ComponentEvent e) {
}
@Override
public void componentHidden(ComponentEvent e) {
}
});
addAncestorListener(new AncestorListener() {
@Override
public void ancestorRemoved(AncestorEvent event) {
exit.exit = true;
}
@Override
public void ancestorAdded(AncestorEvent event) {
}
@Override
public void ancestorMoved(AncestorEvent event) {
}
});
Timer timer = new Timer();
//TODO un-hack this
boolean updateSizeOnce = false;
while (!exit.isExit()) {
timer.update();
frameWork.updateFrame();
//root.update must be called after frameWork.updateFrame()!
root.update(timer);
Thread.yield();
if (!updateSizeOnce) {
updateSize();
updateSizeOnce = true;
}
}
}
public final class AwtScene implements Scene {
private AwtScene(final ProcessBox content, LogicalLayer logicalLayer, FrameHandler frameWork) {
root = new ArdorSpacetime(logicalLayer, frameWork) {
@Override protected void initWindow() {
root.add(content);
}
public NativeCanvas getCanvas() {
return nativeCanvas;
}
@Override
public NativeCanvas getVideo() {
return nativeCanvas;
}
};
}
public Node getRoot() {
return root;
}
@MainThread
public boolean renderUnto(final Renderer renderer) {
renderer.draw(root);
return true;
}
public PickResults doPick(final Ray3 pickRay) {
// does nothing.
return null;
}
}
private void addCanvas(final AwtScene scene, final LogicalLayer logicalLayer, final FrameHandler frameWork) throws Exception {
final JoglCanvasRenderer canvasRenderer = new JoglCanvasRenderer(scene);
final DisplaySettings settings = new DisplaySettings(400, 300, 24, 0, 0, 16, 0, 0, false, false);
theCanvas = new JoglAwtCanvas(settings, canvasRenderer);
nativeCanvas = new NativeCanvas() {
@Override public void close() {
}
@Override
public boolean isActive() {
return true;
}
@Override
public boolean isClosing() {
return false;
}
@Override
public void setVSyncEnabled(boolean arg0) {
}
@Override
public void setTitle(String arg0) {
}
@Override
public void setIcon(Image[] arg0) {
}
@Override
public void moveWindowTo(int arg0, int arg1) {
}
@Override
public void init() {
}
@Override
public void draw(CountDownLatch arg0) {
}
@Override
public CanvasRenderer getCanvasRenderer() {
return canvasRenderer;
}
};
add(theCanvas, BorderLayout.CENTER);
theCanvas.setVisible(true);
final AwtKeyboardWrapper keyboardWrapper = new AwtKeyboardWrapper(theCanvas);
final AwtFocusWrapper focusWrapper = new AwtFocusWrapper(theCanvas);
final AwtMouseManager mouseManager = new AwtMouseManager(theCanvas);
final AwtMouseWrapper mouseWrapper = new AwtMouseWrapper(theCanvas, mouseManager);
final ControllerWrapper controllerWrapper = new DummyControllerWrapper();
final PhysicalLayer pl = new PhysicalLayer(keyboardWrapper, mouseWrapper, controllerWrapper, focusWrapper);
logicalLayer.registerInput(theCanvas, pl);
frameWork.addCanvas(theCanvas);
}
protected void updateSize() {
Dimension d = ArdorPanel.this.getSize();
try {
theCanvas.setSize(d);
theCanvas.getCanvasRenderer().getCamera().resize(d.width, d.height);
}
catch (NullPointerException e) { }
}
private static class MyExit implements Exit {
private volatile boolean exit = false;
public void exit() {
exit = true;
}
public boolean isExit() {
return exit;
}
}
}