Browse Source

Matrix4.lookAt:
- Changed so it sets an ordinary matrix. Also removed inversion of position, which broke A LOT of the examples.

WebGLRenderer:
- Using camera.matrixWorldInverse instead of camera.matrixWorld
- Changed frustum check to camera.frustumContains( object );
- Moved cameraInverse * matrixWorld to vertex shader (needs testing!) (note: normals not fixed yet!)

Object3D.addChild:
- Recurses up through hierarchy until reaches scene and adds itself to scene.objects/sounds/lights

Camera:
- Changed inverseMatrix -> matrixWorldInverse

Mikael Emtinger 14 years ago
parent
commit
5c4131d366
6 changed files with 518 additions and 237 deletions
  1. 207 208
      build/Three.js
  2. 246 0
      index.html
  3. 7 9
      src/cameras/Camera.js
  4. 6 1
      src/core/Matrix4.js
  5. 11 0
      src/core/Object3D.js
  6. 41 19
      src/renderers/WebGLRenderer.js

File diff suppressed because it is too large
+ 207 - 208
build/Three.js


+ 246 - 0
index.html

@@ -0,0 +1,246 @@
+<!DOCTYPE HTML>
+<html lang="en">
+	<head>
+		<title>three.js - webgl</title>
+		<meta charset="utf-8">
+		<style type="text/css">
+			body {
+				background:#fff;
+				padding:0;
+				margin:0;
+				font-weight: bold;
+				overflow:hidden;
+			}
+		</style>
+	</head>
+
+	<body>
+		<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/Vertex.js"></script>
+		<script type="text/javascript" src="src/core/Face3.js"></script>
+		<script type="text/javascript" src="src/core/Face4.js"></script>
+		<script type="text/javascript" src="src/core/UV.js"></script>
+		<script type="text/javascript" src="src/core/Geometry.js"></script>
+		<script type="text/javascript" src="src/core/Quaternion.js"></script>
+		<script type="text/javascript" src="src/core/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/objects/Sound.js"></script>
+		<script type="text/javascript" src="src/objects/Bone.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/Mappings.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/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/WebGLRenderer2.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/primitives/Cube.js"></script>
+
+		<script type="text/javascript">
+
+
+			var container, stats;
+
+			var camera, scene, renderer;
+
+			var geometry, objects;
+
+			var mouseX = 0, mouseY = 0;
+
+			var windowHalfX = window.innerWidth / 2;
+			var windowHalfY = window.innerHeight / 2;
+
+			document.addEventListener( 'mousemove', onDocumentMouseMove, false );
+
+			init();
+			setInterval( loop, 1000 / 60 );
+
+			function init() {
+
+				container = document.createElement( 'div' );
+				document.body.appendChild( container );
+
+				camera = new THREE.Camera( 60, window.innerWidth / window.innerHeight, 1, 10000 );
+				camera.position.z = 500;
+
+				scene = new THREE.Scene();
+				scene.fog = new THREE.Fog( 0xffffff, 1, 10000 );
+
+				var geometry = new Cube( 100, 100, 100 );
+				var material = new THREE.MeshNormalMaterial();
+
+				var mesh = new THREE.Mesh( geometry, material );
+				mesh.position.x = 1000;
+				scene.addObject( mesh );
+
+				objects = [];
+
+				objects.push( mesh );
+
+				var amount = 200, child, object = mesh;
+
+				for ( var i = 0; i < amount; i ++ ) {
+
+					child = new THREE.Mesh( geometry, material );
+					child.position.x = 100;
+
+					object.addChild( child );
+					object = child;
+
+					objects.push( child );
+
+				}
+
+				object = mesh;
+
+				for ( var i = 0; i < amount; i ++ ) {
+
+					child = new THREE.Mesh( geometry, material );
+					child.position.x = - 100;
+
+					object.addChild( child );
+					object = child;
+
+					objects.push( child );
+
+				}
+
+				object = mesh;
+
+				for ( var i = 0; i < amount; i ++ ) {
+
+					child = new THREE.Mesh( geometry, material );
+					child.position.y = - 100;
+
+					object.addChild( child );
+					object = child;
+
+					objects.push( child );
+
+				}
+
+				object = mesh;
+
+				for ( var i = 0; i < amount; i ++ ) {
+
+					child = new THREE.Mesh( geometry, material );
+					child.position.y = 100;
+
+					object.addChild( child );
+					object = child;
+
+					objects.push( child );
+
+				}
+
+				object = mesh;
+
+				for ( var i = 0; i < amount; i ++ ) {
+
+					child = new THREE.Mesh( geometry, material );
+					child.position.z = - 100;
+
+					object.addChild( child );
+					object = child;
+
+					objects.push( child );
+
+				}
+
+				object = mesh;
+
+				for ( var i = 0; i < amount; i ++ ) {
+
+					child = new THREE.Mesh( geometry, material );
+					child.position.z = 100;
+
+					object.addChild( child );
+					object = child;
+
+					objects.push( child );
+
+				}
+
+				renderer = new THREE.WebGLRenderer();
+				renderer.setSize( window.innerWidth, window.innerHeight );
+				renderer.sortObjects = false;
+				container.appendChild( renderer.domElement );
+
+			}
+
+			function onDocumentMouseMove(event) {
+
+				mouseX = ( event.clientX - windowHalfX ) * 10;
+				mouseY = ( event.clientY - windowHalfY ) * 10;
+
+			}
+
+			function loop() {
+
+				var rx = Math.sin( new Date().getTime() * 0.0007 ) * 0.2,
+				ry = Math.sin( new Date().getTime() * 0.0003 ) * 0.1,
+				rz = Math.sin( new Date().getTime() * 0.0002 ) * 0.1;
+
+				camera.position.x += ( mouseX - camera.position.x ) * .05;
+				camera.position.y += ( - mouseY - camera.position.y ) * .05;
+
+				for ( var i = 0, l = objects.length; i < l; i ++ ) {
+
+					objects[ i ].rotation.x = rx;
+					objects[ i ].rotation.y = ry;
+					objects[ i ].rotation.z = rz;
+
+				}
+
+				renderer.render( scene, camera );
+
+			}
+
+			function log( text ) {
+
+				var e = document.getElementById("log");
+				e.innerHTML = text + "<br/>" + e.innerHTML;
+
+			}
+
+		</script>
+
+	</body>
+</html>

