package com.akjava.gwt.three.client.java.ui; import com.akjava.gwt.stats.client.Stats; import com.akjava.gwt.three.client.gwt.renderers.WebGLRendererParameter; import com.akjava.gwt.three.client.js.THREE; import com.akjava.gwt.three.client.js.renderers.WebGLRenderer; import com.akjava.gwt.three.client.js.renderers.WebGLRenderer.WebGLCanvas; import com.google.gwt.core.client.EntryPoint; import com.google.gwt.core.client.GWT; import com.google.gwt.core.client.JavaScriptObject; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; 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.logical.shared.ResizeEvent; import com.google.gwt.event.logical.shared.ResizeHandler; import com.google.gwt.user.client.Timer; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.HTMLPanel; import com.google.gwt.user.client.ui.HorizontalPanel; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.Panel; import com.google.gwt.user.client.ui.PopupPanel; import com.google.gwt.user.client.ui.RootLayoutPanel; import com.google.gwt.user.client.ui.VerticalPanel; /** * Entry point classes define <code>onModuleLoad()</code>. */ public abstract class AbstractDemoEntryPoint implements EntryPoint { private WebGLRenderer renderer; protected Timer timer; protected Stats stats; protected WebGLCanvas canvas; private PopupPanel dialog; private Button hide; private VerticalPanel main; protected int canvasWidth,canvasHeight; public WebGLCanvas getCanvas() { return canvas; } public abstract void onMouseClick(ClickEvent event); public abstract void onMouseWheel(MouseWheelEvent event); public abstract void onMouseMove(MouseMoveEvent event) ; public abstract void onMouseDown(MouseDownEvent event) ; public abstract void onMouseUp(MouseUpEvent event) ; public abstract void onMouseOut(MouseOutEvent event); public abstract void update(WebGLRenderer renderer); public abstract void initialize(WebGLRenderer renderer,int width,int height); public abstract void resized(int width,int height); public void onModuleLoad() { int width=Window.getClientWidth(); int height=Window.getClientHeight(); /** * * if com.google.gwt.core.client.JavaScriptException: (TypeError): Cannot read property 'WebGLRenderer' of undefined add lines and both js files on same directory with html <script type="text/javascript" language="javascript" src="Three.js"></script> <script type="text/javascript" language="javascript" src="stats.js"></script> */ renderer = THREE.WebGLRenderer(WebGLRendererParameter.create().preserveDrawingBuffer(true)); renderer.setSize(width,height); //renderer.setClearColorHex(0x333333, 1); //RootLayoutPanel.get().setStyleName("transparent"); canvas = new WebGLCanvas(renderer); canvas.setClearColorHex(0); //final FocusPanel glCanvas=new FocusPanel(canvas); canvas.addMouseUpHandler(new MouseUpHandler() { @Override public void onMouseUp(MouseUpEvent event) { AbstractDemoEntryPoint.this.onMouseUp(event); } }); canvas.addMouseWheelHandler(new MouseWheelHandler() { @Override public void onMouseWheel(MouseWheelEvent event) { AbstractDemoEntryPoint.this.onMouseWheel(event); } }); //hpanel.setFocus(true); canvas.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { AbstractDemoEntryPoint.this.onMouseClick(event); } }); canvas.addMouseDownHandler(new MouseDownHandler() { @Override public void onMouseDown(MouseDownEvent event) { AbstractDemoEntryPoint.this.onMouseDown(event); } }); canvas.addMouseOutHandler(new MouseOutHandler() { @Override public void onMouseOut(MouseOutEvent event) { AbstractDemoEntryPoint.this.onMouseOut(event); } }); canvas.addMouseMoveHandler(new MouseMoveHandler(){ @Override public void onMouseMove(MouseMoveEvent event) { AbstractDemoEntryPoint.this.onMouseMove(event); }}); //canvas.setStyleName("clear"); //glCanvas.getElement().getStyle().setBackgroundColor("#fff"); canvas.setWidth("100%"); canvas.setHeight("100%"); RootLayoutPanel.get().add(canvas); canvasWidth=width; canvasHeight=height; initialize(renderer,width,height); stats = Stats.insertStatsToRootPanel(); timer = new Timer(){ public void run(){ update(renderer); stats.update(); } }; if(!GWT.isScript()){ timer.scheduleRepeating(100); }else{ timer.scheduleRepeating(1000/60); } dialog = new PopupPanel(); VerticalPanel dialogRoot=new VerticalPanel(); dialogRoot.setSpacing(2); //dialog.setStyleName("transparent"); Label label=new Label("Control"); label.setStyleName("title"); dialog.add(dialogRoot); dialogRoot.add(label); main = new VerticalPanel(); main.setVisible(false); HorizontalPanel hPanel=new HorizontalPanel(); hPanel.setWidth("100%"); hPanel.setHorizontalAlignment(HorizontalPanel.ALIGN_RIGHT); dialogRoot.add(hPanel); hide = new Button("Hide Control"); hide.setVisible(false); hide.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { main.setVisible(false); hide.setVisible(false); rightTop(dialog); } }); hPanel.add(hide); dialogRoot.add(main); label.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { showControl(); } }); createControl(main); dialog.show(); rightTop(dialog); Window.addResizeHandler(new ResizeHandler() { @Override public void onResize(ResizeEvent event) { int w=canvas.getOffsetWidth(); int h=canvas.getOffsetHeight(); canvasWidth=w; canvasHeight=h; resized(w,h); renderer.setSize(w, h); rightTop(dialog); } }); HorizontalPanel vpanel=new HorizontalPanel(); final HTMLPanel html=new HTMLPanel(getHtml()); html.setWidth("100%"); html.setHeight("100px"); html.setStyleName("text"); vpanel.add(html); /* final Button bt=new Button("Hide"); bt.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { if(html.isVisible()){ html.setVisible(false); bt.setText("Show"); }else{ html.setVisible(true); bt.setText("Hide"); } } }); vpanel.add(bt); */ final PopupPanel dialog2=new PopupPanel(); dialog2.add(vpanel); dialog2.setPopupPosition(150, 0); dialog2.setWidth("100%"); dialog2.setStyleName("transparent"); dialog2.show(); } protected void showControl(){ main.setVisible(true); hide.setVisible(true); rightTop(dialog); } public String getHtml(){ return "Powerd by <a href='https://github.com/mrdoob/three.js/'>Three.js</a> & <a href='http://code.google.com/intl/en/webtoolkit/'>GWT</a>"; } public abstract void createControl(Panel parent); private void rightTop(PopupPanel dialog){ int w=Window.getClientWidth(); int h=Window.getScrollTop(); int dw=dialog.getOffsetWidth(); //GWT.log(w+"x"+h+" offset="+dialog.getOffsetWidth()); dialog.setPopupPosition(w-dw-18, h); } protected void leftBottom(PopupPanel dialog){ int w=Window.getClientWidth(); int h=Window.getClientHeight(); int dw=dialog.getOffsetWidth(); int dh=dialog.getOffsetHeight(); //GWT.log(w+"x"+h+" offset="+dialog.getOffsetWidth()); dialog.setPopupPosition(0, h-dh); } public final native void log(JavaScriptObject object)/*-{ console.log(object); }-*/; public static final native void log(String object)/*-{ console.log(object); }-*/; }