package com.akjava.gwt.three.client.java.ui.experiments;
import com.akjava.gwt.lib.client.LogUtils;
import com.akjava.gwt.three.client.gwt.renderers.WebGLRendererParameter;
import com.akjava.gwt.three.client.java.ui.AbstractThreeApp;
import com.akjava.gwt.three.client.java.utils.GWTThreeUtils;
import com.akjava.gwt.three.client.js.THREE;
import com.akjava.gwt.three.client.js.cameras.PerspectiveCamera;
import com.akjava.gwt.three.client.js.renderers.WebGLRenderer;
import com.akjava.gwt.three.client.js.scenes.Scene;
import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.core.client.Scheduler;
import com.google.gwt.core.client.Scheduler.ScheduledCommand;
import com.google.gwt.dom.client.Style.Unit;
import com.google.gwt.event.logical.shared.ResizeEvent;
import com.google.gwt.event.logical.shared.ResizeHandler;
import com.google.gwt.event.shared.HandlerRegistration;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.DockLayoutPanel;
import com.google.gwt.user.client.ui.FocusPanel;
import com.google.gwt.user.client.ui.RootLayoutPanel;
public abstract class SimpleThreeAppEntryPoint extends AbstractThreeApp implements EntryPoint{
protected WebGLRenderer renderer;
public WebGLRenderer getRenderer() {
return renderer;
}
protected Scene scene;
protected PerspectiveCamera camera;
protected double SCREEN_WIDTH;
protected double SCREEN_HEIGHT;
//protected FocusPanel
protected FocusPanel rendererContainer;
private boolean loaded;
public void onModuleLoad() {
if(loaded){
LogUtils.log("this never happen.If you accidentally call super.onModuleLoad()");
//onWindowResize();
return;
}
final DockLayoutPanel root=new DockLayoutPanel(Unit.PX);
RootLayoutPanel.get().add(root);
onBeforeStartApp();
Scheduler.get().scheduleDeferred(new ScheduledCommand() {
@Override
public void execute() {
start(root);
onAfterStartApp();
}
});
loaded=true;
}
public abstract WebGLRendererParameter createRendererParameter();
public abstract void onInitializedThree();
public abstract void onBeforeStartApp();
public abstract void onAfterStartApp();
//overwrite what ever you need;
public PerspectiveCamera createCamera(){
PerspectiveCamera camera=THREE.PerspectiveCamera(45, getWindowInnerWidth()/getWindowInnerHeight(), .1, 10000);
camera.getPosition().set(0, 0, 400);
return camera;
}
@Override
public void animate(double timestamp) {
// TODO Auto-generated method stub
renderer.render(scene, camera);
}
@Override
public void init() {
SCREEN_WIDTH = getWindowInnerWidth();
SCREEN_HEIGHT = getWindowInnerHeight();
renderer = THREE.WebGLRenderer(createRendererParameter());
renderer.setPixelRatio( GWTThreeUtils.getWindowDevicePixelRatio() );
renderer.setSize( SCREEN_WIDTH, SCREEN_HEIGHT );
rendererContainer = createContainerPanel();
getParent().add(rendererContainer);
rendererContainer.getElement().appendChild( renderer.getDomElement() );
// scene
scene = THREE.Scene();
// camera
camera = createCamera();
addResizeHandler();
onInitializedThree();
}
protected HandlerRegistration resizeHandler;
protected void addResizeHandler(){
//popup.show();
//moveToAroundRightTop(popup);
resizeHandler = Window.addResizeHandler(new ResizeHandler() {
@Override
public void onResize(ResizeEvent event) {
onWindowResize();
}
});
}
@Override
public void onWindowResize() {
SCREEN_WIDTH = getWindowInnerWidth();
SCREEN_HEIGHT = getWindowInnerHeight();
//re read because of double
camera.setAspect(SCREEN_WIDTH / SCREEN_HEIGHT);
camera.updateProjectionMatrix();
renderer.setSize( SCREEN_WIDTH , SCREEN_HEIGHT );
}
}