Przeglądaj źródła

Merging with empaempa's branch

Mr.doob 14 lat temu
rodzic
commit
431b14f98e
8 zmienionych plików z 681 dodań i 257 usunięć
  1. 238 239
      build/Three.js
  2. 247 0
      index.html
  3. 158 0
      lod.html
  4. 7 9
      src/cameras/Camera.js
  5. 6 1
      src/core/Matrix4.js
  6. 16 0
      src/core/Object3D.js
  7. 5 1
      src/objects/LOD.js
  8. 4 7
      src/renderers/WebGLRenderer.js

Plik diff jest za duży
+ 238 - 239
build/Three.js


+ 247 - 0
index.html

@@ -0,0 +1,247 @@
+<!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" src="src/extras/primitives/Sphere.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>

+ 158 - 0
lod.html

@@ -0,0 +1,158 @@
+<!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/objects/LOD.js"></script>
+		<script type="text/javascript" src="src/objects/Ribbon.js"></script>
+		<script type="text/javascript" src="src/objects/ParticleSystem.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" src="src/extras/primitives/Sphere.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 );
+
+				var material2 = new THREE.MeshLambertMaterial( { color: 0xff00ff } );
+				var mesh2 = new THREE.Mesh( geometry, material2 );
+
+				var lod = new THREE.LOD();
+				lod.add( mesh );
+				lod.add( mesh2, 2000 );
+
+				scene.addObject( lod );
+
+
+
+				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() {
+
+				camera.position.x += ( mouseX - camera.position.x ) * .05;
+				camera.position.y += ( - mouseY - camera.position.y ) * .05;
+
+				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;
 

+ 16 - 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 );
+
 		}
 
 	},
@@ -149,3 +160,8 @@ THREE.Object3D.prototype = {
 }
 
 THREE.Object3DCounter = { value: 0 };
+
+
+
+
+

+ 5 - 1
src/objects/LOD.js

@@ -77,11 +77,15 @@ THREE.LOD.prototype.update = function ( parentMatrixWorld, forceUpdate, camera )
 
 	}
 
+
 	// update LODs
 
 	if ( this.LODs.length > 1 ) {
 
-		var distance = -camera.inverseMatrix.mulitplyVector3OnlyZ( this.position );
+
+		var inverse  = camera.matrixWorldInverse;
+		var radius   = this.boundRadius * this.boundRadiusScale;
+		var distance = -( inverse.n31 * this.position.x + inverse.n32 * this.position.y + inverse.n33 * this.position.z + inverse.n34 );
 
 		this.LODs[ 0 ].object3D.visible = true;
 

+ 4 - 7
src/renderers/WebGLRenderer.js

@@ -46,8 +46,6 @@ THREE.WebGLRenderer = function ( parameters ) {
 
 	_projScreenMatrix = new THREE.Matrix4(),
 	_projectionMatrixArray = new Float32Array( 16 ),
-	_cameraInverseMatrixArray = new Float32Array( 16 ),
-
 	_viewMatrixArray = new Float32Array( 16 ),
 
 	_vector3 = new THREE.Vector4(),
@@ -1858,11 +1856,10 @@ THREE.WebGLRenderer = function ( parameters ) {
 
 		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 );
+		_projScreenMatrix.multiply( camera.projectionMatrix, camera.matrixWorldInverse );
 		computeFrustum( _projScreenMatrix );
 
 		if( THREE.AnimationHandler ) THREE.AnimationHandler.update();
@@ -2297,7 +2294,7 @@ THREE.WebGLRenderer = function ( parameters ) {
 
 	function setupMatrices ( object, camera ) {
 
-		object._modelViewMatrix.multiplyToArray( camera.matrixWorld, object.matrixWorld, object._modelViewMatrixArray );
+		object._modelViewMatrix.multiplyToArray( camera.matrixWorldInverse, object.matrixWorld, object._modelViewMatrixArray );
 		THREE.Matrix4.makeInvert3x3( object._modelViewMatrix ).transposeIntoArray( object._normalMatrixArray );
 
 	};
@@ -2471,7 +2468,7 @@ 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 );
 
 	};

Niektóre pliki nie zostały wyświetlone z powodu dużej ilości zmienionych plików