Browse Source

Merge with dev after release v65

Juergen Ahting 11 years ago
parent
commit
823435bca0
40 changed files with 967 additions and 742 deletions
  1. 1 1
      LICENSE
  2. 1 1
      bower.json
  3. 136 25
      build/three.js
  4. 327 325
      build/three.min.js
  5. 0 1
      docs/api/cameras/PerspectiveCamera.html
  6. 15 0
      docs/api/extras/geometries/CircleGeometry.html
  7. 10 0
      docs/api/extras/geometries/CubeGeometry.html
  8. 10 1
      docs/api/extras/geometries/CylinderGeometry.html
  9. 10 1
      docs/api/extras/geometries/PlaneGeometry.html
  10. 7 0
      docs/api/extras/geometries/RingGeometry.html
  11. 7 0
      docs/api/extras/geometries/SphereGeometry.html
  12. 10 1
      docs/api/extras/geometries/TorusGeometry.html
  13. 9 0
      docs/api/extras/geometries/TorusKnotGeometry.html
  14. 17 4
      docs/api/extras/helpers/ArrowHelper.html
  15. 7 1
      docs/api/extras/helpers/AxisHelper.html
  16. 13 1
      docs/api/extras/helpers/GridHelper.html
  17. 1 3
      docs/api/extras/helpers/HemisphereLightHelper.html
  18. 14 4
      docs/api/extras/helpers/PointLightHelper.html
  19. 17 0
      docs/api/objects/Line.html
  20. 1 0
      docs/list.js
  21. 11 1
      editor/js/Editor.js
  22. 26 27
      editor/js/Menubar.File.js
  23. 1 1
      editor/js/Viewport.js
  24. 8 16
      examples/canvas_interactive_voxelpainter.html
  25. 161 0
      examples/canvas_morphtargets_horse.html
  26. 2 1
      examples/index.html
  27. 1 0
      examples/webgl_interactive_voxelpainter.html
  28. 6 7
      examples/webgl_loader_json_objconverter.html
  29. 1 2
      examples/webgl_loader_vrml.html
  30. 0 1
      examples/webgl_loader_vtk.html
  31. 0 286
      examples/webgl_materials_shaders.html
  32. 0 3
      examples/webgl_mirror.html
  33. 0 1
      examples/webgl_particles_shapes.html
  34. 0 1
      examples/webgl_sprites.html
  35. 1 1
      src/Three.js
  36. 79 20
      src/core/Projector.js
  37. 43 2
      src/core/Raycaster.js
  38. 12 2
      src/objects/LOD.js
  39. 1 0
      src/renderers/renderables/RenderableVertex.js
  40. 1 1
      test/unit/math/Color.js

+ 1 - 1
LICENSE

@@ -1,6 +1,6 @@
 The MIT License
 
-Copyright (c) 2010-2013 three.js authors
+Copyright © 2010-2014 three.js authors
 
 Permission is hereby granted, free of charge, to any person obtaining a copy
 of this software and associated documentation files (the "Software"), to deal

+ 1 - 1
bower.json

