Browse Source

Added normals to WebGLRenderer

Nicolas Garcia Belmonte 15 years ago
parent
commit
a53ad5a79a
1 changed files with 30 additions and 3 deletions
  1. 30 3
      src/renderers/WebGLRenderer.js

+ 30 - 3
src/renderers/WebGLRenderer.js

@@ -6,7 +6,7 @@
 THREE.WebGLRenderer = function () {
 
 	var _canvas = document.createElement( 'canvas' ), _gl, _program,
-	viewMatrix = new THREE.Matrix4();
+	viewMatrix = new THREE.Matrix4(), normalMatrix;
 
 	this.domElement = _canvas;
 	this.autoClear = true;
@@ -30,8 +30,8 @@ THREE.WebGLRenderer = function () {
 
 	this.render = function ( scene, camera ) {
 
-		var face, faceColor, object, material,
-		vertexArray, faceArray, colorArray, vertexIndex,
+		var face, faceColor, object, material, normal,
+		vertexArray, faceArray, colorArray, normalArray, vertexIndex,
 		o, ol, f, fl, m, ml, i, v1, v2, v3, v4;
 
 		if ( this.autoClear ) {
@@ -51,12 +51,14 @@ THREE.WebGLRenderer = function () {
 					vertexArray = [];
 					faceArray = [];
 					colorArray = [];
+					normalArray = [];
 					vertexIndex = 0;
 
 					for ( f = 0, fl = object.geometry.faces.length; f < fl; f++ ) {
 
 						face = object.geometry.faces[ f ];
 						faceColor = face.color;
+						normal = face.normal;
 
 						if ( face instanceof THREE.Face3 ) {
 
@@ -68,6 +70,10 @@ THREE.WebGLRenderer = function () {
 							vertexArray.push( v2.x, v2.y, v2.z );
 							vertexArray.push( v3.x, v3.y, v3.z );
 
+              normalArray.push( n.x, n.y, n.z );
+              normalArray.push( n.x, n.y, n.z );
+              normalArray.push( n.x, n.y, n.z );
+
 							colorArray.push( faceColor.r, faceColor.g, faceColor.b, faceColor.a );
 							colorArray.push( faceColor.r, faceColor.g, faceColor.b, faceColor.a );
 							colorArray.push( faceColor.r, faceColor.g, faceColor.b, faceColor.a );
@@ -88,6 +94,11 @@ THREE.WebGLRenderer = function () {
 							vertexArray.push( v3.x, v3.y, v3.z );
 							vertexArray.push( v4.x, v4.y, v4.z );
 
+              normalArray.push( n.x, n.y, n.z );
+              normalArray.push( n.x, n.y, n.z );
+              normalArray.push( n.x, n.y, n.z );
+              normalArray.push( n.x, n.y, n.z );
+
 							colorArray.push( faceColor.r, faceColor.g, faceColor.b, faceColor.a );
 							colorArray.push( faceColor.r, faceColor.g, faceColor.b, faceColor.a );
 							colorArray.push( faceColor.r, faceColor.g, faceColor.b, faceColor.a );
@@ -110,6 +121,10 @@ THREE.WebGLRenderer = function () {
 					_gl.bindBuffer( _gl.ARRAY_BUFFER, object.__webGLVertexBuffer );
 					_gl.bufferData( _gl.ARRAY_BUFFER, new Float32Array( vertexArray ), _gl.STATIC_DRAW );
 
+          object.__webGLNormalBuffer = _gl.createBuffer();
+          _gl.bindBuffer( _gl.ARRAY_BUFFER, object.__webGLNormalBuffer );
+          _gl.bufferData( _gl.ARRAY_BUFFER, new Float32Array( normalArray ), _gl.STATIC_DRAW );
+
 					object.__webGLColorBuffer = _gl.createBuffer();
 					_gl.bindBuffer( _gl.ARRAY_BUFFER, object.__webGLColorBuffer );
 					_gl.bufferData( _gl.ARRAY_BUFFER, new Float32Array( colorArray ), _gl.STATIC_DRAW );
@@ -128,12 +143,18 @@ THREE.WebGLRenderer = function () {
 				_program.viewMatrixArray = new Float32Array( viewMatrix.flatten() );
 				_program.projectionMatrixArray = new Float32Array( camera.projectionMatrix.flatten() );
 
+		    normalMatrix = Matrix4.makeInvert(viewMatrix).transpose();
+		    _program.normalMatrixArray = new Float32Array( normalMatrix.flatten() );
+		    
 				_gl.uniformMatrix4fv( _program.viewMatrix, false, _program.viewMatrixArray );
 				_gl.uniformMatrix4fv( _program.projectionMatrix, false, _program.projectionMatrixArray );
+				_gl.uniformMatrix4fv( _program.normalMatrix, false, _program.normalMatrixArray );
 
 				_gl.bindBuffer( _gl.ARRAY_BUFFER, object.__webGLVertexBuffer );
 				_gl.vertexAttribPointer( _program.position, 3, _gl.FLOAT, false, 0, 0 );
 
+        _gl.bindBuffer( _gl.ARRAY_BUFFER, object.__webGLNormalBuffer );
+        _gl.vertexAttribPointer( _program.normal, 3, _gl.FLOAT, false, 0, 0 );
 
 				for ( m = 0, ml = object.material.length; m < ml; m++ ) {
 
@@ -225,10 +246,12 @@ THREE.WebGLRenderer = function () {
 
 		_gl.attachShader( _program, getShader( "vertex", [
 								"attribute vec3 position;",
+                "attribute vec3 normal;",
 								"attribute vec4 color;",
 
 								"uniform mat4 viewMatrix;",
 								"uniform mat4 projectionMatrix;",
+                "uniform mat4 normalMatrix;",
 								"varying vec4 vcolor;",
 
 								"void main(void) {",
@@ -250,6 +273,7 @@ THREE.WebGLRenderer = function () {
 
 		_program.viewMatrix = _gl.getUniformLocation( _program, "viewMatrix" );
 		_program.projectionMatrix = _gl.getUniformLocation( _program, "projectionMatrix" );
+		_program.normalMatrix = _gl.getUniformLocation( _program, "normalMatrix" );
 
 		_program.color = _gl.getAttribLocation( _program, "color" );
 		_gl.enableVertexAttribArray( _program.color );
@@ -257,6 +281,9 @@ THREE.WebGLRenderer = function () {
 		_program.position = _gl.getAttribLocation( _program, "position" );
 		_gl.enableVertexAttribArray( _program.position );
 
+    _program.normal = _gl.getAttribLocation( _program, "normal" );
+    _gl.enableVertexAttribArray( _program.normal );
+
 		_program.viewMatrixArray = new Float32Array(16);
 		_program.projectionMatrixArray = new Float32Array(16);