package com.akjava.gwt.threetest.client; import com.akjava.gwt.lib.client.LogUtils; import com.akjava.gwt.three.client.gwt.materials.MeshBasicMaterialParameter; 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.objects.Mesh; import com.akjava.gwt.three.client.js.renderers.WebGLRenderTarget; import com.akjava.gwt.three.client.js.renderers.WebGLRenderer; import com.akjava.gwt.three.client.js.scenes.Scene; import com.google.gwt.core.client.JavaScriptObject; import com.google.gwt.event.dom.client.MouseDownEvent; import com.google.gwt.event.dom.client.MouseMoveEvent; import com.google.gwt.user.client.Timer; import com.google.gwt.user.client.ui.FocusPanel; /** * not complete * @author aki * */ public class RenderTargetDemo 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); renderer.setClearColor(0xffffff, 1); windowHalfX=width/2; windowHalfY=height/2; this.renderer=renderer; scene = THREE.Scene(); camera = THREE.PerspectiveCamera( 90,1, 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 , THREE.MeshBasicMaterial( MeshBasicMaterialParameter.create().vertexColors(THREE.FaceColors)) ); cube.getPosition().setY( 150); scene.add( cube ); // Plane plane = THREE.Mesh( THREE.PlaneBufferGeometry( 200, 200 ), THREE.MeshBasicMaterial(MeshBasicMaterialParameter.create().color( 0xe0e0e0 ).overdraw(true))); plane.getGeometry().applyMatrix(THREE.Matrix4().makeRotationX( - Math.PI / 2 ) ); scene.add( plane ); WebGLRenderTarget target=THREE.WebGLRenderTarget(256, 256, null); WebGLRenderTarget target2=THREE.WebGLRenderTarget(256, 256, null); //test renderer.render(scene, camera, target, true); LogUtils.log(toDataUrl(renderer.getContext(),target.getWebglTexture(),256,256)); //renderer.render(scene, camera); camera.getRotation().setZ(Math.PI);//flip texture //camera.getRotation().setX(Math.PI/2); camera.updateMatrix(); renderer.render(scene, camera, target2, true); LogUtils.log(toDataUrl(renderer.getContext(),target2.getWebglTexture(),256,256)); 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 static final native String toDataUrl(JavaScriptObject gl, JavaScriptObject texture, int width, int height)/*-{ // Create a framebuffer backed by the texture var framebuffer = gl.createFramebuffer(); gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer); gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0); // Read the contents of the framebuffer var data = new Uint8Array(width * height * 4); gl.readPixels(0, 0, width, height, gl.RGBA, gl.UNSIGNED_BYTE, data); gl.deleteFramebuffer(framebuffer); // Create a 2D canvas to store the result var canvas = document.createElement('canvas'); canvas.width = width; canvas.height = height; var context = canvas.getContext('2d'); // Copy the pixels to a 2D canvas var imageData = context.createImageData(width, height); imageData.data.set(data); context.putImageData(imageData, 0, 0); return canvas.toDataURL(); }-*/; 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 "RenderTarget"; } @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>"; } }