Browse Source

Experimenting with array-less materials.

Do not use for anything, this is just snapshot of a test in progress. I solved quite a few issues, but many things are still clumsy and broken.
alteredq 14 years ago
parent
commit
05b3db4dca
38 changed files with 1068 additions and 1056 deletions
  1. 606 608
      build/Three.js
  2. 4 4
      examples/js/Car.js
  3. 2 2
      examples/js/postprocessing/BloomPass.js
  4. 1 1
      examples/js/postprocessing/DotScreenPass.js
  5. 1 1
      examples/js/postprocessing/FilmPass.js
  6. 1 1
      examples/js/postprocessing/SavePass.js
  7. 1 1
      examples/js/postprocessing/ShaderPass.js
  8. 1 1
      examples/js/postprocessing/TexturePass.js
  9. 1 1
      examples/webgl_animation_skinning.html
  10. 9 5
      examples/webgl_geometry_blenderexport_colors.html
  11. 37 19
      examples/webgl_geometry_colors.html
  12. 5 3
      examples/webgl_geometry_text.html
  13. 4 4
      examples/webgl_interactive_draggablecubes.html
  14. 1 1
      examples/webgl_materials2.html
  15. 3 3
      examples/webgl_materials_cars.html
  16. 11 11
      examples/webgl_materials_cars_camaro.html
  17. 142 23
      examples/webgl_materials_cubemap_dynamic.html
  18. 1 1
      examples/webgl_materials_grass.html
  19. 4 0
      examples/webgl_materials_normalmap.html
  20. 1 1
      examples/webgl_shader_lava.html
  21. 1 1
      examples/webgl_shading_physical.html
  22. 2 0
      examples/webgl_shadowmap.html
  23. 3 3
      src/core/Face3.js
  24. 3 3
      src/core/Face4.js
  25. 19 17
      src/core/Geometry.js
  26. 37 2
      src/extras/GeometryUtils.js
  27. 13 9
      src/extras/geometries/CubeGeometry.js
  28. 6 10
      src/extras/loaders/BinaryLoader.js
  29. 1 1
      src/extras/loaders/JSONLoader.js
  30. 3 3
      src/extras/loaders/Loader.js
  31. 2 2
      src/objects/Line.js
  32. 2 2
      src/objects/Mesh.js
  33. 2 2
      src/objects/MorphAnimMesh.js
  34. 2 2
      src/objects/Particle.js
  35. 2 2
      src/objects/ParticleSystem.js
  36. 2 2
      src/objects/Ribbon.js
  37. 2 2
      src/objects/SkinnedMesh.js
  38. 130 302
      src/renderers/WebGLRenderer.js

File diff suppressed because it is too large
+ 606 - 608
build/Three.js


+ 4 - 4
examples/js/Car.js

@@ -106,8 +106,8 @@ THREE.Car = function () {
 
 		var loader = new THREE.JSONLoader();
 
-		loader.load( { model: bodyURL, callback: function( geometry ) { createBody( geometry ) } } );
-		loader.load( { model: wheelURL, callback: function( geometry ) { createWheels( geometry ) } } );
+		loader.load( bodyURL, function( geometry ) { createBody( geometry ) } );
+		loader.load( wheelURL, function( geometry ) { createWheels( geometry ) } );
 
 	};
 
@@ -115,8 +115,8 @@ THREE.Car = function () {
 
 		var loader = new THREE.BinaryLoader();
 
-		loader.load( { model: bodyURL, callback: function( geometry ) { createBody( geometry ) } } );
-		loader.load( { model: wheelURL, callback: function( geometry ) { createWheels( geometry ) } } );
+		loader.load( bodyURL, function( geometry ) { createBody( geometry ) } );
+		loader.load( wheelURL, function( geometry ) { createWheels( geometry ) } );
 
 	};
 

+ 2 - 2
examples/js/postprocessing/BloomPass.js

