|
@@ -114,6 +114,18 @@ class GLTFExporter {
|
|
|
|
|
|
} );
|
|
} );
|
|
|
|
|
|
|
|
+ this.register( function ( writer ) {
|
|
|
|
+
|
|
|
|
+ return new GLTFMaterialsSheenExtension( writer );
|
|
|
|
+
|
|
|
|
+ } );
|
|
|
|
+
|
|
|
|
+ this.register( function ( writer ) {
|
|
|
|
+
|
|
|
|
+ return new GLTFMaterialsEmissiveStrengthExtension( writer );
|
|
|
|
+
|
|
|
|
+ } );
|
|
|
|
+
|
|
}
|
|
}
|
|
|
|
|
|
register( callback ) {
|
|
register( callback ) {
|
|
@@ -1410,7 +1422,7 @@ class GLTFWriter {
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
- // pbrMetallicRoughness.baseColorTexture or pbrSpecularGlossiness diffuseTexture
|
|
|
|
|
|
+ // pbrMetallicRoughness.baseColorTexture
|
|
if ( material.map ) {
|
|
if ( material.map ) {
|
|
|
|
|
|
const baseColorMapDef = { index: this.processTexture( material.map ) };
|
|
const baseColorMapDef = { index: this.processTexture( material.map ) };
|
|
@@ -1421,21 +1433,12 @@ class GLTFWriter {
|
|
|
|
|
|
if ( material.emissive ) {
|
|
if ( material.emissive ) {
|
|
|
|
|
|
- // note: emissive components are limited to stay within the 0 - 1 range to accommodate glTF spec. see #21849 and #22000.
|
|
|
|
- const emissive = material.emissive.clone().multiplyScalar( material.emissiveIntensity );
|
|
|
|
|
|
+ const emissive = material.emissive;
|
|
const maxEmissiveComponent = Math.max( emissive.r, emissive.g, emissive.b );
|
|
const maxEmissiveComponent = Math.max( emissive.r, emissive.g, emissive.b );
|
|
|
|
|
|
- if ( maxEmissiveComponent > 1 ) {
|
|
|
|
-
|
|
|
|
- emissive.multiplyScalar( 1 / maxEmissiveComponent );
|
|
|
|
-
|
|
|
|
- console.warn( 'THREE.GLTFExporter: Some emissive components exceed 1; emissive has been limited' );
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
if ( maxEmissiveComponent > 0 ) {
|
|
if ( maxEmissiveComponent > 0 ) {
|
|
|
|
|
|
- materialDef.emissiveFactor = emissive.toArray();
|
|
|
|
|
|
+ materialDef.emissiveFactor = material.emissive.toArray();
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
@@ -2712,8 +2715,8 @@ class GLTFMaterialsSpecularExtension {
|
|
|
|
|
|
writeMaterial( material, materialDef ) {
|
|
writeMaterial( material, materialDef ) {
|
|
|
|
|
|
- if ( ! material.isMeshPhysicalMaterial || ( material.specularIntensity === 1.0 &&
|
|
|
|
- material.specularColor.equals( DEFAULT_SPECULAR_COLOR ) &&
|
|
|
|
|
|
+ if ( ! material.isMeshPhysicalMaterial || ( material.specularIntensity === 1.0 &&
|
|
|
|
+ material.specularColor.equals( DEFAULT_SPECULAR_COLOR ) &&
|
|
! material.specularIntensityMap && ! material.specularColorTexture ) ) return;
|
|
! material.specularIntensityMap && ! material.specularColorTexture ) ) return;
|
|
|
|
|
|
const writer = this.writer;
|
|
const writer = this.writer;
|
|
@@ -2749,6 +2752,91 @@ class GLTFMaterialsSpecularExtension {
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+/**
|
|
|
|
+ * Sheen Materials Extension
|
|
|
|
+ *
|
|
|
|
+ * Specification: https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_sheen
|
|
|
|
+ */
|
|
|
|
+class GLTFMaterialsSheenExtension {
|
|
|
|
+
|
|
|
|
+ constructor( writer ) {
|
|
|
|
+
|
|
|
|
+ this.writer = writer;
|
|
|
|
+ this.name = 'KHR_materials_sheen';
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ writeMaterial( material, materialDef ) {
|
|
|
|
+
|
|
|
|
+ if ( ! material.isMeshPhysicalMaterial || material.sheen == 0.0 ) return;
|
|
|
|
+
|
|
|
|
+ const writer = this.writer;
|
|
|
|
+ const extensionsUsed = writer.extensionsUsed;
|
|
|
|
+
|
|
|
|
+ const extensionDef = {};
|
|
|
|
+
|
|
|
|
+ if ( material.sheenRoughnessMap ) {
|
|
|
|
+
|
|
|
|
+ const sheenRoughnessMapDef = { index: writer.processTexture( material.sheenRoughnessMap ) };
|
|
|
|
+ writer.applyTextureTransform( sheenRoughnessMapDef, material.sheenRoughnessMap );
|
|
|
|
+ extensionDef.sheenRoughnessTexture = sheenRoughnessMapDef;
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if ( material.sheenColorMap ) {
|
|
|
|
+
|
|
|
|
+ const sheenColorMapDef = { index: writer.processTexture( material.sheenColorMap ) };
|
|
|
|
+ writer.applyTextureTransform( sheenColorMapDef, material.sheenColorMap );
|
|
|
|
+ extensionDef.sheenColorTexture = sheenColorMapDef;
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ extensionDef.sheenRoughnessFactor = material.sheenRoughness;
|
|
|
|
+ extensionDef.sheenColorFactor = material.sheenColor.toArray();
|
|
|
|
+
|
|
|
|
+ materialDef.extensions = materialDef.extensions || {};
|
|
|
|
+ materialDef.extensions[ this.name ] = extensionDef;
|
|
|
|
+
|
|
|
|
+ extensionsUsed[ this.name ] = true;
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+/**
|
|
|
|
+ * Materials Emissive Strength Extension
|
|
|
|
+ *
|
|
|
|
+ * Specification: https://github.com/KhronosGroup/glTF/blob/5768b3ce0ef32bc39cdf1bef10b948586635ead3/extensions/2.0/Khronos/KHR_materials_emissive_strength/README.md
|
|
|
|
+ */
|
|
|
|
+class GLTFMaterialsEmissiveStrengthExtension {
|
|
|
|
+
|
|
|
|
+ constructor( writer ) {
|
|
|
|
+
|
|
|
|
+ this.writer = writer;
|
|
|
|
+ this.name = 'KHR_materials_emissive_strength';
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ writeMaterial( material, materialDef ) {
|
|
|
|
+
|
|
|
|
+ if ( ! material.isMeshStandardMaterial || material.emissiveIntensity === 1.0 ) return;
|
|
|
|
+
|
|
|
|
+ const writer = this.writer;
|
|
|
|
+ const extensionsUsed = writer.extensionsUsed;
|
|
|
|
+
|
|
|
|
+ const extensionDef = {};
|
|
|
|
+
|
|
|
|
+ extensionDef.emissiveStrength = material.emissiveIntensity;
|
|
|
|
+
|
|
|
|
+ materialDef.extensions = materialDef.extensions || {};
|
|
|
|
+ materialDef.extensions[ this.name ] = extensionDef;
|
|
|
|
+
|
|
|
|
+ extensionsUsed[ this.name ] = true;
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+}
|
|
|
|
+
|
|
/**
|
|
/**
|
|
* Static utility functions
|
|
* Static utility functions
|
|
*/
|
|
*/
|