package com.akjava.gwt.threejsexamples.client.examples; import com.akjava.gwt.stats.client.Stats; import com.akjava.gwt.three.client.examples.js.GWTExampleParamUtils; import com.akjava.gwt.three.client.examples.js.Mirror; import com.akjava.gwt.three.client.examples.js.THREEExp; import com.akjava.gwt.three.client.examples.js.controls.OrbitControls; import com.akjava.gwt.three.client.gwt.GWTParamUtils; 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.cameras.PerspectiveCamera; import com.akjava.gwt.three.client.js.core.Object3D; import com.akjava.gwt.three.client.js.extras.geometries.CylinderGeometry; import com.akjava.gwt.three.client.js.extras.geometries.IcosahedronGeometry; import com.akjava.gwt.three.client.js.extras.geometries.PlaneBufferGeometry; import com.akjava.gwt.three.client.js.extras.geometries.SphereGeometry; import com.akjava.gwt.three.client.js.lights.PointLight; import com.akjava.gwt.three.client.js.materials.MeshLambertMaterial; import com.akjava.gwt.three.client.js.materials.MeshPhongMaterial; 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.user.client.ui.FocusPanel; import com.google.gwt.user.client.ui.VerticalPanel; public class MirrorExample extends AbstractExample{ @Override public String getName() { return "mirror"; } @Override public void animate(double timestamp) { //do requestAnimationFrame on super class double timer = timestamp * 0.01; sphereGroup.getRotation().gwtIncrementY(- 0.002);//sphereGroup.rotation.y -= 0.002; smallSphere.getPosition().set(//smallSphere.position.set( Math.cos( timer * 0.1 ) * 30, Math.abs( Math.cos( timer * 0.2 ) ) * 20 + 5, Math.sin( timer * 0.1 ) * 30 ); smallSphere.getRotation().setY(( Math.PI / 2 ) - timer * 0.1);//smallSphere.rotation.y = ( Math.PI / 2 ) - timer * 0.1; smallSphere.getRotation().setZ(timer * 0.8);//smallSphere.rotation.z = timer * 0.8; cameraControls.update(); render(timestamp); stats.update();//really deprecate?many still use this } private WebGLRenderer renderer; private Scene scene; private PerspectiveCamera camera; private Stats stats; private Mesh mesh; private OrbitControls cameraControls; int WIDTH; int HEIGHT; private Mirror groundMirror; private Mirror verticalMirror; private Object3D sphereGroup; private Mesh smallSphere; @Override public void init() { WIDTH = (int)getWindowInnerWidth();//var WIDTH = window.innerWidth; HEIGHT = (int)getWindowInnerHeight();//var HEIGHT = window.innerHeight; // camera int VIEW_ANGLE = 45;//var VIEW_ANGLE = 45; double ASPECT = getWindowInnerWidth() / getWindowInnerHeight(); double NEAR = 1;//var NEAR = 1; double FAR = 500;//var FAR = 500; FocusPanel container = createContainerPanel(); // renderer renderer = THREE.WebGLRenderer();//renderer = new THREE.WebGLRenderer(); renderer.setPixelRatio( GWTThreeUtils.getWindowDevicePixelRatio() );//renderer.setPixelRatio( window.devicePixelRatio ); renderer.setSize( WIDTH, HEIGHT ); // scene scene = THREE.Scene();//scene = new THREE.Scene(); // camera camera = THREE.PerspectiveCamera(VIEW_ANGLE, ASPECT, NEAR, FAR);//camera = new THREE.PerspectiveCamera(VIEW_ANGLE, ASPECT, NEAR, FAR); camera.getPosition().set( 0, 75, 160 );//camera.position.set( 0, 75, 160 ); cameraControls = THREEExp.OrbitControls(camera, renderer.getDomElement());//cameraControls = new THREE.OrbitControls(camera, renderer.domElement); cameraControls.getTarget().set( 0, 40, 0);//cameraControls.target.set( 0, 40, 0); cameraControls.setMaxDistance(400);//cameraControls.maxDistance = 400; cameraControls.setMinDistance(10);//cameraControls.minDistance = 10; cameraControls.update(); container.getElement().appendChild( renderer.getDomElement() ); //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> - mirror</a>" ,100,10)); fillScene(); //handle resize & gui //initResizeHandlerAndGUI(); } public void fillScene(){ PlaneBufferGeometry planeGeo = THREE.PlaneBufferGeometry( 100.1, 100.1 );//var planeGeo = new THREE.PlaneBufferGeometry( 100.1, 100.1 ); // MIRORR planes groundMirror = THREEExp.Mirror( renderer, camera, GWTExampleParamUtils.Mirror().clipBias(0.003).textureWidth(WIDTH).textureHeight(HEIGHT).color(0x777777) );//groundMirror = new THREE.Mirror( renderer, camera, { clipBias: 0.003, textureWidth: WIDTH, textureHeight: HEIGHT, color: 0x777777 } ); Mesh mirrorMesh = THREE.Mesh( planeGeo, groundMirror.getMaterial());//var mirrorMesh = new THREE.Mesh( planeGeo, groundMirror.material ); mirrorMesh.add( groundMirror ); mirrorMesh.rotateX( - Math.PI / 2 ); scene.add( mirrorMesh ); verticalMirror = THREEExp.Mirror( renderer, camera, GWTExampleParamUtils.Mirror().clipBias(0.003).textureWidth(WIDTH).textureHeight(HEIGHT).color(0x889999) );//verticalMirror = new THREE.Mirror( renderer, camera, { clipBias: 0.003, textureWidth: WIDTH, textureHeight: HEIGHT, color:0x889999 } ); Mesh verticalMirrorMesh = THREE.Mesh( THREE.PlaneBufferGeometry( 60, 60 ), verticalMirror.getMaterial());//var verticalMirrorMesh = new THREE.Mesh( new THREE.PlaneBufferGeometry( 60, 60 ), verticalMirror.material ); verticalMirrorMesh.add( verticalMirror ); verticalMirrorMesh.getPosition().setY(35);//verticalMirrorMesh.position.y = 35; verticalMirrorMesh.getPosition().setZ(-45);//verticalMirrorMesh.position.z = -45; scene.add( verticalMirrorMesh ); sphereGroup = THREE.Object3D();//sphereGroup = new THREE.Object3D(); scene.add( sphereGroup ); CylinderGeometry geometry = THREE.CylinderGeometry( 0.1, 15 * Math.cos( Math.PI / 180 * 30 ), 0.1, 24, 1 );//var geometry = new THREE.CylinderGeometry( 0.1, 15 * Math.cos( Math.PI / 180 * 30 ), 0.1, 24, 1 ); MeshPhongMaterial material = THREE.MeshPhongMaterial( GWTParamUtils.MeshPhongMaterial().color(0xffffff).emissive(0x444444) );//var material = new THREE.MeshPhongMaterial( { color: 0xffffff, emissive: 0x444444 } ); Mesh sphereCap = THREE.Mesh( geometry, material );//var sphereCap = new THREE.Mesh( geometry, material ); sphereCap.getPosition().setY(-15 * Math.sin( Math.PI / 180 * 30 ) - 0.05);//sphereCap.position.y = -15 * Math.sin( Math.PI / 180 * 30 ) - 0.05; sphereCap.rotateX(-Math.PI); SphereGeometry geometry2 = THREE.SphereGeometry( 15, 24, 24, Math.PI / 2, Math.PI * 2, 0, Math.PI / 180 * 120 );//var geometry = new THREE.SphereGeometry( 15, 24, 24, Math.PI / 2, Math.PI * 2, 0, Math.PI / 180 * 120 ); Mesh halfSphere = THREE.Mesh( geometry2, material );//var halfSphere = new THREE.Mesh( geometry, material ); halfSphere.add( sphereCap ); halfSphere.rotateX( - Math.PI / 180 * 135 ); halfSphere.rotateZ( - Math.PI / 180 * 20 ); halfSphere.getPosition().setY(7.5 + 15 * Math.sin( Math.PI / 180 * 30 ));//halfSphere.position.y = 7.5 + 15 * Math.sin( Math.PI / 180 * 30 ); sphereGroup.add( halfSphere ); IcosahedronGeometry geometry3 = THREE.IcosahedronGeometry( 5, 0 );//var geometry = new THREE.IcosahedronGeometry( 5, 0 ); MeshLambertMaterial material3 = THREE.MeshLambertMaterial( GWTParamUtils.MeshLambertMaterial().color(0xffffff).emissive(0x333333).shading(THREE.FlatShading) );//var material = new THREE.MeshLambertMaterial( { color: 0xffffff, emissive: 0x333333, shading: THREE.FlatShading } ); smallSphere = THREE.Mesh( geometry3, material3 );//smallSphere = new THREE.Mesh( geometry, material ); scene.add(smallSphere); // walls Mesh planeTop = THREE.Mesh( planeGeo, THREE.MeshPhongMaterial( GWTParamUtils.MeshPhongMaterial().color(0xffffff) ) );//var planeTop = new THREE.Mesh( planeGeo, new THREE.MeshPhongMaterial( { color: 0xffffff } ) ); planeTop.getPosition().setY(100);//planeTop.position.y = 100; planeTop.rotateX( Math.PI / 2 ); scene.add( planeTop ); Mesh planeBack = THREE.Mesh( planeGeo, THREE.MeshPhongMaterial( GWTParamUtils.MeshPhongMaterial().color(0xffffff) ) );//var planeBack = new THREE.Mesh( planeGeo, new THREE.MeshPhongMaterial( { color: 0xffffff } ) ); planeBack.getPosition().setZ(-50);//planeBack.position.z = -50; planeBack.getPosition().setY(50);//planeBack.position.y = 50; scene.add( planeBack ); Mesh planeFront = THREE.Mesh( planeGeo, THREE.MeshPhongMaterial( GWTParamUtils.MeshPhongMaterial().color(0x7f7fff) ) );//var planeFront = new THREE.Mesh( planeGeo, new THREE.MeshPhongMaterial( { color: 0x7f7fff } ) ); planeFront.getPosition().setZ(50);//planeFront.position.z = 50; planeFront.getPosition().setY(50);//planeFront.position.y = 50; planeFront.rotateY( Math.PI ); scene.add( planeFront ); Mesh planeRight = THREE.Mesh( planeGeo, THREE.MeshPhongMaterial( GWTParamUtils.MeshPhongMaterial().color(0x00ff00) ) );//var planeRight = new THREE.Mesh( planeGeo, new THREE.MeshPhongMaterial( { color: 0x00ff00 } ) ); planeRight.getPosition().setX(50);//planeRight.position.x = 50; planeRight.getPosition().setY(50);//planeRight.position.y = 50; planeRight.rotateY( - Math.PI / 2 ); scene.add( planeRight ); Mesh planeLeft = THREE.Mesh( planeGeo, THREE.MeshPhongMaterial( GWTParamUtils.MeshPhongMaterial().color(0xff0000) ) );//var planeLeft = new THREE.Mesh( planeGeo, new THREE.MeshPhongMaterial( { color: 0xff0000 } ) ); planeLeft.getPosition().setX(-50);//planeLeft.position.x = -50; planeLeft.getPosition().setY(50);//planeLeft.position.y = 50; planeLeft.rotateY( Math.PI / 2 ); scene.add( planeLeft ); // lights PointLight mainLight = THREE.PointLight( 0xcccccc, 1.5, 250 );//var mainLight = new THREE.PointLight( 0xcccccc, 1.5, 250 ); mainLight.getPosition().setY(60);//mainLight.position.y = 60; scene.add( mainLight ); PointLight greenLight = THREE.PointLight( 0x00ff00, 0.25, 1000 );//var greenLight = new THREE.PointLight( 0x00ff00, 0.25, 1000 ); greenLight.getPosition().set( 550, 50, 0 );//greenLight.position.set( 550, 50, 0 ); scene.add( greenLight ); PointLight redLight = THREE.PointLight( 0xff0000, 0.25, 1000 );//var redLight = new THREE.PointLight( 0xff0000, 0.25, 1000 ); redLight.getPosition().set( - 550, 50, 0 );//redLight.position.set( - 550, 50, 0 ); scene.add( redLight ); PointLight blueLight = THREE.PointLight( 0x7f7fff, 0.25, 1000 );//var blueLight = new THREE.PointLight( 0x7f7fff, 0.25, 1000 ); blueLight.getPosition().set( 0, 50, 550 );//blueLight.position.set( 0, 50, 550 ); scene.add( blueLight ); } private void initResizeHandlerAndGUI() { VerticalPanel gui=addResizeHandlerAndCreateGUIPanel(); gui.setWidth("200px");//some widget broke,like checkbox without parent size gui.setSpacing(2); } public void onWindowResize() { //TODO support mirror resize /* camera.setAspect(getWindowInnerWidth() / getWindowInnerHeight()); camera.updateProjectionMatrix(); renderer.setSize( (int)getWindowInnerWidth() , (int)getWindowInnerHeight() ); */ } public void render(double now) {//GWT animateFrame has time groundMirror.renderWithMirror( verticalMirror ); verticalMirror.renderWithMirror( groundMirror ); renderer.render(scene, camera); } @Override public String getTokenKey() { return "mirror"; } }