Browse Source

Merge remote-tracking branch 'remotes/mrdoob/dev' into feature/typefaceNodeError

Arthur Silber 10 years ago
parent
commit
7b97f37980

+ 64 - 29
editor/examples/arkanoid.app.json

@@ -1,26 +1,29 @@
 {
 {
+	"project": {
+		"vr": false
+	},
 	"camera": {
 	"camera": {
 		"metadata": {
 		"metadata": {
-			"version": 4.3,
+			"version": 4.4,
 			"type": "Object",
 			"type": "Object",
-			"generator": "ObjectExporter"
+			"generator": "Object3D.toJSON"
 		},
 		},
 		"object": {
 		"object": {
-			"uuid": "8EFB9C06-6312-4975-B04A-C9E4549BE348",
+			"uuid": "E41E9F54-8B31-4D1F-8D09-AF5E802E9A22",
 			"type": "PerspectiveCamera",
 			"type": "PerspectiveCamera",
 			"name": "Camera",
 			"name": "Camera",
+			"matrix": [0.9392361044883728,-2.8092810300250903e-9,-0.3432718515396118,0,-0.14778217673301697,0.902585506439209,-0.404351145029068,0,0.3098321855068207,0.43051064014434814,0.847740888595581,0,142.32125854492188,202.75485229492188,389.40936279296875,1],
 			"fov": 50,
 			"fov": 50,
 			"aspect": 1.536388140161725,
 			"aspect": 1.536388140161725,
 			"near": 0.1,
 			"near": 0.1,
-			"far": 100000,
-			"matrix": [0.9392361044883728,-1.2050817232989175e-8,-0.34327182173728943,0,-0.15080472826957703,0.8983326554298401,-0.41262128949165344,0,0.30837228894233704,0.4393158257007599,0.8437464833259583,0,142.32125854492188,202.75485229492188,389.40936279296875,1]
+			"far": 100000
 		}
 		}
 	},
 	},
 	"scene": {
 	"scene": {
 		"metadata": {
 		"metadata": {
-			"version": 4.3,
+			"version": 4.4,
 			"type": "Object",
 			"type": "Object",
-			"generator": "ObjectExporter"
+			"generator": "Object3D.toJSON"
 		},
 		},
 		"geometries": [
 		"geometries": [
 			{
 			{
@@ -31,6 +34,16 @@
 				"widthSegments": 1,
 				"widthSegments": 1,
 				"heightSegments": 1
 				"heightSegments": 1
 			},
 			},
+			{
+				"uuid": "EEDF0A9A-D174-44E4-9C2F-A2F5BB8BE7F5",
+				"type": "CylinderGeometry",
+				"radiusTop": 5,
+				"radiusBottom": 5,
+				"height": 20,
+				"radialSegments": 32,
+				"heightSegments": 1,
+				"openEnded": false
+			},
 			{
 			{
 				"uuid": "7149652B-DBD7-4CB7-A600-27A9AC005C95",
 				"uuid": "7149652B-DBD7-4CB7-A600-27A9AC005C95",
 				"type": "BoxGeometry",
 				"type": "BoxGeometry",
@@ -53,9 +66,9 @@
 				"thetaLength": 3.14
 				"thetaLength": 3.14
 			},
 			},
 			{
 			{
-				"uuid": "A1D8B049-74DD-4B08-B5BC-8DCEC9AF0222",
+				"uuid": "EFBF641D-F092-462E-B7FB-0BFAD1591EFC",
 				"type": "BoxGeometry",
 				"type": "BoxGeometry",
-				"width": 40,
+				"width": 20,
 				"height": 10,
 				"height": 10,
 				"depth": 10,
 				"depth": 10,
 				"widthSegments": 1,
 				"widthSegments": 1,
@@ -72,13 +85,19 @@
 				"shininess": 30
 				"shininess": 30
 			},
 			},
 			{
 			{
-				"uuid": "CFBEAD4C-6695-4A99-887B-8161E2947225",
+				"uuid": "3B9DE64D-E1C8-4C24-9F73-3A9E10E3E655",
 				"type": "MeshPhongMaterial",
 				"type": "MeshPhongMaterial",
 				"color": 16777215,
 				"color": 16777215,
 				"emissive": 0,
 				"emissive": 0,
 				"specular": 1118481,
 				"specular": 1118481,
 				"shininess": 30
 				"shininess": 30
 			},
 			},
+			{
+				"uuid": "D98FC4D1-169E-420A-92EA-20E55009A46D",
+				"type": "MeshBasicMaterial",
+				"wireframe": true,
+				"color": 63744
+			},
 			{
 			{
 				"uuid": "043B208C-1F83-42C6-802C-E0E35621C27C",
 				"uuid": "043B208C-1F83-42C6-802C-E0E35621C27C",
 				"type": "MeshPhongMaterial",
 				"type": "MeshPhongMaterial",
@@ -89,11 +108,9 @@
 			},
 			},
 			{
 			{
 				"uuid": "40EC9BDA-91C0-4671-937A-2BCB6DA7EEBB",
 				"uuid": "40EC9BDA-91C0-4671-937A-2BCB6DA7EEBB",
-				"type": "MeshPhongMaterial",
-				"color": 13486790,
-				"emissive": 0,
-				"specular": 1118481,
-				"shininess": 30
+				"type": "MeshBasicMaterial",
+				"wireframe": true,
+				"color": 63744
 			}],
 			}],
 		"object": {
 		"object": {
 			"uuid": "31517222-A9A7-4EAF-B5F6-60751C0BABA3",
 			"uuid": "31517222-A9A7-4EAF-B5F6-60751C0BABA3",
@@ -105,51 +122,69 @@
 					"uuid": "EBBB1E63-6318-4752-AE2E-440A4E0B3EF3",
 					"uuid": "EBBB1E63-6318-4752-AE2E-440A4E0B3EF3",
 					"type": "Mesh",
 					"type": "Mesh",
 					"name": "Ground",
 					"name": "Ground",
+					"matrix": [1,0,0,0,0,0.0007960614748299122,-0.9999997019767761,0,0,0.9999997019767761,0.0007960614748299122,0,0,0,0,1],
 					"geometry": "8F05A1F2-3877-478B-8DFC-F572AC61AB3A",
 					"geometry": "8F05A1F2-3877-478B-8DFC-F572AC61AB3A",
-					"material": "2F69AF3A-DDF5-4BBA-87B5-80159F90DDBF",
-					"matrix": [1,0,0,0,0,0.000796250649727881,-0.9999997019767761,0,0,0.9999997019767761,0.000796250649727881,0,0,0,0,1]
+					"material": "2F69AF3A-DDF5-4BBA-87B5-80159F90DDBF"
 				},
 				},
 				{
 				{
 					"uuid": "6EE2E764-43E0-48E0-85F2-E0C8823C20DC",
 					"uuid": "6EE2E764-43E0-48E0-85F2-E0C8823C20DC",
 					"type": "DirectionalLight",
 					"type": "DirectionalLight",
 					"name": "DirectionalLight 1",
 					"name": "DirectionalLight 1",
+					"matrix": [1,0,0,0,0,1,0,0,0,0,1,0,100,200,150,1],
 					"color": 16777215,
 					"color": 16777215,
-					"intensity": 1,
-					"matrix": [1,0,0,0,0,1,0,0,0,0,1,0,100,200,150,1]
+					"intensity": 1
 				},
 				},
 				{
 				{
 					"uuid": "38219749-1E67-45F2-AB15-E64BA0940CAD",
 					"uuid": "38219749-1E67-45F2-AB15-E64BA0940CAD",
 					"type": "Mesh",
 					"type": "Mesh",
 					"name": "Brick",
 					"name": "Brick",
+					"matrix": [1,0,0,0,0,1,0,0,0,0,1,0,0,5,0,1],
+					"children": [
+						{
+							"uuid": "711A5955-8F17-4A8B-991A-7604D27E6FA0",
+							"type": "Mesh",
+							"name": "Cylinder",
+							"matrix": [0.0007962009985931218,0.0007962677045725286,0.9999995231628418,0,-0.9999997615814209,3.462185702574061e-7,0.0007962677045725286,0,2.210134084634774e-7,-0.9999997615814209,0.0007962008821777999,0,0,0,0,1],
+							"geometry": "EEDF0A9A-D174-44E4-9C2F-A2F5BB8BE7F5",
+							"material": "3B9DE64D-E1C8-4C24-9F73-3A9E10E3E655"
+						}],
 					"geometry": "7149652B-DBD7-4CB7-A600-27A9AC005C95",
 					"geometry": "7149652B-DBD7-4CB7-A600-27A9AC005C95",
-					"material": "CFBEAD4C-6695-4A99-887B-8161E2947225",
-					"matrix": [1,0,0,0,0,1,0,0,0,0,1,0,0,5,0,1]
+					"material": "D98FC4D1-169E-420A-92EA-20E55009A46D"
 				},
 				},
 				{
 				{
 					"uuid": "18FFA67C-F893-4E7A-8A76-8D996DEBE0C6",
 					"uuid": "18FFA67C-F893-4E7A-8A76-8D996DEBE0C6",
 					"type": "Mesh",
 					"type": "Mesh",
 					"name": "Ball",
 					"name": "Ball",
+					"matrix": [1,0,0,0,0,1,0,0,0,0,1,0,0,5,35.54999923706055,1],
 					"geometry": "CABCC711-1331-4D4C-9FF6-409299F10C68",
 					"geometry": "CABCC711-1331-4D4C-9FF6-409299F10C68",
-					"material": "043B208C-1F83-42C6-802C-E0E35621C27C",
-					"matrix": [1,0,0,0,0,1,0,0,0,0,1,0,0,5,35.54999923706055,1]
+					"material": "043B208C-1F83-42C6-802C-E0E35621C27C"
 				},
 				},
 				{
 				{
 					"uuid": "6D660D49-39B8-40C3-95F6-E4E007AA8D79",
 					"uuid": "6D660D49-39B8-40C3-95F6-E4E007AA8D79",
 					"type": "Mesh",
 					"type": "Mesh",
 					"name": "Paddle",
 					"name": "Paddle",
-					"geometry": "A1D8B049-74DD-4B08-B5BC-8DCEC9AF0222",
-					"material": "40EC9BDA-91C0-4671-937A-2BCB6DA7EEBB",
-					"matrix": [1,0,0,0,0,1,0,0,0,0,1,0,0,5,159.54217529296875,1]
+					"matrix": [2,0,0,0,0,1,0,0,0,0,1,0,0,5,159.5399932861328,1],
+					"children": [
+						{
+							"uuid": "4F5F884C-9E1B-45E6-8F1E-4D538A46D8CB",
+							"type": "Mesh",
+							"name": "Cylinder",
+							"matrix": [0.0007962009985931218,0.0007962677045725286,0.9999995231628418,0,-0.9999997615814209,3.462185702574061e-7,0.0007962677045725286,0,2.210134084634774e-7,-0.9999997615814209,0.0007962008821777999,0,0,0,0,1],
+							"geometry": "EEDF0A9A-D174-44E4-9C2F-A2F5BB8BE7F5",
+							"material": "3B9DE64D-E1C8-4C24-9F73-3A9E10E3E655"
+						}],
+					"geometry": "EFBF641D-F092-462E-B7FB-0BFAD1591EFC",
+					"material": "40EC9BDA-91C0-4671-937A-2BCB6DA7EEBB"
 				},
 				},
 				{
 				{
 					"uuid": "B0BEAF69-8B5D-4D87-ADCA-FDE83A02762D",
 					"uuid": "B0BEAF69-8B5D-4D87-ADCA-FDE83A02762D",
 					"type": "PointLight",
 					"type": "PointLight",
 					"name": "PointLight 2",
 					"name": "PointLight 2",
+					"matrix": [1,0,0,0,0,1,0,0,0,0,1,0,-116.54356384277344,69.48957061767578,-206.8248291015625,1],
 					"color": 16777215,
 					"color": 16777215,
 					"intensity": 1,
 					"intensity": 1,
 					"distance": 0,
 					"distance": 0,
-					"decay": 1,
-					"matrix": [1,0,0,0,0,1,0,0,0,0,1,0,-116.54356384277344,69.48957061767578,-206.8248291015625,1]
+					"decay": 1
 				}]
 				}]
 		}
 		}
 	},
 	},
