@babylonjs/serializers 9.12.1 → 9.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/3MF/core/model/pure.d.ts +8 -0
- package/3MF/core/model/pure.js +9 -0
- package/3MF/core/model/pure.js.map +1 -0
- package/3MF/core/pure.d.ts +3 -0
- package/3MF/core/pure.js +5 -0
- package/3MF/core/pure.js.map +1 -0
- package/3MF/core/xml/pure.d.ts +7 -0
- package/3MF/core/xml/pure.js +8 -0
- package/3MF/core/xml/pure.js.map +1 -0
- package/3MF/pure.d.ts +4 -0
- package/3MF/pure.js +6 -0
- package/3MF/pure.js.map +1 -0
- package/BVH/pure.d.ts +2 -0
- package/BVH/pure.js +3 -0
- package/BVH/pure.js.map +1 -0
- package/OBJ/pure.d.ts +2 -0
- package/OBJ/pure.js +3 -0
- package/OBJ/pure.js.map +1 -0
- package/USDZ/pure.d.ts +2 -0
- package/USDZ/pure.js +4 -0
- package/USDZ/pure.js.map +1 -0
- package/glTF/2.0/Extensions/EXT_lights_area.d.ts +3 -37
- package/glTF/2.0/Extensions/EXT_lights_area.js +5 -130
- package/glTF/2.0/Extensions/EXT_lights_area.js.map +1 -1
- package/glTF/2.0/Extensions/EXT_lights_area.pure.d.ts +44 -0
- package/glTF/2.0/Extensions/EXT_lights_area.pure.js +145 -0
- package/glTF/2.0/Extensions/EXT_lights_area.pure.js.map +1 -0
- package/glTF/2.0/Extensions/EXT_mesh_gpu_instancing.d.ts +4 -38
- package/glTF/2.0/Extensions/EXT_mesh_gpu_instancing.js +6 -138
- package/glTF/2.0/Extensions/EXT_mesh_gpu_instancing.js.map +1 -1
- package/glTF/2.0/Extensions/EXT_mesh_gpu_instancing.pure.d.ts +44 -0
- package/glTF/2.0/Extensions/EXT_mesh_gpu_instancing.pure.js +151 -0
- package/glTF/2.0/Extensions/EXT_mesh_gpu_instancing.pure.js.map +1 -0
- package/glTF/2.0/Extensions/EXT_texture_avif.d.ts +3 -15
- package/glTF/2.0/Extensions/EXT_texture_avif.js +5 -38
- package/glTF/2.0/Extensions/EXT_texture_avif.js.map +1 -1
- package/glTF/2.0/Extensions/EXT_texture_avif.pure.d.ts +27 -0
- package/glTF/2.0/Extensions/EXT_texture_avif.pure.js +58 -0
- package/glTF/2.0/Extensions/EXT_texture_avif.pure.js.map +1 -0
- package/glTF/2.0/Extensions/EXT_texture_webp.d.ts +3 -14
- package/glTF/2.0/Extensions/EXT_texture_webp.js +5 -37
- package/glTF/2.0/Extensions/EXT_texture_webp.js.map +1 -1
- package/glTF/2.0/Extensions/EXT_texture_webp.pure.d.ts +26 -0
- package/glTF/2.0/Extensions/EXT_texture_webp.pure.js +57 -0
- package/glTF/2.0/Extensions/EXT_texture_webp.pure.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_draco_mesh_compression.d.ts +3 -30
- package/glTF/2.0/Extensions/KHR_draco_mesh_compression.js +5 -128
- package/glTF/2.0/Extensions/KHR_draco_mesh_compression.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_draco_mesh_compression.pure.d.ts +37 -0
- package/glTF/2.0/Extensions/KHR_draco_mesh_compression.pure.js +143 -0
- package/glTF/2.0/Extensions/KHR_draco_mesh_compression.pure.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_lights_punctual.d.ts +3 -37
- package/glTF/2.0/Extensions/KHR_lights_punctual.js +5 -142
- package/glTF/2.0/Extensions/KHR_lights_punctual.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_lights_punctual.pure.d.ts +44 -0
- package/glTF/2.0/Extensions/KHR_lights_punctual.pure.js +157 -0
- package/glTF/2.0/Extensions/KHR_lights_punctual.pure.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_materials_anisotropy.d.ts +3 -30
- package/glTF/2.0/Extensions/KHR_materials_anisotropy.js +5 -177
- package/glTF/2.0/Extensions/KHR_materials_anisotropy.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_materials_anisotropy.pure.d.ts +37 -0
- package/glTF/2.0/Extensions/KHR_materials_anisotropy.pure.js +192 -0
- package/glTF/2.0/Extensions/KHR_materials_anisotropy.pure.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_materials_clearcoat.d.ts +3 -30
- package/glTF/2.0/Extensions/KHR_materials_clearcoat.js +5 -251
- package/glTF/2.0/Extensions/KHR_materials_clearcoat.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_materials_clearcoat.pure.d.ts +37 -0
- package/glTF/2.0/Extensions/KHR_materials_clearcoat.pure.js +266 -0
- package/glTF/2.0/Extensions/KHR_materials_clearcoat.pure.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_materials_coat.d.ts +3 -30
- package/glTF/2.0/Extensions/KHR_materials_coat.js +5 -380
- package/glTF/2.0/Extensions/KHR_materials_coat.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_materials_coat.pure.d.ts +37 -0
- package/glTF/2.0/Extensions/KHR_materials_coat.pure.js +395 -0
- package/glTF/2.0/Extensions/KHR_materials_coat.pure.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_materials_diffuse_roughness.d.ts +3 -22
- package/glTF/2.0/Extensions/KHR_materials_diffuse_roughness.js +5 -75
- package/glTF/2.0/Extensions/KHR_materials_diffuse_roughness.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_materials_diffuse_roughness.pure.d.ts +29 -0
- package/glTF/2.0/Extensions/KHR_materials_diffuse_roughness.pure.js +90 -0
- package/glTF/2.0/Extensions/KHR_materials_diffuse_roughness.pure.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_materials_diffuse_transmission.d.ts +3 -38
- package/glTF/2.0/Extensions/KHR_materials_diffuse_transmission.js +5 -115
- package/glTF/2.0/Extensions/KHR_materials_diffuse_transmission.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_materials_diffuse_transmission.pure.d.ts +45 -0
- package/glTF/2.0/Extensions/KHR_materials_diffuse_transmission.pure.js +130 -0
- package/glTF/2.0/Extensions/KHR_materials_diffuse_transmission.pure.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_materials_dispersion.d.ts +3 -29
- package/glTF/2.0/Extensions/KHR_materials_dispersion.js +5 -60
- package/glTF/2.0/Extensions/KHR_materials_dispersion.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_materials_dispersion.pure.d.ts +36 -0
- package/glTF/2.0/Extensions/KHR_materials_dispersion.pure.js +75 -0
- package/glTF/2.0/Extensions/KHR_materials_dispersion.pure.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_materials_emissive_strength.d.ts +3 -25
- package/glTF/2.0/Extensions/KHR_materials_emissive_strength.js +5 -54
- package/glTF/2.0/Extensions/KHR_materials_emissive_strength.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_materials_emissive_strength.pure.d.ts +32 -0
- package/glTF/2.0/Extensions/KHR_materials_emissive_strength.pure.js +69 -0
- package/glTF/2.0/Extensions/KHR_materials_emissive_strength.pure.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_materials_fuzz.d.ts +3 -30
- package/glTF/2.0/Extensions/KHR_materials_fuzz.js +5 -191
- package/glTF/2.0/Extensions/KHR_materials_fuzz.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_materials_fuzz.pure.d.ts +37 -0
- package/glTF/2.0/Extensions/KHR_materials_fuzz.pure.js +206 -0
- package/glTF/2.0/Extensions/KHR_materials_fuzz.pure.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_materials_ior.d.ts +3 -27
- package/glTF/2.0/Extensions/KHR_materials_ior.js +5 -67
- package/glTF/2.0/Extensions/KHR_materials_ior.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_materials_ior.pure.d.ts +34 -0
- package/glTF/2.0/Extensions/KHR_materials_ior.pure.js +81 -0
- package/glTF/2.0/Extensions/KHR_materials_ior.pure.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_materials_iridescence.d.ts +3 -22
- package/glTF/2.0/Extensions/KHR_materials_iridescence.js +5 -100
- package/glTF/2.0/Extensions/KHR_materials_iridescence.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_materials_iridescence.pure.d.ts +29 -0
- package/glTF/2.0/Extensions/KHR_materials_iridescence.pure.js +115 -0
- package/glTF/2.0/Extensions/KHR_materials_iridescence.pure.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_materials_openpbr.d.ts +3 -25
- package/glTF/2.0/Extensions/KHR_materials_openpbr.js +5 -41
- package/glTF/2.0/Extensions/KHR_materials_openpbr.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_materials_openpbr.pure.d.ts +32 -0
- package/glTF/2.0/Extensions/KHR_materials_openpbr.pure.js +56 -0
- package/glTF/2.0/Extensions/KHR_materials_openpbr.pure.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_materials_sheen.d.ts +3 -22
- package/glTF/2.0/Extensions/KHR_materials_sheen.js +5 -63
- package/glTF/2.0/Extensions/KHR_materials_sheen.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_materials_sheen.pure.d.ts +29 -0
- package/glTF/2.0/Extensions/KHR_materials_sheen.pure.js +78 -0
- package/glTF/2.0/Extensions/KHR_materials_sheen.pure.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_materials_specular.d.ts +3 -39
- package/glTF/2.0/Extensions/KHR_materials_specular.js +5 -123
- package/glTF/2.0/Extensions/KHR_materials_specular.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_materials_specular.pure.d.ts +46 -0
- package/glTF/2.0/Extensions/KHR_materials_specular.pure.js +138 -0
- package/glTF/2.0/Extensions/KHR_materials_specular.pure.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_materials_transmission.d.ts +3 -38
- package/glTF/2.0/Extensions/KHR_materials_transmission.js +5 -145
- package/glTF/2.0/Extensions/KHR_materials_transmission.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_materials_transmission.pure.d.ts +45 -0
- package/glTF/2.0/Extensions/KHR_materials_transmission.pure.js +160 -0
- package/glTF/2.0/Extensions/KHR_materials_transmission.pure.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_materials_unlit.d.ts +3 -18
- package/glTF/2.0/Extensions/KHR_materials_unlit.js +5 -43
- package/glTF/2.0/Extensions/KHR_materials_unlit.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_materials_unlit.pure.d.ts +25 -0
- package/glTF/2.0/Extensions/KHR_materials_unlit.pure.js +58 -0
- package/glTF/2.0/Extensions/KHR_materials_unlit.pure.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_materials_volume.d.ts +3 -38
- package/glTF/2.0/Extensions/KHR_materials_volume.js +5 -169
- package/glTF/2.0/Extensions/KHR_materials_volume.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_materials_volume.pure.d.ts +45 -0
- package/glTF/2.0/Extensions/KHR_materials_volume.pure.js +184 -0
- package/glTF/2.0/Extensions/KHR_materials_volume.pure.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_materials_volume_scatter.d.ts +3 -38
- package/glTF/2.0/Extensions/KHR_materials_volume_scatter.js +5 -130
- package/glTF/2.0/Extensions/KHR_materials_volume_scatter.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_materials_volume_scatter.pure.d.ts +45 -0
- package/glTF/2.0/Extensions/KHR_materials_volume_scatter.pure.js +145 -0
- package/glTF/2.0/Extensions/KHR_materials_volume_scatter.pure.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_texture_basisu.d.ts +3 -14
- package/glTF/2.0/Extensions/KHR_texture_basisu.js +5 -37
- package/glTF/2.0/Extensions/KHR_texture_basisu.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_texture_basisu.pure.d.ts +26 -0
- package/glTF/2.0/Extensions/KHR_texture_basisu.pure.js +57 -0
- package/glTF/2.0/Extensions/KHR_texture_basisu.pure.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_texture_transform.d.ts +3 -19
- package/glTF/2.0/Extensions/KHR_texture_transform.js +5 -90
- package/glTF/2.0/Extensions/KHR_texture_transform.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_texture_transform.pure.d.ts +26 -0
- package/glTF/2.0/Extensions/KHR_texture_transform.pure.js +105 -0
- package/glTF/2.0/Extensions/KHR_texture_transform.pure.js.map +1 -0
- package/glTF/2.0/Extensions/pure.d.ts +26 -0
- package/glTF/2.0/Extensions/pure.js +27 -0
- package/glTF/2.0/Extensions/pure.js.map +1 -0
- package/glTF/2.0/pure.d.ts +5 -0
- package/glTF/2.0/pure.js +7 -0
- package/glTF/2.0/pure.js.map +1 -0
- package/glTF/pure.d.ts +3 -0
- package/glTF/pure.js +5 -0
- package/glTF/pure.js.map +1 -0
- package/package.json +30 -4
- package/pure.d.ts +7 -0
- package/pure.js +9 -0
- package/pure.js.map +1 -0
- package/stl/pure.d.ts +2 -0
- package/stl/pure.js +3 -0
- package/stl/pure.js.map +1 -0
|
@@ -1,40 +1,5 @@
|
|
|
1
|
-
import { type IMaterial } from "babylonjs-gltf2interface";
|
|
2
|
-
import { type IGLTFExporterExtensionV2 } from "../glTFExporterExtension.js";
|
|
3
|
-
import { GLTFExporter } from "../glTFExporter.js";
|
|
4
|
-
import { type Material } from "@babylonjs/core/Materials/material.js";
|
|
5
|
-
import { type BaseTexture } from "@babylonjs/core/Materials/Textures/baseTexture.js";
|
|
6
1
|
/**
|
|
7
|
-
*
|
|
2
|
+
* Re-exports the pure implementation and applies the runtime registration side effect.
|
|
3
|
+
* Import "./KHR_materials_volume.pure" for tree-shakeable, side-effect-free usage.
|
|
8
4
|
*/
|
|
9
|
-
export
|
|
10
|
-
/** Name of this extension */
|
|
11
|
-
readonly name = "KHR_materials_volume";
|
|
12
|
-
/** Defines whether this extension is enabled */
|
|
13
|
-
enabled: boolean;
|
|
14
|
-
/** Defines whether this extension is required */
|
|
15
|
-
required: boolean;
|
|
16
|
-
private _exporter;
|
|
17
|
-
private _wasUsed;
|
|
18
|
-
constructor(exporter: GLTFExporter);
|
|
19
|
-
dispose(): void;
|
|
20
|
-
/** @internal */
|
|
21
|
-
get wasUsed(): boolean;
|
|
22
|
-
/**
|
|
23
|
-
* After exporting a material, deal with additional textures
|
|
24
|
-
* @param context GLTF context of the material
|
|
25
|
-
* @param node exported GLTF node
|
|
26
|
-
* @param babylonMaterial corresponding babylon material
|
|
27
|
-
* @returns array of additional textures to export
|
|
28
|
-
*/
|
|
29
|
-
postExportMaterialAdditionalTexturesAsync?(context: string, node: IMaterial, babylonMaterial: Material): Promise<BaseTexture[]>;
|
|
30
|
-
private _isExtensionEnabled;
|
|
31
|
-
private _hasTexturesExtension;
|
|
32
|
-
/**
|
|
33
|
-
* After exporting a material
|
|
34
|
-
* @param context GLTF context of the material
|
|
35
|
-
* @param node exported GLTF node
|
|
36
|
-
* @param babylonMaterial corresponding babylon material
|
|
37
|
-
* @returns promise that resolves with the updated node
|
|
38
|
-
*/
|
|
39
|
-
postExportMaterialAsync?(context: string, node: IMaterial, babylonMaterial: Material): Promise<IMaterial>;
|
|
40
|
-
}
|
|
5
|
+
export * from "./KHR_materials_volume.pure.js";
|
|
@@ -1,172 +1,8 @@
|
|
|
1
|
-
import { GLTFExporter } from "../glTFExporter.js";
|
|
2
|
-
import { PBRMaterial } from "@babylonjs/core/Materials/PBR/pbrMaterial.js";
|
|
3
|
-
import { Color3 } from "@babylonjs/core/Maths/math.color.js";
|
|
4
|
-
import { Vector3 } from "@babylonjs/core/Maths/math.vector.js";
|
|
5
|
-
import { OpenPBRMaterial } from "@babylonjs/core/Materials/PBR/openpbrMaterial.js";
|
|
6
|
-
const NAME = "KHR_materials_volume";
|
|
7
1
|
/**
|
|
8
|
-
*
|
|
2
|
+
* Re-exports the pure implementation and applies the runtime registration side effect.
|
|
3
|
+
* Import "./KHR_materials_volume.pure" for tree-shakeable, side-effect-free usage.
|
|
9
4
|
*/
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
/** Name of this extension */
|
|
14
|
-
this.name = NAME;
|
|
15
|
-
/** Defines whether this extension is enabled */
|
|
16
|
-
this.enabled = true;
|
|
17
|
-
/** Defines whether this extension is required */
|
|
18
|
-
this.required = false;
|
|
19
|
-
this._wasUsed = false;
|
|
20
|
-
this._exporter = exporter;
|
|
21
|
-
}
|
|
22
|
-
dispose() { }
|
|
23
|
-
/** @internal */
|
|
24
|
-
get wasUsed() {
|
|
25
|
-
return this._wasUsed;
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* After exporting a material, deal with additional textures
|
|
29
|
-
* @param context GLTF context of the material
|
|
30
|
-
* @param node exported GLTF node
|
|
31
|
-
* @param babylonMaterial corresponding babylon material
|
|
32
|
-
* @returns array of additional textures to export
|
|
33
|
-
*/
|
|
34
|
-
async postExportMaterialAdditionalTexturesAsync(context, node, babylonMaterial) {
|
|
35
|
-
const additionalTextures = [];
|
|
36
|
-
if (babylonMaterial instanceof PBRMaterial) {
|
|
37
|
-
if (this._isExtensionEnabled(babylonMaterial)) {
|
|
38
|
-
if (babylonMaterial.subSurface.thicknessTexture) {
|
|
39
|
-
additionalTextures.push(babylonMaterial.subSurface.thicknessTexture);
|
|
40
|
-
}
|
|
41
|
-
return additionalTextures;
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
else if (babylonMaterial instanceof OpenPBRMaterial) {
|
|
45
|
-
if (babylonMaterial.transmissionWeight > 0 || babylonMaterial.subsurfaceWeight > 0) {
|
|
46
|
-
if (babylonMaterial.geometryThicknessTexture) {
|
|
47
|
-
additionalTextures.push(babylonMaterial.geometryThicknessTexture);
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
return additionalTextures;
|
|
52
|
-
}
|
|
53
|
-
_isExtensionEnabled(mat) {
|
|
54
|
-
// This extension must not be used on a material that also uses KHR_materials_unlit
|
|
55
|
-
if (mat.unlit) {
|
|
56
|
-
return false;
|
|
57
|
-
}
|
|
58
|
-
const subs = mat.subSurface;
|
|
59
|
-
// this extension requires either the KHR_materials_transmission or KHR_materials_diffuse_transmission extensions.
|
|
60
|
-
if (!subs.isRefractionEnabled && !subs.isTranslucencyEnabled) {
|
|
61
|
-
return false;
|
|
62
|
-
}
|
|
63
|
-
return ((subs.maximumThickness != undefined && subs.maximumThickness != 0) ||
|
|
64
|
-
(subs.tintColorAtDistance != undefined && subs.tintColorAtDistance != Number.POSITIVE_INFINITY) ||
|
|
65
|
-
(subs.tintColor != undefined && subs.tintColor != Color3.White()) ||
|
|
66
|
-
this._hasTexturesExtension(mat));
|
|
67
|
-
}
|
|
68
|
-
_hasTexturesExtension(mat) {
|
|
69
|
-
return mat.subSurface.thicknessTexture != null;
|
|
70
|
-
}
|
|
71
|
-
/**
|
|
72
|
-
* After exporting a material
|
|
73
|
-
* @param context GLTF context of the material
|
|
74
|
-
* @param node exported GLTF node
|
|
75
|
-
* @param babylonMaterial corresponding babylon material
|
|
76
|
-
* @returns promise that resolves with the updated node
|
|
77
|
-
*/
|
|
78
|
-
// eslint-disable-next-line no-restricted-syntax
|
|
79
|
-
postExportMaterialAsync(context, node, babylonMaterial) {
|
|
80
|
-
return new Promise((resolve) => {
|
|
81
|
-
if (babylonMaterial instanceof PBRMaterial && this._isExtensionEnabled(babylonMaterial)) {
|
|
82
|
-
this._wasUsed = true;
|
|
83
|
-
const subs = babylonMaterial.subSurface;
|
|
84
|
-
const thicknessFactor = subs.maximumThickness == 0 ? undefined : subs.maximumThickness;
|
|
85
|
-
const thicknessTexture = this._exporter._materialExporter.getTextureInfo(subs.thicknessTexture) ?? undefined;
|
|
86
|
-
const attenuationDistance = subs.tintColorAtDistance == Number.POSITIVE_INFINITY ? undefined : subs.tintColorAtDistance;
|
|
87
|
-
const attenuationColor = subs.tintColor.equalsFloats(1.0, 1.0, 1.0) ? undefined : subs.tintColor.asArray();
|
|
88
|
-
const volumeInfo = {
|
|
89
|
-
thicknessFactor: thicknessFactor,
|
|
90
|
-
thicknessTexture: thicknessTexture,
|
|
91
|
-
attenuationDistance: attenuationDistance,
|
|
92
|
-
attenuationColor: attenuationColor,
|
|
93
|
-
};
|
|
94
|
-
if (this._hasTexturesExtension(babylonMaterial)) {
|
|
95
|
-
this._exporter._materialNeedsUVsSet.add(babylonMaterial);
|
|
96
|
-
}
|
|
97
|
-
node.extensions = node.extensions || {};
|
|
98
|
-
node.extensions[NAME] = volumeInfo;
|
|
99
|
-
}
|
|
100
|
-
else if (babylonMaterial instanceof OpenPBRMaterial) {
|
|
101
|
-
const transmissionVolume = babylonMaterial.transmissionWeight > 0 && !babylonMaterial.geometryThinWalled;
|
|
102
|
-
const subsurfaceVolume = babylonMaterial.subsurfaceWeight > 0 && !babylonMaterial.geometryThinWalled;
|
|
103
|
-
if (transmissionVolume || subsurfaceVolume) {
|
|
104
|
-
this._wasUsed = true;
|
|
105
|
-
const thicknessFactor = babylonMaterial.geometryThickness;
|
|
106
|
-
const thicknessTexture = this._exporter._materialExporter.getTextureInfo(babylonMaterial.geometryThicknessTexture) ?? undefined;
|
|
107
|
-
if (thicknessTexture) {
|
|
108
|
-
this._exporter._materialNeedsUVsSet.add(babylonMaterial);
|
|
109
|
-
}
|
|
110
|
-
let transmissionAttenuationDistance;
|
|
111
|
-
const transmissionAttenuationColor = Color3.White().asArray();
|
|
112
|
-
if (transmissionVolume && babylonMaterial.transmissionDepth > 0) {
|
|
113
|
-
const invDepth = 1.0 / babylonMaterial.transmissionDepth;
|
|
114
|
-
let transmissionExtinctionCoefficient = new Vector3(-Math.log(babylonMaterial.transmissionColor.r) * invDepth, -Math.log(babylonMaterial.transmissionColor.g) * invDepth, -Math.log(babylonMaterial.transmissionColor.b) * invDepth);
|
|
115
|
-
const transmissionScatteringCoefficient = new Vector3(babylonMaterial.transmissionScatter.r * invDepth, babylonMaterial.transmissionScatter.g * invDepth, babylonMaterial.transmissionScatter.b * invDepth);
|
|
116
|
-
const transmissionAbsorptionCoefficient = transmissionExtinctionCoefficient.subtract(transmissionScatteringCoefficient);
|
|
117
|
-
const minCoeff = Math.min(transmissionAbsorptionCoefficient.x, transmissionAbsorptionCoefficient.y, transmissionAbsorptionCoefficient.z);
|
|
118
|
-
if (minCoeff < 0) {
|
|
119
|
-
transmissionAbsorptionCoefficient.x = transmissionAbsorptionCoefficient.x - minCoeff;
|
|
120
|
-
transmissionAbsorptionCoefficient.y = transmissionAbsorptionCoefficient.y - minCoeff;
|
|
121
|
-
transmissionAbsorptionCoefficient.z = transmissionAbsorptionCoefficient.z - minCoeff;
|
|
122
|
-
}
|
|
123
|
-
transmissionExtinctionCoefficient = transmissionAbsorptionCoefficient.add(transmissionScatteringCoefficient);
|
|
124
|
-
const maxCoeff = Math.max(transmissionExtinctionCoefficient.x, transmissionExtinctionCoefficient.y, transmissionExtinctionCoefficient.z);
|
|
125
|
-
transmissionAttenuationDistance = 1.0 / maxCoeff;
|
|
126
|
-
transmissionAttenuationColor[0] = Math.exp(-transmissionExtinctionCoefficient.x * transmissionAttenuationDistance);
|
|
127
|
-
transmissionAttenuationColor[1] = Math.exp(-transmissionExtinctionCoefficient.y * transmissionAttenuationDistance);
|
|
128
|
-
transmissionAttenuationColor[2] = Math.exp(-transmissionExtinctionCoefficient.z * transmissionAttenuationDistance);
|
|
129
|
-
}
|
|
130
|
-
else {
|
|
131
|
-
// transmissionDepth == 0
|
|
132
|
-
transmissionAttenuationDistance = Number.MAX_VALUE;
|
|
133
|
-
transmissionAttenuationColor[0] = 1.0;
|
|
134
|
-
transmissionAttenuationColor[1] = 1.0;
|
|
135
|
-
transmissionAttenuationColor[2] = 1.0;
|
|
136
|
-
}
|
|
137
|
-
let subsurfaceAttenuationDistance = 1;
|
|
138
|
-
const subsurfaceAttenuationColor = Color3.White().asArray();
|
|
139
|
-
if (subsurfaceVolume) {
|
|
140
|
-
const r = babylonMaterial.subsurfaceRadius;
|
|
141
|
-
const radiusScale = babylonMaterial.subsurfaceRadiusScale;
|
|
142
|
-
const mfp = new Vector3(radiusScale.r, radiusScale.g, radiusScale.b).multiplyByFloats(r, r, r);
|
|
143
|
-
const extinctionCoeff = new Vector3(1.0 / Math.max(mfp.x, 1e-6), 1.0 / Math.max(mfp.y, 1e-6), 1.0 / Math.max(mfp.z, 1e-6));
|
|
144
|
-
const maxCoeff = Math.max(extinctionCoeff.x, extinctionCoeff.y, extinctionCoeff.z);
|
|
145
|
-
subsurfaceAttenuationDistance = 1.0 / maxCoeff;
|
|
146
|
-
subsurfaceAttenuationColor[0] = Math.exp(-extinctionCoeff.x * subsurfaceAttenuationDistance);
|
|
147
|
-
subsurfaceAttenuationColor[1] = Math.exp(-extinctionCoeff.y * subsurfaceAttenuationDistance);
|
|
148
|
-
subsurfaceAttenuationColor[2] = Math.exp(-extinctionCoeff.z * subsurfaceAttenuationDistance);
|
|
149
|
-
}
|
|
150
|
-
const subsurfaceFractionOfDielectric = (1.0 - babylonMaterial.transmissionWeight) * babylonMaterial.subsurfaceWeight;
|
|
151
|
-
const subsurfaceAndTransmissionFractionOfDielectric = subsurfaceFractionOfDielectric + babylonMaterial.transmissionWeight;
|
|
152
|
-
const reciprocalOfSubsurfaceAndTransmissionFractionOfDielectric = 1.0 / Math.max(subsurfaceAndTransmissionFractionOfDielectric, 1e-6);
|
|
153
|
-
const transWeight = babylonMaterial.transmissionWeight * reciprocalOfSubsurfaceAndTransmissionFractionOfDielectric;
|
|
154
|
-
const subsurfWeight = subsurfaceFractionOfDielectric * reciprocalOfSubsurfaceAndTransmissionFractionOfDielectric;
|
|
155
|
-
const attenuationColor = transmissionAttenuationColor.map((c, i) => c * transWeight + subsurfaceAttenuationColor[i] * subsurfWeight);
|
|
156
|
-
const attenuationDistance = transmissionAttenuationDistance * transWeight + subsurfaceAttenuationDistance * subsurfWeight;
|
|
157
|
-
const volumeInfo = {
|
|
158
|
-
thicknessFactor: thicknessFactor,
|
|
159
|
-
thicknessTexture: thicknessTexture,
|
|
160
|
-
attenuationDistance: attenuationDistance,
|
|
161
|
-
attenuationColor: attenuationColor,
|
|
162
|
-
};
|
|
163
|
-
node.extensions = node.extensions || {};
|
|
164
|
-
node.extensions[NAME] = volumeInfo;
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
resolve(node);
|
|
168
|
-
});
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
GLTFExporter.RegisterExtension(NAME, (exporter) => new KHR_materials_volume(exporter));
|
|
5
|
+
export * from "./KHR_materials_volume.pure.js";
|
|
6
|
+
import { RegisterKHR_materials_volume } from "./KHR_materials_volume.pure.js";
|
|
7
|
+
RegisterKHR_materials_volume();
|
|
172
8
|
//# sourceMappingURL=KHR_materials_volume.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"KHR_materials_volume.js","sourceRoot":"","sources":["../../../../../../dev/serializers/src/glTF/2.0/Extensions/KHR_materials_volume.ts"],"names":[],"mappings":"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","sourcesContent":["import { type IMaterial, type IKHRMaterialsVolume } from \"babylonjs-gltf2interface\";\r\nimport { type IGLTFExporterExtensionV2 } from \"../glTFExporterExtension\";\r\nimport { GLTFExporter } from \"../glTFExporter\";\r\nimport { type Material } from \"core/Materials/material\";\r\nimport { PBRMaterial } from \"core/Materials/PBR/pbrMaterial\";\r\nimport { type BaseTexture } from \"core/Materials/Textures/baseTexture\";\r\nimport { Color3 } from \"core/Maths/math.color\";\r\nimport { Vector3 } from \"core/Maths/math.vector\";\r\nimport { OpenPBRMaterial } from \"core/Materials/PBR/openpbrMaterial\";\r\n\r\nconst NAME = \"KHR_materials_volume\";\r\n\r\n/**\r\n * [Specification](https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Khronos/KHR_materials_volume/README.md)\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport class KHR_materials_volume implements IGLTFExporterExtensionV2 {\r\n /** Name of this extension */\r\n public readonly name = NAME;\r\n\r\n /** Defines whether this extension is enabled */\r\n public enabled = true;\r\n\r\n /** Defines whether this extension is required */\r\n public required = false;\r\n\r\n private _exporter: GLTFExporter;\r\n\r\n private _wasUsed = false;\r\n\r\n constructor(exporter: GLTFExporter) {\r\n this._exporter = exporter;\r\n }\r\n\r\n public dispose() {}\r\n\r\n /** @internal */\r\n public get wasUsed() {\r\n return this._wasUsed;\r\n }\r\n\r\n /**\r\n * After exporting a material, deal with additional textures\r\n * @param context GLTF context of the material\r\n * @param node exported GLTF node\r\n * @param babylonMaterial corresponding babylon material\r\n * @returns array of additional textures to export\r\n */\r\n public async postExportMaterialAdditionalTexturesAsync?(context: string, node: IMaterial, babylonMaterial: Material): Promise<BaseTexture[]> {\r\n const additionalTextures: BaseTexture[] = [];\r\n\r\n if (babylonMaterial instanceof PBRMaterial) {\r\n if (this._isExtensionEnabled(babylonMaterial)) {\r\n if (babylonMaterial.subSurface.thicknessTexture) {\r\n additionalTextures.push(babylonMaterial.subSurface.thicknessTexture);\r\n }\r\n return additionalTextures;\r\n }\r\n } else if (babylonMaterial instanceof OpenPBRMaterial) {\r\n if (babylonMaterial.transmissionWeight > 0 || babylonMaterial.subsurfaceWeight > 0) {\r\n if (babylonMaterial.geometryThicknessTexture) {\r\n additionalTextures.push(babylonMaterial.geometryThicknessTexture);\r\n }\r\n }\r\n }\r\n\r\n return additionalTextures;\r\n }\r\n\r\n private _isExtensionEnabled(mat: PBRMaterial): boolean {\r\n // This extension must not be used on a material that also uses KHR_materials_unlit\r\n if (mat.unlit) {\r\n return false;\r\n }\r\n const subs = mat.subSurface;\r\n // this extension requires either the KHR_materials_transmission or KHR_materials_diffuse_transmission extensions.\r\n if (!subs.isRefractionEnabled && !subs.isTranslucencyEnabled) {\r\n return false;\r\n }\r\n return (\r\n (subs.maximumThickness != undefined && subs.maximumThickness != 0) ||\r\n (subs.tintColorAtDistance != undefined && subs.tintColorAtDistance != Number.POSITIVE_INFINITY) ||\r\n (subs.tintColor != undefined && subs.tintColor != Color3.White()) ||\r\n this._hasTexturesExtension(mat)\r\n );\r\n }\r\n\r\n private _hasTexturesExtension(mat: PBRMaterial): boolean {\r\n return mat.subSurface.thicknessTexture != null;\r\n }\r\n\r\n /**\r\n * After exporting a material\r\n * @param context GLTF context of the material\r\n * @param node exported GLTF node\r\n * @param babylonMaterial corresponding babylon material\r\n * @returns promise that resolves with the updated node\r\n */\r\n // eslint-disable-next-line no-restricted-syntax\r\n public postExportMaterialAsync?(context: string, node: IMaterial, babylonMaterial: Material): Promise<IMaterial> {\r\n return new Promise((resolve) => {\r\n if (babylonMaterial instanceof PBRMaterial && this._isExtensionEnabled(babylonMaterial)) {\r\n this._wasUsed = true;\r\n\r\n const subs = babylonMaterial.subSurface;\r\n const thicknessFactor = subs.maximumThickness == 0 ? undefined : subs.maximumThickness;\r\n const thicknessTexture = this._exporter._materialExporter.getTextureInfo(subs.thicknessTexture) ?? undefined;\r\n const attenuationDistance = subs.tintColorAtDistance == Number.POSITIVE_INFINITY ? undefined : subs.tintColorAtDistance;\r\n const attenuationColor = subs.tintColor.equalsFloats(1.0, 1.0, 1.0) ? undefined : subs.tintColor.asArray();\r\n\r\n const volumeInfo: IKHRMaterialsVolume = {\r\n thicknessFactor: thicknessFactor,\r\n thicknessTexture: thicknessTexture,\r\n attenuationDistance: attenuationDistance,\r\n attenuationColor: attenuationColor,\r\n };\r\n\r\n if (this._hasTexturesExtension(babylonMaterial)) {\r\n this._exporter._materialNeedsUVsSet.add(babylonMaterial);\r\n }\r\n\r\n node.extensions = node.extensions || {};\r\n node.extensions[NAME] = volumeInfo;\r\n } else if (babylonMaterial instanceof OpenPBRMaterial) {\r\n const transmissionVolume = babylonMaterial.transmissionWeight > 0 && !babylonMaterial.geometryThinWalled;\r\n const subsurfaceVolume = babylonMaterial.subsurfaceWeight > 0 && !babylonMaterial.geometryThinWalled;\r\n if (transmissionVolume || subsurfaceVolume) {\r\n this._wasUsed = true;\r\n\r\n const thicknessFactor = babylonMaterial.geometryThickness;\r\n const thicknessTexture = this._exporter._materialExporter.getTextureInfo(babylonMaterial.geometryThicknessTexture) ?? undefined;\r\n if (thicknessTexture) {\r\n this._exporter._materialNeedsUVsSet.add(babylonMaterial);\r\n }\r\n let transmissionAttenuationDistance;\r\n const transmissionAttenuationColor = Color3.White().asArray();\r\n if (transmissionVolume && babylonMaterial.transmissionDepth > 0) {\r\n const invDepth = 1.0 / babylonMaterial.transmissionDepth;\r\n let transmissionExtinctionCoefficient = new Vector3(\r\n -Math.log(babylonMaterial.transmissionColor.r) * invDepth,\r\n -Math.log(babylonMaterial.transmissionColor.g) * invDepth,\r\n -Math.log(babylonMaterial.transmissionColor.b) * invDepth\r\n );\r\n const transmissionScatteringCoefficient = new Vector3(\r\n babylonMaterial.transmissionScatter.r * invDepth,\r\n babylonMaterial.transmissionScatter.g * invDepth,\r\n babylonMaterial.transmissionScatter.b * invDepth\r\n );\r\n const transmissionAbsorptionCoefficient = transmissionExtinctionCoefficient.subtract(transmissionScatteringCoefficient);\r\n const minCoeff = Math.min(transmissionAbsorptionCoefficient.x, transmissionAbsorptionCoefficient.y, transmissionAbsorptionCoefficient.z);\r\n if (minCoeff < 0) {\r\n transmissionAbsorptionCoefficient.x = transmissionAbsorptionCoefficient.x - minCoeff;\r\n transmissionAbsorptionCoefficient.y = transmissionAbsorptionCoefficient.y - minCoeff;\r\n transmissionAbsorptionCoefficient.z = transmissionAbsorptionCoefficient.z - minCoeff;\r\n }\r\n transmissionExtinctionCoefficient = transmissionAbsorptionCoefficient.add(transmissionScatteringCoefficient);\r\n const maxCoeff = Math.max(transmissionExtinctionCoefficient.x, transmissionExtinctionCoefficient.y, transmissionExtinctionCoefficient.z);\r\n transmissionAttenuationDistance = 1.0 / maxCoeff;\r\n transmissionAttenuationColor[0] = Math.exp(-transmissionExtinctionCoefficient.x * transmissionAttenuationDistance);\r\n transmissionAttenuationColor[1] = Math.exp(-transmissionExtinctionCoefficient.y * transmissionAttenuationDistance);\r\n transmissionAttenuationColor[2] = Math.exp(-transmissionExtinctionCoefficient.z * transmissionAttenuationDistance);\r\n } else {\r\n // transmissionDepth == 0\r\n transmissionAttenuationDistance = Number.MAX_VALUE;\r\n transmissionAttenuationColor[0] = 1.0;\r\n transmissionAttenuationColor[1] = 1.0;\r\n transmissionAttenuationColor[2] = 1.0;\r\n }\r\n let subsurfaceAttenuationDistance = 1;\r\n const subsurfaceAttenuationColor = Color3.White().asArray();\r\n if (subsurfaceVolume) {\r\n const r = babylonMaterial.subsurfaceRadius;\r\n const radiusScale = babylonMaterial.subsurfaceRadiusScale;\r\n const mfp = new Vector3(radiusScale.r, radiusScale.g, radiusScale.b).multiplyByFloats(r, r, r);\r\n const extinctionCoeff = new Vector3(1.0 / Math.max(mfp.x, 1e-6), 1.0 / Math.max(mfp.y, 1e-6), 1.0 / Math.max(mfp.z, 1e-6));\r\n const maxCoeff = Math.max(extinctionCoeff.x, extinctionCoeff.y, extinctionCoeff.z);\r\n subsurfaceAttenuationDistance = 1.0 / maxCoeff;\r\n subsurfaceAttenuationColor[0] = Math.exp(-extinctionCoeff.x * subsurfaceAttenuationDistance);\r\n subsurfaceAttenuationColor[1] = Math.exp(-extinctionCoeff.y * subsurfaceAttenuationDistance);\r\n subsurfaceAttenuationColor[2] = Math.exp(-extinctionCoeff.z * subsurfaceAttenuationDistance);\r\n }\r\n\r\n const subsurfaceFractionOfDielectric = (1.0 - babylonMaterial.transmissionWeight) * babylonMaterial.subsurfaceWeight;\r\n const subsurfaceAndTransmissionFractionOfDielectric = subsurfaceFractionOfDielectric + babylonMaterial.transmissionWeight;\r\n const reciprocalOfSubsurfaceAndTransmissionFractionOfDielectric = 1.0 / Math.max(subsurfaceAndTransmissionFractionOfDielectric, 1e-6);\r\n const transWeight = babylonMaterial.transmissionWeight * reciprocalOfSubsurfaceAndTransmissionFractionOfDielectric;\r\n const subsurfWeight = subsurfaceFractionOfDielectric * reciprocalOfSubsurfaceAndTransmissionFractionOfDielectric;\r\n\r\n const attenuationColor = transmissionAttenuationColor.map((c, i) => c * transWeight + subsurfaceAttenuationColor[i] * subsurfWeight);\r\n const attenuationDistance = transmissionAttenuationDistance * transWeight + subsurfaceAttenuationDistance * subsurfWeight;\r\n\r\n const volumeInfo: IKHRMaterialsVolume = {\r\n thicknessFactor: thicknessFactor,\r\n thicknessTexture: thicknessTexture,\r\n attenuationDistance: attenuationDistance,\r\n attenuationColor: attenuationColor,\r\n };\r\n node.extensions = node.extensions || {};\r\n node.extensions[NAME] = volumeInfo;\r\n }\r\n }\r\n resolve(node);\r\n });\r\n }\r\n}\r\n\r\nGLTFExporter.RegisterExtension(NAME, (exporter) => new KHR_materials_volume(exporter));\r\n"]}
|
|
1
|
+
{"version":3,"file":"KHR_materials_volume.js","sourceRoot":"","sources":["../../../../../../dev/serializers/src/glTF/2.0/Extensions/KHR_materials_volume.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,cAAc,6BAA6B,CAAC;AAE5C,OAAO,EAAE,4BAA4B,EAAE,MAAM,6BAA6B,CAAC;AAC3E,4BAA4B,EAAE,CAAC","sourcesContent":["/**\r\n * Re-exports the pure implementation and applies the runtime registration side effect.\r\n * Import \"./KHR_materials_volume.pure\" for tree-shakeable, side-effect-free usage.\r\n */\r\nexport * from \"./KHR_materials_volume.pure\";\r\n\r\nimport { RegisterKHR_materials_volume } from \"./KHR_materials_volume.pure\";\r\nRegisterKHR_materials_volume();\r\n"]}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { type IMaterial } from "babylonjs-gltf2interface";
|
|
2
|
+
import { type IGLTFExporterExtensionV2 } from "../glTFExporterExtension.js";
|
|
3
|
+
import { GLTFExporter } from "../glTFExporter.js";
|
|
4
|
+
import { type Material } from "@babylonjs/core/Materials/material.js";
|
|
5
|
+
import { type BaseTexture } from "@babylonjs/core/Materials/Textures/baseTexture.js";
|
|
6
|
+
/**
|
|
7
|
+
* [Specification](https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Khronos/KHR_materials_volume/README.md)
|
|
8
|
+
*/
|
|
9
|
+
export declare class KHR_materials_volume implements IGLTFExporterExtensionV2 {
|
|
10
|
+
/** Name of this extension */
|
|
11
|
+
readonly name = "KHR_materials_volume";
|
|
12
|
+
/** Defines whether this extension is enabled */
|
|
13
|
+
enabled: boolean;
|
|
14
|
+
/** Defines whether this extension is required */
|
|
15
|
+
required: boolean;
|
|
16
|
+
private _exporter;
|
|
17
|
+
private _wasUsed;
|
|
18
|
+
constructor(exporter: GLTFExporter);
|
|
19
|
+
dispose(): void;
|
|
20
|
+
/** @internal */
|
|
21
|
+
get wasUsed(): boolean;
|
|
22
|
+
/**
|
|
23
|
+
* After exporting a material, deal with additional textures
|
|
24
|
+
* @param context GLTF context of the material
|
|
25
|
+
* @param node exported GLTF node
|
|
26
|
+
* @param babylonMaterial corresponding babylon material
|
|
27
|
+
* @returns array of additional textures to export
|
|
28
|
+
*/
|
|
29
|
+
postExportMaterialAdditionalTexturesAsync?(context: string, node: IMaterial, babylonMaterial: Material): Promise<BaseTexture[]>;
|
|
30
|
+
private _isExtensionEnabled;
|
|
31
|
+
private _hasTexturesExtension;
|
|
32
|
+
/**
|
|
33
|
+
* After exporting a material
|
|
34
|
+
* @param context GLTF context of the material
|
|
35
|
+
* @param node exported GLTF node
|
|
36
|
+
* @param babylonMaterial corresponding babylon material
|
|
37
|
+
* @returns promise that resolves with the updated node
|
|
38
|
+
*/
|
|
39
|
+
postExportMaterialAsync?(context: string, node: IMaterial, babylonMaterial: Material): Promise<IMaterial>;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Registers the KHR_materials_volume glTF serializer extension with the {@link GLTFExporter}.
|
|
43
|
+
* Safe to call multiple times; only the first call has an effect.
|
|
44
|
+
*/
|
|
45
|
+
export declare function RegisterKHR_materials_volume(): void;
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
import { GLTFExporter } from "../glTFExporter.js";
|
|
2
|
+
import { PBRMaterial } from "@babylonjs/core/Materials/PBR/pbrMaterial.pure.js";
|
|
3
|
+
import { Color3 } from "@babylonjs/core/Maths/math.color.pure.js";
|
|
4
|
+
import { Vector3 } from "@babylonjs/core/Maths/math.vector.pure.js";
|
|
5
|
+
import { OpenPBRMaterial } from "@babylonjs/core/Materials/PBR/openpbrMaterial.pure.js";
|
|
6
|
+
const NAME = "KHR_materials_volume";
|
|
7
|
+
/**
|
|
8
|
+
* [Specification](https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Khronos/KHR_materials_volume/README.md)
|
|
9
|
+
*/
|
|
10
|
+
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
11
|
+
export class KHR_materials_volume {
|
|
12
|
+
constructor(exporter) {
|
|
13
|
+
/** Name of this extension */
|
|
14
|
+
this.name = NAME;
|
|
15
|
+
/** Defines whether this extension is enabled */
|
|
16
|
+
this.enabled = true;
|
|
17
|
+
/** Defines whether this extension is required */
|
|
18
|
+
this.required = false;
|
|
19
|
+
this._wasUsed = false;
|
|
20
|
+
this._exporter = exporter;
|
|
21
|
+
}
|
|
22
|
+
dispose() { }
|
|
23
|
+
/** @internal */
|
|
24
|
+
get wasUsed() {
|
|
25
|
+
return this._wasUsed;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* After exporting a material, deal with additional textures
|
|
29
|
+
* @param context GLTF context of the material
|
|
30
|
+
* @param node exported GLTF node
|
|
31
|
+
* @param babylonMaterial corresponding babylon material
|
|
32
|
+
* @returns array of additional textures to export
|
|
33
|
+
*/
|
|
34
|
+
async postExportMaterialAdditionalTexturesAsync(context, node, babylonMaterial) {
|
|
35
|
+
const additionalTextures = [];
|
|
36
|
+
if (babylonMaterial instanceof PBRMaterial) {
|
|
37
|
+
if (this._isExtensionEnabled(babylonMaterial)) {
|
|
38
|
+
if (babylonMaterial.subSurface.thicknessTexture) {
|
|
39
|
+
additionalTextures.push(babylonMaterial.subSurface.thicknessTexture);
|
|
40
|
+
}
|
|
41
|
+
return additionalTextures;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
else if (babylonMaterial instanceof OpenPBRMaterial) {
|
|
45
|
+
if (babylonMaterial.transmissionWeight > 0 || babylonMaterial.subsurfaceWeight > 0) {
|
|
46
|
+
if (babylonMaterial.geometryThicknessTexture) {
|
|
47
|
+
additionalTextures.push(babylonMaterial.geometryThicknessTexture);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return additionalTextures;
|
|
52
|
+
}
|
|
53
|
+
_isExtensionEnabled(mat) {
|
|
54
|
+
// This extension must not be used on a material that also uses KHR_materials_unlit
|
|
55
|
+
if (mat.unlit) {
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
const subs = mat.subSurface;
|
|
59
|
+
// this extension requires either the KHR_materials_transmission or KHR_materials_diffuse_transmission extensions.
|
|
60
|
+
if (!subs.isRefractionEnabled && !subs.isTranslucencyEnabled) {
|
|
61
|
+
return false;
|
|
62
|
+
}
|
|
63
|
+
return ((subs.maximumThickness != undefined && subs.maximumThickness != 0) ||
|
|
64
|
+
(subs.tintColorAtDistance != undefined && subs.tintColorAtDistance != Number.POSITIVE_INFINITY) ||
|
|
65
|
+
(subs.tintColor != undefined && subs.tintColor != Color3.White()) ||
|
|
66
|
+
this._hasTexturesExtension(mat));
|
|
67
|
+
}
|
|
68
|
+
_hasTexturesExtension(mat) {
|
|
69
|
+
return mat.subSurface.thicknessTexture != null;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* After exporting a material
|
|
73
|
+
* @param context GLTF context of the material
|
|
74
|
+
* @param node exported GLTF node
|
|
75
|
+
* @param babylonMaterial corresponding babylon material
|
|
76
|
+
* @returns promise that resolves with the updated node
|
|
77
|
+
*/
|
|
78
|
+
// eslint-disable-next-line no-restricted-syntax
|
|
79
|
+
postExportMaterialAsync(context, node, babylonMaterial) {
|
|
80
|
+
return new Promise((resolve) => {
|
|
81
|
+
if (babylonMaterial instanceof PBRMaterial && this._isExtensionEnabled(babylonMaterial)) {
|
|
82
|
+
this._wasUsed = true;
|
|
83
|
+
const subs = babylonMaterial.subSurface;
|
|
84
|
+
const thicknessFactor = subs.maximumThickness == 0 ? undefined : subs.maximumThickness;
|
|
85
|
+
const thicknessTexture = this._exporter._materialExporter.getTextureInfo(subs.thicknessTexture) ?? undefined;
|
|
86
|
+
const attenuationDistance = subs.tintColorAtDistance == Number.POSITIVE_INFINITY ? undefined : subs.tintColorAtDistance;
|
|
87
|
+
const attenuationColor = subs.tintColor.equalsFloats(1.0, 1.0, 1.0) ? undefined : subs.tintColor.asArray();
|
|
88
|
+
const volumeInfo = {
|
|
89
|
+
thicknessFactor: thicknessFactor,
|
|
90
|
+
thicknessTexture: thicknessTexture,
|
|
91
|
+
attenuationDistance: attenuationDistance,
|
|
92
|
+
attenuationColor: attenuationColor,
|
|
93
|
+
};
|
|
94
|
+
if (this._hasTexturesExtension(babylonMaterial)) {
|
|
95
|
+
this._exporter._materialNeedsUVsSet.add(babylonMaterial);
|
|
96
|
+
}
|
|
97
|
+
node.extensions = node.extensions || {};
|
|
98
|
+
node.extensions[NAME] = volumeInfo;
|
|
99
|
+
}
|
|
100
|
+
else if (babylonMaterial instanceof OpenPBRMaterial) {
|
|
101
|
+
const transmissionVolume = babylonMaterial.transmissionWeight > 0 && !babylonMaterial.geometryThinWalled;
|
|
102
|
+
const subsurfaceVolume = babylonMaterial.subsurfaceWeight > 0 && !babylonMaterial.geometryThinWalled;
|
|
103
|
+
if (transmissionVolume || subsurfaceVolume) {
|
|
104
|
+
this._wasUsed = true;
|
|
105
|
+
const thicknessFactor = babylonMaterial.geometryThickness;
|
|
106
|
+
const thicknessTexture = this._exporter._materialExporter.getTextureInfo(babylonMaterial.geometryThicknessTexture) ?? undefined;
|
|
107
|
+
if (thicknessTexture) {
|
|
108
|
+
this._exporter._materialNeedsUVsSet.add(babylonMaterial);
|
|
109
|
+
}
|
|
110
|
+
let transmissionAttenuationDistance;
|
|
111
|
+
const transmissionAttenuationColor = Color3.White().asArray();
|
|
112
|
+
if (transmissionVolume && babylonMaterial.transmissionDepth > 0) {
|
|
113
|
+
const invDepth = 1.0 / babylonMaterial.transmissionDepth;
|
|
114
|
+
let transmissionExtinctionCoefficient = new Vector3(-Math.log(babylonMaterial.transmissionColor.r) * invDepth, -Math.log(babylonMaterial.transmissionColor.g) * invDepth, -Math.log(babylonMaterial.transmissionColor.b) * invDepth);
|
|
115
|
+
const transmissionScatteringCoefficient = new Vector3(babylonMaterial.transmissionScatter.r * invDepth, babylonMaterial.transmissionScatter.g * invDepth, babylonMaterial.transmissionScatter.b * invDepth);
|
|
116
|
+
const transmissionAbsorptionCoefficient = transmissionExtinctionCoefficient.subtract(transmissionScatteringCoefficient);
|
|
117
|
+
const minCoeff = Math.min(transmissionAbsorptionCoefficient.x, transmissionAbsorptionCoefficient.y, transmissionAbsorptionCoefficient.z);
|
|
118
|
+
if (minCoeff < 0) {
|
|
119
|
+
transmissionAbsorptionCoefficient.x = transmissionAbsorptionCoefficient.x - minCoeff;
|
|
120
|
+
transmissionAbsorptionCoefficient.y = transmissionAbsorptionCoefficient.y - minCoeff;
|
|
121
|
+
transmissionAbsorptionCoefficient.z = transmissionAbsorptionCoefficient.z - minCoeff;
|
|
122
|
+
}
|
|
123
|
+
transmissionExtinctionCoefficient = transmissionAbsorptionCoefficient.add(transmissionScatteringCoefficient);
|
|
124
|
+
const maxCoeff = Math.max(transmissionExtinctionCoefficient.x, transmissionExtinctionCoefficient.y, transmissionExtinctionCoefficient.z);
|
|
125
|
+
transmissionAttenuationDistance = 1.0 / maxCoeff;
|
|
126
|
+
transmissionAttenuationColor[0] = Math.exp(-transmissionExtinctionCoefficient.x * transmissionAttenuationDistance);
|
|
127
|
+
transmissionAttenuationColor[1] = Math.exp(-transmissionExtinctionCoefficient.y * transmissionAttenuationDistance);
|
|
128
|
+
transmissionAttenuationColor[2] = Math.exp(-transmissionExtinctionCoefficient.z * transmissionAttenuationDistance);
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
// transmissionDepth == 0
|
|
132
|
+
transmissionAttenuationDistance = Number.MAX_VALUE;
|
|
133
|
+
transmissionAttenuationColor[0] = 1.0;
|
|
134
|
+
transmissionAttenuationColor[1] = 1.0;
|
|
135
|
+
transmissionAttenuationColor[2] = 1.0;
|
|
136
|
+
}
|
|
137
|
+
let subsurfaceAttenuationDistance = 1;
|
|
138
|
+
const subsurfaceAttenuationColor = Color3.White().asArray();
|
|
139
|
+
if (subsurfaceVolume) {
|
|
140
|
+
const r = babylonMaterial.subsurfaceRadius;
|
|
141
|
+
const radiusScale = babylonMaterial.subsurfaceRadiusScale;
|
|
142
|
+
const mfp = new Vector3(radiusScale.r, radiusScale.g, radiusScale.b).multiplyByFloats(r, r, r);
|
|
143
|
+
const extinctionCoeff = new Vector3(1.0 / Math.max(mfp.x, 1e-6), 1.0 / Math.max(mfp.y, 1e-6), 1.0 / Math.max(mfp.z, 1e-6));
|
|
144
|
+
const maxCoeff = Math.max(extinctionCoeff.x, extinctionCoeff.y, extinctionCoeff.z);
|
|
145
|
+
subsurfaceAttenuationDistance = 1.0 / maxCoeff;
|
|
146
|
+
subsurfaceAttenuationColor[0] = Math.exp(-extinctionCoeff.x * subsurfaceAttenuationDistance);
|
|
147
|
+
subsurfaceAttenuationColor[1] = Math.exp(-extinctionCoeff.y * subsurfaceAttenuationDistance);
|
|
148
|
+
subsurfaceAttenuationColor[2] = Math.exp(-extinctionCoeff.z * subsurfaceAttenuationDistance);
|
|
149
|
+
}
|
|
150
|
+
const subsurfaceFractionOfDielectric = (1.0 - babylonMaterial.transmissionWeight) * babylonMaterial.subsurfaceWeight;
|
|
151
|
+
const subsurfaceAndTransmissionFractionOfDielectric = subsurfaceFractionOfDielectric + babylonMaterial.transmissionWeight;
|
|
152
|
+
const reciprocalOfSubsurfaceAndTransmissionFractionOfDielectric = 1.0 / Math.max(subsurfaceAndTransmissionFractionOfDielectric, 1e-6);
|
|
153
|
+
const transWeight = babylonMaterial.transmissionWeight * reciprocalOfSubsurfaceAndTransmissionFractionOfDielectric;
|
|
154
|
+
const subsurfWeight = subsurfaceFractionOfDielectric * reciprocalOfSubsurfaceAndTransmissionFractionOfDielectric;
|
|
155
|
+
const attenuationColor = transmissionAttenuationColor.map((c, i) => c * transWeight + subsurfaceAttenuationColor[i] * subsurfWeight);
|
|
156
|
+
const attenuationDistance = transmissionAttenuationDistance * transWeight + subsurfaceAttenuationDistance * subsurfWeight;
|
|
157
|
+
const volumeInfo = {
|
|
158
|
+
thicknessFactor: thicknessFactor,
|
|
159
|
+
thicknessTexture: thicknessTexture,
|
|
160
|
+
attenuationDistance: attenuationDistance,
|
|
161
|
+
attenuationColor: attenuationColor,
|
|
162
|
+
};
|
|
163
|
+
node.extensions = node.extensions || {};
|
|
164
|
+
node.extensions[NAME] = volumeInfo;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
resolve(node);
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
let _Registered = false;
|
|
172
|
+
/**
|
|
173
|
+
* Registers the KHR_materials_volume glTF serializer extension with the {@link GLTFExporter}.
|
|
174
|
+
* Safe to call multiple times; only the first call has an effect.
|
|
175
|
+
*/
|
|
176
|
+
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
177
|
+
export function RegisterKHR_materials_volume() {
|
|
178
|
+
if (_Registered) {
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
_Registered = true;
|
|
182
|
+
GLTFExporter.RegisterExtension(NAME, (exporter) => new KHR_materials_volume(exporter));
|
|
183
|
+
}
|
|
184
|
+
//# sourceMappingURL=KHR_materials_volume.pure.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"KHR_materials_volume.pure.js","sourceRoot":"","sources":["../../../../../../dev/serializers/src/glTF/2.0/Extensions/KHR_materials_volume.pure.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/C,OAAO,EAAE,WAAW,EAAE,MAAM,qCAAqC,CAAC;AAElE,OAAO,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,yCAAyC,CAAC;AAE1E,MAAM,IAAI,GAAG,sBAAsB,CAAC;AAEpC;;GAEG;AACH,gEAAgE;AAChE,MAAM,OAAO,oBAAoB;IAc7B,YAAY,QAAsB;QAblC,6BAA6B;QACb,SAAI,GAAG,IAAI,CAAC;QAE5B,gDAAgD;QACzC,YAAO,GAAG,IAAI,CAAC;QAEtB,iDAAiD;QAC1C,aAAQ,GAAG,KAAK,CAAC;QAIhB,aAAQ,GAAG,KAAK,CAAC;QAGrB,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;IAC9B,CAAC;IAEM,OAAO,KAAI,CAAC;IAEnB,gBAAgB;IAChB,IAAW,OAAO;QACd,OAAO,IAAI,CAAC,QAAQ,CAAC;IACzB,CAAC;IAED;;;;;;OAMG;IACI,KAAK,CAAC,yCAAyC,CAAE,OAAe,EAAE,IAAe,EAAE,eAAyB;QAC/G,MAAM,kBAAkB,GAAkB,EAAE,CAAC;QAE7C,IAAI,eAAe,YAAY,WAAW,EAAE,CAAC;YACzC,IAAI,IAAI,CAAC,mBAAmB,CAAC,eAAe,CAAC,EAAE,CAAC;gBAC5C,IAAI,eAAe,CAAC,UAAU,CAAC,gBAAgB,EAAE,CAAC;oBAC9C,kBAAkB,CAAC,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC;gBACzE,CAAC;gBACD,OAAO,kBAAkB,CAAC;YAC9B,CAAC;QACL,CAAC;aAAM,IAAI,eAAe,YAAY,eAAe,EAAE,CAAC;YACpD,IAAI,eAAe,CAAC,kBAAkB,GAAG,CAAC,IAAI,eAAe,CAAC,gBAAgB,GAAG,CAAC,EAAE,CAAC;gBACjF,IAAI,eAAe,CAAC,wBAAwB,EAAE,CAAC;oBAC3C,kBAAkB,CAAC,IAAI,CAAC,eAAe,CAAC,wBAAwB,CAAC,CAAC;gBACtE,CAAC;YACL,CAAC;QACL,CAAC;QAED,OAAO,kBAAkB,CAAC;IAC9B,CAAC;IAEO,mBAAmB,CAAC,GAAgB;QACxC,mFAAmF;QACnF,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;YACZ,OAAO,KAAK,CAAC;QACjB,CAAC;QACD,MAAM,IAAI,GAAG,GAAG,CAAC,UAAU,CAAC;QAC5B,kHAAkH;QAClH,IAAI,CAAC,IAAI,CAAC,mBAAmB,IAAI,CAAC,IAAI,CAAC,qBAAqB,EAAE,CAAC;YAC3D,OAAO,KAAK,CAAC;QACjB,CAAC;QACD,OAAO,CACH,CAAC,IAAI,CAAC,gBAAgB,IAAI,SAAS,IAAI,IAAI,CAAC,gBAAgB,IAAI,CAAC,CAAC;YAClE,CAAC,IAAI,CAAC,mBAAmB,IAAI,SAAS,IAAI,IAAI,CAAC,mBAAmB,IAAI,MAAM,CAAC,iBAAiB,CAAC;YAC/F,CAAC,IAAI,CAAC,SAAS,IAAI,SAAS,IAAI,IAAI,CAAC,SAAS,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YACjE,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,CAClC,CAAC;IACN,CAAC;IAEO,qBAAqB,CAAC,GAAgB;QAC1C,OAAO,GAAG,CAAC,UAAU,CAAC,gBAAgB,IAAI,IAAI,CAAC;IACnD,CAAC;IAED;;;;;;OAMG;IACH,gDAAgD;IACzC,uBAAuB,CAAE,OAAe,EAAE,IAAe,EAAE,eAAyB;QACvF,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC3B,IAAI,eAAe,YAAY,WAAW,IAAI,IAAI,CAAC,mBAAmB,CAAC,eAAe,CAAC,EAAE,CAAC;gBACtF,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;gBAErB,MAAM,IAAI,GAAG,eAAe,CAAC,UAAU,CAAC;gBACxC,MAAM,eAAe,GAAG,IAAI,CAAC,gBAAgB,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC;gBACvF,MAAM,gBAAgB,GAAG,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC,cAAc,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,SAAS,CAAC;gBAC7G,MAAM,mBAAmB,GAAG,IAAI,CAAC,mBAAmB,IAAI,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC;gBACxH,MAAM,gBAAgB,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;gBAE3G,MAAM,UAAU,GAAwB;oBACpC,eAAe,EAAE,eAAe;oBAChC,gBAAgB,EAAE,gBAAgB;oBAClC,mBAAmB,EAAE,mBAAmB;oBACxC,gBAAgB,EAAE,gBAAgB;iBACrC,CAAC;gBAEF,IAAI,IAAI,CAAC,qBAAqB,CAAC,eAAe,CAAC,EAAE,CAAC;oBAC9C,IAAI,CAAC,SAAS,CAAC,oBAAoB,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;gBAC7D,CAAC;gBAED,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC;gBACxC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC;YACvC,CAAC;iBAAM,IAAI,eAAe,YAAY,eAAe,EAAE,CAAC;gBACpD,MAAM,kBAAkB,GAAG,eAAe,CAAC,kBAAkB,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,kBAAkB,CAAC;gBACzG,MAAM,gBAAgB,GAAG,eAAe,CAAC,gBAAgB,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,kBAAkB,CAAC;gBACrG,IAAI,kBAAkB,IAAI,gBAAgB,EAAE,CAAC;oBACzC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;oBAErB,MAAM,eAAe,GAAG,eAAe,CAAC,iBAAiB,CAAC;oBAC1D,MAAM,gBAAgB,GAAG,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC,cAAc,CAAC,eAAe,CAAC,wBAAwB,CAAC,IAAI,SAAS,CAAC;oBAChI,IAAI,gBAAgB,EAAE,CAAC;wBACnB,IAAI,CAAC,SAAS,CAAC,oBAAoB,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;oBAC7D,CAAC;oBACD,IAAI,+BAA+B,CAAC;oBACpC,MAAM,4BAA4B,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,CAAC;oBAC9D,IAAI,kBAAkB,IAAI,eAAe,CAAC,iBAAiB,GAAG,CAAC,EAAE,CAAC;wBAC9D,MAAM,QAAQ,GAAG,GAAG,GAAG,eAAe,CAAC,iBAAiB,CAAC;wBACzD,IAAI,iCAAiC,GAAG,IAAI,OAAO,CAC/C,CAAC,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,iBAAiB,CAAC,CAAC,CAAC,GAAG,QAAQ,EACzD,CAAC,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,iBAAiB,CAAC,CAAC,CAAC,GAAG,QAAQ,EACzD,CAAC,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,iBAAiB,CAAC,CAAC,CAAC,GAAG,QAAQ,CAC5D,CAAC;wBACF,MAAM,iCAAiC,GAAG,IAAI,OAAO,CACjD,eAAe,CAAC,mBAAmB,CAAC,CAAC,GAAG,QAAQ,EAChD,eAAe,CAAC,mBAAmB,CAAC,CAAC,GAAG,QAAQ,EAChD,eAAe,CAAC,mBAAmB,CAAC,CAAC,GAAG,QAAQ,CACnD,CAAC;wBACF,MAAM,iCAAiC,GAAG,iCAAiC,CAAC,QAAQ,CAAC,iCAAiC,CAAC,CAAC;wBACxH,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC,EAAE,iCAAiC,CAAC,CAAC,EAAE,iCAAiC,CAAC,CAAC,CAAC,CAAC;wBACzI,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;4BACf,iCAAiC,CAAC,CAAC,GAAG,iCAAiC,CAAC,CAAC,GAAG,QAAQ,CAAC;4BACrF,iCAAiC,CAAC,CAAC,GAAG,iCAAiC,CAAC,CAAC,GAAG,QAAQ,CAAC;4BACrF,iCAAiC,CAAC,CAAC,GAAG,iCAAiC,CAAC,CAAC,GAAG,QAAQ,CAAC;wBACzF,CAAC;wBACD,iCAAiC,GAAG,iCAAiC,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;wBAC7G,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC,EAAE,iCAAiC,CAAC,CAAC,EAAE,iCAAiC,CAAC,CAAC,CAAC,CAAC;wBACzI,+BAA+B,GAAG,GAAG,GAAG,QAAQ,CAAC;wBACjD,4BAA4B,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,iCAAiC,CAAC,CAAC,GAAG,+BAA+B,CAAC,CAAC;wBACnH,4BAA4B,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,iCAAiC,CAAC,CAAC,GAAG,+BAA+B,CAAC,CAAC;wBACnH,4BAA4B,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,iCAAiC,CAAC,CAAC,GAAG,+BAA+B,CAAC,CAAC;oBACvH,CAAC;yBAAM,CAAC;wBACJ,yBAAyB;wBACzB,+BAA+B,GAAG,MAAM,CAAC,SAAS,CAAC;wBACnD,4BAA4B,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;wBACtC,4BAA4B,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;wBACtC,4BAA4B,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;oBAC1C,CAAC;oBACD,IAAI,6BAA6B,GAAG,CAAC,CAAC;oBACtC,MAAM,0BAA0B,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,CAAC;oBAC5D,IAAI,gBAAgB,EAAE,CAAC;wBACnB,MAAM,CAAC,GAAG,eAAe,CAAC,gBAAgB,CAAC;wBAC3C,MAAM,WAAW,GAAG,eAAe,CAAC,qBAAqB,CAAC;wBAC1D,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,WAAW,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;wBAC/F,MAAM,eAAe,GAAG,IAAI,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;wBAC3H,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC;wBACnF,6BAA6B,GAAG,GAAG,GAAG,QAAQ,CAAC;wBAC/C,0BAA0B,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,eAAe,CAAC,CAAC,GAAG,6BAA6B,CAAC,CAAC;wBAC7F,0BAA0B,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,eAAe,CAAC,CAAC,GAAG,6BAA6B,CAAC,CAAC;wBAC7F,0BAA0B,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,eAAe,CAAC,CAAC,GAAG,6BAA6B,CAAC,CAAC;oBACjG,CAAC;oBAED,MAAM,8BAA8B,GAAG,CAAC,GAAG,GAAG,eAAe,CAAC,kBAAkB,CAAC,GAAG,eAAe,CAAC,gBAAgB,CAAC;oBACrH,MAAM,6CAA6C,GAAG,8BAA8B,GAAG,eAAe,CAAC,kBAAkB,CAAC;oBAC1H,MAAM,yDAAyD,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,6CAA6C,EAAE,IAAI,CAAC,CAAC;oBACtI,MAAM,WAAW,GAAG,eAAe,CAAC,kBAAkB,GAAG,yDAAyD,CAAC;oBACnH,MAAM,aAAa,GAAG,8BAA8B,GAAG,yDAAyD,CAAC;oBAEjH,MAAM,gBAAgB,GAAG,4BAA4B,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,WAAW,GAAG,0BAA0B,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC,CAAC;oBACrI,MAAM,mBAAmB,GAAG,+BAA+B,GAAG,WAAW,GAAG,6BAA6B,GAAG,aAAa,CAAC;oBAE1H,MAAM,UAAU,GAAwB;wBACpC,eAAe,EAAE,eAAe;wBAChC,gBAAgB,EAAE,gBAAgB;wBAClC,mBAAmB,EAAE,mBAAmB;wBACxC,gBAAgB,EAAE,gBAAgB;qBACrC,CAAC;oBACF,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC;oBACxC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC;gBACvC,CAAC;YACL,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;IACP,CAAC;CACJ;AAED,IAAI,WAAW,GAAG,KAAK,CAAC;AACxB;;;GAGG;AACH,gEAAgE;AAChE,MAAM,UAAU,4BAA4B;IACxC,IAAI,WAAW,EAAE,CAAC;QACd,OAAO;IACX,CAAC;IACD,WAAW,GAAG,IAAI,CAAC;IAEnB,YAAY,CAAC,iBAAiB,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAI,oBAAoB,CAAC,QAAQ,CAAC,CAAC,CAAC;AAC3F,CAAC","sourcesContent":["import { type IMaterial, type IKHRMaterialsVolume } from \"babylonjs-gltf2interface\";\r\nimport { type IGLTFExporterExtensionV2 } from \"../glTFExporterExtension\";\r\nimport { GLTFExporter } from \"../glTFExporter\";\r\nimport { type Material } from \"core/Materials/material\";\r\nimport { PBRMaterial } from \"core/Materials/PBR/pbrMaterial.pure\";\r\nimport { type BaseTexture } from \"core/Materials/Textures/baseTexture\";\r\nimport { Color3 } from \"core/Maths/math.color.pure\";\r\nimport { Vector3 } from \"core/Maths/math.vector.pure\";\r\nimport { OpenPBRMaterial } from \"core/Materials/PBR/openpbrMaterial.pure\";\r\n\r\nconst NAME = \"KHR_materials_volume\";\r\n\r\n/**\r\n * [Specification](https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Khronos/KHR_materials_volume/README.md)\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport class KHR_materials_volume implements IGLTFExporterExtensionV2 {\r\n /** Name of this extension */\r\n public readonly name = NAME;\r\n\r\n /** Defines whether this extension is enabled */\r\n public enabled = true;\r\n\r\n /** Defines whether this extension is required */\r\n public required = false;\r\n\r\n private _exporter: GLTFExporter;\r\n\r\n private _wasUsed = false;\r\n\r\n constructor(exporter: GLTFExporter) {\r\n this._exporter = exporter;\r\n }\r\n\r\n public dispose() {}\r\n\r\n /** @internal */\r\n public get wasUsed() {\r\n return this._wasUsed;\r\n }\r\n\r\n /**\r\n * After exporting a material, deal with additional textures\r\n * @param context GLTF context of the material\r\n * @param node exported GLTF node\r\n * @param babylonMaterial corresponding babylon material\r\n * @returns array of additional textures to export\r\n */\r\n public async postExportMaterialAdditionalTexturesAsync?(context: string, node: IMaterial, babylonMaterial: Material): Promise<BaseTexture[]> {\r\n const additionalTextures: BaseTexture[] = [];\r\n\r\n if (babylonMaterial instanceof PBRMaterial) {\r\n if (this._isExtensionEnabled(babylonMaterial)) {\r\n if (babylonMaterial.subSurface.thicknessTexture) {\r\n additionalTextures.push(babylonMaterial.subSurface.thicknessTexture);\r\n }\r\n return additionalTextures;\r\n }\r\n } else if (babylonMaterial instanceof OpenPBRMaterial) {\r\n if (babylonMaterial.transmissionWeight > 0 || babylonMaterial.subsurfaceWeight > 0) {\r\n if (babylonMaterial.geometryThicknessTexture) {\r\n additionalTextures.push(babylonMaterial.geometryThicknessTexture);\r\n }\r\n }\r\n }\r\n\r\n return additionalTextures;\r\n }\r\n\r\n private _isExtensionEnabled(mat: PBRMaterial): boolean {\r\n // This extension must not be used on a material that also uses KHR_materials_unlit\r\n if (mat.unlit) {\r\n return false;\r\n }\r\n const subs = mat.subSurface;\r\n // this extension requires either the KHR_materials_transmission or KHR_materials_diffuse_transmission extensions.\r\n if (!subs.isRefractionEnabled && !subs.isTranslucencyEnabled) {\r\n return false;\r\n }\r\n return (\r\n (subs.maximumThickness != undefined && subs.maximumThickness != 0) ||\r\n (subs.tintColorAtDistance != undefined && subs.tintColorAtDistance != Number.POSITIVE_INFINITY) ||\r\n (subs.tintColor != undefined && subs.tintColor != Color3.White()) ||\r\n this._hasTexturesExtension(mat)\r\n );\r\n }\r\n\r\n private _hasTexturesExtension(mat: PBRMaterial): boolean {\r\n return mat.subSurface.thicknessTexture != null;\r\n }\r\n\r\n /**\r\n * After exporting a material\r\n * @param context GLTF context of the material\r\n * @param node exported GLTF node\r\n * @param babylonMaterial corresponding babylon material\r\n * @returns promise that resolves with the updated node\r\n */\r\n // eslint-disable-next-line no-restricted-syntax\r\n public postExportMaterialAsync?(context: string, node: IMaterial, babylonMaterial: Material): Promise<IMaterial> {\r\n return new Promise((resolve) => {\r\n if (babylonMaterial instanceof PBRMaterial && this._isExtensionEnabled(babylonMaterial)) {\r\n this._wasUsed = true;\r\n\r\n const subs = babylonMaterial.subSurface;\r\n const thicknessFactor = subs.maximumThickness == 0 ? undefined : subs.maximumThickness;\r\n const thicknessTexture = this._exporter._materialExporter.getTextureInfo(subs.thicknessTexture) ?? undefined;\r\n const attenuationDistance = subs.tintColorAtDistance == Number.POSITIVE_INFINITY ? undefined : subs.tintColorAtDistance;\r\n const attenuationColor = subs.tintColor.equalsFloats(1.0, 1.0, 1.0) ? undefined : subs.tintColor.asArray();\r\n\r\n const volumeInfo: IKHRMaterialsVolume = {\r\n thicknessFactor: thicknessFactor,\r\n thicknessTexture: thicknessTexture,\r\n attenuationDistance: attenuationDistance,\r\n attenuationColor: attenuationColor,\r\n };\r\n\r\n if (this._hasTexturesExtension(babylonMaterial)) {\r\n this._exporter._materialNeedsUVsSet.add(babylonMaterial);\r\n }\r\n\r\n node.extensions = node.extensions || {};\r\n node.extensions[NAME] = volumeInfo;\r\n } else if (babylonMaterial instanceof OpenPBRMaterial) {\r\n const transmissionVolume = babylonMaterial.transmissionWeight > 0 && !babylonMaterial.geometryThinWalled;\r\n const subsurfaceVolume = babylonMaterial.subsurfaceWeight > 0 && !babylonMaterial.geometryThinWalled;\r\n if (transmissionVolume || subsurfaceVolume) {\r\n this._wasUsed = true;\r\n\r\n const thicknessFactor = babylonMaterial.geometryThickness;\r\n const thicknessTexture = this._exporter._materialExporter.getTextureInfo(babylonMaterial.geometryThicknessTexture) ?? undefined;\r\n if (thicknessTexture) {\r\n this._exporter._materialNeedsUVsSet.add(babylonMaterial);\r\n }\r\n let transmissionAttenuationDistance;\r\n const transmissionAttenuationColor = Color3.White().asArray();\r\n if (transmissionVolume && babylonMaterial.transmissionDepth > 0) {\r\n const invDepth = 1.0 / babylonMaterial.transmissionDepth;\r\n let transmissionExtinctionCoefficient = new Vector3(\r\n -Math.log(babylonMaterial.transmissionColor.r) * invDepth,\r\n -Math.log(babylonMaterial.transmissionColor.g) * invDepth,\r\n -Math.log(babylonMaterial.transmissionColor.b) * invDepth\r\n );\r\n const transmissionScatteringCoefficient = new Vector3(\r\n babylonMaterial.transmissionScatter.r * invDepth,\r\n babylonMaterial.transmissionScatter.g * invDepth,\r\n babylonMaterial.transmissionScatter.b * invDepth\r\n );\r\n const transmissionAbsorptionCoefficient = transmissionExtinctionCoefficient.subtract(transmissionScatteringCoefficient);\r\n const minCoeff = Math.min(transmissionAbsorptionCoefficient.x, transmissionAbsorptionCoefficient.y, transmissionAbsorptionCoefficient.z);\r\n if (minCoeff < 0) {\r\n transmissionAbsorptionCoefficient.x = transmissionAbsorptionCoefficient.x - minCoeff;\r\n transmissionAbsorptionCoefficient.y = transmissionAbsorptionCoefficient.y - minCoeff;\r\n transmissionAbsorptionCoefficient.z = transmissionAbsorptionCoefficient.z - minCoeff;\r\n }\r\n transmissionExtinctionCoefficient = transmissionAbsorptionCoefficient.add(transmissionScatteringCoefficient);\r\n const maxCoeff = Math.max(transmissionExtinctionCoefficient.x, transmissionExtinctionCoefficient.y, transmissionExtinctionCoefficient.z);\r\n transmissionAttenuationDistance = 1.0 / maxCoeff;\r\n transmissionAttenuationColor[0] = Math.exp(-transmissionExtinctionCoefficient.x * transmissionAttenuationDistance);\r\n transmissionAttenuationColor[1] = Math.exp(-transmissionExtinctionCoefficient.y * transmissionAttenuationDistance);\r\n transmissionAttenuationColor[2] = Math.exp(-transmissionExtinctionCoefficient.z * transmissionAttenuationDistance);\r\n } else {\r\n // transmissionDepth == 0\r\n transmissionAttenuationDistance = Number.MAX_VALUE;\r\n transmissionAttenuationColor[0] = 1.0;\r\n transmissionAttenuationColor[1] = 1.0;\r\n transmissionAttenuationColor[2] = 1.0;\r\n }\r\n let subsurfaceAttenuationDistance = 1;\r\n const subsurfaceAttenuationColor = Color3.White().asArray();\r\n if (subsurfaceVolume) {\r\n const r = babylonMaterial.subsurfaceRadius;\r\n const radiusScale = babylonMaterial.subsurfaceRadiusScale;\r\n const mfp = new Vector3(radiusScale.r, radiusScale.g, radiusScale.b).multiplyByFloats(r, r, r);\r\n const extinctionCoeff = new Vector3(1.0 / Math.max(mfp.x, 1e-6), 1.0 / Math.max(mfp.y, 1e-6), 1.0 / Math.max(mfp.z, 1e-6));\r\n const maxCoeff = Math.max(extinctionCoeff.x, extinctionCoeff.y, extinctionCoeff.z);\r\n subsurfaceAttenuationDistance = 1.0 / maxCoeff;\r\n subsurfaceAttenuationColor[0] = Math.exp(-extinctionCoeff.x * subsurfaceAttenuationDistance);\r\n subsurfaceAttenuationColor[1] = Math.exp(-extinctionCoeff.y * subsurfaceAttenuationDistance);\r\n subsurfaceAttenuationColor[2] = Math.exp(-extinctionCoeff.z * subsurfaceAttenuationDistance);\r\n }\r\n\r\n const subsurfaceFractionOfDielectric = (1.0 - babylonMaterial.transmissionWeight) * babylonMaterial.subsurfaceWeight;\r\n const subsurfaceAndTransmissionFractionOfDielectric = subsurfaceFractionOfDielectric + babylonMaterial.transmissionWeight;\r\n const reciprocalOfSubsurfaceAndTransmissionFractionOfDielectric = 1.0 / Math.max(subsurfaceAndTransmissionFractionOfDielectric, 1e-6);\r\n const transWeight = babylonMaterial.transmissionWeight * reciprocalOfSubsurfaceAndTransmissionFractionOfDielectric;\r\n const subsurfWeight = subsurfaceFractionOfDielectric * reciprocalOfSubsurfaceAndTransmissionFractionOfDielectric;\r\n\r\n const attenuationColor = transmissionAttenuationColor.map((c, i) => c * transWeight + subsurfaceAttenuationColor[i] * subsurfWeight);\r\n const attenuationDistance = transmissionAttenuationDistance * transWeight + subsurfaceAttenuationDistance * subsurfWeight;\r\n\r\n const volumeInfo: IKHRMaterialsVolume = {\r\n thicknessFactor: thicknessFactor,\r\n thicknessTexture: thicknessTexture,\r\n attenuationDistance: attenuationDistance,\r\n attenuationColor: attenuationColor,\r\n };\r\n node.extensions = node.extensions || {};\r\n node.extensions[NAME] = volumeInfo;\r\n }\r\n }\r\n resolve(node);\r\n });\r\n }\r\n}\r\n\r\nlet _Registered = false;\r\n/**\r\n * Registers the KHR_materials_volume glTF serializer extension with the {@link GLTFExporter}.\r\n * Safe to call multiple times; only the first call has an effect.\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport function RegisterKHR_materials_volume(): void {\r\n if (_Registered) {\r\n return;\r\n }\r\n _Registered = true;\r\n\r\n GLTFExporter.RegisterExtension(NAME, (exporter) => new KHR_materials_volume(exporter));\r\n}\r\n"]}
|
|
@@ -1,40 +1,5 @@
|
|
|
1
|
-
import { type IMaterial } from "babylonjs-gltf2interface";
|
|
2
|
-
import { type IGLTFExporterExtensionV2 } from "../glTFExporterExtension.js";
|
|
3
|
-
import { GLTFExporter } from "../glTFExporter.js";
|
|
4
|
-
import { type Material } from "@babylonjs/core/Materials/material.js";
|
|
5
|
-
import { type BaseTexture } from "@babylonjs/core/Materials/Textures/baseTexture.js";
|
|
6
1
|
/**
|
|
7
|
-
*
|
|
8
|
-
*
|
|
2
|
+
* Re-exports the pure implementation and applies the runtime registration side effect.
|
|
3
|
+
* Import "./KHR_materials_volume_scatter.pure" for tree-shakeable, side-effect-free usage.
|
|
9
4
|
*/
|
|
10
|
-
export
|
|
11
|
-
/** Name of this extension */
|
|
12
|
-
readonly name = "KHR_materials_volume_scatter";
|
|
13
|
-
/** Defines whether this extension is enabled */
|
|
14
|
-
enabled: boolean;
|
|
15
|
-
/** Defines whether this extension is required */
|
|
16
|
-
required: boolean;
|
|
17
|
-
private _exporter;
|
|
18
|
-
private _wasUsed;
|
|
19
|
-
constructor(exporter: GLTFExporter);
|
|
20
|
-
dispose(): void;
|
|
21
|
-
/** @internal */
|
|
22
|
-
get wasUsed(): boolean;
|
|
23
|
-
/**
|
|
24
|
-
* After exporting a material, deal with additional textures
|
|
25
|
-
* @param context GLTF context of the material
|
|
26
|
-
* @param node exported GLTF node
|
|
27
|
-
* @param babylonMaterial corresponding babylon material
|
|
28
|
-
* @returns array of additional textures to export
|
|
29
|
-
*/
|
|
30
|
-
postExportMaterialAdditionalTexturesAsync?(context: string, node: IMaterial, babylonMaterial: Material): Promise<BaseTexture[]>;
|
|
31
|
-
private _isExtensionEnabled;
|
|
32
|
-
/**
|
|
33
|
-
* After exporting a material
|
|
34
|
-
* @param context GLTF context of the material
|
|
35
|
-
* @param node exported GLTF node
|
|
36
|
-
* @param babylonMaterial corresponding babylon material
|
|
37
|
-
* @returns promise that resolves with the updated node
|
|
38
|
-
*/
|
|
39
|
-
postExportMaterialAsync?(context: string, node: IMaterial, babylonMaterial: Material): Promise<IMaterial>;
|
|
40
|
-
}
|
|
5
|
+
export * from "./KHR_materials_volume_scatter.pure.js";
|