|
@@ -53,7 +53,6 @@ import {
|
|
|
SkinnedMesh,
|
|
|
Sphere,
|
|
|
SpotLight,
|
|
|
- TangentSpaceNormalMap,
|
|
|
Texture,
|
|
|
TextureLoader,
|
|
|
TriangleFanDrawMode,
|
|
@@ -369,10 +368,6 @@ class GLTFLoader extends Loader {
|
|
|
extensions[ extensionName ] = new GLTFMaterialsUnlitExtension();
|
|
|
break;
|
|
|
|
|
|
- case EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS:
|
|
|
- extensions[ extensionName ] = new GLTFMaterialsPbrSpecularGlossinessExtension();
|
|
|
- break;
|
|
|
-
|
|
|
case EXTENSIONS.KHR_DRACO_MESH_COMPRESSION:
|
|
|
extensions[ extensionName ] = new GLTFDracoMeshCompressionExtension( json, this.dracoLoader );
|
|
|
break;
|
|
@@ -465,7 +460,6 @@ const EXTENSIONS = {
|
|
|
KHR_LIGHTS_PUNCTUAL: 'KHR_lights_punctual',
|
|
|
KHR_MATERIALS_CLEARCOAT: 'KHR_materials_clearcoat',
|
|
|
KHR_MATERIALS_IOR: 'KHR_materials_ior',
|
|
|
- KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS: 'KHR_materials_pbrSpecularGlossiness',
|
|
|
KHR_MATERIALS_SHEEN: 'KHR_materials_sheen',
|
|
|
KHR_MATERIALS_SPECULAR: 'KHR_materials_specular',
|
|
|
KHR_MATERIALS_TRANSMISSION: 'KHR_materials_transmission',
|
|
@@ -1768,335 +1762,6 @@ class GLTFTextureTransformExtension {
|
|
|
|
|
|
}
|
|
|
|
|
|
-/**
|
|
|
- * Specular-Glossiness Extension
|
|
|
- *
|
|
|
- * Specification: https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Archived/KHR_materials_pbrSpecularGlossiness
|
|
|
- */
|
|
|
-
|
|
|
-/**
|
|
|
- * A sub class of StandardMaterial with some of the functionality
|
|
|
- * changed via the `onBeforeCompile` callback
|
|
|
- * @pailhead
|
|
|
- */
|
|
|
-class GLTFMeshStandardSGMaterial extends MeshStandardMaterial {
|
|
|
-
|
|
|
- constructor( params ) {
|
|
|
-
|
|
|
- super();
|
|
|
-
|
|
|
- this.isGLTFSpecularGlossinessMaterial = true;
|
|
|
-
|
|
|
- //various chunks that need replacing
|
|
|
- const specularMapParsFragmentChunk = [
|
|
|
- '#ifdef USE_SPECULARMAP',
|
|
|
- ' uniform sampler2D specularMap;',
|
|
|
- '#endif'
|
|
|
- ].join( '\n' );
|
|
|
-
|
|
|
- const glossinessMapParsFragmentChunk = [
|
|
|
- '#ifdef USE_GLOSSINESSMAP',
|
|
|
- ' uniform sampler2D glossinessMap;',
|
|
|
- '#endif'
|
|
|
- ].join( '\n' );
|
|
|
-
|
|
|
- const specularMapFragmentChunk = [
|
|
|
- 'vec3 specularFactor = specular;',
|
|
|
- '#ifdef USE_SPECULARMAP',
|
|
|
- ' vec4 texelSpecular = texture2D( specularMap, vUv );',
|
|
|
- ' // reads channel RGB, compatible with a glTF Specular-Glossiness (RGBA) texture',
|
|
|
- ' specularFactor *= texelSpecular.rgb;',
|
|
|
- '#endif'
|
|
|
- ].join( '\n' );
|
|
|
-
|
|
|
- const 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' );
|
|
|
-
|
|
|
- const lightPhysicalFragmentChunk = [
|
|
|
- 'PhysicalMaterial material;',
|
|
|
- 'material.diffuseColor = diffuseColor.rgb * ( 1. - max( specularFactor.r, max( specularFactor.g, specularFactor.b ) ) );',
|
|
|
- 'vec3 dxy = max( abs( dFdx( geometryNormal ) ), abs( dFdy( geometryNormal ) ) );',
|
|
|
- 'float geometryRoughness = max( max( dxy.x, dxy.y ), dxy.z );',
|
|
|
- 'material.roughness = max( 1.0 - glossinessFactor, 0.0525 ); // 0.0525 corresponds to the base mip of a 256 cubemap.',
|
|
|
- 'material.roughness += geometryRoughness;',
|
|
|
- 'material.roughness = min( material.roughness, 1.0 );',
|
|
|
- 'material.specularColor = specularFactor;',
|
|
|
- ].join( '\n' );
|
|
|
-
|
|
|
- const uniforms = {
|
|
|
- specular: { value: new Color().setHex( 0xffffff ) },
|
|
|
- glossiness: { value: 1 },
|
|
|
- specularMap: { value: null },
|
|
|
- glossinessMap: { value: null }
|
|
|
- };
|
|
|
-
|
|
|
- this._extraUniforms = uniforms;
|
|
|
-
|
|
|
- this.onBeforeCompile = function ( shader ) {
|
|
|
-
|
|
|
- for ( const uniformName in uniforms ) {
|
|
|
-
|
|
|
- shader.uniforms[ uniformName ] = uniforms[ uniformName ];
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- shader.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 );
|
|
|
-
|
|
|
- };
|
|
|
-
|
|
|
- Object.defineProperties( this, {
|
|
|
-
|
|
|
- specular: {
|
|
|
- get: function () {
|
|
|
-
|
|
|
- return uniforms.specular.value;
|
|
|
-
|
|
|
- },
|
|
|
- set: function ( v ) {
|
|
|
-
|
|
|
- uniforms.specular.value = v;
|
|
|
-
|
|
|
- }
|
|
|
- },
|
|
|
-
|
|
|
- specularMap: {
|
|
|
- get: function () {
|
|
|
-
|
|
|
- return uniforms.specularMap.value;
|
|
|
-
|
|
|
- },
|
|
|
- set: function ( v ) {
|
|
|
-
|
|
|
- uniforms.specularMap.value = v;
|
|
|
-
|
|
|
- if ( v ) {
|
|
|
-
|
|
|
- this.defines.USE_SPECULARMAP = ''; // USE_UV is set by the renderer for specular maps
|
|
|
-
|
|
|
- } else {
|
|
|
-
|
|
|
- delete this.defines.USE_SPECULARMAP;
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
- },
|
|
|
-
|
|
|
- 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;
|
|
|
-
|
|
|
- if ( v ) {
|
|
|
-
|
|
|
- this.defines.USE_GLOSSINESSMAP = '';
|
|
|
- this.defines.USE_UV = '';
|
|
|
-
|
|
|
- } else {
|
|
|
-
|
|
|
- delete this.defines.USE_GLOSSINESSMAP;
|
|
|
- delete this.defines.USE_UV;
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- } );
|
|
|
-
|
|
|
- delete this.metalness;
|
|
|
- delete this.roughness;
|
|
|
- delete this.metalnessMap;
|
|
|
- delete this.roughnessMap;
|
|
|
-
|
|
|
- this.setValues( params );
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- copy( source ) {
|
|
|
-
|
|
|
- super.copy( source );
|
|
|
-
|
|
|
- this.specularMap = source.specularMap;
|
|
|
- this.specular.copy( source.specular );
|
|
|
- this.glossinessMap = source.glossinessMap;
|
|
|
- this.glossiness = source.glossiness;
|
|
|
- delete this.metalness;
|
|
|
- delete this.roughness;
|
|
|
- delete this.metalnessMap;
|
|
|
- delete this.roughnessMap;
|
|
|
- return this;
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
-}
|
|
|
-
|
|
|
-
|
|
|
-class GLTFMaterialsPbrSpecularGlossinessExtension {
|
|
|
-
|
|
|
- constructor() {
|
|
|
-
|
|
|
- this.name = EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS;
|
|
|
-
|
|
|
- this.specularGlossinessParams = [
|
|
|
- 'color',
|
|
|
- 'map',
|
|
|
- 'lightMap',
|
|
|
- 'lightMapIntensity',
|
|
|
- 'aoMap',
|
|
|
- 'aoMapIntensity',
|
|
|
- 'emissive',
|
|
|
- 'emissiveIntensity',
|
|
|
- 'emissiveMap',
|
|
|
- 'bumpMap',
|
|
|
- 'bumpScale',
|
|
|
- 'normalMap',
|
|
|
- 'normalMapType',
|
|
|
- 'displacementMap',
|
|
|
- 'displacementScale',
|
|
|
- 'displacementBias',
|
|
|
- 'specularMap',
|
|
|
- 'specular',
|
|
|
- 'glossinessMap',
|
|
|
- 'glossiness',
|
|
|
- 'alphaMap',
|
|
|
- 'envMap',
|
|
|
- 'envMapIntensity'
|
|
|
- ];
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- getMaterialType() {
|
|
|
-
|
|
|
- return GLTFMeshStandardSGMaterial;
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- extendParams( materialParams, materialDef, parser ) {
|
|
|
-
|
|
|
- const pbrSpecularGlossiness = materialDef.extensions[ this.name ];
|
|
|
-
|
|
|
- materialParams.color = new Color( 1.0, 1.0, 1.0 );
|
|
|
- materialParams.opacity = 1.0;
|
|
|
-
|
|
|
- const pending = [];
|
|
|
-
|
|
|
- if ( Array.isArray( pbrSpecularGlossiness.diffuseFactor ) ) {
|
|
|
-
|
|
|
- const array = pbrSpecularGlossiness.diffuseFactor;
|
|
|
-
|
|
|
- materialParams.color.fromArray( array );
|
|
|
- materialParams.opacity = array[ 3 ];
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- if ( pbrSpecularGlossiness.diffuseTexture !== undefined ) {
|
|
|
-
|
|
|
- pending.push( parser.assignTexture( materialParams, 'map', pbrSpecularGlossiness.diffuseTexture, sRGBEncoding ) );
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- materialParams.emissive = new Color( 0.0, 0.0, 0.0 );
|
|
|
- materialParams.glossiness = pbrSpecularGlossiness.glossinessFactor !== undefined ? pbrSpecularGlossiness.glossinessFactor : 1.0;
|
|
|
- materialParams.specular = new Color( 1.0, 1.0, 1.0 );
|
|
|
-
|
|
|
- if ( Array.isArray( pbrSpecularGlossiness.specularFactor ) ) {
|
|
|
-
|
|
|
- materialParams.specular.fromArray( pbrSpecularGlossiness.specularFactor );
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- if ( pbrSpecularGlossiness.specularGlossinessTexture !== undefined ) {
|
|
|
-
|
|
|
- const specGlossMapDef = pbrSpecularGlossiness.specularGlossinessTexture;
|
|
|
- pending.push( parser.assignTexture( materialParams, 'glossinessMap', specGlossMapDef ) );
|
|
|
- pending.push( parser.assignTexture( materialParams, 'specularMap', specGlossMapDef, sRGBEncoding ) );
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- return Promise.all( pending );
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- createMaterial( materialParams ) {
|
|
|
-
|
|
|
- const material = new GLTFMeshStandardSGMaterial( materialParams );
|
|
|
- material.fog = true;
|
|
|
-
|
|
|
- material.color = materialParams.color;
|
|
|
-
|
|
|
- material.map = materialParams.map === undefined ? null : materialParams.map;
|
|
|
-
|
|
|
- material.lightMap = null;
|
|
|
- material.lightMapIntensity = 1.0;
|
|
|
-
|
|
|
- material.aoMap = materialParams.aoMap === undefined ? null : materialParams.aoMap;
|
|
|
- material.aoMapIntensity = 1.0;
|
|
|
-
|
|
|
- material.emissive = materialParams.emissive;
|
|
|
- material.emissiveIntensity = materialParams.emissiveIntensity === undefined ? 1.0 : materialParams.emissiveIntensity;
|
|
|
- material.emissiveMap = materialParams.emissiveMap === undefined ? null : materialParams.emissiveMap;
|
|
|
-
|
|
|
- material.bumpMap = materialParams.bumpMap === undefined ? null : materialParams.bumpMap;
|
|
|
- material.bumpScale = 1;
|
|
|
-
|
|
|
- material.normalMap = materialParams.normalMap === undefined ? null : materialParams.normalMap;
|
|
|
- material.normalMapType = TangentSpaceNormalMap;
|
|
|
-
|
|
|
- if ( materialParams.normalScale ) material.normalScale = materialParams.normalScale;
|
|
|
-
|
|
|
- material.displacementMap = null;
|
|
|
- material.displacementScale = 1;
|
|
|
- material.displacementBias = 0;
|
|
|
-
|
|
|
- material.specularMap = materialParams.specularMap === undefined ? null : materialParams.specularMap;
|
|
|
- material.specular = materialParams.specular;
|
|
|
-
|
|
|
- material.glossinessMap = materialParams.glossinessMap === undefined ? null : materialParams.glossinessMap;
|
|
|
- material.glossiness = materialParams.glossiness;
|
|
|
-
|
|
|
- material.alphaMap = null;
|
|
|
-
|
|
|
- material.envMap = materialParams.envMap === undefined ? null : materialParams.envMap;
|
|
|
- material.envMapIntensity = 1.0;
|
|
|
-
|
|
|
- return material;
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
-}
|
|
|
-
|
|
|
/**
|
|
|
* Mesh Quantization Extension
|
|
|
*
|
|
@@ -3438,7 +3103,6 @@ class GLTFParser {
|
|
|
|
|
|
let cacheKey = 'ClonedMaterial:' + material.uuid + ':';
|
|
|
|
|
|
- if ( material.isGLTFSpecularGlossinessMaterial ) cacheKey += 'specular-glossiness:';
|
|
|
if ( useDerivativeTangents ) cacheKey += 'derivative-tangents:';
|
|
|
if ( useVertexColors ) cacheKey += 'vertex-colors:';
|
|
|
if ( useFlatShading ) cacheKey += 'flat-shading:';
|
|
@@ -3506,13 +3170,7 @@ class GLTFParser {
|
|
|
|
|
|
const pending = [];
|
|
|
|
|
|
- if ( materialExtensions[ EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS ] ) {
|
|
|
-
|
|
|
- const sgExtension = extensions[ EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS ];
|
|
|
- materialType = sgExtension.getMaterialType();
|
|
|
- pending.push( sgExtension.extendParams( materialParams, materialDef, parser ) );
|
|
|
-
|
|
|
- } else if ( materialExtensions[ EXTENSIONS.KHR_MATERIALS_UNLIT ] ) {
|
|
|
+ if ( materialExtensions[ EXTENSIONS.KHR_MATERIALS_UNLIT ] ) {
|
|
|
|
|
|
const kmuExtension = extensions[ EXTENSIONS.KHR_MATERIALS_UNLIT ];
|
|
|
materialType = kmuExtension.getMaterialType();
|
|
@@ -3636,17 +3294,7 @@ class GLTFParser {
|
|
|
|
|
|
return Promise.all( pending ).then( function () {
|
|
|
|
|
|
- let material;
|
|
|
-
|
|
|
- if ( materialType === GLTFMeshStandardSGMaterial ) {
|
|
|
-
|
|
|
- material = extensions[ EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS ].createMaterial( materialParams );
|
|
|
-
|
|
|
- } else {
|
|
|
-
|
|
|
- material = new materialType( materialParams );
|
|
|
-
|
|
|
- }
|
|
|
+ const material = new materialType( materialParams );
|
|
|
|
|
|
if ( materialDef.name ) material.name = materialDef.name;
|
|
|
|