|
@@ -99,6 +99,18 @@ class GLTFLoader extends Loader {
|
|
|
|
|
|
} );
|
|
} );
|
|
|
|
|
|
|
|
+ this.register( function ( parser ) {
|
|
|
|
+
|
|
|
|
+ return new GLTFMaterialsVolumeExtension( parser );
|
|
|
|
+
|
|
|
|
+ } );
|
|
|
|
+
|
|
|
|
+ this.register( function ( parser ) {
|
|
|
|
+
|
|
|
|
+ return new GLTFMaterialsIorExtension( parser );
|
|
|
|
+
|
|
|
|
+ } );
|
|
|
|
+
|
|
this.register( function ( parser ) {
|
|
this.register( function ( parser ) {
|
|
|
|
|
|
return new GLTFLightsExtension( parser );
|
|
return new GLTFLightsExtension( parser );
|
|
@@ -407,9 +419,11 @@ const EXTENSIONS = {
|
|
KHR_DRACO_MESH_COMPRESSION: 'KHR_draco_mesh_compression',
|
|
KHR_DRACO_MESH_COMPRESSION: 'KHR_draco_mesh_compression',
|
|
KHR_LIGHTS_PUNCTUAL: 'KHR_lights_punctual',
|
|
KHR_LIGHTS_PUNCTUAL: 'KHR_lights_punctual',
|
|
KHR_MATERIALS_CLEARCOAT: 'KHR_materials_clearcoat',
|
|
KHR_MATERIALS_CLEARCOAT: 'KHR_materials_clearcoat',
|
|
|
|
+ KHR_MATERIALS_IOR: 'KHR_materials_ior',
|
|
KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS: 'KHR_materials_pbrSpecularGlossiness',
|
|
KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS: 'KHR_materials_pbrSpecularGlossiness',
|
|
KHR_MATERIALS_TRANSMISSION: 'KHR_materials_transmission',
|
|
KHR_MATERIALS_TRANSMISSION: 'KHR_materials_transmission',
|
|
KHR_MATERIALS_UNLIT: 'KHR_materials_unlit',
|
|
KHR_MATERIALS_UNLIT: 'KHR_materials_unlit',
|
|
|
|
+ KHR_MATERIALS_VOLUME: 'KHR_materials_volume',
|
|
KHR_TEXTURE_BASISU: 'KHR_texture_basisu',
|
|
KHR_TEXTURE_BASISU: 'KHR_texture_basisu',
|
|
KHR_TEXTURE_TRANSFORM: 'KHR_texture_transform',
|
|
KHR_TEXTURE_TRANSFORM: 'KHR_texture_transform',
|
|
KHR_MESH_QUANTIZATION: 'KHR_mesh_quantization',
|
|
KHR_MESH_QUANTIZATION: 'KHR_mesh_quantization',
|
|
@@ -742,6 +756,111 @@ class GLTFMaterialsTransmissionExtension {
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+/**
|
|
|
|
+ * Materials Volume Extension
|
|
|
|
+ *
|
|
|
|
+ * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_volume
|
|
|
|
+ */
|
|
|
|
+class GLTFMaterialsVolumeExtension {
|
|
|
|
+
|
|
|
|
+ constructor( parser ) {
|
|
|
|
+
|
|
|
|
+ this.parser = parser;
|
|
|
|
+ this.name = EXTENSIONS.KHR_MATERIALS_VOLUME;
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ getMaterialType( materialIndex ) {
|
|
|
|
+
|
|
|
|
+ const parser = this.parser;
|
|
|
|
+ const materialDef = parser.json.materials[ materialIndex ];
|
|
|
|
+
|
|
|
|
+ if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;
|
|
|
|
+
|
|
|
|
+ return MeshPhysicalMaterial;
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ extendMaterialParams( materialIndex, materialParams ) {
|
|
|
|
+
|
|
|
|
+ const parser = this.parser;
|
|
|
|
+ const materialDef = parser.json.materials[ materialIndex ];
|
|
|
|
+
|
|
|
|
+ if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {
|
|
|
|
+
|
|
|
|
+ return Promise.resolve();
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ const pending = [];
|
|
|
|
+
|
|
|
|
+ const extension = materialDef.extensions[ this.name ];
|
|
|
|
+
|
|
|
|
+ materialParams.thickness = extension.thicknessFactor !== undefined ? extension.thicknessFactor : 0;
|
|
|
|
+
|
|
|
|
+ if ( extension.thicknessTexture !== undefined ) {
|
|
|
|
+
|
|
|
|
+ pending.push( parser.assignTexture( materialParams, 'thicknessMap', extension.thicknessTexture ) );
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ materialParams.attenuationDistance = extension.attenuationDistance || 0;
|
|
|
|
+
|
|
|
|
+ const colorArray = extension.attenuationColor || [ 1, 1, 1 ];
|
|
|
|
+ materialParams.attenuationColor = new Color( colorArray[ 0 ], colorArray[ 1 ], colorArray[ 2 ] );
|
|
|
|
+
|
|
|
|
+ return Promise.all( pending );
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+/**
|
|
|
|
+ * Materials ior Extension
|
|
|
|
+ *
|
|
|
|
+ * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_ior
|
|
|
|
+ */
|
|
|
|
+class GLTFMaterialsIorExtension {
|
|
|
|
+
|
|
|
|
+ constructor( parser ) {
|
|
|
|
+
|
|
|
|
+ this.parser = parser;
|
|
|
|
+ this.name = EXTENSIONS.KHR_MATERIALS_IOR;
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ getMaterialType( materialIndex ) {
|
|
|
|
+
|
|
|
|
+ const parser = this.parser;
|
|
|
|
+ const materialDef = parser.json.materials[ materialIndex ];
|
|
|
|
+
|
|
|
|
+ if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;
|
|
|
|
+
|
|
|
|
+ return MeshPhysicalMaterial;
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ extendMaterialParams( materialIndex, materialParams ) {
|
|
|
|
+
|
|
|
|
+ const parser = this.parser;
|
|
|
|
+ const materialDef = parser.json.materials[ materialIndex ];
|
|
|
|
+
|
|
|
|
+ if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {
|
|
|
|
+
|
|
|
|
+ return Promise.resolve();
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ const extension = materialDef.extensions[ this.name ];
|
|
|
|
+
|
|
|
|
+ materialParams.ior = extension.ior !== undefined ? extension.ior : 1.5;
|
|
|
|
+
|
|
|
|
+ return Promise.resolve();
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+}
|
|
|
|
+
|
|
/**
|
|
/**
|
|
* BasisU Texture Extension
|
|
* BasisU Texture Extension
|
|
*
|
|
*
|