Browse Source

Merge remote branch 'alteredq/skinning' into skinning

Mr.doob 14 years ago
parent
commit
f66e3fc810
39 changed files with 654 additions and 582 deletions
  1. 0 291
      build/Three.js
  2. 8 6
      examples/canvas_geometry_panorama.html
  3. 6 3
      examples/canvas_geometry_panorama_fisheye.html
  4. 0 1
      examples/canvas_geometry_terrain.html
  5. 1 1
      examples/canvas_materials.html
  6. 36 26
      examples/canvas_materials_video.html
  7. 1 1
      examples/js/RequestAnimationFrame.js
  8. 2 78
      examples/misc_lights_test.html
  9. 3 4
      examples/misc_materials_multimaterials.html
  10. 20 11
      examples/misc_uqbiquity_test.html
  11. 12 5
      examples/misc_webglrenderer2_sandbox.html
  12. 4 2
      examples/webgl_geometry_minecraft.html
  13. 16 9
      examples/webgl_geometry_minecraft_ao.html
  14. 2 2
      examples/webgl_geometry_terrain.html
  15. 2 2
      examples/webgl_geometry_terrain2.html
  16. 2 2
      examples/webgl_geometry_terrain_fog.html
  17. 1 1
      examples/webgl_materials.html
  18. 1 2
      examples/webgl_materials_cars.html
  19. 1 2
      examples/webgl_materials_cars_camaro.html
  20. 4 8
      examples/webgl_materials_cubemap.html
  21. 1 6
      examples/webgl_materials_cubemap_balls_reflection.html
  22. 1 2
      examples/webgl_materials_cubemap_balls_refraction.html
  23. 1 5
      examples/webgl_materials_cubemap_escher.html
  24. 1 2
      examples/webgl_materials_cubemap_refraction.html
  25. 2 2
      examples/webgl_materials_grass.html
  26. 1 2
      examples/webgl_materials_shaders_fresnel.html
  27. 375 0
      examples/webgl_materials_video.html
  28. 3 3
      examples/webgl_objconvert_test.html
  29. 2 0
      examples/webgl_postprocessing.html
  30. 2 4
      examples/webgl_postprocessing_dof.html
  31. 5 9
      examples/webgl_rtt.html
  32. 19 9
      src/extras/ImageUtils.js
  33. 12 9
      src/extras/ShaderUtils.js
  34. 1 1
      src/extras/io/Loader.js
  35. 2 2
      src/materials/Texture.js
  36. 20 25
      src/renderers/CanvasRenderer.js
  37. 16 8
      src/renderers/Projector.js
  38. 51 26
      src/renderers/WebGLRenderer.js
  39. 17 10
      src/renderers/WebGLRenderer2.js

File diff suppressed because it is too large
+ 0 - 291
build/Three.js


+ 8 - 6
examples/canvas_geometry_panorama.html

@@ -1,7 +1,7 @@
 <!DOCTYPE HTML>
 <html lang="en">
 	<head>
-		<title>three.js - panorama demo</title>
+		<title>three.js canvas - panorama demo</title>
 		<meta charset="utf-8">
 		<style type="text/css">
 			body {
@@ -73,7 +73,7 @@
 					loadTexture( 'textures/cube/skybox/py.jpg' ), // top
 					loadTexture( 'textures/cube/skybox/ny.jpg' ), // bottom
 					loadTexture( 'textures/cube/skybox/pz.jpg' ), // back
-					loadTexture( 'textures/cube/skybox/nz.jpg' ) // front
+					loadTexture( 'textures/cube/skybox/nz.jpg' )  // front
 
 				];
 
