package com.akjava.gwt.threejsexamples.client.examples.geometries;
import com.akjava.gwt.lib.client.JavaScriptUtils;
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.TrackballControls;
import com.akjava.gwt.three.client.gwt.GWTParamUtils;
import com.akjava.gwt.three.client.gwt.extras.geometries.ExtrudeGeometryParameter;
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.Clock;
import com.akjava.gwt.three.client.js.extras.core.Shape;
import com.akjava.gwt.three.client.js.extras.curves.CatmullRomCurve3;
import com.akjava.gwt.three.client.js.extras.geometries.ExtrudeGeometry;
import com.akjava.gwt.three.client.js.lights.Light;
import com.akjava.gwt.three.client.js.lights.PointLight;
import com.akjava.gwt.three.client.js.materials.Material;
import com.akjava.gwt.three.client.js.materials.MeshLambertMaterial;
import com.akjava.gwt.three.client.js.math.THREEMath;
import com.akjava.gwt.three.client.js.math.Vector2;
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 ExtrudeShapesExample extends AbstractExample{
@Override
public String getName() {
return "geometry/extrude shapes";
}
@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;
double SCREEN_WIDTH;
double SCREEN_HEIGHT;
private int windowHalfX,windowHalfY;
//private int mouseX,mouseY;
Clock clock;
private TrackballControls controls;
@Override
public void init() {
clock=THREE.Clock();
SCREEN_WIDTH = getWindowInnerWidth();
SCREEN_HEIGHT = getWindowInnerHeight();
windowHalfX= (int)(SCREEN_WIDTH/2);
windowHalfY= (int)(SCREEN_HEIGHT/2);
FocusPanel container = createContainerPanel();
// renderer
renderer = THREE.WebGLRenderer();
renderer.setClearColor( 0x222222 );
renderer.setPixelRatio( GWTThreeUtils.getWindowDevicePixelRatio() );
renderer.setSize( SCREEN_WIDTH, SCREEN_HEIGHT );
container.getElement().appendChild( renderer.getDomElement() );
// scene
scene = THREE.Scene();
// camera
camera = THREE.PerspectiveCamera(45, getWindowInnerWidth()/getWindowInnerHeight(), 0.5, 300000);
camera.getPosition().set(0, 0, 500);
controls = THREEExp.TrackballControls( camera, renderer.getDomElement());//controls = new THREE.TrackballControls( camera, renderer.domElement );
controls.setMinDistance(200);//controls.minDistance = 200;
controls.setMaxDistance(500);//controls.maxDistance = 500;
scene.add( THREE.AmbientLight( 0x222222 ) );//scene.add( new THREE.AmbientLight( 0x222222 ) );
//temporaly fix maybe newer three.js solve this problem
Light light=THREE.DirectionalLight(0xffffff);
light.getPosition().set(0, 1, 1);
scene.add(light);
/*
PointLight light = THREE.PointLight( 0xffffff ,70000);//var light = new THREE.PointLight( 0xffffff );
light.getPosition().copy( camera.getPosition());//light.position.copy( camera.position );
scene.add( light );
*/
CatmullRomCurve3 closedSpline = THREE.CatmullRomCurve3(
(JsArray<Vector3>)JavaScriptUtils.createJSArray(THREE.Vector3( -60, -100, 60 ),
THREE.Vector3( -60, 20, 60 ),
THREE.Vector3( -60, 120, 60 ),
THREE.Vector3( 60, 20, -60 ),
THREE.Vector3( 60, -100, -60 )
));
ExtrudeGeometryParameter extrudeSettings = GWTParamUtils.ExtrudeGeometry().steps(4).bevelEnabled(false).extrudePath(closedSpline);//var extrudeSettings = {steps : 100,bevelEnabled : false,extrudePath : closedSpline};
JsArray<Vector2> pts = JavaScriptUtils.createJSArray();
int count = 3;
for ( int i = 0; i < count; i ++ ) {
double l = 20;//var l = 20;
double a = (double)(2 * i) / count * Math.PI;
pts.push( THREE.Vector2 ( Math.cos( a ) * l, Math.sin( a ) * l ) );//pts.push( new THREE.Vector2 ( Math.cos( a ) * l, Math.sin( a ) * l ) );
}
Shape shape = THREE.Shape( pts );//var shape = new THREE.Shape( pts );
ExtrudeGeometry geometry = THREE.ExtrudeGeometry( shape, extrudeSettings );//var geometry = new THREE.ExtrudeGeometry( shape, extrudeSettings );
MeshLambertMaterial material = THREE.MeshLambertMaterial( GWTParamUtils.MeshLambertMaterial().color(0xb00000).wireframe(false) );//var material = new THREE.MeshLambertMaterial( { color: 0xb00000, wireframe: false } );
Mesh mesh = THREE.Mesh( geometry, material );//var mesh = new THREE.Mesh( geometry, material );
scene.add( mesh );
JsArray<Vector3> randomPoints = JavaScriptUtils.createJSArray();
for ( int i = 0; i < 10; i ++ ) {
randomPoints.push( THREE.Vector3( ( i - 4.5 ) * 50, THREEMath.randFloat( - 50, 50 ), THREEMath.randFloat( - 50, 50 ) ) );//randomPoints.push( new THREE.Vector3( ( i - 4.5 ) * 50, THREE.Math.randFloat( - 50, 50 ), THREE.Math.randFloat( - 50, 50 ) ) );
}
CatmullRomCurve3 randomSpline = THREE.CatmullRomCurve3( randomPoints );//var randomSpline = new THREE.CatmullRomCurve3( randomPoints );
extrudeSettings = GWTParamUtils.ExtrudeGeometry().steps(200).bevelEnabled(false).extrudePath(randomSpline);//var extrudeSettings = {steps : 200,bevelEnabled : false,extrudePath : randomSpline};
pts = JavaScriptUtils.createJSArray();
int numPts = 5;
for ( int i = 0; i < numPts * 2; i ++ ) {
int l = i % 2 == 1 ? 10 : 20;
double a = (double)i / numPts * Math.PI;
pts.push( THREE.Vector2 ( Math.cos( a ) * l, Math.sin( a ) * l ) );//pts.push( new THREE.Vector2 ( Math.cos( a ) * l, Math.sin( a ) * l ) );
}
shape = THREE.Shape( pts );//var shape = new THREE.Shape( pts );
geometry = THREE.ExtrudeGeometry( shape, extrudeSettings );//var geometry = new THREE.ExtrudeGeometry( shape, extrudeSettings );
MeshLambertMaterial material2 = THREE.MeshLambertMaterial( GWTParamUtils.MeshLambertMaterial().color(0xff8000).wireframe(false) );//var material2 = new THREE.MeshLambertMaterial( { color: 0xff8000, wireframe: false } );
mesh = THREE.Mesh( geometry, material2 );//var mesh = new THREE.Mesh( geometry, material2 );
scene.add( mesh );
JsArray<Material> materials =JavaScriptUtils.createJSArray(material,material2);//var materials = [ material, material2 ];
extrudeSettings = GWTParamUtils.ExtrudeGeometry().amount(20).steps(1).bevelEnabled(true).bevelThickness(2).bevelSize(4).bevelSegments(1);
geometry = THREE.ExtrudeGeometry( shape, extrudeSettings );//var geometry = new THREE.ExtrudeGeometry( shape, extrudeSettings );
mesh = THREE.Mesh( geometry, THREE.MultiMaterial( materials ) );//var mesh = new THREE.Mesh( geometry, new THREE.MultiMaterial( materials ) );
mesh.getPosition().set( 50, 100, 50 );//mesh.position.set( 50, 100, 50 );
scene.add( mesh );
//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>" +
" - ExtrudeShapes" +
"</div>"
,100,10));
//handle resize & gui
initResizeHandlerAndGUI();
//setDebugAnimateOneTimeOnly(true);
}
private VerticalPanel initResizeHandlerAndGUI() {
VerticalPanel gui=addResizeHandlerAndCreateGUIPanel();
gui.setWidth("200px");//some widget broke,like checkbox without parent size
gui.setSpacing(2);
//TODO add other ui or after return;
return gui;
}
public void onWindowResize() {
SCREEN_WIDTH = getWindowInnerWidth();
SCREEN_HEIGHT = getWindowInnerHeight();
//re read because of double
camera.setAspect(SCREEN_WIDTH / SCREEN_HEIGHT);
camera.updateProjectionMatrix();
renderer.setSize( SCREEN_WIDTH , SCREEN_HEIGHT );
}
public void render(double now) {
controls.update();
double delta=clock.getDelta();
//do something
renderer.render(scene, camera);
}
@Override
public String getTokenKey() {
return "extrude_shapes";
}
}