package com.akjava.gwt.three.client.java.ui; import com.akjava.gwt.lib.client.LogUtils; import com.akjava.gwt.three.client.java.ThreeLog; import com.akjava.gwt.three.client.js.THREE; import com.akjava.gwt.three.client.js.cameras.Camera; 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.event.dom.client.MouseDownEvent; import com.google.gwt.event.dom.client.MouseOutEvent; import com.google.gwt.event.dom.client.MouseUpEvent; import com.google.gwt.event.dom.client.MouseWheelEvent; public abstract class SimpleTabDemoEntryPoint extends TabDemoEntryPoint{ protected Camera camera; protected double cameraX,cameraY,cameraZ; protected int screenWidth,screenHeight; protected long mouseLast; protected int tmpZoom; protected Scene scene; protected int defaultZoom=3; protected int minCamera=5; @Override public void onMouseWheel(MouseWheelEvent event) { if(event.isShiftKeyDown()){ onMouseWheelWithShiftKey(event.getDeltaY()); }else{ if(!autoUpdateCameraPosition){ return; } //TODO make class long t=System.currentTimeMillis(); if(mouseLast+100>t){ tmpZoom*=2; }else{ tmpZoom=defaultZoom; } //GWT.log("wheel:"+event.getDeltaY()); int tmp=(int)cameraZ+event.getDeltaY()*tmpZoom; tmp=Math.max(minCamera, tmp); tmp=Math.min(4000, tmp); cameraZ=tmp; mouseLast=t; } //log(""+cameraZ); } public void onMouseWheelWithShiftKey(int deltaY){ } @Override public void initialize(WebGLRenderer renderer, int width, int height) { cameraZ=100; screenWidth=width; screenHeight=height; renderer.setClearColor(0x333333, 1);//this is only filter color scene=THREE.Scene(); updateCamera(scene, width, height); initializeOthers(renderer); } protected boolean autoUpdateCameraPosition=true; @Override public void update(WebGLRenderer renderer) { beforeUpdate(renderer); if(autoUpdateCameraPosition){ camera.getPosition().set(cameraX, cameraY, cameraZ); } //LogUtils.log("camera:"+ThreeLog.get(camera.getPosition())); renderer.render(scene, camera); if(stats!=null){ stats.update(); } } protected abstract void beforeUpdate(WebGLRenderer renderer); /** called before create Control**/ protected abstract void initializeOthers(WebGLRenderer renderer) ; protected double nearCamera=0.5; protected double farCamera=6000; //switch to replace protected void updateCamera(Scene scene,int width,int height){ if(camera==null){ Camera camera = THREE.PerspectiveCamera(45,(double)width/height,nearCamera,farCamera); //camera.getPosition().set(0, 0, cameraZ); scene.add(camera); //some kind of trick. this.camera=camera; }else{ PerspectiveCamera pcamera=camera.gwtCastPerspectiveCamera(); pcamera.setNear(nearCamera); pcamera.setFar(farCamera); pcamera.setAspect((double)width/height); pcamera.updateProjectionMatrix(); } } @Override public void resized(int width, int height) { if(width==0 || height==0){ //log("never happend ignore-0 size"); return; }else{ //log("resized:"+width+"x"+height); } screenWidth=width; screenHeight=height; updateCamera(scene,width,height); } protected boolean mouseDown; protected int mouseDownX; protected int mouseDownY; @Override public void onMouseDown(MouseDownEvent event) { mouseDown=true; mouseDownX=event.getX(); mouseDownY=event.getY(); } @Override public void onMouseUp(MouseUpEvent event) { mouseDown=false; } @Override public void onMouseOut(MouseOutEvent event) { mouseDown=false; } public double getCameraZ() { return cameraZ; } public void setCameraZ(double cameraZ) { this.cameraZ = cameraZ; } }