@@ -98,14 +98,15 @@
 
 			function loadTexture( path ) {
 
-				var material = new THREE.MeshBasicMaterial( { map: new THREE.Texture( texture_placeholder ) } );
-
-				var image = new Image();
+				var texture = new THREE.Texture( texture_placeholder ),
+					material = new THREE.MeshBasicMaterial( { map: texture } ),
+					image = new Image();
 
 				image.onload = function () {
 
-					this.loaded = true;
+					texture.needsUpdate = true;
 					material.map.image = this;
+					
 					render();
 
 				};
@@ -113,6 +114,7 @@
 				image.src = path;
 
 				return material;
+
 			}
 
 			function onDocumentMouseDown( event ) {

+ 6 - 3
examples/canvas_geometry_panorama_fisheye.html

@@ -1,7 +1,7 @@
 <!DOCTYPE HTML>
 <html lang="en">
 	<head>
-		<title>three.js - panorama fisheye demo</title>
+		<title>three.js canvas - panorama fisheye demo</title>
 		<meta charset="utf-8">
 		<style type="text/css">
 			body {
@@ -108,14 +108,16 @@
 
 			function loadTexture( path ) {
 
-				var material = new THREE.MeshBasicMaterial( { map: new THREE.Texture( texture_placeholder ) } );
+				var texture = new THREE.Texture( texture_placeholder ),
+					material = new THREE.MeshBasicMaterial( { map: texture } );
 
 				var image = new Image();
 
 				image.onload = function () {
 
-					this.loaded = true;
+					texture.needsUpdate = true;
 					material.map.image = this;
+					
 					render();
 
 				};
@@ -123,6 +125,7 @@
 				image.src = path;
 
 				return material;
+
 			}
 
 			function onDocumentMouseDown( event ) {

+ 0 - 1
examples/canvas_geometry_terrain.html

@@ -145,7 +145,6 @@
 				canvas = document.createElement( 'canvas' );
 				canvas.width = width;
 				canvas.height = height;
-				canvas.loaded = true;
 
 				context = canvas.getContext( '2d' );
 				context.fillStyle = '#000';

+ 1 - 1
examples/canvas_materials.html

@@ -162,7 +162,7 @@
 				var image = document.createElement( 'img' );
 				var texture = new THREE.Texture( image, THREE.UVMapping )
 
-				image.onload = function () { texture.loaded = true; };
+				image.onload = function () { texture.needsUpdate = true; };
 				image.src = path;
 
 				return texture;

+ 36 - 26
examples/canvas_materials_video.html

@@ -34,8 +34,9 @@
 
 			var camera, scene, renderer;
 
-			var video, texture, textureContext,
-			textureReflection, textureReflectionContext, textureReflectionGradient;
+			var video, image, imageContext,
+			imageReflection, imageReflectionContext, imageReflectionGradient,
+			texture, textureReflection;
 
 			var mesh;
 
@@ -70,33 +71,37 @@
 
 				// 
 
-				texture = document.createElement( 'canvas' );
-				texture.loaded = true;
-				texture.width = 480;
-				texture.height = 204;
+				image = document.createElement( 'canvas' );
+				image.width = 480;
+				image.height = 204;
 
-				textureContext = texture.getContext( '2d' );
-				textureContext.fillStyle = '#000000';
-				textureContext.fillRect( 0, 0, 480, 204 );
+				imageContext = image.getContext( '2d' );
+				imageContext.fillStyle = '#000000';
+				imageContext.fillRect( 0, 0, 480, 204 );
 
-				var map = new THREE.Texture( texture );
+				texture = new THREE.Texture( image );
+				texture.min_filter = THREE.LinearFilter;
+				texture.mag_filter = THREE.LinearFilter;
 
-				var material = new THREE.MeshBasicMaterial( { map: map } );
+				var material = new THREE.MeshBasicMaterial( { map: texture } );
 
-				textureReflection = document.createElement( 'canvas' );
-				textureReflection.loaded = true;
-				textureReflection.width = 480;
-				textureReflection.height = 204;
+				imageReflection = document.createElement( 'canvas' );
+				imageReflection.width = 480;
+				imageReflection.height = 204;
 
-				textureReflectionContext = textureReflection.getContext( '2d' );
-				textureReflectionContext.fillStyle = '#000000';
-				textureReflectionContext.fillRect( 0, 0, 480, 204 );
+				imageReflectionContext = imageReflection.getContext( '2d' );
+				imageReflectionContext.fillStyle = '#000000';
+				imageReflectionContext.fillRect( 0, 0, 480, 204 );
 
-				textureReflectionGradient = textureReflectionContext.createLinearGradient( 0, 0, 0, 204 );
-				textureReflectionGradient.addColorStop( 0.2, 'rgba(240, 240, 240, 1)' );
-				textureReflectionGradient.addColorStop( 1, 'rgba(240, 240, 240, 0.8)' );
+				imageReflectionGradient = imageReflectionContext.createLinearGradient( 0, 0, 0, 204 );
+				imageReflectionGradient.addColorStop( 0.2, 'rgba(240, 240, 240, 1)' );
+				imageReflectionGradient.addColorStop( 1, 'rgba(240, 240, 240, 0.8)' );
 
-				var materialReflection = new THREE.MeshBasicMaterial( { map: new THREE.Texture( textureReflection ) } );
+				textureReflection = new THREE.Texture( imageReflection );
+				textureReflection.min_filter = THREE.LinearFilter;
+				textureReflection.mag_filter = THREE.LinearFilter;
+				
+				var materialReflection = new THREE.MeshBasicMaterial( { map: textureReflection } );
 
 				//
 
@@ -132,6 +137,7 @@
 						particle.position.y = -153
 						particle.position.z = iy * separation - ( ( amounty * separation ) / 2 );
 						scene.addObject( particle );
+
 					}
 				}
 
@@ -174,12 +180,16 @@
 
 				if ( video.readyState === video.HAVE_ENOUGH_DATA ) {
 
-					textureContext.drawImage( video, 0, 0 );
+					imageContext.drawImage( video, 0, 0 );
+					
+					if ( texture ) texture.needsUpdate = true;
+					if ( textureReflection ) textureReflection.needsUpdate = true;
+
 				}
 
-				textureReflectionContext.drawImage( texture, 0, 0 );
-				textureReflectionContext.fillStyle = textureReflectionGradient;
-				textureReflectionContext.fillRect( 0, 0, 480, 204 );
+				imageReflectionContext.drawImage( image, 0, 0 );
+				imageReflectionContext.fillStyle = imageReflectionGradient;
+				imageReflectionContext.fillRect( 0, 0, 480, 204 );
 
 				renderer.render( scene, camera );
 

+ 1 - 1
examples/js/RequestAnimationFrame.js

@@ -8,7 +8,7 @@ if ( !window.requestAnimationFrame ) {
 	window.requestAnimationFrame = ( function() {
 
 		return window.webkitRequestAnimationFrame ||
-		window.mozRequestAnimationFrame ||
+		window.mozRequestAnimationFrame || // comment out if FF4 is slow (it caps framerate at ~30fps: https://bugzilla.mozilla.org/show_bug.cgi?id=630127)
 		window.oRequestAnimationFrame ||
 		window.msRequestAnimationFrame ||
 		function( /* function FrameRequestCallback */ callback, /* DOMElement Element */ element ) {

+ 2 - 78
examples/misc_lights_test.html

@@ -38,84 +38,8 @@
 
 		<pre id="log"></pre>
 
-		<script type="text/javascript" src="../src/Three.js"></script>
-		<script type="text/javascript" src="../src/core/Color.js"></script>
-		<script type="text/javascript" src="../src/core/Vector2.js"></script>
-		<script type="text/javascript" src="../src/core/Vector3.js"></script>
-		<script type="text/javascript" src="../src/core/Vector4.js"></script>
-		<script type="text/javascript" src="../src/core/Ray.js"></script>
-		<script type="text/javascript" src="../src/core/Rectangle.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/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/objects/Object3D.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/animation/AnimationHandler.js"></script>
-		<script type="text/javascript" src="../src/animation/Animation.js"></script>
-		<script type="text/javascript" src="../src/cameras/Camera.js"></script>
-		<script type="text/javascript" src="../src/lights/Light.js"></script>
-		<script type="text/javascript" src="../src/lights/AmbientLight.js"></script>
-		<script type="text/javascript" src="../src/lights/DirectionalLight.js"></script>
-		<script type="text/javascript" src="../src/lights/PointLight.js"></script>
-		<script type="text/javascript" src="../src/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/ParticleCircleMaterial.js"></script>
-		<script type="text/javascript" src="../src/materials/ParticleDOMMaterial.js"></script>
-		<script type="text/javascript" src="../src/materials/Texture.js"></script>
-		<script type="text/javascript" src="../src/materials/RenderTarget.js"></script>
-		<script type="text/javascript" src="../src/materials/Uniforms.js"></script>
-		<script type="text/javascript" src="../src/materials/mappings/CubeReflectionMapping.js"></script>
-		<script type="text/javascript" src="../src/materials/mappings/CubeRefractionMapping.js"></script>
-		<script type="text/javascript" src="../src/materials/mappings/LatitudeReflectionMapping.js"></script>
-		<script type="text/javascript" src="../src/materials/mappings/LatitudeRefractionMapping.js"></script>
-		<script type="text/javascript" src="../src/materials/mappings/SphericalReflectionMapping.js"></script>
-		<script type="text/javascript" src="../src/materials/mappings/SphericalRefractionMapping.js"></script>
-		<script type="text/javascript" src="../src/materials/mappings/UVMapping.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/Projector.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/WebGLRenderer.js"></script>
-		<script type="text/javascript" src="../src/renderers/renderables/RenderableObject.js"></script>
-		<script type="text/javascript" src="../src/renderers/renderables/RenderableFace3.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/Detector.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/primitives/Cube.js"></script>
-		<script type="text/javascript" src="../src/extras/primitives/Cylinder.js"></script>
-		<script type="text/javascript" src="../src/extras/primitives/Plane.js"></script>
-		<script type="text/javascript" src="../src/extras/primitives/Sphere.js"></script>
-		<script type="text/javascript" src="../src/extras/primitives/Torus.js"></script>
-		<script type="text/javascript" src="../src/extras/primitives/Icosahedron.js"></script>
-		<script type="text/javascript" src="../src/extras/primitives/LathedObject.js"></script>
-		<script type="text/javascript" src="../src/extras/objects/MarchingCubes.js"></script>
-		<script type="text/javascript" src="../src/extras/io/Loader.js"></script>
-
+		<script type="text/javascript" src="../build/Three.js"></script>
+		
 		<script type="text/javascript" src="js/RequestAnimationFrame.js"></script>
 		<script type="text/javascript" src="js/Stats.js"></script>
 

+ 3 - 4
examples/misc_materials_multimaterials.html

@@ -199,10 +199,9 @@
 				}
 
 				var xm1 = new THREE.MeshLambertMaterial( { map: new THREE.Texture( x1 ) } );
-				xm1.map.image.loaded = 1; // this is procedurally generated texture
-
 				var xm2 = new THREE.MeshLambertMaterial( { map: new THREE.Texture( x2 ) } );
-				xm2.map.image.loaded = 1; // this is procedurally generated texture
+				xm1.map.needsUpdate = true;
+				xm2.map.needsUpdate = true;
 
 				geometry.materials[0].push ( xm1 ); // goes to faces with material 0
 				geometry.materials[1].push ( xm2 ); // goes to faces with material 1
@@ -257,7 +256,7 @@
 					xc.fillText(i, 10, 64);
 
 					var xm = new THREE.MeshBasicMaterial( { map: new THREE.Texture( x ) } );
-					xm.map.image.loaded = 1;
+					xm.map.needsUpdate = true;
 
 					mesh = new THREE.Mesh( new Plane( size, size ), xm );
 					mesh.position.x = i * (size + 5) - ( ( materials.length - 1 )* ( size + 5 )/2);

+ 20 - 11
examples/misc_uqbiquity_test.html

@@ -26,20 +26,13 @@
 		<script type="text/javascript" src="../src/core/Rectangle.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/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/objects/Object3D.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/Ribbon.js"></script>
 		<script type="text/javascript" src="../src/animation/AnimationHandler.js"></script>
 		<script type="text/javascript" src="../src/animation/Animation.js"></script>
 		<script type="text/javascript" src="../src/cameras/Camera.js"></script>
@@ -69,6 +62,13 @@
 		<script type="text/javascript" src="../src/materials/mappings/SphericalReflectionMapping.js"></script>
 		<script type="text/javascript" src="../src/materials/mappings/SphericalRefractionMapping.js"></script>
 		<script type="text/javascript" src="../src/materials/mappings/UVMapping.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/Ribbon.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>
@@ -81,12 +81,21 @@
 		<script type="text/javascript" src="../src/renderers/renderables/RenderableFace3.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="obj/Qrcode.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/primitives/Cube.js"></script>
-		<script type="text/javascript" src="../src/extras/primitives/Plane.js"></script>
 		<script type="text/javascript" src="../src/extras/primitives/Cylinder.js"></script>
+		<script type="text/javascript" src="../src/extras/primitives/Plane.js"></script>
+		<script type="text/javascript" src="../src/extras/primitives/Sphere.js"></script>
+		<script type="text/javascript" src="../src/extras/primitives/Torus.js"></script>
+		<script type="text/javascript" src="../src/extras/primitives/Icosahedron.js"></script>
+		<script type="text/javascript" src="../src/extras/primitives/LathedObject.js"></script>
 		<script type="text/javascript" src="../src/extras/objects/MarchingCubes.js"></script>
+		<script type="text/javascript" src="../src/extras/io/Loader.js"></script>
+
+		<script type="text/javascript" src="obj/Qrcode.js"></script>
 
 		<script type="text/javascript" src="js/RequestAnimationFrame.js"></script>
 		<script type="text/javascript" src="js/Stats.js"></script>

+ 12 - 5
examples/misc_webglrenderer2_sandbox.html

@@ -48,20 +48,27 @@
 		<script type="text/javascript" src="../src/core/Rectangle.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/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/objects/Object3D.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/Ribbon.js"></script>
+		<script type="text/javascript" src="../src/animation/AnimationHandler.js"></script>
+		<script type="text/javascript" src="../src/animation/Animation.js"></script>
 		<script type="text/javascript" src="../src/cameras/Camera.js"></script>
 		<script type="text/javascript" src="../src/lights/Light.js"></script>
 		<script type="text/javascript" src="../src/lights/AmbientLight.js"></script>
 		<script type="text/javascript" src="../src/lights/DirectionalLight.js"></script>
 		<script type="text/javascript" src="../src/lights/PointLight.js"></script>
-		<script type="text/javascript" src="../src/objects/Object3D.js"></script>
-		<script type="text/javascript" src="../src/objects/Particle.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/materials/Material.js"></script>
 		<script type="text/javascript" src="../src/materials/LineBasicMaterial.js"></script>
 		<script type="text/javascript" src="../src/materials/MeshBasicMaterial.js"></script>
@@ -86,6 +93,7 @@
 		<script type="text/javascript" src="../src/materials/mappings/UVMapping.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/Projector.js"></script>
 		<script type="text/javascript" src="../src/renderers/DOMRenderer.js"></script>
 		<script type="text/javascript" src="../src/renderers/CanvasRenderer.js"></script>
@@ -216,7 +224,6 @@
 			function generateTexture( r, g, b ) {
 
 				var canvas = document.createElement( 'canvas' );
-				canvas.loaded = true;
 				canvas.width = 256;
 				canvas.height = 256;
 

+ 4 - 2
examples/webgl_geometry_minecraft.html

@@ -193,10 +193,12 @@
 			function loadTexture( path ) {
 
 				var image = new Image();
-				image.onload = function () { this.loaded = true; };
+				image.onload = function () { texture.needsUpdate = true; };
 				image.src = path;
 
-				return new THREE.MeshLambertMaterial( { map: new THREE.Texture( image, new THREE.UVMapping(), THREE.ClampToEdgeWrapping, THREE.ClampToEdgeWrapping, THREE.NearestFilter, THREE.LinearMipMapLinearFilter ) } );
+				var texture  = new THREE.Texture( image, new THREE.UVMapping(), THREE.ClampToEdgeWrapping, THREE.ClampToEdgeWrapping, THREE.NearestFilter, THREE.LinearMipMapLinearFilter );
+				
+				return new THREE.MeshLambertMaterial( { map: texture } );
 
 			}
 

+ 16 - 9
examples/webgl_geometry_minecraft_ao.html

@@ -1,7 +1,7 @@
 <!DOCTYPE HTML>
 <html lang="en">
 	<head>
-		<title>three.js - geometry - minecraft - ao - webgl</title>
+		<title>three.js webgl - geometry - minecraft - ao</title>
 		<meta charset="utf-8">
 		<style type="text/css">
 			body {
@@ -71,6 +71,8 @@
 			var camera, scene, renderer;
 
 			var mesh;
+			
+			var mat;
 
 			var worldWidth = 128, worldDepth = 128,
 			worldHalfWidth = worldWidth / 2, worldHalfDepth = worldDepth / 2,
@@ -501,6 +503,8 @@
 
 				canvas.width = canvas.height = size;
 
+				var texture = new THREE.Texture( canvas, new THREE.UVMapping(), THREE.ClampToEdgeWrapping, THREE.ClampToEdgeWrapping, THREE.NearestFilter, THREE.LinearMipMapLinearFilter );
+
 				function generateTexture() {
 
 					if( count == 3 ) {
@@ -515,13 +519,13 @@
 
 						}
 
-						canvas.loaded = true;
+						texture.needsUpdate = true;
 
 					}
 
 				}
 
-				return new THREE.MeshLambertMaterial( { map: new THREE.Texture( canvas, new THREE.UVMapping(), THREE.ClampToEdgeWrapping, THREE.ClampToEdgeWrapping, THREE.NearestFilter, THREE.LinearMipMapLinearFilter ) } );
+				return new THREE.MeshLambertMaterial( { map: texture } );
 
 			}
 
@@ -538,6 +542,8 @@
 
 				canvas.width = canvas.height = size;
 
+				var texture = new THREE.Texture( canvas, new THREE.UVMapping(), THREE.ClampToEdgeWrapping, THREE.ClampToEdgeWrapping, THREE.NearestFilter, THREE.LinearMipMapLinearFilter );
+				
 				function generateTexture() {
 
 					if( count == 3 ) {
@@ -556,13 +562,13 @@
 
 						}
 
-						canvas.loaded = true;
+						texture.needsUpdate = true;
 
 					}
 
 				}
 
-				return new THREE.MeshLambertMaterial( { map: new THREE.Texture( canvas, new THREE.UVMapping(), THREE.ClampToEdgeWrapping, THREE.ClampToEdgeWrapping, THREE.NearestFilter, THREE.LinearMipMapLinearFilter ) } );
+				return new THREE.MeshLambertMaterial( { map: texture } );
 
 			}
 			function generateMegamaterialDebug() {
@@ -592,9 +598,10 @@
 
 				}
 
-				canvas.loaded = true;
-
-				return new THREE.MeshLambertMaterial( { map: new THREE.Texture( canvas, new THREE.UVMapping(), THREE.ClampToEdgeWrapping, THREE.ClampToEdgeWrapping, THREE.NearestFilter, THREE.LinearMipMapLinearFilter ) } );
+				var texture = new THREE.Texture( canvas, new THREE.UVMapping(), THREE.ClampToEdgeWrapping, THREE.ClampToEdgeWrapping, THREE.NearestFilter, THREE.LinearMipMapLinearFilter );
+				texture.needsUpdate = true;
+				
+				return new THREE.MeshLambertMaterial( { map: texture } );
 
 			}
 
@@ -767,7 +774,7 @@
 
 				var image = new Image();
 
-				image.onload = function () { this.loaded = true; callback(); };
+				image.onload = function () { callback(); };
 				image.src = path;
 
 				return image;

+ 2 - 2
examples/webgl_geometry_terrain.html

@@ -94,7 +94,8 @@
 				}
 
 				texture = new THREE.Texture( generateTexture( data, worldWidth, worldDepth ), new THREE.UVMapping(), THREE.ClampToEdgeWrapping, THREE.ClampToEdgeWrapping );
