package com.akjava.gwt.threecanvastest.client;
import com.akjava.gwt.lib.client.LogUtils;
import com.akjava.gwt.three.client.java.MeshBasicMaterialBuilder;
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.core.Geometry;
import com.akjava.gwt.three.client.js.extras.ImageUtils;
import com.akjava.gwt.three.client.js.materials.Material;
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.three.client.js.textures.Texture;
import com.akjava.gwt.threecanvastest.client.birds.Bird;
import com.akjava.gwt.threecanvastest.client.birds.Boid;
import com.google.gwt.core.client.GWT;
import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.core.client.JsArray;
import com.google.gwt.dom.client.NativeEvent;
import com.google.gwt.event.dom.client.MouseDownEvent;
import com.google.gwt.event.dom.client.MouseMoveEvent;
import com.google.gwt.event.dom.client.MouseOutEvent;
import com.google.gwt.event.dom.client.MouseUpEvent;
import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.ui.FocusPanel;
public class GeometryCube extends AbstractDemo{
Camera camera;
Scene scene;
WebGLRenderer renderer;
Mesh cube;
Mesh plane;
double targetRotation = 0;
double targetRotationOnMouseDown = 0;
int mouseX = 0;
int mouseXOnMouseDown = 0;
int windowHalfX ;
int windowHalfY ;
@Override
public void start(final WebGLRenderer renderer,final int width,final int height,FocusPanel panel) {
super.start(renderer, width, height, panel);
windowHalfX=width/2;
windowHalfY=height/2;
this.renderer=renderer;
scene = THREE.Scene();
camera = THREE.PerspectiveCamera( 70, width / height, 1, 1000 );
camera.getPosition().setY( 150);
camera.getPosition().setZ( 500);
scene.add( camera );
Geometry geometry=THREE.BoxGeometry( 200, 200, 200);
for(int i=0;i<geometry.faces().length();i++){
geometry.faces().get(i).getColor().setHex((int) (Math.random() * 0xffffff));
}
cube = THREE.Mesh(geometry , THREEDep.MeshBasicMaterial().vertexColors(THREE.Colors.FaceColors()).build() );
cube.getPosition().setY( 150);
scene.add( cube );
// Plane
plane = THREE.Mesh( THREE.PlaneGeometry( 200, 200 ),
THREEDep.MeshBasicMaterial(). color( 0xe0e0e0 ).overdraw(true).build() );
plane.getGeometry().applyMatrix(THREE.Matrix4().makeRotationX( - Math.PI / 2 ) );
scene.add( plane );
Timer timer = new Timer(){
public void run(){
MainWidget.stats.begin();
render();
MainWidget.stats.end();
}
};
startTimer(timer);
}
public void onMouseDown(MouseDownEvent event) {
super.onMouseDown(event);
mouseXOnMouseDown = event.getX() - windowHalfX;
targetRotationOnMouseDown = targetRotation;
}
public void onMouseMove(MouseMoveEvent event) {
super.onMouseMove(event);
if(mouseDown){
mouseX = event.getX() - windowHalfX;
targetRotation = targetRotationOnMouseDown + ( mouseX - mouseXOnMouseDown ) * 0.02;
}
}
public void render() {
double rot= cube.getRotation().getY() +( targetRotation - cube.getRotation().getY() ) * 0.05;
plane.getRotation().setY(rot);
cube.getRotation().setY(rot);
renderer.render( scene, camera );
}
@Override
public String getName() {
return "Geometry Cube";
}
@Override
public String getHowToHtml() {
return "GWt version of <a href='http://mrdoob.github.com/three.js/examples/canvas_geometry_cube.html' target='threejs'>canvas_geometry_cube</a>";
}
}