|
@@ -623,6 +623,172 @@ THREE.GLTFLoader = ( function () {
|
|
*
|
|
*
|
|
* Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_pbrSpecularGlossiness
|
|
* Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_pbrSpecularGlossiness
|
|
*/
|
|
*/
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * A sub class of THREE.StandardMaterial with some of the functionality
|
|
|
|
+ * changed via the `onBeforeCompile` callback
|
|
|
|
+ * @pailhead
|
|
|
|
+ */
|
|
|
|
+
|
|
|
|
+ function SpecularGlossinessPbrMaterial( params ) {
|
|
|
|
+
|
|
|
|
+ THREE.MeshStandardMaterial.call( this );
|
|
|
|
+
|
|
|
|
+ this.isGLTFSpecularGlossinessMaterial = true;
|
|
|
|
+
|
|
|
|
+ //various chunks that need replacing
|
|
|
|
+ var specularMapParsFragmentChunk = [
|
|
|
|
+ '#ifdef USE_SPECULARMAP',
|
|
|
|
+ ' uniform sampler2D specularMap;',
|
|
|
|
+ '#endif'
|
|
|
|
+ ].join( '\n' );
|
|
|
|
+
|
|
|
|
+ var glossinessMapParsFragmentChunk = [
|
|
|
|
+ '#ifdef USE_GLOSSINESSMAP',
|
|
|
|
+ ' uniform sampler2D glossinessMap;',
|
|
|
|
+ '#endif'
|
|
|
|
+ ].join( '\n' );
|
|
|
|
+
|
|
|
|
+ var specularMapFragmentChunk = [
|
|
|
|
+ 'vec3 specularFactor = specular;',
|
|
|
|
+ '#ifdef USE_SPECULARMAP',
|
|
|
|
+ ' vec4 texelSpecular = texture2D( specularMap, vUv );',
|
|
|
|
+ ' texelSpecular = sRGBToLinear( texelSpecular );',
|
|
|
|
+ ' // reads channel RGB, compatible with a glTF Specular-Glossiness (RGBA) texture',
|
|
|
|
+ ' specularFactor *= texelSpecular.rgb;',
|
|
|
|
+ '#endif'
|
|
|
|
+ ].join( '\n' );
|
|
|
|
+
|
|
|
|
+ var glossinessMapFragmentChunk = [
|
|
|
|
+ 'float glossinessFactor = glossiness;',
|
|
|
|
+ '#ifdef USE_GLOSSINESSMAP',
|
|
|
|
+ ' vec4 texelGlossiness = texture2D( glossinessMap, vUv );',
|
|
|
|
+ ' // reads channel A, compatible with a glTF Specular-Glossiness (RGBA) texture',
|
|
|
|
+ ' glossinessFactor *= texelGlossiness.a;',
|
|
|
|
+ // 'gl_FragColor = vec4(vec3(glossinessFactor),1.);\nreturn;\n',
|
|
|
|
+ '#endif'
|
|
|
|
+ ].join( '\n' );
|
|
|
|
+
|
|
|
|
+ var lightPhysicalFragmentChunk = [
|
|
|
|
+ 'PhysicalMaterial material;',
|
|
|
|
+ 'material.diffuseColor = diffuseColor.rgb;',
|
|
|
|
+ 'material.specularRoughness = clamp( 1.0 - glossinessFactor, 0.04, 1.0 );',
|
|
|
|
+ 'material.specularColor = specularFactor.rgb;',
|
|
|
|
+ ].join( '\n' );
|
|
|
|
+
|
|
|
|
+ var uniforms = {
|
|
|
|
+ specular: { value: new THREE.Color().setHex( 0x111111 ) },
|
|
|
|
+ glossiness: { value: 0.5 },
|
|
|
|
+ specularMap: { value: null },
|
|
|
|
+ glossinessMap: { value: null }
|
|
|
|
+ };
|
|
|
|
+
|
|
|
|
+ this._extraUniforms = uniforms;
|
|
|
|
+
|
|
|
|
+ // please see #14031 or #13198 for an alternate approach
|
|
|
|
+ this.onBeforeCompile = function ( shader ) {
|
|
|
|
+
|
|
|
|
+ for ( var uniformName in uniforms ) {
|
|
|
|
+
|
|
|
|
+ shader.uniforms[ uniformName ] = uniforms[ uniformName ];
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ shader.fragmentShader = shader.fragmentShader.replace( 'uniform float roughness;', 'uniform vec3 specular;' );
|
|
|
|
+ shader.fragmentShader = shader.fragmentShader.replace( 'uniform float metalness;', 'uniform float glossiness;' );
|
|
|
|
+ shader.fragmentShader = shader.fragmentShader.replace( '#include <roughnessmap_pars_fragment>', specularMapParsFragmentChunk );
|
|
|
|
+ shader.fragmentShader = shader.fragmentShader.replace( '#include <metalnessmap_pars_fragment>', glossinessMapParsFragmentChunk );
|
|
|
|
+ shader.fragmentShader = shader.fragmentShader.replace( '#include <roughnessmap_fragment>', specularMapFragmentChunk );
|
|
|
|
+ shader.fragmentShader = shader.fragmentShader.replace( '#include <metalnessmap_fragment>', glossinessMapFragmentChunk );
|
|
|
|
+ shader.fragmentShader = shader.fragmentShader.replace( '#include <lights_physical_fragment>', lightPhysicalFragmentChunk );
|
|
|
|
+
|
|
|
|
+ };
|
|
|
|
+
|
|
|
|
+ Object.defineProperties(
|
|
|
|
+ this,
|
|
|
|
+ {
|
|
|
|
+ specularMap: {
|
|
|
|
+ get: function () {
|
|
|
|
+
|
|
|
|
+ return uniforms.specularMap.value;
|
|
|
|
+
|
|
|
|
+ },
|
|
|
|
+ set: function ( v ) {
|
|
|
|
+
|
|
|
|
+ uniforms.specularMap.value = v;
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+ },
|
|
|
|
+ specular: {
|
|
|
|
+ get: function () {
|
|
|
|
+
|
|
|
|
+ return uniforms.specular.value;
|
|
|
|
+
|
|
|
|
+ },
|
|
|
|
+ set: function ( v ) {
|
|
|
|
+
|
|
|
|
+ uniforms.specular.value = v;
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+ },
|
|
|
|
+ glossiness: {
|
|
|
|
+ get: function () {
|
|
|
|
+
|
|
|
|
+ return uniforms.glossiness.value;
|
|
|
|
+
|
|
|
|
+ },
|
|
|
|
+ set: function ( v ) {
|
|
|
|
+
|
|
|
|
+ uniforms.glossiness.value = v;
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+ },
|
|
|
|
+ glossinessMap: {
|
|
|
|
+ get: function () {
|
|
|
|
+
|
|
|
|
+ return uniforms.glossinessMap.value;
|
|
|
|
+
|
|
|
|
+ },
|
|
|
|
+ set: function ( v ) {
|
|
|
|
+
|
|
|
|
+ uniforms.glossinessMap.value = v;
|
|
|
|
+ //how about something like this - @pailhead
|
|
|
|
+ if ( v ) {
|
|
|
|
+
|
|
|
|
+ this.defines.USE_GLOSSINESSMAP = '';
|
|
|
|
+ // set USE_ROUGHNESSMAP to enable vUv
|
|
|
|
+ this.defines.USE_ROUGHNESSMAP = '';
|
|
|
|
+
|
|
|
|
+ } else {
|
|
|
|
+
|
|
|
|
+ delete this.defines.USE_ROUGHNESSMAP;
|
|
|
|
+ delete this.defines.USE_GLOSSINESSMAP;
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ );
|
|
|
|
+
|
|
|
|
+ this.setValues( params );
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ SpecularGlossinessPbrMaterial.prototype = Object.create( THREE.MeshStandardMaterial.prototype );
|
|
|
|
+ SpecularGlossinessPbrMaterial.prototype.constructor = SpecularGlossinessPbrMaterial;
|
|
|
|
+
|
|
|
|
+ SpecularGlossinessPbrMaterial.prototype.copy = function ( source ) {
|
|
|
|
+
|
|
|
|
+ THREE.MeshStandardMaterial.prototype.copy.call( this, source );
|
|
|
|
+ this.specularMap = source.specularMap;
|
|
|
|
+ this.specular = source.specular;
|
|
|
|
+ this.glossinessMap = source.glossinessMap;
|
|
|
|
+ this.glossiness = source.glossiness;
|
|
|
|
+ return this;
|
|
|
|
+
|
|
|
|
+ };
|
|
|
|
+
|
|
function GLTFMaterialsPbrSpecularGlossinessExtension() {
|
|
function GLTFMaterialsPbrSpecularGlossinessExtension() {
|
|
|
|
|
|
return {
|
|
return {
|
|
@@ -657,7 +823,7 @@ THREE.GLTFLoader = ( function () {
|
|
|
|
|
|
getMaterialType: function () {
|
|
getMaterialType: function () {
|
|
|
|
|
|
- return THREE.ShaderMaterial;
|
|
|
|
|
|
+ return SpecularGlossinessPbrMaterial;
|
|
|
|
|
|
},
|
|
},
|
|
|
|
|
|
@@ -665,72 +831,6 @@ THREE.GLTFLoader = ( function () {
|
|
|
|
|
|
var pbrSpecularGlossiness = material.extensions[ this.name ];
|
|
var pbrSpecularGlossiness = material.extensions[ this.name ];
|
|
|
|
|
|
- var shader = THREE.ShaderLib[ 'standard' ];
|
|
|
|
-
|
|
|
|
- var uniforms = THREE.UniformsUtils.clone( shader.uniforms );
|
|
|
|
-
|
|
|
|
- var specularMapParsFragmentChunk = [
|
|
|
|
- '#ifdef USE_SPECULARMAP',
|
|
|
|
- ' uniform sampler2D specularMap;',
|
|
|
|
- '#endif'
|
|
|
|
- ].join( '\n' );
|
|
|
|
-
|
|
|
|
- var glossinessMapParsFragmentChunk = [
|
|
|
|
- '#ifdef USE_GLOSSINESSMAP',
|
|
|
|
- ' uniform sampler2D glossinessMap;',
|
|
|
|
- '#endif'
|
|
|
|
- ].join( '\n' );
|
|
|
|
-
|
|
|
|
- var specularMapFragmentChunk = [
|
|
|
|
- 'vec3 specularFactor = specular;',
|
|
|
|
- '#ifdef USE_SPECULARMAP',
|
|
|
|
- ' vec4 texelSpecular = texture2D( specularMap, vUv );',
|
|
|
|
- ' texelSpecular = sRGBToLinear( texelSpecular );',
|
|
|
|
- ' // reads channel RGB, compatible with a glTF Specular-Glossiness (RGBA) texture',
|
|
|
|
- ' specularFactor *= texelSpecular.rgb;',
|
|
|
|
- '#endif'
|
|
|
|
- ].join( '\n' );
|
|
|
|
-
|
|
|
|
- var glossinessMapFragmentChunk = [
|
|
|
|
- 'float glossinessFactor = glossiness;',
|
|
|
|
- '#ifdef USE_GLOSSINESSMAP',
|
|
|
|
- ' vec4 texelGlossiness = texture2D( glossinessMap, vUv );',
|
|
|
|
- ' // reads channel A, compatible with a glTF Specular-Glossiness (RGBA) texture',
|
|
|
|
- ' glossinessFactor *= texelGlossiness.a;',
|
|
|
|
- '#endif'
|
|
|
|
- ].join( '\n' );
|
|
|
|
-
|
|
|
|
- var lightPhysicalFragmentChunk = [
|
|
|
|
- 'PhysicalMaterial material;',
|
|
|
|
- 'material.diffuseColor = diffuseColor.rgb;',
|
|
|
|
- 'material.specularRoughness = clamp( 1.0 - glossinessFactor, 0.04, 1.0 );',
|
|
|
|
- 'material.specularColor = specularFactor.rgb;',
|
|
|
|
- ].join( '\n' );
|
|
|
|
-
|
|
|
|
- var fragmentShader = shader.fragmentShader
|
|
|
|
- .replace( 'uniform float roughness;', 'uniform vec3 specular;' )
|
|
|
|
- .replace( 'uniform float metalness;', 'uniform float glossiness;' )
|
|
|
|
- .replace( '#include <roughnessmap_pars_fragment>', specularMapParsFragmentChunk )
|
|
|
|
- .replace( '#include <metalnessmap_pars_fragment>', glossinessMapParsFragmentChunk )
|
|
|
|
- .replace( '#include <roughnessmap_fragment>', specularMapFragmentChunk )
|
|
|
|
- .replace( '#include <metalnessmap_fragment>', glossinessMapFragmentChunk )
|
|
|
|
- .replace( '#include <lights_physical_fragment>', lightPhysicalFragmentChunk );
|
|
|
|
-
|
|
|
|
- delete uniforms.roughness;
|
|
|
|
- delete uniforms.metalness;
|
|
|
|
- delete uniforms.roughnessMap;
|
|
|
|
- delete uniforms.metalnessMap;
|
|
|
|
-
|
|
|
|
- uniforms.specular = { value: new THREE.Color().setHex( 0x111111 ) };
|
|
|
|
- uniforms.glossiness = { value: 0.5 };
|
|
|
|
- uniforms.specularMap = { value: null };
|
|
|
|
- uniforms.glossinessMap = { value: null };
|
|
|
|
-
|
|
|
|
- params.vertexShader = shader.vertexShader;
|
|
|
|
- params.fragmentShader = fragmentShader;
|
|
|
|
- params.uniforms = uniforms;
|
|
|
|
- params.defines = { 'STANDARD': '' };
|
|
|
|
-
|
|
|
|
params.color = new THREE.Color( 1.0, 1.0, 1.0 );
|
|
params.color = new THREE.Color( 1.0, 1.0, 1.0 );
|
|
params.opacity = 1.0;
|
|
params.opacity = 1.0;
|
|
|
|
|
|
@@ -775,20 +875,8 @@ THREE.GLTFLoader = ( function () {
|
|
|
|
|
|
createMaterial: function ( params ) {
|
|
createMaterial: function ( params ) {
|
|
|
|
|
|
- // setup material properties based on MeshStandardMaterial for Specular-Glossiness
|
|
|
|
-
|
|
|
|
- var material = new THREE.ShaderMaterial( {
|
|
|
|
- defines: params.defines,
|
|
|
|
- vertexShader: params.vertexShader,
|
|
|
|
- fragmentShader: params.fragmentShader,
|
|
|
|
- uniforms: params.uniforms,
|
|
|
|
- fog: true,
|
|
|
|
- lights: true,
|
|
|
|
- opacity: params.opacity,
|
|
|
|
- transparent: params.transparent
|
|
|
|
- } );
|
|
|
|
-
|
|
|
|
- material.isGLTFSpecularGlossinessMaterial = true;
|
|
|
|
|
|
+ var material = new SpecularGlossinessPbrMaterial( params );
|
|
|
|
+ material.fog = true;
|
|
|
|
|
|
material.color = params.color;
|
|
material.color = params.color;
|
|
|
|
|
|
@@ -827,8 +915,6 @@ THREE.GLTFLoader = ( function () {
|
|
|
|
|
|
material.refractionRatio = 0.98;
|
|
material.refractionRatio = 0.98;
|
|
|
|
|
|
- material.extensions.derivatives = true;
|
|
|
|
-
|
|
|
|
return material;
|
|
return material;
|
|
|
|
|
|
},
|
|
},
|
|
@@ -863,144 +949,6 @@ THREE.GLTFLoader = ( function () {
|
|
|
|
|
|
},
|
|
},
|
|
|
|
|
|
- // Here's based on refreshUniformsCommon() and refreshUniformsStandard() in WebGLRenderer.
|
|
|
|
- refreshUniforms: function ( renderer, scene, camera, geometry, material, group ) {
|
|
|
|
-
|
|
|
|
- if ( material.isGLTFSpecularGlossinessMaterial !== true ) {
|
|
|
|
-
|
|
|
|
- return;
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- var uniforms = material.uniforms;
|
|
|
|
- var defines = material.defines;
|
|
|
|
-
|
|
|
|
- uniforms.opacity.value = material.opacity;
|
|
|
|
-
|
|
|
|
- uniforms.diffuse.value.copy( material.color );
|
|
|
|
- uniforms.emissive.value.copy( material.emissive ).multiplyScalar( material.emissiveIntensity );
|
|
|
|
-
|
|
|
|
- uniforms.map.value = material.map;
|
|
|
|
- uniforms.specularMap.value = material.specularMap;
|
|
|
|
- uniforms.alphaMap.value = material.alphaMap;
|
|
|
|
-
|
|
|
|
- uniforms.lightMap.value = material.lightMap;
|
|
|
|
- uniforms.lightMapIntensity.value = material.lightMapIntensity;
|
|
|
|
-
|
|
|
|
- uniforms.aoMap.value = material.aoMap;
|
|
|
|
- uniforms.aoMapIntensity.value = material.aoMapIntensity;
|
|
|
|
-
|
|
|
|
- // uv repeat and offset setting priorities
|
|
|
|
- // 1. color map
|
|
|
|
- // 2. specular map
|
|
|
|
- // 3. normal map
|
|
|
|
- // 4. bump map
|
|
|
|
- // 5. alpha map
|
|
|
|
- // 6. emissive map
|
|
|
|
-
|
|
|
|
- var uvScaleMap;
|
|
|
|
-
|
|
|
|
- if ( material.map ) {
|
|
|
|
-
|
|
|
|
- uvScaleMap = material.map;
|
|
|
|
-
|
|
|
|
- } else if ( material.specularMap ) {
|
|
|
|
-
|
|
|
|
- uvScaleMap = material.specularMap;
|
|
|
|
-
|
|
|
|
- } else if ( material.displacementMap ) {
|
|
|
|
-
|
|
|
|
- uvScaleMap = material.displacementMap;
|
|
|
|
-
|
|
|
|
- } else if ( material.normalMap ) {
|
|
|
|
-
|
|
|
|
- uvScaleMap = material.normalMap;
|
|
|
|
-
|
|
|
|
- } else if ( material.bumpMap ) {
|
|
|
|
-
|
|
|
|
- uvScaleMap = material.bumpMap;
|
|
|
|
-
|
|
|
|
- } else if ( material.glossinessMap ) {
|
|
|
|
-
|
|
|
|
- uvScaleMap = material.glossinessMap;
|
|
|
|
-
|
|
|
|
- } else if ( material.alphaMap ) {
|
|
|
|
-
|
|
|
|
- uvScaleMap = material.alphaMap;
|
|
|
|
-
|
|
|
|
- } else if ( material.emissiveMap ) {
|
|
|
|
-
|
|
|
|
- uvScaleMap = material.emissiveMap;
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- if ( uvScaleMap !== undefined ) {
|
|
|
|
-
|
|
|
|
- // backwards compatibility
|
|
|
|
- if ( uvScaleMap.isWebGLRenderTarget ) {
|
|
|
|
-
|
|
|
|
- uvScaleMap = uvScaleMap.texture;
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- if ( uvScaleMap.matrixAutoUpdate === true ) {
|
|
|
|
-
|
|
|
|
- uvScaleMap.updateMatrix();
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- uniforms.uvTransform.value.copy( uvScaleMap.matrix );
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- if ( material.envMap ) {
|
|
|
|
-
|
|
|
|
- uniforms.envMap.value = material.envMap;
|
|
|
|
- uniforms.envMapIntensity.value = material.envMapIntensity;
|
|
|
|
-
|
|
|
|
- // don't flip CubeTexture envMaps, flip everything else:
|
|
|
|
- // WebGLRenderTargetCube will be flipped for backwards compatibility
|
|
|
|
- // WebGLRenderTargetCube.texture will be flipped because it's a Texture and NOT a CubeTexture
|
|
|
|
- // this check must be handled differently, or removed entirely, if WebGLRenderTargetCube uses a CubeTexture in the future
|
|
|
|
- uniforms.flipEnvMap.value = material.envMap.isCubeTexture ? - 1 : 1;
|
|
|
|
-
|
|
|
|
- uniforms.reflectivity.value = material.reflectivity;
|
|
|
|
- uniforms.refractionRatio.value = material.refractionRatio;
|
|
|
|
-
|
|
|
|
- uniforms.maxMipLevel.value = renderer.properties.get( material.envMap ).__maxMipLevel;
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- uniforms.specular.value.copy( material.specular );
|
|
|
|
- uniforms.glossiness.value = material.glossiness;
|
|
|
|
-
|
|
|
|
- uniforms.glossinessMap.value = material.glossinessMap;
|
|
|
|
-
|
|
|
|
- uniforms.emissiveMap.value = material.emissiveMap;
|
|
|
|
- uniforms.bumpMap.value = material.bumpMap;
|
|
|
|
- uniforms.normalMap.value = material.normalMap;
|
|
|
|
-
|
|
|
|
- uniforms.displacementMap.value = material.displacementMap;
|
|
|
|
- uniforms.displacementScale.value = material.displacementScale;
|
|
|
|
- uniforms.displacementBias.value = material.displacementBias;
|
|
|
|
-
|
|
|
|
- if ( uniforms.glossinessMap.value !== null && defines.USE_GLOSSINESSMAP === undefined ) {
|
|
|
|
-
|
|
|
|
- defines.USE_GLOSSINESSMAP = '';
|
|
|
|
- // set USE_ROUGHNESSMAP to enable vUv
|
|
|
|
- defines.USE_ROUGHNESSMAP = '';
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- if ( uniforms.glossinessMap.value === null && defines.USE_GLOSSINESSMAP !== undefined ) {
|
|
|
|
-
|
|
|
|
- delete defines.USE_GLOSSINESSMAP;
|
|
|
|
- delete defines.USE_ROUGHNESSMAP;
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
};
|
|
};
|
|
|
|
|
|
}
|
|
}
|
|
@@ -2385,7 +2333,7 @@ THREE.GLTFLoader = ( function () {
|
|
|
|
|
|
var material;
|
|
var material;
|
|
|
|
|
|
- if ( materialType === THREE.ShaderMaterial ) {
|
|
|
|
|
|
+ if ( materialType === SpecularGlossinessPbrMaterial ) {
|
|
|
|
|
|
material = extensions[ EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS ].createMaterial( materialParams );
|
|
material = extensions[ EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS ].createMaterial( materialParams );
|
|
|
|
|
|
@@ -2405,10 +2353,9 @@ THREE.GLTFLoader = ( function () {
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
- // baseColorTexture, emissiveTexture, and specularGlossinessTexture use sRGB encoding.
|
|
|
|
|
|
+ // emissiveTexture and baseColorTexture use sRGB encoding.
|
|
if ( material.map ) material.map.encoding = THREE.sRGBEncoding;
|
|
if ( material.map ) material.map.encoding = THREE.sRGBEncoding;
|
|
if ( material.emissiveMap ) material.emissiveMap.encoding = THREE.sRGBEncoding;
|
|
if ( material.emissiveMap ) material.emissiveMap.encoding = THREE.sRGBEncoding;
|
|
- if ( material.specularMap ) material.specularMap.encoding = THREE.sRGBEncoding;
|
|
|
|
|
|
|
|
assignExtrasToUserData( material, materialDef );
|
|
assignExtrasToUserData( material, materialDef );
|
|
|
|
|
|
@@ -2829,9 +2776,7 @@ THREE.GLTFLoader = ( function () {
|
|
|
|
|
|
if ( ! cachedMaterial ) {
|
|
if ( ! cachedMaterial ) {
|
|
|
|
|
|
- cachedMaterial = material.isGLTFSpecularGlossinessMaterial
|
|
|
|
- ? extensions[ EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS ].cloneMaterial( material )
|
|
|
|
- : material.clone();
|
|
|
|
|
|
+ cachedMaterial = material.clone();
|
|
|
|
|
|
if ( useSkinning ) cachedMaterial.skinning = true;
|
|
if ( useSkinning ) cachedMaterial.skinning = true;
|
|
if ( useVertexColors ) cachedMaterial.vertexColors = THREE.VertexColors;
|
|
if ( useVertexColors ) cachedMaterial.vertexColors = THREE.VertexColors;
|
|
@@ -2858,13 +2803,6 @@ THREE.GLTFLoader = ( function () {
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
- if ( material.isGLTFSpecularGlossinessMaterial ) {
|
|
|
|
-
|
|
|
|
- // for GLTFSpecularGlossinessMaterial(ShaderMaterial) uniforms runtime update
|
|
|
|
- mesh.onBeforeRender = extensions[ EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS ].refreshUniforms;
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
}
|
|
}
|
|
|
|
|
|
mesh.material = isMultiMaterial ? materials : materials[ 0 ];
|
|
mesh.material = isMultiMaterial ? materials : materials[ 0 ];
|
|
@@ -3154,20 +3092,6 @@ THREE.GLTFLoader = ( function () {
|
|
node = mesh.clone();
|
|
node = mesh.clone();
|
|
node.name += '_instance_' + instanceNum;
|
|
node.name += '_instance_' + instanceNum;
|
|
|
|
|
|
- // onBeforeRender copy for Specular-Glossiness
|
|
|
|
- node.onBeforeRender = mesh.onBeforeRender;
|
|
|
|
-
|
|
|
|
- for ( var i = 0, il = node.children.length; i < il; i ++ ) {
|
|
|
|
-
|
|
|
|
- node.children[ i ].name += '_instance_' + instanceNum;
|
|
|
|
- node.children[ i ].onBeforeRender = mesh.children[ i ].onBeforeRender;
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- } else {
|
|
|
|
-
|
|
|
|
- node = mesh;
|
|
|
|
-
|
|
|
|
}
|
|
}
|
|
|
|
|
|
// if weights are provided on the node, override weights on the mesh.
|
|
// if weights are provided on the node, override weights on the mesh.
|