Explorar o código

Added Blinn-Phong material for WebGLRenderer.

In Chrome it looks more or less ok, but it has some problem in Firefox 4 (with some camera angles there are black areas around edges).

Also updated Python builder scripts and examples to include this new material.
alteredq %!s(int64=14) %!d(string=hai) anos
pai
achega
b6904f3d72

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 0 - 1
build/Three.js


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 0 - 1
build/ThreeDebug.js


+ 3 - 2
examples/lights_test.html

@@ -39,10 +39,11 @@
         
         <div id="log"></div>
 
-		<!--
         <script type="text/javascript" src="../build/Three.js"></script> 
+		<!--
         -->
 
+		<!--
 		<script type="text/javascript" src="../src/Three.js"></script>
 		<script type="text/javascript" src="../src/core/Color.js"></script>
 		<script type="text/javascript" src="../src/core/Vector2.js"></script>
@@ -65,6 +66,7 @@
 		<script type="text/javascript" src="../src/objects/Particle.js"></script>
 		<script type="text/javascript" src="../src/objects/Line.js"></script>
 		<script type="text/javascript" src="../src/materials/LineColorMaterial.js"></script>
+		<script type="text/javascript" src="../src/materials/MeshPhongMaterial.js"></script>
 		<script type="text/javascript" src="../src/materials/MeshBitmapUVMappingMaterial.js"></script>
 		<script type="text/javascript" src="../src/materials/MeshColorFillMaterial.js"></script>
 		<script type="text/javascript" src="../src/materials/MeshColorStrokeMaterial.js"></script>
@@ -81,7 +83,6 @@
 		<script type="text/javascript" src="../src/renderers/renderables/RenderableFace4.js"></script>
 		<script type="text/javascript" src="../src/renderers/renderables/RenderableParticle.js"></script>
 		<script type="text/javascript" src="../src/renderers/renderables/RenderableLine.js"></script>
-		<!--
         -->
 		
 		<script type="text/javascript" src="geometry/primitives/Sphere.js"></script>

+ 1 - 0
examples/materials_test.html

@@ -68,6 +68,7 @@
 		<script type="text/javascript" src="../src/objects/Particle.js"></script>
 		<script type="text/javascript" src="../src/objects/Line.js"></script>
 		<script type="text/javascript" src="../src/materials/LineColorMaterial.js"></script>
+		<script type="text/javascript" src="../src/materials/MeshPhongMaterial.js"></script>
 		<script type="text/javascript" src="../src/materials/MeshBitmapUVMappingMaterial.js"></script>
 		<script type="text/javascript" src="../src/materials/MeshColorFillMaterial.js"></script>
 		<script type="text/javascript" src="../src/materials/MeshColorStrokeMaterial.js"></script>

+ 1 - 0
examples/obj_convert_test.html

@@ -69,6 +69,7 @@
 		<script type="text/javascript" src="../src/objects/Particle.js"></script>
 		<script type="text/javascript" src="../src/objects/Line.js"></script>
 		<script type="text/javascript" src="../src/materials/LineColorMaterial.js"></script>
+		<script type="text/javascript" src="../src/materials/MeshPhongMaterial.js"></script>
 		<script type="text/javascript" src="../src/materials/MeshBitmapUVMappingMaterial.js"></script>
 		<script type="text/javascript" src="../src/materials/MeshColorFillMaterial.js"></script>
 		<script type="text/javascript" src="../src/materials/MeshColorStrokeMaterial.js"></script>

+ 350 - 0
examples/shader_test.html