-
+				texture.needsUpdate = true;
+				
 				mesh = new THREE.Mesh( geometry, new THREE.MeshBasicMaterial( { map: texture } ) );
 				mesh.rotation.x = - 90 * Math.PI / 180;
 				scene.addObject( mesh );
@@ -189,7 +190,6 @@
 				canvasScaled = document.createElement( 'canvas' );
 				canvasScaled.width = width * 4;
 				canvasScaled.height = height * 4;
-				canvasScaled.loaded = true;
 
 				context = canvasScaled.getContext( '2d' );
 				context.scale( 4, 4 );

+ 2 - 2
examples/webgl_geometry_terrain2.html

@@ -95,7 +95,8 @@
 				}
 
 				texture = new THREE.Texture( generateTexture( data, worldWidth, worldDepth ), new THREE.UVMapping(), THREE.ClampToEdgeWrapping, THREE.ClampToEdgeWrapping );
-
+				texture.needsUpdate = true;
+				
 				mesh = new THREE.Mesh( geometry, new THREE.MeshBasicMaterial( { map: texture } ) );
 				mesh.rotation.x = - 90 * Math.PI / 180;
 				scene.addObject( mesh );
@@ -267,7 +268,6 @@
 				canvasScaled = document.createElement( 'canvas' );
 				canvasScaled.width = width * 4;
 				canvasScaled.height = height * 4;
-				canvasScaled.loaded = true;
 
 				context = canvasScaled.getContext( '2d' );
 				context.scale( 4, 4 );

+ 2 - 2
examples/webgl_geometry_terrain_fog.html

@@ -104,7 +104,8 @@
 				}
 
 				texture = new THREE.Texture( generateTexture( data, worldWidth, worldDepth ), new THREE.UVMapping(), THREE.ClampToEdgeWrapping, THREE.ClampToEdgeWrapping );
-
+				texture.needsUpdate = true;
+				
 				mesh = new THREE.Mesh( geometry, new THREE.MeshBasicMaterial( { map: texture } ) );
 				mesh.rotation.x = - 90 * Math.PI / 180;
 				scene.addObject( mesh );
@@ -199,7 +200,6 @@
 				canvasScaled = document.createElement( 'canvas' );
 				canvasScaled.width = width * 4;
 				canvasScaled.height = height * 4;
-				canvasScaled.loaded = true;
 
 				context = canvasScaled.getContext( '2d' );
 				context.scale( 4, 4 );

+ 1 - 1
examples/webgl_materials.html

@@ -66,7 +66,7 @@
 				scene.addObject( line );
 
 				var generatedTexture = new THREE.Texture( generateTexture() );
-				generatedTexture.image.loaded = 1;
+				generatedTexture.needsUpdate = true;
 
 				var materials = [];
 				materials.push( new THREE.MeshLambertMaterial( { color: 0xdddddd, shading: THREE.FlatShading } ) );

+ 1 - 2
examples/webgl_materials_cars.html

@@ -221,8 +221,7 @@
 							 r + "posy.jpg", r + "negy.jpg",
 							 r + "posz.jpg", r + "negz.jpg" ];
 
-				var images = ImageUtils.loadArray( urls );
-				var textureCube = new THREE.Texture( images );
+				var textureCube = ImageUtils.loadTextureCube( urls );
 
 				// common materials
 

+ 1 - 2
examples/webgl_materials_cars_camaro.html

@@ -119,8 +119,7 @@
 							 r + "py.jpg", r + "ny.jpg",
 							 r + "pz.jpg", r + "nz.jpg" ];
 
-				var images = ImageUtils.loadArray( urls );
-				var textureCube = new THREE.Texture( images );
+				var textureCube = ImageUtils.loadTextureCube( urls );
 
 				var camaroMaterials = {
 

+ 4 - 8
examples/webgl_materials_cubemap.html

@@ -104,18 +104,14 @@
 						path + 'pz' + format, path + 'nz' + format
 					];
 
