Browse Source

Update color settings of MMD (#10083)

Takahiro 8 years ago
parent
commit
86748161b2
1 changed files with 20 additions and 12 deletions
  1. 20 12
      examples/js/loaders/MMDLoader.js

+ 20 - 12
examples/js/loaders/MMDLoader.js

@@ -581,7 +581,7 @@ THREE.MMDLoader.prototype.parsePmd = function ( buffer ) {
 			p.diffuse = dv.getFloat32Array( 4 );
 			p.shininess = dv.getFloat32();
 			p.specular = dv.getFloat32Array( 3 );
-			p.emissive = dv.getFloat32Array( 3 );
+			p.ambient = dv.getFloat32Array( 3 );
 			p.toonIndex = dv.getInt8();
 			p.edgeFlag = dv.getUint8();
 			p.faceCount = dv.getUint32() / 3;
@@ -1163,7 +1163,7 @@ THREE.MMDLoader.prototype.parsePmx = function ( buffer ) {
 			p.diffuse = dv.getFloat32Array( 4 );
 			p.specular = dv.getFloat32Array( 3 );
 			p.shininess = dv.getFloat32();
-			p.emissive = dv.getFloat32Array( 3 );
+			p.ambient = dv.getFloat32Array( 3 );
 			p.flag = dv.getUint8();
 			p.edgeColor = dv.getFloat32Array( 4 );
 			p.edgeSize = dv.getFloat32();
@@ -1379,7 +1379,7 @@ THREE.MMDLoader.prototype.parsePmx = function ( buffer ) {
 					m.diffuse = dv.getFloat32Array( 4 );
 					m.specular = dv.getFloat32Array( 3 );
 					m.shininess = dv.getFloat32();
-					m.emissive = dv.getFloat32Array( 3 );
+					m.ambient = dv.getFloat32Array( 3 );
 					m.edgeColor = dv.getFloat32Array( 4 );
 					m.edgeSize = dv.getFloat32();
 					m.textureColor = dv.getFloat32Array( 4 );
@@ -2198,7 +2198,6 @@ THREE.MMDLoader.prototype.createMesh = function ( model, texturePath, onProgress
 		var textures = [];
 		var textureLoader = new THREE.TextureLoader( this.manager );
 		var tgaLoader = new THREE.TGALoader( this.manager );
-		var color = new THREE.Color();
 		var offset = 0;
 		var materialParams = [];
 
@@ -2294,9 +2293,22 @@ THREE.MMDLoader.prototype.createMesh = function ( model, texturePath, onProgress
 			offset += m.faceCount;
 
 			params.name = m.name;
-			params.color = color.fromArray( [ m.diffuse[ 0 ], m.diffuse[ 1 ], m.diffuse[ 2 ] ] ).clone();
+
+			/*
+			 * Color
+			 *
+			 * MMD         MeshPhongMaterial
+			 * diffuse  -  color
+			 * specular -  specular
+			 * ambient  -  emissive * a
+			 *               (a = 1.0 without map texture or 0.2 with map texture)
+			 *
+			 * MeshPhongMaterial doesn't have ambient. Set it to emissive instead.
+			 * It'll be too bright if material has map texture so using coef 0.2.
+			 */
+			params.color = new THREE.Color( m.diffuse[ 0 ], m.diffuse[ 1 ], m.diffuse[ 2 ] );
 			params.opacity = m.diffuse[ 3 ];
-			params.specular = color.fromArray( [ m.specular[ 0 ], m.specular[ 1 ], m.specular[ 2 ] ] ).clone();
+			params.specular = new THREE.Color( m.specular[ 0 ], m.specular[ 1 ], m.specular[ 2 ] );
 			params.shininess = m.shininess;
 
 			if ( params.opacity === 1.0 ) {
@@ -2388,12 +2400,8 @@ THREE.MMDLoader.prototype.createMesh = function ( model, texturePath, onProgress
 
 			}
 
-			// TODO: check if this logic is right
-			if ( params.map === undefined /* && params.envMap === undefined */ ) {
-
-				params.emissive = color.fromArray( [ m.emissive[ 0 ], m.emissive[ 1 ], m.emissive[ 2 ] ] ).clone();
-
-			}
+			var coef = ( params.map === undefined ) ? 1.0 : 0.2;
+			params.emissive = new THREE.Color( m.ambient[ 0 ] * coef, m.ambient[ 1 ] * coef, m.ambient[ 2 ] * coef );
 
 			materialParams.push( params );