@@ -0,0 +1,350 @@
+<!DOCTYPE HTML>
+<html lang="en">
+	<head>
+		<title>three.js - Shader test</title>
+		<meta charset="utf-8">
+		<style type="text/css">
+			body {
+				background:#000;
+                color:#fff;
+                padding:0;
+				margin:0;
+				overflow:hidden;
+                font-family:georgia;
+                text-align:center;
+			}
+            h1 { }
+            a { color:skyblue }
+            canvas { pointer-events:none; z-index:10; position:relative; }
+            #log { position:absolute; top:50px; text-align:left; display:block; z-index:100 }
+            #d { text-align:center; margin:1em 0 -19.7em 0; z-index:0; position:relative; display:block }
+            .button { background:orange; color:#fff; padding:0.2em 0.5em; cursor:pointer }
+            .inactive { background:#999; color:#eee }
+		</style>
+	</head>
+	
+    <body>
+        <div id="d">
+            <h1>Shader test</h1>
+
+            <span id="rcanvas" class="button inactive">2d canvas renderer</span>
+            <span id="rwebgl" class="button">WebGL renderer</span>
+            <br/>
+            
+            <p>Using a modified version of <a href="http://github.com/alteredq/three.js">Three.js</a> by mrdoob.
+            
+            <br/>
+            <p>Best viewed in Chrome 7/8 or Firefox 4 using WebGL renderer.
+            <p>Canvas renderer is very slow on anything other than Chrome.
+            <p>Blinn-Phong shader only works in WebGL, canvas has only diffuse materials.
+            <p>In Firefox 4 something is broken.
+        </div>
+        
+        <div id="log"></div>
+
+		<!--
+        <script type="text/javascript" src="../build/Three.js"></script> 
+        -->
+
+		<script type="text/javascript" src="../src/Three.js"></script>
+		<script type="text/javascript" src="../src/core/Color.js"></script>
+		<script type="text/javascript" src="../src/core/Vector2.js"></script>
+		<script type="text/javascript" src="../src/core/Vector3.js"></script>
+		<script type="text/javascript" src="../src/core/Vector4.js"></script>
+		<script type="text/javascript" src="../src/core/Rectangle.js"></script>
+		<script type="text/javascript" src="../src/core/Matrix4.js"></script>
+		<script type="text/javascript" src="../src/core/Vertex.js"></script>
+		<script type="text/javascript" src="../src/core/Face3.js"></script>
+		<script type="text/javascript" src="../src/core/Face4.js"></script>
+		<script type="text/javascript" src="../src/core/UV.js"></script>
+		<script type="text/javascript" src="../src/core/Geometry.js"></script>
+		<script type="text/javascript" src="../src/cameras/Camera.js"></script>
+		<script type="text/javascript" src="../src/lights/Light.js"></script>
+		<script type="text/javascript" src="../src/lights/AmbientLight.js"></script>
+		<script type="text/javascript" src="../src/lights/DirectionalLight.js"></script>
+		<script type="text/javascript" src="../src/lights/PointLight.js"></script>
+		<script type="text/javascript" src="../src/objects/Object3D.js"></script>
+		<script type="text/javascript" src="../src/objects/Mesh.js"></script>
+		<script type="text/javascript" src="../src/objects/Particle.js"></script>
+		<script type="text/javascript" src="../src/objects/Line.js"></script>
+		<script type="text/javascript" src="../src/materials/LineColorMaterial.js"></script>
+		<script type="text/javascript" src="../src/materials/MeshPhongMaterial.js"></script>
+		<script type="text/javascript" src="../src/materials/MeshBitmapUVMappingMaterial.js"></script>
+		<script type="text/javascript" src="../src/materials/MeshColorFillMaterial.js"></script>
+		<script type="text/javascript" src="../src/materials/MeshColorStrokeMaterial.js"></script>
+		<script type="text/javascript" src="../src/materials/MeshFaceColorFillMaterial.js"></script>
+		<script type="text/javascript" src="../src/materials/MeshFaceColorStrokeMaterial.js"></script>
+		<script type="text/javascript" src="../src/materials/ParticleCircleMaterial.js"></script>
+		<script type="text/javascript" src="../src/materials/ParticleBitmapMaterial.js"></script>
+		<script type="text/javascript" src="../src/scenes/Scene.js"></script>
+		<script type="text/javascript" src="../src/renderers/Projector.js"></script>
+		<script type="text/javascript" src="../src/renderers/CanvasRenderer.js"></script>
+		<script type="text/javascript" src="../src/renderers/SVGRenderer.js"></script>
+		<script type="text/javascript" src="../src/renderers/WebGLRenderer.js"></script>
+		<script type="text/javascript" src="../src/renderers/renderables/RenderableFace3.js"></script>
+		<script type="text/javascript" src="../src/renderers/renderables/RenderableFace4.js"></script>
+		<script type="text/javascript" src="../src/renderers/renderables/RenderableParticle.js"></script>
+		<script type="text/javascript" src="../src/renderers/renderables/RenderableLine.js"></script>
+		<!--
+        -->
+		
+		<script type="text/javascript" src="geometry/primitives/Sphere.js"></script>
+
+		<script type="text/javascript" src="js/Stats.js"></script>
+
+		<script type="text/javascript">
+
+			var SCREEN_WIDTH = window.innerWidth;
+			var SCREEN_HEIGHT = window.innerHeight;
+			var FLOOR = -250;
+
+			var container;
+			var stats;
+
+			var camera;
+			var scene;
+			var canvasRenderer, webglRenderer;
+
+			var mesh, zmesh, lightMesh, geometry;
+            
+            var directionalLight, pointLight;
+            
+			var mouseX = 0;
+			var mouseY = 0;
+
+			var windowHalfX = window.innerWidth >> 1;
+			var windowHalfY = window.innerHeight >> 1;
+
+            var render_canvas = 1, render_gl = 1;
+            var has_gl = 0;
+            
+            var bcanvas = document.getElementById("rcanvas");
+            var bwebgl = document.getElementById("rwebgl");
+            
+			document.addEventListener('mousemove', onDocumentMouseMove, false);
+
+			init();
+            
+			loop();
+            
+            render_canvas = !has_gl;
+            bwebgl.style.display = has_gl ? "inline" : "none";
+            bcanvas.className = render_canvas ? "button" : "button inactive";
+            
+			setInterval(loop, 1000/60);
+            
+            function addMesh( geometry, scale, x, y, z, rx, ry, rz, material ) {
+                
+                mesh = new THREE.Mesh( geometry, material );
+                mesh.scale.x = mesh.scale.y = mesh.scale.z = scale;
+                mesh.position.x = x;
+                mesh.position.y = y;
+                mesh.position.z = z;
+                mesh.rotation.x = rx;
+                mesh.rotation.y = ry;
+                mesh.rotation.z = rz;
+                mesh.overdraw = true;
+                mesh.updateMatrix();
+                scene.add(mesh);
+                
+            }
+            
+			function init() {
+
+				container = document.createElement('div');
+				document.body.appendChild(container);
+
+				camera = new THREE.Camera( 75, SCREEN_WIDTH / SCREEN_HEIGHT, 1, 100000 );
+                camera.position.z = 1000;
+                camera.updateMatrix();
+
+				scene = new THREE.Scene();
+
+				// LIGHTS
+
+                var ambient = new THREE.AmbientLight( 0x101010 );
+				scene.addLight( ambient );
+
+                directionalLight = new THREE.DirectionalLight( 0xffffff, 1.0 );
+                directionalLight.position.x = 1;
+                directionalLight.position.y = 1;
+                directionalLight.position.z = 2;
+				directionalLight.position.normalize();
+				scene.addLight( directionalLight );
+
+				pointLight = new THREE.PointLight( 0xffffff );
+                pointLight.position.x = 0;
+                pointLight.position.y = 0;
+                pointLight.position.z = 0;
+				scene.addLight( pointLight );
+
+
+                // light representation
+                sphere = new Sphere( 100, 16, 8, 1 );
+                lightMesh = new THREE.Mesh( sphere, new THREE.MeshColorFillMaterial( 0xffaa00 ) );
+                lightMesh.scale.x = lightMesh.scale.y = lightMesh.scale.z = 0.05;
+                lightMesh.position = pointLight.position;
+                lightMesh.overdraw = true;
+                lightMesh.updateMatrix();
+                scene.add(lightMesh);
+
+                // material samples
+                sphere = new Sphere( 100, 32, 32, 1 );
+
+                var y1 = 0, y2 = -200;
+                
+                addMesh( sphere, 1, -600, y1, 0, 0,0,0, new THREE.MeshPhongMaterial( 0x050505, 0x000000, 0x555555, 30, 1.0 ) );
+                addMesh( sphere, 1, -600, y2, 0, 0,0,0, new THREE.MeshColorFillMaterial( 0x050505 ) );
+
+                addMesh( sphere, 1, -400, y1, 0, 0,0,0, new THREE.MeshPhongMaterial( 0x000000, 0xffffff, 0x555555, 30, 1.0 ) );
+                addMesh( sphere, 1, -400, y2, 0, 0,0,0, new THREE.MeshColorFillMaterial( 0xffffff ) );
+
+                addMesh( sphere, 1, -200, y1, 0, 0,0,0, new THREE.MeshPhongMaterial( 0x000000, 0xff5500, 0x555555, 10, 1.0 ) );
+                addMesh( sphere, 1, -200, y2, 0, 0,0,0, new THREE.MeshColorFillMaterial( 0xff5500 ) );
+
+                addMesh( sphere, 1,    0, y1, 0, 0,0,0, new THREE.MeshPhongMaterial( 0x000000, 0xffaa00, 0x555555, 30, 1.0 ) );
+                addMesh( sphere, 1,    0, y2, 0, 0,0,0, new THREE.MeshColorFillMaterial( 0xffaa00 ) );
+
+                addMesh( sphere, 1,  200, y1, 0, 0,0,0, new THREE.MeshPhongMaterial( 0x000000, 0x55ff00, 0x555555, 30, 1.0 ) );
+                addMesh( sphere, 1,  200, y2, 0, 0,0,0, new THREE.MeshColorFillMaterial( 0x55ff00 ) );
+
+                addMesh( sphere, 1,  400, y1, 0, 0,0,0, new THREE.MeshPhongMaterial( 0x000000, 0x0055ff, 0x555555, 30, 1.0 ) );
+                addMesh( sphere, 1,  400, y2, 0, 0,0,0, new THREE.MeshColorFillMaterial( 0x0055ff ) );
+
+                addMesh( sphere, 1,  600, y1, 0, 0,0,0, new THREE.MeshPhongMaterial( 0x000000, 0x5500ff, 0x555555, 30, 1.0 ) );
+                addMesh( sphere, 1,  600, y2, 0, 0,0,0, new THREE.MeshColorFillMaterial( 0x5500ff ) );
+
+                if ( render_gl ) {
+                    try {
+                        webglRenderer = new THREE.WebGLRenderer();
+                        webglRenderer.setSize( SCREEN_WIDTH, SCREEN_HEIGHT );
+                        container.appendChild( webglRenderer.domElement );
+                        has_gl = 1;
+                    }
+                    catch (e) {
+                    }
+                }
+                
+                if( render_canvas ) {
+                    canvasRenderer = new THREE.CanvasRenderer();
+                    canvasRenderer.setSize( SCREEN_WIDTH, SCREEN_HEIGHT );
+                    container.appendChild( canvasRenderer.domElement );
+                }
+
+
+				stats = new Stats();
+				stats.domElement.style.position = 'absolute';
+				stats.domElement.style.top = '0px';
+                stats.domElement.style.zIndex = 100;
+				container.appendChild( stats.domElement );
+                
+                bcanvas.addEventListener("click", toggleCanvas, false);
+                bwebgl.addEventListener("click", toggleWebGL, false);
+
+                function createModel() {
+                    
+                    geometry = new Torus( );
+                    
+                    var s = 80, t = s + 20, y = 200;
+                    
+                    addMesh( geometry, s, -6*t, y, 0, 1.57,0,0, new THREE.MeshPhongMaterial( 0x000000, 0x000000, 0x333333, 10, 1.0 ) );
+                    addMesh( geometry, s, -4*t, y, 0, 1.57,0,0, new THREE.MeshPhongMaterial( 0x030303, 0x888888, 0x333333, 10, 1.0 ) );
+                    addMesh( geometry, s, -2*t, y, 0, 1.57,0,0, new THREE.MeshPhongMaterial( 0x030303, 0x030303, 0xff5500, 10, 1.0 ) );
+                    addMesh( geometry, s,    0, y, 0, 1.57,0,0, new THREE.MeshPhongMaterial( 0x030303, 0x030303, 0xffaa00, 10, 1.0 ) );
+                    addMesh( geometry, s,  2*t, y, 0, 1.57,0,0, new THREE.MeshPhongMaterial( 0x030303, 0x030303, 0x55ff00, 10, 1.0 ) );
+                    addMesh( geometry, s,  4*t, y, 0, 1.57,0,0, new THREE.MeshPhongMaterial( 0x030303, 0x030303, 0x0055ff, 10, 1.0 ) );
+                    addMesh( geometry, s,  6*t, y, 0, 1.57,0,0, new THREE.MeshPhongMaterial( 0x030303, 0x030303, 0x5500ff, 10, 1.0 ) );
+
+                }
+
+                loadAsync( "obj/torus/Torus.js", createModel);
+
+			}
+
+            function loadAsync( url, callback ) {
+                
+                var el = document.createElement( 'script' );
+                el.type = 'text/javascript';
+                el.onload = callback;
+                el.src = url;
+                document.getElementsByTagName("head")[0].appendChild(el);
+
+            }
+
+            
+			function onDocumentMouseMove(event) {
+
+				mouseX = ( event.clientX - windowHalfX );
+				mouseY = ( event.clientY - windowHalfY );
+
+			}
+
+            var r = 0;
+            
+			function loop() {
+
+				camera.position.x += ( mouseX - camera.position.x ) * .05;
+				camera.position.y += ( - mouseY - camera.position.y ) * .05;
+				camera.updateMatrix();
+               
+                
+                /*
+                for(var i=0; i<scene.objects.length; ++i) {
+                    scene.objects[i].rotation.x += 0.0025;                        
+                    scene.objects[i].updateMatrix();
+                }
+                */
+                lightMesh.position.x = 700*Math.cos(r);
+                lightMesh.position.z = 700*Math.sin(r);
+                lightMesh.updateMatrix();
+
+                r += 0.01;
+                
+                
+				if ( render_canvas ) canvasRenderer.render( scene, camera );
+				if ( render_gl && has_gl ) webglRenderer.render( scene, camera );
+
+				stats.update();
+
+			}
+
+            function log(text) {
+            
+                var e = document.getElementById("log");
+                e.innerHTML = text + "<br/>" + e.innerHTML;
+                
+            }
+            
+            function toggleCanvas() {
+            
+                render_canvas = !render_canvas;
+                bcanvas.className = render_canvas ? "button" : "button inactive";
+                
+                render_gl = !render_canvas;
+                bwebgl.className = render_gl ? "button" : "button inactive";
+                
+                if( has_gl )
+                    webglRenderer.domElement.style.display = render_gl ? "block" : "none";
+                
+                canvasRenderer.domElement.style.display = render_canvas ? "block" : "none";
+                
+            }
+            
+            function toggleWebGL() {
+            
+                render_gl = !render_gl;
+                bwebgl.className = render_gl ? "button" : "button inactive";
+                
+                render_canvas = !render_gl;
+                bcanvas.className = render_canvas ? "button" : "button inactive";
+                
+                if( has_gl )
+                    webglRenderer.domElement.style.display = render_gl ? "block" : "none";
+                    
+                canvasRenderer.domElement.style.display = render_canvas ? "block" : "none";
+                
+            }
+		</script>
+
+	</body>
+</html>

+ 1 - 0
examples/test.html

@@ -37,6 +37,7 @@
 		<script type="text/javascript" src="../src/objects/Particle.js"></script>
 		<script type="text/javascript" src="../src/objects/Line.js"></script>
 		<script type="text/javascript" src="../src/materials/LineColorMaterial.js"></script>
+		<script type="text/javascript" src="../src/materials/MeshPhongMaterial.js"></script>
 		<script type="text/javascript" src="../src/materials/MeshBitmapUVMappingMaterial.js"></script>
 		<script type="text/javascript" src="../src/materials/MeshColorFillMaterial.js"></script>
 		<script type="text/javascript" src="../src/materials/MeshColorStrokeMaterial.js"></script>

+ 23 - 0
src/materials/MeshPhongMaterial.js

@@ -0,0 +1,23 @@
+/**
+ * @author alteredq / http://alteredqualia.com/
+ */
+
+THREE.MeshPhongMaterial = function ( ambient, diffuse, specular, shininess, opacity ) {
+
+	this.ambient = new THREE.Color( ( opacity >= 0 ? ( opacity * 0xff ) << 24 : 0xff000000 ) | ambient );
+	this.diffuse = new THREE.Color( ( opacity >= 0 ? ( opacity * 0xff ) << 24 : 0xff000000 ) | diffuse );
+	this.specular = new THREE.Color( ( opacity >= 0 ? ( opacity * 0xff ) << 24 : 0xff000000 ) | specular );
+    this.shininess = shininess;
+    this.opacity = opacity;
+
+	this.toString = function () {
+
+		return 'THREE.MeshPhongMaterial ( <br/>ambient: ' + this.ambient 
+                + ', <br/>diffuse: ' + this.diffuse 
+                + ', <br/>specular: ' + this.specular 
+                + ', <br/>shininess: ' + this.shininess 
+                + ', <br/>opacity: ' + this.opacity + ')';
+
+	};
+
+};

+ 120 - 28
src/renderers/WebGLRenderer.js

@@ -7,7 +7,7 @@ THREE.WebGLRenderer = function () {
 
 	var _canvas = document.createElement( 'canvas' ), 
     _gl, _program,
-	_viewMatrix = new THREE.Matrix4(), _normalMatrix;
+	_modelViewMatrix = new THREE.Matrix4(), _normalMatrix;
 
 	this.domElement = _canvas;
 	this.autoClear = true;
@@ -16,7 +16,7 @@ THREE.WebGLRenderer = function () {
 	initProgram();
 
     // material constants used in shader
-    var COLORFILL = 0, COLORSTROKE = 1, FACECOLORFILL = 2, FACECOLORSTROKE = 3, BITMAP = 4;
+    var COLORFILL = 0, COLORSTROKE = 1, FACECOLORFILL = 2, FACECOLORSTROKE = 3, BITMAP = 4, PHONG = 5;
     
 	this.setSize = function ( width, height ) {
 
@@ -205,14 +205,6 @@ THREE.WebGLRenderer = function () {
             return;
 
         }
-
-        /*
-        log( "vertices: " + vertexArray.length/3 );
-        log( "faces: " + faceArray.length/3 );
-        log( "normals: " + normalArray.length/3 );
-        log( "colors: " + colorArray.length/4 );
-        log( "uvs: " + uvArray.length/2 );
-        */
         
         materialFace.__webGLVertexBuffer = _gl.createBuffer();
         _gl.bindBuffer( _gl.ARRAY_BUFFER, materialFace.__webGLVertexBuffer );
@@ -245,7 +237,7 @@ THREE.WebGLRenderer = function () {
     
     this.renderMesh = function ( object, camera ) {
         
-        var m, ml, mf, material, materialFace, fi, lineWidth;
+        var m, ml, mf, material, materialFace, fi, lineWidth, mAmbient, mDiffuse, mSpecular;
 
         // create separate VBOs per material
         for (var mf in object.materialFaces ) {
@@ -280,7 +272,21 @@ THREE.WebGLRenderer = function () {
                     
                 }
                 
-                if ( material instanceof THREE.MeshColorFillMaterial ) {
+                if ( material instanceof THREE.MeshPhongMaterial ) {
+
+                    mAmbient  = material.ambient;
+                    mDiffuse  = material.diffuse;
+                    mSpecular = material.specular;
+                    
+                    _gl.uniform4f( _program.mAmbient,  mAmbient.r,  mAmbient.g,  mAmbient.b,  material.opacity );
+                    _gl.uniform4f( _program.mDiffuse,  mDiffuse.r,  mDiffuse.g,  mDiffuse.b,  material.opacity );
+                    _gl.uniform4f( _program.mSpecular, mSpecular.r, mSpecular.g, mSpecular.b, material.opacity );
+                    
+                    _gl.uniform1f( _program.mShininess, material.shininess );
+                    
+                    _gl.uniform1i( _program.material, PHONG );
+                    
+                } else if ( material instanceof THREE.MeshColorFillMaterial ) {
 
                     color = material.color;
                     _gl.uniform4f( _program.uniformColor,  color.r * color.a, color.g * color.a, color.b * color.a, color.a );
@@ -362,7 +368,8 @@ THREE.WebGLRenderer = function () {
 
                 if ( material instanceof THREE.MeshBitmapUVMappingMaterial || 
                      material instanceof THREE.MeshFaceColorFillMaterial ||
-                     material instanceof THREE.MeshColorFillMaterial ) {
+                     material instanceof THREE.MeshColorFillMaterial ||
+                     material instanceof THREE.MeshPhongMaterial ) {
                     
                     _gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, materialFace.__webGLFaceBuffer );
                     _gl.drawElements( _gl.TRIANGLES, materialFace.__webGLFaceCount, _gl.UNSIGNED_SHORT, 0 );
@@ -389,15 +396,18 @@ THREE.WebGLRenderer = function () {
         
         object.autoUpdateMatrix && object.updateMatrix();
 
-        _viewMatrix.multiply( camera.matrix, object.matrix );
+        _modelViewMatrix.multiply( camera.matrix, object.matrix );
 
-        _program.viewMatrixArray = new Float32Array( _viewMatrix.flatten() );
+        _program.viewMatrixArray = new Float32Array( camera.matrix.flatten() );
+        _program.modelViewMatrixArray = new Float32Array( _modelViewMatrix.flatten() );
         _program.projectionMatrixArray = new Float32Array( camera.projectionMatrix.flatten() );
 
-        _normalMatrix = THREE.Matrix4.makeInvert3x3( object.matrix ).transpose();
+        //_normalMatrix = THREE.Matrix4.makeInvert3x3( object.matrix ).transpose();
+        _normalMatrix = THREE.Matrix4.makeInvert3x3( _modelViewMatrix ).transpose();
         _program.normalMatrixArray = new Float32Array( _normalMatrix.m );
         
         _gl.uniformMatrix4fv( _program.viewMatrix, false, _program.viewMatrixArray );
+        _gl.uniformMatrix4fv( _program.modelViewMatrix, false, _program.modelViewMatrixArray );
         _gl.uniformMatrix4fv( _program.projectionMatrix, false, _program.projectionMatrixArray );
         _gl.uniformMatrix3fv( _program.normalMatrix, false, _program.normalMatrixArray );
         _gl.uniformMatrix4fv( _program.objMatrix, false, new Float32Array( object.matrix.flatten() ) );
@@ -407,7 +417,8 @@ THREE.WebGLRenderer = function () {
 	this.render = function ( scene, camera ) {
         
         camera.autoUpdateMatrix && camera.updateMatrix();
-
+        _gl.uniform3f( _program.cameraPosition, camera.position.x, camera.position.y, camera.position.z );
+        
         var o, ol, object;
 
 		if ( this.autoClear ) {
@@ -507,23 +518,77 @@ THREE.WebGLRenderer = function () {
 
             "varying vec3 vNormal;",
         
-            "uniform int material;", // 0 - ColorFill, 1 - ColorStroke, 2 - FaceColorFill, 3 - FaceColorStroke, 4 - Bitmap
+            "uniform int material;", // 0 - ColorFill, 1 - ColorStroke, 2 - FaceColorFill, 3 - FaceColorStroke, 4 - Bitmap, 5 - Phong
+
+            "uniform vec4 mAmbient;",
+			"uniform vec4 mDiffuse;",
+			"uniform vec4 mSpecular;",
+            "uniform float mShininess;",
+
+            "varying vec3 pLightVectorPoint;",
+            "varying vec3 pLightVectorDirection;",
+            "varying vec3 pViewPosition;",
 
 			"void main(){",
-                "if(material==4) {", // Bitmap: texture
+                
+                // Blinn-Phong
+                // based on o3d example
+                "if(material==5) { ", 
+                    "vec3 lightVectorPoint = normalize(pLightVectorPoint);",
+                    "vec3 lightVectorDir = normalize(pLightVectorDirection);",
+                    
+                    "vec3 normal = normalize(vNormal);",
+                    "vec3 viewPosition = normalize(pViewPosition);",
+                    
+                    "vec3 halfVectorPoint = normalize(pLightVectorPoint + pViewPosition);",
+                    
+                    "float dotNormalHalfPoint = dot(normal, halfVectorPoint);",
+
+                    "float ambientCompPoint = 1.0;",
+                    "float diffuseCompPoint = max(dot(normal, lightVectorPoint), 0.0);",
+                    "float specularCompPoint = pow(dotNormalHalfPoint, mShininess);",
+                    //"float specularCompPoint = dot(normal, lightVectorPoint) < 0.0 || dotNormalHalfPoint < 0.0 ? 0.0 : pow(dotNormalHalfPoint, mShininess);",
+
+                    "vec4 ambientPoint  = mAmbient * ambientCompPoint;",
+                    "vec4 diffusePoint  = mDiffuse * diffuseCompPoint;",
+                    "vec4 specularPoint = mSpecular * specularCompPoint;",
+
+                    "vec3 halfVectorDir = normalize(pLightVectorDirection + pViewPosition);",
+                    
+                    "float dotNormalHalfDir = dot(normal, halfVectorDir);",
+
+                    "float ambientCompDir = 1.0;",
+                    "float diffuseCompDir = max(dot(normal, lightVectorDir), 0.0);",
+                    "float specularCompDir = pow(dotNormalHalfDir, mShininess);",
+                    
+                    "vec4 ambientDir  = mAmbient * ambientCompDir;",
+                    "vec4 diffuseDir  = mDiffuse * diffuseCompDir;",
+                    "vec4 specularDir = mSpecular * specularCompDir;",
+                    
+                    "vec4 pointLight = ambientPoint + diffusePoint + specularPoint;",
+                    "vec4 dirLight = ambientDir + diffuseDir + specularDir;",
+                    
+                    "gl_FragColor = vec4((pointLight.xyz + dirLight.xyz) * lightWeighting, 1.0);",                    
+                    
+                // Bitmap: texture
+                "} else if(material==4) {", 
                     "vec4 texelColor = texture2D(diffuse, vertexUv);",
                     "gl_FragColor = vec4(texelColor.rgb * lightWeighting, texelColor.a);",
                 
-                "} else if(material==3) {", // FaceColorStroke: wireframe using vertex color 
+                // FaceColorStroke: wireframe using vertex color 
+                "} else if(material==3) {", 
                     "gl_FragColor = vec4(vertexColor.rgb * lightWeighting, vertexColor.a);",
                 
-                "} else if(material==2) {", // FaceColorFill: triangle using vertex color
+                // FaceColorFill: triangle using vertex color
+                "} else if(material==2) {", 
                     "gl_FragColor = vec4(vertexColor.rgb * lightWeighting, vertexColor.a);",
                 
-                "} else if(material==1) {", // ColorStroke: wireframe using uniform color
+                // ColorStroke: wireframe using uniform color
+                "} else if(material==1) {", 
                     "gl_FragColor = vec4(uniformColor.rgb * lightWeighting, uniformColor.a);",
                 
-                "} else {", // ColorFill: triangle using uniform color
+                // ColorFill: triangle using uniform color
+                "} else {", 
                     "gl_FragColor = vec4(uniformColor.rgb * lightWeighting, uniformColor.a);",
                     //"gl_FragColor = vec4(vNormal, 1.0);",
                 "}",
@@ -544,9 +609,10 @@ THREE.WebGLRenderer = function () {
 			"uniform vec3 pointColor;",
 			"uniform vec3 pointPosition;",
 
+			"uniform mat4 objMatrix;",
 			"uniform mat4 viewMatrix;",
+			"uniform mat4 modelViewMatrix;",
 			"uniform mat4 projectionMatrix;",
-			"uniform mat4 objMatrix;",
 			"uniform mat3 normalMatrix;",
 			
             "varying vec4 vertexColor;",
@@ -555,16 +621,33 @@ THREE.WebGLRenderer = function () {
 
             "varying vec3 vNormal;",
             
+            "varying vec3 pLightVectorPoint;",
+            "varying vec3 pLightVectorDirection;",
+            "varying vec3 pViewPosition;",
+            
+            "uniform vec3 cameraPosition;",
+            
 			"void main(void) {",
-                "vec4 mvPosition = viewMatrix * vec4( position, 1.0 );",
-                "vec4 mPosition = objMatrix * vec4( position, 1.0 );",
+
+                "vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );",
                 "vec3 transformedNormal = normalize(normalMatrix * normal);",
 
+                // Blinn-Phong
+                "vec4 lPosition = viewMatrix * vec4( pointPosition, 1.0 );",
+                "vec4 lDirection = viewMatrix * vec4( lightingDirection, 0.0 );",
+                
+                "pLightVectorPoint = normalize(pointPosition.xyz - position.xyz);",
+                "pLightVectorDirection = normalize(lDirection.xyz);",
+                
+                "vec4 mPosition = objMatrix * vec4( position, 1.0 );",                
+                "pViewPosition = cameraPosition - mPosition.xyz;",
+
                 "if(!enableLighting) {",
                     "lightWeighting = vec3(1.0, 1.0, 1.0);",
+                    
                 "} else {",
-                    "vec3 pointLight = normalize(pointPosition.xyz - mPosition.xyz);",
-                    "float directionalLightWeighting = max(dot(transformedNormal, normalize(lightingDirection)), 0.0);",
+                    "vec3 pointLight = normalize(lPosition.xyz - mvPosition.xyz);",
+                    "float directionalLightWeighting = max(dot(transformedNormal, normalize(lDirection.xyz)), 0.0);",
                     "float pointLightWeighting = max(dot(transformedNormal, pointLight), 0.0);",
                     "lightWeighting = ambientColor + directionalColor * directionalLightWeighting + pointColor * pointLightWeighting;",
                 "}",
@@ -588,6 +671,7 @@ THREE.WebGLRenderer = function () {
 		_gl.useProgram( _program );
 
 		_program.viewMatrix = _gl.getUniformLocation( _program, "viewMatrix" );
+		_program.modelViewMatrix = _gl.getUniformLocation( _program, "modelViewMatrix" );
 		_program.projectionMatrix = _gl.getUniformLocation( _program, "projectionMatrix" );
 		_program.normalMatrix = _gl.getUniformLocation( _program, "normalMatrix" );
 		_program.objMatrix = _gl.getUniformLocation( _program, "objMatrix" );
@@ -603,6 +687,13 @@ THREE.WebGLRenderer = function () {
         _program.material = _gl.getUniformLocation(_program, 'material');
         _program.uniformColor = _gl.getUniformLocation(_program, 'uniformColor');
 
+        _program.mAmbient = _gl.getUniformLocation(_program, 'mAmbient');
+        _program.mDiffuse = _gl.getUniformLocation(_program, 'mDiffuse');
+        _program.mSpecular = _gl.getUniformLocation(_program, 'mSpecular');
+        _program.mShininess = _gl.getUniformLocation(_program, 'mShininess');
+        
+        _program.cameraPosition = _gl.getUniformLocation(_program, 'cameraPosition');
+
 		_program.color = _gl.getAttribLocation( _program, "color" );
 		_gl.enableVertexAttribArray( _program.color );
 
@@ -619,6 +710,7 @@ THREE.WebGLRenderer = function () {
         _gl.uniform1i( _program.diffuse,  0 );
 
 		_program.viewMatrixArray = new Float32Array(16);
+		_program.modelViewMatrixArray = new Float32Array(16);
 		_program.projectionMatrixArray = new Float32Array(16);
 
 	}

+ 1 - 0
utils/Builder.py

@@ -28,6 +28,7 @@ files.append('objects/Particle.js')
 files.append('objects/Line.js')
 files.append('objects/Mesh.js')
 files.append('materials/LineColorMaterial.js')
+files.append('materials/MeshPhongMaterial.js')
 files.append('materials/MeshBitmapUVMappingMaterial.js')
 files.append('materials/MeshColorFillMaterial.js')
 files.append('materials/MeshColorStrokeMaterial.js')

+ 1 - 0
utils/BuilderCanvas.py

@@ -28,6 +28,7 @@ files.append('objects/Particle.js')
 files.append('objects/Line.js')
 files.append('objects/Mesh.js')
 files.append('materials/LineColorMaterial.js')
+files.append('materials/MeshPhongMaterial.js')
 files.append('materials/MeshBitmapUVMappingMaterial.js')
 files.append('materials/MeshColorFillMaterial.js')
 files.append('materials/MeshColorStrokeMaterial.js')

+ 1 - 0
utils/BuilderDebug.py

@@ -28,6 +28,7 @@ files.append('objects/Particle.js')
 files.append('objects/Line.js')
 files.append('objects/Mesh.js')
 files.append('materials/LineColorMaterial.js')
+files.append('materials/MeshPhongMaterial.js')
 files.append('materials/MeshBitmapUVMappingMaterial.js')
 files.append('materials/MeshColorFillMaterial.js')
 files.append('materials/MeshColorStrokeMaterial.js')

+ 1 - 0
utils/BuilderWebGL.py

@@ -28,6 +28,7 @@ files.append('objects/Particle.js')
 files.append('objects/Line.js')
 files.append('objects/Mesh.js')
 files.append('materials/LineColorMaterial.js')
+files.append('materials/MeshPhongMaterial.js')
 files.append('materials/MeshBitmapUVMappingMaterial.js')
 files.append('materials/MeshColorFillMaterial.js')
 files.append('materials/MeshColorStrokeMaterial.js')

+ 1 - 1
utils/REVISION

@@ -1 +1 @@
-23
+24

Algúns arquivos non se mostraron porque demasiados arquivos cambiaron neste cambio