瀏覽代碼

Merge branch 'dev' of https://github.com/mrdoob/three.js into dev

Mr.doob 9 年之前
父節點
當前提交
5acb93c573

+ 1 - 1
LICENSE

@@ -1,6 +1,6 @@
 The MIT License
 
-Copyright © 2010-2015 three.js authors
+Copyright © 2010-2016 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

+ 3 - 3
examples/js/loaders/ColladaLoader.js

@@ -3020,9 +3020,9 @@ THREE.ColladaLoader = function () {
 
 				} else if ( vcount === 4 ) {
 
-					faces.push( new THREE.Face3( vs[0], vs[1], vs[3], [ ns[0].clone(), ns[1].clone(), ns[3].clone() ], cs.length ? [ cs[0], cs[1], cs[3] ] : new THREE.Color() ) );
+					faces.push( new THREE.Face3( vs[0], vs[1], vs[3], ns.length ? [ ns[0].clone(), ns[1].clone(), ns[3].clone() ] : [], cs.length ? [ cs[0], cs[1], cs[3] ] : new THREE.Color() ) );
 
-					faces.push( new THREE.Face3( vs[1], vs[2], vs[3], [ ns[1].clone(), ns[2].clone(), ns[3].clone() ], cs.length ? [ cs[1], cs[2], cs[3] ] : new THREE.Color() ) );
+					faces.push( new THREE.Face3( vs[1], vs[2], vs[3], ns.length ? [ ns[1].clone(), ns[2].clone(), ns[3].clone() ] : [], cs.length ? [ cs[1], cs[2], cs[3] ] : new THREE.Color() ) );
 
 				} else if ( vcount > 4 && options.subdivideFaces ) {
 
@@ -3033,7 +3033,7 @@ THREE.ColladaLoader = function () {
 
 					for ( k = 1; k < vcount - 1; ) {
 
-						faces.push( new THREE.Face3( vs[0], vs[k], vs[k + 1], [ ns[0].clone(), ns[k ++].clone(), ns[k].clone() ], clr ) );
+						faces.push( new THREE.Face3( vs[0], vs[k], vs[k + 1], ns.length ? [ ns[0].clone(), ns[k ++].clone(), ns[k].clone() ] : [], clr ) );
 
 					}
 

+ 35 - 18
examples/js/loaders/MMDLoader.js

@@ -2606,6 +2606,12 @@ THREE.MMDLoader.prototype.createAnimation = function ( mesh, vmd, name ) {
 
 	var initMotionAnimations = function () {
 
+		if ( vmd.metadata.motionCount === 0 ) {
+
+			return;
+
+		}
+
 		var bones = mesh.geometry.bones;
 		var orderedMotions = helper.createOrderedMotionArrays( bones, vmd.motions, 'boneName' );
 
@@ -2653,8 +2659,6 @@ THREE.MMDLoader.prototype.createAnimation = function ( mesh, vmd, name ) {
 
 		}
 
-		// add 2 secs as afterglow
-		maxTime += 2.0;
 		animation.length = maxTime;
 
 		for ( var i = 0; i < orderedMotions.length; i++ ) {
@@ -2666,8 +2670,6 @@ THREE.MMDLoader.prototype.createAnimation = function ( mesh, vmd, name ) {
 
 		}
 
-//		mesh.geometry.animation = animation;
-
 		if ( mesh.geometry.animations === undefined ) {
 
 			mesh.geometry.animations = [];
@@ -2680,6 +2682,12 @@ THREE.MMDLoader.prototype.createAnimation = function ( mesh, vmd, name ) {
 
 	var initMorphAnimations = function () {
 
+		if ( vmd.metadata.morphCount === 0 ) {
+
+			return;
+
+		}
+
 		var orderedMorphs = helper.createOrderedMotionArrays( mesh.geometry.morphTargets, vmd.morphs, 'morphName' );
 
 		var morphAnimation = {
@@ -2718,20 +2726,8 @@ THREE.MMDLoader.prototype.createAnimation = function ( mesh, vmd, name ) {
 
 		}
 
-		// add 2 secs as afterglow
-		maxTime += 2.0;
 		morphAnimation.length = maxTime;
 
-		for ( var i = 0; i < orderedMorphs.length; i++ ) {
-
-			var keys = morphAnimation.hierarchy[ i ].keys;
-			helper.insertAnimationKeyAtTimeZero( keys, 0.0 );
-			helper.insertStartAnimationKey( keys );
-
-		}
-
-//		geometry.morphAnimation = morphAnimation;
-
 		if ( mesh.geometry.morphAnimations === undefined ) {
 
 			mesh.geometry.morphAnimations = [];
@@ -2742,7 +2738,15 @@ THREE.MMDLoader.prototype.createAnimation = function ( mesh, vmd, name ) {
 
 		for ( var i = 0; i < orderedMorphs.length; i++ ) {
 
-			tracks.push( helper.generateTrackFromAnimationKeys( morphAnimation.hierarchy[ i ].keys, 'NumberKeyframeTrackEx', '.morphTargetInfluences[' + i + ']' ) );
+			var keys = morphAnimation.hierarchy[ i ].keys;
+
+			if ( keys.length === 0 ) {
+
+				continue;
+
+			}
+
+			tracks.push( helper.generateTrackFromAnimationKeys( keys, 'NumberKeyframeTrackEx', '.morphTargetInfluences[' + i + ']' ) );
 
 		}
 
@@ -4094,7 +4098,9 @@ THREE.MMDHelper.prototype = {
 	 * TODO: touching private properties ( ._actions and ._clip ) so consider better way
 	 *       to access them for safe and modularity.
 	 */
-	unifyAnimationDuration: function () {
+	unifyAnimationDuration: function ( params ) {
+
+		params = params === undefined ? {} : params;
 
 		var max = 0.0;
 
@@ -4141,6 +4147,12 @@ THREE.MMDHelper.prototype = {
 
 		}
 
+		if ( params.afterglow !== undefined ) {
+
+			max += params.afterglow;
+
+		}
+
 		// set the duration
 		for ( var i = 0; i < this.meshes.length; i++ ) {
 
@@ -4293,9 +4305,14 @@ THREE.MMDHelper.prototype = {
 
 	renderOutline: function ( scene, camera ) {
 
+		var tmpEnabled = this.renderer.shadowMap.enabled;
+		this.renderer.shadowMap.enabled = false;
+
 		this.setupOutlineRendering();
 		this.renderer.render( scene, camera );
 
+		this.renderer.shadowMap.enabled = tmpEnabled;
+
 	},
 
 	setupMainRendering: function () {

+ 1 - 1
examples/js/loaders/OBJLoader.js

@@ -337,7 +337,7 @@ THREE.OBJLoader.prototype = {
 
 			} else {
 
-				// console.log( "THREE.OBJLoader: Unhandled line " + line );
+				throw new Error("Unexpected line: " + line);
 
 			}
 

+ 85 - 5
examples/js/renderers/SoftwareRenderer.js

@@ -675,6 +675,8 @@ THREE.SoftwareRenderer = function ( parameters ) {
 		// https://gist.github.com/2486101
 		// explanation: http://pouet.net/topic.php?which=8760&page=1
 
+		var fixscale = ( 1 << subpixelBits );
+
 		// 28.4 fixed-point coordinates
 
 		var x1 = ( v1.x * viewportXScale + viewportXOffs ) | 0;
@@ -685,6 +687,88 @@ THREE.SoftwareRenderer = function ( parameters ) {
 		var y2 = ( v2.y * viewportYScale + viewportYOffs ) | 0;
 		var y3 = ( v3.y * viewportYScale + viewportYOffs ) | 0;
 
+		var bHasNormal = face.vertexNormalsModel && face.vertexNormalsModel.length;
+
+		var longestSide = Math.max(
+			Math.sqrt( (x1 - x2)*(x1 - x2) + (y1 - y2)*(y1 - y2) ),
+			Math.sqrt( (x2 - x3)*(x2 - x3) + (y2 - y3)*(y2 - y3) ),
+			Math.sqrt( (x3 - x1)*(x3 - x1) + (y3 - y1)*(y3 - y1) )
+		);
+		if( longestSide > 100 * fixscale ) {
+
+			// 1
+			// |\
+			// |a\
+			// |__\
+			// |\c|\
+			// |b\|d\
+			// |__\__\
+			// 2      3
+			var	mpV12 = new THREE.Vector4(),
+				mpV23 = new THREE.Vector4(),
+				mpV31 = new THREE.Vector4(),
+				mpN12 = new THREE.Vector3(),
+				mpN23 = new THREE.Vector3(),
+				mpN31 = new THREE.Vector3(),
+				mpUV12 = new THREE.Vector2(),
+				mpUV23 = new THREE.Vector2(),
+				mpUV31 = new THREE.Vector2(),
+				tempFace = { vertexNormalsModel : [] };
+
+			var weight;
+
+			weight = (1 + v2.z) * (v2.w / v1.w) / (1 + v1.z);
+			mpUV12.copy( uv1 ).multiplyScalar( weight ).add( uv2 ).multiplyScalar( 1 / (weight + 1) );
+			weight = (1 + v3.z) * (v3.w / v2.w) / (1 + v2.z);
+			mpUV23.copy( uv2 ).multiplyScalar( weight ).add( uv3 ).multiplyScalar( 1 / (weight + 1) );
+			weight = (1 + v1.z) * (v1.w / v3.w) / (1 + v3.z);
+			mpUV31.copy( uv3 ).multiplyScalar( weight ).add( uv1 ).multiplyScalar( 1 / (weight + 1) );
+
+			mpV12.copy( v1 ).add( v2 ).multiplyScalar( 0.5 );
+			mpV23.copy( v2 ).add( v3 ).multiplyScalar( 0.5 );
+			mpV31.copy( v3 ).add( v1 ).multiplyScalar( 0.5 );
+
+			if( bHasNormal ) {
+				mpN12.copy( face.vertexNormalsModel[ 0 ] ).add( face.vertexNormalsModel[ 1 ] ).normalize();
+				mpN23.copy( face.vertexNormalsModel[ 1 ] ).add( face.vertexNormalsModel[ 2 ] ).normalize();
+				mpN31.copy( face.vertexNormalsModel[ 2 ] ).add( face.vertexNormalsModel[ 0 ] ).normalize();
+			}
+
+			// a
+			if( bHasNormal ) {
+				tempFace.vertexNormalsModel[ 0 ] = face.vertexNormalsModel[ 0 ];
+				tempFace.vertexNormalsModel[ 1 ] = mpN12;
+				tempFace.vertexNormalsModel[ 2 ] = mpN31;
+			}
+			drawTriangle( v1, mpV12, mpV31, uv1, mpUV12, mpUV31, shader, tempFace, material );
+
+			// b
+			if( bHasNormal ) {
+				tempFace.vertexNormalsModel[ 0 ] = face.vertexNormalsModel[ 1 ];
+				tempFace.vertexNormalsModel[ 1 ] = mpN23;
+				tempFace.vertexNormalsModel[ 2 ] = mpN12;
+			}
+			drawTriangle( v2, mpV23, mpV12, uv2, mpUV23, mpUV12, shader, tempFace, material );
+
+			// c
+			if( bHasNormal ) {
+				tempFace.vertexNormalsModel[ 0 ] = mpN12;
+				tempFace.vertexNormalsModel[ 1 ] = mpN23;
+				tempFace.vertexNormalsModel[ 2 ] = mpN31;
+			}
+			drawTriangle( mpV12, mpV23, mpV31, mpUV12, mpUV23, mpUV31, shader, tempFace, material );
+
+			// d
+			if( bHasNormal ) {
+				tempFace.vertexNormalsModel[ 0 ] = face.vertexNormalsModel[ 2 ];
+				tempFace.vertexNormalsModel[ 1 ] = mpN31;
+				tempFace.vertexNormalsModel[ 2 ] = mpN23;
+			}
+			drawTriangle( v3, mpV31, mpV23, uv3, mpUV31, mpUV23, shader, tempFace, material );
+
+			return;
+		}
+
 		// Z values (.28 fixed-point)
 
 		var z1 = ( v1.z * viewportZScale + viewportZOffs ) | 0;
@@ -709,12 +793,9 @@ THREE.SoftwareRenderer = function ( parameters ) {
 		}
 
 		// Normal values
-		var bHasNormal = false;
 		var n1, n2, n3, nz1, nz2, nz3;
 
-		if ( face.vertexNormalsModel ) {
-
-			bHasNormal = true;
+		if ( bHasNormal ) {
 
 			n1 = face.vertexNormalsModel[ 0 ];
 			n2 = face.vertexNormalsModel[ 1 ];
@@ -786,7 +867,6 @@ THREE.SoftwareRenderer = function ( parameters ) {
 
 		// Z pixel steps
 
-		var fixscale = ( 1 << subpixelBits );
 		dzdx = ( dzdx * fixscale ) | 0;
 		dzdy = ( dzdy * fixscale ) | 0;
 

+ 1 - 1
examples/webgl_loader_mmd.html

@@ -129,7 +129,7 @@
 
 					}
 
-					helper.unifyAnimationDuration();
+					helper.unifyAnimationDuration( { afterglow: 2.0 } );
 
 					scene.add( mesh );
 

+ 0 - 1
src/animation/AnimationMixer.js

@@ -738,7 +738,6 @@ THREE.AnimationMixer._Action.prototype = {
 		switch ( loop ) {
 
 			case THREE.LoopOnce:
-			case THREE.LoopOnceClamp:
 
 				if ( loopCount === -1 ) {
 

+ 1 - 1
src/animation/tracks/ColorKeyframeTrack.js

@@ -10,7 +10,7 @@
 
 THREE.ColorKeyframeTrack = function ( name, times, values, interpolation ) {
 
-	THREE.KeyframeTrack.call( this, name, keys, interpolation );
+	THREE.KeyframeTrack.call( this, name, times, values, interpolation );
 
 };