+ 7 - 9
src/cameras/Camera.js

@@ -20,8 +20,8 @@ THREE.Camera = function( fov, aspect, near, far, target ) {
 
 	this.up = new THREE.Vector3( 0, 1, 0 );
 
-	this.inverseMatrix     = new THREE.Matrix4();
-	this.projectionMatrix = null;
+	this.matrixWorldInverse = new THREE.Matrix4();
+	this.projectionMatrix   = null;
 
 	// movement
 
@@ -103,8 +103,7 @@ THREE.Camera.prototype.update = function( parentMatrixWorld, forceUpdate, camera
 
 		}
 
-		THREE.Matrix4.makeInvert( this.matrixWorld, this.inverseMatrix );
-		//THREE.Matrix4.makeInvertTo( this.matrixWorld, this.inverseMatrix );
+		THREE.Matrix4.makeInvert( this.matrixWorld, this.matrixWorldInverse );
 
 		forceUpdate = true;
 
@@ -126,10 +125,9 @@ THREE.Camera.prototype.update = function( parentMatrixWorld, forceUpdate, camera
 			}
 
 			this.matrixNeedsUpdate = false;
-			forceUpdate              = true;
+			forceUpdate            = true;
 
-			THREE.Matrix4.makeInvert( this.matrixWorld, this.inverseMatrix );
-			//THREE.Matrix4.makeInvertTo( this.matrixWorld, this.inverseMatrix );
+			THREE.Matrix4.makeInvert( this.matrixWorld, this.matrixWorldInverse );
 
 		}
 