@@ -162,7 +197,7 @@
 		"31517222-A9A7-4EAF-B5F6-60751C0BABA3": [
 		"31517222-A9A7-4EAF-B5F6-60751C0BABA3": [
 			{
 			{
 				"name": "Game Logic",
 				"name": "Game Logic",
-				"source": "var ball = this.getObjectByName( 'Ball' );\n\nvar direction = new THREE.Vector3();\ndirection.x = Math.random() - 0.5;\ndirection.z = - 0.5;\ndirection.normalize();\n\nvar speed = new THREE.Vector3();\n\n//\n\nvar group = new THREE.Group();\nthis.add( group );\n\nvar paddle = this.getObjectByName( 'Paddle' );\ngroup.add( paddle );\n\nvar brick = this.getObjectByName( 'Brick' );\n\nfor ( var j = 0; j < 8; j ++ ) {\n\n\tvar material = new THREE.MeshPhongMaterial( { color: Math.random() * 0xffffff } );\n\n\tfor ( var i = 0; i < 12; i ++ ) {\n\t\t\n\t\tvar object = brick.clone();\n\t\tobject.material = material;\n\t\tobject.position.x = i * 22 - 120;\n\t\tobject.position.z = j * 14 - 120;\n\t\tgroup.add( object );\n\t\t\n\t}\n\t\n}\n\nbrick.visible = false;\n\n//\n\nvar raycaster = new THREE.Raycaster();\n\nfunction update( event ) {\n\t\n\tif ( ball.position.x < - 150 || ball.position.x > 150 ) direction.x = - direction.x;\n\tif ( ball.position.z < - 200 || ball.position.z > 200 ) direction.z = - direction.z;\n\n\tball.position.x = Math.max( - 150, Math.min( 150, ball.position.x ) );\n\tball.position.z = Math.max( - 200, Math.min( 200, ball.position.z ) );\n\t\n\tball.position.add( speed.copy( direction ).multiplyScalar( event.delta / 4 ) );\n\t\n\traycaster.set( ball.position, direction );\n\t\n\tvar intersections = raycaster.intersectObjects( group.children );\n\t\n\tif ( intersections.length > 0 ) {\n\t\n\t\tvar intersection = intersections[ 0 ];\n\t\t\n\t\tif ( intersection.distance < 5 ) {\n\t\t\t\n\t\t\tif ( intersection.object !== paddle ) {\n\n\t\t\t\tgroup.remove( intersection.object );\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\tdirection.reflect( intersection.face.normal );\n\t\t\t\n\t\t}\n\t\t\n\t}\n\n}"
+				"source": "var ball = this.getObjectByName( 'Ball' );\n\nvar direction = new THREE.Vector3();\ndirection.x = Math.random() - 0.5;\ndirection.z = - 0.5;\ndirection.normalize();\n\nvar speed = new THREE.Vector3();\n\n//\n\nvar group = new THREE.Group();\nthis.add( group );\n\nvar paddle = this.getObjectByName( 'Paddle' );\npaddle.material.visible = false;\ngroup.add( paddle );\n\nvar brick = this.getObjectByName( 'Brick' );\n\nfor ( var j = 0; j < 8; j ++ ) {\n\n\tvar material = new THREE.MeshPhongMaterial( { color: Math.random() * 0xffffff } );\n\n\tfor ( var i = 0; i < 12; i ++ ) {\n\t\t\n\t\tvar object = brick.clone();\n\t\tobject.position.x = i * 22 - 120;\n\t\tobject.position.z = j * 14 - 120;\n\t\tgroup.add( object );\n\n\t\tvar cylinder = object.getObjectByName( 'Cylinder' );\n\t\tcylinder.material = material;\n\n\t}\n\t\n}\n\nbrick.visible = false;\nbrick.material.visible = false;\n\n//\n\nvar raycaster = new THREE.Raycaster();\n\nfunction update( event ) {\n\t\n\tif ( ball.position.x < - 150 || ball.position.x > 150 ) direction.x = - direction.x;\n\tif ( ball.position.z < - 200 || ball.position.z > 200 ) direction.z = - direction.z;\n\n\tball.position.x = Math.max( - 150, Math.min( 150, ball.position.x ) );\n\tball.position.z = Math.max( - 200, Math.min( 200, ball.position.z ) );\n\t\n\tball.position.add( speed.copy( direction ).multiplyScalar( event.delta / 4 ) );\n\t\n\traycaster.set( ball.position, direction );\n\t\n\tvar intersections = raycaster.intersectObjects( group.children );\n\t\n\tif ( intersections.length > 0 ) {\n\t\n\t\tvar intersection = intersections[ 0 ];\n\t\t\n\t\tif ( intersection.distance < 5 ) {\n\t\t\t\n\t\t\tif ( intersection.object !== paddle ) {\n\n\t\t\t\tgroup.remove( intersection.object );\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\tdirection.reflect( intersection.face.normal );\n\t\t\t\n\t\t}\n\t\t\n\t}\n\n}"
 			}]
 			}]
 	}
 	}
 }
 }

+ 4 - 30
editor/js/Sidebar.Geometry.js

