|
@@ -46,6 +46,18 @@ class GLTFExporter {
|
|
|
|
|
|
} );
|
|
|
|
|
|
+ this.register( function ( writer ) {
|
|
|
+
|
|
|
+ return new GLTFMaterialsTransmissionExtension( writer );
|
|
|
+
|
|
|
+ } );
|
|
|
+
|
|
|
+ this.register( function ( writer ) {
|
|
|
+
|
|
|
+ return new GLTFMaterialsVolumeExtension( writer );
|
|
|
+
|
|
|
+ } );
|
|
|
+
|
|
|
}
|
|
|
|
|
|
register( callback ) {
|
|
@@ -2215,6 +2227,93 @@ class GLTFMaterialsPBRSpecularGlossiness {
|
|
|
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * Transmission Materials Extension
|
|
|
+ *
|
|
|
+ * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_transmission
|
|
|
+ */
|
|
|
+class GLTFMaterialsTransmissionExtension {
|
|
|
+
|
|
|
+ constructor( writer ) {
|
|
|
+
|
|
|
+ this.writer = writer;
|
|
|
+ this.name = 'KHR_materials_transmission';
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ writeMaterial( material, materialDef ) {
|
|
|
+
|
|
|
+ if ( ! material.isMeshPhysicalMaterial || material.transmission === 0 ) return;
|
|
|
+
|
|
|
+ const writer = this.writer;
|
|
|
+ const extensionsUsed = writer.extensionsUsed;
|
|
|
+
|
|
|
+ const extensionDef = {};
|
|
|
+
|
|
|
+ extensionDef.transmissionFactor = material.transmission;
|
|
|
+
|
|
|
+ if ( material.transmissionMap ) {
|
|
|
+
|
|
|
+ const transmissionMapDef = { index: writer.processTexture( material.transmissionMap ) };
|
|
|
+ writer.applyTextureTransform( transmissionMapDef, material.transmissionMap );
|
|
|
+ extensionDef.transmissionTexture = transmissionMapDef;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ materialDef.extensions = materialDef.extensions || {};
|
|
|
+ materialDef.extensions[ this.name ] = extensionDef;
|
|
|
+
|
|
|
+ extensionsUsed[ this.name ] = true;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * Materials Volume Extension
|
|
|
+ *
|
|
|
+ * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_volume
|
|
|
+ */
|
|
|
+class GLTFMaterialsVolumeExtension {
|
|
|
+
|
|
|
+ constructor( writer ) {
|
|
|
+
|
|
|
+ this.writer = writer;
|
|
|
+ this.name = 'KHR_materials_volume';
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ writeMaterial( material, materialDef ) {
|
|
|
+
|
|
|
+ if ( ! material.isMeshPhysicalMaterial || material.thickness === 0 ) return;
|
|
|
+
|
|
|
+ const writer = this.writer;
|
|
|
+ const extensionsUsed = writer.extensionsUsed;
|
|
|
+
|
|
|
+ const extensionDef = {};
|
|
|
+
|
|
|
+ extensionDef.thicknessFactor = material.thickness;
|
|
|
+
|
|
|
+ if ( material.thicknessMap ) {
|
|
|
+
|
|
|
+ const thicknessMapDef = { index: writer.processTexture( material.thicknessMap ) };
|
|
|
+ writer.applyTextureTransform( thicknessMapDef, material.thicknessMap );
|
|
|
+ extensionDef.thicknessTexture = thicknessMapDef;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ extensionDef.attenuationDistance = material.attenuationDistance;
|
|
|
+ extensionDef.attenuationColor = material.attenuationTint.toArray();
|
|
|
+
|
|
|
+ materialDef.extensions = materialDef.extensions || {};
|
|
|
+ materialDef.extensions[ this.name ] = extensionDef;
|
|
|
+
|
|
|
+ extensionsUsed[ this.name ] = true;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* Static utility functions
|
|
|
*/
|