-				var images = ImageUtils.loadArray( urls );
-
-				var reflectionCube = new THREE.Texture( images );
-				var refractionCube = new THREE.Texture( images, new THREE.CubeRefractionMapping() );
-
-				//var cubeMaterial3 = new THREE.MeshPhongMaterial( { color: 0x000000, specular:0xaa0000, env_map: new THREE.TextureCube( images ), combine: THREE.MixOperation, reflectivity: 0.25 } );
+				var reflectionCube = ImageUtils.loadTextureCube( urls );
+				var refractionCube = new THREE.Texture( reflectionCube.image, new THREE.CubeRefractionMapping() );
+				
+				//var cubeMaterial3 = new THREE.MeshPhongMaterial( { color: 0x000000, specular:0xaa0000, env_map: reflectionCube, combine: THREE.MixOperation, reflectivity: 0.25 } );
 				var cubeMaterial3 = new THREE.MeshLambertMaterial( { color: 0xff6600, env_map: reflectionCube, combine: THREE.MixOperation, reflectivity: 0.3 } );
 				var cubeMaterial2 = new THREE.MeshLambertMaterial( { color: 0xffee00, env_map: refractionCube, refraction_ratio: 0.95 } );
 				var cubeMaterial1 = new THREE.MeshLambertMaterial( { color: 0xffffff, env_map: reflectionCube } )
 
-				//SceneUtils.addPanoramaCubePlanes( sceneCube, 100000, images );
-				//SceneUtils.addPanoramaCube( sceneCube, 100000, images );
 				SceneUtils.addPanoramaCubeWebGL( sceneCube, 100000, reflectionCube );
 
 				webglRenderer = new THREE.WebGLRenderer();

+ 1 - 6
examples/webgl_materials_cubemap_balls_reflection.html

@@ -90,10 +90,7 @@
 						path + 'pz' + format, path + 'nz' + format
 					];
 
-				var images = ImageUtils.loadArray( urls );
-				var textureCube = new THREE.Texture( images );
-				// var textureCube = new THREE.Texture( images, new THREE.CubeRefractionMapping );
-
+				var textureCube = ImageUtils.loadTextureCube( urls );
 				var material = new THREE.MeshBasicMaterial( { color: 0xffffff, env_map: textureCube } );
 
 				for ( var i = 0; i < 200; i ++ ) {
@@ -106,8 +103,6 @@
 					scene.addObject( mesh );
 				}
 
-				//SceneUtils.addPanoramaCubePlanes( sceneCube, 100000, images );
-				//SceneUtils.addPanoramaCube( sceneCube, 100000, images );
 				SceneUtils.addPanoramaCubeWebGL( sceneCube, 100000, textureCube );
 
 				webglRenderer = new THREE.WebGLRenderer();

+ 1 - 2
examples/webgl_materials_cubemap_balls_refraction.html

@@ -90,8 +90,7 @@
 						path + 'pz' + format, path + 'nz' + format
 					];
 
-				var images = ImageUtils.loadArray( urls );
-				var textureCube = new THREE.Texture( images, new THREE.CubeRefractionMapping() );
+				var textureCube = ImageUtils.loadTextureCube( urls, new THREE.CubeRefractionMapping() );
 				var material = new THREE.MeshBasicMaterial( { color: 0xffffff, env_map: textureCube, refraction_ratio: 0.95 } );
 
 				for ( var i = 0; i < 200; i ++ ) {

+ 1 - 5
examples/webgl_materials_cubemap_escher.html

@@ -79,9 +79,7 @@
 							 r + "py.jpg", r + "ny.jpg", 
 							 r + "pz.jpg", r + "nz.jpg" ];
 
-				var images = ImageUtils.loadArray( urls );
-
-				var textureCube = new THREE.Texture( images );
+				var textureCube = ImageUtils.loadTextureCube( urls );
 				var material = new THREE.MeshBasicMaterial( { color: 0xffffff, env_map: textureCube } )
 				var geometry = new Sphere( 100, 96, 64 );
 
@@ -89,8 +87,6 @@
 				mesh.scale.x = mesh.scale.y = mesh.scale.z = 16;
 				scene.addObject( mesh );
 
-				//SceneUtils.addPanoramaCubePlanes( scene, 6000, images );
-				//SceneUtils.addPanoramaCube( scene, 6000, images );
 				SceneUtils.addPanoramaCubeWebGL( scene, 6000, textureCube );
 
 				webglRenderer = new THREE.WebGLRenderer();

+ 1 - 2
examples/webgl_materials_cubemap_refraction.html

@@ -102,8 +102,7 @@
 							 r + "py.jpg", r + "ny.jpg", 
 							 r + "pz.jpg", r + "nz.jpg" ];
 
-				var images = ImageUtils.loadArray( urls );
-				var textureCube = new THREE.Texture( images, new THREE.CubeRefractionMapping() );
+				var textureCube = ImageUtils.loadTextureCube( urls, new THREE.CubeRefractionMapping() );
 
 				var cubeMaterial3 = new THREE.MeshBasicMaterial( { color: 0xccddff, env_map: textureCube, refraction_ratio: 0.98, reflectivity:0.9 } );
 				var cubeMaterial2 = new THREE.MeshBasicMaterial( { color: 0xccfffd, env_map: textureCube, refraction_ratio: 0.985 } );

+ 2 - 2
examples/webgl_materials_grass.html

@@ -43,10 +43,12 @@
 				var geometry = new Plane( 100, 100 );
 
 				var texture = generateTextureBase();
