package com.akjava.gwt.threetest.client;
import java.util.ArrayList;
import java.util.List;
import com.akjava.gwt.lib.client.LogUtils;
import com.akjava.gwt.three.client.examples.renderers.CSS3DRenderer;
import com.akjava.gwt.three.client.gwt.core.CameraControler;
import com.akjava.gwt.three.client.js.renderers.WebGLRenderer;
import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.dom.client.NativeEvent;
import com.google.gwt.event.dom.client.MouseDownEvent;
import com.google.gwt.event.dom.client.MouseDownHandler;
import com.google.gwt.event.dom.client.MouseMoveEvent;
import com.google.gwt.event.dom.client.MouseMoveHandler;
import com.google.gwt.event.dom.client.MouseOutEvent;
import com.google.gwt.event.dom.client.MouseOutHandler;
import com.google.gwt.event.dom.client.MouseUpEvent;
import com.google.gwt.event.dom.client.MouseUpHandler;
import com.google.gwt.event.dom.client.MouseWheelEvent;
import com.google.gwt.event.dom.client.MouseWheelHandler;
import com.google.gwt.event.shared.HandlerRegistration;
import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.ui.FocusPanel;
import com.google.gwt.user.client.ui.Widget;
public abstract class AbstractDemo implements Demo{
protected Timer timer;
protected int width,height;
protected CameraControler cameraControle=new CameraControler();
protected boolean mouseDown;
protected int mouseDownX;
protected int mouseDownY;
protected WebGLRenderer renderer;
public void onMouseOut(MouseOutEvent event) {
mouseDown=false;
}
public void onMouseDown(MouseDownEvent event) {
mouseDown=true;
mouseDownX=event.getX();
mouseDownY=event.getY();
}
public void onMouseUp(MouseUpEvent event) {
mouseDown=false;
}
public void onMouseWheel(MouseWheelEvent event) {
cameraControle.doMouseWheel(event.getDeltaY());
}
public void onMouseMove(MouseMoveEvent event) {
if(event.getNativeButton()==NativeEvent.BUTTON_MIDDLE && mouseDown){
int diffX=event.getX()-mouseDownX;
int diffY=event.getY()-mouseDownY;
mouseDownX=event.getX();
mouseDownY=event.getY();
cameraControle.incrementRotationX(diffY);
cameraControle.incrementRotationY(diffX);
}
}
private List<HandlerRegistration> registrations=new ArrayList<HandlerRegistration>();
protected void addHandlerRegistration(HandlerRegistration handlerRegistration){
registrations.add(handlerRegistration);
}
@Override
public void start(final WebGLRenderer renderer,final int width,final int height,FocusPanel panel) {
this.width=width;
this.height=height;
this.renderer=renderer;
HandlerRegistration handlerRegistration=panel.addMouseUpHandler(new MouseUpHandler() {
@Override
public void onMouseUp(MouseUpEvent event) {
AbstractDemo.this.onMouseUp(event);
}
});
registrations.add(handlerRegistration);
handlerRegistration=panel.addMouseWheelHandler(new MouseWheelHandler() {
@Override
public void onMouseWheel(MouseWheelEvent event) {
AbstractDemo.this.onMouseWheel(event);
}
});
registrations.add(handlerRegistration);
//hpanel.setFocus(true);
/*
panel.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
AbstractDemo.this.onMouseClick(event);
}
});
*/
handlerRegistration=panel.addMouseDownHandler(new MouseDownHandler() {
@Override
public void onMouseDown(MouseDownEvent event) {
AbstractDemo.this.onMouseDown(event);
}
});
registrations.add(handlerRegistration);
handlerRegistration=panel.addMouseOutHandler(new MouseOutHandler() {
@Override
public void onMouseOut(MouseOutEvent event) {
AbstractDemo.this.onMouseOut(event);
}
});
registrations.add(handlerRegistration);
handlerRegistration=panel.addMouseMoveHandler(new MouseMoveHandler(){
@Override
public void onMouseMove(MouseMoveEvent event) {
AbstractDemo.this.onMouseMove(event);
}});
registrations.add(handlerRegistration);
}
@Override
public void stop() {
if(timer!=null){
timer.cancel();
timer=null;
}
if(renderer.gwtGetType().equals("css3d")){
CSS3DRenderer css3r=(CSS3DRenderer)renderer;
css3r.gwtClear(); //to avoid show duplicate content.
}
}
public void clearHandlerRegistration(){
for(HandlerRegistration r:registrations){
r.removeHandler();
}
registrations.clear();
}
@Override
public void startTimer(Timer timer){
stop();
this.timer=timer;
timer.scheduleRepeating(1000/60);
}
@Override
public Widget getControler() {
return null;
}
public final native void log(JavaScriptObject object)/*-{
console.log(object);
}-*/;
public final native void log(String object)/*-{
console.log(object);
}-*/;
@Override
public boolean isSupportCanvas(){
return true;
}
@Override
public boolean isSupportWebGL(){
return true;
}
@Override
public boolean isSupportCSS3D(){
return false;
}
}