@@ -146,42 +146,16 @@ Sidebar.Geometry = function ( editor ) {
 
 
 			parameters.clear();
 			parameters.clear();
 
 
-			if ( geometry instanceof THREE.BoxGeometry ) {
+			if ( Sidebar.Geometry[ geometry.type ] !== undefined ) {
 
 
-				parameters.add( new Sidebar.Geometry.BoxGeometry( signals, object ) );
+				parameters.add( new Sidebar.Geometry[ geometry.type ]( signals, object ) );
 
 
-			} else if ( geometry instanceof THREE.CircleGeometry ) {
+			} else {
 
 
-				parameters.add( new Sidebar.Geometry.CircleGeometry( signals, object ) );
-
-			} else if ( geometry instanceof THREE.CylinderGeometry ) {
-
-				parameters.add( new Sidebar.Geometry.CylinderGeometry( signals, object ) );
-
-			} else if ( geometry instanceof THREE.SphereGeometry ) {
-
-				parameters.add( new Sidebar.Geometry.SphereGeometry( signals, object ) );
-
-			} else if ( geometry instanceof THREE.IcosahedronGeometry ) {
-
-				parameters.add( new Sidebar.Geometry.IcosahedronGeometry( signals, object ) );
-
-			} else if ( geometry instanceof THREE.PlaneGeometry ) {
-
-				parameters.add( new Sidebar.Geometry.PlaneGeometry( signals, object ) );
-
-			} else if ( geometry instanceof THREE.TorusGeometry ) {
-
-				parameters.add( new Sidebar.Geometry.TorusGeometry( signals, object ) );
-
-			} else if ( geometry instanceof THREE.TorusKnotGeometry ) {
-
-				parameters.add( new Sidebar.Geometry.TorusKnotGeometry( signals, object ) );
+				parameters.add( new Sidebar.Geometry.Modifiers( signals, object ) );
 
 
 			}
 			}
 
 
-			parameters.add( new Sidebar.Geometry.Modifiers( signals, object ) );
-
 		} else {
 		} else {
 
 
 			container.setDisplay( 'none' );
 			container.setDisplay( 'none' );

+ 1 - 1
examples/webgl_animation_cloth.html

@@ -291,7 +291,7 @@
 				renderer.gammaInput = true;
 				renderer.gammaInput = true;
 				renderer.gammaOutput = true;
 				renderer.gammaOutput = true;
 
 
-				renderer.shadowMapEnabled = true;
+				renderer.shadowMap.enabled = true;
 
 
 				//
 				//
 
 

+ 1 - 1
examples/webgl_animation_skinning_morph.html

@@ -144,7 +144,7 @@
 				renderer.gammaInput = true;
 				renderer.gammaInput = true;
 				renderer.gammaOutput = true;
 				renderer.gammaOutput = true;
 
 
-				renderer.shadowMapEnabled = true;
+				renderer.shadowMap.enabled = true;
 
 
 
 
 				// STATS
 				// STATS

+ 2 - 2
examples/webgl_interactive_draggablecubes.html

@@ -112,8 +112,8 @@
 				renderer.setSize( window.innerWidth, window.innerHeight );
 				renderer.setSize( window.innerWidth, window.innerHeight );
 				renderer.sortObjects = false;
 				renderer.sortObjects = false;
 
 
-				renderer.shadowMapEnabled = true;
-				renderer.shadowMapType = THREE.PCFShadowMap;
+				renderer.shadowMap.enabled = true;
+				renderer.shadowMap.type = THREE.PCFShadowMap;
 
 
 				container.appendChild( renderer.domElement );
 				container.appendChild( renderer.domElement );
 
 

+ 2 - 7
examples/webgl_lensflares.html

@@ -116,12 +116,7 @@
 
 
 				// lights
 				// lights
 
 
-				var ambient = new THREE.AmbientLight( 0xffffff );
-				ambient.color.setHSL( 0.1, 0.3, 0.2 );
-				scene.add( ambient );
-
-
-				var dirLight = new THREE.DirectionalLight( 0xffffff, 0.125 );
+				var dirLight = new THREE.DirectionalLight( 0xffffff, 0.05 );
 				dirLight.position.set( 0, -1, 0 ).normalize();
 				dirLight.position.set( 0, -1, 0 ).normalize();
 				scene.add( dirLight );
 				scene.add( dirLight );
 
 
@@ -139,7 +134,7 @@
 
 
 				function addLight( h, s, l, x, y, z ) {
 				function addLight( h, s, l, x, y, z ) {
 
 
-					var light = new THREE.PointLight( 0xffffff, 1.5, 4500 );
+					var light = new THREE.PointLight( 0xffffff, 1.5, 2000 );
 					light.color.setHSL( h, s, l );
 					light.color.setHSL( h, s, l );
 					light.position.set( x, y, z );
 					light.position.set( x, y, z );
 					scene.add( light );
 					scene.add( light );

+ 2 - 2
examples/webgl_lights_hemisphere.html

@@ -233,8 +233,8 @@
 				renderer.gammaInput = true;
 				renderer.gammaInput = true;
 				renderer.gammaOutput = true;
 				renderer.gammaOutput = true;
 
 
-				renderer.shadowMapEnabled = true;
-				renderer.shadowMapCullFace = THREE.CullFaceBack;
+				renderer.shadowMap.enabled = true;
+				renderer.shadowMap.cullFace = THREE.CullFaceBack;
 
 
 				// STATS
 				// STATS
 
 

+ 1 - 1
examples/webgl_loader_ctm.html

@@ -125,7 +125,7 @@
 				renderer.gammaInput = true;
 				renderer.gammaInput = true;
 				renderer.gammaOutput = true;
 				renderer.gammaOutput = true;
 
 
-				renderer.shadowMapEnabled = true;
+				renderer.shadowMap.enabled = true;
 
 
 				// STATS
 				// STATS
 
 

+ 403 - 373
examples/webgl_loader_gltf.html

@@ -1,473 +1,501 @@
 <!doctype html>
 <!doctype html>
 <html lang="en">
 <html lang="en">
-    <head>
-        <title>three.js webgl - glTF</title>
-        <meta charset="utf-8">
-        <meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
-        <style>
-            body {
-                font-family: Monospace;
-                background-color: #EEF;
-                margin: 0px;
-                overflow: hidden;
-            }
-            
-            #info {
+	<head>
+		<title>three.js webgl - glTF</title>
+		<meta charset="utf-8">
+		<meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
+		<style>
+			body {
+				font-family: Monospace;
+				background-color: #EEF;
+				margin: 0px;
+				overflow: hidden;
+			}
+
+			#info {
 				color: #fff;
 				color: #fff;
-                position: absolute;
-                top: 10px;
-                width: 100%;
-                text-align: center;
-                z-index: 100;
-                display:block;
-            }
-            
-            #container {
-            	position: absolute;
-            	top: 0px;
-            	width:100%;
-            	height:100%;
-            	z-index: -1;
-            }
-            
-            #controls {
-            	position:absolute;
-            	width:250px;
-            	bottom:0%;
-            	right:0%;
-            	height:100px;
-            	background-color:White;
-            	opacity:.9;
-            	font: 13px/1.231 "Lucida Grande", Lucida, Verdana, sans-serif;
-            }
-
-            #status {
-            	position:absolute;
-            	width:25%;
-            	left:2%;
-            	top:95%;
-            	height:5%;
-            	opacity:.9;
-            	font: 13px/1.231 "Lucida Grande", Lucida, Verdana, sans-serif;
-            }
-            
-            .control {
-            	position:absolute;
-            	margin-left:12px;
-            	width:100%;
-            	font-weight:bold;
-            }
-                        
-            .controlValue {
-            	position:absolute;
-            	left:36%;
-            	top:0%;
-            }
-            
-            #scenes_control {
-            	position:absolute;
-            	top:8px;
-            }
-
-            #cameras_control {
-            	position:absolute;
-            	top:40px;
-            }
-
-            #animations_control {
-            	position:absolute;
-            	top:72px;
-            }
-
-            #info a, .button { color: #f00; font-weight: bold; text-decoration: underline; cursor: pointer }
-        </style>
-    </head>
-
-    <body>
-        <div id="info">
-			<a href="http://threejs.org" target="_blank">three.js</a> - 
-			<a href="http://gltf.gl/" target="_blank">glTF</a> loader - 
-			<br></br>
-			monster by <a href="http://www.3drt.com/downloads.htm" target="_blank">3drt</a> -
-			COLLADA duck by Sony
-        </div>
-		<div id="container">
+				position: absolute;
+				top: 10px;
+				width: 100%;
+				text-align: center;
+				z-index: 100;
+				display:block;
+			}
+
+			#container {
+				position: absolute;
+				top: 0px;
+				width:100%;
+				height:100%;
+				z-index: -1;
+			}
+
+			#controls {
+				position:absolute;
+				width:250px;
+				bottom:0%;
+				right:0%;
+				height:100px;
+				background-color:White;
+				opacity:.9;
+				font: 13px/1.231 "Lucida Grande", Lucida, Verdana, sans-serif;
+			}
+
+			#status {
+				position:absolute;
+				width:25%;
+				left:2%;
+				top:95%;
+				height:5%;
+				opacity:.9;
+				font: 13px/1.231 "Lucida Grande", Lucida, Verdana, sans-serif;
+			}
+
+			.control {
+				position:absolute;
+				margin-left:12px;
+				width:100%;
+				font-weight:bold;
+			}
+
+			.controlValue {
+				position:absolute;
+				left:36%;
+				top:0%;
+			}
+
+			#scenes_control {
+				position:absolute;
+				top:8px;
+			}
+
+			#cameras_control {
+				position:absolute;
+				top:40px;
+			}
+
+			#animations_control {
+				position:absolute;
+				top:72px;
+			}
+
+			#info a, .button { color: #f00; font-weight: bold; text-decoration: underline; cursor: pointer }
+		</style>
+	</head>
+
+	<body>
+		<div id="info">
+		<a href="http://threejs.org" target="_blank">three.js</a> -
+		<a href="http://gltf.gl/" target="_blank">glTF</a> loader -
+		<br></br>
+		monster by <a href="http://www.3drt.com/downloads.htm" target="_blank">3drt</a> -
+		COLLADA duck by Sony
 		</div>
 		</div>
-		<div id="status">
+	<div id="container">
+	</div>
+	<div id="status">
+	</div>
+	<div id="controls">
+		<div class="control" id="scenes_control">
+		Model
+		<select class="controlValue" id="scenes_list" size="1" onchange="selectScene();" ondblclick="selectScene();">
+		</select>
 		</div>
 		</div>
-		<div id="controls">
-			<div class="control" id="scenes_control">
-				Model
-				<select class="controlValue" id="scenes_list" size="1" onchange="selectScene();" ondblclick="selectScene();">
-				</select>
-			</div>
-			
-			<div class="control" id="cameras_control">
-				Camera
-				<select class="controlValue" id="cameras_list" size="1" onchange="selectCamera();" ondblclick="selectCamera();">
-				</select>
-			</div>
-			<div class="control" id="animations_control">
-				Animations
-				<div class="controlValue"><input type="checkbox" checked onclick="toggleAnimations();">Play</input></div>
-			</div>
+
+		<div class="control" id="cameras_control">
+		Camera
+		<select class="controlValue" id="cameras_list" size="1" onchange="selectCamera();" ondblclick="selectCamera();">
+		</select>
+		</div>
+		<div class="control" id="animations_control">
+		Animations
+		<div class="controlValue"><input type="checkbox" checked onclick="toggleAnimations();">Play</input></div>
 		</div>
 		</div>
-        <script src="../build/three.min.js"></script>
-        <script src="js/controls/OrbitControls.js"></script>
-        <script src="js/loaders/gltf/glTF-parser.js"></script>
-        <script src="js/loaders/gltf/glTFLoader.js"></script>
-        <script src="js/loaders/gltf/glTFLoaderUtils.js"></script>
-        <script src="js/loaders/gltf/glTFAnimation.js"></script>
-
-        <script>
-        	var orbitControls = null;
-            var container, camera, scene, renderer, loader;
-
-            var cameraIndex = 0;
+	</div>
+		<script src="../build/three.min.js"></script>
+		<script src="js/controls/OrbitControls.js"></script>
+		<script src="js/loaders/gltf/glTF-parser.js"></script>
+		<script src="js/loaders/gltf/glTFLoader.js"></script>
+		<script src="js/loaders/gltf/glTFLoaderUtils.js"></script>
+		<script src="js/loaders/gltf/glTFAnimation.js"></script>
+
+		<script>
+			var orbitControls = null;
+			var container, camera, scene, renderer, loader;
+
+			var cameraIndex = 0;
 			var cameras = [];
 			var cameras = [];
 			var cameraNames = [];
 			var cameraNames = [];
 			var defaultCamera = null;
 			var defaultCamera = null;
 			var gltf = null;
 			var gltf = null;
