Преглед на файлове

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 преди 14 години
родител
ревизия
b6904f3d72

Файловите разлики са ограничени, защото са твърде много
+ 0 - 1
build/Three.js


Файловите разлики са ограничени, защото са твърде много
+ 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

Някои файлове не бяха показани, защото твърде много файлове са промени