/* * Copyright (C) 2011 aki@akjava.com * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.akjava.gwt.threetest.client; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import com.akjava.gwt.three.client.gwt.GWTParamUtils; import com.akjava.gwt.three.client.gwt.core.Intersect; import com.akjava.gwt.three.client.gwt.materials.MeshLambertMaterialParameter; import com.akjava.gwt.three.client.java.GWTDragObjectControler; 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.Object3D; import com.akjava.gwt.three.client.js.lights.Light; 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.objects.Mesh; import com.akjava.gwt.three.client.js.renderers.WebGLRenderer; import com.akjava.gwt.three.client.js.scenes.Scene; import com.akjava.gwt.threetest.client.resources.Bundles; import com.google.gwt.core.client.JsArray; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.event.shared.HandlerRegistration; import com.google.gwt.user.client.Timer; import com.google.gwt.user.client.ui.FocusPanel; public class PickDemo extends AbstractDemo{ private Map<Integer,Mesh> meshs; @Override public void start(final WebGLRenderer renderer,final int width,final int height,FocusPanel panel) { super.start(renderer, width, height, panel); renderer.setClearColor(0xffffff, 1); meshs = new HashMap<Integer,Mesh>(); final Camera camera=THREE.PerspectiveCamera(35,(double)width/height,.1,10000); camera.getPosition().set(0, 0, 50); camera.getRotation().copy(THREE.Euler(0, 0, 0, "XYZ")); final Scene scene=THREE.Scene(); final Material material=THREE.MeshLambertMaterial( GWTParamUtils.MeshLambertMaterial() .color(0xff00ff) ); final Mesh mesh=THREE.Mesh(THREE.CylinderGeometry(5, 5, 5,6), material); scene.add(mesh); final Mesh mesh2=THREE.Mesh(THREE.CylinderGeometry(5, 5, 5,15), THREE.MeshLambertMaterial( GWTParamUtils.MeshLambertMaterial() .color(0x00ff00) ) ); mesh2.setPosition(0, 10, 0); scene.add(mesh2); final Mesh mesh3=THREE.Mesh(THREE.CylinderGeometry(5, 1, 5,15), THREE.MeshLambertMaterial(GWTParamUtils.MeshLambertMaterial() .color(0x0000ff))); mesh3.setPosition(0, -10, 0); scene.add(mesh3); final Mesh mesh4=THREE.Mesh(THREE.CylinderGeometry(5, 4.5, 5,5), THREE.MeshLambertMaterial(GWTParamUtils.MeshLambertMaterial() .color(0xffff00))); mesh4.setPosition(-10,0, 0); scene.add(mesh4); final Light light=THREE.PointLight(0xffffff); light.setPosition(10, 0, 10); scene.add(light); meshs.put(mesh.getId(),mesh); meshs.put(mesh2.getId(),mesh2); meshs.put(mesh3.getId(),mesh3); meshs.put(mesh4.getId(),mesh4); MainWidget.cameraMove.setX(0); MainWidget.cameraMove.setY(0); MainWidget.cameraMove.setZ(50); Timer timer = new Timer(){ public void run(){ mesh.getRotation().gwtIncrementX(0.02); mesh.getRotation().gwtIncrementY(0.02); renderer.render(scene, camera); camera.setPosition(MainWidget.cameraMove.getX(), MainWidget.cameraMove.getY(),MainWidget.cameraMove.getZ()); } }; startTimer(timer); HandlerRegistration handlerRegistration=panel.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { List<Object3D> list=new ArrayList<Object3D>(); for(Mesh mesh:meshs.values()){ list.add(mesh); } JsArray<Intersect> intersects=GWTDragObjectControler.pickIntersectsByList(event.getX(), event.getY(), width, height, camera,list); if(intersects.length()>0){ } for(int i=0;i<intersects.length();i++){ Intersect sect=intersects.get(i); final Mesh target=meshs.get(sect.getObject().getId()); log(target); final int old=((MeshBasicMaterial)target.getMaterial()).getColor().getHex(); ((MeshBasicMaterial)target.getMaterial()).getColor().setHex(0xeeeeee); Timer timer=new Timer(){ @Override public void run() { ((MeshBasicMaterial)target.getMaterial()).getColor().setHex(old); } }; timer.schedule(1000); } } }); addHandlerRegistration(handlerRegistration); } @Override public String getName() { return "Pick"; } @Override public String getHowToHtml(){ return Bundles.INSTANCE.howto_default().getText(); } }