-			
+
 			function onload() {
 			function onload() {
 
 
 				window.addEventListener( 'resize', onWindowResize, false );
 				window.addEventListener( 'resize', onWindowResize, false );
-            	document.addEventListener( 'keypress', 
-            			function(e) { onKeyPress(e); }, false );
-
-                buildSceneList();
-                switchScene(0);
-                animate();
-
-            }
-
-            function initScene(index) {
-                container = document.getElementById( 'container' );
-
-                scene = new THREE.Scene();
-
-                defaultCamera = new THREE.PerspectiveCamera( 45, container.offsetWidth / container.offsetHeight, 1, 20000 );
-                
-                //defaultCamera.up = new THREE.Vector3( 0, 1, 0 );
-                scene.add( defaultCamera );
-                camera = defaultCamera;
-
-                var sceneInfo = sceneList[index];
-
-                var spot1 = null;
-                if (sceneInfo.addLights) {
-                    
-                    var ambient = new THREE.AmbientLight( 0x888888 );
-                    scene.add( ambient );
-
-                	var directionalLight = new THREE.DirectionalLight( 0xdddddd );
-                	directionalLight.position.set( 0, -1, 1 ).normalize();
-                	scene.add( directionalLight );
-                
-	                spot1   = new THREE.SpotLight( 0xffffff, 1 );
-	                spot1.position.set( -100, 200, 100 );
-	                spot1.target.position.set( 0, 0, 0 );
-
-	                if (sceneInfo.shadows) {
-		                
-		                spot1.shadowCameraNear      = 1;
-		                spot1.shadowCameraFar      = 1024;
-		                spot1.castShadow            = true;
-		                spot1.shadowDarkness        = 0.3;
-		                spot1.shadowBias = 0.0001;
-		                spot1.shadowMapWidth = 2048;
-		                spot1.shadowMapHeight = 2048;
-	                }
-	                scene.add( spot1 );
-                }
-				
-                // RENDERER
-
-                renderer = new THREE.WebGLRenderer({antialias:true});
+				document.addEventListener( 'keypress', function(e) { onKeyPress(e); }, false );
+
+				buildSceneList();
+				switchScene(0);
+				animate();
+
+			}
+
+			function initScene(index) {
+
+				container = document.getElementById( 'container' );
+
+				scene = new THREE.Scene();
+
+				defaultCamera = new THREE.PerspectiveCamera( 45, container.offsetWidth / container.offsetHeight, 1, 20000 );
+
+				//defaultCamera.up = new THREE.Vector3( 0, 1, 0 );
+				scene.add( defaultCamera );
+				camera = defaultCamera;
+
+				var sceneInfo = sceneList[index];
+
+				var spot1 = null;
+
+				if (sceneInfo.addLights) {
+
+					var ambient = new THREE.AmbientLight( 0x888888 );
+					scene.add( ambient );
+
+					var directionalLight = new THREE.DirectionalLight( 0xdddddd );
+					directionalLight.position.set( 0, -1, 1 ).normalize();
+					scene.add( directionalLight );
+
+					spot1	 = new THREE.SpotLight( 0xffffff, 1 );
+					spot1.position.set( -100, 200, 100 );
+					spot1.target.position.set( 0, 0, 0 );
+
+					if (sceneInfo.shadows) {
+
+					spot1.shadowCameraNear		= 1;
+					spot1.shadowCameraFar		= 1024;
+					spot1.castShadow			= true;
+					spot1.shadowDarkness		= 0.3;
+					spot1.shadowBias = 0.0001;
+					spot1.shadowMapWidth = 2048;
+					spot1.shadowMapHeight = 2048;
+					}
+					scene.add( spot1 );
+				}
+
+				// RENDERER
+
+				renderer = new THREE.WebGLRenderer({antialias:true});
 				renderer.setPixelRatio( window.devicePixelRatio );
 				renderer.setPixelRatio( window.devicePixelRatio );
-                renderer.setSize( window.innerWidth, window.innerHeight );
+				renderer.setSize( window.innerWidth, window.innerHeight );
 
 
-                if (sceneInfo.shadows) {
-	                renderer.shadowMapEnabled = true;
-	                renderer.shadowMapSoft = true;
-	        		renderer.shadowMapType = THREE.PCFSoftShadowMap;
-                }
-                				
-                container.appendChild( renderer.domElement );
+				if (sceneInfo.shadows) {
+					renderer.shadowMap.enabled = true;
+					renderer.shadowMap.type = THREE.PCFSoftShadowMap;
+				}
+
+				container.appendChild( renderer.domElement );
+
+				var ground = null;
 
 
-                var ground = null;
 				if (sceneInfo.addGround) {
 				if (sceneInfo.addGround) {
-	                var groundMaterial = new THREE.MeshPhongMaterial({
-	                        color: 0xFFFFFF,
-	                        shading: THREE.SmoothShading,
-	                    });
-	                ground = new THREE.Mesh( new THREE.PlaneBufferGeometry(1024, 1024), groundMaterial);
-
-	                if (sceneInfo.shadows) {
-		                ground.receiveShadow = true;
-	                }
-
-	                if (sceneInfo.groundPos) {
-		                ground.position.copy(sceneInfo.groundPos);
-	                }
-	                else {
-		                ground.position.z = -70;
-	                }
-	                ground.rotation.x = -Math.PI / 2;
-	                
-	                scene.add(ground);
+					var groundMaterial = new THREE.MeshPhongMaterial({
+							color: 0xFFFFFF,
+							shading: THREE.SmoothShading,
+						});
+					ground = new THREE.Mesh( new THREE.PlaneBufferGeometry(1024, 1024), groundMaterial);
+
+					if (sceneInfo.shadows) {
+						ground.receiveShadow = true;
+					}
+
+					if (sceneInfo.groundPos) {
+						ground.position.copy(sceneInfo.groundPos);
+					} else {
+						ground.position.z = -70;
+					}
+
+					ground.rotation.x = -Math.PI / 2;
+
+					scene.add(ground);
 				}
 				}
-				
-                loader = new THREE.glTFLoader;
-
-                var loadStartTime = Date.now();
-                var status = document.getElementById("status");
-                status.innerHTML = "Loading...";
-                loader.load( sceneInfo.url, function(data) {
-
-                	gltf = data;
-                	
-                	var object = gltf.scene;
-                	
-                    var loadEndTime = Date.now();
-
-                    var loadTime = (loadEndTime - loadStartTime) / 1000;
-
-                    status.innerHTML = "Load time: " + loadTime.toFixed(2) + " seconds.";
-                    
-                	if (sceneInfo.cameraPos)
-                        defaultCamera.position.copy(sceneInfo.cameraPos);
-
-                	if (sceneInfo.center) {
-                        orbitControls.center.copy(sceneInfo.center);
-                	}
-                    
-                    if (sceneInfo.objectPosition) {
-                        object.position.copy(sceneInfo.objectPosition);
-
-                        if (spot1) {
-	    	                spot1.position.set(sceneInfo.objectPosition.x - 100, sceneInfo.objectPosition.y + 200, sceneInfo.objectPosition.z - 100 );
-    	                	spot1.target.position.copy(sceneInfo.objectPosition);
-                        }
-                    }
-                    
-                    if (sceneInfo.objectRotation)
-                        object.rotation.copy(sceneInfo.objectRotation);
-
-                    if (sceneInfo.objectScale)
-                        object.scale.copy(sceneInfo.objectScale);
-
-                    cameraIndex = 0;
-                    cameras = [];
-                    cameraNames = [];
-                    if (gltf.cameras && gltf.cameras.length)
-                    {
-                        var i, len = gltf.cameras.length;
-                        for (i = 0; i < len; i++)
-                        {
-                            var addCamera = true;
-                            var cameraName = gltf.cameras[i].parent.name;
-                            if (sceneInfo.cameras && !(cameraName in sceneInfo.cameras)) {
-                                    addCamera = false;
-                            }
-
-                            if (addCamera) {
-                            	cameraNames.push(cameraName);
-                            	cameras.push(gltf.cameras[i]);
-                            }
-                        }
-
-                        updateCamerasList();
-                        switchCamera(1);
-                    }
-                    else
-                    {
-                        updateCamerasList();
-                        switchCamera(0);
-                    }
-
-    				if (gltf.animations && gltf.animations.length) {
-    					var i, len = gltf.animations.length;
-	    				for (i = 0; i < len; i++) {
-	    					var animation = gltf.animations[i];
-	    					animation.loop = true;
-	    					// There's .3333 seconds junk at the tail of the Monster animation that
-	    					// keeps it from looping cleanly. Clip it at 3 seconds
-	    					if (sceneInfo.animationTime)
-		    					animation.duration = sceneInfo.animationTime;
-    						animation.play();
-	    				}
-    				}
-                                       
-                    scene.add( object );
-                    onWindowResize();
-
-                });
-
-        		orbitControls = new THREE.OrbitControls(defaultCamera, renderer.domElement);
-            }
+
+				loader = new THREE.glTFLoader;
+
+				var loadStartTime = Date.now();
+				var status = document.getElementById("status");
+				status.innerHTML = "Loading...";
+				loader.load( sceneInfo.url, function(data) {
+
+					gltf = data;
+
+					var object = gltf.scene;
+
+					var loadEndTime = Date.now();
+
+					var loadTime = (loadEndTime - loadStartTime) / 1000;
+
+					status.innerHTML = "Load time: " + loadTime.toFixed(2) + " seconds.";
+
+					if (sceneInfo.cameraPos)
+						defaultCamera.position.copy(sceneInfo.cameraPos);
+
+					if (sceneInfo.center) {
+						orbitControls.center.copy(sceneInfo.center);
+					}
+
+					if (sceneInfo.objectPosition) {
+						object.position.copy(sceneInfo.objectPosition);
+
+						if (spot1) {
+							spot1.position.set(sceneInfo.objectPosition.x - 100, sceneInfo.objectPosition.y + 200, sceneInfo.objectPosition.z - 100 );
+							spot1.target.position.copy(sceneInfo.objectPosition);
+						}
+					}
+
+					if (sceneInfo.objectRotation)
+						object.rotation.copy(sceneInfo.objectRotation);
+
+					if (sceneInfo.objectScale)
+						object.scale.copy(sceneInfo.objectScale);
+
+					cameraIndex = 0;
+					cameras = [];
+					cameraNames = [];
+
+					if (gltf.cameras && gltf.cameras.length) {
+
+						var i, len = gltf.cameras.length;
+
+						for (i = 0; i < len; i++) {
+
+							var addCamera = true;
+							var cameraName = gltf.cameras[i].parent.name;
+
+							if (sceneInfo.cameras && !(cameraName in sceneInfo.cameras)) {
+									addCamera = false;
+							}
+
+							if (addCamera) {
+								cameraNames.push(cameraName);
+								cameras.push(gltf.cameras[i]);
+							}
+
+						}
+
+						updateCamerasList();
+						switchCamera(1);
+
+					} else {
+
+						updateCamerasList();
+						switchCamera(0);
+
+					}
+
+					if (gltf.animations && gltf.animations.length) {
+
+						var i, len = gltf.animations.length;
+						for (i = 0; i < len; i++) {
+							var animation = gltf.animations[i];
+							animation.loop = true;
+							// There's .3333 seconds junk at the tail of the Monster animation that
+							// keeps it from looping cleanly. Clip it at 3 seconds
+							if (sceneInfo.animationTime)
+								animation.duration = sceneInfo.animationTime;
+							animation.play();
+						}
+					}
+
+					scene.add( object );
+					onWindowResize();
+
+				});
+
+			orbitControls = new THREE.OrbitControls(defaultCamera, renderer.domElement);
+
+			}
 
 
 			function onWindowResize() {
 			function onWindowResize() {
 
 
 				defaultCamera.aspect = container.offsetWidth / container.offsetHeight;
 				defaultCamera.aspect = container.offsetWidth / container.offsetHeight;
 				defaultCamera.updateProjectionMatrix();
 				defaultCamera.updateProjectionMatrix();
-				
+
 				var i, len = cameras.length;
 				var i, len = cameras.length;
-				for (i = 0; i < len; i++) // just do it for default
-				{
+
+				for (i = 0; i < len; i++) { // just do it for default
 					cameras[i].aspect = container.offsetWidth / container.offsetHeight;
 					cameras[i].aspect = container.offsetWidth / container.offsetHeight;
 					cameras[i].updateProjectionMatrix();
 					cameras[i].updateProjectionMatrix();
 				}
 				}
-				
+
 				renderer.setSize( window.innerWidth, window.innerHeight );
 				renderer.setSize( window.innerWidth, window.innerHeight );
 
 
 			}
 			}
 
 