@@ -148,7 +146,7 @@ THREE.Camera.prototype.update = function( parentMatrixWorld, forceUpdate, camera
 
 /*
  * FrustumContains
- * Checks object against projected image (as opposed to ordinary frustum check)
+ * Checks object against projected image (as opposed to ordinary 3D frustum check)
  *
  * TODO: make it work also for ortho camera
  */
@@ -163,7 +161,7 @@ THREE.Camera.prototype.frustumContains = function( object3D ) {
 
 	// check z
 
-	var inverse = this.inverseMatrix;
+	var inverse = this.matrixWorldInverse;
 	var radius = object3D.boundRadius * object3D.boundRadiusScale;
 	var vz1 = ( inverse.n31 * vx0 + inverse.n32 * vy0 + inverse.n33 * vz0 + inverse.n34 );
 

+ 6 - 1
src/core/Matrix4.js

@@ -75,10 +75,15 @@ THREE.Matrix4.prototype = {
 		x.cross( up, z ).normalize();
 		y.cross( z, x ).normalize();
 
-		this.n11 = x.x; this.n12 = x.y; this.n13 = x.z; this.n14 = - x.dot( eye );
+/*		this.n11 = x.x; this.n12 = x.y; this.n13 = x.z; this.n14 = - x.dot( eye );
 		this.n21 = y.x; this.n22 = y.y; this.n23 = y.z; this.n24 = - y.dot( eye );
 		this.n31 = z.x; this.n32 = z.y; this.n33 = z.z; this.n34 = - z.dot( eye );
 		this.n41 = 0; this.n42 = 0; this.n43 = 0; this.n44 = 1;
+*/
+
+		this.n11 = x.x; this.n12 = y.x; this.n13 = z.x; this.n14 = -eye.x;
+		this.n21 = x.y; this.n22 = y.y; this.n23 = z.y; this.n24 = -eye.y;
+		this.n31 = x.z; this.n32 = y.z; this.n33 = z.z; this.n34 = -eye.z;
 
 		return this;
 

+ 11 - 0
src/core/Object3D.js

@@ -49,6 +49,17 @@ THREE.Object3D.prototype = {
 			child.parent = this;
 			this.children.push( child );
 
+			
+			// add to scene
+			
+			var scene = this;
+			
+			while( scene instanceof THREE.Scene === false && scene !== undefined )
+				scene = scene.parent;
+			
+			if( scene !== undefined ) 
+				scene.addChildRecurse( child );
+
 		}
 
 	},

+ 41 - 19
src/renderers/WebGLRenderer.js

@@ -46,7 +46,6 @@ THREE.WebGLRenderer = function ( parameters ) {
 
 	_projScreenMatrix = new THREE.Matrix4(),
 	_projectionMatrixArray = new Float32Array( 16 ),
-	_cameraInverseMatrixArray = new Float32Array( 16 ),
 
 	_viewMatrixArray = new Float32Array( 16 ),
 
@@ -1401,6 +1400,7 @@ THREE.WebGLRenderer = function ( parameters ) {
 			_oldProgram = program;
 
 			_gl.uniformMatrix4fv( p_uniforms.projectionMatrix, false, _projectionMatrixArray );
+			_gl.uniformMatrix4fv( p_uniforms.cameraInverseMatrix, false, _viewMatrixArray );
 
 		}
 
@@ -1856,14 +1856,20 @@ THREE.WebGLRenderer = function ( parameters ) {
 			fog = scene.fog,
 			ol;
 
+
+// EMPA: needs to be reset 
+		_oldProgram = null,
+
+
 		camera.matrixAutoUpdate && camera.update();
 
-		camera.matrixWorld.flattenToArray( _viewMatrixArray );
+		camera.matrixWorldInverse.flattenToArray( _viewMatrixArray );
 		camera.projectionMatrix.flattenToArray( _projectionMatrixArray );
-		camera.inverseMatrix.flattenToArray( _cameraInverseMatrixArray );
 
-		_projScreenMatrix.multiply( camera.projectionMatrix, camera.matrixWorld );
-		computeFrustum( _projScreenMatrix );
+		_projScreenMatrix.multiply( camera.projectionMatrix, camera.matrixWorldInverse );
+
+// EMPA: calling camera frustum check
+//		computeFrustum( _projScreenMatrix );
 
 		if( THREE.AnimationHandler ) THREE.AnimationHandler.update();
 
@@ -1890,7 +1896,9 @@ THREE.WebGLRenderer = function ( parameters ) {
 
 			if ( object.visible ) {
 
-				if ( ! ( object instanceof THREE.Mesh ) || isInFrustum( object ) ) {
+// EMPA: calling camera frustum check (probably faster to have inside of WebGLRenderer)
+//				if ( ! ( object instanceof THREE.Mesh ) || isInFrustum( object ) ) {
+				if ( ! ( object instanceof THREE.Mesh ) || camera.frustumContains( object ) ) {
 
 					object.matrixWorld.flattenToArray( object._objectMatrixArray );
 
@@ -1902,10 +1910,13 @@ THREE.WebGLRenderer = function ( parameters ) {
 
 					if ( this.sortObjects ) {
 
-						_vector3.copy( object.position );
-						_projScreenMatrix.multiplyVector3( _vector3 );
+// EMPA: positionScreen.z contains the z-depth in camera space after camera.frustumContains
+//						_vector3.copy( object.position );
+//						_projScreenMatrix.multiplyVector3( _vector3 );
+
+//						webGLObject.z = _vector3.z;
 
-						webGLObject.z = _vector3.z;
+						webGLObject.z = object.positionScreen.z;
 
 					}
 
@@ -2297,9 +2308,14 @@ THREE.WebGLRenderer = function ( parameters ) {
 
 	function setupMatrices ( object, camera ) {
 
-		object._modelViewMatrix.multiplyToArray( camera.matrixWorld, object.matrixWorld, object._modelViewMatrixArray );
-		THREE.Matrix4.makeInvert3x3( object._modelViewMatrix ).transposeIntoArray( object._normalMatrixArray );
+// EMPA: moved inverse * matrixWorld to vertex shader
+//		object._modelViewMatrix.multiplyToArray( camera.matrixWorldInverse, object.matrixWorld, object._modelViewMatrixArray );
+//		THREE.Matrix4.makeInvert3x3( object._modelViewMatrix ).transposeIntoArray( object._normalMatrixArray );
 
+
+// EMPA: the normal update part is only needed when object (or object's parents) have been rotated (could be done inside Mesh.update)
+		object.matrixWorld.flattenToArray( object._modelViewMatrixArray );
+		THREE.Matrix4.makeInvert3x3( object.matrixWorld ).transposeIntoArray( object._normalMatrixArray );
 	};
 
 	this.setFaceCulling = function ( cullFace, frontFace ) {
@@ -2377,8 +2393,9 @@ THREE.WebGLRenderer = function ( parameters ) {
 		_gl.cullFace( _gl.BACK );
 		_gl.enable( _gl.CULL_FACE );
 
-		_gl.enable( _gl.BLEND );
-		_gl.blendFunc( _gl.ONE, _gl.ONE_MINUS_SRC_ALPHA );
+// EMPA: enable only when neccesary
+//		_gl.enable( _gl.BLEND );
+//		_gl.blendFunc( _gl.ONE, _gl.ONE_MINUS_SRC_ALPHA );
 		_gl.clearColor( clearColor.r, clearColor.g, clearColor.b, clearAlpha );
 
 		_cullEnabled = true;
@@ -2471,16 +2488,20 @@ THREE.WebGLRenderer = function ( parameters ) {
 
 	function loadUniformsSkinning( uniforms, object ) {
 
-		_gl.uniformMatrix4fv( uniforms.cameraInverseMatrix, false, _cameraInverseMatrixArray );
+		_gl.uniformMatrix4fv( uniforms.cameraInverseMatrix, false, _viewMatrixArray );
 		_gl.uniformMatrix4fv( uniforms.boneGlobalMatrices, false, object.boneMatrices );
 
 	};
 
 	function loadUniformsMatrices( uniforms, object ) {
 
+// EMPA: added inverse * matrixWorld to vertex shader
+//		_gl.uniformMatrix4fv( uniforms.modelViewMatrix, false, object._modelViewMatrixArray );
+//		_gl.uniformMatrix3fv( uniforms.normalMatrix, false, object._normalMatrixArray );
+
+//		_gl.uniformMatrix4fv( uniforms.cameraInverseMatrix, false, _viewMatrixArray );
 		_gl.uniformMatrix4fv( uniforms.modelViewMatrix, false, object._modelViewMatrixArray );
 		_gl.uniformMatrix3fv( uniforms.normalMatrix, false, object._normalMatrixArray );
-
 	};
 
 	function loadUniformsGeneric( program, uniforms ) {
@@ -3401,9 +3422,10 @@ THREE.Snippets = {
 		"gl_Position += ( boneGlobalMatrices[ int( skinIndex.y ) ] * skinVertexB ) * skinWeight.y;",
 
 		// this doesn't work, no idea why
-		//"gl_Position  = projectionMatrix * cameraInverseMatrix * objectMatrix * gl_Position;",
+		"gl_Position  = projectionMatrix * objectMatrix * gl_Position;",
 
-		"gl_Position  = projectionMatrix * viewMatrix * objectMatrix * gl_Position;",
+		// EMPA: Above should work now
+		//"gl_Position  = projectionMatrix * viewMatrix * objectMatrix * gl_Position;",
 
 	"#else",
 
@@ -3525,10 +3547,10 @@ THREE.ShaderLib = {
 
 			"void main() {",
 
-				"vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );",
+				"//vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );",
 				"vNormal = normalize( normalMatrix * normal );",
 
-				"gl_Position = projectionMatrix * mvPosition;",
+				"gl_Position = projectionMatrix * cameraInverseMatrix * modelViewMatrix * vec4( position, 1.0 );//mvPosition;",
 
 			"}"
 

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