From 16ee65ef489ce9cb8a6589f300e5c4621fd6f1d4 Mon Sep 17 00:00:00 2001 From: "Mr.doob" Date: Mon, 24 Feb 2014 03:04:13 -0500 Subject: [PATCH] Added basic raytracing renderer. --- examples/js/renderers/RaytracingRenderer.js | 161 ++++++++++++++++++++ examples/raytracer_sandbox.html | 123 +++++++++++++++ 2 files changed, 284 insertions(+) create mode 100644 examples/js/renderers/RaytracingRenderer.js create mode 100644 examples/raytracer_sandbox.html diff --git a/examples/js/renderers/RaytracingRenderer.js b/examples/js/renderers/RaytracingRenderer.js new file mode 100644 index 0000000000..7cc202f962 --- /dev/null +++ b/examples/js/renderers/RaytracingRenderer.js @@ -0,0 +1,161 @@ +/** + * @author mrdoob / http://mrdoob.com/ + */ + +THREE.RaytracingRenderer = function ( parameters ) { + + console.log( 'THREE.RaytracingRenderer', THREE.REVISION ); + + parameters = parameters || {}; + + var canvas = document.createElement( 'canvas' ); + var context = canvas.getContext( '2d', { + alpha: parameters.alpha === true + } ); + + var canvasWidth, canvasHeight; + var canvasWidthHalf, canvasHeightHalf; + + var clearColor = new THREE.Color( 0x000000 ); + + var blockX = 0; + var blockY = 0; + var blockSize = 64; + + var canvasBlock = document.createElement( 'canvas' ); + canvasBlock.width = blockSize; + canvasBlock.height = blockSize; + + var contextBlock = canvasBlock.getContext( '2d', { + alpha: parameters.alpha === true + } ); + + var imagedata = contextBlock.getImageData( 0, 0, blockSize, blockSize ); + var data = imagedata.data; + + var viewMatrix = new THREE.Matrix4(); + var viewProjectionMatrix = new THREE.Matrix4(); + + var origin = new THREE.Vector3(); + var direction = new THREE.Vector3(); + + var raycaster = new THREE.Raycaster( origin, direction ); + + var objects; + + this.domElement = canvas; + + this.autoClear = true; + + this.setClearColor = function ( color, alpha ) { + + clearColor.set( color ); + + }; + + this.setSize = function ( width, height ) { + + canvas.width = width; + canvas.height = height; + + canvasWidth = canvas.width; + canvasHeight = canvas.height; + + canvasWidthHalf = Math.floor( canvasWidth / 2 ); + canvasHeightHalf = Math.floor( canvasHeight / 2 ); + + context.fillStyle = 'white'; + + }; + + this.setSize( canvas.width, canvas.height ); + + this.clear = function () { + + }; + + var renderBlock = function () { + + for ( var i = 0, l = data.length; i < l; i += 4 ) { + + data[ i ] = 0; + data[ i + 1 ] = 0; + data[ i + 2 ] = 0; + + } + + var index = 0; + + for ( var y = 0; y < blockSize; y ++ ) { + + for ( var x = 0; x < blockSize; x ++ ) { + + direction.set( x + blockX - canvasWidthHalf, y + blockY - canvasHeightHalf, - 500 ); + direction.normalize(); + + var intersections = raycaster.intersectObjects( objects, true ); + + if ( intersections.length > 0 ) { + + var intersection = intersections[ 0 ]; + + var object = intersection.object; + var material = object.material; + var face = intersection.face; + + var color; + + if ( material.vertexColors === THREE.NoColors ) { + + color = material.color; + + } else if ( material.vertexColors === THREE.FaceColors ) { + + color = face.color; + + } + + data[ index ] = color.r * 255; + data[ index + 1 ] = color.g * 255; + data[ index + 2 ] = color.b * 255; + + } + + index += 4; + + } + + } + + context.putImageData( imagedata, blockX, blockY ); + + blockX += blockSize; + + if ( blockX >= canvasWidth ) { + + blockX = 0; + blockY += blockSize; + + if ( blockY >= canvasHeight ) return; + + } + + context.fillRect( blockX, blockY, blockSize, blockSize ); + + requestAnimationFrame( renderBlock ); + + }; + + this.render = function ( scene, camera ) { + + if ( this.autoClear === true ) this.clear(); + + origin.copy( camera.position ); + + objects = scene.children; + + renderBlock(); + + } + +}; diff --git a/examples/raytracer_sandbox.html b/examples/raytracer_sandbox.html new file mode 100644 index 0000000000..1698610845 --- /dev/null +++ b/examples/raytracer_sandbox.html @@ -0,0 +1,123 @@ + + + + three.js - raytracing renderer + + + + + + + + + + + + + + + -- GitLab