-            function animate() {
-                requestAnimationFrame( animate );
-                THREE.glTFAnimator.update();
-                if (cameraIndex == 0)
-                    orbitControls.update();
-                render();
-            }
-
-            function render() {
+			function animate() {
+				requestAnimationFrame( animate );
+				THREE.glTFAnimator.update();
+				if (cameraIndex == 0)
+					orbitControls.update();
+				render();
+			}
 
 
-                renderer.render( scene, camera );
-            }
+			function render() {
+				renderer.render( scene, camera );
+			}
 
 
-            
-			
 			function onKeyPress(event) {
 			function onKeyPress(event) {
+
 				var chr = String.fromCharCode(event.keyCode);
 				var chr = String.fromCharCode(event.keyCode);
-				if (chr == ' ')
-				{
+
+				if (chr == ' ') {
+
 					index = cameraIndex + 1;
 					index = cameraIndex + 1;
 					if (index > cameras.length)
 					if (index > cameras.length)
-						index = 0;
+					index = 0;
 					switchCamera(index);
 					switchCamera(index);
-				}
-				else {
+
+				} else {
+
 					var index = parseInt(chr);
 					var index = parseInt(chr);
-					if (!isNaN(index)  && (index <= cameras.length)) {
+					if (!isNaN(index)	&& (index <= cameras.length)) {
 						switchCamera(index);
 						switchCamera(index);
 					}
 					}
+
 				}
 				}
+
 			}
 			}
 
 
-			var sceneList = 
-				[
-		             { name : "Monster", url : "./models/gltf/monster/monster.json", 
-			                 cameraPos: new THREE.Vector3(30, 10, 70), 
-			                 objectScale: new THREE.Vector3(0.01, 0.01, 0.01),
-			                 objectPosition: new THREE.Vector3(0, 1, 0),
-			                 objectRotation: new THREE.Euler(-Math.PI / 2, 0, -Math.PI / 2),
-			                 animationTime: 3,
-			                 addLights:true,
-			                 shadows:true,
-			                 addGround:true },
-	                 { name : "Duck", url : "./models/gltf/duck/duck.json", 
-		                 cameraPos: new THREE.Vector3(0, 30, -50),
-		                 objectScale: new THREE.Vector3(0.1, 0.1, 0.1),
-		                 addLights:true,
-		                 addGround:true,
-		                 shadows:true },
-     			];
-
-			function buildSceneList()
-			{
+			var sceneList = [
+				{
+					name : "Monster", url : "./models/gltf/monster/monster.json",
+					cameraPos: new THREE.Vector3(30, 10, 70),
+					objectScale: new THREE.Vector3(0.01, 0.01, 0.01),
+					objectPosition: new THREE.Vector3(0, 1, 0),
+					objectRotation: new THREE.Euler(-Math.PI / 2, 0, -Math.PI / 2),
+					animationTime: 3,
+					addLights:true,
+					shadows:true,
+					addGround:true
+				},
+				{
+					name : "Duck", url : "./models/gltf/duck/duck.json",
+					cameraPos: new THREE.Vector3(0, 30, -50),
+					objectScale: new THREE.Vector3(0.1, 0.1, 0.1),
+					addLights:true,
+					addGround:true,
+					shadows:true
+				}
+			];
+
+			function buildSceneList() {
+
 				var elt = document.getElementById('scenes_list');
 				var elt = document.getElementById('scenes_list');
+
 				while( elt.hasChildNodes() ){
 				while( elt.hasChildNodes() ){
-				    elt.removeChild(elt.lastChild);
+					elt.removeChild(elt.lastChild);
 				}
 				}
 
 
 				var i, len = sceneList.length;
 				var i, len = sceneList.length;
-				for (i = 0; i < len; i++)
-				{
+
+				for (i = 0; i < len; i++) {
 					option = document.createElement("option");
 					option = document.createElement("option");
 					option.text=sceneList[i].name;
 					option.text=sceneList[i].name;
 					elt.add(option);
 					elt.add(option);
-				}		
+				}
+
 			}
 			}
-			
-			function switchScene(index)
-			{
+
+			function switchScene(index) {
+
 				cleanup();
 				cleanup();
 				initScene(index);
 				initScene(index);
 				var elt = document.getElementById('scenes_list');
 				var elt = document.getElementById('scenes_list');
 				elt.selectedIndex = index;
 				elt.selectedIndex = index;
+
 			}
 			}
 
 
-			function selectScene()
-			{
-			    var select = document.getElementById("scenes_list");
-			    var index = select.selectedIndex;
-				if (index >= 0)
-				{
+			function selectScene() {
+
+				var select = document.getElementById("scenes_list");
+				var index = select.selectedIndex;
+
+				if (index >= 0) {
 					switchScene(index);
 					switchScene(index);
 				}
 				}
+
 			}
 			}
-			
-			function switchCamera(index)
-			{
+
+			function switchCamera(index) {
+
 				cameraIndex = index;
 				cameraIndex = index;
-				
+
 				if (cameraIndex == 0) {
 				if (cameraIndex == 0) {
 					camera = defaultCamera;
 					camera = defaultCamera;
 				}
 				}
+
 				if (cameraIndex >= 1 && cameraIndex <= cameras.length) {
 				if (cameraIndex >= 1 && cameraIndex <= cameras.length) {
 					camera = cameras[cameraIndex - 1];
 					camera = cameras[cameraIndex - 1];
 				}
 				}
 
 
 				var elt = document.getElementById('cameras_list');
 				var elt = document.getElementById('cameras_list');
-				elt.selectedIndex = cameraIndex;				
+				elt.selectedIndex = cameraIndex;
+
 			}
 			}
-					
+
 			function updateCamerasList() {
 			function updateCamerasList() {
+
 				var elt = document.getElementById('cameras_list');
 				var elt = document.getElementById('cameras_list');
+
 				while( elt.hasChildNodes() ){
 				while( elt.hasChildNodes() ){
-				    elt.removeChild(elt.lastChild);
+					elt.removeChild(elt.lastChild);
 				}
 				}
 
 
 				option = document.createElement("option");
 				option = document.createElement("option");
 				option.text="[default]";
 				option.text="[default]";
 				elt.add(option);
 				elt.add(option);
-				
+
 				var i, len = cameraNames.length;
 				var i, len = cameraNames.length;
-				for (i = 0; i < len; i++)
-				{
+
+				for (i = 0; i < len; i++) {
 					option = document.createElement("option");
 					option = document.createElement("option");
 					option.text=cameraNames[i];
 					option.text=cameraNames[i];
 					elt.add(option);
 					elt.add(option);
-				}		
+				}
+
 			}
 			}
-			
+
 			function selectCamera() {
 			function selectCamera() {
-			    var select = document.getElementById("cameras_list");
-			    var index = select.selectedIndex;
-				if (index >= 0)
-				{
+
+				var select = document.getElementById("cameras_list");
+				var index = select.selectedIndex;
+
+				if (index >= 0) {
 					switchCamera(index);
 					switchCamera(index);
 				}
 				}
+
 			}
 			}
 
 
 			function toggleAnimations() {
 			function toggleAnimations() {
+
 				var i, len = gltf.animations.length;
 				var i, len = gltf.animations.length;
+
 				for (i = 0; i < len; i++) {
 				for (i = 0; i < len; i++) {
+
 					var animation = gltf.animations[i];
 					var animation = gltf.animations[i];
+
 					if (animation.running) {
 					if (animation.running) {
 						animation.stop();
 						animation.stop();
-					}
-					else {
+					} else {
 						animation.play();
 						animation.play();
 					}
 					}
+
 				}
 				}
+
 			}
 			}
 
 
 			function cleanup() {
 			function cleanup() {
 
 
-				if (container && renderer)
-				{
+				if (container && renderer) {
 					container.removeChild(renderer.domElement);
 					container.removeChild(renderer.domElement);
 				}
 				}
 
 
@@ -475,21 +503,23 @@
 				cameras = [];
 				cameras = [];
 				cameraNames = [];
 				cameraNames = [];
 				defaultCamera = null;
 				defaultCamera = null;
-				
+
 				if (!loader || !gltf.animations)
 				if (!loader || !gltf.animations)
 					return;
 					return;
-				
+
 				var i, len = gltf.animations.length;
 				var i, len = gltf.animations.length;
+
 				for (i = 0; i < len; i++) {
 				for (i = 0; i < len; i++) {
 					var animation = gltf.animations[i];
 					var animation = gltf.animations[i];
 					if (animation.running) {
 					if (animation.running) {
 						animation.stop();
 						animation.stop();
 					}
 					}
 				}
 				}
+
 			}
 			}
-			
-            onload();
-        </script>
 
 
-    </body>
+			onload();
+		</script>
+
+	</body>
 </html>
 </html>

+ 2 - 2
examples/webgl_loader_ply.html

@@ -125,8 +125,8 @@
 				renderer.gammaInput = true;
 				renderer.gammaInput = true;
 				renderer.gammaOutput = true;
 				renderer.gammaOutput = true;
 
 
-				renderer.shadowMapEnabled = true;
-				renderer.shadowMapCullFace = THREE.CullFaceBack;
+				renderer.shadowMap.enabled = true;
+				renderer.shadowMap.cullFace = THREE.CullFaceBack;
 
 
 				container.appendChild( renderer.domElement );
 				container.appendChild( renderer.domElement );
 
 

