Browse Source

Merge pull request #6263 from bhouston/ambientOcclusionMap

Modification of LightMap and addition of AOMap to Materials.
Mr.doob 10 years ago
parent
commit
3d85d2ce70

+ 78 - 0
editor/js/Sidebar.Material.js

@@ -278,6 +278,32 @@ Sidebar.Material = function ( editor ) {
 
 
 	container.add( materialEnvMapRow );
 	container.add( materialEnvMapRow );
 
 
+	// light map
+
+	var materialLightMapRow = new UI.Panel();
+	var materialLightMapEnabled = new UI.Checkbox( false ).onChange( update );
+	var materialLightMap = new UI.Texture().onChange( update );
+
+	materialLightMapRow.add( new UI.Text( 'Light Map' ).setWidth( '90px' ) );
+	materialLightMapRow.add( materialLightMapEnabled );
+	materialLightMapRow.add( materialLightMap );
+
+	container.add( materialLightMapRow );
+
+	// ambient occlusion map
+
+	var materialAOMapRow = new UI.Panel();
+	var materialAOMapEnabled = new UI.Checkbox( false ).onChange( update );
+	var materialAOMap = new UI.Texture().onChange( update );
+	var materialAOScale = new UI.Number( 1 ).setRange( 0, 1 ).setWidth( '30px' ).onChange( update );
+
+	materialAOMapRow.add( new UI.Text( 'AO Map' ).setWidth( '90px' ) );
+	materialAOMapRow.add( materialAOMapEnabled );
+	materialAOMapRow.add( materialAOMap );
+	materialAOMapRow.add( materialAOScale );
+
+	container.add( materialAOMapRow );
+
 	// side
 	// side
 
 
 	var materialSideRow = new UI.Panel();
 	var materialSideRow = new UI.Panel();
@@ -574,6 +600,41 @@ Sidebar.Material = function ( editor ) {
 
 
 			}
 			}
 
 
