package com.akjava.gwt.threejsexamples.client.examples.sweethome; import com.akjava.gwt.lib.client.LogUtils; import com.akjava.gwt.stats.client.Stats; import com.akjava.gwt.three.client.examples.js.THREEExp; import com.akjava.gwt.three.client.examples.js.controls.FirstPersonControls; import com.akjava.gwt.three.client.gwt.GWTParamUtils; import com.akjava.gwt.three.client.java.ThreeLog; 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.extras.helpers.PointLightHelper; import com.akjava.gwt.three.client.js.lights.AmbientLight; import com.akjava.gwt.three.client.js.lights.DirectionalLight; import com.akjava.gwt.three.client.js.lights.PointLight; 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.Vector3; 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.core.client.JsArray; import com.google.gwt.user.client.ui.FocusPanel; import com.google.gwt.user.client.ui.VerticalPanel; public class SweetHomeExample extends AbstractExample{ @Override public String getName() { return "SweetHome/loadjson"; } @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; private FirstPersonControls controls; @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(); // renderer renderer = THREE.WebGLRenderer( GWTParamUtils.WebGLRenderer().antialias(true) );//renderer = new THREE.WebGLRenderer( { antialias: true } ); 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(70, getWindowInnerWidth()/getWindowInnerHeight(), 1, 10000 ); camera.getPosition().set( -226, 100, -340 ); controls = THREEExp.FirstPersonControls( camera, renderer.getDomElement()); controls.setMovementSpeed(100);//controls.movementSpeed = 70; controls.setLookSpeed(0.1);//small is slow controls.setLookVertical(false); 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()); //handle resize & gui initResizeHandlerAndGUI(); //setDebugAnimateOneTimeOnly(true); /* JSONLoader loader = THREE.JSONLoader();//var loader = new THREE.ObjectLoader(); loader.load( "untitled.json",new JSONLoadHandler() { @Override public void loaded(Geometry geometry, JsArray<Material> materials) { // TODO Auto-generated method stub LogUtils.log("material"); LogUtils.log(materials); Mesh mesh=THREE.Mesh(geometry,THREE.MeshBasicMaterial()); scene.add(mesh); } });*/ ObjectLoader loader = THREE.ObjectLoader();//var loader = new THREE.ObjectLoader(); loader.load( "sweethome/userguideexample.json",new ObjectLoadHandler() { @Override public void onLoad(Object3D object) { scene = object.cast(); AmbientLight ambientLight=THREE.AmbientLight(0x333333); scene.add(ambientLight); DirectionalLight dlight=THREE.DirectionalLight(0x222222); dlight.getPosition().set(-1, 1, 1).normalize(); JsArray<Object3D> objects=scene.getChildren(); for(int i=0;i<objects.length();i++){ Object3D obj=objects.get(i); if(obj.getName().endsWith("628") || obj.getName().endsWith("634") || obj.getName().endsWith("622")|| obj.getName().endsWith("640")){ Mesh mesh=obj.cast(); addLight(mesh); //mesh.setVisible(false); } } LogUtils.log("scene loaded"); } } ); } private void addLight(Mesh mesh){ mesh.getGeometry().computeBoundingSphere(); Vector3 pos=mesh.getGeometry().getBoundingSphere().getCenter().clone(); pos.applyEuler(mesh.getRotation()); PointLight pointLight = THREE.PointLight( 0x333333 );//var directionalLight = new THREE.DirectionalLight( 0x444444 ); pointLight.setDistance(0); pointLight.setIntensity(1); pointLight.setDecay(0.9); pointLight.getPosition().copy(pos); scene.add( pointLight ); PointLightHelper pheloper=THREE.PointLightHelper(pointLight, 5); scene.add(pheloper); } private void initResizeHandlerAndGUI() { VerticalPanel gui=addResizeHandlerAndCreateGUIPanel(); gui.setWidth("200px");//some widget broke,like checkbox without parent size gui.setSpacing(2); } public void onWindowResize() { windowHalfX = getWindowInnerWidth() / 2; windowHalfY = getWindowInnerHeight() / 2; camera.setAspect(getWindowInnerWidth() / getWindowInnerHeight()); camera.updateProjectionMatrix(); renderer.setSize( (int)getWindowInnerWidth() , (int)getWindowInnerHeight() ); controls.handleResize(); } public void render(double now) { if(scene==null){ return; } double delta=clock.getDelta(); //ThreeLog.log(camera.getPosition()); controls.update( delta ); renderer.render( scene, camera ); } @Override public String getTokenKey() { return "sweethome_json"; } }