+				texture.needsUpdate = true;
 
 				for ( var i = 0; i < 10; i ++ ) {
 
 					mesh = levels[ i ] = new THREE.Mesh( geometry, new THREE.MeshBasicMaterial( { map: new THREE.Texture( generateTextureLevel( texture ), new THREE.UVMapping(), THREE.ClampToEdgeWrapping, THREE.ClampToEdgeWrapping ) } ) );
+					mesh.materials[0].map.needsUpdate = true;
 					mesh.rotation.x = - 90 * ( Math.PI / 180 );
 					mesh.position.y = i * 0.5;
 					scene.addObject( mesh );
@@ -63,7 +65,6 @@
 			function generateTextureBase() {
 
 				var canvas = document.createElement( 'canvas' );
-				canvas.loaded = true;
 				canvas.width = 1024;
 				canvas.height = 1024;
 
@@ -90,7 +91,6 @@
 				texture.getContext( '2d' ).drawImage( texture, 0, 0 );
 
 				var canvas = document.createElement( 'canvas' );
-				canvas.loaded = true;
 				canvas.width = texture.width;
 				canvas.height = texture.height;
 

+ 1 - 2
examples/webgl_materials_shaders_fresnel.html

@@ -92,8 +92,7 @@
 					];
 
 
-				var images = ImageUtils.loadArray( urls );
-				var textureCube = new THREE.Texture( images );
+				var textureCube = ImageUtils.loadTextureCube( urls );
 
 				var shader = ShaderUtils.lib["fresnel"];
 				var uniforms = Uniforms.clone( shader.uniforms );

+ 375 - 0
examples/webgl_materials_video.html

@@ -0,0 +1,375 @@
+<!DOCTYPE HTML>
+<html lang="en">
+	<head>
+		<title>three.js webgl - materials - video</title>
+		<meta charset="utf-8">
+		<style type="text/css">
+			body {
+				background-color: #000;
+				color: #fff;
+				margin: 0px;
+				overflow: hidden;
+				font-family:Monospace;
+				font-size:13px;
+				text-align:center;
+				font-weight: bold;
+				text-align:center;
+			}
+			
+			a {
+				color:#0078ff;
+			}
+
+			#info {
+				color:#fff;
+				position: absolute;
+				top: 0px; width: 100%;
+				padding: 5px;
+				z-index:100;
+			}
+			
+		</style>
+	</head>
+	<body>
+
+		<div id="info">
+			<a href="http://github.com/mrdoob/three.js" target="_blank">three.js</a> - webgl video demo. playing <a href="http://durian.blender.org/" target="_blank">sintel</a> trailer
+		</div>
+
+		<script type="text/javascript" src="js/ThreeExtrasVideo.js"></script>
+		
+		<script type="text/javascript" src="js/RequestAnimationFrame.js"></script>
+		<script type="text/javascript" src="js/Stats.js"></script>
+
+		<video id="video" autoplay loop style="display:none">
+			<source src="textures/sintel.mp4" type='video/mp4; codecs="avc1.42E01E, mp4a.40.2"'>
+			<source src="textures/sintel.ogv" type='video/ogg; codecs="theora, vorbis"'>
+		</video>
+
+		<script type="text/javascript">
+
+			if ( ! THREE.Detector.webgl ) THREE.Detector.addGetWebGLMessage();
+
+			var container, stats;
+
+			var camera, scene, renderer;
+
+			var video, texture, material, mesh;
+
+			var mouseX = 0;
+			var mouseY = 0;
+
+			var windowHalfX = window.innerWidth / 2;
+			var windowHalfY = window.innerHeight / 2;
+
+			var postprocessing = { enabled: true };
+			
+			var cube_count,
+			
+				meshes = [],
+				materials = [],
+			
+				xgrid = 20,
+				ygrid = 10;
+			
+			init();
+			animate();
+
+			function init() {
+
+				container = document.createElement('div');
+				document.body.appendChild( container );
+
+				camera = new THREE.Camera( 40, window.innerWidth / window.innerHeight, 1, 10000 );
+				camera.position.z = 500;
+
+				scene = new THREE.Scene();
+				
+				var light = new THREE.DirectionalLight( 0xffffff );
+				light.position.set( 0.5, 1, 1 );
+				light.position.normalize();
+				scene.addLight( light );
+
+				renderer = new THREE.WebGLRenderer();
+				renderer.setSize( window.innerWidth, window.innerHeight );
+				
+				container.appendChild( renderer.domElement );
+
+				video = document.getElementById( 'video' );
+				
+				//video.volume = 0;
+				//video.muted = true;
+
+				texture = new THREE.Texture( video );
+				texture.min_filter = THREE.LinearFilter;
+				texture.mag_filter = THREE.LinearFilter;
+
+				//
+
+				var i, j, ux, uy, ox, oy, 
+					geometry,
+					xsize, ysize;
+
+				ux = 1 / xgrid;
+				uy = 1 / ygrid;
+				
+				xsize = 480 / xgrid;
+				ysize = 204 / ygrid;
+
+				var parameters = { color: 0xffffff, map: texture },
+					material_base = new THREE.MeshLambertMaterial( parameters );
+
+				renderer.initMaterial( material_base, scene.lights, scene.fog );
+				
+				cube_count = 0;
+				
+				for( i = 0; i < xgrid; i++)
+				for( j = 0; j < ygrid; j++) {
+				
+					ox = i;
+					oy = j;
+					
+					geometry = new Cube( xsize, ysize, xsize );
+					change_uvs( geometry, ux, uy, ox, oy );
+					
+					materials[ cube_count ] = new THREE.MeshLambertMaterial( parameters );
+					
+					material = materials[ cube_count ];
+					
+					material.program = material_base.program;
+					material.uniforms = Uniforms.clone( THREE.ShaderLib[ 'lambert' ].uniforms );
+
+					material.hue = i/xgrid;
+					material.saturation = j/ygrid;
+
+					material.color.setHSV( material.hue, material.saturation, 1 );
+					
+					mesh = new THREE.Mesh( geometry, material );
+					
+					mesh.position.x =   ( i - xgrid/2 ) * xsize;
+					mesh.position.y = - ( j - ygrid/2 ) * ysize;
+					mesh.position.z = 0;					
+					
+					mesh.scale.x = mesh.scale.y = mesh.scale.z = 1;
+					
+					scene.addObject(mesh);
+					
+					mesh.dx = 0.001 * ( 0.5 - Math.random() );
+					mesh.dy = 0.001 * ( 0.5 - Math.random() );
+					
+					meshes[ cube_count ] = mesh;
+
+					cube_count += 1;
+
+				}
+
+				initPostprocessing();
+				renderer.autoClear = false;
+
+				stats = new Stats();
+				stats.domElement.style.position = 'absolute';
+				stats.domElement.style.top = '0px';
+				//container.appendChild( stats.domElement );
+
+				document.addEventListener( 'mousemove', onDocumentMouseMove, false );
+
+			}
+			
+			function change_uvs( geometry, unitx, unity, offsetx, offsety ) {
+				
+				var i, j, uv;
+				
+				for ( i = 0; i < geometry.uvs.length; i++ ) {
+
+					uv = geometry.uvs[ i ];
+
+					for ( j = 0; j < uv.length; j++ ) {
+						
+						uv[j].u = ( uv[j].u + offsetx ) * unitx;
+						uv[j].v = ( uv[j].v + offsety ) * unity;
+
+					}
+
+				}
+				
+			}
+			
+
+			function initPostprocessing() {
+
+				postprocessing.scene = new THREE.Scene();
+
+				postprocessing.camera = new THREE.Camera();
+				postprocessing.camera.projectionMatrix = THREE.Matrix4.makeOrtho( window.innerWidth / - 2, window.innerWidth / 2,  window.innerHeight / 2, window.innerHeight / - 2, -10000, 10000 );
+				postprocessing.camera.position.z = 100;
+
+				var pars = { min_filter: THREE.LinearFilter, mag_filter: THREE.LinearFilter };
+				postprocessing.rtTexture1 = new THREE.RenderTarget( window.innerWidth, window.innerHeight, pars );
+				postprocessing.rtTexture2 = new THREE.RenderTarget( 512, 512, pars );
+				postprocessing.rtTexture3 = new THREE.RenderTarget( 512, 512, pars );
+
+				var screen_shader = ShaderUtils.lib["screen"];
+				var screen_uniforms = Uniforms.clone( screen_shader.uniforms );
+
+				screen_uniforms["tDiffuse"].texture = postprocessing.rtTexture1;
+				screen_uniforms["opacity"].value = 1.0;
+
+				postprocessing.materialScreen = new THREE.MeshShaderMaterial( {
+
+					uniforms: screen_uniforms,
+					vertex_shader: screen_shader.vertex_shader,
+					fragment_shader: screen_shader.fragment_shader,
+					blending: THREE.AdditiveBlending
+
+				} );
+
+				var convolution_shader = ShaderUtils.lib["convolution"];
+				var convolution_uniforms = Uniforms.clone( convolution_shader.uniforms );
+
+				postprocessing.blurx = new THREE.Vector2( 0.001953125, 0.0 ),
+				postprocessing.blury = new THREE.Vector2( 0.0, 0.001953125 );
+
+				convolution_uniforms["tDiffuse"].texture = postprocessing.rtTexture1;
+				convolution_uniforms["uImageIncrement"].value = postprocessing.blurx;
+				convolution_uniforms["cKernel"].value = ShaderUtils.buildKernel( 4.0 );
+
+				postprocessing.materialConvolution = new THREE.MeshShaderMaterial( {
+
+					uniforms: convolution_uniforms,
+					vertex_shader:   "#define KERNEL_SIZE 25.0\n" + convolution_shader.vertex_shader,
+					fragment_shader: "#define KERNEL_SIZE 25\n"   + convolution_shader.fragment_shader
+
+				} );
+
+				postprocessing.quad = new THREE.Mesh( new Plane( window.innerWidth, window.innerHeight ), postprocessing.materialConvolution );
+				postprocessing.quad.position.z = -500;
+				postprocessing.scene.addObject( postprocessing.quad );
+
+			}
+			
+			function onDocumentMouseMove(event) {
+
+				mouseX = ( event.clientX - windowHalfX );
+				mouseY = ( event.clientY - windowHalfY ) * 0.3;				
+
+			}
+
+			//
+
+			function animate() {
+
+				requestAnimationFrame( animate );
+
+				render();
+				stats.update();
+
+			}
+				
+			var h, counter = 1;
+			
+			function render() {
+
+				var time = new Date().getTime() * 0.00005;
+				
+				camera.position.x += ( mouseX - camera.position.x ) * 0.05;
+				camera.position.y += ( - mouseY - camera.position.y ) * 0.05;
+
+				if ( video.readyState === video.HAVE_ENOUGH_DATA ) {
+
+					if ( texture ) texture.needsUpdate = true;
+
+				}
+		
+				for( i = 0; i < cube_count; i++ ) {
+				
+					material = materials[i];
+					
+					h = ( 360 * ( material.hue + time ) % 360 ) / 360;
+					material.color.setHSV( h, material.saturation, 1 );
+					
+				}
+				
+				if( counter % 1000  > 200 ) {
+				
+					for( i = 0; i < cube_count; i++ ) {
+
+						mesh = meshes[i];
+						
+						mesh.rotation.x += 10 * mesh.dx;
+						mesh.rotation.y += 10 * mesh.dy;
+
+						mesh.position.x += 200 * mesh.dx;
+						mesh.position.y += 200 * mesh.dy;
+						mesh.position.z += 400 * mesh.dx;
+
+					}
+					
+				}
+
+				if( counter % 1000  == 0 ) {
+				
+					for( i = 0; i < cube_count; i++ ) {
+					
+						mesh = meshes[i];
+						
+						mesh.dx *= -1;
+						mesh.dy *= -1;
+
+					}
+					
+				}
+				
+				counter++;
+				
+				if ( postprocessing.enabled ) {
+
+					renderer.clear();
+
+					// Render scene into texture
+
+					renderer.render( scene, camera, postprocessing.rtTexture1 );
+
+					// Render quad with blured scene into texture (convolution pass 1)
+
+					postprocessing.quad.materials = [ postprocessing.materialConvolution ];
+
+					postprocessing.materialConvolution.uniforms.tDiffuse.texture = postprocessing.rtTexture1;
+					postprocessing.materialConvolution.uniforms.uImageIncrement.value = postprocessing.blurx;
+
+					renderer.render( postprocessing.scene, postprocessing.camera, postprocessing.rtTexture2 );
+
+					// Render quad with blured scene into texture (convolution pass 2)
+
+					postprocessing.materialConvolution.uniforms.tDiffuse.texture = postprocessing.rtTexture2;
+					postprocessing.materialConvolution.uniforms.uImageIncrement.value = postprocessing.blury;
+
+					renderer.render( postprocessing.scene, postprocessing.camera, postprocessing.rtTexture3 );
+
+					// Render original scene with superimposed blur to texture
+
+					postprocessing.quad.materials = [ postprocessing.materialScreen ];
+
+					postprocessing.materialScreen.uniforms.tDiffuse.texture = postprocessing.rtTexture3;
+					postprocessing.materialScreen.uniforms.opacity.value = 1.3;
+
+					renderer.render( postprocessing.scene, postprocessing.camera, postprocessing.rtTexture1, false );
+
+					// Render to screen
+
+					postprocessing.materialScreen.uniforms.tDiffuse.texture = postprocessing.rtTexture1;
+					renderer.render( postprocessing.scene, postprocessing.camera );
+
+				} else {
+
+					renderer.clear();
+					renderer.render( scene, camera );
+
+				}
+				
+			}
+
+
+		</script>
+
+	</body>
+</html>