+
+			if ( material.lightMap !== undefined ) {
+
+				var lightMapEnabled = materialLightMapEnabled.getValue() === true;
+
+				if ( objectHasUvs ) {
+
+					material.lightMap = specularMapEnabled ? materialLightMap.getValue() : null;
+					material.needsUpdate = true;
+
+				} else {
+
+					if ( lightMapEnabled ) textureWarning = true;
+
+				}
+
+			}
+
+			if ( material.aoMap !== undefined ) {
+
+				var aoMapEnabled = materialAOMapEnabled.getValue() === true;
+
+				if ( objectHasUvs ) {
+
+					material.aoMap = aoMapEnabled ? materialAOMap.getValue() : null;
+					material.aoMapIntensity = materialAOScale.getValue();
+					material.needsUpdate = true;
+
+				} else {
+
+					if ( aoMapEnabled ) textureWarning = true;
+
+				}
+
+			}
 			if ( material.side !== undefined ) {
 			if ( material.side !== undefined ) {
 
 
 				material.side = parseInt( materialSide.getValue() );
 				material.side = parseInt( materialSide.getValue() );
@@ -650,6 +711,8 @@ Sidebar.Material = function ( editor ) {
 			'normalMap': materialNormalMapRow,
 			'normalMap': materialNormalMapRow,
 			'specularMap': materialSpecularMapRow,
 			'specularMap': materialSpecularMapRow,
 			'envMap': materialEnvMapRow,
 			'envMap': materialEnvMapRow,
+			'lightMap': materialLightMapRow,
+			'aoMap': materialAOMapRow,
 			'side': materialSideRow,
 			'side': materialSideRow,
 			'shading': materialShadingRow,
 			'shading': materialShadingRow,
 			'blending': materialBlendingRow,
 			'blending': materialBlendingRow,
@@ -799,6 +862,21 @@ Sidebar.Material = function ( editor ) {
 
 
 			}
 			}
 
 
+			if ( material.aoMap !== undefined ) {
+
+				materialAOMapEnabled.setValue( material.aoMap !== null );
+				materialAOMap.setValue( material.aoMap );
+				materialAOScale.setValue( material.aoMapIntensity );
+
+			}
+
+			if ( material.lightMap !== undefined ) {
+
+				materialLightMapEnabled.setValue( material.lightMap !== null );
+				materialLightMap.setValue( material.lightMap );
+
+			}
+
 			if ( material.side !== undefined ) {
 			if ( material.side !== undefined ) {
 
 
 				materialSide.setValue( material.side );
 				materialSide.setValue( material.side );

+ 6 - 6
examples/webgl_materials_lightmap.html

@@ -100,12 +100,7 @@
 
 
 				// LIGHTS
 				// LIGHTS
 
 
-				var directionalLight = new THREE.DirectionalLight( 0x333333, 2 );
-				directionalLight.position.set( 100, 100, -100 );
-				scene.add( directionalLight );
-
-
-				var hemiLight = new THREE.HemisphereLight( 0xaabbff, 0x040404, 1 );
+				var hemiLight = new THREE.HemisphereLight( 0xaabbff, 0x040404, 0.3 );
 
 
 				hemiLight.position.y = 500;
 				hemiLight.position.y = 500;
 				scene.add( hemiLight );
 				scene.add( hemiLight );
@@ -157,7 +152,12 @@
 				var loader = new THREE.JSONLoader();
 				var loader = new THREE.JSONLoader();
 				loader.load( "obj/lightmap/lightmap.js", function ( geometry, materials ) {
 				loader.load( "obj/lightmap/lightmap.js", function ( geometry, materials ) {
 
 
+					for( var i = 0; i < materials.length; i ++ ) {
+						materials[i].lightMapIntensity = 0.75;
+					}
+
 					var mesh = new THREE.Mesh( geometry, new THREE.MeshFaceMaterial( materials ) );
 					var mesh = new THREE.Mesh( geometry, new THREE.MeshFaceMaterial( materials ) );
+
 					mesh.scale.multiplyScalar( 100 );
 					mesh.scale.multiplyScalar( 100 );
 					scene.add( mesh );
 					scene.add( mesh );
 
 

+ 6 - 0
src/loaders/Loader.js

@@ -347,6 +347,12 @@ THREE.Loader.prototype = {
 
 
 		}
 		}
 
 
+		if ( m.mapAO && texturePath ) {
+
+			create_texture( mpars, 'aoMap', m.mapAO, m.mapAORepeat, m.mapAOOffset, m.mapAOWrap, m.mapAOAnisotropy );
+
+		}
+
 		if ( m.mapBump && texturePath ) {
 		if ( m.mapBump && texturePath ) {
 
 
 			create_texture( mpars, 'bumpMap', m.mapBump, m.mapBumpRepeat, m.mapBumpOffset, m.mapBumpWrap, m.mapBumpAnisotropy );
 			create_texture( mpars, 'bumpMap', m.mapBump, m.mapBumpRepeat, m.mapBumpOffset, m.mapBumpWrap, m.mapBumpAnisotropy );

+ 14 - 2
src/loaders/ObjectLoader.js

@@ -247,7 +247,7 @@ THREE.ObjectLoader.prototype = {
 				if ( data.bumpMap !== undefined ) {
 				if ( data.bumpMap !== undefined ) {
 
 
 					material.bumpMap = getTexture( data.bumpMap );
 					material.bumpMap = getTexture( data.bumpMap );
-					if ( data.bumpScale ) {
+					if ( data.bumpScale !== undefined ) {
 						material.bumpScale = data.bumpScale;
 						material.bumpScale = data.bumpScale;
 					}
 					}
 
 
@@ -268,7 +268,7 @@ THREE.ObjectLoader.prototype = {
 				if ( data.normalMap !== undefined ) {
 				if ( data.normalMap !== undefined ) {
 
 
 					material.normalMap = getTexture( data.normalMap );
 					material.normalMap = getTexture( data.normalMap );
-					if ( data.normalScale ) {
+					if ( data.normalScale !== undefined ) {
 						material.normalScale = new THREE.Vector2( data.normalScale, data.normalScale );
 						material.normalScale = new THREE.Vector2( data.normalScale, data.normalScale );
 					}
 					}
 
 
@@ -278,6 +278,18 @@ THREE.ObjectLoader.prototype = {
 
 
 					material.lightMap = getTexture( data.lightMap );
 					material.lightMap = getTexture( data.lightMap );
 
 
+					if ( data.lightMapIntensity !== undefined ) {
+						material.lightMapIntensity = data.lightMapIntensity;
+					}
+
+				}
+
+				if ( data.aoMap !== undefined ) {
+
+					material.aoMap = getTexture( data.aoMap );
+					if ( data.aoMapIntensity !== undefined ) {
+						material.aoMapIntensity = data.aoMapIntensity;
+					}
 				}
 				}
 
 
 				if ( data.specularMap !== undefined ) {
 				if ( data.specularMap !== undefined ) {

+ 12 - 0
src/materials/MeshPhongMaterial.js

@@ -12,6 +12,10 @@
  *  map: new THREE.Texture( <Image> ),
  *  map: new THREE.Texture( <Image> ),
  *
  *
  *  lightMap: new THREE.Texture( <Image> ),
  *  lightMap: new THREE.Texture( <Image> ),
+ *  lightMapIntensity: <float>
+ *
+ *  aoMap: new THREE.Texture( <Image> ),
+ *  aoMapIntensity: <float>
  *
  *
  *  bumpMap: new THREE.Texture( <Image> ),
  *  bumpMap: new THREE.Texture( <Image> ),
  *  bumpScale: <float>,
  *  bumpScale: <float>,
@@ -65,6 +69,10 @@ THREE.MeshPhongMaterial = function ( parameters ) {
 	this.map = null;
 	this.map = null;
 
 
 	this.lightMap = null;
 	this.lightMap = null;
+	this.lightMapIntensity = 1.0;
+
+	this.aoMap = null;
+	this.aoMapIntensity = 1.0;
 
 
 	this.bumpMap = null;
 	this.bumpMap = null;
 	this.bumpScale = 1;
 	this.bumpScale = 1;
@@ -122,6 +130,10 @@ THREE.MeshPhongMaterial.prototype.clone = function () {
 	material.map = this.map;
 	material.map = this.map;
 
 
 	material.lightMap = this.lightMap;
 	material.lightMap = this.lightMap;
+	material.lightMapIntensity = this.lightMapIntensity;
+
+	material.aoMap = this.aoMap;
+	material.aoMapIntensity = this.aoMapIntensity;
 
 
 	material.bumpMap = this.bumpMap;
 	material.bumpMap = this.bumpMap;
 	material.bumpScale = this.bumpScale;
 	material.bumpScale = this.bumpScale;

+ 4 - 0
src/renderers/WebGLRenderer.js

@@ -4139,6 +4139,7 @@ THREE.WebGLRenderer = function ( parameters ) {
 			envMap: !! material.envMap,
 			envMap: !! material.envMap,
 			envMapMode: material.envMap && material.envMap.mapping,
 			envMapMode: material.envMap && material.envMap.mapping,
 			lightMap: !! material.lightMap,
 			lightMap: !! material.lightMap,
+			aoMap: !! material.aoMap,
 			bumpMap: !! material.bumpMap,
 			bumpMap: !! material.bumpMap,
 			normalMap: !! material.normalMap,
 			normalMap: !! material.normalMap,
 			specularMap: !! material.specularMap,
 			specularMap: !! material.specularMap,
@@ -4581,6 +4582,9 @@ THREE.WebGLRenderer = function ( parameters ) {
 
 
 		uniforms.map.value = material.map;
 		uniforms.map.value = material.map;
 		uniforms.lightMap.value = material.lightMap;
 		uniforms.lightMap.value = material.lightMap;
+		uniforms.lightMapIntensity.value = material.lightMapIntensity;
+		uniforms.aoMap.value = material.aoMap;
+		uniforms.aoMapIntensity.value = material.aoMapIntensity;
 		uniforms.specularMap.value = material.specularMap;
 		uniforms.specularMap.value = material.specularMap;
 		uniforms.alphaMap.value = material.alphaMap;
 		uniforms.alphaMap.value = material.alphaMap;
 
 

+ 5 - 0
src/renderers/shaders/ShaderChunk/aomap_fragment.glsl

@@ -0,0 +1,5 @@
+#ifdef USE_AOMAP
+
+	outgoingLight *= ( texture2D( aoMap, vUv2 ).r - 1.0 ) * aoMapIntensity + 1.0;
+
+#endif

+ 6 - 0
src/renderers/shaders/ShaderChunk/aomap_pars_fragment.glsl

@@ -0,0 +1,6 @@
+#ifdef USE_AOMAP
+
+	uniform sampler2D aoMap;
+	uniform float aoMapIntensity;
+
+#endif

+ 1 - 1
src/renderers/shaders/ShaderChunk/lightmap_fragment.glsl

@@ -1,5 +1,5 @@
 #ifdef USE_LIGHTMAP
 #ifdef USE_LIGHTMAP
 
 
-	outgoingLight *= diffuseColor.xyz * texture2D( lightMap, vUv2 ).xyz;
+	outgoingLight += diffuseColor.xyz * texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;
 
 
 #endif
 #endif

+ 1 - 1
src/renderers/shaders/ShaderChunk/lightmap_pars_fragment.glsl

@@ -1,6 +1,6 @@
 #ifdef USE_LIGHTMAP
 #ifdef USE_LIGHTMAP
 
 
-	varying vec2 vUv2;
 	uniform sampler2D lightMap;
 	uniform sampler2D lightMap;
+	uniform float lightMapIntensity;
 
 
 #endif
 #endif

+ 0 - 5
src/renderers/shaders/ShaderChunk/lightmap_pars_vertex.glsl

@@ -1,5 +0,0 @@
-#ifdef USE_LIGHTMAP
-
-	varying vec2 vUv2;
-
-#endif

+ 0 - 5
src/renderers/shaders/ShaderChunk/lightmap_vertex.glsl

@@ -1,5 +0,0 @@
-#ifdef USE_LIGHTMAP
-
-	vUv2 = uv2;
-
-#endif

+ 0 - 6
src/renderers/shaders/ShaderChunk/map_pars_fragment.glsl

@@ -1,9 +1,3 @@
-#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP )
-
-	varying vec2 vUv;
-
-#endif
-
 #ifdef USE_MAP
 #ifdef USE_MAP
 
 
 	uniform sampler2D map;
 	uniform sampler2D map;

+ 5 - 0
src/renderers/shaders/ShaderChunk/uv2_pars_fragment.glsl

@@ -0,0 +1,5 @@
+#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )
+
+	varying vec2 vUv2;
+
+#endif

+ 6 - 0
src/renderers/shaders/ShaderChunk/uv2_pars_vertex.glsl

@@ -0,0 +1,6 @@
+#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )
+
+	attribute vec2 uv2;
+	varying vec2 vUv2;
+
+#endif

+ 5 - 0
src/renderers/shaders/ShaderChunk/uv2_vertex.glsl

@@ -0,0 +1,5 @@
+#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )
+
+	vUv2 = uv2;
+
+#endif

+ 5 - 0
src/renderers/shaders/ShaderChunk/uv_pars_fragment.glsl

@@ -0,0 +1,5 @@
+#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP )
+
+	varying vec2 vUv;
+
+#endif

+ 0 - 0
src/renderers/shaders/ShaderChunk/map_pars_vertex.glsl → src/renderers/shaders/ShaderChunk/uv_pars_vertex.glsl


+ 0 - 0
src/renderers/shaders/ShaderChunk/map_vertex.glsl → src/renderers/shaders/ShaderChunk/uv_vertex.glsl


+ 25 - 13
src/renderers/shaders/ShaderLib.js

@@ -22,8 +22,8 @@ THREE.ShaderLib = {
 		vertexShader: [
 		vertexShader: [
 
 
 			THREE.ShaderChunk[ "common" ],
 			THREE.ShaderChunk[ "common" ],
-			THREE.ShaderChunk[ "map_pars_vertex" ],
-			THREE.ShaderChunk[ "lightmap_pars_vertex" ],
+			THREE.ShaderChunk[ "uv_pars_vertex" ],
+			THREE.ShaderChunk[ "uv2_pars_vertex" ],
 			THREE.ShaderChunk[ "envmap_pars_vertex" ],
 			THREE.ShaderChunk[ "envmap_pars_vertex" ],
 			THREE.ShaderChunk[ "color_pars_vertex" ],
 			THREE.ShaderChunk[ "color_pars_vertex" ],
 			THREE.ShaderChunk[ "morphtarget_pars_vertex" ],
 			THREE.ShaderChunk[ "morphtarget_pars_vertex" ],
@@ -33,8 +33,8 @@ THREE.ShaderLib = {
 
 
 			"void main() {",
 			"void main() {",
 
 
-				THREE.ShaderChunk[ "map_vertex" ],
-				THREE.ShaderChunk[ "lightmap_vertex" ],
+				THREE.ShaderChunk[ "uv_vertex" ],
+				THREE.ShaderChunk[ "uv2_vertex" ],
 				THREE.ShaderChunk[ "color_vertex" ],
 				THREE.ShaderChunk[ "color_vertex" ],
 				THREE.ShaderChunk[ "skinbase_vertex" ],
 				THREE.ShaderChunk[ "skinbase_vertex" ],
 
 
@@ -66,8 +66,11 @@ THREE.ShaderLib = {
 
 
 			THREE.ShaderChunk[ "common" ],
 			THREE.ShaderChunk[ "common" ],
 			THREE.ShaderChunk[ "color_pars_fragment" ],
 			THREE.ShaderChunk[ "color_pars_fragment" ],
+			THREE.ShaderChunk[ "uv_pars_fragment" ],
+			THREE.ShaderChunk[ "uv2_pars_fragment" ],
 			THREE.ShaderChunk[ "map_pars_fragment" ],
 			THREE.ShaderChunk[ "map_pars_fragment" ],
 			THREE.ShaderChunk[ "alphamap_pars_fragment" ],
 			THREE.ShaderChunk[ "alphamap_pars_fragment" ],
+			THREE.ShaderChunk[ "aomap_pars_fragment" ],
 			THREE.ShaderChunk[ "lightmap_pars_fragment" ],
 			THREE.ShaderChunk[ "lightmap_pars_fragment" ],
 			THREE.ShaderChunk[ "envmap_pars_fragment" ],
 			THREE.ShaderChunk[ "envmap_pars_fragment" ],
 			THREE.ShaderChunk[ "fog_pars_fragment" ],
 			THREE.ShaderChunk[ "fog_pars_fragment" ],
@@ -89,7 +92,8 @@ THREE.ShaderLib = {
 
 
 			"	outgoingLight = diffuseColor.rgb;", // simple shader
 			"	outgoingLight = diffuseColor.rgb;", // simple shader
 
 
-				THREE.ShaderChunk[ "lightmap_fragment" ],		// TODO: Light map on an otherwise unlit surface doesn't make sense.
+				THREE.ShaderChunk[ "aomap_fragment" ],
+				THREE.ShaderChunk[ "lightmap_fragment" ],
 				THREE.ShaderChunk[ "envmap_fragment" ],
 				THREE.ShaderChunk[ "envmap_fragment" ],
 				THREE.ShaderChunk[ "shadowmap_fragment" ],		// TODO: Shadows on an otherwise unlit surface doesn't make sense.
 				THREE.ShaderChunk[ "shadowmap_fragment" ],		// TODO: Shadows on an otherwise unlit surface doesn't make sense.
 
 
@@ -134,8 +138,8 @@ THREE.ShaderLib = {
 			"#endif",
 			"#endif",
 
 
 			THREE.ShaderChunk[ "common" ],
 			THREE.ShaderChunk[ "common" ],
-			THREE.ShaderChunk[ "map_pars_vertex" ],
-			THREE.ShaderChunk[ "lightmap_pars_vertex" ],
+			THREE.ShaderChunk[ "uv_pars_vertex" ],
+			THREE.ShaderChunk[ "uv2_pars_vertex" ],
 			THREE.ShaderChunk[ "envmap_pars_vertex" ],
 			THREE.ShaderChunk[ "envmap_pars_vertex" ],
 			THREE.ShaderChunk[ "lights_lambert_pars_vertex" ],
 			THREE.ShaderChunk[ "lights_lambert_pars_vertex" ],
 			THREE.ShaderChunk[ "color_pars_vertex" ],
 			THREE.ShaderChunk[ "color_pars_vertex" ],
@@ -146,8 +150,8 @@ THREE.ShaderLib = {
 
 
 			"void main() {",
 			"void main() {",
 
 
-				THREE.ShaderChunk[ "map_vertex" ],
-				THREE.ShaderChunk[ "lightmap_vertex" ],
+				THREE.ShaderChunk[ "uv_vertex" ],
+				THREE.ShaderChunk[ "uv2_vertex" ],
 				THREE.ShaderChunk[ "color_vertex" ],
 				THREE.ShaderChunk[ "color_vertex" ],
 
 
 				THREE.ShaderChunk[ "morphnormal_vertex" ],
 				THREE.ShaderChunk[ "morphnormal_vertex" ],
@@ -185,8 +189,11 @@ THREE.ShaderLib = {
 
 
 			THREE.ShaderChunk[ "common" ],
 			THREE.ShaderChunk[ "common" ],
 			THREE.ShaderChunk[ "color_pars_fragment" ],
 			THREE.ShaderChunk[ "color_pars_fragment" ],
+			THREE.ShaderChunk[ "uv_pars_fragment" ],
+			THREE.ShaderChunk[ "uv2_pars_fragment" ],
 			THREE.ShaderChunk[ "map_pars_fragment" ],
 			THREE.ShaderChunk[ "map_pars_fragment" ],
 			THREE.ShaderChunk[ "alphamap_pars_fragment" ],
 			THREE.ShaderChunk[ "alphamap_pars_fragment" ],
+			THREE.ShaderChunk[ "aomap_pars_fragment" ],
 			THREE.ShaderChunk[ "lightmap_pars_fragment" ],
 			THREE.ShaderChunk[ "lightmap_pars_fragment" ],
 			THREE.ShaderChunk[ "envmap_pars_fragment" ],
 			THREE.ShaderChunk[ "envmap_pars_fragment" ],
 			THREE.ShaderChunk[ "fog_pars_fragment" ],
 			THREE.ShaderChunk[ "fog_pars_fragment" ],
@@ -222,6 +229,7 @@ THREE.ShaderLib = {
 
 
 			"	#endif",
 			"	#endif",
 
 
+				THREE.ShaderChunk[ "aomap_fragment" ],
 				THREE.ShaderChunk[ "lightmap_fragment" ],
 				THREE.ShaderChunk[ "lightmap_fragment" ],
 				THREE.ShaderChunk[ "envmap_fragment" ],
 				THREE.ShaderChunk[ "envmap_fragment" ],
 				THREE.ShaderChunk[ "shadowmap_fragment" ],
 				THREE.ShaderChunk[ "shadowmap_fragment" ],
@@ -271,8 +279,8 @@ THREE.ShaderLib = {
 			"#endif",
 			"#endif",
 
 
 			THREE.ShaderChunk[ "common" ],
 			THREE.ShaderChunk[ "common" ],
-			THREE.ShaderChunk[ "map_pars_vertex" ],
-			THREE.ShaderChunk[ "lightmap_pars_vertex" ],
+			THREE.ShaderChunk[ "uv_pars_vertex" ],
+			THREE.ShaderChunk[ "uv2_pars_vertex" ],
 			THREE.ShaderChunk[ "envmap_pars_vertex" ],
 			THREE.ShaderChunk[ "envmap_pars_vertex" ],
 			THREE.ShaderChunk[ "lights_phong_pars_vertex" ],
 			THREE.ShaderChunk[ "lights_phong_pars_vertex" ],
 			THREE.ShaderChunk[ "color_pars_vertex" ],
 			THREE.ShaderChunk[ "color_pars_vertex" ],
@@ -283,8 +291,8 @@ THREE.ShaderLib = {
 
 
 			"void main() {",
 			"void main() {",
 
 
-				THREE.ShaderChunk[ "map_vertex" ],
-				THREE.ShaderChunk[ "lightmap_vertex" ],
+				THREE.ShaderChunk[ "uv_vertex" ],
+				THREE.ShaderChunk[ "uv2_vertex" ],
 				THREE.ShaderChunk[ "color_vertex" ],
 				THREE.ShaderChunk[ "color_vertex" ],
 
 
 				THREE.ShaderChunk[ "morphnormal_vertex" ],
 				THREE.ShaderChunk[ "morphnormal_vertex" ],
@@ -326,8 +334,11 @@ THREE.ShaderLib = {
 
 
 			THREE.ShaderChunk[ "common" ],
 			THREE.ShaderChunk[ "common" ],
 			THREE.ShaderChunk[ "color_pars_fragment" ],
 			THREE.ShaderChunk[ "color_pars_fragment" ],
+			THREE.ShaderChunk[ "uv_pars_fragment" ],
+			THREE.ShaderChunk[ "uv2_pars_fragment" ],
 			THREE.ShaderChunk[ "map_pars_fragment" ],
 			THREE.ShaderChunk[ "map_pars_fragment" ],
 			THREE.ShaderChunk[ "alphamap_pars_fragment" ],
 			THREE.ShaderChunk[ "alphamap_pars_fragment" ],
+			THREE.ShaderChunk[ "aomap_pars_fragment" ],
 			THREE.ShaderChunk[ "lightmap_pars_fragment" ],
 			THREE.ShaderChunk[ "lightmap_pars_fragment" ],
 			THREE.ShaderChunk[ "envmap_pars_fragment" ],
 			THREE.ShaderChunk[ "envmap_pars_fragment" ],
 			THREE.ShaderChunk[ "fog_pars_fragment" ],
 			THREE.ShaderChunk[ "fog_pars_fragment" ],
@@ -352,6 +363,7 @@ THREE.ShaderLib = {
 
 
 				THREE.ShaderChunk[ "lights_phong_fragment" ],
 				THREE.ShaderChunk[ "lights_phong_fragment" ],
 
 
+				THREE.ShaderChunk[ "aomap_fragment" ],
 				THREE.ShaderChunk[ "lightmap_fragment" ],
 				THREE.ShaderChunk[ "lightmap_fragment" ],
 				THREE.ShaderChunk[ "envmap_fragment" ],
 				THREE.ShaderChunk[ "envmap_fragment" ],
 				THREE.ShaderChunk[ "shadowmap_fragment" ],
 				THREE.ShaderChunk[ "shadowmap_fragment" ],

+ 5 - 0
src/renderers/shaders/UniformsLib.js

@@ -13,6 +13,11 @@ THREE.UniformsLib = {
 		"offsetRepeat" : { type: "v4", value: new THREE.Vector4( 0, 0, 1, 1 ) },
 		"offsetRepeat" : { type: "v4", value: new THREE.Vector4( 0, 0, 1, 1 ) },
 
 
 		"lightMap" : { type: "t", value: null },
 		"lightMap" : { type: "t", value: null },
+		"lightMapIntensity" : { type: "f", value: 1 },
+
+		"aoMap" : { type: "t", value: null },
+		"aoMapIntensity" : { type: "f", value: 1 },
+
 		"specularMap" : { type: "t", value: null },
 		"specularMap" : { type: "t", value: null },
 		"alphaMap" : { type: "t", value: null },
 		"alphaMap" : { type: "t", value: null },
 
 

+ 2 - 1
src/renderers/webgl/WebGLProgram.js

@@ -182,6 +182,7 @@ THREE.WebGLProgram = ( function () {
 				parameters.envMap ? '#define USE_ENVMAP' : '',
 				parameters.envMap ? '#define USE_ENVMAP' : '',
 				parameters.envMap ? '#define ' + envMapModeDefine : '',
 				parameters.envMap ? '#define ' + envMapModeDefine : '',
 				parameters.lightMap ? '#define USE_LIGHTMAP' : '',
 				parameters.lightMap ? '#define USE_LIGHTMAP' : '',
+				parameters.aoMap ? '#define USE_AOMAP' : '',
 				parameters.bumpMap ? '#define USE_BUMPMAP' : '',
 				parameters.bumpMap ? '#define USE_BUMPMAP' : '',
 				parameters.normalMap ? '#define USE_NORMALMAP' : '',
 				parameters.normalMap ? '#define USE_NORMALMAP' : '',
 				parameters.specularMap ? '#define USE_SPECULARMAP' : '',
 				parameters.specularMap ? '#define USE_SPECULARMAP' : '',
@@ -220,7 +221,6 @@ THREE.WebGLProgram = ( function () {
 				'attribute vec3 position;',
 				'attribute vec3 position;',
 				'attribute vec3 normal;',
 				'attribute vec3 normal;',
 				'attribute vec2 uv;',
 				'attribute vec2 uv;',
-				'attribute vec2 uv2;',
 
 
 				'#ifdef USE_COLOR',
 				'#ifdef USE_COLOR',
 
 
@@ -295,6 +295,7 @@ THREE.WebGLProgram = ( function () {
 				parameters.envMap ? '#define ' + envMapModeDefine : '',
 				parameters.envMap ? '#define ' + envMapModeDefine : '',
 				parameters.envMap ? '#define ' + envMapBlendingDefine : '',
 				parameters.envMap ? '#define ' + envMapBlendingDefine : '',
 				parameters.lightMap ? '#define USE_LIGHTMAP' : '',
 				parameters.lightMap ? '#define USE_LIGHTMAP' : '',
+				parameters.aoMap ? '#define USE_AOMAP' : '',
 				parameters.bumpMap ? '#define USE_BUMPMAP' : '',
 				parameters.bumpMap ? '#define USE_BUMPMAP' : '',
 				parameters.normalMap ? '#define USE_NORMALMAP' : '',
 				parameters.normalMap ? '#define USE_NORMALMAP' : '',
 				parameters.specularMap ? '#define USE_SPECULARMAP' : '',
 				parameters.specularMap ? '#define USE_SPECULARMAP' : '',

+ 45 - 41
utils/build/includes/common.json

@@ -84,59 +84,63 @@
 	"src/scenes/Fog.js",
 	"src/scenes/Fog.js",
 	"src/scenes/FogExp2.js",
 	"src/scenes/FogExp2.js",
 	"src/renderers/shaders/ShaderChunk.js",
 	"src/renderers/shaders/ShaderChunk.js",
-	"src/renderers/shaders/ShaderChunk/common.glsl",
+	"src/renderers/shaders/ShaderChunk/alphamap_fragment.glsl",
+	"src/renderers/shaders/ShaderChunk/alphamap_pars_fragment.glsl",
 	"src/renderers/shaders/ShaderChunk/alphatest_fragment.glsl",
 	"src/renderers/shaders/ShaderChunk/alphatest_fragment.glsl",
-	"src/renderers/shaders/ShaderChunk/lights_lambert_vertex.glsl",
-	"src/renderers/shaders/ShaderChunk/map_particle_pars_fragment.glsl",
+	"src/renderers/shaders/ShaderChunk/aomap_fragment.glsl",
+	"src/renderers/shaders/ShaderChunk/aomap_pars_fragment.glsl",
+	"src/renderers/shaders/ShaderChunk/bumpmap_pars_fragment.glsl",
+	"src/renderers/shaders/ShaderChunk/color_fragment.glsl",
+	"src/renderers/shaders/ShaderChunk/color_pars_fragment.glsl",
+	"src/renderers/shaders/ShaderChunk/color_pars_vertex.glsl",
+	"src/renderers/shaders/ShaderChunk/color_vertex.glsl",
+	"src/renderers/shaders/ShaderChunk/common.glsl",
 	"src/renderers/shaders/ShaderChunk/default_vertex.glsl",
 	"src/renderers/shaders/ShaderChunk/default_vertex.glsl",
-	"src/renderers/shaders/ShaderChunk/map_pars_fragment.glsl",
-	"src/renderers/shaders/ShaderChunk/skinnormal_vertex.glsl",
-	"src/renderers/shaders/ShaderChunk/logdepthbuf_pars_vertex.glsl",
-	"src/renderers/shaders/ShaderChunk/lightmap_pars_vertex.glsl",
-	"src/renderers/shaders/ShaderChunk/lights_phong_fragment.glsl",
-	"src/renderers/shaders/ShaderChunk/fog_pars_fragment.glsl",
-	"src/renderers/shaders/ShaderChunk/morphnormal_vertex.glsl",
+	"src/renderers/shaders/ShaderChunk/defaultnormal_vertex.glsl",
+	"src/renderers/shaders/ShaderChunk/envmap_fragment.glsl",
 	"src/renderers/shaders/ShaderChunk/envmap_pars_fragment.glsl",
 	"src/renderers/shaders/ShaderChunk/envmap_pars_fragment.glsl",
-	"src/renderers/shaders/ShaderChunk/logdepthbuf_fragment.glsl",
-	"src/renderers/shaders/ShaderChunk/normalmap_pars_fragment.glsl",
-	"src/renderers/shaders/ShaderChunk/lights_phong_pars_vertex.glsl",
+	"src/renderers/shaders/ShaderChunk/envmap_pars_vertex.glsl",
+	"src/renderers/shaders/ShaderChunk/envmap_vertex.glsl",
+	"src/renderers/shaders/ShaderChunk/fog_fragment.glsl",
+	"src/renderers/shaders/ShaderChunk/fog_pars_fragment.glsl",
+	"src/renderers/shaders/ShaderChunk/lightmap_fragment.glsl",
 	"src/renderers/shaders/ShaderChunk/lightmap_pars_fragment.glsl",
 	"src/renderers/shaders/ShaderChunk/lightmap_pars_fragment.glsl",
-	"src/renderers/shaders/ShaderChunk/shadowmap_vertex.glsl",
+	"src/renderers/shaders/ShaderChunk/lights_lambert_pars_vertex.glsl",
+	"src/renderers/shaders/ShaderChunk/lights_lambert_vertex.glsl",
+	"src/renderers/shaders/ShaderChunk/lights_phong_fragment.glsl",
+	"src/renderers/shaders/ShaderChunk/lights_phong_pars_fragment.glsl",
+	"src/renderers/shaders/ShaderChunk/lights_phong_pars_vertex.glsl",
 	"src/renderers/shaders/ShaderChunk/lights_phong_vertex.glsl",
 	"src/renderers/shaders/ShaderChunk/lights_phong_vertex.glsl",
-	"src/renderers/shaders/ShaderChunk/map_fragment.glsl",
-	"src/renderers/shaders/ShaderChunk/lightmap_vertex.glsl",
-	"src/renderers/shaders/ShaderChunk/map_particle_fragment.glsl",
-	"src/renderers/shaders/ShaderChunk/color_pars_fragment.glsl",
-	"src/renderers/shaders/ShaderChunk/color_vertex.glsl",
-	"src/renderers/shaders/ShaderChunk/skinning_vertex.glsl",
-	"src/renderers/shaders/ShaderChunk/envmap_pars_vertex.glsl",
 	"src/renderers/shaders/ShaderChunk/linear_to_gamma_fragment.glsl",
 	"src/renderers/shaders/ShaderChunk/linear_to_gamma_fragment.glsl",
-	"src/renderers/shaders/ShaderChunk/color_pars_vertex.glsl",
-	"src/renderers/shaders/ShaderChunk/lights_lambert_pars_vertex.glsl",
-	"src/renderers/shaders/ShaderChunk/map_pars_vertex.glsl",
-	"src/renderers/shaders/ShaderChunk/envmap_fragment.glsl",
-	"src/renderers/shaders/ShaderChunk/specularmap_pars_fragment.glsl",
+	"src/renderers/shaders/ShaderChunk/logdepthbuf_fragment.glsl",
+	"src/renderers/shaders/ShaderChunk/logdepthbuf_pars_fragment.glsl",
+	"src/renderers/shaders/ShaderChunk/logdepthbuf_pars_vertex.glsl",
 	"src/renderers/shaders/ShaderChunk/logdepthbuf_vertex.glsl",
 	"src/renderers/shaders/ShaderChunk/logdepthbuf_vertex.glsl",
+	"src/renderers/shaders/ShaderChunk/map_fragment.glsl",
+	"src/renderers/shaders/ShaderChunk/map_pars_fragment.glsl",
+	"src/renderers/shaders/ShaderChunk/map_particle_fragment.glsl",
+	"src/renderers/shaders/ShaderChunk/map_particle_pars_fragment.glsl",
+	"src/renderers/shaders/ShaderChunk/morphnormal_vertex.glsl",
 	"src/renderers/shaders/ShaderChunk/morphtarget_pars_vertex.glsl",
 	"src/renderers/shaders/ShaderChunk/morphtarget_pars_vertex.glsl",
-	"src/renderers/shaders/ShaderChunk/specularmap_fragment.glsl",
-	"src/renderers/shaders/ShaderChunk/fog_fragment.glsl",
-	"src/renderers/shaders/ShaderChunk/bumpmap_pars_fragment.glsl",
-	"src/renderers/shaders/ShaderChunk/defaultnormal_vertex.glsl",
-	"src/renderers/shaders/ShaderChunk/lights_phong_pars_fragment.glsl",
-	"src/renderers/shaders/ShaderChunk/skinbase_vertex.glsl",
-	"src/renderers/shaders/ShaderChunk/map_vertex.glsl",
-	"src/renderers/shaders/ShaderChunk/lightmap_fragment.glsl",
-	"src/renderers/shaders/ShaderChunk/shadowmap_pars_vertex.glsl",
-	"src/renderers/shaders/ShaderChunk/color_fragment.glsl",
 	"src/renderers/shaders/ShaderChunk/morphtarget_vertex.glsl",
 	"src/renderers/shaders/ShaderChunk/morphtarget_vertex.glsl",
-	"src/renderers/shaders/ShaderChunk/envmap_vertex.glsl",
+	"src/renderers/shaders/ShaderChunk/normalmap_pars_fragment.glsl",
 	"src/renderers/shaders/ShaderChunk/shadowmap_fragment.glsl",
 	"src/renderers/shaders/ShaderChunk/shadowmap_fragment.glsl",
-	"src/renderers/shaders/ShaderChunk/worldpos_vertex.glsl",
 	"src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl",
 	"src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl",
+	"src/renderers/shaders/ShaderChunk/shadowmap_pars_vertex.glsl",
+	"src/renderers/shaders/ShaderChunk/shadowmap_vertex.glsl",
+	"src/renderers/shaders/ShaderChunk/skinbase_vertex.glsl",
 	"src/renderers/shaders/ShaderChunk/skinning_pars_vertex.glsl",
 	"src/renderers/shaders/ShaderChunk/skinning_pars_vertex.glsl",
-	"src/renderers/shaders/ShaderChunk/logdepthbuf_pars_fragment.glsl",
-	"src/renderers/shaders/ShaderChunk/alphamap_fragment.glsl",
-	"src/renderers/shaders/ShaderChunk/alphamap_pars_fragment.glsl",
+	"src/renderers/shaders/ShaderChunk/skinning_vertex.glsl",
+	"src/renderers/shaders/ShaderChunk/skinnormal_vertex.glsl",
+	"src/renderers/shaders/ShaderChunk/specularmap_fragment.glsl",
+	"src/renderers/shaders/ShaderChunk/specularmap_pars_fragment.glsl",
+	"src/renderers/shaders/ShaderChunk/uv2_pars_fragment.glsl",
+	"src/renderers/shaders/ShaderChunk/uv2_pars_vertex.glsl",
+	"src/renderers/shaders/ShaderChunk/uv2_vertex.glsl",
+	"src/renderers/shaders/ShaderChunk/uv_pars_fragment.glsl",
+	"src/renderers/shaders/ShaderChunk/uv_pars_vertex.glsl",
+	"src/renderers/shaders/ShaderChunk/uv_vertex.glsl",
+	"src/renderers/shaders/ShaderChunk/worldpos_vertex.glsl",
 	"src/renderers/shaders/UniformsUtils.js",
 	"src/renderers/shaders/UniformsUtils.js",
 	"src/renderers/shaders/UniformsLib.js",
 	"src/renderers/shaders/UniformsLib.js",
 	"src/renderers/shaders/ShaderLib.js",
 	"src/renderers/shaders/ShaderLib.js",