+ 2 - 2
examples/webgl_loader_stl.html

@@ -180,8 +180,8 @@
 				renderer.gammaInput = true;
 				renderer.gammaInput = true;
 				renderer.gammaOutput = true;
 				renderer.gammaOutput = true;
 
 
-				renderer.shadowMapEnabled = true;
-				renderer.shadowMapCullFace = THREE.CullFaceBack;
+				renderer.shadowMap.enabled = true;
+				renderer.shadowMap.cullFace = THREE.CullFaceBack;
 
 
 				container.appendChild( renderer.domElement );
 				container.appendChild( renderer.domElement );
 
 

+ 2 - 2
examples/webgl_loader_utf8.html

@@ -126,8 +126,8 @@
 				renderer.gammaInput = true;
 				renderer.gammaInput = true;
 				renderer.gammaOutput = true;
 				renderer.gammaOutput = true;
 
 
-				renderer.shadowMapEnabled = true;
-				renderer.shadowMapType = THREE.PCFShadowMap;
+				renderer.shadowMap.enabled = true;
+				renderer.shadowMap.type = THREE.PCFShadowMap;
 
 
 				// STATS
 				// STATS
 
 

+ 2 - 2
examples/webgl_materials_bumpmap.html

@@ -182,8 +182,8 @@
 				renderer.setSize( window.innerWidth, window.innerHeight );
 				renderer.setSize( window.innerWidth, window.innerHeight );
 				container.appendChild( renderer.domElement );
 				container.appendChild( renderer.domElement );
 
 
-				renderer.shadowMapEnabled = true;
-				renderer.shadowMapCullFace = THREE.CullFaceBack;
+				renderer.shadowMap.enabled = true;
+				renderer.shadowMap.cullFace = THREE.CullFaceBack;
 
 
 				//
 				//
 
 

+ 2 - 2
examples/webgl_materials_bumpmap_skin.html

@@ -185,8 +185,8 @@
 				renderer.setSize( window.innerWidth, window.innerHeight );
 				renderer.setSize( window.innerWidth, window.innerHeight );
 				container.appendChild( renderer.domElement );
 				container.appendChild( renderer.domElement );
 
 
-				renderer.shadowMapEnabled = true;
-				renderer.shadowMapCullFace = THREE.CullFaceBack;
+				renderer.shadowMap.enabled = true;
+				renderer.shadowMap.cullFace = THREE.CullFaceBack;
 
 
 				renderer.autoClear = false;
 				renderer.autoClear = false;
 
 

+ 4 - 4
examples/webgl_materials_cubemap_dynamic.html

@@ -194,8 +194,8 @@
 
 
 				// SHADOW
 				// SHADOW
 
 
-				renderer.shadowMapCullFace = THREE.CullFaceBack;
-				renderer.shadowMapEnabled = true;
+				renderer.shadowMap.cullFace = THREE.CullFaceBack;
+				renderer.shadowMap.enabled = true;
 
 
 				// STATS
 				// STATS
 
 
@@ -982,7 +982,7 @@
 				// render scene
 				// render scene
 
 
 				renderer.autoClear = false;
 				renderer.autoClear = false;
-				renderer.shadowMapEnabled = true;
+				renderer.shadowMap.enabled = true;
 
 
 				camera.lookAt( cameraTarget );
 				camera.lookAt( cameraTarget );
 
 
@@ -991,7 +991,7 @@
 				renderer.clear();
 				renderer.clear();
 				composer.render( 0.1 );
 				composer.render( 0.1 );
 
 
-				renderer.shadowMapEnabled = false;
+				renderer.shadowMap.enabled = false;
 
 
 			}
 			}
 
 

+ 2 - 2
examples/webgl_materials_normaldisplacementmap.html

@@ -220,8 +220,8 @@
 
 
 				//
 				//
 
 
-				renderer.shadowMapEnabled = true;
-				renderer.shadowMapType = THREE.PCFShadowMap;
+				renderer.shadowMap.enabled = true;
+				renderer.shadowMap.type = THREE.PCFShadowMap;
 
 
 
 
 				//
 				//

+ 1 - 1
examples/webgl_morphtargets_md2.html

@@ -146,7 +146,7 @@
 
 
 				renderer.gammaInput = true;
 				renderer.gammaInput = true;
 				renderer.gammaOutput = true;
 				renderer.gammaOutput = true;
-				renderer.shadowMapEnabled = true;
+				renderer.shadowMap.enabled = true;
 
 
 				// STATS
 				// STATS
 
 

+ 4 - 4
examples/webgl_morphtargets_md2_control.html

@@ -157,11 +157,11 @@
 
 
 				renderer.gammaInput = true;
 				renderer.gammaInput = true;
 				renderer.gammaOutput = true;
 				renderer.gammaOutput = true;
-				renderer.shadowMapEnabled = true;
+				renderer.shadowMap.enabled = true;
 
 
-				//renderer.shadowMapCascade = true;
-				//renderer.shadowMapType = THREE.PCFSoftShadowMap;
-				//renderer.shadowMapDebug = true;
+				//renderer.shadowMap.cascade = true;
+				//renderer.shadowMap.type = THREE.PCFSoftShadowMap;
+				//renderer.shadowMap.debug = true;
 
 
 				// STATS
 				// STATS
 
 

+ 2 - 2
examples/webgl_shading_physical.html

@@ -339,8 +339,8 @@
 
 
 				//
 				//
 
 
-				renderer.shadowMapEnabled = true;
-				renderer.shadowMapType = THREE.PCFSoftShadowMap;
+				renderer.shadowMap.enabled = true;
+				renderer.shadowMap.type = THREE.PCFSoftShadowMap;
 
 
 				//
 				//
 
 

+ 2 - 2
examples/webgl_shadowmap.html

@@ -142,8 +142,8 @@
 
 
 				//
 				//
 
 
-				renderer.shadowMapEnabled = true;
-				renderer.shadowMapType = THREE.PCFShadowMap;
+				renderer.shadowMap.enabled = true;
+				renderer.shadowMap.type = THREE.PCFShadowMap;
 
 
 				// STATS
 				// STATS
 
 

+ 2 - 2
examples/webgl_shadowmap_performance.html

@@ -134,8 +134,8 @@
 
 
 				//
 				//
 
 
-				renderer.shadowMapEnabled = true;
-				renderer.shadowMapType = THREE.PCFSoftShadowMap;
+				renderer.shadowMap.enabled = true;
+				renderer.shadowMap.type = THREE.PCFSoftShadowMap;
 
 
 				// STATS
 				// STATS
 
 

+ 2 - 2
examples/webgl_shadowmap_viewer.html

@@ -163,8 +163,8 @@
 				renderer = new THREE.WebGLRenderer();
 				renderer = new THREE.WebGLRenderer();
 				renderer.setSize( window.innerWidth, window.innerHeight );
 				renderer.setSize( window.innerWidth, window.innerHeight );
 				renderer.setClearColor( 0x000000 );
 				renderer.setClearColor( 0x000000 );
-				renderer.shadowMapEnabled = true;
-				renderer.shadowMapType = THREE.BasicShadowMap;
+				renderer.shadowMap.enabled = true;
+				renderer.shadowMap.type = THREE.BasicShadowMap;
 
 
 				// Mouse control
 				// Mouse control
 				controls = new THREE.OrbitControls( camera, renderer.domElement );
 				controls = new THREE.OrbitControls( camera, renderer.domElement );

+ 2 - 0
src/cameras/CubeCamera.js