@@ -65,7 +65,7 @@ THREE.BloomPass.prototype = {
 
 		// Render quad with blured scene into texture (convolution pass 1)
 
-		THREE.EffectComposer.quad.materials[ 0 ] = this.materialConvolution;
+		THREE.EffectComposer.quad.material = this.materialConvolution;
 
 		this.convolutionUniforms[ "tDiffuse" ].texture = readBuffer;
 		this.convolutionUniforms[ "uImageIncrement" ].value = THREE.BloomPass.blurX;
@@ -82,7 +82,7 @@ THREE.BloomPass.prototype = {
 
 		// Render original scene with superimposed blur to texture
 
-		THREE.EffectComposer.quad.materials[ 0 ] = this.materialScreen;
+		THREE.EffectComposer.quad.material = this.materialScreen;
 
 		this.screenUniforms[ "tDiffuse" ].texture = this.renderTargetY;
 

+ 1 - 1
examples/js/postprocessing/DotScreenPass.js

@@ -35,7 +35,7 @@ THREE.DotScreenPass.prototype = {
 		this.uniforms[ "tDiffuse" ].texture = readBuffer;
 		this.uniforms[ "tSize" ].value.set( readBuffer.width, readBuffer.height );
 
-		THREE.EffectComposer.quad.materials[ 0 ] = this.material;
+		THREE.EffectComposer.quad.material = this.material;
 
 		if ( this.renderToScreen ) {
 

+ 1 - 1
examples/js/postprocessing/FilmPass.js

@@ -34,7 +34,7 @@ THREE.FilmPass.prototype = {
 		this.uniforms[ "tDiffuse" ].texture = readBuffer;
 		this.uniforms[ "time" ].value += delta;
 
-		THREE.EffectComposer.quad.materials[ 0 ] = this.material;
+		THREE.EffectComposer.quad.material = this.material;
 
 		if ( this.renderToScreen ) {
 

+ 1 - 1
examples/js/postprocessing/SavePass.js

@@ -43,7 +43,7 @@ THREE.SavePass.prototype = {
 
 		}
 
-		THREE.EffectComposer.quad.materials[ 0 ] = this.material;
+		THREE.EffectComposer.quad.material = this.material;
 
 		renderer.render( THREE.EffectComposer.scene, THREE.EffectComposer.camera, this.renderTarget, this.clear );
 

+ 1 - 1
examples/js/postprocessing/ShaderPass.js

@@ -34,7 +34,7 @@ THREE.ShaderPass.prototype = {
 
 		}
 
-		THREE.EffectComposer.quad.materials[ 0 ] = this.material;
+		THREE.EffectComposer.quad.material = this.material;
 
 		if ( this.renderToScreen ) {
 

+ 1 - 1
examples/js/postprocessing/TexturePass.js

@@ -28,7 +28,7 @@ THREE.TexturePass.prototype = {
 
 	render: function ( renderer, writeBuffer, readBuffer, delta ) {
 
-		THREE.EffectComposer.quad.materials[ 0 ] = this.material;
+		THREE.EffectComposer.quad.material = this.material;
 
 		renderer.render( THREE.EffectComposer.scene, THREE.EffectComposer.camera, readBuffer );
 

+ 1 - 1
examples/webgl_animation_skinning.html

@@ -140,7 +140,7 @@
 
 				var material = new THREE.MeshFaceMaterial();
 
-				var originalMaterial = geometry.materials[ 0 ][ 0 ];
+				var originalMaterial = geometry.materials[ 0 ];
 
 				originalMaterial.skinning = true;
 				originalMaterial.transparent = true;

+ 9 - 5
examples/webgl_geometry_blenderexport_colors.html

@@ -91,20 +91,24 @@
 
 			function createScene1( geometry ) {
 
-				geometry.materials[0][0].shading = THREE.FlatShading;
+				geometry.materials[ 0 ].shading = THREE.FlatShading;
 
-				var material = [ new THREE.MeshFaceMaterial(), new THREE.MeshLambertMaterial( { color: 0xffffff, opacity:0.9, shading:THREE.FlatShading, wireframe: true, wireframeLinewidth: 2 } ) ];
-
-				mesh = new THREE.Mesh( geometry, material );
+				mesh = new THREE.Object3D();
 				mesh.position.x = 400;
 				mesh.scale.x = mesh.scale.y = mesh.scale.z = 250;
 				scene.add( mesh );
 
+				var part1 = new THREE.Mesh( geometry, new THREE.MeshFaceMaterial() );
+				mesh.add( part1 );
+
+				var part2 = new THREE.Mesh( geometry, new THREE.MeshLambertMaterial( { color: 0xffffff, opacity: 0.9, shading: THREE.FlatShading, wireframe: true, wireframeLinewidth: 2, transparent: true } ) );
+				mesh.add( part2 );
+
 			}
 
 			function createScene2( geometry ) {
 
-				geometry.materials[0][0].shading = THREE.FlatShading;
+				geometry.materials[ 0 ].shading = THREE.FlatShading;
 
 				var material = new THREE.MeshFaceMaterial();
 

+ 37 - 19
examples/webgl_geometry_colors.html

@@ -48,7 +48,7 @@
 
 			var camera, scene, renderer;
 
-			var mesh, mesh2, mesh3, light;
+			var group1, group2, group3, light;
 
 			var mouseX = 0, mouseY = 0;
 
@@ -100,7 +100,7 @@
 					geometry2 = new THREE.IcosahedronGeometry( 1 ),
 					geometry3 = new THREE.IcosahedronGeometry( 1 );
 
-				for ( var i = 0; i < geometry.faces.length; i++ ) {
+				for ( var i = 0; i < geometry.faces.length; i ++ ) {
 
 					f  = geometry.faces[ i ];
 					f2 = geometry2.faces[ i ];
@@ -137,27 +137,45 @@
 				var materials = [
 
 					new THREE.MeshLambertMaterial( { color: 0xffffff, shading: THREE.FlatShading, vertexColors: THREE.VertexColors } ),
-					new THREE.MeshBasicMaterial( { color: 0x000000, shading: THREE.FlatShading, wireframe: true } )
+					new THREE.MeshBasicMaterial( { color: 0x000000, shading: THREE.FlatShading, wireframe: true, transparent: true } )
 
 				];
 
-				mesh = new THREE.Mesh( geometry, materials  );
-				mesh.position.x = -400;
-				mesh.scale.x = mesh.scale.y = mesh.scale.z = 200;
-				mesh.rotation.x = -1.87;
-				scene.add( mesh );
+				group1 = new THREE.Object3D();
+				group1.position.x = -400;
+				group1.scale.x = group1.scale.y = group1.scale.z = 200;
+				group1.rotation.x = -1.87;
+				scene.add( group1 );
+
+				var p1 = new THREE.Mesh( geometry, materials[ 0 ] );
+				var p2 = new THREE.Mesh( geometry, materials[ 1 ] );
+
+				group1.add( p1 );
+				group1.add( p2 );
+
+				group2 = new THREE.Object3D();
+				group2.position.x = 400;
+				group2.rotation.x = 0;
+				group2.scale = group1.scale;
+				scene.add( group2 );
+
+				var p1 = new THREE.Mesh( geometry2, materials[ 0 ] );
+				var p2 = new THREE.Mesh( geometry2, materials[ 1 ] );
+
+				group2.add( p1 );
+				group2.add( p2 );
+
+				group3 = new THREE.Object3D();
+				group3.position.x = 0;
+				group3.rotation.x = 0;
+				group3.scale = group1.scale;
+				scene.add( group3 );
+
+				var p1 = new THREE.Mesh( geometry3, materials[ 0 ] );
+				var p2 = new THREE.Mesh( geometry3, materials[ 1 ] );
 
-				mesh2 = new THREE.Mesh( geometry2, materials  );
-				mesh2.position.x = 400;
-				mesh2.rotation.x = 0;
-				mesh2.scale = mesh.scale;
-				scene.add( mesh2 );
-
-				mesh3 = new THREE.Mesh( geometry3, materials  );
-				mesh3.position.x = 0;
-				mesh3.rotation.x = 0;
-				mesh3.scale = mesh.scale;
-				scene.add( mesh3 );
+				group3.add( p1 );
+				group3.add( p2 );
 
 				renderer = new THREE.WebGLRenderer( { antialias: true } );
 				renderer.setSize( window.innerWidth, window.innerHeight );

+ 5 - 3
examples/webgl_geometry_text.html

@@ -441,11 +441,13 @@
 
 					bend: bend,
 
-					material: textMaterialFront,
-					extrudeMaterial: textMaterialSide
+					material: 0,
+					extrudeMaterial: 1
 
 				});
 
+				textGeo.materials = [ textMaterialFront, textMaterialSide ];
+
 				textGeo.computeBoundingBox();
 				textGeo.computeVertexNormals();
 
@@ -460,7 +462,7 @@
 
 						var face = textGeo.faces[ i ];
 
-						if ( face.materials[ 0 ].id == textMaterialSide.id ) {
+						if ( face.materialIndex == 1 ) {
 
 							for ( var j = 0; j < face.vertexNormals.length; j ++ ) {
 

+ 4 - 4
examples/webgl_interactive_draggablecubes.html

@@ -56,7 +56,7 @@
 
 					var object = new THREE.Mesh( geometry, new THREE.MeshLambertMaterial( { color: Math.random() * 0xffffff } ) );
 
-					object.materials[ 0 ].ambient = object.materials[ 0 ].color;
+					object.material.ambient = object.material.color;
 
 					object.position.x = Math.random() * 1000 - 500;
 					object.position.y = Math.random() * 600 - 300;
@@ -153,10 +153,10 @@
 
 					if ( INTERSECTED != intersects[ 0 ].object ) {
 
-						if ( INTERSECTED ) INTERSECTED.materials[ 0 ].color.setHex( INTERSECTED.currentHex );
+						if ( INTERSECTED ) INTERSECTED.material.color.setHex( INTERSECTED.currentHex );
 
 						INTERSECTED = intersects[ 0 ].object;
-						INTERSECTED.currentHex = INTERSECTED.materials[ 0 ].color.getHex();
+						INTERSECTED.currentHex = INTERSECTED.material.color.getHex();
 
 						plane.position.copy( INTERSECTED.position );
 
@@ -166,7 +166,7 @@
 
 				} else {
 
-					if ( INTERSECTED ) INTERSECTED.materials[ 0 ].color.setHex( INTERSECTED.currentHex );
+					if ( INTERSECTED ) INTERSECTED.material.color.setHex( INTERSECTED.currentHex );
 
 					INTERSECTED = null;
 

+ 1 - 1
examples/webgl_materials2.html

@@ -227,7 +227,7 @@
 				pointLight = new THREE.PointLight( 0xffffff, 2, 800 );
 				scene.add( pointLight );
 
-				particleLight.materials[ 0 ].color = pointLight.color;
+				particleLight.material.color = pointLight.color;
 				pointLight.position = particleLight.position;
 
 				//

+ 3 - 3
examples/webgl_materials_cars.html

@@ -532,9 +532,9 @@
 					$( button_name( car, i ) ).counter = i;
 					$( button_name( car, i ) ).addEventListener( 'click', function() {
 
-						for ( var j = 0; j < material_indices.length; j++ ) {
+						for ( var j = 0; j < material_indices.length; j ++ ) {
 
-							geometry.materials[ material_indices [ j ] ][ 0 ] = materials[ this.counter ][ 1 ];
+							geometry.materials[ material_indices [ j ] ] = materials[ this.counter ][ 1 ];
 
 						}
 
@@ -557,7 +557,7 @@
 
 				for ( var i in CARS[ car ].mmap ) {
 
-					geometry.materials[ i ][ 0 ] = CARS[ car ].mmap[ i ];
+					geometry.materials[ i ] = CARS[ car ].mmap[ i ];
 
 				}
 

+ 11 - 11
examples/webgl_materials_cars_camaro.html

@@ -147,7 +147,7 @@
 
 				var i, src = "", parent = $( "buttons" );
 
-				for( i = 0; i < materials.length; i++ ) {
+				for( i = 0; i < materials.length; i ++ ) {
 
 					src += '<button id="m' + i + '">' + materials[ i ][ 0 ] + '</button>';
 
@@ -158,7 +158,7 @@
 				for( i = 0; i < materials.length; i ++ ) {
 
 					$( "m" + i ).counter = i;
-					$( "m" + i ).addEventListener( 'click', function() { geometry.materials[ 0 ][ 0 ] = materials[ this.counter ][ 1 ] }, false );
+					$( "m" + i ).addEventListener( 'click', function() { geometry.materials[ 0 ] = materials[ this.counter ][ 1 ] }, false );
 
 				}
 
@@ -168,15 +168,15 @@
 
 				var s = 75, m = new THREE.MeshFaceMaterial();
 
-				geometry.materials[ 0 ][ 0 ] = materials.body[ 0 ][ 1 ]; // car body
-				geometry.materials[ 1 ][ 0 ] = materials.chrome; // wheels chrome
-				geometry.materials[ 2 ][ 0 ] = materials.chrome; // grille chrome
-				geometry.materials[ 3 ][ 0 ] = materials.darkchrome; // door lines
-				geometry.materials[ 4 ][ 0 ] = materials.glass; // windshield
-				geometry.materials[ 5 ][ 0 ] = materials.interior; // interior
-				geometry.materials[ 6 ][ 0 ] = materials.tire; // tire
-				geometry.materials[ 7 ][ 0 ] = materials.black; // tireling
-				geometry.materials[ 8 ][ 0 ] = materials.black; // behind grille
+				geometry.materials[ 0 ] = materials.body[ 0 ][ 1 ]; // car body
+				geometry.materials[ 1 ] = materials.chrome; // wheels chrome
+				geometry.materials[ 2 ] = materials.chrome; // grille chrome
+				geometry.materials[ 3 ] = materials.darkchrome; // door lines
+				geometry.materials[ 4 ] = materials.glass; // windshield
+				geometry.materials[ 5 ] = materials.interior; // interior
+				geometry.materials[ 6 ] = materials.tire; // tire
+				geometry.materials[ 7 ] = materials.black; // tireling
+				geometry.materials[ 8 ] = materials.black; // behind grille
 
 				var mesh = new THREE.Mesh( geometry, m );
 				mesh.rotation.y = 1;

+ 142 - 23
examples/webgl_materials_cubemap_dynamic.html

@@ -51,8 +51,127 @@
 			motion blur: <span class="h">b</span>
 			</div>
 		</div>
-
+<!--
 		<script src="../build/Three.js"></script>
+-->
+		<script type="text/javascript" src="../src/Three.js"></script>
+		<script type="text/javascript" src="../src/core/Clock.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/Ray.js"></script>
+		<script type="text/javascript" src="../src/core/Rectangle.js"></script>
+		<script type="text/javascript" src="../src/core/Math.js"></script>
+		<script type="text/javascript" src="../src/core/Matrix3.js"></script>
+		<script type="text/javascript" src="../src/core/Matrix4.js"></script>
+		<script type="text/javascript" src="../src/core/Object3D.js"></script>
+		<script type="text/javascript" src="../src/core/Projector.js"></script>
+		<script type="text/javascript" src="../src/core/Quaternion.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/core/Spline.js"></script>
+		<script type="text/javascript" src="../src/core/Edge.js"></script>
+		<script type="text/javascript" src="../src/cameras/Camera.js"></script>
+		<script type="text/javascript" src="../src/cameras/OrthographicCamera.js"></script>
+		<script type="text/javascript" src="../src/cameras/PerspectiveCamera.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/lights/SpotLight.js"></script>
+		<script type="text/javascript" src="../src/materials/Material.js"></script>
+		<script type="text/javascript" src="../src/materials/LineBasicMaterial.js"></script>
+		<script type="text/javascript" src="../src/materials/MeshBasicMaterial.js"></script>
+		<script type="text/javascript" src="../src/materials/MeshLambertMaterial.js"></script>
+		<script type="text/javascript" src="../src/materials/MeshPhongMaterial.js"></script>
+		<script type="text/javascript" src="../src/materials/MeshDepthMaterial.js"></script>
+		<script type="text/javascript" src="../src/materials/MeshNormalMaterial.js"></script>
+		<script type="text/javascript" src="../src/materials/MeshFaceMaterial.js"></script>
+		<script type="text/javascript" src="../src/materials/MeshShaderMaterial.js"></script>
+		<script type="text/javascript" src="../src/materials/ParticleBasicMaterial.js"></script>
+		<script type="text/javascript" src="../src/materials/ParticleCanvasMaterial.js"></script>
+		<script type="text/javascript" src="../src/materials/ParticleDOMMaterial.js"></script>
+		<script type="text/javascript" src="../src/materials/ShaderMaterial.js"></script>
+		<script type="text/javascript" src="../src/textures/Texture.js"></script>
+		<script type="text/javascript" src="../src/textures/DataTexture.js"></script>
+		<script type="text/javascript" src="../src/objects/Particle.js"></script>
+		<script type="text/javascript" src="../src/objects/ParticleSystem.js"></script>
+		<script type="text/javascript" src="../src/objects/Line.js"></script>
+		<script type="text/javascript" src="../src/objects/Mesh.js"></script>
+		<script type="text/javascript" src="../src/objects/Bone.js"></script>
+		<script type="text/javascript" src="../src/objects/SkinnedMesh.js"></script>
+		<script type="text/javascript" src="../src/objects/MorphAnimMesh.js"></script>
+		<script type="text/javascript" src="../src/objects/Ribbon.js"></script>
+		<script type="text/javascript" src="../src/objects/LOD.js"></script>
+		<script type="text/javascript" src="../src/objects/Sprite.js"></script>
+		<script type="text/javascript" src="../src/scenes/Scene.js"></script>
+		<script type="text/javascript" src="../src/scenes/Fog.js"></script>
+		<script type="text/javascript" src="../src/scenes/FogExp2.js"></script>
+		<script type="text/javascript" src="../src/renderers/DOMRenderer.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/WebGLShaders.js"></script>
+		<script type="text/javascript" src="../src/renderers/WebGLRenderer.js"></script>
+		<script type="text/javascript" src="../src/renderers/WebGLRenderTarget.js"></script>
+		<script type="text/javascript" src="../src/renderers/WebGLRenderTargetCube.js"></script>
+		<script type="text/javascript" src="../src/renderers/renderables/RenderableVertex.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/RenderableObject.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="../src/extras/ColorUtils.js"></script>
+		<script type="text/javascript" src="../src/extras/GeometryUtils.js"></script>
+		<script type="text/javascript" src="../src/extras/ImageUtils.js"></script>
+		<script type="text/javascript" src="../src/extras/SceneUtils.js"></script>
+		<script type="text/javascript" src="../src/extras/ShaderUtils.js"></script>
+		<script type="text/javascript" src="../src/extras/core/Curve.js"></script>
+		<script type="text/javascript" src="../src/extras/core/CurvePath.js"></script>
+		<script type="text/javascript" src="../src/extras/core/Path.js"></script>
+		<script type="text/javascript" src="../src/extras/core/Shape.js"></script>
+		<script type="text/javascript" src="../src/extras/core/TextPath.js"></script>
+		<script type="text/javascript" src="../src/extras/animation/AnimationHandler.js"></script>
+		<script type="text/javascript" src="../src/extras/animation/Animation.js"></script>
+		<script type="text/javascript" src="../src/extras/cameras/CubeCamera.js"></script>
+		<script type="text/javascript" src="../src/extras/cameras/FirstPersonCamera.js"></script>
+		<script type="text/javascript" src="../src/extras/cameras/PathCamera.js"></script>
+		<script type="text/javascript" src="../src/extras/cameras/FlyCamera.js"></script>
+		<script type="text/javascript" src="../src/extras/cameras/RollCamera.js"></script>
+		<script type="text/javascript" src="../src/extras/cameras/TrackballCamera.js"></script>
+		<script type="text/javascript" src="../src/extras/cameras/CombinedCamera.js"></script>
+		<script type="text/javascript" src="../src/extras/controls/FirstPersonControls.js"></script>
+		<script type="text/javascript" src="../src/extras/controls/PathControls.js"></script>
+		<script type="text/javascript" src="../src/extras/controls/FlyControls.js"></script>
+		<script type="text/javascript" src="../src/extras/controls/RollControls.js"></script>
+		<script type="text/javascript" src="../src/extras/controls/TrackballControls.js"></script>
+		<script type="text/javascript" src="../src/extras/geometries/CubeGeometry.js"></script>
+		<script type="text/javascript" src="../src/extras/geometries/CylinderGeometry.js"></script>
+		<script type="text/javascript" src="../src/extras/geometries/ExtrudeGeometry.js"></script>
+		<script type="text/javascript" src="../src/extras/geometries/IcosahedronGeometry.js"></script>
+		<script type="text/javascript" src="../src/extras/geometries/LatheGeometry.js"></script>
+		<script type="text/javascript" src="../src/extras/geometries/OctahedronGeometry.js"></script>
+		<script type="text/javascript" src="../src/extras/geometries/PlaneGeometry.js"></script>
+		<script type="text/javascript" src="../src/extras/geometries/SphereGeometry.js"></script>
+		<script type="text/javascript" src="../src/extras/geometries/TextGeometry.js"></script>
+		<script type="text/javascript" src="../src/extras/geometries/TorusGeometry.js"></script>
+		<script type="text/javascript" src="../src/extras/geometries/TorusKnotGeometry.js"></script>
+		<script type="text/javascript" src="../src/extras/modifiers/SubdivisionModifier.js"></script>
+		<script type="text/javascript" src="../src/extras/loaders/Loader.js"></script>
+		<script type="text/javascript" src="../src/extras/loaders/BinaryLoader.js"></script>
+		<script type="text/javascript" src="../src/extras/loaders/ColladaLoader.js"></script>
+		<script type="text/javascript" src="../src/extras/loaders/JSONLoader.js"></script>
+		<script type="text/javascript" src="../src/extras/loaders/SceneLoader.js"></script>
+		<script type="text/javascript" src="../src/extras/loaders/UTF8Loader.js"></script>
+		<script type="text/javascript" src="../src/extras/objects/Axes.js"></script>
+		<script type="text/javascript" src="../src/extras/objects/MarchingCubes.js"></script>
+		<script type="text/javascript" src="../src/extras/physics/Collisions.js"></script>
+		<script type="text/javascript" src="../src/extras/physics/CollisionUtils.js"></script>
+		<script type="text/javascript" src="../src/extras/renderers/AnaglyphWebGLRenderer.js"></script>
+		<script type="text/javascript" src="../src/extras/renderers/CrosseyedWebGLRenderer.js"></script>
 
 		<script src="js/Detector.js"></script>
 		<script src="js/RequestAnimationFrame.js"></script>
@@ -817,15 +936,15 @@
 
 				var materials = car.bodyGeometry.materials;
 
-				materials[ 0 ][ 0 ] = mlib.body[ 0 ][ 1 ]; 		// body
-				materials[ 1 ][ 0 ] = mlib[ "Dark chrome" ]; 	// front under lights, back
+				materials[ 0 ] = mlib.body[ 0 ][ 1 ]; 		// body
+				materials[ 1 ] = mlib[ "Dark chrome" ]; 	// front under lights, back
 
 				// WHEELS
 
 				materials = car.wheelGeometry.materials;
 
-				materials[ 0 ][ 0 ] = mlib[ "Chrome" ];			// insides
-				materials[ 1 ][ 0 ] = mlib[ "Black rough" ];	// tire
+				materials[ 0 ] = mlib[ "Chrome" ];			// insides
+				materials[ 1 ] = mlib[ "Black rough" ];	// tire
 
 			}
 
@@ -844,21 +963,21 @@
 
 				var materials = car.bodyGeometry.materials;
 
-				materials[ 0 ][ 0 ] = mlib[ "Black metal" ];	// top, front center, back sides
-				materials[ 1 ][ 0 ] = mlib[ "Chrome" ];			// front sides
-				materials[ 2 ][ 0 ] = mlib[ "Chrome" ];			// engine
-				materials[ 3 ][ 0 ] = mlib[ "Dark chrome" ];	// small chrome things
-				materials[ 4 ][ 0 ] = mlib[ "Red glass" ];		// backlights
-				materials[ 5 ][ 0 ] = mlib[ "Orange glass" ];	// back signals
-				materials[ 6 ][ 0 ] = mlib[ "Black rough" ];	// bottom, interior
-				materials[ 7 ][ 0 ] = mlib[ "Dark glass" ];		// windshield
+				materials[ 0 ] = mlib[ "Black metal" ];	// top, front center, back sides
+				materials[ 1 ] = mlib[ "Chrome" ];			// front sides
+				materials[ 2 ] = mlib[ "Chrome" ];			// engine
+				materials[ 3 ] = mlib[ "Dark chrome" ];	// small chrome things
+				materials[ 4 ] = mlib[ "Red glass" ];		// backlights
+				materials[ 5 ] = mlib[ "Orange glass" ];	// back signals
+				materials[ 6 ] = mlib[ "Black rough" ];	// bottom, interior
+				materials[ 7 ] = mlib[ "Dark glass" ];		// windshield
 
 				// WHEELS
 
 				materials = car.wheelGeometry.materials;
 
-				materials[ 0 ][ 0 ] = mlib[ "Chrome" ];			// insides
-				materials[ 1 ][ 0 ] = mlib[ "Black rough" ];	// tire
+				materials[ 0 ] = mlib[ "Chrome" ];			// insides
+				materials[ 1 ] = mlib[ "Black rough" ];	// tire
 
 			}
 
@@ -900,16 +1019,16 @@
 
 					if ( veyron.loaded ) {
 
-						veyron.bodyGeometry.materials[ 1 ][ 0 ] = mlib[ "ChromeN" ];
-						veyron.bodyGeometry.materials[ 2 ][ 0 ] = mlib[ "ChromeN" ];
+						veyron.bodyGeometry.materials[ 1 ] = mlib[ "ChromeN" ];
+						veyron.bodyGeometry.materials[ 2 ] = mlib[ "ChromeN" ];
 
-						veyron.wheelGeometry.materials[ 0 ][ 0 ] = mlib[ "ChromeN" ];
+						veyron.wheelGeometry.materials[ 0 ] = mlib[ "ChromeN" ];
 
 					}
 
 					if ( gallardo.loaded ) {
 
-						gallardo.wheelGeometry.materials[ 0 ][ 0 ] = mlib[ "ChromeN" ];
+						gallardo.wheelGeometry.materials[ 0 ] = mlib[ "ChromeN" ];
 
 					}
 
@@ -917,16 +1036,16 @@
 
 					if ( veyron.loaded ) {
 
-						veyron.bodyGeometry.materials[ 1 ][ 0 ] = mlib[ "Chrome" ];
-						veyron.bodyGeometry.materials[ 2 ][ 0 ] = mlib[ "Chrome" ];
+						veyron.bodyGeometry.materials[ 1 ] = mlib[ "Chrome" ];
+						veyron.bodyGeometry.materials[ 2 ] = mlib[ "Chrome" ];
 
-						veyron.wheelGeometry.materials[ 0 ][ 0 ] = mlib[ "Chrome" ];
+						veyron.wheelGeometry.materials[ 0 ] = mlib[ "Chrome" ];
 
 					}
 
 					if ( gallardo.loaded ) {
 
-						gallardo.wheelGeometry.materials[ 0 ][ 0 ] = mlib[ "Chrome" ];
+						gallardo.wheelGeometry.materials[ 0 ] = mlib[ "Chrome" ];
 
 					}
 

+ 1 - 1
examples/webgl_materials_grass.html

@@ -47,7 +47,7 @@
 				for ( var i = 0; i < 15; i ++ ) {
 
 					mesh = levels[ i ] = new THREE.Mesh( geometry, new THREE.MeshBasicMaterial( { map: new THREE.Texture( generateTextureLevel( bitmap ) ), transparent: true, depthTest: false } ) );
-					mesh.materials[0].map.needsUpdate = true;
+					mesh.material.map.needsUpdate = true;
 
 					mesh.rotation.x = - 90 * ( Math.PI / 180 );
 					mesh.position.y = i * 0.25;

+ 4 - 0
examples/webgl_materials_normalmap.html

@@ -222,6 +222,8 @@
 
 				geometry.computeTangents();
 
+				geometry.materials = [ material1 ];
+
 				mesh1 = new THREE.Mesh( geometry, material1 );
 				mesh1.position.x = - scale * 12;
 				mesh1.scale.set( scale, scale, scale );
@@ -238,6 +240,8 @@
 
 				loader.statusDomElement.style.display = "none";
 
+				console.log( mesh1 );
+
 			}
 
 			function onDocumentMouseMove(event) {

+ 1 - 1
examples/webgl_shader_lava.html

@@ -170,7 +170,7 @@
 
 				} );
 
-				mesh = new THREE.Mesh( new THREE.TorusGeometry( size, 0.3, 30, 30 ), [ material /*, new THREE.MeshBasicMaterial( { color: 0x000000, wireframe: true, wireframeLinewidth: 2 } ) */ ] );
+				mesh = new THREE.Mesh( new THREE.TorusGeometry( size, 0.3, 30, 30 ), material );
 				mesh.rotation.x = 0.3;
 				scene.add( mesh );
 

+ 1 - 1
examples/webgl_shading_physical.html

@@ -346,7 +346,7 @@
 
 					var tmpMesh = new THREE.Mesh( geometry, material );
 
-					THREE.ColorUtils.adjustHSV( tmpMesh.materials[ 0 ].color, 0.1, -0.1, 0 );
+					THREE.ColorUtils.adjustHSV( tmpMesh.material.color, 0.1, -0.1, 0 );
 
 					tmpMesh.position.set( x, y, z );
 

+ 2 - 0
examples/webgl_shadowmap.html

@@ -247,6 +247,8 @@
 
 					var material = new THREE.MeshLambertMaterial( { color: 0xffaa55, morphTargets: true, vertexColors: THREE.FaceColors } );
 
+					geometry.materials[ 0 ] = material;
+
 					if ( fudgeColor ) {
 
 						THREE.ColorUtils.adjustHSV( material.color, 0, 0.5 - Math.random(), 0.5 - Math.random() );

+ 3 - 3
src/core/Face3.js

@@ -3,9 +3,9 @@
  * @author alteredq / http://alteredqualia.com/
  */
 
-THREE.Face3 = function ( a, b, c, normal, color, materials ) {
+THREE.Face3 = function ( a, b, c, normal, color, materialIndex ) {
 
-	this.a = a; 
+	this.a = a;
 	this.b = b;
 	this.c = c;
 
@@ -17,7 +17,7 @@ THREE.Face3 = function ( a, b, c, normal, color, materials ) {
 
 	this.vertexTangents = [];
 
-	this.materials = materials instanceof Array ? materials : [ materials ];
+	this.materialIndex = materialIndex;
 
 	this.centroid = new THREE.Vector3();
 

+ 3 - 3
src/core/Face4.js

@@ -3,9 +3,9 @@
  * @author alteredq / http://alteredqualia.com/
  */
 
-THREE.Face4 = function ( a, b, c, d, normal, color, materials ) {
+THREE.Face4 = function ( a, b, c, d, normal, color, materialIndex ) {
 
-	this.a = a; 
+	this.a = a;
 	this.b = b;
 	this.c = c;
 	this.d = d;
@@ -18,7 +18,7 @@ THREE.Face4 = function ( a, b, c, d, normal, color, materials ) {
 
 	this.vertexTangents = [];
 
-	this.materials = materials instanceof Array ? materials : [ materials ];
+	this.materialIndex = materialIndex;
 
 	this.centroid = new THREE.Vector3();
 

+ 19 - 17
src/core/Geometry.js

@@ -13,6 +13,8 @@ THREE.Geometry = function () {
 	this.vertices = [];
 	this.colors = []; // one-to-one vertex colors, used in ParticleSystem, Line and Ribbon
 
+	this.materials = [];
+
 	this.faces = [];
 
 	this.faceUvs = [[]];
@@ -435,27 +437,27 @@ THREE.Geometry.prototype = {
 		this.boundingSphere = { radius: radius };
 
 	},
-	
-	/* 
-	 * Checks for duplicate vertices with hashmap. 
+
+	/*
+	 * Checks for duplicate vertices with hashmap.
 	 * Duplicated vertices are removed
-	 * and faces' vertices are updated. 
+	 * and faces' vertices are updated.
 	 */
 	mergeVertices: function() {
-		
+
 		var verticesMap = {}; // Hashmap for looking up vertice by position coordinates (and making sure they are unique)
 		var unique = [], changes = [];
-		
+
 		var v, key;
-		var precisionPoints = 4; // number of decimal points, eg. 4 for epsilon of 0.0001 
+		var precisionPoints = 4; // number of decimal points, eg. 4 for epsilon of 0.0001
 		var precision = Math.pow(10, precisionPoints)
 		var i,il, face;
-		
+
 		for (i=0,il=this.vertices.length;i<il;i++) {
-			
+
 			v = this.vertices[i].position;
 			key = [Math.round(v.x * precision), Math.round(v.y* precision), Math.round(v.z* precision)].join('_');
-			
+
 			if (verticesMap[key]===undefined) {
 				verticesMap[key] = i;
 				unique.push(this.vertices[i]);
@@ -464,10 +466,10 @@ THREE.Geometry.prototype = {
 				//console.log('Duplicate vertex found. ', i, ' could be using ', verticesMap[key]);
 				changes[i] = changes[verticesMap[key]];
 			}
-			
+
 		};
-		
-		
+
+
 		// Start to patch face indices.
 		for( i = 0, il = this.faces.length; i < il; i ++ ) {
 
@@ -477,20 +479,20 @@ THREE.Geometry.prototype = {
 				face.a = changes[face.a];
 				face.b = changes[face.b];
 				face.c = changes[face.c];
-			
+
 			} if ( face instanceof THREE.Face4 ) {
 
 				face.a = changes[face.a];
 				face.b = changes[face.b];
 				face.c = changes[face.c];
 				face.d = changes[face.d];
-			
+
 			}
 		}
-		
+
 		// Use unique set of vertices
 		this.vertices = unique;
-		
+
 	}
 
 };

+ 37 - 2
src/extras/GeometryUtils.js

@@ -18,6 +18,17 @@ THREE.GeometryUtils = {
 		uvs1 = geometry1.faceVertexUvs[ 0 ],
 		uvs2 = geometry2.faceVertexUvs[ 0 ];
 
+		var geo1MaterialsMap = {};
+
+		for ( var i = 0; i < geometry1.materials.length; i ++ ) {
+
+			var id = geometry1.materials[ i ].id;
+
+			geo1MaterialsMap[ id ] = i;
+
+		}
+
+
 		if ( object2 instanceof THREE.Mesh ) {
 
 			object2.matrixAutoUpdate && object2.updateMatrix();
@@ -83,7 +94,23 @@ THREE.GeometryUtils = {
 
 			}
 
-			faceCopy.materials = face.materials.slice();
+			if ( face.materialIndex !== undefined ) {
+
+				var material2 = geometry2.materials[ face.materialIndex ];
+				var materialId2 = material2.id;
+
+				var materialIndex = geo1MaterialsMap[ materialId2 ];
+
+				if ( materialIndex === undefined ) {
+
+					materialIndex = geometry1.materials.length;
+					geometry1.materials.push( material2 );
+
+				}
+
+				faceCopy.materialIndex = materialIndex;
+
+			}
 
 			faceCopy.centroid.copy( face.centroid );
 			if ( matrix ) matrix.multiplyVector3( faceCopy.centroid );
@@ -120,6 +147,14 @@ THREE.GeometryUtils = {
 			faces = geometry.faces,
 			uvs = geometry.faceVertexUvs[ 0 ];
 
+		// materials
+
+		if ( geometry.materials ) {
+
+			cloneGeo.materials = geometry.materials.slice();
+
+		}
+
 		// vertices
 
 		for ( i = 0, il = vertices.length; i < il; i ++ ) {
@@ -167,7 +202,7 @@ THREE.GeometryUtils = {
 
 			}
 
-			faceCopy.materials = face.materials.slice();
+			faceCopy.materialIndex = face.materialIndex;
 
 			faceCopy.centroid.copy( face.centroid );
 

+ 13 - 9
src/extras/geometries/CubeGeometry.js

@@ -12,6 +12,8 @@ THREE.CubeGeometry = function ( width, height, depth, segmentsWidth, segmentsHei
 	height_half = height / 2,
 	depth_half = depth / 2;
 
+	var mpx, mpy, mpz, mnx, mny, mnz;
+
 	if ( materials !== undefined ) {
 
 		if ( materials instanceof Array ) {
@@ -24,12 +26,14 @@ THREE.CubeGeometry = function ( width, height, depth, segmentsWidth, segmentsHei
 
 			for ( var i = 0; i < 6; i ++ ) {
 
-				this.materials.push( [ materials ] );
+				this.materials.push( materials );
 
 			}
 
 		}
 
+		mpx = 0; mnx = 1; mpy = 2; mny = 3; mpz = 4; mnz = 5;
+
 	} else {
 
 		this.materials = [];
@@ -52,12 +56,12 @@ THREE.CubeGeometry = function ( width, height, depth, segmentsWidth, segmentsHei
 
 	}
 
-	this.sides.px && buildPlane( 'z', 'y', - 1, - 1, depth, height, width_half, this.materials[ 0 ] ); // px
-	this.sides.nx && buildPlane( 'z', 'y',   1, - 1, depth, height, - width_half, this.materials[ 1 ] );   // nx
-	this.sides.py && buildPlane( 'x', 'z',   1,   1, width, depth, height_half, this.materials[ 2 ] );   // py
-	this.sides.ny && buildPlane( 'x', 'z',   1, - 1, width, depth, - height_half, this.materials[ 3 ] ); // ny
-	this.sides.pz && buildPlane( 'x', 'y',   1, - 1, width, height, depth_half, this.materials[ 4 ] );   // pz
-	this.sides.nz && buildPlane( 'x', 'y', - 1, - 1, width, height, - depth_half, this.materials[ 5 ] ); // nz
+	this.sides.px && buildPlane( 'z', 'y', - 1, - 1, depth, height, width_half, mpx ); 	 // px
+	this.sides.nx && buildPlane( 'z', 'y',   1, - 1, depth, height, - width_half, mnx ); // nx
+	this.sides.py && buildPlane( 'x', 'z',   1,   1, width, depth, height_half, mpy );   // py
+	this.sides.ny && buildPlane( 'x', 'z',   1, - 1, width, depth, - height_half, mny ); // ny
+	this.sides.pz && buildPlane( 'x', 'y',   1, - 1, width, height, depth_half, mpz );   // pz
+	this.sides.nz && buildPlane( 'x', 'y', - 1, - 1, width, height, - depth_half, mnz ); // nz
 
 	this.mergeVertices();
 
@@ -91,9 +95,9 @@ THREE.CubeGeometry = function ( width, height, depth, segmentsWidth, segmentsHei
 		segment_width = width / gridX,
 		segment_height = height / gridY;
 
-		for( iy = 0; iy < gridY1; iy++ ) {
+		for( iy = 0; iy < gridY1; iy ++ ) {
 
-			for( ix = 0; ix < gridX1; ix++ ) {
+			for( ix = 0; ix < gridX1; ix ++ ) {
 
 				var vector = new THREE.Vector3();
 				vector[ u ] = ( ix * segment_width - width_half ) * udir;

+ 6 - 10
src/extras/loaders/BinaryLoader.js

@@ -687,22 +687,19 @@ THREE.BinaryLoader.prototype.createBinModel = function ( data, callback, texture
 
 	function f3 ( scope, a, b, c, mi ) {
 
-		var material = scope.materials[ mi ];
-		scope.faces.push( new THREE.Face3( a, b, c, null, null, material ) );
+		scope.faces.push( new THREE.Face3( a, b, c, null, null, mi ) );
 
 	};
 
 	function f4 ( scope, a, b, c, d, mi ) {
 
-		var material = scope.materials[ mi ];
-		scope.faces.push( new THREE.Face4( a, b, c, d, null, null, material ) );
+		scope.faces.push( new THREE.Face4( a, b, c, d, null, null, mi ) );
 
 	};
 
 	function f3n ( scope, normals, a, b, c, mi, na, nb, nc ) {
 
-		var material = scope.materials[ mi ],
-			nax = normals[ na*3     ],
+		var nax = normals[ na*3     ],
 			nay = normals[ na*3 + 1 ],
 			naz = normals[ na*3 + 2 ],
 
@@ -719,14 +716,13 @@ THREE.BinaryLoader.prototype.createBinModel = function ( data, callback, texture
 						   new THREE.Vector3( nbx, nby, nbz ),
 						   new THREE.Vector3( ncx, ncy, ncz )],
 						  null,
-						  material ) );
+						  mi ) );
 
 	};
 
 	function f4n ( scope, normals, a, b, c, d, mi, na, nb, nc, nd ) {
 
-		var material = scope.materials[ mi ],
-			nax = normals[ na*3     ],
+		var nax = normals[ na*3     ],
 			nay = normals[ na*3 + 1 ],
 			naz = normals[ na*3 + 2 ],
 
@@ -748,7 +744,7 @@ THREE.BinaryLoader.prototype.createBinModel = function ( data, callback, texture
 						   new THREE.Vector3( ncx, ncy, ncz ),
 						   new THREE.Vector3( ndx, ndy, ndz )],
 						  null,
-						  material ) );
+						  mi ) );
 
 	};
 

+ 1 - 1
src/extras/loaders/JSONLoader.js

@@ -177,7 +177,7 @@ THREE.JSONLoader.prototype.createModel = function ( json, callback, texture_path
 			if ( hasMaterial ) {
 
 				materialIndex = faces[ offset ++ ];
-				face.materials = geometry.materials[ materialIndex ];
+				face.materialIndex = materialIndex;
 
 			}
 

+ 3 - 3
src/extras/loaders/Loader.js

@@ -71,7 +71,7 @@ THREE.Loader.prototype = {
 
 		for ( var i = 0; i < materials.length; ++ i ) {
 
-			scope.materials[ i ] = [ THREE.Loader.prototype.createMaterial( materials[ i ], texture_path ) ];
+			scope.materials[ i ] = THREE.Loader.prototype.createMaterial( materials[ i ], texture_path );
 
 		}
 
@@ -81,9 +81,9 @@ THREE.Loader.prototype = {
 
 		var m, i, il = scope.materials.length;
 
-		for( i = 0; i < il; i++ ) {
+		for( i = 0; i < il; i ++ ) {
 
-			m = scope.materials[ i ][ 0 ];
+			m = scope.materials[ i ];
 
 			if ( m instanceof THREE.ShaderMaterial ) return true;
 

+ 2 - 2
src/objects/Line.js

@@ -2,12 +2,12 @@
  * @author mr.doob / http://mrdoob.com/
  */
 
-THREE.Line = function ( geometry, materials, type ) {
+THREE.Line = function ( geometry, material, type ) {
 
 	THREE.Object3D.call( this );
 
 	this.geometry = geometry;
-	this.materials = materials instanceof Array ? materials : [ materials ];
+	this.material = material;
 
 	this.type = ( type != undefined ) ? type : THREE.LineStrip;
 

+ 2 - 2
src/objects/Mesh.js

@@ -4,12 +4,12 @@
  * @author mikael emtinger / http://gomo.se/
  */
 
-THREE.Mesh = function ( geometry, materials ) {
+THREE.Mesh = function ( geometry, material ) {
 
 	THREE.Object3D.call( this );
 
 	this.geometry = geometry;
-	this.materials = materials && materials.length ? materials : [ materials ];
+	this.material = material;
 
 	this.overdraw = false; // TODO: Move to material?
 

+ 2 - 2
src/objects/MorphAnimMesh.js

@@ -2,9 +2,9 @@
  * @author alteredq / http://alteredqualia.com/
  */
 
-THREE.MorphAnimMesh = function( geometry, materials ) {
+THREE.MorphAnimMesh = function( geometry, material ) {
 
-	THREE.Mesh.call( this, geometry, materials );
+	THREE.Mesh.call( this, geometry, material );
 
 	// API
 

+ 2 - 2
src/objects/Particle.js

@@ -2,11 +2,11 @@
  * @author mr.doob / http://mrdoob.com/
  */
 
-THREE.Particle = function ( materials ) {
+THREE.Particle = function ( material ) {
 
 	THREE.Object3D.call( this );
 
-	this.materials = materials instanceof Array ? materials : [ materials ];
+	this.material = material;
 
 };
 

+ 2 - 2
src/objects/ParticleSystem.js

@@ -2,12 +2,12 @@
  * @author alteredq / http://alteredqualia.com/
  */
 
-THREE.ParticleSystem = function ( geometry, materials ) {
+THREE.ParticleSystem = function ( geometry, material ) {
 
 	THREE.Object3D.call( this );
 
 	this.geometry = geometry;
-	this.materials = materials instanceof Array ? materials : [ materials ];
+	this.material = material;
 
 	this.sortParticles = false;
 

+ 2 - 2
src/objects/Ribbon.js

@@ -2,12 +2,12 @@
  * @author alteredq / http://alteredqualia.com/
  */
 
-THREE.Ribbon = function ( geometry, materials ) {
+THREE.Ribbon = function ( geometry, material ) {
 
 	THREE.Object3D.call( this );
 
 	this.geometry = geometry;
-	this.materials = materials instanceof Array ? materials : [ materials ];
+	this.material = material;
 
 };
 

+ 2 - 2
src/objects/SkinnedMesh.js

@@ -2,9 +2,9 @@
  * @author mikael emtinger / http://gomo.se/
  */
 
-THREE.SkinnedMesh = function( geometry, materials ) {
+THREE.SkinnedMesh = function( geometry, material ) {
 
-	THREE.Mesh.call( this, geometry, materials );
+	THREE.Mesh.call( this, geometry, material );
 
 	// init bones
 

+ 130 - 302
src/renderers/WebGLRenderer.js

@@ -688,68 +688,60 @@ THREE.WebGLRenderer = function ( parameters ) {
 
 		geometry.__webglParticleCount = nvertices;
 
-		geometry.__materials = object.materials;
-
 		// custom attributes
 
-		var m, ml, material;
-
-		for ( m = 0, ml = object.materials.length; m < ml; m ++ ) {
-
-			material = object.materials[ m ];
-
-			if ( material.attributes ) {
-
-				if ( geometry.__webglCustomAttributesList === undefined ) {
+		var material = object.material;
 
-					geometry.__webglCustomAttributesList = [];
+		if ( material.attributes ) {
 
-				}
+			if ( geometry.__webglCustomAttributesList === undefined ) {
 
-				for ( a in material.attributes ) {
+				geometry.__webglCustomAttributesList = [];
 
-					// Do a shallow copy of the attribute object so different geometryGroup chunks use different
-					// attribute buffers which are correctly indexed in the setMeshBuffers function
+			}
 
-					// Not sure how to best translate this into non-indexed arrays
-					// used for particles, as there are no geometry chunks here
-					// Probably could be simplified
+			for ( var a in material.attributes ) {
 
-					originalAttribute = material.attributes[ a ];
+				// Do a shallow copy of the attribute object so different geometryGroup chunks use different
+				// attribute buffers which are correctly indexed in the setMeshBuffers function
 
-					attribute = {};
+				// Not sure how to best translate this into non-indexed arrays
+				// used for particles, as there are no geometry chunks here
+				// Probably could be simplified
 
-					for ( property in originalAttribute ) {
+				originalAttribute = material.attributes[ a ];
 
-						attribute[ property ] = originalAttribute[ property ];
+				attribute = {};
 
-					}
+				for ( property in originalAttribute ) {
 
-					if( !attribute.__webglInitialized || attribute.createUniqueBuffers ) {
+					attribute[ property ] = originalAttribute[ property ];
 
-						attribute.__webglInitialized = true;
+				}
 
-						size = 1;		// "f" and "i"
+				if( !attribute.__webglInitialized || attribute.createUniqueBuffers ) {
 
-						if ( attribute.type === "v2" ) size = 2;
-						else if ( attribute.type === "v3" ) size = 3;
-						else if ( attribute.type === "v4" ) size = 4;
-						else if ( attribute.type === "c"  ) size = 3;
+					attribute.__webglInitialized = true;
 
-						attribute.size = size;
-						attribute.array = new Float32Array( nvertices * size );
-						attribute.buffer = _gl.createBuffer();
-						attribute.buffer.belongsToAttribute = a;
+					size = 1;		// "f" and "i"
 
-						originalAttribute.needsUpdate = true;
-						attribute.__original = originalAttribute;
+					if ( attribute.type === "v2" ) size = 2;
+					else if ( attribute.type === "v3" ) size = 3;
+					else if ( attribute.type === "v4" ) size = 4;
+					else if ( attribute.type === "c"  ) size = 3;
 
-					}
+					attribute.size = size;
+					attribute.array = new Float32Array( nvertices * size );
+					attribute.buffer = _gl.createBuffer();
+					attribute.buffer.belongsToAttribute = a;
 
-					geometry.__webglCustomAttributesList.push( attribute );
+					originalAttribute.needsUpdate = true;
+					attribute.__original = originalAttribute;
 
 				}
 
+				geometry.__webglCustomAttributesList.push( attribute );
+
 			}
 
 		}
@@ -765,14 +757,14 @@ THREE.WebGLRenderer = function ( parameters ) {
 		uvType,
 		vertexColorType,
 		normalType,
-		materials, material,
+		material,
 		attribute, property, originalAttribute,
 
 		geometry = object.geometry,
 		obj_faces = geometry.faces,
 		chunk_faces = geometryGroup.faces;
 
-		for ( f = 0, fl = chunk_faces.length; f < fl; f++ ) {
+		for ( f = 0, fl = chunk_faces.length; f < fl; f ++ ) {
 
 			fi = chunk_faces[ f ];
 			face = obj_faces[ fi ];
@@ -793,21 +785,13 @@ THREE.WebGLRenderer = function ( parameters ) {
 
 		}
 
-		materials = unrollGroupMaterials( geometryGroup, object );
-
-		// this will not work if materials would change in run-time
-		// it should be refreshed every frame
-		// but need to do unrollGroupMaterials
-		// more properly without push to array
-		// like unrollBufferMaterials
+		material = ( geometryGroup.materialIndex >= 0 ) ? geometry.materials[ geometryGroup.materialIndex ] : object.material;
 
-		geometryGroup.__materials = materials;
+		uvType = bufferGuessUVType( material );
+		normalType = bufferGuessNormalType( material );
+		vertexColorType = bufferGuessVertexColorType( material );
 
-		uvType = bufferGuessUVType( materials, geometryGroup, object );
-		normalType = bufferGuessNormalType( materials, geometryGroup, object );
-		vertexColorType = bufferGuessVertexColorType( materials, geometryGroup, object );
-
-		//console.log("uvType",uvType, "normalType",normalType, "vertexColorType",vertexColorType, object, geometryGroup, materials );
+		//console.log( "uvType", uvType, "normalType", normalType, "vertexColorType", vertexColorType, object, geometryGroup, material );
 
 		geometryGroup.__vertexArray = new Float32Array( nvertices * 3 );
 
@@ -881,58 +865,52 @@ THREE.WebGLRenderer = function ( parameters ) {
 
 		// custom attributes
 
-		for ( m = 0, ml = materials.length; m < ml; m ++ ) {
-
-			material = materials[ m ];
-
-			if ( material.attributes ) {
-
-				if ( geometryGroup.__webglCustomAttributesList === undefined ) {
-
-					geometryGroup.__webglCustomAttributesList = [];
+		if ( material.attributes ) {
 
-				}
+			if ( geometryGroup.__webglCustomAttributesList === undefined ) {
 
-				for ( a in material.attributes ) {
+				geometryGroup.__webglCustomAttributesList = [];
 
-					// Do a shallow copy of the attribute object so different geometryGroup chunks use different
-					// attribute buffers which are correctly indexed in the setMeshBuffers function
+			}
 
-					originalAttribute = material.attributes[ a ];
+			for ( var a in material.attributes ) {
 
-					attribute = {};
+				// Do a shallow copy of the attribute object so different geometryGroup chunks use different
+				// attribute buffers which are correctly indexed in the setMeshBuffers function
 
-					for ( property in originalAttribute ) {
+				originalAttribute = material.attributes[ a ];
 
-						attribute[ property ] = originalAttribute[ property ];
+				attribute = {};
 
-					}
+				for ( property in originalAttribute ) {
 
-					if( !attribute.__webglInitialized || attribute.createUniqueBuffers ) {
+					attribute[ property ] = originalAttribute[ property ];
 
-						attribute.__webglInitialized = true;
+				}
 
-						size = 1;		// "f" and "i"
+				if( !attribute.__webglInitialized || attribute.createUniqueBuffers ) {
 
-						if( attribute.type === "v2" ) size = 2;
-						else if( attribute.type === "v3" ) size = 3;
-						else if( attribute.type === "v4" ) size = 4;
-						else if( attribute.type === "c"  ) size = 3;
+					attribute.__webglInitialized = true;
 
-						attribute.size = size;
-						attribute.array = new Float32Array( nvertices * size );
-						attribute.buffer = _gl.createBuffer();
-						attribute.buffer.belongsToAttribute = a;
+					size = 1;		// "f" and "i"
 
-						originalAttribute.needsUpdate = true;
-						attribute.__original = originalAttribute;
+					if( attribute.type === "v2" ) size = 2;
+					else if( attribute.type === "v3" ) size = 3;
+					else if( attribute.type === "v4" ) size = 4;
+					else if( attribute.type === "c"  ) size = 3;
 
-					}
+					attribute.size = size;
+					attribute.array = new Float32Array( nvertices * size );
+					attribute.buffer = _gl.createBuffer();
+					attribute.buffer.belongsToAttribute = a;
 
-					geometryGroup.__webglCustomAttributesList.push( attribute );
+					originalAttribute.needsUpdate = true;
+					attribute.__original = originalAttribute;
 
 				}
 
+				geometryGroup.__webglCustomAttributesList.push( attribute );
+
 			}
 
 		}
@@ -2551,6 +2529,7 @@ THREE.WebGLRenderer = function ( parameters ) {
 		}
 
 		uniforms.map.texture = material.map;
+
 		if ( material.map ) {
 
 			uniforms.offsetRepeat.value.set( material.map.offset.x, material.map.offset.y, material.map.repeat.x, material.map.repeat.y );
@@ -3491,9 +3470,9 @@ THREE.WebGLRenderer = function ( parameters ) {
 
 	};
 
-	function unrollImmediateBufferMaterials( globject ) {
+	function unrollImmediateBufferMaterial( globject ) {
 
-		var i, l, m, ml, material,
+		var material,
 			object = globject.object,
 			opaque = globject.opaque,
 			transparent = globject.transparent;
@@ -3501,16 +3480,12 @@ THREE.WebGLRenderer = function ( parameters ) {
 		transparent.count = 0;
 		opaque.count = 0;
 
-		for ( m = 0, ml = object.materials.length; m < ml; m ++ ) {
-
-			material = object.materials[ m ];
-			material.transparent ? addToFixedArray( transparent, material ) : addToFixedArray( opaque, material );
-
-		}
+		material = object.material;
+		material.transparent ? addToFixedArray( transparent, material ) : addToFixedArray( opaque, material );
 
 	};
 
-	function unrollBufferMaterials( globject ) {
+	function unrollBufferMaterial( globject ) {
 
 		var i, l, m, ml, material, meshMaterial,
 			object = globject.object,
@@ -3521,25 +3496,23 @@ THREE.WebGLRenderer = function ( parameters ) {
 		transparent.count = 0;
 		opaque.count = 0;
 
-		for ( m = 0, ml = object.materials.length; m < ml; m ++ ) {
+		meshMaterial = object.material;
 
-			meshMaterial = object.materials[ m ];
+		if ( meshMaterial instanceof THREE.MeshFaceMaterial ) {
 
-			if ( meshMaterial instanceof THREE.MeshFaceMaterial ) {
+			materialIndex = buffer.materialIndex;
 
-				for ( i = 0, l = buffer.materials.length; i < l; i ++ ) {
+			if ( materialIndex >= 0 ) {
 
-					material = buffer.materials[ i ];
-					if ( material ) material.transparent ? addToFixedArray( transparent, material ) : addToFixedArray( opaque, material );
-
-				}
+				material = object.geometry.materials[ materialIndex ];
+				material.transparent ? addToFixedArray( transparent, material ) : addToFixedArray( opaque, material );
 
-			} else {
+			}
 
-				material = meshMaterial;
-				if ( material ) material.transparent ? addToFixedArray( transparent, material ) : addToFixedArray( opaque, material );
+		} else {
 
-			}
+			material = meshMaterial;
+			if ( material ) material.transparent ? addToFixedArray( transparent, material ) : addToFixedArray( opaque, material );
 
 		}
 
@@ -3827,7 +3800,7 @@ THREE.WebGLRenderer = function ( parameters ) {
 
 					setupMatrices( object, camera, true );
 
-					unrollBufferMaterials( webglObject );
+					unrollBufferMaterial( webglObject );
 
 					webglObject.render = true;
 
@@ -3885,7 +3858,7 @@ THREE.WebGLRenderer = function ( parameters ) {
 
 				setupMatrices( object, camera, true );
 
-				unrollImmediateBufferMaterials( webglObject );
+				unrollImmediateBufferMaterial( webglObject );
 
 			}
 
@@ -4433,23 +4406,15 @@ THREE.WebGLRenderer = function ( parameters ) {
 
 	};
 
-	function areCustomAttributesDirty( geometryGroup ) {
+	function areCustomAttributesDirty( geometryGroup, object ) {
 
-		var a, m, ml, material, materials;
+		var material = ( geometryGroup.materialIndex >= 0 ) ? object.geometry.materials[ geometryGroup.materialIndex ] : object.material;
 
-		materials = geometryGroup.__materials;
-
-		for ( m = 0, ml = materials.length; m < ml; m ++ ) {
-
-			material = materials[ m ];
-
-			if ( material.attributes ) {
+		if ( material.attributes ) {
 
-				for ( a in material.attributes ) {
+			for ( var a in material.attributes ) {
 
-					if ( material.attributes[ a ].needsUpdate ) return true;
-
-				}
+				if ( material.attributes[ a ].needsUpdate ) return true;
 
 			}
 
@@ -4459,23 +4424,15 @@ THREE.WebGLRenderer = function ( parameters ) {
 
 	};
 
-	function clearCustomAttributes( geometryGroup ) {
-
-		var a, m, ml, material, materials;
-
-		materials = geometryGroup.__materials;
-
-		for ( m = 0, ml = materials.length; m < ml; m ++ ) {
+	function clearCustomAttributes( geometryGroup, object ) {
 
-			material = materials[ m ];
+		var material = ( geometryGroup.materialIndex >= 0 ) ? object.geometry.materials[ geometryGroup.materialIndex ] : object.material;
 
-			if ( material.attributes ) {
-
-				for ( a in material.attributes ) {
+		if ( material.attributes ) {
 
-					material.attributes[ a ].needsUpdate = false;
+			for ( var a in material.attributes ) {
 
-				}
+				material.attributes[ a ].needsUpdate = false;
 
 			}
 
@@ -4497,7 +4454,7 @@ THREE.WebGLRenderer = function ( parameters ) {
 
 				geometryGroup = geometry.geometryGroupsList[ i ];
 
-				customAttributeDirty = areCustomAttributesDirty( geometryGroup );
+				customAttributeDirty = areCustomAttributesDirty( geometryGroup, object );
 
 				if ( geometry.__dirtyVertices || geometry.__dirtyMorphTargets || geometry.__dirtyElements ||
 					 geometry.__dirtyUvs || geometry.__dirtyNormals ||
@@ -4517,7 +4474,7 @@ THREE.WebGLRenderer = function ( parameters ) {
 			geometry.__dirtyTangents = false;
 			geometry.__dirtyColors = false;
 
-			clearCustomAttributes( geometryGroup );
+			clearCustomAttributes( geometryGroup, object );
 
 		} else if ( object instanceof THREE.Ribbon ) {
 
@@ -4549,7 +4506,7 @@ THREE.WebGLRenderer = function ( parameters ) {
 
 			geometry = object.geometry;
 
-			customAttributeDirty = areCustomAttributesDirty( geometry );
+			customAttributeDirty = areCustomAttributesDirty( geometry, object );
 
 			if ( geometry.__dirtyVertices || geometry.__dirtyColors || object.sortParticles || customAttributeDirty ) {
 
@@ -4560,7 +4517,7 @@ THREE.WebGLRenderer = function ( parameters ) {
 			geometry.__dirtyVertices = false;
 			geometry.__dirtyColors = false;
 
-			clearCustomAttributes( geometry );
+			clearCustomAttributes( geometry, object );
 
 		}/* else if ( THREE.MarchingCubes !== undefined && object instanceof THREE.MarchingCubes ) {
 
@@ -4634,44 +4591,17 @@ THREE.WebGLRenderer = function ( parameters ) {
 
 	function sortFacesByMaterial( geometry ) {
 
-		// TODO
-		// Should optimize by grouping faces with ColorFill / ColorStroke materials
-		// which could then use vertex color attributes instead of each being
-		// in its separate VBO
-
-		var i, l, f, fl, face, material, materials, vertices, mhash, ghash, hash_map = {};
+		var i, l, f, fl, face, materialIndex, vertices, mhash, ghash, hash_map = {};
 		var numMorphTargets = geometry.morphTargets !== undefined ? geometry.morphTargets.length : 0;
 
 		geometry.geometryGroups = {};
 
-		function materialHash( material ) {
-
-			var hash_array = [];
-
-			for ( i = 0, l = material.length; i < l; i ++ ) {
-
-				if ( material[ i ] == undefined ) {
-
-					hash_array.push( "undefined" );
-
-				} else {
-
-					hash_array.push( material[ i ].id );
-
-				}
-
-			}
-
-			return hash_array.join( '_' );
-
-		}
-
 		for ( f = 0, fl = geometry.faces.length; f < fl; f ++ ) {
 
 			face = geometry.faces[ f ];
-			materials = face.materials;
+			materialIndex = face.materialIndex;
 
-			mhash = materialHash( materials );
+			mhash = ( materialIndex !== undefined ) ? materialIndex : -1;
 
 			if ( hash_map[ mhash ] == undefined ) {
 
@@ -4683,7 +4613,7 @@ THREE.WebGLRenderer = function ( parameters ) {
 
 			if ( geometry.geometryGroups[ ghash ] == undefined ) {
 
-				geometry.geometryGroups[ ghash ] = { 'faces': [], 'materials': materials, 'vertices': 0, 'numMorphTargets': numMorphTargets };
+				geometry.geometryGroups[ ghash ] = { 'faces': [], 'materialIndex': materialIndex, 'vertices': 0, 'numMorphTargets': numMorphTargets };
 
 			}
 
@@ -4696,7 +4626,7 @@ THREE.WebGLRenderer = function ( parameters ) {
 
 				if ( geometry.geometryGroups[ ghash ] == undefined ) {
 
-					geometry.geometryGroups[ ghash ] = { 'faces': [], 'materials': materials, 'vertices': 0, 'numMorphTargets': numMorphTargets };
+					geometry.geometryGroups[ ghash ] = { 'faces': [], 'materialIndex': materialIndex, 'vertices': 0, 'numMorphTargets': numMorphTargets };
 
 				}
 
@@ -4721,21 +4651,25 @@ THREE.WebGLRenderer = function ( parameters ) {
 
 	function addBuffer( objlist, buffer, object ) {
 
-		objlist.push( {
-			buffer: buffer, object: object,
-			opaque: { list: [], count: 0 },
-			transparent: { list: [], count: 0 }
-		} );
+		objlist.push(
+			{
+				buffer: buffer, object: object,
+				opaque: { list: [], count: 0 },
+				transparent: { list: [], count: 0 }
+			}
+		);
 
 	};
 
 	function addBufferImmediate( objlist, object ) {
 
-		objlist.push( {
-			object: object,
-			opaque: { list: [], count: 0 },
-			transparent: { list: [], count: 0 }
-		} );
+		objlist.push(
+			{
+				object: object,
+				opaque: { list: [], count: 0 },
+				transparent: { list: [], count: 0 }
+			}
+		);
 
 	};
 
@@ -5652,103 +5586,11 @@ THREE.WebGLRenderer = function ( parameters ) {
 
 	};
 
-	function bufferNeedsSmoothNormals( geometryGroup, object ) {
-
-		var m, ml, i, l, meshMaterial, needsSmoothNormals = false;
-
-		for ( m = 0, ml = object.materials.length; m < ml; m++ ) {
-
-			meshMaterial = object.materials[ m ];
+	function bufferGuessVertexColorType( material ) {
 
-			if ( meshMaterial instanceof THREE.MeshFaceMaterial ) {
+		if ( material.vertexColors ) {
 
-				for ( i = 0, l = geometryGroup.materials.length; i < l; i++ ) {
-
-					if ( materialNeedsSmoothNormals( geometryGroup.materials[ i ] ) ) {
-
-						needsSmoothNormals = true;
-						break;
-
-					}
-
-				}
-
-			} else {
-
-				if ( materialNeedsSmoothNormals( meshMaterial ) ) {
-
-					needsSmoothNormals = true;
-					break;
-
-				}
-
-			}
-
-			if ( needsSmoothNormals ) break;
-
-		}
-
-		return needsSmoothNormals;
-
-	};
-
-	function unrollGroupMaterials( geometryGroup, object ) {
-
-		var m, ml, i, il,
-			material, meshMaterial,
-			materials = [];
-
-		for ( m = 0, ml = object.materials.length; m < ml; m ++ ) {
-
-			meshMaterial = object.materials[ m ];
-
-			if ( meshMaterial instanceof THREE.MeshFaceMaterial ) {
-
-				for ( i = 0, l = geometryGroup.materials.length; i < l; i ++ ) {
-
-					material = geometryGroup.materials[ i ];
-
-					if ( material ) {
-
-						materials.push( material );
-
-					}
-
-				}
-
-			} else {
-
-				material = meshMaterial;
-
-				if ( material ) {
-
-					materials.push( material );
-
-				}
-
-			}
-
-		}
-
-		return materials;
-
-	};
-
-	function bufferGuessVertexColorType( materials, geometryGroup, object ) {
-
-		var i, m, ml = materials.length;
-
-		// use vertexColor type from the first material in unrolled materials
-
-		for ( i = 0; i < ml; i ++ ) {
-
-			m = materials[ i ];
-
-			if ( m.vertexColors ) {
-
-				return m.vertexColors;
-
-			}
+			return material.vertexColors;
 
 		}
 
@@ -5756,49 +5598,35 @@ THREE.WebGLRenderer = function ( parameters ) {
 
 	};
 
-	function bufferGuessNormalType( materials, geometryGroup, object ) {
-
-		var i, m, ml = materials.length;
+	function bufferGuessNormalType( material ) {
 
 		// only MeshBasicMaterial and MeshDepthMaterial don't need normals
 
-		for ( i = 0; i < ml; i ++ ) {
+		if ( ( material instanceof THREE.MeshBasicMaterial && !material.envMap ) || material instanceof THREE.MeshDepthMaterial ) {
 
-			m = materials[ i ];
+			return false;
 
-			if ( ( m instanceof THREE.MeshBasicMaterial && !m.envMap ) || m instanceof THREE.MeshDepthMaterial ) continue;
+		}
 
-			if ( materialNeedsSmoothNormals( m ) ) {
+		if ( materialNeedsSmoothNormals( material ) ) {
 
-				return THREE.SmoothShading;
+			return THREE.SmoothShading;
 
-			} else {
+		} else {
 
-				return THREE.FlatShading;
-
-			}
+			return THREE.FlatShading;
 
 		}
 
-		return false;
-
 	};
 
-	function bufferGuessUVType( materials, geometryGroup, object ) {
-
-		var i, m, ml = materials.length;
+	function bufferGuessUVType( material ) {
 
 		// material must use some texture to require uvs
 
-		for ( i = 0; i < ml; i++ ) {
+		if ( material.map || material.lightMap || material instanceof THREE.ShaderMaterial ) {
 
-			m = materials[ i ];
-
-			if ( m.map || m.lightMap || m instanceof THREE.ShaderMaterial ) {
-
-				return true;
-
-			}
+			return true;
 
 		}
 

Some files were not shown because too many files changed in this diff