package com.akjava.gwt.threejsexamples.client.examples.animation; import com.akjava.gwt.stats.client.Stats; import com.akjava.gwt.three.client.gwt.GWTParamUtils; import com.akjava.gwt.three.client.gwt.loader.ObjectHasAnimations; import com.akjava.gwt.three.client.java.ui.example.AbstractExample; import com.akjava.gwt.three.client.java.utils.GWTThreeUtils; import com.akjava.gwt.three.client.js.THREE; import com.akjava.gwt.three.client.js.animation.AnimationClip; import com.akjava.gwt.three.client.js.animation.AnimationMixer; import com.akjava.gwt.three.client.js.cameras.PerspectiveCamera; import com.akjava.gwt.three.client.js.core.Clock; import com.akjava.gwt.three.client.js.core.Object3D; import com.akjava.gwt.three.client.js.extras.geometries.PlaneBufferGeometry; import com.akjava.gwt.three.client.js.loaders.ObjectLoader; import com.akjava.gwt.three.client.js.loaders.ObjectLoader.ObjectLoadHandler; import com.akjava.gwt.three.client.js.materials.MeshPhongMaterial; import com.akjava.gwt.three.client.js.math.THREEMath; import com.akjava.gwt.three.client.js.objects.Mesh; import com.akjava.gwt.three.client.js.renderers.WebGLRenderer; import com.akjava.gwt.three.client.js.scenes.Scene; import com.google.gwt.dom.client.NativeEvent; import com.google.gwt.event.dom.client.MouseMoveEvent; import com.google.gwt.event.dom.client.MouseMoveHandler; import com.google.gwt.user.client.ui.FocusPanel; import com.google.gwt.user.client.ui.VerticalPanel; public class SceneExample extends AbstractExample{ @Override public String getName() { return "animation/scene"; } @Override public void animate(double timestamp) { render(timestamp); stats.update();//really deprecate?many still use this } private WebGLRenderer renderer; private Scene scene; private PerspectiveCamera camera; private Stats stats; int WIDTH; int HEIGHT; double FLOOR; double windowHalfX,windowHalfY; double mouseX=0; double mouseY=0; Clock clock; AnimationMixer mixer; AnimationClip sceneAnimationClip; @Override public void init() { //global FLOOR= -250;//var FLOOR = -250; windowHalfX = getWindowInnerWidth() / 2;//var windowHalfX = window.innerWidth / 2; windowHalfY = getWindowInnerHeight() / 2;//var windowHalfY = window.innerHeight / 2; clock = THREE.Clock();//var clock = new THREE.Clock(); WIDTH = (int)getWindowInnerWidth(); HEIGHT = (int)getWindowInnerHeight(); FocusPanel container = createContainerPanel(); // scene scene = THREE.Scene(); scene.setFog(THREE.Fog( 0xffffff, 2000, 10000 )); // renderer renderer = THREE.WebGLRenderer( GWTParamUtils.WebGLRenderer().antialias(true) );//renderer = new THREE.WebGLRenderer( { antialias: true } ); renderer.setClearColor( scene.getFog().getColor());//renderer.setClearColor( scene.fog.color ); renderer.setPixelRatio( GWTThreeUtils.getWindowDevicePixelRatio() );//renderer.setPixelRatio( window.devicePixelRatio ); renderer.setSize( WIDTH, HEIGHT ); renderer.setGammaInput(true);//renderer.gammaInput = true; renderer.setGammaOutput(true);//renderer.gammaOutput = true; renderer.getShadowMap().setEnabled(true);//renderer.shadowMap.enabled = true; container.getElement().appendChild( renderer.getDomElement() ); // camera camera = THREE.PerspectiveCamera(55, getWindowInnerWidth()/getWindowInnerHeight(), 1, 10000 ); camera.getPosition().set(0, 0, 150); PlaneBufferGeometry geometry = THREE.PlaneBufferGeometry( 16000, 16000 );//var geometry = new THREE.PlaneBufferGeometry( 16000, 16000 ); MeshPhongMaterial material = THREE.MeshPhongMaterial( GWTParamUtils.MeshPhongMaterial().emissive(0x000000) );//var material = new THREE.MeshPhongMaterial( { emissive: 0x000000 } ); Mesh ground = THREE.Mesh( geometry, material );//var ground = new THREE.Mesh( geometry, material ); ground.getPosition().set( 0, FLOOR, 0 );//ground.position.set( 0, FLOOR, 0 ); ground.getRotation().setX(-Math.PI/2);//ground.rotation.x = -Math.PI/2; /*scene.add( ground );*/ ground.setReceiveShadow(true);//ground.receiveShadow = true; //stats stats = Stats.create(); stats.setPosition(0, 0); container.getElement().appendChild(stats.domElement()); //add html info container.add(createAbsoluteHTML("<div style='text:white'><a href='http://threejs.org' target='_blank'>three.js</a> - scene animation</a>" ,100,10)); container.addMouseMoveHandler(new MouseMoveHandler() { @Override public void onMouseMove(MouseMoveEvent event) { onDocumentMouseMove(event); } }); //handle resize & gui initResizeHandlerAndGUI(); //setDebugAnimateOneTimeOnly(true); ObjectLoader loader = THREE.ObjectLoader();//var loader = new THREE.ObjectLoader(); loader.load( "models/json/scene-animation.json",new ObjectLoadHandler() { @Override public void onLoad(Object3D object) { ObjectHasAnimations hasAnimation=object.cast(); sceneAnimationClip = hasAnimation.getAnimations().get(0); scene = object.cast(); scene.add( camera ); scene.setFog(THREE.Fog( 0xffffff, 2000, 10000 ));//scene.fog = new THREE.Fog( 0xffffff, 2000, 10000 ); mixer = THREE.AnimationMixer( scene );//mixer = new THREE.AnimationMixer( scene ); mixer.clipAction( sceneAnimationClip ).play();//mixer.addAction( new THREE.AnimationAction( sceneAnimationClip ) ); } } ); } private void initResizeHandlerAndGUI() { VerticalPanel gui=addResizeHandlerAndCreateGUIPanel(); gui.setWidth("200px");//some widget broke,like checkbox without parent size gui.setSpacing(2); } protected void onDocumentMouseMove(MouseMoveEvent event) { mouseX = ( event.getClientX() - windowHalfX ); mouseY = ( event.getClientY() - windowHalfY ); } public void onWindowResize() { windowHalfX = getWindowInnerWidth() / 2; windowHalfY = getWindowInnerHeight() / 2; camera.setAspect(getWindowInnerWidth() / getWindowInnerHeight()); camera.updateProjectionMatrix(); renderer.setSize( (int)getWindowInnerWidth() , (int)getWindowInnerHeight() ); } public void render(double now) { double delta = 0.75 * clock.getDelta(); camera.getPosition().gwtIncrementX( ( mouseX - camera.getPosition().getX()) * .05);//camera.position.x += ( mouseX - camera.position.x ) * .05; camera.getPosition().setY(THREEMath.clamp( camera.getPosition().getY() + ( - mouseY - camera.getPosition().getY()) * .05, 0, 1000 ));//camera.position.y = THREE.Math.clamp( camera.position.y + ( - mouseY - camera.position.y ) * .05, 0, 1000 ); camera.lookAt( scene.getPosition());//camera.lookAt( scene.position ); if( mixer!=null ) { //console.log( "updating mixer by " + delta ); mixer.update( delta ); } renderer.render( scene, camera ); } @Override public String getTokenKey() { return "scene"; } }