@@ -47,6 +47,8 @@ THREE.CubeCamera = function ( near, far, cubeResolution ) {
 
 
 	this.updateCubeMap = function ( renderer, scene ) {
 	this.updateCubeMap = function ( renderer, scene ) {
 
 
+		if ( this.parent === undefined ) this.updateMatrixWorld();
+
 		var renderTarget = this.renderTarget;
 		var renderTarget = this.renderTarget;
 		var generateMipmaps = renderTarget.generateMipmaps;
 		var generateMipmaps = renderTarget.generateMipmaps;
 
 

+ 20 - 20
src/core/BufferAttribute.js

@@ -146,59 +146,59 @@ THREE.BufferAttribute.prototype = {
 
 
 	},
 	},
 
 
-	setX: function ( index, x ) {
-
-		this.array[ index * this.itemSize ] = x;
+	getX: function ( index ) {
 
 
-		return this;
+		return this.array[ index * this.itemSize ];
 
 
 	},
 	},
 
 
-	setY: function ( index, y ) {
+	setX: function ( index, x ) {
 
 
-		this.array[ index * this.itemSize + 1 ] = y;
+		this.array[ index * this.itemSize ] = x;
 
 
 		return this;
 		return this;
 
 
 	},
 	},
 
 
-	setZ: function ( index, z ) {
-
-		this.array[ index * this.itemSize + 2 ] = z;
+	getY: function ( index ) {
 
 
-		return this;
+		return this.array[ index * this.itemSize + 1 ];
 
 
 	},
 	},
 
 
-	setW: function ( index, w ) {
+	setY: function ( index, y ) {
 
 
-		this.array[ index * this.itemSize + 3 ] = w;
+		this.array[ index * this.itemSize + 1 ] = y;
 
 
 		return this;
 		return this;
 
 
 	},
 	},
 
 
-	getX: function ( index ) {
+	getZ: function ( index ) {
 
 
-		return this.array[ index * this.itemSize ];
+		return this.array[ index * this.itemSize + 2 ];
 
 
 	},
 	},
 
 
-	getY: function ( index ) {
+	setZ: function ( index, z ) {
 
 
-		return this.array[ index * this.itemSize + 1 ];
+		this.array[ index * this.itemSize + 2 ] = z;
+
+		return this;
 
 
 	},
 	},
 
 
-	getZ: function ( index ) {
+	getW: function ( index ) {
 
 
-		return this.array[ index * this.itemSize + 2 ];
+		return this.array[ index * this.itemSize + 3 ];
 
 
 	},
 	},
 
 
-	getW: function ( index ) {
+	setW: function ( index, w ) {
 
 
-		return this.array[ index * this.itemSize + 3 ];
+		this.array[ index * this.itemSize + 3 ] = w;
+
+		return this;
 
 
 	},
 	},
 
 

+ 69 - 35
src/core/BufferGeometry.js

@@ -68,7 +68,7 @@ THREE.BufferGeometry.prototype = {
 
 
 		if ( position !== undefined ) {
 		if ( position !== undefined ) {
 
 
-			matrix.applyToBuffer( position );
+			matrix.applyToVector3Array( position.array );
 			position.needsUpdate = true;
 			position.needsUpdate = true;
 
 
 		}
 		}
@@ -79,7 +79,7 @@ THREE.BufferGeometry.prototype = {
 
 
 			var normalMatrix = new THREE.Matrix3().getNormalMatrix( matrix );
 			var normalMatrix = new THREE.Matrix3().getNormalMatrix( matrix );
 
 
-			normalMatrix.applyToBuffer( normal );
+			normalMatrix.applyToVector3Array( normal.array );
 			normal.needsUpdate = true;
 			normal.needsUpdate = true;
 
 
 		}
 		}
@@ -265,10 +265,10 @@ THREE.BufferGeometry.prototype = {
 		var faceVertexUvs = geometry.faceVertexUvs;
 		var faceVertexUvs = geometry.faceVertexUvs;
 		var vertexColors = material.vertexColors;
 		var vertexColors = material.vertexColors;
 
 
-		var hasFaceVertexUv = faceVertexUvs[ 0 ].length > 0;
+		var hasFaceVertexUv = faceVertexUvs[ 0 ] && faceVertexUvs[ 0 ].length > 0;
 		var hasFaceVertexUv2 = faceVertexUvs[ 1 ] && faceVertexUvs[ 1 ].length > 0;
 		var hasFaceVertexUv2 = faceVertexUvs[ 1 ] && faceVertexUvs[ 1 ].length > 0;
 
 
-		var hasFaceVertexNormals = faces[ 0 ].vertexNormals.length == 3;
+		var hasFaceVertexNormals = faces[ 0 ] && faces[ 0 ].vertexNormals.length == 3;
 
 
 		var positions = new Float32Array( faces.length * 3 * 3 );
 		var positions = new Float32Array( faces.length * 3 * 3 );
 		this.addAttribute( 'position', new THREE.BufferAttribute( positions, 3 ) );
 		this.addAttribute( 'position', new THREE.BufferAttribute( positions, 3 ) );
@@ -391,35 +391,55 @@ THREE.BufferGeometry.prototype = {
 
 
 			if ( hasFaceVertexUv === true ) {
 			if ( hasFaceVertexUv === true ) {
 
 
-				var uva = faceVertexUvs[ 0 ][ i ][ 0 ];
-				var uvb = faceVertexUvs[ 0 ][ i ][ 1 ];
-				var uvc = faceVertexUvs[ 0 ][ i ][ 2 ];
+				var vertexUvs = faceVertexUvs[ 0 ][ i ];
 
 
-				uvs[ i2     ] = uva.x;
-				uvs[ i2 + 1 ] = uva.y;
+				if ( vertexUvs !== undefined ) {
 
 
-				uvs[ i2 + 2 ] = uvb.x;
-				uvs[ i2 + 3 ] = uvb.y;
+					var uva = vertexUvs[ 0 ];
+					var uvb = vertexUvs[ 1 ];
+					var uvc = vertexUvs[ 2 ];
 
 
-				uvs[ i2 + 4 ] = uvc.x;
-				uvs[ i2 + 5 ] = uvc.y;
+					uvs[ i2     ] = uva.x;
+					uvs[ i2 + 1 ] = uva.y;
+
+					uvs[ i2 + 2 ] = uvb.x;
+					uvs[ i2 + 3 ] = uvb.y;
+
+					uvs[ i2 + 4 ] = uvc.x;
+					uvs[ i2 + 5 ] = uvc.y;
+
+				} else {
+
+					THREE.warn( 'THREE.BufferGeometry.fromGeometry(): Undefined vertexUv', i )
+
+				}
 
 
 			}
 			}
 
 
 			if ( hasFaceVertexUv2 === true ) {
 			if ( hasFaceVertexUv2 === true ) {
 
 
-				var uva = faceVertexUvs[ 1 ][ i ][ 0 ];
-				var uvb = faceVertexUvs[ 1 ][ i ][ 1 ];
-				var uvc = faceVertexUvs[ 1 ][ i ][ 2 ];
+				var vertexUvs = faceVertexUvs[ 1 ][ i ];
 
 
-				uvs2[ i2     ] = uva.x;
-				uvs2[ i2 + 1 ] = uva.y;
+				if ( vertexUvs !== undefined ) {
+
+					var uva = vertexUvs[ 0 ];
+					var uvb = vertexUvs[ 1 ];
+					var uvc = vertexUvs[ 2 ];
+
+					uvs2[ i2     ] = uva.x;
+					uvs2[ i2 + 1 ] = uva.y;
+
+					uvs2[ i2 + 2 ] = uvb.x;
+					uvs2[ i2 + 3 ] = uvb.y;
+
+					uvs2[ i2 + 4 ] = uvc.x;
+					uvs2[ i2 + 5 ] = uvc.y;
+
+				} else {
 
 
-				uvs2[ i2 + 2 ] = uvb.x;
-				uvs2[ i2 + 3 ] = uvb.y;
+					THREE.warn( 'THREE.BufferGeometry.fromGeometry(): Undefined vertexUv2', i )
 
 
-				uvs2[ i2 + 4 ] = uvc.x;
-				uvs2[ i2 + 5 ] = uvc.y;
+				}
 
 
 			}
 			}
 
 
@@ -466,16 +486,16 @@ THREE.BufferGeometry.prototype = {
 
 
 			}
 			}
 
 
-			var positions = this.attributes.position;
+			var positions = this.attributes.position.array;
 
 
 			if ( positions ) {
 			if ( positions ) {
 
 
 				var bb = this.boundingBox;
 				var bb = this.boundingBox;
 				bb.makeEmpty();
 				bb.makeEmpty();
 
 
-				for ( var i = 0, il = positions.length / positions.itemSize; i < il; i ++ ) {
+				for ( var i = 0, il = positions.length; i < il; i += 3 ) {
 
 
-					vector.set( positions.getX( i ), positions.getY( i ), positions.getZ( i ) );
+					vector.fromArray( positions, i );
 					bb.expandByPoint( vector );
 					bb.expandByPoint( vector );
 
 
 				}
 				}
@@ -491,7 +511,7 @@ THREE.BufferGeometry.prototype = {
 
 
 			if ( isNaN( this.boundingBox.min.x ) || isNaN( this.boundingBox.min.y ) || isNaN( this.boundingBox.min.z ) ) {
 			if ( isNaN( this.boundingBox.min.x ) || isNaN( this.boundingBox.min.y ) || isNaN( this.boundingBox.min.z ) ) {
 
 
-				THREE.error( 'THREE.BufferGeometry.computeBoundingBox: Computed min/max have NaN values. The "position" attribute is likely to have NaN values.' );
+				THREE.error( 'THREE.BufferGeometry.computeBoundingBox: Computed min/max have NaN values. The "position" attribute is likely to have NaN values.', this );
 
 
 			}
 			}
 
 
@@ -512,7 +532,7 @@ THREE.BufferGeometry.prototype = {
 
 
 			}
 			}
 
 
-			var positions = this.attributes.position;
+			var positions = this.attributes.position.array;
 
 
 			if ( positions ) {
 			if ( positions ) {
 
 
@@ -520,9 +540,9 @@ THREE.BufferGeometry.prototype = {
 
 
 				var center = this.boundingSphere.center;
 				var center = this.boundingSphere.center;
 
 
-				for ( var i = 0, il = positions.length / positions.itemSize; i < il; i ++ ) {
+				for ( var i = 0, il = positions.length; i < il; i += 3 ) {
 
 
-					vector.set( positions.getX( i ), positions.getY( i ), positions.getZ( i ) );
+					vector.fromArray( positions, i );
 					box.expandByPoint( vector );
 					box.expandByPoint( vector );
 
 
 				}
 				}
@@ -534,9 +554,9 @@ THREE.BufferGeometry.prototype = {
 
 
 				var maxRadiusSq = 0;
 				var maxRadiusSq = 0;
 
 
-				for ( var i = 0, il = positions.length / positions.itemSize; i < il; i ++ ) {
+				for ( var i = 0, il = positions.length; i < il; i += 3 ) {
 
 
-					vector.set( positions.getX( i ), positions.getY( i ), positions.getZ( i ) );
+					vector.fromArray( positions, i );
 					maxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( vector ) );
 					maxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( vector ) );
 
 
 				}
 				}
@@ -545,7 +565,7 @@ THREE.BufferGeometry.prototype = {
 
 
 				if ( isNaN( this.boundingSphere.radius ) ) {
 				if ( isNaN( this.boundingSphere.radius ) ) {
 
 
-					THREE.error( 'THREE.BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The "position" attribute is likely to have NaN values.' );
+					THREE.error( 'THREE.BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The "position" attribute is likely to have NaN values.', this );
 
 
 				}
 				}
 
 
@@ -1087,11 +1107,25 @@ THREE.BufferGeometry.prototype = {
 
 
 		// standard BufferGeometry serialization
 		// standard BufferGeometry serialization
 
 
-		data.type = this.type;
 		data.uuid = this.uuid;
 		data.uuid = this.uuid;
+		data.type = this.type;
 		if ( this.name !== '' ) data.name = this.name;
 		if ( this.name !== '' ) data.name = this.name;
-		data.data = {};
-		data.data.attributes = {};
+
+		if ( this.parameters !== undefined ) {
+
+			var parameters = this.parameters;
+
+			for ( var key in parameters ) {
+
+				if ( parameters[ key ] !== undefined ) data[ key ] = parameters[ key ];
+
+			}
+
+			return data;
+
+		}
+
+		data.data = { attributes: {} };
 
 
 		var attributes = this.attributes;
 		var attributes = this.attributes;
 		var offsets = this.offsets;
 		var offsets = this.offsets;

+ 1 - 1
src/core/Geometry.js

@@ -803,8 +803,8 @@ THREE.Geometry.prototype = {
 
 
 		// standard Geometry serialization
 		// standard Geometry serialization
 
 
-		data.type = this.type;
 		data.uuid = this.uuid;
 		data.uuid = this.uuid;
+		data.type = this.type;
 		if ( this.name !== '' ) data.name = this.name;
 		if ( this.name !== '' ) data.name = this.name;
 
 
 		if ( this.parameters !== undefined ) {
 		if ( this.parameters !== undefined ) {

+ 9 - 10
src/core/Object3D.js

@@ -597,8 +597,8 @@ THREE.Object3D.prototype = {
 
 
 		// standard Object3D serialization
 		// standard Object3D serialization
 
 
-		data.type = this.type;
 		data.uuid = this.uuid;
 		data.uuid = this.uuid;
+		data.type = this.type;
 		if ( this.name !== '' ) data.name = this.name;
 		if ( this.name !== '' ) data.name = this.name;
 		if ( JSON.stringify( this.userData ) !== '{}' ) data.userData = this.userData;
 		if ( JSON.stringify( this.userData ) !== '{}' ) data.userData = this.userData;
 		if ( this.visible !== true ) data.visible = this.visible;
 		if ( this.visible !== true ) data.visible = this.visible;
@@ -619,23 +619,22 @@ THREE.Object3D.prototype = {
 
 
 		// wrap serialized object with additional data
 		// wrap serialized object with additional data
 
 
-		var output;
+		var output = {};
 
 
 		if ( isRootObject ) {
 		if ( isRootObject ) {
 
 
-			output = {
-				metadata: metadata,
-				geometries: extractFromCache(meta.geometries),
-				materials: extractFromCache(meta.materials),
-				object: data
-			};
+			output.metadata = metadata;
 
 
-		} else {
+			var geometries = extractFromCache( meta.geometries );
+			var materials = extractFromCache( meta.materials );
 
 
-			output = { object: data };
+			if ( geometries.length > 0 ) output.geometries = geometries;
+			if ( materials.length > 0 ) output.materials = materials;
 
 
 		}
 		}
 
 
+		output.object = data;
+
 		return output;
 		return output;
 
 
 		// extract data from the cache hash
 		// extract data from the cache hash

+ 2 - 2
src/extras/geometries/SphereBufferGeometry.js

@@ -40,7 +40,7 @@ THREE.SphereBufferGeometry = function ( radius, widthSegments, heightSegments, p
 	var uvs = new THREE.InterleavedBufferAttribute( vertexBuffer, 2, 6 );
 	var uvs = new THREE.InterleavedBufferAttribute( vertexBuffer, 2, 6 );
 	this.addAttribute( 'uv', uvs );
 	this.addAttribute( 'uv', uvs );
 
 
-	var x, y, u, v, px, py, px, index = 0, vertices = [], normal = new THREE.Vector3();
+	var x, y, u, v, px, py, pz, index = 0, vertices = [], normal = new THREE.Vector3();
 
 
 	for ( y = 0; y <= heightSegments; y ++ ) {
 	for ( y = 0; y <= heightSegments; y ++ ) {
 
 
@@ -73,7 +73,7 @@ THREE.SphereBufferGeometry = function ( radius, widthSegments, heightSegments, p
 	}
 	}
 
 
 	var indices = [];
 	var indices = [];
-	
+	var ul;
 	for ( y = 0, ul = heightSegments - 1; y < ul; y++ ) {
 	for ( y = 0, ul = heightSegments - 1; y < ul; y++ ) {
 
 
 		for ( x = 0; x < widthSegments; x++ ) {
 		for ( x = 0; x < widthSegments; x++ ) {

+ 1 - 1
src/materials/Material.js

@@ -121,8 +121,8 @@ THREE.Material.prototype = {
 		};
 		};
 
 
 		// standard Material serialization
 		// standard Material serialization
-		data.type = this.type;
 		data.uuid = this.uuid;
 		data.uuid = this.uuid;
+		data.type = this.type;
 		if ( this.name !== '' ) data.name = this.name;
 		if ( this.name !== '' ) data.name = this.name;
 
 
 		if ( this.opacity < 1 ) data.opacity = this.opacity;
 		if ( this.opacity < 1 ) data.opacity = this.opacity;

+ 4 - 10
src/math/Matrix3.js

@@ -86,7 +86,7 @@ THREE.Matrix3.prototype = {
 
 
 		var v1;
 		var v1;
 
 
-		return function applyToVector3Array( array, offset, length ) {
+		return function ( array, offset, length ) {
 
 
 			if ( v1 === undefined ) v1 = new THREE.Vector3();
 			if ( v1 === undefined ) v1 = new THREE.Vector3();
 			if ( offset === undefined ) offset = 0;
 			if ( offset === undefined ) offset = 0;
@@ -94,15 +94,9 @@ THREE.Matrix3.prototype = {
 
 
 			for ( var i = 0, j = offset; i < length; i += 3, j += 3 ) {
 			for ( var i = 0, j = offset; i < length; i += 3, j += 3 ) {
 
 
-				v1.x = array[ j ];
-				v1.y = array[ j + 1 ];
-				v1.z = array[ j + 2 ];
-
+				v1.fromArray( array, j );
 				v1.applyMatrix3( this );
 				v1.applyMatrix3( this );
-
-				array[ j ]     = v1.x;
-				array[ j + 1 ] = v1.y;
-				array[ j + 2 ] = v1.z;
+				v1.toArray( array, j );
 
 
 			}
 			}
 
 
@@ -134,7 +128,7 @@ THREE.Matrix3.prototype = {
 
 
 			}
 			}
 
 
-			return array;
+			return buffer;
 
 
 		};
 		};
 
 

+ 5 - 11
src/math/Matrix4.js

@@ -101,7 +101,7 @@ THREE.Matrix4.prototype = {
 		return this;
 		return this;
 
 
 	},
 	},
- 
+
 	makeBasis: function ( xAxis, yAxis, zAxis ) {
 	makeBasis: function ( xAxis, yAxis, zAxis ) {
 
 
 		this.set(
 		this.set(
@@ -469,7 +469,7 @@ THREE.Matrix4.prototype = {
 
 
 		var v1;
 		var v1;
 
 
-		return function applyToVector3Array( array, offset, length ) {
+		return function ( array, offset, length ) {
 
 
 			if ( v1 === undefined ) v1 = new THREE.Vector3();
 			if ( v1 === undefined ) v1 = new THREE.Vector3();
 			if ( offset === undefined ) offset = 0;
 			if ( offset === undefined ) offset = 0;
@@ -477,15 +477,9 @@ THREE.Matrix4.prototype = {
 
 
 			for ( var i = 0, j = offset; i < length; i += 3, j += 3 ) {
 			for ( var i = 0, j = offset; i < length; i += 3, j += 3 ) {
 
 
-				v1.x = array[ j ];
-				v1.y = array[ j + 1 ];
-				v1.z = array[ j + 2 ];
-
+				v1.fromArray( array, j );
 				v1.applyMatrix4( this );
 				v1.applyMatrix4( this );
-
-				array[ j ]     = v1.x;
-				array[ j + 1 ] = v1.y;
-				array[ j + 2 ] = v1.z;
+				v1.toArray( array, j );
 
 
 			}
 			}
 
 
@@ -517,7 +511,7 @@ THREE.Matrix4.prototype = {
 
 
 			}
 			}
 
 
-			return array;
+			return buffer;
 
 
 		};
 		};
 
 

+ 8 - 4
src/renderers/WebGLRenderer.js

@@ -963,13 +963,17 @@ THREE.WebGLRenderer = function ( parameters ) {
 
 
 				} else if ( material.defaultAttributeValues !== undefined ) {
 				} else if ( material.defaultAttributeValues !== undefined ) {
 
 
-					if ( material.defaultAttributeValues[ key ].length === 2 ) {
+					if ( material.defaultAttributeValues[ key ] !== undefined ) {
 
 
-						_gl.vertexAttrib2fv( programAttribute, material.defaultAttributeValues[ key ] );
+						if ( material.defaultAttributeValues[ key ].length === 2 ) {
 
 
-					} else if ( material.defaultAttributeValues[ key ].length === 3 ) {
+							_gl.vertexAttrib2fv( programAttribute, material.defaultAttributeValues[ key ] );
 
 
-						_gl.vertexAttrib3fv( programAttribute, material.defaultAttributeValues[ key ] );
+						} else if ( material.defaultAttributeValues[ key ].length === 3 ) {
+
+							_gl.vertexAttrib3fv( programAttribute, material.defaultAttributeValues[ key ] );
+
+						}
 
 
 					}
 					}
 
 

+ 6 - 21
src/renderers/webgl/WebGLShadowMap.js

@@ -274,7 +274,7 @@ THREE.WebGLShadowMap = function ( _renderer, _lights, _objects ) {
 				webglObject = _renderList[ j ];
 				webglObject = _renderList[ j ];
 
 
 				object = webglObject.object;
 				object = webglObject.object;
-				buffer = webglObject.buffer;
+				buffer = _objects.geometries.get( object );
 
 
 				// culling is overriden globally for all objects
 				// culling is overriden globally for all objects
 				// while rendering depth map
 				// while rendering depth map
@@ -309,16 +309,7 @@ THREE.WebGLShadowMap = function ( _renderer, _lights, _objects ) {
 				}
 				}
 
 
 				_renderer.setMaterialFaces( objectMaterial );
 				_renderer.setMaterialFaces( objectMaterial );
-
-				if ( buffer instanceof THREE.BufferGeometry ) {
-
-					_renderer.renderBufferDirect( shadowCamera, _lights, fog, material, buffer, object );
-
-				} else {
-
-					_renderer.renderBuffer( shadowCamera, _lights, fog, material, buffer, object );
-
-				}
+				_renderer.renderBufferDirect( shadowCamera, _lights, fog, material, buffer, object );
 
 
 			}
 			}
 
 
@@ -363,18 +354,12 @@ THREE.WebGLShadowMap = function ( _renderer, _lights, _objects ) {
 
 
 		if ( object.visible ) {
 		if ( object.visible ) {
 
 
-			var webglObjects = _webglObjects[ object.id ];
-
-			if ( webglObjects && object.castShadow && (object.frustumCulled === false || _frustum.intersectsObject( object ) === true) ) {
-
-				for ( var i = 0, l = webglObjects.length; i < l; i ++ ) {
+			var webglObject = _objects.objects[ object.id ];
 
 
-					var webglObject = webglObjects[ i ];
+			if ( webglObject && object.castShadow && (object.frustumCulled === false || _frustum.intersectsObject( object ) === true) ) {
 
 
-					object._modelViewMatrix.multiplyMatrices( shadowCamera.matrixWorldInverse, object.matrixWorld );
-					_renderList.push( webglObject );
-
-				}
+				object._modelViewMatrix.multiplyMatrices( shadowCamera.matrixWorldInverse, object.matrixWorld );
+				_renderList.push( webglObject );
 
 
 			}
 			}