@@ -1,6 +1,6 @@
 {
 	"name": "three.js",
-	"version": "0.0.64",
+	"version": "0.0.65",
 	"homepage": "http://threejs.org/",
 	"description": "JavaScript 3D library",
 	"main": "build/three.js",

+ 136 - 25
build/three.js

@@ -4,7 +4,7 @@
  * @author bhouston / http://exocortex.com
  */
 
-var THREE = { REVISION: '65dev' };
+var THREE = { REVISION: '65' };
 
 self.console = self.console || {
 
@@ -7083,10 +7083,51 @@ THREE.EventDispatcher.prototype = {
 					a = vertices[ face.a ];
 					b = vertices[ face.b ];
 					c = vertices[ face.c ];
-					
+
+					if ( material.morphTargets === true ) {
+
+						var morphTargets = geometry.morphTargets;
+						var morphInfluences = object.morphTargetInfluences;
+
+						vA.set( 0, 0, 0 );
+						vB.set( 0, 0, 0 );
+						vC.set( 0, 0, 0 );
+
+						for ( var t = 0, tl = morphTargets.length; t < tl; t ++ ) {
+
+							var influence = morphInfluences[ t ];
+
+							if ( influence === 0 ) continue;
+
+							var targets = morphTargets[ t ].vertices;
+
+							vA.x += ( targets[ face.a ].x - a.x ) * influence;
+							vA.y += ( targets[ face.a ].y - a.y ) * influence;
+							vA.z += ( targets[ face.a ].z - a.z ) * influence;
+
+							vB.x += ( targets[ face.b ].x - b.x ) * influence;
+							vB.y += ( targets[ face.b ].y - b.y ) * influence;
+							vB.z += ( targets[ face.b ].z - b.z ) * influence;
+
+							vC.x += ( targets[ face.c ].x - c.x ) * influence;
+							vC.y += ( targets[ face.c ].y - c.y ) * influence;
+							vC.z += ( targets[ face.c ].z - c.z ) * influence;
+
+						}
+
+						vA.add( a );
+						vB.add( b );
+						vC.add( c );
+
+						a = vA;
+						b = vB;
+						c = vC;
+
+					}
+
 					if ( material.side === THREE.BackSide ) {
 							
-						var intersectionPoint = localRay.intersectTriangle( c, b, a, true ); 
+						var intersectionPoint = localRay.intersectTriangle( c, b, a, true );
 
 					} else {
 								
@@ -7821,6 +7862,10 @@ THREE.Projector = function () {
 
 	_renderData = { objects: [], sprites: [], lights: [], elements: [] },
 
+	_vA = new THREE.Vector3(),
+	_vB = new THREE.Vector3(),
+	_vC = new THREE.Vector3(),
+
 	_vector3 = new THREE.Vector3(),
 	_vector4 = new THREE.Vector4(),
 
@@ -7908,6 +7953,27 @@ THREE.Projector = function () {
 
 	};
 
+	var projectVertex = function ( vertex ) {
+
+		var position = vertex.position;
+		var positionWorld = vertex.positionWorld;
+		var positionScreen = vertex.positionScreen;
+
+		positionWorld.copy( position ).applyMatrix4( _modelMatrix );
+		positionScreen.copy( positionWorld ).applyMatrix4( _viewProjectionMatrix );
+
+		var invW = 1 / positionScreen.w;
+
+		positionScreen.x *= invW;
+		positionScreen.y *= invW;
+		positionScreen.z *= invW;
+
+		vertex.visible = positionScreen.x >= -1 && positionScreen.x <= 1 &&
+				 positionScreen.y >= -1 && positionScreen.y <= 1 &&
+				 positionScreen.z >= -1 && positionScreen.z <= 1;
+
+	};
+
 	var projectObject = function ( object ) {
 
 		if ( object.visible === false ) return;
@@ -7959,8 +8025,7 @@ THREE.Projector = function () {
 	this.projectScene = function ( scene, camera, sortObjects, sortElements ) {
 
 		var visible = false,
-		o, ol, v, vl, f, fl, n, nl, c, cl, u, ul, object,
-		geometry, vertices, faces, face, faceVertexNormals, faceVertexUvs, uvs,
+		object, geometry, vertices, faces, face, faceVertexNormals, faceVertexUvs, uvs,
 		v1, v2, v3, v4, isFaceMaterial, objectMaterials;
 
 		_face3Count = 0;
@@ -7981,7 +8046,7 @@ THREE.Projector = function () {
 
 		projectGraph( scene, sortObjects );
 
-		for ( o = 0, ol = _renderData.objects.length; o < ol; o ++ ) {
+		for ( var o = 0, ol = _renderData.objects.length; o < ol; o ++ ) {
 
 			object = _renderData.objects[ o ].object;
 
@@ -8002,26 +8067,16 @@ THREE.Projector = function () {
 				isFaceMaterial = object.material instanceof THREE.MeshFaceMaterial;
 				objectMaterials = isFaceMaterial === true ? object.material : null;
 
-				for ( v = 0, vl = vertices.length; v < vl; v ++ ) {
+				for ( var v = 0, vl = vertices.length; v < vl; v ++ ) {
 
 					_vertex = getNextVertexInPool();
+					_vertex.position.copy( vertices[ v ] );
 
-					_vertex.positionWorld.copy( vertices[ v ] ).applyMatrix4( _modelMatrix );
-					_vertex.positionScreen.copy( _vertex.positionWorld ).applyMatrix4( _viewProjectionMatrix );
-
-					var invW = 1 / _vertex.positionScreen.w;
-
-					_vertex.positionScreen.x *= invW;
-					_vertex.positionScreen.y *= invW;
-					_vertex.positionScreen.z *= invW;
-
-					_vertex.visible = ! ( _vertex.positionScreen.x < -1 || _vertex.positionScreen.x > 1 ||
-							      _vertex.positionScreen.y < -1 || _vertex.positionScreen.y > 1 ||
-							      _vertex.positionScreen.z < -1 || _vertex.positionScreen.z > 1 );
+					projectVertex( _vertex );
 
 				}
 
-				for ( f = 0, fl = faces.length; f < fl; f ++ ) {
+				for ( var f = 0, fl = faces.length; f < fl; f ++ ) {
 
 					face = faces[ f ];
 
@@ -8037,6 +8092,51 @@ THREE.Projector = function () {
 					v2 = _vertexPool[ face.b ];
 					v3 = _vertexPool[ face.c ];
 
+					if ( material.morphTargets === true ) {
+
+						var morphTargets = geometry.morphTargets;
+						var morphInfluences = object.morphTargetInfluences;
+
+						var v1p = v1.position;
+						var v2p = v2.position;
+						var v3p = v3.position;
+
+						_vA.set( 0, 0, 0 );
+						_vB.set( 0, 0, 0 );
+						_vC.set( 0, 0, 0 );
+
+						for ( var t = 0, tl = morphTargets.length; t < tl; t ++ ) {
+
+							var influence = morphInfluences[ t ];
+
+							if ( influence === 0 ) continue;
+
+							var targets = morphTargets[ t ].vertices;
+
+							_vA.x += ( targets[ face.a ].x - v1p.x ) * influence;
+							_vA.y += ( targets[ face.a ].y - v1p.y ) * influence;
+							_vA.z += ( targets[ face.a ].z - v1p.z ) * influence;
+
+							_vB.x += ( targets[ face.b ].x - v2p.x ) * influence;
+							_vB.y += ( targets[ face.b ].y - v2p.y ) * influence;
+							_vB.z += ( targets[ face.b ].z - v2p.z ) * influence;
+
+							_vC.x += ( targets[ face.c ].x - v3p.x ) * influence;
+							_vC.y += ( targets[ face.c ].y - v3p.y ) * influence;
+							_vC.z += ( targets[ face.c ].z - v3p.z ) * influence;
+
+						}
+
+						v1.position.add( _vA );
+						v2.position.add( _vB );
+						v3.position.add( _vC );
+
+						projectVertex( v1 );
+						projectVertex( v2 );
+						projectVertex( v3 );
+
+					}
+
 					_points3[ 0 ] = v1.positionScreen;
 					_points3[ 1 ] = v2.positionScreen;
 					_points3[ 2 ] = v3.positionScreen;
@@ -8086,7 +8186,7 @@ THREE.Projector = function () {
 
 					faceVertexNormals = face.vertexNormals;
 
-					for ( n = 0, nl = Math.min( faceVertexNormals.length, 3 ); n < nl; n ++ ) {
+					for ( var n = 0, nl = Math.min( faceVertexNormals.length, 3 ); n < nl; n ++ ) {
 
 						var normalModel = _face.vertexNormalsModel[ n ];
 						normalModel.copy( faceVertexNormals[ n ] );
@@ -8106,13 +8206,13 @@ THREE.Projector = function () {
 
 					_face.vertexNormalsLength = faceVertexNormals.length;
 
-					for ( c = 0, cl = Math.min( faceVertexUvs.length, 3 ); c < cl; c ++ ) {
+					for ( var c = 0, cl = Math.min( faceVertexUvs.length, 3 ); c < cl; c ++ ) {
 
 						uvs = faceVertexUvs[ c ][ f ];
 
 						if ( uvs === undefined ) continue;
 
-						for ( u = 0, ul = uvs.length; u < ul; u ++ ) {
+						for ( var u = 0, ul = uvs.length; u < ul; u ++ ) {
 
 							_face.uvs[ c ][ u ] = uvs[ u ];
 
@@ -15119,9 +15219,19 @@ THREE.LOD.prototype.update = function () {
 
 }();
 
-THREE.LOD.prototype.clone = function () {
+THREE.LOD.prototype.clone = function ( object ) {
 
-	// TODO
+	if ( object === undefined ) object = new THREE.LOD();
+
+	THREE.Object3D.prototype.clone.call( this, object );
+
+	for ( var i = 0, l = this.objects.length; i < l; i ++ ) {
+		var x = this.objects[i].object.clone();
+		x.visible = i === 0;
+		object.addLevel( x, this.objects[i].distance );
+	}
+
+	return object;
 
 };
 
@@ -26299,6 +26409,7 @@ THREE.WebGLRenderTargetCube.prototype = Object.create( THREE.WebGLRenderTarget.p
 
 THREE.RenderableVertex = function () {
 
+	this.position = new THREE.Vector3();
 	this.positionWorld = new THREE.Vector3();
 	this.positionScreen = new THREE.Vector4();
 

File diff suppressed because it is too large
+ 327 - 325
build/three.min.js


+ 0 - 1
docs/api/cameras/PerspectiveCamera.html

@@ -22,7 +22,6 @@ scene.add( camera );</code>
 
 		<h2>Constructor</h2>
 
-
 		<h3>[name]( [page:Float fov], [page:Float aspect], [page:Float near], [page:Float far] )</h3>
 		<div>
 		fov — Camera frustum vertical field of view.<br />

+ 15 - 0
docs/api/extras/geometries/CircleGeometry.html

@@ -11,6 +11,21 @@
 
 		<div class="desc">CircleGeometry is a simple shape of Euclidean geometry.  It is contructed from a number of triangular segments that are oriented around a central point and extend as far out as a given radius.  It is built counter-clockwise from a start angle and a given central angle.  It can also be used to create regular polygons, where the number of segments determines the number of sides.
 		</div>
+		
+		<h2>Example</h2>
+
+		<code>var material = new THREE.MeshBasicMaterial({
+			color: 0x0000ff
+		});
+		
+		var radius = 5;
+		var segments = 32;
+		
+		var circleGeometry = new THREE.CircleGeometry( radius, segments );				
+		var circle = new THREE.Mesh( circleGeometry, material );
+		scene.add( circle );
+		</code>
+
 
 		<h2>Constructor</h2>
 

+ 10 - 0
docs/api/extras/geometries/CubeGeometry.html

@@ -12,6 +12,16 @@
 		<h1>[name]</h1>
 
 		<div class="desc">CubeGeometry is the quadrilateral primitive geometry class. It is typically used for creating a cube or irregular quadrilateral of the dimensions provided with the 'width', 'height', and 'depth' constructor arguments.</div>
+		
+		
+		<h2>Example</h2>
+		
+		
+		<code>var geometry = new THREE.CubeGeometry( 1, 1, 1 );
+		var material = new THREE.MeshBasicMaterial( {color: 0x00ff00} );
+		var cube = new THREE.Mesh( geometry, material );
+		scene.add( cube );
+		</code>
 
 
 		<h2>Constructor</h2>

+ 10 - 1
docs/api/extras/geometries/CylinderGeometry.html

@@ -11,7 +11,16 @@
 		
 		<h1>[name]</h1>
 
-		<div class="desc">todo</div>
+		<div class="desc">A class for generating cylinder geometries</div>
+
+
+		<h2>Example</h2>
+		
+		<code>var geometry = new THREE.CylinderGeometry( 5, 5, 20, 32 );
+		var material = new THREE.MeshBasicMaterial( {color: 0xffff00} );
+		var cylinder = new THREE.Mesh( geometry, material );
+		scene.add( cylinder );
+		</code>
 
 
 		<h2>Constructor</h2>

+ 10 - 1
docs/api/extras/geometries/PlaneGeometry.html

@@ -11,7 +11,16 @@
 		
 		<h1>[name]</h1>
 
-		<div class="desc">todo</div>
+		<div class="desc">A class for generating plane geometries</div>
+
+
+		<h2>Example</h2>
+		
+		<code>var geometry = new THREE.PlaneGeometry( 5, 20 );
+		var material = new THREE.MeshBasicMaterial( {color: 0xffff00, side: THREE.DoubleSide} );
+		var plane = new THREE.Mesh( geometry, material );
+		scene.add( plane );
+		</code>
 
 
 		<h2>Constructor</h2>

+ 7 - 0
docs/api/extras/geometries/RingGeometry.html

@@ -13,6 +13,13 @@
 
 		<div class="desc">A class for generating a two-dimensional ring geometry.</div>
 
+		<h2>Example</h2>
+		
+		<code>var geometry = new THREE.RingGeometry( 1, 5, 32 );
+		var material = new THREE.MeshBasicMaterial( { color: 0xffff00, side: THREE.DoubleSide } );
+		var mesh = new THREE.Mesh( geometry, material );
+		scene.add( mesh );
+		</code>
 
 		<h2>Constructor</h2>
 

+ 7 - 0
docs/api/extras/geometries/SphereGeometry.html

@@ -13,6 +13,13 @@
 
 		<div class="desc">A class for generating sphere geometries</div>
 
+		<h2>Example</h2>
+		
+		<code>var geometry = new THREE.SphereGeometry( 5, 32, 32 );
+		var material = new THREE.MeshBasicMaterial( {color: 0xffff00} );
+		var sphere = new THREE.Mesh( geometry, material );
+		scene.add( sphere );
+		</code>
 
 		<h2>Constructor</h2>
 

+ 10 - 1
docs/api/extras/geometries/TorusGeometry.html

@@ -11,7 +11,16 @@
 	
 		<h1>[name]</h1>
 
-		<div class="desc">Creates a torus.</div>
+		<div class="desc">A class for generating torus geometries</div>
+
+
+		<h2>Example</h2>
+		
+		<code>var geometry = new THREE.TorusGeometry( 10, 3, 16, 100 );
+		var material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );
+		var torus = new THREE.Mesh( geometry, material );
+		scene.add( torus );
+		</code>
 
 
 		<h2>Constructor</h2>

+ 9 - 0
docs/api/extras/geometries/TorusKnotGeometry.html

@@ -14,6 +14,15 @@
 		<div class="desc">Creates a torus knot, the particular shape of which is defined by a pair of coprime integers, p and q.  If p and q are not coprime, the result will be a torus link.</div>
 
 
+		<h2>Example</h2>
+		
+		<code>var geometry = new THREE.TorusKnotGeometry( 10, 3, 100, 16 );
+		var material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );
+		var torusKnot = new THREE.Mesh( geometry, material );
+		scene.add( torusKnot );
+		</code>
+
+
 		<h2>Constructor</h2>
 
 

+ 17 - 4
docs/api/extras/helpers/ArrowHelper.html

@@ -12,15 +12,28 @@
 		<div class="desc">todo</div>
 
 
+		<h2>Example</h2>
+
+		<code>var dir = new THREE.Vector3( 1, 0, 0 );
+		var origin = new THREE.Vector3( 0, 0, 0 );
+		var length = 1;
+		var hex = 0xffff00;
+
+		var arrowHelper = new THREE.ArrowHelper( dir, origin, length, hex );
+		scene.add( arrowHelper );
+		</code>
+
+
+
 		<h2>Constructor</h2>
 
 
 		<h3>[name]([page:todo dir], [page:todo origin], [page:todo length], [page:todo hex])</h3>
 		<div>
-		dir -- todo <br />
-		origin -- todo <br />
-		length -- todo <br />
-		hex -- todo
+		dir -- Vector3 -- direction from origin <br />
+		origin -- Vector3 <br />
+		length -- scalar <br />
+		hex -- hexadecimal value to define color ex:0xffff00
 		</div>
 		<div>
 		todo

+ 7 - 1
docs/api/extras/helpers/AxisHelper.html

@@ -12,12 +12,18 @@
 		<div class="desc">todo</div>
 
 
+		<h2>Example</h2>
+
+                <code>var axisHelper = new THREE.AxisHelper( 5 );
+		scene.add( axisHelper );
+                </code>
+
 		<h2>Constructor</h2>
 
 
 		<h3>[name]([page:todo size])</h3>
 		<div>
-		size -- todo
+		size -- Define the size of the helper
 		</div>
 		<div>
 		todo

+ 13 - 1
docs/api/extras/helpers/GridHelper.html

@@ -12,9 +12,21 @@
 		<div class="desc">todo</div>
 
 
-		<h2>Constructor</h2>
+		<h2>Example</h2>
+
+		<code>var size = 10;
+		var step = 1;
+		var gridHelper = new THREE.GridHelper( size, step );
+		
+		gridHelper.position = new THREE.Vector3( 10, 10, 0 );
+		gridHelper.rotation = new THREE.Euler( 15, 0, 0 );
+		
+		scene.add( gridHelper );
+		</code>
 
 
+		<h2>Constructor</h2>
+
 		<h3>[name]([page:todo size], [page:todo step])</h3>
 		<div>
 		size -- todo <br />

+ 1 - 3
docs/api/extras/helpers/HemisphereLightHelper.html

@@ -14,7 +14,6 @@
 
 		<h2>Constructor</h2>
 
-
 		<h3>[name]([page:todo light], [page:todo sphereSize], [page:todo arrowLength], [page:todo domeSize])</h3>
 		<div>
 		light -- todo <br />
@@ -29,7 +28,6 @@
 
 		<h2>Properties</h2>
 
-
 		<h3>.[page:Mesh lightSphere]</h3>
 		<div>
 		todo
@@ -43,12 +41,12 @@
 
 		<h2>Methods</h2>
 
-
 		<h3>.update() [page:todo]</h3>
 		<div>
 		todo
 		</div>
 
+
 		<h2>Source</h2>
 
 		[link:https://github.com/mrdoob/three.js/blob/master/src/[path].js src/[path].js]

+ 14 - 4
docs/api/extras/helpers/PointLightHelper.html

@@ -9,12 +9,23 @@
 	<body>
 		<h1>[name]</h1>
 
-		<div class="desc">todo</div>
+		<div class="desc">This display a helper for a pointLight </div>
 
 
-		<h2>Constructor</h2>
+		<h2>Example</h2>
+
+		<code>var pointLight = new THREE.PointLight( 0xff0000, 1, 100 );
+		pointLight.position.set( 10, 10, 10 );
+		scene.add( pointLight );
+		
+		var sphereSize = 1;
+		var pointLightHelper = new THREE.PointLightHelper( pointLight, sphereSize );
+		scene.add( pointLightHelper );
+		</code>
 
 
+		<h2>Constructor</h2>
+
 		<h3>[name]([page:todo light], [page:todo sphereSize])</h3>
 		<div>
 		light -- todo <br />
@@ -27,7 +38,6 @@
 
 		<h2>Properties</h2>
 
-
 		<h3>.[page:Mesh lightSphere]</h3>
 		<div>
 		todo
@@ -38,8 +48,8 @@
 		todo
 		</div> 
 
-		<h2>Methods</h2>
 
+		<h2>Methods</h2>
 
 		<h3>.update() [page:todo]</h3>
 		<div>

+ 17 - 0
docs/api/objects/Line.html

@@ -14,6 +14,23 @@
 		<div class="desc">A line or a series of lines.</div>
 
 
+		<h2>Example</h2>
+
+
+		<code>var material = new THREE.LineBasicMaterial({
+			color: 0x0000ff
+		});
+		
+		var geometry = new THREE.Geometry();
+		geometry.vertices.push( new THREE.Vector3( -10, 0, 0 ) );
+		geometry.vertices.push( new THREE.Vector3( 0, 10, 0 ) );
+		geometry.vertices.push( new THREE.Vector3( 10, 0, 0 ) );
+
+		var line = new THREE.Line( geometry, material );
+		scene.add( line );
+		</code>
+
+		
 		<h2>Constructor</h2>
 
 

+ 1 - 0
docs/list.js

@@ -175,6 +175,7 @@ var list = {
 			[ "ParametricGeometry", "api/extras/geometries/ParametricGeometry" ],
 			[ "PlaneGeometry", "api/extras/geometries/PlaneGeometry" ],
 			[ "PolyhedronGeometry", "api/extras/geometries/PolyhedronGeometry" ],
+			[ "RingGeometry", "api/extras/geometries/RingGeometry" ],
 			[ "ShapeGeometry", "api/extras/geometries/ShapeGeometry" ],
 			[ "SphereGeometry", "api/extras/geometries/SphereGeometry" ],
 			[ "TetrahedronGeometry", "api/extras/geometries/TetrahedronGeometry" ],

+ 11 - 1
editor/js/Editor.js

@@ -292,7 +292,17 @@ Editor.prototype = {
 	select: function ( object ) {
 
 		this.selected = object;
-		this.config.setKey( 'selected', object.uuid );
+
+		if ( object !== null ) {
+
+			this.config.setKey( 'selected', object.uuid );
+
+		} else {
+
+			this.config.setKey( 'selected', null );
+
+		}
+
 		this.signals.objectSelected.dispatch( object );
 
 	},

+ 26 - 27
editor/js/Menubar.File.js

@@ -69,37 +69,37 @@ Menubar.File = function ( editor ) {
 	option.setTextContent( 'Export Geometry' );
 	option.onClick( function () {
 
-		var geometry = editor.selected.geometry;
+		var object = editor.selected;
 
-		if ( geometry instanceof THREE.BufferGeometry ) {
+		if ( object === null ) {
 
-			exportGeometry( THREE.BufferGeometryExporter );
+			alert( 'No object selected.' );
+			return;
 
-		} else if ( geometry instanceof THREE.Geometry ) {
+		}
 
-			exportGeometry( THREE.GeometryExporter );
+		var geometry = object.geometry;
+
+		if ( geometry === undefined ) {
+
+			alert( 'The selected object doesn\'t have geometry.' );
+			return;
 
 		}
 
-	} );
-	options.add( option );
+		if ( geometry instanceof THREE.BufferGeometry ) {
 
-	/*
+			exportGeometry( THREE.BufferGeometryExporter );
 
-	// export scene
+		} else if ( geometry instanceof THREE.Geometry ) {
 
-	var option = new UI.Panel();
-	option.setClass( 'option' );
-	option.setTextContent( 'Export Scene' );
-	option.onClick( function () {
+			exportGeometry( THREE.GeometryExporter );
 
-		exportScene( THREE.SceneExporter );
+		}
 
 	} );
 	options.add( option );
 
-	*/
-
 	// export object
 
 	var option = new UI.Panel();
@@ -107,6 +107,13 @@ Menubar.File = function ( editor ) {
 	option.setTextContent( 'Export Object' );
 	option.onClick( function () {
 
+		if ( editor.selected === null ) {
+
+			alert( 'No object selected' );
+			return;
+
+		}
+
 		exportObject( THREE.ObjectExporter );
 
 	} );
@@ -139,19 +146,12 @@ Menubar.File = function ( editor ) {
 	var exportGeometry = function ( exporterClass ) {
 
 		var object = editor.selected;
-
-		if ( object.geometry === undefined ) {
-
-			alert( "Selected object doesn't have any geometry" );
-			return;
-
-		}
-
 		var exporter = new exporterClass();
 
 		var output;
 
-		if ( exporter instanceof THREE.BufferGeometryExporter || exporter instanceof THREE.GeometryExporter ) {
+		if ( exporter instanceof THREE.BufferGeometryExporter ||
+		     exporter instanceof THREE.GeometryExporter ) {
 
 			output = JSON.stringify( exporter.parse( object.geometry ), null, '\t' );
 			output = output.replace( /[\n\t]+([\d\.e\-\[\]]+)/g, '$1' );
@@ -172,9 +172,8 @@ Menubar.File = function ( editor ) {
 
 	var exportObject = function ( exporterClass ) {
 
-		var exporter = new exporterClass();
-
 		var object = editor.selected;
+		var exporter = new exporterClass();
 
 		var output = JSON.stringify( exporter.parse( object ), null, '\t' );
 		output = output.replace( /[\n\t]+([\d\.e\-\[\]]+)/g, '$1' );

+ 1 - 1
editor/js/Viewport.js

@@ -139,7 +139,7 @@ var Viewport = function ( editor ) {
 
 			} else {
 
-				editor.select( camera );
+				editor.select( null );
 
 			}
 

+ 8 - 16
examples/canvas_interactive_voxelpainter.html

@@ -24,11 +24,14 @@
 			var container, stats;
 			var camera, scene, renderer;
 			var projector, plane;
+
 			var mouse2D, mouse3D, raycaster, theta = 45,
 			isShiftDown = false, isCtrlDown = false,
 			target = new THREE.Vector3( 0, 200, 0 );
 			var normalMatrix = new THREE.Matrix3();
-			var ROLLOVERED;
+
+			var cubeGeometry = new THREE.CubeGeometry( 50, 50, 50 );
+			var cubeMaterial = new THREE.MeshLambertMaterial( { color: 0x00ff80, overdraw: 0.5 } );
 
 			init();
 			animate();
@@ -82,6 +85,8 @@
 				plane.visible = false;
 				scene.add( plane );
 
+				var material = new THREE.MeshBasicMaterial( { color: 0xff0000, wireframe: true } );
+
 				mouse2D = new THREE.Vector3( 0, 10000, 0.5 );
 
 				// Lights
@@ -144,10 +149,7 @@
 
 				if ( intersects.length > 0 ) {
 
-					if ( ROLLOVERED ) ROLLOVERED.color.setHex( 0x00ff80 );
-
-					ROLLOVERED = intersects[ 0 ].face;
-					ROLLOVERED.color.setHex( 0xff8000 )
+					// TODO
 
 				}
 
@@ -180,17 +182,7 @@
 
 						var position = new THREE.Vector3().addVectors( intersect.point, normal );
 
-						var geometry = new THREE.CubeGeometry( 50, 50, 50 );
-
-						for ( var i = 0; i < geometry.faces.length; i ++ ) {
-
-							geometry.faces[ i ].color.setHex( 0x00ff80 );
-
-						}
-
-						var material = new THREE.MeshLambertMaterial( { vertexColors: THREE.FaceColors } );
-
-						var voxel = new THREE.Mesh( geometry, material );
+						var voxel = new THREE.Mesh( cubeGeometry, cubeMaterial );
 						voxel.position.x = Math.floor( position.x / 50 ) * 50 + 25;
 						voxel.position.y = Math.floor( position.y / 50 ) * 50 + 25;
 						voxel.position.z = Math.floor( position.z / 50 ) * 50 + 25;

+ 161 - 0
examples/canvas_morphtargets_horse.html

@@ -0,0 +1,161 @@
+<!DOCTYPE html>
+<html lang="en">
+	<head>
+		<title>three.js canvas - morph targets - horse</title>
+		<meta charset="utf-8">
+		<meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
+		<style>
+			body {
+				font-family: Monospace;
+				background-color: #f0f0f0;
+				margin: 0px;
+				overflow: hidden;
+			}
+		</style>
+	</head>
+	<body>
+
+		<script src="../build/three.min.js"></script>
+
+		<script src="js/libs/stats.min.js"></script>
+
+		<script>
+
+			var container, stats;
+			var camera, scene, projector, renderer;
+			var mesh;
+
+			init();
+			animate();
+
+			function init() {
+
+				container = document.createElement( 'div' );
+				document.body.appendChild( container );
+
+				var info = document.createElement( 'div' );
+				info.style.position = 'absolute';
+				info.style.top = '10px';
+				info.style.width = '100%';
+				info.style.textAlign = 'center';
+				info.innerHTML = '<a href="http://threejs.org" target="_blank">three.js</a> canvas - morph targets - horse. model by <a href="http://mirada.com/">mirada</a> from <a href="http://ro.me">rome</a>';
+				container.appendChild( info );
+
+				//
+
+				camera = new THREE.PerspectiveCamera( 50, window.innerWidth / window.innerHeight, 1, 10000 );
+				camera.position.y = 300;
+				camera.target = new THREE.Vector3( 0, 150, 0 );
+
+				scene = new THREE.Scene();
+
+				//
+
+				var light = new THREE.DirectionalLight( 0xefefff, 2 );
+				light.position.set( 1, 1, 1 ).normalize();
+				scene.add( light );
+
+				var light = new THREE.DirectionalLight( 0xffefef, 2 );
+				light.position.set( -1, -1, -1 ).normalize();
+				scene.add( light );
+
+				var loader = new THREE.JSONLoader( true );
+				loader.load( "models/animated/horse.js", function( geometry ) {
+
+					mesh = new THREE.Mesh( geometry, new THREE.MeshLambertMaterial( { color: 0x606060, morphTargets: true, overdraw: 0.5 } ) );
+					mesh.scale.set( 1.5, 1.5, 1.5 );
+					scene.add( mesh );
+
+				} );
+
+				//
+
+				renderer = new THREE.CanvasRenderer();
+				renderer.setClearColor( 0xf0f0f0 );
+				renderer.setSize( window.innerWidth, window.innerHeight );
+
+				container.appendChild(renderer.domElement);
+
+				//
+
+				stats = new Stats();
+				stats.domElement.style.position = 'absolute';
+				stats.domElement.style.top = '0px';
+				container.appendChild( stats.domElement );
+
+				//
+
+				window.addEventListener( 'resize', onWindowResize, false );
+
+			}
+
+			function onWindowResize() {
+
+				camera.aspect = window.innerWidth / window.innerHeight;
+				camera.updateProjectionMatrix();
+
+				renderer.setSize( window.innerWidth, window.innerHeight );
+
+			}
+
+			//
+
+			function animate() {
+
+				requestAnimationFrame( animate );
+
+				render();
+				stats.update();
+
+			}
+
+			var radius = 600;
+			var theta = 0;
+
+			var duration = 1000;
+			var keyframes = 15, interpolation = duration / keyframes;
+			var lastKeyframe = 0, currentKeyframe = 0;
+
+			function render() {
+
+				theta += 0.1;
+
+				camera.position.x = radius * Math.sin( THREE.Math.degToRad( theta ) );
+				camera.position.z = radius * Math.cos( THREE.Math.degToRad( theta ) );
+
+				camera.lookAt( camera.target );
+
+				if ( mesh ) {
+
+					// Alternate morph targets
+
+					var time = Date.now() % duration;
+
+					var keyframe = Math.floor( time / interpolation );
+
+					if ( keyframe != currentKeyframe ) {
+
+						mesh.morphTargetInfluences[ lastKeyframe ] = 0;
+						mesh.morphTargetInfluences[ currentKeyframe ] = 1;
+						mesh.morphTargetInfluences[ keyframe ] = 0;
+
+						lastKeyframe = currentKeyframe;
+						currentKeyframe = keyframe;
+
+						// console.log( mesh.morphTargetInfluences );
+
+					}
+
+					mesh.morphTargetInfluences[ keyframe ] = ( time % interpolation ) / interpolation;
+					mesh.morphTargetInfluences[ lastKeyframe ] = 1 - mesh.morphTargetInfluences[ keyframe ];
+
+				}
+
+				renderer.render( scene, camera );
+
+			}
+
+		</script>
+
+	</body>
+</html>

+ 2 - 1
examples/index.html

@@ -199,7 +199,6 @@
 				"webgl_materials_lightmap",
 				"webgl_materials_normalmap",
 				"webgl_materials_normalmap2",
-				"webgl_materials_shaders",
 				"webgl_materials_shaders_fresnel",
 				"webgl_materials_skin",
 				"webgl_materials_texture_anisotropy",
@@ -282,6 +281,7 @@
 				"misc_lookat",
 				"misc_sound",
 				"misc_ubiquity_test",
+				"misc_ubiquity_test2",
 				"misc_uv_tests"
 			],
 			"canvas": [
@@ -313,6 +313,7 @@
 				"canvas_materials_normal",
 				"canvas_materials_reflection",
 				"canvas_materials_video",
+				"canvas_morphtargets_horse",
 				"canvas_particles_floor",
 				"canvas_particles_random",
 				"canvas_particles_shapes",

+ 1 - 0
examples/webgl_interactive_voxelpainter.html

@@ -273,6 +273,7 @@
 				if ( intersects.length > 0 ) {
 
 					intersector = getRealIntersector( intersects );
+
 					if ( intersector ) {
 
 						setVoxelPosition( intersector );

+ 6 - 7
examples/webgl_loader_json_objconverter.html

@@ -15,16 +15,16 @@
 			}
 			h1 { }
 			a { color:skyblue }
-			canvas { pointer-events:none; z-index:10; }
 
-			#d { text-align:center; margin:1em 0 -9.2em 0; z-index:0; position:relative; display:block }
+			#info { position:absolute; top:0px; width: 100%; text-align:center; }
 			.button { background:#000; color:#fff; padding:0.2em 0.5em; cursor:pointer }
 			.inactive { background:#999; color:#eee }
 		</style>
 	</head>
 
 	<body>
-		<div id="d">
+		<div id="container"></div>
+		<div id="info">
 			<h1>OBJ to Three.js converter test</h1>
 
 			<span id="rcanvas" class="button inactive">2d canvas renderer</span>
@@ -46,7 +46,7 @@
 			var SCREEN_HEIGHT = window.innerHeight;
 			var FLOOR = -250;
 
-			var container,stats;
+			var container, stats;
 
 			var camera, scene;
 			var canvasRenderer, webglRenderer;
@@ -75,8 +75,7 @@
 
 			function init() {
 
-				container = document.createElement( 'div' );
-				document.body.appendChild( container );
+				container = document.getElementById( 'container' );
 
 				camera = new THREE.PerspectiveCamera( 75, SCREEN_WIDTH / SCREEN_HEIGHT, 1, 100000 );
 				camera.position.z = 500;
@@ -136,7 +135,7 @@
 				var ambient = new THREE.AmbientLight( 0x221100 );
 				scene.add( ambient );
 
-				var directionalLight = new THREE.DirectionalLight( 0xffeedd );
+				var directionalLight = new THREE.DirectionalLight( 0xffeedd, 1.5 );
 				directionalLight.position.set( 0, -70, 100 ).normalize();
 				scene.add( directionalLight );
 

+ 1 - 2
examples/webgl_loader_vrml.html

@@ -94,7 +94,6 @@
 				// renderer
 
 				renderer = new THREE.WebGLRenderer( { antialias: false } );
-				renderer.setClearColor( 0x000000, 1 );
 				renderer.setSize( window.innerWidth, window.innerHeight );
 
 				container = document.createElement( 'div' );
@@ -137,4 +136,4 @@
 		</script>
 
 	</body>
-</html>
+</html>

+ 0 - 1
examples/webgl_loader_vtk.html

@@ -100,7 +100,6 @@
 				// renderer
 
 				renderer = new THREE.WebGLRenderer( { antialias: false } );
-				renderer.setClearColor( 0x000000, 1 );
 				renderer.setSize( window.innerWidth, window.innerHeight );
 
 				container = document.createElement( 'div' );

+ 0 - 286
examples/webgl_materials_shaders.html

@@ -1,286 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-	<head>
-		<title>three.js webgl - materials - shaders [Phong, Lambert]</title>
-		<meta charset="utf-8">
-		<meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
-		<style>
-			body {
-				background:#000;
-				color:#fff;
-				padding:0;
-				margin:0;
-				overflow:hidden;
-				font-family:georgia;
-				text-align:center;
-			}
-			h1 { }
-			a { color:skyblue }
-			canvas { pointer-events:none; z-index:10; }
-			#d { text-align:center; margin:1em 0 -19.7em 0; z-index:0; position:relative; display:block }
-			.button { background:orange; color:#fff; padding:0.2em 0.5em; cursor:pointer }
-			.inactive { background:#999; color:#eee }
-		</style>
-	</head>
-
-	<body>
-		<div id="d">
-			<h1>Blinn-Phong / Lambert materials</h1>
-
-			<span id="rcanvas" class="button inactive">2d canvas renderer</span>
-			<span id="rwebgl" class="button">WebGL renderer</span>
-			<br/>
-
-			<p><a href="http://threejs.org">Three.js</a> example
-
-			<br/>
-			<p>Best viewed in Chrome 9 or Firefox 4 using WebGL renderer.
-			<p>Canvas renderer is very slow on anything other than Chrome.
-			<p>Blinn-Phong shader only works in WebGL, canvas has only diffuse materials.
-		</div>
-
-		<script src="../build/three.min.js"></script>
-
-		<script src="js/Detector.js"></script>
-		<script src="js/libs/stats.min.js"></script>
-
-		<script>
-
-			var SCREEN_WIDTH = window.innerWidth;
-			var SCREEN_HEIGHT = window.innerHeight;
-			var FLOOR = -250;
-
-			var container, stats;
-
-			var camera, scene, canvasRenderer, webglRenderer;
-
-			var mesh, zmesh, lightMesh, geometry;
-
-			var directionalLight, pointLight;
-
-			var mouseX = 0, mouseY = 0;
-
-			var windowHalfX = window.innerWidth / 2;
-			var windowHalfY = window.innerHeight / 2;
-
-			var render_canvas = 0, render_gl = 1;
-			var has_gl = 0;
-
-			var bcanvas = document.getElementById( "rcanvas" );
-			var bwebgl = document.getElementById( "rwebgl" );
-
-			init();
-			animate();
-
-			render_canvas = !has_gl;
-			bwebgl.style.display = has_gl ? "inline" : "none";
-			bcanvas.className = render_canvas ? "button" : "button inactive";
-
-			function addMesh( geometry, scale, x, y, z, rx, ry, rz, material ) {
-
-				mesh = new THREE.Mesh( geometry, material );
-
-				mesh.scale.set( scale, scale, scale );
-				mesh.position.set( x, y, z );
-				mesh.rotation.set( rx, ry, rz );
-
-				scene.add( mesh );
-
-			}
-
-			function init() {
-
-				container = document.createElement( 'div' );
-				document.body.appendChild( container );
-
-				camera = new THREE.PerspectiveCamera( 75, SCREEN_WIDTH / SCREEN_HEIGHT, 1, 100000 );
-				camera.position.z = 1000;
-
-				scene = new THREE.Scene();
-
-				// LIGHTS
-
-				var ambient = new THREE.AmbientLight( 0x101010 );
-				scene.add( ambient );
-
-				directionalLight = new THREE.DirectionalLight( 0xffffff );
-				directionalLight.position.set( 1, 1, 2 ).normalize();
-				scene.add( directionalLight );
-
-				pointLight = new THREE.PointLight( 0xffffff );
-				scene.add( pointLight );
-
-				// light representation
-
-				sphere = new THREE.SphereGeometry( 100, 16, 8 );
-				lightMesh = new THREE.Mesh( sphere, new THREE.MeshBasicMaterial( { color: 0xffaa00 } ) );
-				lightMesh.scale.set( 0.05, 0.05, 0.05 );
-				lightMesh.position = pointLight.position;
-				scene.add( lightMesh );
-
-				// material samples
-
-				sphere = new THREE.SphereGeometry( 100, 32, 32 );
-
-				var y1 = 0, y2 = - 200;
-
-				addMesh( sphere, 1, -600, y1, 0, 0,0,0, new THREE.MeshPhongMaterial( { ambient: 0x050505, color: 0x000000, specular: 0x555555, shininess: 30 } ) );
-				addMesh( sphere, 1, -600, y2, 0, 0,0,0, new THREE.MeshLambertMaterial( { color: 0x050505 } ) );
-
-				addMesh( sphere, 1, -400, y1, 0, 0,0,0, new THREE.MeshPhongMaterial( { ambient: 0x000000, color: 0xffffff, specular: 0x555555, shininess: 30 } ) );
-				addMesh( sphere, 1, -400, y2, 0, 0,0,0, new THREE.MeshLambertMaterial( { color: 0xffffff } ) );
-
-				addMesh( sphere, 1, -200, y1, 0, 0,0,0, new THREE.MeshPhongMaterial( { ambient: 0x000000, color: 0xff5500, specular: 0x555555, shininess: 10 } ) );
-				addMesh( sphere, 1, -200, y2, 0, 0,0,0, new THREE.MeshLambertMaterial( { color: 0xff5500 } ) );
-
-				addMesh( sphere, 1,    0, y1, 0, 0,0,0, new THREE.MeshPhongMaterial( { ambient: 0x000000, color: 0xffaa00, specular: 0x555555, shininess: 30 } ) );
-				addMesh( sphere, 1,    0, y2, 0, 0,0,0, new THREE.MeshLambertMaterial( { color: 0xffaa00 } ) );
-
-				addMesh( sphere, 1,  200, y1, 0, 0,0,0, new THREE.MeshPhongMaterial( { ambient: 0x000000, color: 0x55ff00, specular: 0x555555, shininess: 30 } ) );
-				addMesh( sphere, 1,  200, y2, 0, 0,0,0, new THREE.MeshLambertMaterial( { color: 0x55ff00 } ) );
-
-				addMesh( sphere, 1,  400, y1, 0, 0,0,0, new THREE.MeshPhongMaterial( { ambient: 0x000000, color: 0x0055ff, specular: 0x555555, shininess: 30 } ) );
-				addMesh( sphere, 1,  400, y2, 0, 0,0,0, new THREE.MeshLambertMaterial( { color: 0x0055ff } ) );
-
-				addMesh( sphere, 1,  600, y1, 0, 0,0,0, new THREE.MeshPhongMaterial( { ambient: 0x000000, color: 0x5500ff, specular: 0x555555, shininess: 30 } ) );
-				addMesh( sphere, 1,  600, y2, 0, 0,0,0, new THREE.MeshLambertMaterial( { color: 0x5500ff } ) );
-
-				addToruses( new THREE.TorusGeometry( 100, 20, 32, 32 ) );
-
-				//
-
-				if ( render_gl ) {
-
-					try {
-
-						webglRenderer = new THREE.WebGLRenderer();
-						webglRenderer.setSize( SCREEN_WIDTH, SCREEN_HEIGHT );
-						webglRenderer.domElement.style.position = "relative";
-						container.appendChild( webglRenderer.domElement );
-						has_gl = 1;
-
-					} catch (e) {
-
-					}
-
-				}
-
-				canvasRenderer = new THREE.CanvasRenderer();
-				canvasRenderer.setSize( SCREEN_WIDTH, SCREEN_HEIGHT );
-				container.appendChild( canvasRenderer.domElement );
-
-				//
-
-				stats = new Stats();
-				stats.domElement.style.position = 'absolute';
-				stats.domElement.style.top = '0px';
-				stats.domElement.style.zIndex = 100;
-				container.appendChild( stats.domElement );
-
-				bcanvas.addEventListener("click", toggleCanvas, false);
-				bwebgl.addEventListener("click", toggleWebGL, false);
-
-				document.addEventListener('mousemove', onDocumentMouseMove, false);
-
-				//
-
-				window.addEventListener( 'resize', onWindowResize, false );
-
-			}
-
-			function onWindowResize() {
-
-				windowHalfX = window.innerWidth / 2;
-				windowHalfY = window.innerHeight / 2;
-
-				camera.aspect = window.innerWidth / window.innerHeight;
-				camera.updateProjectionMatrix();
-
-				if ( webglRenderer ) webglRenderer.setSize( window.innerWidth, window.innerHeight );
-				if ( canvasRenderer ) canvasRenderer.setSize( window.innerWidth, window.innerHeight );
-
-			}
-
-			function addToruses( geometry ) {
-
-				var s = 0.85, t = s + 100, y = 200, rx = 0;
-
-				addMesh( geometry, s, -6*t, y, 0, rx,0,0, new THREE.MeshPhongMaterial( { ambient: 0x000000, color: 0x000000, specular: 0x333333, shininess: 10 } ) );
-				addMesh( geometry, s, -4*t, y, 0, rx,0,0, new THREE.MeshPhongMaterial( { ambient: 0x030303, color: 0x888888, specular: 0x333333, shininess: 10 } ) );
-				addMesh( geometry, s, -2*t, y, 0, rx,0,0, new THREE.MeshPhongMaterial( { ambient: 0x030303, color: 0x030303, specular: 0xff5500, shininess: 10 } ) );
-				addMesh( geometry, s,    0, y, 0, rx,0,0, new THREE.MeshPhongMaterial( { ambient: 0x030303, color: 0x030303, specular: 0xffaa00, shininess: 10 } ) );
-				addMesh( geometry, s,  2*t, y, 0, rx,0,0, new THREE.MeshPhongMaterial( { ambient: 0x030303, color: 0x030303, specular: 0x55ff00, shininess: 10 } ) );
-				addMesh( geometry, s,  4*t, y, 0, rx,0,0, new THREE.MeshPhongMaterial( { ambient: 0x030303, color: 0x030303, specular: 0x0055ff, shininess: 10 } ) );
-				addMesh( geometry, s,  6*t, y, 0, rx,0,0, new THREE.MeshPhongMaterial( { ambient: 0x030303, color: 0x030303, specular: 0x5500ff, shininess: 10 } ) );
-
-			}
-
-
-			function onDocumentMouseMove(event) {
-
-				mouseX = ( event.clientX - windowHalfX );
-				mouseY = ( event.clientY - windowHalfY );
-
-			}
-
-			//
-
-			function animate() {
-
-				requestAnimationFrame( animate );
-
-				render();
-				stats.update();
-
-			}
-
-			function render() {
-
-				var timer = -0.0002 * Date.now();
-
-				camera.position.x += ( mouseX - camera.position.x ) * .05;
-				camera.position.y += ( - mouseY - camera.position.y ) * .05;
-
-				camera.lookAt( scene.position );
-
-				lightMesh.position.x = 700 * Math.cos( timer );
-				lightMesh.position.z = 700 * Math.sin( timer );
-
-				if ( render_canvas ) canvasRenderer.render( scene, camera );
-				if ( render_gl && has_gl ) webglRenderer.render( scene, camera );
-
-			}
-
-			function toggleCanvas() {
-
-				render_canvas = !render_canvas;
-				bcanvas.className = render_canvas ? "button" : "button inactive";
-
-				render_gl = !render_canvas;
-				bwebgl.className = render_gl ? "button" : "button inactive";
-
-				if( has_gl )
-					webglRenderer.domElement.style.display = render_gl ? "block" : "none";
-
-				canvasRenderer.domElement.style.display = render_canvas ? "block" : "none";
-
-			}
-
-			function toggleWebGL() {
-
-				render_gl = !render_gl;
-				bwebgl.className = render_gl ? "button" : "button inactive";
-
-				render_canvas = !render_gl;
-				bcanvas.className = render_canvas ? "button" : "button inactive";
-
-				if( has_gl )
-					webglRenderer.domElement.style.display = render_gl ? "block" : "none";
-
-				canvasRenderer.domElement.style.display = render_canvas ? "block" : "none";
-
-			}
-		</script>
-
-	</body>
-</html>

+ 0 - 3
examples/webgl_mirror.html

@@ -63,9 +63,6 @@
 				renderer = new THREE.WebGLRenderer();
 				renderer.setSize( WIDTH, HEIGHT );
 
-				renderer.autoClear = true;
-				renderer.setClearColor( 0x000000, 1 );
-
 				// scene
 				scene = new THREE.Scene();
 

+ 0 - 1
examples/webgl_particles_shapes.html

@@ -488,7 +488,6 @@
 
 				renderer = new THREE.WebGLRenderer();
 				renderer.setSize( window.innerWidth, window.innerHeight );
-				renderer.setClearColor( 0x000000, 1 );
 
 				container.appendChild( renderer.domElement );
 

+ 0 - 1
examples/webgl_sprites.html

@@ -96,7 +96,6 @@
 				// renderer
 
 				renderer = new THREE.WebGLRenderer();
-				renderer.setClearColor( 0x000000, 1 );
 				renderer.setSize( window.innerWidth, window.innerHeight );
 				renderer.autoClear = false; // To allow render overlay on top of sprited sphere
 				

+ 1 - 1
src/Three.js

@@ -4,7 +4,7 @@
  * @author bhouston / http://exocortex.com
  */
 
-var THREE = { REVISION: '65dev' };
+var THREE = { REVISION: '65' };
 
 self.console = self.console || {
 

+ 79 - 20
src/core/Projector.js

@@ -14,6 +14,10 @@ THREE.Projector = function () {
 
 	_renderData = { objects: [], sprites: [], lights: [], elements: [] },
 
+	_vA = new THREE.Vector3(),
+	_vB = new THREE.Vector3(),
+	_vC = new THREE.Vector3(),
+
 	_vector3 = new THREE.Vector3(),
 	_vector4 = new THREE.Vector4(),
 
@@ -101,6 +105,27 @@ THREE.Projector = function () {
 
 	};
 
+	var projectVertex = function ( vertex ) {
+
+		var position = vertex.position;
+		var positionWorld = vertex.positionWorld;
+		var positionScreen = vertex.positionScreen;
+
+		positionWorld.copy( position ).applyMatrix4( _modelMatrix );
+		positionScreen.copy( positionWorld ).applyMatrix4( _viewProjectionMatrix );
+
+		var invW = 1 / positionScreen.w;
+
+		positionScreen.x *= invW;
+		positionScreen.y *= invW;
+		positionScreen.z *= invW;
+
+		vertex.visible = positionScreen.x >= -1 && positionScreen.x <= 1 &&
+				 positionScreen.y >= -1 && positionScreen.y <= 1 &&
+				 positionScreen.z >= -1 && positionScreen.z <= 1;
+
+	};
+
 	var projectObject = function ( object ) {
 
 		if ( object.visible === false ) return;
@@ -152,8 +177,7 @@ THREE.Projector = function () {
 	this.projectScene = function ( scene, camera, sortObjects, sortElements ) {
 
 		var visible = false,
-		o, ol, v, vl, f, fl, n, nl, c, cl, u, ul, object,
-		geometry, vertices, faces, face, faceVertexNormals, faceVertexUvs, uvs,
+		object, geometry, vertices, faces, face, faceVertexNormals, faceVertexUvs, uvs,
 		v1, v2, v3, v4, isFaceMaterial, objectMaterials;
 
 		_face3Count = 0;
@@ -174,7 +198,7 @@ THREE.Projector = function () {
 
 		projectGraph( scene, sortObjects );
 
-		for ( o = 0, ol = _renderData.objects.length; o < ol; o ++ ) {
+		for ( var o = 0, ol = _renderData.objects.length; o < ol; o ++ ) {
 
 			object = _renderData.objects[ o ].object;
 
@@ -195,26 +219,16 @@ THREE.Projector = function () {
 				isFaceMaterial = object.material instanceof THREE.MeshFaceMaterial;
 				objectMaterials = isFaceMaterial === true ? object.material : null;
 
-				for ( v = 0, vl = vertices.length; v < vl; v ++ ) {
+				for ( var v = 0, vl = vertices.length; v < vl; v ++ ) {
 
 					_vertex = getNextVertexInPool();
+					_vertex.position.copy( vertices[ v ] );
 
-					_vertex.positionWorld.copy( vertices[ v ] ).applyMatrix4( _modelMatrix );
-					_vertex.positionScreen.copy( _vertex.positionWorld ).applyMatrix4( _viewProjectionMatrix );
-
-					var invW = 1 / _vertex.positionScreen.w;
-
-					_vertex.positionScreen.x *= invW;
-					_vertex.positionScreen.y *= invW;
-					_vertex.positionScreen.z *= invW;
-
-					_vertex.visible = ! ( _vertex.positionScreen.x < -1 || _vertex.positionScreen.x > 1 ||
-							      _vertex.positionScreen.y < -1 || _vertex.positionScreen.y > 1 ||
-							      _vertex.positionScreen.z < -1 || _vertex.positionScreen.z > 1 );
+					projectVertex( _vertex );
 
 				}
 
-				for ( f = 0, fl = faces.length; f < fl; f ++ ) {
+				for ( var f = 0, fl = faces.length; f < fl; f ++ ) {
 
 					face = faces[ f ];
 
@@ -230,6 +244,51 @@ THREE.Projector = function () {
 					v2 = _vertexPool[ face.b ];
 					v3 = _vertexPool[ face.c ];
 
+					if ( material.morphTargets === true ) {
+
+						var morphTargets = geometry.morphTargets;
+						var morphInfluences = object.morphTargetInfluences;
+
+						var v1p = v1.position;
+						var v2p = v2.position;
+						var v3p = v3.position;
+
+						_vA.set( 0, 0, 0 );
+						_vB.set( 0, 0, 0 );
+						_vC.set( 0, 0, 0 );
+
+						for ( var t = 0, tl = morphTargets.length; t < tl; t ++ ) {
+
+							var influence = morphInfluences[ t ];
+
+							if ( influence === 0 ) continue;
+
+							var targets = morphTargets[ t ].vertices;
+
+							_vA.x += ( targets[ face.a ].x - v1p.x ) * influence;
+							_vA.y += ( targets[ face.a ].y - v1p.y ) * influence;
+							_vA.z += ( targets[ face.a ].z - v1p.z ) * influence;
+
+							_vB.x += ( targets[ face.b ].x - v2p.x ) * influence;
+							_vB.y += ( targets[ face.b ].y - v2p.y ) * influence;
+							_vB.z += ( targets[ face.b ].z - v2p.z ) * influence;
+
+							_vC.x += ( targets[ face.c ].x - v3p.x ) * influence;
+							_vC.y += ( targets[ face.c ].y - v3p.y ) * influence;
+							_vC.z += ( targets[ face.c ].z - v3p.z ) * influence;
+
+						}
+
+						v1.position.add( _vA );
+						v2.position.add( _vB );
+						v3.position.add( _vC );
+
+						projectVertex( v1 );
+						projectVertex( v2 );
+						projectVertex( v3 );
+
+					}
+
 					_points3[ 0 ] = v1.positionScreen;
 					_points3[ 1 ] = v2.positionScreen;
 					_points3[ 2 ] = v3.positionScreen;
@@ -279,7 +338,7 @@ THREE.Projector = function () {
 
 					faceVertexNormals = face.vertexNormals;
 
-					for ( n = 0, nl = Math.min( faceVertexNormals.length, 3 ); n < nl; n ++ ) {
+					for ( var n = 0, nl = Math.min( faceVertexNormals.length, 3 ); n < nl; n ++ ) {
 
 						var normalModel = _face.vertexNormalsModel[ n ];
 						normalModel.copy( faceVertexNormals[ n ] );
@@ -299,13 +358,13 @@ THREE.Projector = function () {
 
 					_face.vertexNormalsLength = faceVertexNormals.length;
 
-					for ( c = 0, cl = Math.min( faceVertexUvs.length, 3 ); c < cl; c ++ ) {
+					for ( var c = 0, cl = Math.min( faceVertexUvs.length, 3 ); c < cl; c ++ ) {
 
 						uvs = faceVertexUvs[ c ][ f ];
 
 						if ( uvs === undefined ) continue;
 
-						for ( u = 0, ul = uvs.length; u < ul; u ++ ) {
+						for ( var u = 0, ul = uvs.length; u < ul; u ++ ) {
 
 							_face.uvs[ c ][ u ] = uvs[ u ];
 

+ 43 - 2
src/core/Raycaster.js

@@ -259,10 +259,51 @@
 					a = vertices[ face.a ];
 					b = vertices[ face.b ];
 					c = vertices[ face.c ];
-					
+
+					if ( material.morphTargets === true ) {
+
+						var morphTargets = geometry.morphTargets;
+						var morphInfluences = object.morphTargetInfluences;
+
+						vA.set( 0, 0, 0 );
+						vB.set( 0, 0, 0 );
+						vC.set( 0, 0, 0 );
+
+						for ( var t = 0, tl = morphTargets.length; t < tl; t ++ ) {
+
+							var influence = morphInfluences[ t ];
+
+							if ( influence === 0 ) continue;
+
+							var targets = morphTargets[ t ].vertices;
+
+							vA.x += ( targets[ face.a ].x - a.x ) * influence;
+							vA.y += ( targets[ face.a ].y - a.y ) * influence;
+							vA.z += ( targets[ face.a ].z - a.z ) * influence;
+
+							vB.x += ( targets[ face.b ].x - b.x ) * influence;
+							vB.y += ( targets[ face.b ].y - b.y ) * influence;
+							vB.z += ( targets[ face.b ].z - b.z ) * influence;
+
+							vC.x += ( targets[ face.c ].x - c.x ) * influence;
+							vC.y += ( targets[ face.c ].y - c.y ) * influence;
+							vC.z += ( targets[ face.c ].z - c.z ) * influence;
+
+						}
+
+						vA.add( a );
+						vB.add( b );
+						vC.add( c );
+
+						a = vA;
+						b = vB;
+						c = vC;
+
+					}
+
 					if ( material.side === THREE.BackSide ) {
 							
-						var intersectionPoint = localRay.intersectTriangle( c, b, a, true ); 
+						var intersectionPoint = localRay.intersectTriangle( c, b, a, true );
 
 					} else {
 								

+ 12 - 2
src/objects/LOD.js

@@ -95,8 +95,18 @@ THREE.LOD.prototype.update = function () {
 
 }();
 
-THREE.LOD.prototype.clone = function () {
+THREE.LOD.prototype.clone = function ( object ) {
 
-	// TODO
+	if ( object === undefined ) object = new THREE.LOD();
+
+	THREE.Object3D.prototype.clone.call( this, object );
+
+	for ( var i = 0, l = this.objects.length; i < l; i ++ ) {
+		var x = this.objects[i].object.clone();
+		x.visible = i === 0;
+		object.addLevel( x, this.objects[i].distance );
+	}
+
+	return object;
 
 };

+ 1 - 0
src/renderers/renderables/RenderableVertex.js

@@ -4,6 +4,7 @@
 
 THREE.RenderableVertex = function () {
 
+	this.position = new THREE.Vector3();
 	this.positionWorld = new THREE.Vector3();
 	this.positionScreen = new THREE.Vector4();
 

+ 1 - 1
test/unit/math/Color.js

@@ -4,7 +4,7 @@ test( "constructor", function(){
     var c = new THREE.Color();
     ok( c.r, "Red: " + c.r );
     ok( c.g, "Green: " + c.g );
-    ok( c.b, "Blue: " + c.g );
+    ok( c.b, "Blue: " + c.b );
 });
 
 test( "copyHex", function(){

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