package com.akjava.gwt.threecanvastest.client; import com.akjava.gwt.three.client.js.THREE; import com.akjava.gwt.three.client.js.cameras.Camera; import com.akjava.gwt.three.client.js.materials.Material; import com.akjava.gwt.three.client.js.materials.MeshBasicMaterial; import com.akjava.gwt.three.client.js.math.Color; 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.akjava.gwt.threecanvastest.client.birds.Bird; import com.akjava.gwt.threecanvastest.client.birds.Boid; import com.google.gwt.event.dom.client.MouseMoveEvent; import com.google.gwt.user.client.Timer; import com.google.gwt.user.client.ui.FocusPanel; public class GeometryBird extends AbstractDemo{ int SCREEN_WIDTH , SCREEN_HEIGHT, SCREEN_WIDTH_HALF, SCREEN_HEIGHT_HALF; Camera camera; Scene scene; WebGLRenderer renderer; Mesh[] birds; Mesh bird; Boid boid; Boid[] boids; @Override public void start(final WebGLRenderer renderer,final int width,final int height,FocusPanel panel) { super.start(renderer, width, height, panel); SCREEN_WIDTH=width; SCREEN_HEIGHT=height; SCREEN_WIDTH_HALF=width/2; SCREEN_HEIGHT_HALF=height/2; this.renderer=renderer; init(); Timer timer = new Timer(){ public void run(){ MainWidget.stats.update(); render(); } }; startTimer(timer); } public void init() { camera = THREE.PerspectiveCamera( 75, SCREEN_WIDTH / SCREEN_HEIGHT, 1, 10000 ); camera.getPosition().setZ( 450); scene = THREE.Scene(); scene.add( camera ); birds = new Mesh[200]; boids = new Boid[200]; for ( int i = 0; i < 200; i ++ ) { boid = boids[ i ] = new Boid(); boid.getPosition().setX( Math.random() * 400 - 200); boid.getPosition().setY( Math.random() * 400 - 200); boid.getPosition().setZ( Math.random() * 400 - 200); boid.getVelocity().setX( Math.random() * 2 - 1); boid.getVelocity().setY( Math.random() * 2 - 1); boid.getVelocity().setZ( Math.random() * 2 - 1); boid.setAvoidWalls( true ); boid.setWorldSize( 500, 500, 400 ); Bird b=(Bird) THREE.Geometry(); b.init(); Material material=THREEDep.MeshBasicMaterial().color(Math.random() * 0xffffff ).build() ; bird = birds[ i ] = THREE.Mesh( b, material ); bird.setPhase( Math.floor( Math.random() * 62.83 )); bird.setPosition( boids[ i ].getPosition()); bird.setDoubleSided( true); // bird.scale.x = bird.scale.y = bird.scale.z = 10; scene.add( bird ); } //renderer = THREE.CanvasRenderer(); // renderer.autoClear = false; //renderer.setSize( SCREEN_WIDTH, SCREEN_HEIGHT ); //document.addEventListener( 'mousemove', onDocumentMouseMove, false ); //document.body.appendChild( renderer.domElement ); /* stats = new Stats(); stats.getDomElement().getStyle().setPosition( 'absolute'); stats.getDomElement().getStyle().setLeft( '0px'); stats.getDomElement().getStyle().setTop( '0px'); document.getElementById( 'container' ).appendChild(stats.domElement); */ } /* TODO mouse function onDocumentMouseMove( event ) { Vector3 vector = THREE.Vector3( event.clientX - SCREEN_WIDTH_HALF, - event.clientY + SCREEN_HEIGHT_HALF, 0 ); for ( int i = 0, il = boids.length; i < il; i++ ) { boid = boids[ i ]; vector.setZ( boid.position.z); boid.repulse( vector ); } } */ // @Override public void onMouseMove(MouseMoveEvent event) { super.onMouseMove(event); Vector3 vector = THREE.Vector3( event.getX() - SCREEN_WIDTH_HALF, - event.getY() + SCREEN_HEIGHT_HALF, 0 ); //LogUtils.log(""+ThreeLog.get(vector)); for ( int i = 0, il = boids.length; i < il; i++ ) { boid = boids[ i ]; vector.setZ( boid.getPosition().getZ()); boid.repulse( vector ); } } public void render() { //LogUtils.log("render"); for ( int i = 0, il = birds.length; i < il; i++ ) { boid = boids[ i ]; boid.run( boids ); bird = birds[ i ]; Color color = ((MeshBasicMaterial)bird.getMaterial()).getColor(); double c=( 500 - bird.getPosition().getZ() ) / 1000; color.setRGB(c,c,c); bird.getRotation().setY( Math.atan2( - boid.getVelocity().getZ(), boid.getVelocity().getX() )); bird.getRotation().setZ( Math.asin( boid.getVelocity().getY() / boid.getVelocity().length() )); bird.setPhase( ( bird.getPhase() + ( Math.max( 0, bird.getRotation().getZ() ) + 0.1 ) ) % 62.83); double y=Math.sin( bird.getPhase() ) * 5; bird.getGeometry().vertices().get( 5 ).setY(y); bird.getGeometry().vertices().get( 4 ).setY(y); } renderer.render( scene, camera ); } @Override public String getName() { return "Geometry Bird"; } @Override public String getHowToHtml() { return "now working yet<br>GWt version of <a href='http://mrdoob.github.com/three.js/examples/canvas_geometry_birds.html' target='threejs'>canvas_geometry_birds</a>"; } }