+ 3 - 3
examples/webgl_objconvert_test.html

@@ -109,8 +109,8 @@
 				xc.fillRect(96, 96, 32, 32);
 
 				var xm = new THREE.MeshBasicMaterial( { map: new THREE.Texture( x, THREE.UVMapping, THREE.RepeatWrapping, THREE.RepeatWrapping ) } );
-				xm.map.image.loaded = 1;
-
+				xm.map.needsUpdate = true;
+				
 				geometry = new Plane( 100, 100, 15, 10 );
 				for(var i=0; i<geometry.uvs.length; i++) {
 					var uvs = geometry.uvs[i];
@@ -240,7 +240,7 @@
 					xc.fillText(i, 10, 64);
 
 					var xm = new THREE.MeshBasicMaterial( { map: new THREE.Texture( x ) } );
-					xm.map.image.loaded = 1;
+					xm.map.needsUpdate = true;
 
 					mesh = new THREE.Mesh( new Plane( size, size ), xm );
 					mesh.position.x = i * (size + 5) - ( ( materials.length - 1 )* ( size + 5 )/2);

+ 2 - 0
examples/webgl_postprocessing.html

@@ -139,6 +139,8 @@
 				var film_uniforms = Uniforms.clone( film_shader.uniforms );
 
 				film_uniforms["tDiffuse"].texture = rtTexture1;
+				film_uniforms["nIntensity"].value = 0.25;
+				film_uniforms["sIntensity"].value = 0.5;
 
 				materialFilm = new THREE.MeshShaderMaterial( {
 

+ 2 - 4
examples/webgl_postprocessing_dof.html

@@ -100,11 +100,9 @@
 						path + 'pz' + format, path + 'nz' + format
 					];
 
-				var images = ImageUtils.loadArray( urls );
+				var textureCube = ImageUtils.loadTextureCube( urls );
 
-				var reflectionCube = new THREE.Texture( images );
-
-				parameters = { color: 0xff1100, env_map: reflectionCube, combine: THREE.MixOperationa, reflectivity: 0.3, shading: THREE.FlatShading };
+				parameters = { color: 0xff1100, env_map: textureCube, shading: THREE.FlatShading };
 				//parameters = { color: 0xff1100, shading: THREE.FlatShading };
 				cubeMaterial = new THREE.MeshBasicMaterial( parameters );
 

+ 5 - 9
examples/webgl_rtt.html

@@ -112,25 +112,23 @@
 				camera.position.z = 100;
 				camera.updateMatrix();
 
+				scene = new THREE.Scene();
 				sceneRTT = new THREE.Scene();
 				sceneScreen = new THREE.Scene();
-				scene = new THREE.Scene();
 
 				var light = new THREE.DirectionalLight( 0xffffff );
 				light.position.x = 0;
 				light.position.y = 0;
 				light.position.z = 1;
 				light.position.normalize();
-				scene.addLight( light );
 				sceneRTT.addLight( light );
-				sceneScreen.addLight( light );
-
-				light = new THREE.DirectionalLight( 0xffaaaa, 0.5 );
-				light.position.x = -1;
+				
+				light = new THREE.DirectionalLight( 0xffaaaa, 1.5 );
+				light.position.x = 0;
 				light.position.y = 0;
 				light.position.z = -1;
 				light.position.normalize();
-				scene.addLight( light );
+				sceneRTT.addLight( light );
 
 				rtTexture = new THREE.RenderTarget( window.innerWidth, window.innerHeight, { min_filter: THREE.LinearFilter, mag_filter: THREE.NearestFilter } );
 
@@ -281,8 +279,6 @@
 
 				renderer.render( scene, camera );
 
-				stats.update();
-
 			}
 
 		</script>

+ 19 - 9
src/extras/ImageUtils.js

@@ -2,30 +2,40 @@ var ImageUtils = {
 
 	loadTexture: function ( path, mapping, callback ) {
 
-		var image = new Image();
-		image.onload = function () { this.loaded = true; if( callback ) callback( this ); };
+		var image = new Image(),
+			texture = new THREE.Texture( image, mapping );
+		
+		image.onload = function () { texture.needsUpdate = true; if( callback ) callback( this ); };
 		image.src = path;
 
-		return new THREE.Texture( image, mapping );
+		return texture;
 
 	},
+	
+	loadTextureCube: function ( array, mapping, callback ) {
 
-	loadArray: function ( array, callback ) {
-
-		var i, l, images = [];
+		var i, l, 
+			images = [],
+			texture = new THREE.Texture( images, mapping );
 
 		images.loadCount = 0;
 
 		for ( i = 0, l = array.length; i < l; ++i ) {
 
 			images[ i ] = new Image();
-			images[ i ].loaded = 0;
-			images[ i ].onload = function () { images.loadCount += 1; this.loaded = true; if( callback ) callback( this ); };
+			images[ i ].onload = function () {
+				
+					images.loadCount += 1; 
+					if( images.loadCount == 6 ) texture.needsUpdate = true; 
+					if( callback ) callback( this ); 
+				
+				};
+
 			images[ i ].src = array[ i ];
 
 		}
 
-		return images;
+		return texture;
 
 	}
 

+ 12 - 9
src/extras/ShaderUtils.js

@@ -402,9 +402,12 @@ var ShaderUtils = {
 
 		'film': {
 
-		uniforms: { tDiffuse: { type: "t", value: 0, texture: null },
-					time: { type: "f", value: 0.0 },
-					grayscale: { type: "i", value: 1 }
+		uniforms: { tDiffuse:   { type: "t", value: 0, texture: null },
+					time: 	    { type: "f", value: 0.0 },
+					nIntensity: { type: "f", value: 0.5 },
+					sIntensity: { type: "f", value: 0.05 },
+					sCount: 	{ type: "f", value: 4096 },
+					grayscale:  { type: "i", value: 1 }
 				  },
 
 		vertex_shader: [
@@ -431,13 +434,13 @@ var ShaderUtils = {
 		"uniform bool grayscale;",
 
 		// noise effect intensity value (0 = no effect, 1 = full effect)
-		"const float fNintensity = 0.5;",
+		"uniform float nIntensity;",
 		
 		// scanlines effect intensity value (0 = no effect, 1 = full effect)
-		"const float fSintensity = 0.05;",
+		"uniform float sIntensity;",
 		
 		// scanlines effect count value (0 = no effect, 4096 = full effect)
-		"const float fScount = 4096.0;",
+		"uniform float sCount;",
 		
 		"void main() {",
 			
@@ -453,13 +456,13 @@ var ShaderUtils = {
 			"vec3 cResult = cTextureScreen.rgb + cTextureScreen.rgb * clamp( 0.1 + dx * 100.0, 0.0, 1.0 );",
 
 			// get us a sine and cosine
-			"vec2 sc = vec2( sin(vUv.y * fScount), cos(vUv.y * fScount) );",
+			"vec2 sc = vec2( sin( vUv.y * sCount ), cos( vUv.y * sCount ) );",
 
 			// add scanlines
-			"cResult += cTextureScreen.rgb * vec3( sc.x, sc.y, sc.x ) * fSintensity;",
+			"cResult += cTextureScreen.rgb * vec3( sc.x, sc.y, sc.x ) * sIntensity;",
 			
 			// interpolate between source and result by intensity
-			"cResult = cTextureScreen.rgb + clamp( fNintensity, 0.0,1.0 ) * ( cResult - cTextureScreen.rgb );",
+			"cResult = cTextureScreen.rgb + clamp( nIntensity, 0.0,1.0 ) * ( cResult - cTextureScreen.rgb );",
 
 			// convert to grayscale if desired
 			"if( grayscale ) {",

+ 1 - 1
src/extras/io/Loader.js

@@ -1225,7 +1225,7 @@ THREE.Loader.prototype = {
 
 				}
 
-				where.image.loaded = 1;
+				where.needsUpdate = true;
 
 			};
 

+ 2 - 2
src/materials/Texture.js

@@ -6,8 +6,6 @@
 
 THREE.Texture = function ( image, mapping, wrap_s, wrap_t, mag_filter, min_filter ) {
 
-	if ( image.getContext ) image.loaded = true;
-
 	this.image = image;
 
 	this.mapping = mapping !== undefined ? mapping : new THREE.UVMapping();
@@ -17,6 +15,8 @@ THREE.Texture = function ( image, mapping, wrap_s, wrap_t, mag_filter, min_filte
 
 	this.mag_filter = mag_filter !== undefined ? mag_filter : THREE.LinearFilter;
 	this.min_filter = min_filter !== undefined ? min_filter : THREE.LinearMipMapLinearFilter;
+	
+	this.needsUpdate = false;
 
 };
 

+ 20 - 25
src/renderers/CanvasRenderer.js

@@ -375,7 +375,7 @@ THREE.CanvasRenderer = function () {
 
 			if ( material instanceof THREE.ParticleBasicMaterial ) {
 
-				if ( material.map && material.map.image.loaded ) {
+				if ( material.map ) {
 
 					bitmap = material.map.image;
 					bitmapWidth = bitmap.width >> 1;
@@ -510,47 +510,42 @@ THREE.CanvasRenderer = function () {
 
 			if ( material instanceof THREE.MeshBasicMaterial ) {
 
-				if ( material.map/* && !material.wireframe*/ ) {
+				if ( material.map/* && !material.wireframe*/ ) {					
 
-					if ( material.map.image.loaded ) {
-
-						if ( material.map.mapping instanceof THREE.UVMapping ) {
-
-							texturePath( _v1x, _v1y, _v2x, _v2y, _v3x, _v3y, material.map.image, element.uvs[ 0 ].u, element.uvs[ 0 ].v, element.uvs[ 1 ].u, element.uvs[ 1 ].v, element.uvs[ 2 ].u, element.uvs[ 2 ].v );
+					if ( material.map.mapping instanceof THREE.UVMapping ) {
 
-						}
+						texturePath( _v1x, _v1y, _v2x, _v2y, _v3x, _v3y, material.map.image, element.uvs[ 0 ].u, element.uvs[ 0 ].v, element.uvs[ 1 ].u, element.uvs[ 1 ].v, element.uvs[ 2 ].u, element.uvs[ 2 ].v );
 
 					}
 
+
 				} else if ( material.env_map ) {
 
-					if ( material.env_map.image.loaded ) {
 
-						if ( material.env_map.mapping instanceof THREE.SphericalReflectionMapping ) {
+					if ( material.env_map.mapping instanceof THREE.SphericalReflectionMapping ) {
 
-							var cameraMatrix = camera.globalMatrix;
+						var cameraMatrix = camera.globalMatrix;
 
-							_vector3.copy( element.vertexNormalsWorld[ 0 ] );
-							_uv1x = ( _vector3.x * cameraMatrix.n11 + _vector3.y * cameraMatrix.n12 + _vector3.z * cameraMatrix.n13 ) * 0.5 + 0.5;
-							_uv1y = - ( _vector3.x * cameraMatrix.n21 + _vector3.y * cameraMatrix.n22 + _vector3.z * cameraMatrix.n23 ) * 0.5 + 0.5;
+						_vector3.copy( element.vertexNormalsWorld[ 0 ] );
+						_uv1x = ( _vector3.x * cameraMatrix.n11 + _vector3.y * cameraMatrix.n12 + _vector3.z * cameraMatrix.n13 ) * 0.5 + 0.5;
+						_uv1y = - ( _vector3.x * cameraMatrix.n21 + _vector3.y * cameraMatrix.n22 + _vector3.z * cameraMatrix.n23 ) * 0.5 + 0.5;
 
-							_vector3.copy( element.vertexNormalsWorld[ 1 ] );
-							_uv2x = ( _vector3.x * cameraMatrix.n11 + _vector3.y * cameraMatrix.n12 + _vector3.z * cameraMatrix.n13 ) * 0.5 + 0.5;
-							_uv2y = - ( _vector3.x * cameraMatrix.n21 + _vector3.y * cameraMatrix.n22 + _vector3.z * cameraMatrix.n23 ) * 0.5 + 0.5;
+						_vector3.copy( element.vertexNormalsWorld[ 1 ] );
+						_uv2x = ( _vector3.x * cameraMatrix.n11 + _vector3.y * cameraMatrix.n12 + _vector3.z * cameraMatrix.n13 ) * 0.5 + 0.5;
+						_uv2y = - ( _vector3.x * cameraMatrix.n21 + _vector3.y * cameraMatrix.n22 + _vector3.z * cameraMatrix.n23 ) * 0.5 + 0.5;
 
-							_vector3.copy( element.vertexNormalsWorld[ 2 ] );
-							_uv3x = ( _vector3.x * cameraMatrix.n11 + _vector3.y * cameraMatrix.n12 + _vector3.z * cameraMatrix.n13 ) * 0.5 + 0.5;
-							_uv3y = - ( _vector3.x * cameraMatrix.n21 + _vector3.y * cameraMatrix.n22 + _vector3.z * cameraMatrix.n23 ) * 0.5 + 0.5;
+						_vector3.copy( element.vertexNormalsWorld[ 2 ] );
+						_uv3x = ( _vector3.x * cameraMatrix.n11 + _vector3.y * cameraMatrix.n12 + _vector3.z * cameraMatrix.n13 ) * 0.5 + 0.5;
+						_uv3y = - ( _vector3.x * cameraMatrix.n21 + _vector3.y * cameraMatrix.n22 + _vector3.z * cameraMatrix.n23 ) * 0.5 + 0.5;
 
-							texturePath( _v1x, _v1y, _v2x, _v2y, _v3x, _v3y, material.env_map.image, _uv1x, _uv1y, _uv2x, _uv2y, _uv3x, _uv3y );
+						texturePath( _v1x, _v1y, _v2x, _v2y, _v3x, _v3y, material.env_map.image, _uv1x, _uv1y, _uv2x, _uv2y, _uv3x, _uv3y );
 
-						}/* else if ( material.env_map.mapping == THREE.RefractionMapping ) {
+					}/* else if ( material.env_map.mapping == THREE.RefractionMapping ) {
 
-							
+						
 
-						}*/
+					}*/
 
-					}
 
 				} else {
 

+ 16 - 8
src/renderers/Projector.js

@@ -15,7 +15,15 @@ THREE.Projector = function() {
 	_vector4 = new THREE.Vector4(),
 	_projScreenMatrix = new THREE.Matrix4(),
 	_projScreenObjectMatrix = new THREE.Matrix4(),
-	_frustum = [],
+	
+	_frustum = [
+		new THREE.Vector4(),
+		new THREE.Vector4(),
+		new THREE.Vector4(),
+		new THREE.Vector4(),
+		new THREE.Vector4(),
+		new THREE.Vector4()
+	 ],
 
 	_clippedVertex1PositionScreen = new THREE.Vector4(),
 	_clippedVertex2PositionScreen = new THREE.Vector4(),
@@ -388,14 +396,14 @@ THREE.Projector = function() {
 
 	function computeFrustum( m ) {
 
-		_frustum[ 0 ] = new THREE.Vector4( m.n41 - m.n11, m.n42 - m.n12, m.n43 - m.n13, m.n44 - m.n14 );
-		_frustum[ 1 ] = new THREE.Vector4( m.n41 + m.n11, m.n42 + m.n12, m.n43 + m.n13, m.n44 + m.n14 );
-		_frustum[ 2 ] = new THREE.Vector4( m.n41 + m.n21, m.n42 + m.n22, m.n43 + m.n23, m.n44 + m.n24 );
-		_frustum[ 3 ] = new THREE.Vector4( m.n41 - m.n21, m.n42 - m.n22, m.n43 - m.n23, m.n44 - m.n24 );
-		_frustum[ 4 ] = new THREE.Vector4( m.n41 - m.n31, m.n42 - m.n32, m.n43 - m.n33, m.n44 - m.n34 );
-		_frustum[ 5 ] = new THREE.Vector4( m.n41 + m.n31, m.n42 + m.n32, m.n43 + m.n33, m.n44 + m.n34 );
+		_frustum[ 0 ].set( m.n41 - m.n11, m.n42 - m.n12, m.n43 - m.n13, m.n44 - m.n14 );
+		_frustum[ 1 ].set( m.n41 + m.n11, m.n42 + m.n12, m.n43 + m.n13, m.n44 + m.n14 );
+		_frustum[ 2 ].set( m.n41 + m.n21, m.n42 + m.n22, m.n43 + m.n23, m.n44 + m.n24 );
+		_frustum[ 3 ].set( m.n41 - m.n21, m.n42 - m.n22, m.n43 - m.n23, m.n44 - m.n24 );
+		_frustum[ 4 ].set( m.n41 - m.n31, m.n42 - m.n32, m.n43 - m.n33, m.n44 - m.n34 );
+		_frustum[ 5 ].set( m.n41 + m.n31, m.n42 + m.n32, m.n43 + m.n33, m.n44 + m.n34 );
 
-		for ( var i = 0, l = _frustum.length; i < l; i ++ ) {
+		for ( var i = 0; i < 6; i ++ ) {
 
 			var plane = _frustum[ i ];
 			plane.divideScalar( Math.sqrt( plane.x * plane.x + plane.y * plane.y + plane.z * plane.z ) );

+ 51 - 26
src/renderers/WebGLRenderer.js

@@ -2077,7 +2077,7 @@ THREE.WebGLRenderer = function ( parameters ) {
 
 	};
 
-	function addObject( scene, object ) {
+	function addObject( scene, object, camera ) {
 
 		var g, geometry, geometryChunk, objmap;
 
@@ -2214,7 +2214,7 @@ THREE.WebGLRenderer = function ( parameters ) {
 			geometry.__dirtyVertices = false;
 			geometry.__dirtyColors = false;
 
-		} else if ( object instanceof THREE.MarchingCubes ) {
+		} else if ( THREE.MarchingCubes !== undefined && object instanceof THREE.MarchingCubes ) {
 
 			add_buffer_immediate( scene.__webGLObjectsImmediate, objmap, 0, object );
 
@@ -2271,7 +2271,7 @@ THREE.WebGLRenderer = function ( parameters ) {
 
 			object = scene.objects[ o ];
 
-			addObject( scene, object );
+			addObject( scene, object, camera );
 
 		}
 
@@ -2600,12 +2600,15 @@ THREE.WebGLRenderer = function ( parameters ) {
 	function setCubeTexture( texture, slot ) {
 
 		if ( texture.image.length == 6 ) {
+						
+			if ( texture.needsUpdate ) {
 
-			if ( !texture.image.__webGLTextureCube &&
-				 !texture.image.__cubeMapInitialized && texture.image.loadCount == 6 ) {
-
-				texture.image.__webGLTextureCube = _gl.createTexture();
-
+				if ( !texture.image.__webGLTextureCube ) {
+					
+					texture.image.__webGLTextureCube = _gl.createTexture();
+					
+				}
+				
 				_gl.bindTexture( _gl.TEXTURE_CUBE_MAP, texture.image.__webGLTextureCube );
 
 				_gl.texParameteri( _gl.TEXTURE_CUBE_MAP, _gl.TEXTURE_WRAP_S, _gl.CLAMP_TO_EDGE );
@@ -2623,38 +2626,60 @@ THREE.WebGLRenderer = function ( parameters ) {
 				_gl.generateMipmap( _gl.TEXTURE_CUBE_MAP );
 
 				_gl.bindTexture( _gl.TEXTURE_CUBE_MAP, null );
-
-				texture.image.__cubeMapInitialized = true;
-
+				
+				texture.needsUpdate = false;
+				
 			}
 
 			_gl.activeTexture( _gl.TEXTURE0 + slot );
 			_gl.bindTexture( _gl.TEXTURE_CUBE_MAP, texture.image.__webGLTextureCube );
-
+			
 		}
 
 	};
 
 	function setTexture( texture, slot ) {
+		
+		if ( texture.needsUpdate ) {
+
+			if ( !texture.__wasSetOnce ) {
+
+				texture.__webGLTexture = _gl.createTexture();
+				
+				_gl.bindTexture( _gl.TEXTURE_2D, texture.__webGLTexture );
+				_gl.texImage2D( _gl.TEXTURE_2D, 0, _gl.RGBA, _gl.RGBA, _gl.UNSIGNED_BYTE, texture.image );
+
+				_gl.texParameteri( _gl.TEXTURE_2D, _gl.TEXTURE_WRAP_S, paramThreeToGL( texture.wrap_s ) );
+				_gl.texParameteri( _gl.TEXTURE_2D, _gl.TEXTURE_WRAP_T, paramThreeToGL( texture.wrap_t ) );
+
+				_gl.texParameteri( _gl.TEXTURE_2D, _gl.TEXTURE_MAG_FILTER, paramThreeToGL( texture.mag_filter ) );
+				_gl.texParameteri( _gl.TEXTURE_2D, _gl.TEXTURE_MIN_FILTER, paramThreeToGL( texture.min_filter ) );
+				_gl.generateMipmap( _gl.TEXTURE_2D );
+				_gl.bindTexture( _gl.TEXTURE_2D, null );
+				
+				texture.__wasSetOnce = true;
+				
+			} else {
+				
+				_gl.bindTexture( _gl.TEXTURE_2D, texture.__webGLTexture );
+				_gl.texSubImage2D( _gl.TEXTURE_2D, 0, 0, 0, _gl.RGBA, _gl.UNSIGNED_BYTE, texture.image );
+				
+				_gl.texParameteri( _gl.TEXTURE_2D, _gl.TEXTURE_WRAP_S, paramThreeToGL( texture.wrap_s ) );
+				_gl.texParameteri( _gl.TEXTURE_2D, _gl.TEXTURE_WRAP_T, paramThreeToGL( texture.wrap_t ) );
 
-		if ( !texture.__webGLTexture && texture.image.loaded ) {
-
-			texture.__webGLTexture = _gl.createTexture();
-			_gl.bindTexture( _gl.TEXTURE_2D, texture.__webGLTexture );
-			_gl.texImage2D( _gl.TEXTURE_2D, 0, _gl.RGBA, _gl.RGBA, _gl.UNSIGNED_BYTE, texture.image );
-
-			_gl.texParameteri( _gl.TEXTURE_2D, _gl.TEXTURE_WRAP_S, paramThreeToGL( texture.wrap_s ) );
-			_gl.texParameteri( _gl.TEXTURE_2D, _gl.TEXTURE_WRAP_T, paramThreeToGL( texture.wrap_t ) );
-
-			_gl.texParameteri( _gl.TEXTURE_2D, _gl.TEXTURE_MAG_FILTER, paramThreeToGL( texture.mag_filter ) );
-			_gl.texParameteri( _gl.TEXTURE_2D, _gl.TEXTURE_MIN_FILTER, paramThreeToGL( texture.min_filter ) );
-			_gl.generateMipmap( _gl.TEXTURE_2D );
-			_gl.bindTexture( _gl.TEXTURE_2D, null );
+				_gl.texParameteri( _gl.TEXTURE_2D, _gl.TEXTURE_MAG_FILTER, paramThreeToGL( texture.mag_filter ) );
+				_gl.texParameteri( _gl.TEXTURE_2D, _gl.TEXTURE_MIN_FILTER, paramThreeToGL( texture.min_filter ) );
+				_gl.generateMipmap( _gl.TEXTURE_2D );
+				_gl.bindTexture( _gl.TEXTURE_2D, null );
+				
+			}			
+			
+			texture.needsUpdate = false;
 
 		}
 
 		_gl.activeTexture( _gl.TEXTURE0 + slot );
-		_gl.bindTexture( _gl.TEXTURE_2D, texture.__webGLTexture );
+		_gl.bindTexture( _gl.TEXTURE_2D, texture.__webGLTexture );		
 
 	};
 

+ 17 - 10
src/renderers/WebGLRenderer2.js

@@ -97,11 +97,11 @@ THREE.WebGLRenderer2 = function ( antialias ) {
 
 		this.autoClear && this.clear();
 
-		camera.matrixAutoUpdate && camera.updateMatrix();
+		camera.matrixAutoUpdate && camera.update();
 
 		// Setup camera matrices
 
-		_viewMatrixArray.set( camera.matrix.flatten() );
+		_viewMatrixArray.set( camera.globalMatrix.flatten() );
 		_projectionMatrixArray.set( camera.projectionMatrix.flatten() );
 
 		_currentProgram = null;
@@ -131,10 +131,10 @@ THREE.WebGLRenderer2 = function ( antialias ) {
 
 			// Setup object matrices
 
-			_objectMatrixArray.set( object.matrix.flatten() );
-
-			_modelViewMatrix.multiply( camera.matrix, object.matrix );
-			_modelViewMatrixArray.set( _modelViewMatrix.flatten() );
+			object.globalMatrix.flattenToArray( _objectMatrixArray )
+			
+			_modelViewMatrix.multiply( camera.globalMatrix, object.globalMatrix );
+			_modelViewMatrix.flattenToArray( _modelViewMatrixArray );
 
 			_normalMatrix = THREE.Matrix4.makeInvert3x3( _modelViewMatrix ).transpose();
 			_normalMatrixArray.set( _normalMatrix.m );
@@ -752,9 +752,14 @@ THREE.WebGLRenderer2 = function ( antialias ) {
 
 		function setTexture( texture, slot ) {
 
-			if ( !texture.__webglTexture && texture.image.loaded ) {
-
+			if ( !texture.__webglTexture ) {
+				
 				texture.__webglTexture = _gl.createTexture();
+				
+			}
+			
+			if ( texture.needsUpdate ) {
+
 				_gl.bindTexture( _gl.TEXTURE_2D, texture.__webglTexture );
 				_gl.texImage2D( _gl.TEXTURE_2D, 0, _gl.RGBA, _gl.RGBA, _gl.UNSIGNED_BYTE, texture.image );
 
@@ -765,14 +770,16 @@ THREE.WebGLRenderer2 = function ( antialias ) {
 				_gl.texParameteri( _gl.TEXTURE_2D, _gl.TEXTURE_MIN_FILTER, paramThreeToGL( texture.min_filter ) );
 				_gl.generateMipmap( _gl.TEXTURE_2D );
 				_gl.bindTexture( _gl.TEXTURE_2D, null );
+				
+				texture.needsUpdate = false;
 
 			}
 
 			_gl.activeTexture( _gl.TEXTURE0 + slot );
 			_gl.bindTexture( _gl.TEXTURE_2D, texture.__webglTexture );
 
-		}
-
+		};
+		
 		function maxVertexTextures() {
 
 			return _gl.getParameter( _gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS );

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