@onerjs/loaders 8.23.1
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/OBJ/index.d.ts +4 -0
- package/OBJ/index.js +5 -0
- package/OBJ/index.js.map +1 -0
- package/OBJ/mtlFileLoader.d.ts +41 -0
- package/OBJ/mtlFileLoader.js +231 -0
- package/OBJ/mtlFileLoader.js.map +1 -0
- package/OBJ/objFileLoader.d.ts +136 -0
- package/OBJ/objFileLoader.js +318 -0
- package/OBJ/objFileLoader.js.map +1 -0
- package/OBJ/objFileLoader.metadata.d.ts +4 -0
- package/OBJ/objFileLoader.metadata.js +5 -0
- package/OBJ/objFileLoader.metadata.js.map +1 -0
- package/OBJ/objLoadingOptions.d.ts +47 -0
- package/OBJ/objLoadingOptions.js +2 -0
- package/OBJ/objLoadingOptions.js.map +1 -0
- package/OBJ/solidParser.d.ts +174 -0
- package/OBJ/solidParser.js +862 -0
- package/OBJ/solidParser.js.map +1 -0
- package/SPLAT/index.d.ts +2 -0
- package/SPLAT/index.js +4 -0
- package/SPLAT/index.js.map +1 -0
- package/SPLAT/splatFileLoader.d.ts +88 -0
- package/SPLAT/splatFileLoader.js +562 -0
- package/SPLAT/splatFileLoader.js.map +1 -0
- package/SPLAT/splatFileLoader.metadata.d.ts +14 -0
- package/SPLAT/splatFileLoader.metadata.js +12 -0
- package/SPLAT/splatFileLoader.metadata.js.map +1 -0
- package/SPLAT/splatLoadingOptions.d.ts +13 -0
- package/SPLAT/splatLoadingOptions.js +2 -0
- package/SPLAT/splatLoadingOptions.js.map +1 -0
- package/STL/index.d.ts +1 -0
- package/STL/index.js +2 -0
- package/STL/index.js.map +1 -0
- package/STL/stlFileLoader.d.ts +78 -0
- package/STL/stlFileLoader.js +239 -0
- package/STL/stlFileLoader.js.map +1 -0
- package/STL/stlFileLoader.metadata.d.ts +8 -0
- package/STL/stlFileLoader.metadata.js +8 -0
- package/STL/stlFileLoader.metadata.js.map +1 -0
- package/bvh/bvhFileLoader.d.ts +69 -0
- package/bvh/bvhFileLoader.js +133 -0
- package/bvh/bvhFileLoader.js.map +1 -0
- package/bvh/bvhFileLoader.metadata.d.ts +8 -0
- package/bvh/bvhFileLoader.metadata.js +8 -0
- package/bvh/bvhFileLoader.metadata.js.map +1 -0
- package/bvh/bvhLoader.d.ts +14 -0
- package/bvh/bvhLoader.js +329 -0
- package/bvh/bvhLoader.js.map +1 -0
- package/bvh/bvhLoadingOptions.d.ts +9 -0
- package/bvh/bvhLoadingOptions.js +2 -0
- package/bvh/bvhLoadingOptions.js.map +1 -0
- package/bvh/index.d.ts +2 -0
- package/bvh/index.js +4 -0
- package/bvh/index.js.map +1 -0
- package/bvh/license.md +21 -0
- package/dynamic.d.ts +5 -0
- package/dynamic.js +57 -0
- package/dynamic.js.map +1 -0
- package/glTF/1.0/glTFBinaryExtension.d.ts +16 -0
- package/glTF/1.0/glTFBinaryExtension.js +65 -0
- package/glTF/1.0/glTFBinaryExtension.js.map +1 -0
- package/glTF/1.0/glTFLoader.d.ts +144 -0
- package/glTF/1.0/glTFLoader.js +1841 -0
- package/glTF/1.0/glTFLoader.js.map +1 -0
- package/glTF/1.0/glTFLoaderInterfaces.d.ts +412 -0
- package/glTF/1.0/glTFLoaderInterfaces.js +96 -0
- package/glTF/1.0/glTFLoaderInterfaces.js.map +1 -0
- package/glTF/1.0/glTFLoaderUtils.d.ts +71 -0
- package/glTF/1.0/glTFLoaderUtils.js +255 -0
- package/glTF/1.0/glTFLoaderUtils.js.map +1 -0
- package/glTF/1.0/glTFMaterialsCommonExtension.d.ts +13 -0
- package/glTF/1.0/glTFMaterialsCommonExtension.js +131 -0
- package/glTF/1.0/glTFMaterialsCommonExtension.js.map +1 -0
- package/glTF/1.0/index.d.ts +5 -0
- package/glTF/1.0/index.js +6 -0
- package/glTF/1.0/index.js.map +1 -0
- package/glTF/2.0/Extensions/EXT_lights_ies.d.ts +41 -0
- package/glTF/2.0/Extensions/EXT_lights_ies.js +84 -0
- package/glTF/2.0/Extensions/EXT_lights_ies.js.map +1 -0
- package/glTF/2.0/Extensions/EXT_lights_image_based.d.ts +48 -0
- package/glTF/2.0/Extensions/EXT_lights_image_based.js +116 -0
- package/glTF/2.0/Extensions/EXT_lights_image_based.js.map +1 -0
- package/glTF/2.0/Extensions/EXT_materials_diffuse_roughness.d.ts +43 -0
- package/glTF/2.0/Extensions/EXT_materials_diffuse_roughness.js +69 -0
- package/glTF/2.0/Extensions/EXT_materials_diffuse_roughness.js.map +1 -0
- package/glTF/2.0/Extensions/EXT_mesh_gpu_instancing.d.ts +39 -0
- package/glTF/2.0/Extensions/EXT_mesh_gpu_instancing.js +82 -0
- package/glTF/2.0/Extensions/EXT_mesh_gpu_instancing.js.map +1 -0
- package/glTF/2.0/Extensions/EXT_meshopt_compression.d.ts +39 -0
- package/glTF/2.0/Extensions/EXT_meshopt_compression.js +51 -0
- package/glTF/2.0/Extensions/EXT_meshopt_compression.js.map +1 -0
- package/glTF/2.0/Extensions/EXT_texture_avif.d.ts +34 -0
- package/glTF/2.0/Extensions/EXT_texture_avif.js +39 -0
- package/glTF/2.0/Extensions/EXT_texture_avif.js.map +1 -0
- package/glTF/2.0/Extensions/EXT_texture_webp.d.ts +33 -0
- package/glTF/2.0/Extensions/EXT_texture_webp.js +38 -0
- package/glTF/2.0/Extensions/EXT_texture_webp.js.map +1 -0
- package/glTF/2.0/Extensions/ExtrasAsMetadata.d.ts +48 -0
- package/glTF/2.0/Extensions/ExtrasAsMetadata.js +63 -0
- package/glTF/2.0/Extensions/ExtrasAsMetadata.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_animation_pointer.d.ts +47 -0
- package/glTF/2.0/Extensions/KHR_animation_pointer.data.d.ts +1 -0
- package/glTF/2.0/Extensions/KHR_animation_pointer.data.js +239 -0
- package/glTF/2.0/Extensions/KHR_animation_pointer.data.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_animation_pointer.js +78 -0
- package/glTF/2.0/Extensions/KHR_animation_pointer.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_draco_mesh_compression.d.ts +47 -0
- package/glTF/2.0/Extensions/KHR_draco_mesh_compression.js +93 -0
- package/glTF/2.0/Extensions/KHR_draco_mesh_compression.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_interactivity/declarationMapper.d.ts +352 -0
- package/glTF/2.0/Extensions/KHR_interactivity/declarationMapper.js +1700 -0
- package/glTF/2.0/Extensions/KHR_interactivity/declarationMapper.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_interactivity/flowGraphGLTFDataProvider.d.ts +33 -0
- package/glTF/2.0/Extensions/KHR_interactivity/flowGraphGLTFDataProvider.js +20 -0
- package/glTF/2.0/Extensions/KHR_interactivity/flowGraphGLTFDataProvider.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_interactivity/index.d.ts +3 -0
- package/glTF/2.0/Extensions/KHR_interactivity/index.js +4 -0
- package/glTF/2.0/Extensions/KHR_interactivity/index.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_interactivity/interactivityGraphParser.d.ts +70 -0
- package/glTF/2.0/Extensions/KHR_interactivity/interactivityGraphParser.js +450 -0
- package/glTF/2.0/Extensions/KHR_interactivity/interactivityGraphParser.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_interactivity.d.ts +38 -0
- package/glTF/2.0/Extensions/KHR_interactivity.js +151 -0
- package/glTF/2.0/Extensions/KHR_interactivity.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_lights_punctual.d.ts +41 -0
- package/glTF/2.0/Extensions/KHR_lights_punctual.js +92 -0
- package/glTF/2.0/Extensions/KHR_lights_punctual.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_materials_anisotropy.d.ts +42 -0
- package/glTF/2.0/Extensions/KHR_materials_anisotropy.js +61 -0
- package/glTF/2.0/Extensions/KHR_materials_anisotropy.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_materials_clearcoat.d.ts +43 -0
- package/glTF/2.0/Extensions/KHR_materials_clearcoat.js +94 -0
- package/glTF/2.0/Extensions/KHR_materials_clearcoat.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_materials_diffuse_transmission.d.ts +43 -0
- package/glTF/2.0/Extensions/KHR_materials_diffuse_transmission.js +95 -0
- package/glTF/2.0/Extensions/KHR_materials_diffuse_transmission.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_materials_dispersion.d.ts +43 -0
- package/glTF/2.0/Extensions/KHR_materials_dispersion.js +60 -0
- package/glTF/2.0/Extensions/KHR_materials_dispersion.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_materials_emissive_strength.d.ts +42 -0
- package/glTF/2.0/Extensions/KHR_materials_emissive_strength.js +52 -0
- package/glTF/2.0/Extensions/KHR_materials_emissive_strength.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_materials_ior.d.ts +46 -0
- package/glTF/2.0/Extensions/KHR_materials_ior.js +62 -0
- package/glTF/2.0/Extensions/KHR_materials_ior.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_materials_iridescence.d.ts +42 -0
- package/glTF/2.0/Extensions/KHR_materials_iridescence.js +71 -0
- package/glTF/2.0/Extensions/KHR_materials_iridescence.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_materials_pbrSpecularGlossiness.d.ts +42 -0
- package/glTF/2.0/Extensions/KHR_materials_pbrSpecularGlossiness.js +81 -0
- package/glTF/2.0/Extensions/KHR_materials_pbrSpecularGlossiness.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_materials_sheen.d.ts +43 -0
- package/glTF/2.0/Extensions/KHR_materials_sheen.js +85 -0
- package/glTF/2.0/Extensions/KHR_materials_sheen.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_materials_specular.d.ts +42 -0
- package/glTF/2.0/Extensions/KHR_materials_specular.js +85 -0
- package/glTF/2.0/Extensions/KHR_materials_specular.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_materials_transmission.d.ts +42 -0
- package/glTF/2.0/Extensions/KHR_materials_transmission.js +306 -0
- package/glTF/2.0/Extensions/KHR_materials_transmission.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_materials_unlit.d.ts +42 -0
- package/glTF/2.0/Extensions/KHR_materials_unlit.js +73 -0
- package/glTF/2.0/Extensions/KHR_materials_unlit.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_materials_variants.d.ts +112 -0
- package/glTF/2.0/Extensions/KHR_materials_variants.js +263 -0
- package/glTF/2.0/Extensions/KHR_materials_variants.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_materials_volume.d.ts +43 -0
- package/glTF/2.0/Extensions/KHR_materials_volume.js +86 -0
- package/glTF/2.0/Extensions/KHR_materials_volume.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_mesh_quantization.d.ts +29 -0
- package/glTF/2.0/Extensions/KHR_mesh_quantization.js +23 -0
- package/glTF/2.0/Extensions/KHR_mesh_quantization.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_node_hoverability.d.ts +31 -0
- package/glTF/2.0/Extensions/KHR_node_hoverability.js +190 -0
- package/glTF/2.0/Extensions/KHR_node_hoverability.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_node_selectability.d.ts +30 -0
- package/glTF/2.0/Extensions/KHR_node_selectability.js +124 -0
- package/glTF/2.0/Extensions/KHR_node_selectability.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_node_visibility.d.ts +30 -0
- package/glTF/2.0/Extensions/KHR_node_visibility.js +69 -0
- package/glTF/2.0/Extensions/KHR_node_visibility.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_texture_basisu.d.ts +33 -0
- package/glTF/2.0/Extensions/KHR_texture_basisu.js +38 -0
- package/glTF/2.0/Extensions/KHR_texture_basisu.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_texture_transform.d.ts +37 -0
- package/glTF/2.0/Extensions/KHR_texture_transform.js +59 -0
- package/glTF/2.0/Extensions/KHR_texture_transform.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_xmp_json_ld.d.ts +39 -0
- package/glTF/2.0/Extensions/KHR_xmp_json_ld.js +48 -0
- package/glTF/2.0/Extensions/KHR_xmp_json_ld.js.map +1 -0
- package/glTF/2.0/Extensions/MSFT_audio_emitter.d.ts +56 -0
- package/glTF/2.0/Extensions/MSFT_audio_emitter.js +227 -0
- package/glTF/2.0/Extensions/MSFT_audio_emitter.js.map +1 -0
- package/glTF/2.0/Extensions/MSFT_lod.d.ts +104 -0
- package/glTF/2.0/Extensions/MSFT_lod.js +338 -0
- package/glTF/2.0/Extensions/MSFT_lod.js.map +1 -0
- package/glTF/2.0/Extensions/MSFT_minecraftMesh.d.ts +27 -0
- package/glTF/2.0/Extensions/MSFT_minecraftMesh.js +41 -0
- package/glTF/2.0/Extensions/MSFT_minecraftMesh.js.map +1 -0
- package/glTF/2.0/Extensions/MSFT_sRGBFactors.d.ts +27 -0
- package/glTF/2.0/Extensions/MSFT_sRGBFactors.js +42 -0
- package/glTF/2.0/Extensions/MSFT_sRGBFactors.js.map +1 -0
- package/glTF/2.0/Extensions/dynamic.d.ts +4 -0
- package/glTF/2.0/Extensions/dynamic.js +156 -0
- package/glTF/2.0/Extensions/dynamic.js.map +1 -0
- package/glTF/2.0/Extensions/gltfPathToObjectConverter.d.ts +45 -0
- package/glTF/2.0/Extensions/gltfPathToObjectConverter.js +101 -0
- package/glTF/2.0/Extensions/gltfPathToObjectConverter.js.map +1 -0
- package/glTF/2.0/Extensions/index.d.ts +39 -0
- package/glTF/2.0/Extensions/index.js +41 -0
- package/glTF/2.0/Extensions/index.js.map +1 -0
- package/glTF/2.0/Extensions/objectModelMapping.d.ts +289 -0
- package/glTF/2.0/Extensions/objectModelMapping.js +828 -0
- package/glTF/2.0/Extensions/objectModelMapping.js.map +1 -0
- package/glTF/2.0/glTFLoader.d.ts +429 -0
- package/glTF/2.0/glTFLoader.js +2408 -0
- package/glTF/2.0/glTFLoader.js.map +1 -0
- package/glTF/2.0/glTFLoaderAnimation.d.ts +42 -0
- package/glTF/2.0/glTFLoaderAnimation.js +80 -0
- package/glTF/2.0/glTFLoaderAnimation.js.map +1 -0
- package/glTF/2.0/glTFLoaderExtension.d.ts +165 -0
- package/glTF/2.0/glTFLoaderExtension.js +2 -0
- package/glTF/2.0/glTFLoaderExtension.js.map +1 -0
- package/glTF/2.0/glTFLoaderExtensionRegistry.d.ts +25 -0
- package/glTF/2.0/glTFLoaderExtensionRegistry.js +33 -0
- package/glTF/2.0/glTFLoaderExtensionRegistry.js.map +1 -0
- package/glTF/2.0/glTFLoaderInterfaces.d.ts +257 -0
- package/glTF/2.0/glTFLoaderInterfaces.js +2 -0
- package/glTF/2.0/glTFLoaderInterfaces.js.map +1 -0
- package/glTF/2.0/index.d.ts +6 -0
- package/glTF/2.0/index.js +8 -0
- package/glTF/2.0/index.js.map +1 -0
- package/glTF/glTFFileLoader.d.ts +516 -0
- package/glTF/glTFFileLoader.js +968 -0
- package/glTF/glTFFileLoader.js.map +1 -0
- package/glTF/glTFFileLoader.metadata.d.ts +15 -0
- package/glTF/glTFFileLoader.metadata.js +18 -0
- package/glTF/glTFFileLoader.metadata.js.map +1 -0
- package/glTF/glTFValidation.d.ts +29 -0
- package/glTF/glTFValidation.js +126 -0
- package/glTF/glTFValidation.js.map +1 -0
- package/glTF/index.d.ts +5 -0
- package/glTF/index.js +7 -0
- package/glTF/index.js.map +1 -0
- package/index.d.ts +5 -0
- package/index.js +7 -0
- package/index.js.map +1 -0
- package/legacy/legacy-bvhFileLoader.d.ts +1 -0
- package/legacy/legacy-bvhFileLoader.js +16 -0
- package/legacy/legacy-bvhFileLoader.js.map +1 -0
- package/legacy/legacy-glTF.d.ts +2 -0
- package/legacy/legacy-glTF.js +19 -0
- package/legacy/legacy-glTF.js.map +1 -0
- package/legacy/legacy-glTF1.d.ts +2 -0
- package/legacy/legacy-glTF1.js +16 -0
- package/legacy/legacy-glTF1.js.map +1 -0
- package/legacy/legacy-glTF1FileLoader.d.ts +2 -0
- package/legacy/legacy-glTF1FileLoader.js +4 -0
- package/legacy/legacy-glTF1FileLoader.js.map +1 -0
- package/legacy/legacy-glTF2.d.ts +2 -0
- package/legacy/legacy-glTF2.js +35 -0
- package/legacy/legacy-glTF2.js.map +1 -0
- package/legacy/legacy-glTF2FileLoader.d.ts +2 -0
- package/legacy/legacy-glTF2FileLoader.js +4 -0
- package/legacy/legacy-glTF2FileLoader.js.map +1 -0
- package/legacy/legacy-glTFFileLoader.d.ts +3 -0
- package/legacy/legacy-glTFFileLoader.js +5 -0
- package/legacy/legacy-glTFFileLoader.js.map +1 -0
- package/legacy/legacy-objFileLoader.d.ts +1 -0
- package/legacy/legacy-objFileLoader.js +16 -0
- package/legacy/legacy-objFileLoader.js.map +1 -0
- package/legacy/legacy-stlFileLoader.d.ts +1 -0
- package/legacy/legacy-stlFileLoader.js +16 -0
- package/legacy/legacy-stlFileLoader.js.map +1 -0
- package/legacy/legacy.d.ts +7 -0
- package/legacy/legacy.js +10 -0
- package/legacy/legacy.js.map +1 -0
- package/license.md +71 -0
- package/package.json +49 -0
- package/readme.md +23 -0
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import { FlowGraphCoordinator } from "@babylonjs/core/FlowGraph/flowGraphCoordinator.js";
|
|
2
|
+
import { ParseFlowGraphAsync } from "@babylonjs/core/FlowGraph/flowGraphParser.js";
|
|
3
|
+
import { registerGLTFExtension, unregisterGLTFExtension } from "../glTFLoaderExtensionRegistry.js";
|
|
4
|
+
import { AddObjectAccessorToKey, GetPathToObjectConverter } from "./objectModelMapping.js";
|
|
5
|
+
import { InteractivityGraphToFlowGraphParser } from "./KHR_interactivity/interactivityGraphParser.js";
|
|
6
|
+
import { addToBlockFactory } from "@babylonjs/core/FlowGraph/Blocks/flowGraphBlockFactory.js";
|
|
7
|
+
import { Quaternion, Vector3 } from "@babylonjs/core/Maths/math.vector.js";
|
|
8
|
+
const NAME = "KHR_interactivity";
|
|
9
|
+
/**
|
|
10
|
+
* Loader extension for KHR_interactivity
|
|
11
|
+
*/
|
|
12
|
+
export class KHR_interactivity {
|
|
13
|
+
/**
|
|
14
|
+
* @internal
|
|
15
|
+
* @param _loader
|
|
16
|
+
*/
|
|
17
|
+
constructor(_loader) {
|
|
18
|
+
this._loader = _loader;
|
|
19
|
+
/**
|
|
20
|
+
* The name of this extension.
|
|
21
|
+
*/
|
|
22
|
+
this.name = NAME;
|
|
23
|
+
this.enabled = this._loader.isExtensionUsed(NAME);
|
|
24
|
+
this._pathConverter = GetPathToObjectConverter(this._loader.gltf);
|
|
25
|
+
// avoid starting animations automatically.
|
|
26
|
+
_loader._skipStartAnimationStep = true;
|
|
27
|
+
// Update object model with new pointers
|
|
28
|
+
const scene = _loader.babylonScene;
|
|
29
|
+
if (scene) {
|
|
30
|
+
_AddInteractivityObjectModel(scene);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
dispose() {
|
|
34
|
+
this._loader = null;
|
|
35
|
+
delete this._pathConverter;
|
|
36
|
+
}
|
|
37
|
+
// eslint-disable-next-line no-restricted-syntax, @typescript-eslint/no-misused-promises
|
|
38
|
+
async onReady() {
|
|
39
|
+
if (!this._loader.babylonScene || !this._pathConverter) {
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
const scene = this._loader.babylonScene;
|
|
43
|
+
const interactivityDefinition = this._loader.gltf.extensions?.KHR_interactivity;
|
|
44
|
+
if (!interactivityDefinition) {
|
|
45
|
+
// This can technically throw, but it's not a critical error
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
const coordinator = new FlowGraphCoordinator({ scene });
|
|
49
|
+
coordinator.dispatchEventsSynchronously = false; // glTF interactivity dispatches events asynchronously
|
|
50
|
+
const graphs = interactivityDefinition.graphs.map((graph) => {
|
|
51
|
+
const parser = new InteractivityGraphToFlowGraphParser(graph, this._loader.gltf, this._loader.parent.targetFps);
|
|
52
|
+
return parser.serializeToFlowGraph();
|
|
53
|
+
});
|
|
54
|
+
// parse each graph async
|
|
55
|
+
await Promise.all(graphs.map(async (graph) => await ParseFlowGraphAsync(graph, { coordinator, pathConverter: this._pathConverter })));
|
|
56
|
+
coordinator.start();
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* @internal
|
|
61
|
+
* populates the object model with the interactivity extension
|
|
62
|
+
*/
|
|
63
|
+
export function _AddInteractivityObjectModel(scene) {
|
|
64
|
+
// Note - all of those are read-only, as per the specs!
|
|
65
|
+
// active camera rotation
|
|
66
|
+
AddObjectAccessorToKey("/extensions/KHR_interactivity/?/activeCamera/rotation", {
|
|
67
|
+
get: () => {
|
|
68
|
+
if (!scene.activeCamera) {
|
|
69
|
+
return new Quaternion(NaN, NaN, NaN, NaN);
|
|
70
|
+
}
|
|
71
|
+
const quat = Quaternion.FromRotationMatrix(scene.activeCamera.getWorldMatrix()).normalize();
|
|
72
|
+
if (!scene.useRightHandedSystem) {
|
|
73
|
+
quat.w *= -1; // glTF uses right-handed system, while babylon uses left-handed
|
|
74
|
+
quat.x *= -1; // glTF uses right-handed system, while babylon uses left-handed
|
|
75
|
+
}
|
|
76
|
+
return quat;
|
|
77
|
+
},
|
|
78
|
+
type: "Quaternion",
|
|
79
|
+
getTarget: () => scene.activeCamera,
|
|
80
|
+
});
|
|
81
|
+
// activeCamera position
|
|
82
|
+
AddObjectAccessorToKey("/extensions/KHR_interactivity/?/activeCamera/position", {
|
|
83
|
+
get: () => {
|
|
84
|
+
if (!scene.activeCamera) {
|
|
85
|
+
return new Vector3(NaN, NaN, NaN);
|
|
86
|
+
}
|
|
87
|
+
const pos = scene.activeCamera.getWorldMatrix().getTranslation(); // not global position
|
|
88
|
+
if (!scene.useRightHandedSystem) {
|
|
89
|
+
pos.x *= -1; // glTF uses right-handed system, while babylon uses left-handed
|
|
90
|
+
}
|
|
91
|
+
return pos;
|
|
92
|
+
},
|
|
93
|
+
type: "Vector3",
|
|
94
|
+
getTarget: () => scene.activeCamera,
|
|
95
|
+
});
|
|
96
|
+
// /animations/{} pointers:
|
|
97
|
+
AddObjectAccessorToKey("/animations/{}/extensions/KHR_interactivity/isPlaying", {
|
|
98
|
+
get: (animation) => {
|
|
99
|
+
return animation._babylonAnimationGroup?.isPlaying ?? false;
|
|
100
|
+
},
|
|
101
|
+
type: "boolean",
|
|
102
|
+
getTarget: (animation) => {
|
|
103
|
+
return animation._babylonAnimationGroup;
|
|
104
|
+
},
|
|
105
|
+
});
|
|
106
|
+
AddObjectAccessorToKey("/animations/{}/extensions/KHR_interactivity/minTime", {
|
|
107
|
+
get: (animation) => {
|
|
108
|
+
return (animation._babylonAnimationGroup?.from ?? 0) / 60; // fixed factor for duration-to-frames conversion
|
|
109
|
+
},
|
|
110
|
+
type: "number",
|
|
111
|
+
getTarget: (animation) => {
|
|
112
|
+
return animation._babylonAnimationGroup;
|
|
113
|
+
},
|
|
114
|
+
});
|
|
115
|
+
AddObjectAccessorToKey("/animations/{}/extensions/KHR_interactivity/maxTime", {
|
|
116
|
+
get: (animation) => {
|
|
117
|
+
return (animation._babylonAnimationGroup?.to ?? 0) / 60; // fixed factor for duration-to-frames conversion
|
|
118
|
+
},
|
|
119
|
+
type: "number",
|
|
120
|
+
getTarget: (animation) => {
|
|
121
|
+
return animation._babylonAnimationGroup;
|
|
122
|
+
},
|
|
123
|
+
});
|
|
124
|
+
// playhead
|
|
125
|
+
AddObjectAccessorToKey("/animations/{}/extensions/KHR_interactivity/playhead", {
|
|
126
|
+
get: (animation) => {
|
|
127
|
+
return (animation._babylonAnimationGroup?.getCurrentFrame() ?? 0) / 60; // fixed factor for duration-to-frames conversion
|
|
128
|
+
},
|
|
129
|
+
type: "number",
|
|
130
|
+
getTarget: (animation) => {
|
|
131
|
+
return animation._babylonAnimationGroup;
|
|
132
|
+
},
|
|
133
|
+
});
|
|
134
|
+
//virtualPlayhead - TODO, do we support this property in our animations? getCurrentFrame is the only method we have for this.
|
|
135
|
+
AddObjectAccessorToKey("/animations/{}/extensions/KHR_interactivity/virtualPlayhead", {
|
|
136
|
+
get: (animation) => {
|
|
137
|
+
return (animation._babylonAnimationGroup?.getCurrentFrame() ?? 0) / 60; // fixed factor for duration-to-frames conversion
|
|
138
|
+
},
|
|
139
|
+
type: "number",
|
|
140
|
+
getTarget: (animation) => {
|
|
141
|
+
return animation._babylonAnimationGroup;
|
|
142
|
+
},
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
// Register flow graph blocks. Do it here so they are available when the extension is enabled.
|
|
146
|
+
addToBlockFactory(NAME, "FlowGraphGLTFDataProvider", async () => {
|
|
147
|
+
return (await import("./KHR_interactivity/flowGraphGLTFDataProvider.js")).FlowGraphGLTFDataProvider;
|
|
148
|
+
});
|
|
149
|
+
unregisterGLTFExtension(NAME);
|
|
150
|
+
registerGLTFExtension(NAME, true, (loader) => new KHR_interactivity(loader));
|
|
151
|
+
//# sourceMappingURL=KHR_interactivity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"KHR_interactivity.js","sourceRoot":"","sources":["../../../../../../dev/loaders/src/glTF/2.0/Extensions/KHR_interactivity.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/naming-convention */\r\nimport type { IKHRInteractivity } from \"babylonjs-gltf2interface\";\r\nimport type { GLTFLoader } from \"../glTFLoader\";\r\nimport type { IGLTFLoaderExtension } from \"../glTFLoaderExtension\";\r\nimport { FlowGraphCoordinator } from \"core/FlowGraph/flowGraphCoordinator\";\r\nimport { ParseFlowGraphAsync } from \"core/FlowGraph/flowGraphParser\";\r\nimport { registerGLTFExtension, unregisterGLTFExtension } from \"../glTFLoaderExtensionRegistry\";\r\nimport type { GLTFPathToObjectConverter } from \"./gltfPathToObjectConverter\";\r\nimport { AddObjectAccessorToKey, GetPathToObjectConverter } from \"./objectModelMapping\";\r\nimport { InteractivityGraphToFlowGraphParser } from \"./KHR_interactivity/interactivityGraphParser\";\r\nimport { addToBlockFactory } from \"core/FlowGraph/Blocks/flowGraphBlockFactory\";\r\nimport { Quaternion, Vector3 } from \"core/Maths/math.vector\";\r\nimport type { Scene } from \"core/scene\";\r\nimport type { IAnimation } from \"../glTFLoaderInterfaces\";\r\n\r\nconst NAME = \"KHR_interactivity\";\r\n\r\ndeclare module \"../../glTFFileLoader\" {\r\n // eslint-disable-next-line jsdoc/require-jsdoc, @typescript-eslint/naming-convention\r\n export interface GLTFLoaderExtensionOptions {\r\n /**\r\n * Defines options for the KHR_interactivity extension.\r\n */\r\n // NOTE: Don't use NAME here as it will break the UMD type declarations.\r\n [\"KHR_interactivity\"]: {};\r\n }\r\n}\r\n\r\n/**\r\n * Loader extension for KHR_interactivity\r\n */\r\nexport class KHR_interactivity implements IGLTFLoaderExtension {\r\n /**\r\n * The name of this extension.\r\n */\r\n public readonly name = NAME;\r\n /**\r\n * Defines whether this extension is enabled.\r\n */\r\n public enabled: boolean;\r\n\r\n private _pathConverter?: GLTFPathToObjectConverter<any, any, any>;\r\n\r\n /**\r\n * @internal\r\n * @param _loader\r\n */\r\n constructor(private _loader: GLTFLoader) {\r\n this.enabled = this._loader.isExtensionUsed(NAME);\r\n this._pathConverter = GetPathToObjectConverter(this._loader.gltf);\r\n // avoid starting animations automatically.\r\n _loader._skipStartAnimationStep = true;\r\n\r\n // Update object model with new pointers\r\n\r\n const scene = _loader.babylonScene;\r\n if (scene) {\r\n _AddInteractivityObjectModel(scene);\r\n }\r\n }\r\n\r\n public dispose() {\r\n (this._loader as any) = null;\r\n delete this._pathConverter;\r\n }\r\n\r\n // eslint-disable-next-line no-restricted-syntax, @typescript-eslint/no-misused-promises\r\n public async onReady(): Promise<void> {\r\n if (!this._loader.babylonScene || !this._pathConverter) {\r\n return;\r\n }\r\n const scene = this._loader.babylonScene;\r\n const interactivityDefinition = this._loader.gltf.extensions?.KHR_interactivity as IKHRInteractivity;\r\n if (!interactivityDefinition) {\r\n // This can technically throw, but it's not a critical error\r\n return;\r\n }\r\n\r\n const coordinator = new FlowGraphCoordinator({ scene });\r\n coordinator.dispatchEventsSynchronously = false; // glTF interactivity dispatches events asynchronously\r\n const graphs = interactivityDefinition.graphs.map((graph) => {\r\n const parser = new InteractivityGraphToFlowGraphParser(graph, this._loader.gltf, this._loader.parent.targetFps);\r\n return parser.serializeToFlowGraph();\r\n });\r\n // parse each graph async\r\n await Promise.all(graphs.map(async (graph) => await ParseFlowGraphAsync(graph, { coordinator, pathConverter: this._pathConverter })));\r\n\r\n coordinator.start();\r\n }\r\n}\r\n\r\n/**\r\n * @internal\r\n * populates the object model with the interactivity extension\r\n */\r\nexport function _AddInteractivityObjectModel(scene: Scene) {\r\n // Note - all of those are read-only, as per the specs!\r\n\r\n // active camera rotation\r\n AddObjectAccessorToKey(\"/extensions/KHR_interactivity/?/activeCamera/rotation\", {\r\n get: () => {\r\n if (!scene.activeCamera) {\r\n return new Quaternion(NaN, NaN, NaN, NaN);\r\n }\r\n const quat = Quaternion.FromRotationMatrix(scene.activeCamera.getWorldMatrix()).normalize();\r\n if (!scene.useRightHandedSystem) {\r\n quat.w *= -1; // glTF uses right-handed system, while babylon uses left-handed\r\n quat.x *= -1; // glTF uses right-handed system, while babylon uses left-handed\r\n }\r\n return quat;\r\n },\r\n type: \"Quaternion\",\r\n getTarget: () => scene.activeCamera,\r\n });\r\n // activeCamera position\r\n AddObjectAccessorToKey(\"/extensions/KHR_interactivity/?/activeCamera/position\", {\r\n get: () => {\r\n if (!scene.activeCamera) {\r\n return new Vector3(NaN, NaN, NaN);\r\n }\r\n const pos = scene.activeCamera.getWorldMatrix().getTranslation(); // not global position\r\n if (!scene.useRightHandedSystem) {\r\n pos.x *= -1; // glTF uses right-handed system, while babylon uses left-handed\r\n }\r\n return pos;\r\n },\r\n type: \"Vector3\",\r\n getTarget: () => scene.activeCamera,\r\n });\r\n\r\n // /animations/{} pointers:\r\n AddObjectAccessorToKey(\"/animations/{}/extensions/KHR_interactivity/isPlaying\", {\r\n get: (animation: IAnimation) => {\r\n return animation._babylonAnimationGroup?.isPlaying ?? false;\r\n },\r\n type: \"boolean\",\r\n getTarget: (animation: IAnimation) => {\r\n return animation._babylonAnimationGroup;\r\n },\r\n });\r\n AddObjectAccessorToKey(\"/animations/{}/extensions/KHR_interactivity/minTime\", {\r\n get: (animation: IAnimation) => {\r\n return (animation._babylonAnimationGroup?.from ?? 0) / 60; // fixed factor for duration-to-frames conversion\r\n },\r\n type: \"number\",\r\n getTarget: (animation: IAnimation) => {\r\n return animation._babylonAnimationGroup;\r\n },\r\n });\r\n AddObjectAccessorToKey(\"/animations/{}/extensions/KHR_interactivity/maxTime\", {\r\n get: (animation: IAnimation) => {\r\n return (animation._babylonAnimationGroup?.to ?? 0) / 60; // fixed factor for duration-to-frames conversion\r\n },\r\n type: \"number\",\r\n getTarget: (animation: IAnimation) => {\r\n return animation._babylonAnimationGroup;\r\n },\r\n });\r\n // playhead\r\n AddObjectAccessorToKey(\"/animations/{}/extensions/KHR_interactivity/playhead\", {\r\n get: (animation: IAnimation) => {\r\n return (animation._babylonAnimationGroup?.getCurrentFrame() ?? 0) / 60; // fixed factor for duration-to-frames conversion\r\n },\r\n type: \"number\",\r\n getTarget: (animation: IAnimation) => {\r\n return animation._babylonAnimationGroup;\r\n },\r\n });\r\n //virtualPlayhead - TODO, do we support this property in our animations? getCurrentFrame is the only method we have for this.\r\n AddObjectAccessorToKey(\"/animations/{}/extensions/KHR_interactivity/virtualPlayhead\", {\r\n get: (animation: IAnimation) => {\r\n return (animation._babylonAnimationGroup?.getCurrentFrame() ?? 0) / 60; // fixed factor for duration-to-frames conversion\r\n },\r\n type: \"number\",\r\n getTarget: (animation: IAnimation) => {\r\n return animation._babylonAnimationGroup;\r\n },\r\n });\r\n}\r\n\r\n// Register flow graph blocks. Do it here so they are available when the extension is enabled.\r\naddToBlockFactory(NAME, \"FlowGraphGLTFDataProvider\", async () => {\r\n return (await import(\"./KHR_interactivity/flowGraphGLTFDataProvider\")).FlowGraphGLTFDataProvider;\r\n});\r\n\r\nunregisterGLTFExtension(NAME);\r\nregisterGLTFExtension(NAME, true, (loader) => new KHR_interactivity(loader));\r\n"]}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { Nullable } from "@babylonjs/core/types.js";
|
|
2
|
+
import type { TransformNode } from "@babylonjs/core/Meshes/transformNode.js";
|
|
3
|
+
import type { INode } from "../glTFLoaderInterfaces.js";
|
|
4
|
+
import type { IGLTFLoaderExtension } from "../glTFLoaderExtension.js";
|
|
5
|
+
import { GLTFLoader } from "../glTFLoader.js";
|
|
6
|
+
declare module "../../glTFFileLoader.js" {
|
|
7
|
+
interface GLTFLoaderExtensionOptions {
|
|
8
|
+
/**
|
|
9
|
+
* Defines options for the KHR_lights_punctual extension.
|
|
10
|
+
*/
|
|
11
|
+
["KHR_lights_punctual"]: {};
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* [Specification](https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Khronos/KHR_lights_punctual/README.md)
|
|
16
|
+
*/
|
|
17
|
+
export declare class KHR_lights implements IGLTFLoaderExtension {
|
|
18
|
+
/**
|
|
19
|
+
* The name of this extension.
|
|
20
|
+
*/
|
|
21
|
+
readonly name = "KHR_lights_punctual";
|
|
22
|
+
/**
|
|
23
|
+
* Defines whether this extension is enabled.
|
|
24
|
+
*/
|
|
25
|
+
enabled: boolean;
|
|
26
|
+
/** hidden */
|
|
27
|
+
private _loader;
|
|
28
|
+
private _lights?;
|
|
29
|
+
/**
|
|
30
|
+
* @internal
|
|
31
|
+
*/
|
|
32
|
+
constructor(loader: GLTFLoader);
|
|
33
|
+
/** @internal */
|
|
34
|
+
dispose(): void;
|
|
35
|
+
/** @internal */
|
|
36
|
+
onLoading(): void;
|
|
37
|
+
/**
|
|
38
|
+
* @internal
|
|
39
|
+
*/
|
|
40
|
+
loadNodeAsync(context: string, node: INode, assign: (babylonTransformNode: TransformNode) => void): Nullable<Promise<TransformNode>>;
|
|
41
|
+
}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { Vector3 } from "@babylonjs/core/Maths/math.vector.js";
|
|
2
|
+
import { Color3 } from "@babylonjs/core/Maths/math.color.js";
|
|
3
|
+
import { DirectionalLight } from "@babylonjs/core/Lights/directionalLight.js";
|
|
4
|
+
import { PointLight } from "@babylonjs/core/Lights/pointLight.js";
|
|
5
|
+
import { SpotLight } from "@babylonjs/core/Lights/spotLight.js";
|
|
6
|
+
import { Light } from "@babylonjs/core/Lights/light.js";
|
|
7
|
+
import { GLTFLoader, ArrayItem } from "../glTFLoader.js";
|
|
8
|
+
import { registerGLTFExtension, unregisterGLTFExtension } from "../glTFLoaderExtensionRegistry.js";
|
|
9
|
+
const NAME = "KHR_lights_punctual";
|
|
10
|
+
/**
|
|
11
|
+
* [Specification](https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Khronos/KHR_lights_punctual/README.md)
|
|
12
|
+
*/
|
|
13
|
+
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
14
|
+
export class KHR_lights {
|
|
15
|
+
/**
|
|
16
|
+
* @internal
|
|
17
|
+
*/
|
|
18
|
+
constructor(loader) {
|
|
19
|
+
/**
|
|
20
|
+
* The name of this extension.
|
|
21
|
+
*/
|
|
22
|
+
this.name = NAME;
|
|
23
|
+
this._loader = loader;
|
|
24
|
+
this.enabled = this._loader.isExtensionUsed(NAME);
|
|
25
|
+
}
|
|
26
|
+
/** @internal */
|
|
27
|
+
dispose() {
|
|
28
|
+
this._loader = null;
|
|
29
|
+
delete this._lights;
|
|
30
|
+
}
|
|
31
|
+
/** @internal */
|
|
32
|
+
onLoading() {
|
|
33
|
+
const extensions = this._loader.gltf.extensions;
|
|
34
|
+
if (extensions && extensions[this.name]) {
|
|
35
|
+
const extension = extensions[this.name];
|
|
36
|
+
this._lights = extension.lights;
|
|
37
|
+
ArrayItem.Assign(this._lights);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* @internal
|
|
42
|
+
*/
|
|
43
|
+
// eslint-disable-next-line no-restricted-syntax
|
|
44
|
+
loadNodeAsync(context, node, assign) {
|
|
45
|
+
return GLTFLoader.LoadExtensionAsync(context, node, this.name, async (extensionContext, extension) => {
|
|
46
|
+
this._loader._allMaterialsDirtyRequired = true;
|
|
47
|
+
return await this._loader.loadNodeAsync(context, node, (babylonMesh) => {
|
|
48
|
+
let babylonLight;
|
|
49
|
+
const light = ArrayItem.Get(extensionContext, this._lights, extension.light);
|
|
50
|
+
const name = light.name || babylonMesh.name;
|
|
51
|
+
this._loader.babylonScene._blockEntityCollection = !!this._loader._assetContainer;
|
|
52
|
+
switch (light.type) {
|
|
53
|
+
case "directional" /* KHRLightsPunctual_LightType.DIRECTIONAL */: {
|
|
54
|
+
const babylonDirectionalLight = new DirectionalLight(name, Vector3.Backward(), this._loader.babylonScene);
|
|
55
|
+
babylonDirectionalLight.position.setAll(0);
|
|
56
|
+
babylonLight = babylonDirectionalLight;
|
|
57
|
+
break;
|
|
58
|
+
}
|
|
59
|
+
case "point" /* KHRLightsPunctual_LightType.POINT */: {
|
|
60
|
+
babylonLight = new PointLight(name, Vector3.Zero(), this._loader.babylonScene);
|
|
61
|
+
break;
|
|
62
|
+
}
|
|
63
|
+
case "spot" /* KHRLightsPunctual_LightType.SPOT */: {
|
|
64
|
+
const babylonSpotLight = new SpotLight(name, Vector3.Zero(), Vector3.Backward(), 0, 1, this._loader.babylonScene);
|
|
65
|
+
babylonSpotLight.angle = ((light.spot && light.spot.outerConeAngle) || Math.PI / 4) * 2;
|
|
66
|
+
babylonSpotLight.innerAngle = ((light.spot && light.spot.innerConeAngle) || 0) * 2;
|
|
67
|
+
babylonLight = babylonSpotLight;
|
|
68
|
+
break;
|
|
69
|
+
}
|
|
70
|
+
default: {
|
|
71
|
+
this._loader.babylonScene._blockEntityCollection = false;
|
|
72
|
+
throw new Error(`${extensionContext}: Invalid light type (${light.type})`);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
babylonLight._parentContainer = this._loader._assetContainer;
|
|
76
|
+
this._loader.babylonScene._blockEntityCollection = false;
|
|
77
|
+
light._babylonLight = babylonLight;
|
|
78
|
+
babylonLight.falloffType = Light.FALLOFF_GLTF;
|
|
79
|
+
babylonLight.diffuse = light.color ? Color3.FromArray(light.color) : Color3.White();
|
|
80
|
+
babylonLight.intensity = light.intensity == undefined ? 1 : light.intensity;
|
|
81
|
+
babylonLight.range = light.range == undefined ? Number.MAX_VALUE : light.range;
|
|
82
|
+
babylonLight.parent = babylonMesh;
|
|
83
|
+
this._loader._babylonLights.push(babylonLight);
|
|
84
|
+
GLTFLoader.AddPointerMetadata(babylonLight, extensionContext);
|
|
85
|
+
assign(babylonMesh);
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
unregisterGLTFExtension(NAME);
|
|
91
|
+
registerGLTFExtension(NAME, true, (loader) => new KHR_lights(loader));
|
|
92
|
+
//# sourceMappingURL=KHR_lights_punctual.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"KHR_lights_punctual.js","sourceRoot":"","sources":["../../../../../../dev/loaders/src/glTF/2.0/Extensions/KHR_lights_punctual.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/naming-convention */\r\nimport type { Nullable } from \"core/types\";\r\nimport { Vector3 } from \"core/Maths/math.vector\";\r\nimport { Color3 } from \"core/Maths/math.color\";\r\nimport { DirectionalLight } from \"core/Lights/directionalLight\";\r\nimport { PointLight } from \"core/Lights/pointLight\";\r\nimport { SpotLight } from \"core/Lights/spotLight\";\r\nimport { Light } from \"core/Lights/light\";\r\nimport type { TransformNode } from \"core/Meshes/transformNode\";\r\n\r\nimport type { IKHRLightsPunctual_LightReference } from \"babylonjs-gltf2interface\";\r\nimport { KHRLightsPunctual_LightType } from \"babylonjs-gltf2interface\";\r\nimport type { INode, IKHRLightsPunctual_Light } from \"../glTFLoaderInterfaces\";\r\nimport type { IGLTFLoaderExtension } from \"../glTFLoaderExtension\";\r\nimport { GLTFLoader, ArrayItem } from \"../glTFLoader\";\r\nimport { registerGLTFExtension, unregisterGLTFExtension } from \"../glTFLoaderExtensionRegistry\";\r\n\r\nconst NAME = \"KHR_lights_punctual\";\r\n\r\ndeclare module \"../../glTFFileLoader\" {\r\n // eslint-disable-next-line jsdoc/require-jsdoc, @typescript-eslint/naming-convention\r\n export interface GLTFLoaderExtensionOptions {\r\n /**\r\n * Defines options for the KHR_lights_punctual extension.\r\n */\r\n // NOTE: Don't use NAME here as it will break the UMD type declarations.\r\n [\"KHR_lights_punctual\"]: {};\r\n }\r\n}\r\n\r\n/**\r\n * [Specification](https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Khronos/KHR_lights_punctual/README.md)\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport class KHR_lights implements IGLTFLoaderExtension {\r\n /**\r\n * The name of this extension.\r\n */\r\n public readonly name = NAME;\r\n\r\n /**\r\n * Defines whether this extension is enabled.\r\n */\r\n public enabled: boolean;\r\n\r\n /** hidden */\r\n private _loader: GLTFLoader;\r\n private _lights?: IKHRLightsPunctual_Light[];\r\n\r\n /**\r\n * @internal\r\n */\r\n constructor(loader: GLTFLoader) {\r\n this._loader = loader;\r\n this.enabled = this._loader.isExtensionUsed(NAME);\r\n }\r\n\r\n /** @internal */\r\n public dispose() {\r\n (this._loader as any) = null;\r\n delete this._lights;\r\n }\r\n\r\n /** @internal */\r\n public onLoading(): void {\r\n const extensions = this._loader.gltf.extensions;\r\n if (extensions && extensions[this.name]) {\r\n const extension = extensions[this.name];\r\n this._lights = extension.lights;\r\n ArrayItem.Assign(this._lights);\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n // eslint-disable-next-line no-restricted-syntax\r\n public loadNodeAsync(context: string, node: INode, assign: (babylonTransformNode: TransformNode) => void): Nullable<Promise<TransformNode>> {\r\n return GLTFLoader.LoadExtensionAsync<IKHRLightsPunctual_LightReference, TransformNode>(context, node, this.name, async (extensionContext, extension) => {\r\n this._loader._allMaterialsDirtyRequired = true;\r\n\r\n return await this._loader.loadNodeAsync(context, node, (babylonMesh) => {\r\n let babylonLight: Light;\r\n\r\n const light = ArrayItem.Get(extensionContext, this._lights, extension.light);\r\n const name = light.name || babylonMesh.name;\r\n\r\n this._loader.babylonScene._blockEntityCollection = !!this._loader._assetContainer;\r\n\r\n switch (light.type) {\r\n case KHRLightsPunctual_LightType.DIRECTIONAL: {\r\n const babylonDirectionalLight = new DirectionalLight(name, Vector3.Backward(), this._loader.babylonScene);\r\n babylonDirectionalLight.position.setAll(0);\r\n babylonLight = babylonDirectionalLight;\r\n break;\r\n }\r\n case KHRLightsPunctual_LightType.POINT: {\r\n babylonLight = new PointLight(name, Vector3.Zero(), this._loader.babylonScene);\r\n break;\r\n }\r\n case KHRLightsPunctual_LightType.SPOT: {\r\n const babylonSpotLight = new SpotLight(name, Vector3.Zero(), Vector3.Backward(), 0, 1, this._loader.babylonScene);\r\n babylonSpotLight.angle = ((light.spot && light.spot.outerConeAngle) || Math.PI / 4) * 2;\r\n babylonSpotLight.innerAngle = ((light.spot && light.spot.innerConeAngle) || 0) * 2;\r\n babylonLight = babylonSpotLight;\r\n break;\r\n }\r\n default: {\r\n this._loader.babylonScene._blockEntityCollection = false;\r\n throw new Error(`${extensionContext}: Invalid light type (${light.type})`);\r\n }\r\n }\r\n\r\n babylonLight._parentContainer = this._loader._assetContainer;\r\n this._loader.babylonScene._blockEntityCollection = false;\r\n light._babylonLight = babylonLight;\r\n\r\n babylonLight.falloffType = Light.FALLOFF_GLTF;\r\n babylonLight.diffuse = light.color ? Color3.FromArray(light.color) : Color3.White();\r\n babylonLight.intensity = light.intensity == undefined ? 1 : light.intensity;\r\n babylonLight.range = light.range == undefined ? Number.MAX_VALUE : light.range;\r\n babylonLight.parent = babylonMesh;\r\n\r\n this._loader._babylonLights.push(babylonLight);\r\n\r\n GLTFLoader.AddPointerMetadata(babylonLight, extensionContext);\r\n\r\n assign(babylonMesh);\r\n });\r\n });\r\n }\r\n}\r\n\r\nunregisterGLTFExtension(NAME);\r\nregisterGLTFExtension(NAME, true, (loader) => new KHR_lights(loader));\r\n"]}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { Nullable } from "@babylonjs/core/types.js";
|
|
2
|
+
import type { Material } from "@babylonjs/core/Materials/material.js";
|
|
3
|
+
import type { IMaterial } from "../glTFLoaderInterfaces.js";
|
|
4
|
+
import type { IGLTFLoaderExtension } from "../glTFLoaderExtension.js";
|
|
5
|
+
import { GLTFLoader } from "../glTFLoader.js";
|
|
6
|
+
declare module "../../glTFFileLoader.js" {
|
|
7
|
+
interface GLTFLoaderExtensionOptions {
|
|
8
|
+
/**
|
|
9
|
+
* Defines options for the KHR_materials_anisotropy extension.
|
|
10
|
+
*/
|
|
11
|
+
["KHR_materials_anisotropy"]: {};
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* [Specification](https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_anisotropy)
|
|
16
|
+
*/
|
|
17
|
+
export declare class KHR_materials_anisotropy implements IGLTFLoaderExtension {
|
|
18
|
+
/**
|
|
19
|
+
* The name of this extension.
|
|
20
|
+
*/
|
|
21
|
+
readonly name = "KHR_materials_anisotropy";
|
|
22
|
+
/**
|
|
23
|
+
* Defines whether this extension is enabled.
|
|
24
|
+
*/
|
|
25
|
+
enabled: boolean;
|
|
26
|
+
/**
|
|
27
|
+
* Defines a number that determines the order the extensions are applied.
|
|
28
|
+
*/
|
|
29
|
+
order: number;
|
|
30
|
+
private _loader;
|
|
31
|
+
/**
|
|
32
|
+
* @internal
|
|
33
|
+
*/
|
|
34
|
+
constructor(loader: GLTFLoader);
|
|
35
|
+
/** @internal */
|
|
36
|
+
dispose(): void;
|
|
37
|
+
/**
|
|
38
|
+
* @internal
|
|
39
|
+
*/
|
|
40
|
+
loadMaterialPropertiesAsync(context: string, material: IMaterial, babylonMaterial: Material): Nullable<Promise<void>>;
|
|
41
|
+
private _loadIridescencePropertiesAsync;
|
|
42
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { PBRMaterial } from "@babylonjs/core/Materials/PBR/pbrMaterial.js";
|
|
2
|
+
import { GLTFLoader } from "../glTFLoader.js";
|
|
3
|
+
import { registerGLTFExtension, unregisterGLTFExtension } from "../glTFLoaderExtensionRegistry.js";
|
|
4
|
+
const NAME = "KHR_materials_anisotropy";
|
|
5
|
+
/**
|
|
6
|
+
* [Specification](https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_anisotropy)
|
|
7
|
+
*/
|
|
8
|
+
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
9
|
+
export class KHR_materials_anisotropy {
|
|
10
|
+
/**
|
|
11
|
+
* @internal
|
|
12
|
+
*/
|
|
13
|
+
constructor(loader) {
|
|
14
|
+
/**
|
|
15
|
+
* The name of this extension.
|
|
16
|
+
*/
|
|
17
|
+
this.name = NAME;
|
|
18
|
+
/**
|
|
19
|
+
* Defines a number that determines the order the extensions are applied.
|
|
20
|
+
*/
|
|
21
|
+
this.order = 195;
|
|
22
|
+
this._loader = loader;
|
|
23
|
+
this.enabled = this._loader.isExtensionUsed(NAME);
|
|
24
|
+
}
|
|
25
|
+
/** @internal */
|
|
26
|
+
dispose() {
|
|
27
|
+
this._loader = null;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* @internal
|
|
31
|
+
*/
|
|
32
|
+
// eslint-disable-next-line no-restricted-syntax
|
|
33
|
+
loadMaterialPropertiesAsync(context, material, babylonMaterial) {
|
|
34
|
+
return GLTFLoader.LoadExtensionAsync(context, material, this.name, async (extensionContext, extension) => {
|
|
35
|
+
const promises = new Array();
|
|
36
|
+
promises.push(this._loader.loadMaterialPropertiesAsync(context, material, babylonMaterial));
|
|
37
|
+
promises.push(this._loadIridescencePropertiesAsync(extensionContext, extension, babylonMaterial));
|
|
38
|
+
await Promise.all(promises);
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
async _loadIridescencePropertiesAsync(context, properties, babylonMaterial) {
|
|
42
|
+
if (!(babylonMaterial instanceof PBRMaterial)) {
|
|
43
|
+
throw new Error(`${context}: Material type not supported`);
|
|
44
|
+
}
|
|
45
|
+
const promises = new Array();
|
|
46
|
+
babylonMaterial.anisotropy.isEnabled = true;
|
|
47
|
+
babylonMaterial.anisotropy.intensity = properties.anisotropyStrength ?? 0;
|
|
48
|
+
babylonMaterial.anisotropy.angle = properties.anisotropyRotation ?? 0;
|
|
49
|
+
if (properties.anisotropyTexture) {
|
|
50
|
+
properties.anisotropyTexture.nonColorData = true;
|
|
51
|
+
promises.push(this._loader.loadTextureInfoAsync(`${context}/anisotropyTexture`, properties.anisotropyTexture, (texture) => {
|
|
52
|
+
texture.name = `${babylonMaterial.name} (Anisotropy Intensity)`;
|
|
53
|
+
babylonMaterial.anisotropy.texture = texture;
|
|
54
|
+
}));
|
|
55
|
+
}
|
|
56
|
+
await Promise.all(promises);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
unregisterGLTFExtension(NAME);
|
|
60
|
+
registerGLTFExtension(NAME, true, (loader) => new KHR_materials_anisotropy(loader));
|
|
61
|
+
//# sourceMappingURL=KHR_materials_anisotropy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"KHR_materials_anisotropy.js","sourceRoot":"","sources":["../../../../../../dev/loaders/src/glTF/2.0/Extensions/KHR_materials_anisotropy.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,qDAAuC;AAK7D,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3C,OAAO,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AAEhG,MAAM,IAAI,GAAG,0BAA0B,CAAC;AAaxC;;GAEG;AACH,gEAAgE;AAChE,MAAM,OAAO,wBAAwB;IAkBjC;;OAEG;IACH,YAAY,MAAkB;QApB9B;;WAEG;QACa,SAAI,GAAG,IAAI,CAAC;QAO5B;;WAEG;QACI,UAAK,GAAG,GAAG,CAAC;QAQf,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;QACtB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;IACtD,CAAC;IAED,gBAAgB;IACT,OAAO;QACT,IAAI,CAAC,OAAe,GAAG,IAAI,CAAC;IACjC,CAAC;IAED;;OAEG;IACH,gDAAgD;IACzC,2BAA2B,CAAC,OAAe,EAAE,QAAmB,EAAE,eAAyB;QAC9F,OAAO,UAAU,CAAC,kBAAkB,CAA0B,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,gBAAgB,EAAE,SAAS,EAAE,EAAE;YAC9H,MAAM,QAAQ,GAAG,IAAI,KAAK,EAAgB,CAAC;YAC3C,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,2BAA2B,CAAC,OAAO,EAAE,QAAQ,EAAE,eAAe,CAAC,CAAC,CAAC;YAC5F,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,+BAA+B,CAAC,gBAAgB,EAAE,SAAS,EAAE,eAAe,CAAC,CAAC,CAAC;YAClG,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC;IACP,CAAC;IAEO,KAAK,CAAC,+BAA+B,CAAC,OAAe,EAAE,UAAmC,EAAE,eAAyB;QACzH,IAAI,CAAC,CAAC,eAAe,YAAY,WAAW,CAAC,EAAE,CAAC;YAC5C,MAAM,IAAI,KAAK,CAAC,GAAG,OAAO,+BAA+B,CAAC,CAAC;QAC/D,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,KAAK,EAAgB,CAAC;QAE3C,eAAe,CAAC,UAAU,CAAC,SAAS,GAAG,IAAI,CAAC;QAE5C,eAAe,CAAC,UAAU,CAAC,SAAS,GAAG,UAAU,CAAC,kBAAkB,IAAI,CAAC,CAAC;QAC1E,eAAe,CAAC,UAAU,CAAC,KAAK,GAAG,UAAU,CAAC,kBAAkB,IAAI,CAAC,CAAC;QAEtE,IAAI,UAAU,CAAC,iBAAiB,EAAE,CAAC;YAC9B,UAAU,CAAC,iBAAkC,CAAC,YAAY,GAAG,IAAI,CAAC;YACnE,QAAQ,CAAC,IAAI,CACT,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAAC,GAAG,OAAO,oBAAoB,EAAE,UAAU,CAAC,iBAAiB,EAAE,CAAC,OAAO,EAAE,EAAE;gBACxG,OAAO,CAAC,IAAI,GAAG,GAAG,eAAe,CAAC,IAAI,yBAAyB,CAAC;gBAChE,eAAe,CAAC,UAAU,CAAC,OAAO,GAAG,OAAO,CAAC;YACjD,CAAC,CAAC,CACL,CAAC;QACN,CAAC;QAED,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAChC,CAAC;CACJ;AAED,uBAAuB,CAAC,IAAI,CAAC,CAAC;AAC9B,qBAAqB,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,wBAAwB,CAAC,MAAM,CAAC,CAAC,CAAC","sourcesContent":["import type { Nullable } from \"core/types\";\r\nimport { PBRMaterial } from \"core/Materials/PBR/pbrMaterial\";\r\nimport type { Material } from \"core/Materials/material\";\r\n\r\nimport type { IMaterial, ITextureInfo } from \"../glTFLoaderInterfaces\";\r\nimport type { IGLTFLoaderExtension } from \"../glTFLoaderExtension\";\r\nimport { GLTFLoader } from \"../glTFLoader\";\r\nimport type { IKHRMaterialsAnisotropy } from \"babylonjs-gltf2interface\";\r\nimport { registerGLTFExtension, unregisterGLTFExtension } from \"../glTFLoaderExtensionRegistry\";\r\n\r\nconst NAME = \"KHR_materials_anisotropy\";\r\n\r\ndeclare module \"../../glTFFileLoader\" {\r\n // eslint-disable-next-line jsdoc/require-jsdoc, @typescript-eslint/naming-convention\r\n export interface GLTFLoaderExtensionOptions {\r\n /**\r\n * Defines options for the KHR_materials_anisotropy extension.\r\n */\r\n // NOTE: Don't use NAME here as it will break the UMD type declarations.\r\n [\"KHR_materials_anisotropy\"]: {};\r\n }\r\n}\r\n\r\n/**\r\n * [Specification](https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_anisotropy)\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport class KHR_materials_anisotropy implements IGLTFLoaderExtension {\r\n /**\r\n * The name of this extension.\r\n */\r\n public readonly name = NAME;\r\n\r\n /**\r\n * Defines whether this extension is enabled.\r\n */\r\n public enabled: boolean;\r\n\r\n /**\r\n * Defines a number that determines the order the extensions are applied.\r\n */\r\n public order = 195;\r\n\r\n private _loader: GLTFLoader;\r\n\r\n /**\r\n * @internal\r\n */\r\n constructor(loader: GLTFLoader) {\r\n this._loader = loader;\r\n this.enabled = this._loader.isExtensionUsed(NAME);\r\n }\r\n\r\n /** @internal */\r\n public dispose() {\r\n (this._loader as any) = null;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n // eslint-disable-next-line no-restricted-syntax\r\n public loadMaterialPropertiesAsync(context: string, material: IMaterial, babylonMaterial: Material): Nullable<Promise<void>> {\r\n return GLTFLoader.LoadExtensionAsync<IKHRMaterialsAnisotropy>(context, material, this.name, async (extensionContext, extension) => {\r\n const promises = new Array<Promise<any>>();\r\n promises.push(this._loader.loadMaterialPropertiesAsync(context, material, babylonMaterial));\r\n promises.push(this._loadIridescencePropertiesAsync(extensionContext, extension, babylonMaterial));\r\n await Promise.all(promises);\r\n });\r\n }\r\n\r\n private async _loadIridescencePropertiesAsync(context: string, properties: IKHRMaterialsAnisotropy, babylonMaterial: Material): Promise<void> {\r\n if (!(babylonMaterial instanceof PBRMaterial)) {\r\n throw new Error(`${context}: Material type not supported`);\r\n }\r\n\r\n const promises = new Array<Promise<any>>();\r\n\r\n babylonMaterial.anisotropy.isEnabled = true;\r\n\r\n babylonMaterial.anisotropy.intensity = properties.anisotropyStrength ?? 0;\r\n babylonMaterial.anisotropy.angle = properties.anisotropyRotation ?? 0;\r\n\r\n if (properties.anisotropyTexture) {\r\n (properties.anisotropyTexture as ITextureInfo).nonColorData = true;\r\n promises.push(\r\n this._loader.loadTextureInfoAsync(`${context}/anisotropyTexture`, properties.anisotropyTexture, (texture) => {\r\n texture.name = `${babylonMaterial.name} (Anisotropy Intensity)`;\r\n babylonMaterial.anisotropy.texture = texture;\r\n })\r\n );\r\n }\r\n\r\n await Promise.all(promises);\r\n }\r\n}\r\n\r\nunregisterGLTFExtension(NAME);\r\nregisterGLTFExtension(NAME, true, (loader) => new KHR_materials_anisotropy(loader));\r\n"]}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { Nullable } from "@babylonjs/core/types.js";
|
|
2
|
+
import type { Material } from "@babylonjs/core/Materials/material.js";
|
|
3
|
+
import type { IMaterial } from "../glTFLoaderInterfaces.js";
|
|
4
|
+
import type { IGLTFLoaderExtension } from "../glTFLoaderExtension.js";
|
|
5
|
+
import { GLTFLoader } from "../glTFLoader.js";
|
|
6
|
+
declare module "../../glTFFileLoader.js" {
|
|
7
|
+
interface GLTFLoaderExtensionOptions {
|
|
8
|
+
/**
|
|
9
|
+
* Defines options for the KHR_materials_clearcoat extension.
|
|
10
|
+
*/
|
|
11
|
+
["KHR_materials_clearcoat"]: {};
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* [Specification](https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Khronos/KHR_materials_clearcoat/README.md)
|
|
16
|
+
* [Playground Sample](https://www.babylonjs-playground.com/frame.html#7F7PN6#8)
|
|
17
|
+
*/
|
|
18
|
+
export declare class KHR_materials_clearcoat implements IGLTFLoaderExtension {
|
|
19
|
+
/**
|
|
20
|
+
* The name of this extension.
|
|
21
|
+
*/
|
|
22
|
+
readonly name = "KHR_materials_clearcoat";
|
|
23
|
+
/**
|
|
24
|
+
* Defines whether this extension is enabled.
|
|
25
|
+
*/
|
|
26
|
+
enabled: boolean;
|
|
27
|
+
/**
|
|
28
|
+
* Defines a number that determines the order the extensions are applied.
|
|
29
|
+
*/
|
|
30
|
+
order: number;
|
|
31
|
+
private _loader;
|
|
32
|
+
/**
|
|
33
|
+
* @internal
|
|
34
|
+
*/
|
|
35
|
+
constructor(loader: GLTFLoader);
|
|
36
|
+
/** @internal */
|
|
37
|
+
dispose(): void;
|
|
38
|
+
/**
|
|
39
|
+
* @internal
|
|
40
|
+
*/
|
|
41
|
+
loadMaterialPropertiesAsync(context: string, material: IMaterial, babylonMaterial: Material): Nullable<Promise<void>>;
|
|
42
|
+
private _loadClearCoatPropertiesAsync;
|
|
43
|
+
}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { PBRMaterial } from "@babylonjs/core/Materials/PBR/pbrMaterial.js";
|
|
2
|
+
import { GLTFLoader } from "../glTFLoader.js";
|
|
3
|
+
import { registerGLTFExtension, unregisterGLTFExtension } from "../glTFLoaderExtensionRegistry.js";
|
|
4
|
+
const NAME = "KHR_materials_clearcoat";
|
|
5
|
+
/**
|
|
6
|
+
* [Specification](https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Khronos/KHR_materials_clearcoat/README.md)
|
|
7
|
+
* [Playground Sample](https://www.babylonjs-playground.com/frame.html#7F7PN6#8)
|
|
8
|
+
*/
|
|
9
|
+
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
10
|
+
export class KHR_materials_clearcoat {
|
|
11
|
+
/**
|
|
12
|
+
* @internal
|
|
13
|
+
*/
|
|
14
|
+
constructor(loader) {
|
|
15
|
+
/**
|
|
16
|
+
* The name of this extension.
|
|
17
|
+
*/
|
|
18
|
+
this.name = NAME;
|
|
19
|
+
/**
|
|
20
|
+
* Defines a number that determines the order the extensions are applied.
|
|
21
|
+
*/
|
|
22
|
+
this.order = 190;
|
|
23
|
+
this._loader = loader;
|
|
24
|
+
this.enabled = this._loader.isExtensionUsed(NAME);
|
|
25
|
+
}
|
|
26
|
+
/** @internal */
|
|
27
|
+
dispose() {
|
|
28
|
+
this._loader = null;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* @internal
|
|
32
|
+
*/
|
|
33
|
+
// eslint-disable-next-line no-restricted-syntax
|
|
34
|
+
loadMaterialPropertiesAsync(context, material, babylonMaterial) {
|
|
35
|
+
return GLTFLoader.LoadExtensionAsync(context, material, this.name, async (extensionContext, extension) => {
|
|
36
|
+
const promises = new Array();
|
|
37
|
+
promises.push(this._loader.loadMaterialPropertiesAsync(context, material, babylonMaterial));
|
|
38
|
+
promises.push(this._loadClearCoatPropertiesAsync(extensionContext, extension, babylonMaterial));
|
|
39
|
+
await Promise.all(promises);
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
// eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax
|
|
43
|
+
_loadClearCoatPropertiesAsync(context, properties, babylonMaterial) {
|
|
44
|
+
if (!(babylonMaterial instanceof PBRMaterial)) {
|
|
45
|
+
throw new Error(`${context}: Material type not supported`);
|
|
46
|
+
}
|
|
47
|
+
const promises = new Array();
|
|
48
|
+
babylonMaterial.clearCoat.isEnabled = true;
|
|
49
|
+
babylonMaterial.clearCoat.useRoughnessFromMainTexture = false;
|
|
50
|
+
babylonMaterial.clearCoat.remapF0OnInterfaceChange = false;
|
|
51
|
+
if (properties.clearcoatFactor != undefined) {
|
|
52
|
+
babylonMaterial.clearCoat.intensity = properties.clearcoatFactor;
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
babylonMaterial.clearCoat.intensity = 0;
|
|
56
|
+
}
|
|
57
|
+
if (properties.clearcoatTexture) {
|
|
58
|
+
promises.push(this._loader.loadTextureInfoAsync(`${context}/clearcoatTexture`, properties.clearcoatTexture, (texture) => {
|
|
59
|
+
texture.name = `${babylonMaterial.name} (ClearCoat)`;
|
|
60
|
+
babylonMaterial.clearCoat.texture = texture;
|
|
61
|
+
}));
|
|
62
|
+
}
|
|
63
|
+
if (properties.clearcoatRoughnessFactor != undefined) {
|
|
64
|
+
babylonMaterial.clearCoat.roughness = properties.clearcoatRoughnessFactor;
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
babylonMaterial.clearCoat.roughness = 0;
|
|
68
|
+
}
|
|
69
|
+
if (properties.clearcoatRoughnessTexture) {
|
|
70
|
+
properties.clearcoatRoughnessTexture.nonColorData = true;
|
|
71
|
+
promises.push(this._loader.loadTextureInfoAsync(`${context}/clearcoatRoughnessTexture`, properties.clearcoatRoughnessTexture, (texture) => {
|
|
72
|
+
texture.name = `${babylonMaterial.name} (ClearCoat Roughness)`;
|
|
73
|
+
babylonMaterial.clearCoat.textureRoughness = texture;
|
|
74
|
+
}));
|
|
75
|
+
}
|
|
76
|
+
if (properties.clearcoatNormalTexture) {
|
|
77
|
+
properties.clearcoatNormalTexture.nonColorData = true;
|
|
78
|
+
promises.push(this._loader.loadTextureInfoAsync(`${context}/clearcoatNormalTexture`, properties.clearcoatNormalTexture, (texture) => {
|
|
79
|
+
texture.name = `${babylonMaterial.name} (ClearCoat Normal)`;
|
|
80
|
+
babylonMaterial.clearCoat.bumpTexture = texture;
|
|
81
|
+
}));
|
|
82
|
+
babylonMaterial.invertNormalMapX = !babylonMaterial.getScene().useRightHandedSystem;
|
|
83
|
+
babylonMaterial.invertNormalMapY = babylonMaterial.getScene().useRightHandedSystem;
|
|
84
|
+
if (properties.clearcoatNormalTexture.scale != undefined) {
|
|
85
|
+
babylonMaterial.clearCoat.bumpTexture.level = properties.clearcoatNormalTexture.scale;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
// eslint-disable-next-line github/no-then
|
|
89
|
+
return Promise.all(promises).then(() => { });
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
unregisterGLTFExtension(NAME);
|
|
93
|
+
registerGLTFExtension(NAME, true, (loader) => new KHR_materials_clearcoat(loader));
|
|
94
|
+
//# sourceMappingURL=KHR_materials_clearcoat.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"KHR_materials_clearcoat.js","sourceRoot":"","sources":["../../../../../../dev/loaders/src/glTF/2.0/Extensions/KHR_materials_clearcoat.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Nullable } from \"core/types\";\r\nimport { PBRMaterial } from \"core/Materials/PBR/pbrMaterial\";\r\nimport type { Material } from \"core/Materials/material\";\r\n\r\nimport type { IMaterial, ITextureInfo } from \"../glTFLoaderInterfaces\";\r\nimport type { IGLTFLoaderExtension } from \"../glTFLoaderExtension\";\r\nimport { GLTFLoader } from \"../glTFLoader\";\r\nimport type { IKHRMaterialsClearcoat } from \"babylonjs-gltf2interface\";\r\nimport { registerGLTFExtension, unregisterGLTFExtension } from \"../glTFLoaderExtensionRegistry\";\r\n\r\nconst NAME = \"KHR_materials_clearcoat\";\r\n\r\ndeclare module \"../../glTFFileLoader\" {\r\n // eslint-disable-next-line jsdoc/require-jsdoc, @typescript-eslint/naming-convention\r\n export interface GLTFLoaderExtensionOptions {\r\n /**\r\n * Defines options for the KHR_materials_clearcoat extension.\r\n */\r\n // NOTE: Don't use NAME here as it will break the UMD type declarations.\r\n [\"KHR_materials_clearcoat\"]: {};\r\n }\r\n}\r\n\r\n/**\r\n * [Specification](https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Khronos/KHR_materials_clearcoat/README.md)\r\n * [Playground Sample](https://www.babylonjs-playground.com/frame.html#7F7PN6#8)\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport class KHR_materials_clearcoat implements IGLTFLoaderExtension {\r\n /**\r\n * The name of this extension.\r\n */\r\n public readonly name = NAME;\r\n\r\n /**\r\n * Defines whether this extension is enabled.\r\n */\r\n public enabled: boolean;\r\n\r\n /**\r\n * Defines a number that determines the order the extensions are applied.\r\n */\r\n public order = 190;\r\n\r\n private _loader: GLTFLoader;\r\n\r\n /**\r\n * @internal\r\n */\r\n constructor(loader: GLTFLoader) {\r\n this._loader = loader;\r\n this.enabled = this._loader.isExtensionUsed(NAME);\r\n }\r\n\r\n /** @internal */\r\n public dispose() {\r\n (this._loader as any) = null;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n // eslint-disable-next-line no-restricted-syntax\r\n public loadMaterialPropertiesAsync(context: string, material: IMaterial, babylonMaterial: Material): Nullable<Promise<void>> {\r\n return GLTFLoader.LoadExtensionAsync<IKHRMaterialsClearcoat>(context, material, this.name, async (extensionContext, extension) => {\r\n const promises = new Array<Promise<any>>();\r\n promises.push(this._loader.loadMaterialPropertiesAsync(context, material, babylonMaterial));\r\n promises.push(this._loadClearCoatPropertiesAsync(extensionContext, extension, babylonMaterial));\r\n await Promise.all(promises);\r\n });\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax\r\n private _loadClearCoatPropertiesAsync(context: string, properties: IKHRMaterialsClearcoat, babylonMaterial: Material): Promise<void> {\r\n if (!(babylonMaterial instanceof PBRMaterial)) {\r\n throw new Error(`${context}: Material type not supported`);\r\n }\r\n\r\n const promises = new Array<Promise<any>>();\r\n\r\n babylonMaterial.clearCoat.isEnabled = true;\r\n babylonMaterial.clearCoat.useRoughnessFromMainTexture = false;\r\n babylonMaterial.clearCoat.remapF0OnInterfaceChange = false;\r\n\r\n if (properties.clearcoatFactor != undefined) {\r\n babylonMaterial.clearCoat.intensity = properties.clearcoatFactor;\r\n } else {\r\n babylonMaterial.clearCoat.intensity = 0;\r\n }\r\n\r\n if (properties.clearcoatTexture) {\r\n promises.push(\r\n this._loader.loadTextureInfoAsync(`${context}/clearcoatTexture`, properties.clearcoatTexture, (texture) => {\r\n texture.name = `${babylonMaterial.name} (ClearCoat)`;\r\n babylonMaterial.clearCoat.texture = texture;\r\n })\r\n );\r\n }\r\n\r\n if (properties.clearcoatRoughnessFactor != undefined) {\r\n babylonMaterial.clearCoat.roughness = properties.clearcoatRoughnessFactor;\r\n } else {\r\n babylonMaterial.clearCoat.roughness = 0;\r\n }\r\n\r\n if (properties.clearcoatRoughnessTexture) {\r\n (properties.clearcoatRoughnessTexture as ITextureInfo).nonColorData = true;\r\n promises.push(\r\n this._loader.loadTextureInfoAsync(`${context}/clearcoatRoughnessTexture`, properties.clearcoatRoughnessTexture, (texture) => {\r\n texture.name = `${babylonMaterial.name} (ClearCoat Roughness)`;\r\n babylonMaterial.clearCoat.textureRoughness = texture;\r\n })\r\n );\r\n }\r\n\r\n if (properties.clearcoatNormalTexture) {\r\n (properties.clearcoatNormalTexture as ITextureInfo).nonColorData = true;\r\n promises.push(\r\n this._loader.loadTextureInfoAsync(`${context}/clearcoatNormalTexture`, properties.clearcoatNormalTexture, (texture) => {\r\n texture.name = `${babylonMaterial.name} (ClearCoat Normal)`;\r\n babylonMaterial.clearCoat.bumpTexture = texture;\r\n })\r\n );\r\n\r\n babylonMaterial.invertNormalMapX = !babylonMaterial.getScene().useRightHandedSystem;\r\n babylonMaterial.invertNormalMapY = babylonMaterial.getScene().useRightHandedSystem;\r\n if (properties.clearcoatNormalTexture.scale != undefined) {\r\n babylonMaterial.clearCoat.bumpTexture!.level = properties.clearcoatNormalTexture.scale;\r\n }\r\n }\r\n\r\n // eslint-disable-next-line github/no-then\r\n return Promise.all(promises).then(() => {});\r\n }\r\n}\r\n\r\nunregisterGLTFExtension(NAME);\r\nregisterGLTFExtension(NAME, true, (loader) => new KHR_materials_clearcoat(loader));\r\n"]}
|