@babylonjs/loaders 7.51.0 → 7.51.2
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/glTF/2.0/Extensions/KHR_animation_pointer.d.ts +1 -0
- package/glTF/2.0/Extensions/KHR_animation_pointer.data.d.ts +0 -299
- package/glTF/2.0/Extensions/KHR_animation_pointer.data.js +190 -224
- package/glTF/2.0/Extensions/KHR_animation_pointer.data.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_animation_pointer.js +11 -14
- package/glTF/2.0/Extensions/KHR_animation_pointer.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_interactivity/declarationMapper.d.ts +339 -0
- package/glTF/2.0/Extensions/KHR_interactivity/declarationMapper.js +1507 -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 +71 -0
- package/glTF/2.0/Extensions/KHR_interactivity/interactivityGraphParser.js +442 -0
- package/glTF/2.0/Extensions/KHR_interactivity/interactivityGraphParser.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_interactivity.d.ts +7 -1
- package/glTF/2.0/Extensions/KHR_interactivity.js +105 -7
- package/glTF/2.0/Extensions/KHR_interactivity.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_node_hoverability.js +153 -0
- package/glTF/2.0/Extensions/KHR_node_hoverability.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_node_selectability.d.ts +30 -0
- package/glTF/2.0/Extensions/KHR_node_selectability.js +123 -0
- package/glTF/2.0/Extensions/KHR_node_selectability.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_node_visibility.js +25 -0
- package/glTF/2.0/Extensions/KHR_node_visibility.js.map +1 -1
- package/glTF/2.0/Extensions/gltfPathToObjectConverter.d.ts +5 -2
- package/glTF/2.0/Extensions/gltfPathToObjectConverter.js +26 -5
- package/glTF/2.0/Extensions/gltfPathToObjectConverter.js.map +1 -1
- package/glTF/2.0/Extensions/index.d.ts +4 -0
- package/glTF/2.0/Extensions/index.js +5 -0
- package/glTF/2.0/Extensions/index.js.map +1 -1
- package/glTF/2.0/Extensions/objectModelMapping.d.ts +289 -0
- package/glTF/2.0/Extensions/objectModelMapping.js +801 -0
- package/glTF/2.0/Extensions/objectModelMapping.js.map +1 -0
- package/glTF/2.0/glTFLoader.d.ts +4 -1
- package/glTF/2.0/glTFLoader.js +22 -11
- package/glTF/2.0/glTFLoader.js.map +1 -1
- package/glTF/2.0/glTFLoaderAnimation.d.ts +12 -10
- package/glTF/2.0/glTFLoaderAnimation.js +13 -11
- package/glTF/2.0/glTFLoaderAnimation.js.map +1 -1
- package/glTF/2.0/index.d.ts +1 -0
- package/glTF/2.0/index.js +1 -0
- package/glTF/2.0/index.js.map +1 -1
- package/package.json +3 -3
- package/glTF/2.0/Extensions/interactivityFunctions.d.ts +0 -9
- package/glTF/2.0/Extensions/interactivityFunctions.js +0 -198
- package/glTF/2.0/Extensions/interactivityFunctions.js.map +0 -1
- package/glTF/2.0/Extensions/interactivityPathToObjectConverter.d.ts +0 -9
- package/glTF/2.0/Extensions/interactivityPathToObjectConverter.js +0 -32
- package/glTF/2.0/Extensions/interactivityPathToObjectConverter.js.map +0 -1
- package/glTF/2.0/Extensions/interactivityUtils.d.ts +0 -4
- package/glTF/2.0/Extensions/interactivityUtils.js +0 -108
- package/glTF/2.0/Extensions/interactivityUtils.js.map +0 -1
@@ -1,8 +1,10 @@
|
|
1
1
|
import { FlowGraphCoordinator } from "@babylonjs/core/FlowGraph/flowGraphCoordinator.js";
|
2
|
-
import {
|
3
|
-
import { convertGLTFToSerializedFlowGraph } from "./interactivityFunctions.js";
|
4
|
-
import { InteractivityPathToObjectConverter } from "./interactivityPathToObjectConverter.js";
|
2
|
+
import { ParseFlowGraphAsync } from "@babylonjs/core/FlowGraph/flowGraphParser.js";
|
5
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";
|
6
8
|
const NAME = "KHR_interactivity";
|
7
9
|
/**
|
8
10
|
* Loader extension for KHR_interactivity
|
@@ -19,24 +21,120 @@ export class KHR_interactivity {
|
|
19
21
|
*/
|
20
22
|
this.name = NAME;
|
21
23
|
this.enabled = this._loader.isExtensionUsed(NAME);
|
22
|
-
this._pathConverter =
|
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
|
+
}
|
23
32
|
}
|
24
33
|
dispose() {
|
25
34
|
this._loader = null;
|
26
35
|
delete this._pathConverter;
|
27
36
|
}
|
28
|
-
onReady() {
|
37
|
+
async onReady() {
|
29
38
|
if (!this._loader.babylonScene || !this._pathConverter) {
|
30
39
|
return;
|
31
40
|
}
|
32
41
|
const scene = this._loader.babylonScene;
|
33
42
|
const interactivityDefinition = this._loader.gltf.extensions?.KHR_interactivity;
|
34
|
-
|
43
|
+
if (!interactivityDefinition) {
|
44
|
+
// This can technically throw, but it's not a critical error
|
45
|
+
return;
|
46
|
+
}
|
35
47
|
const coordinator = new FlowGraphCoordinator({ scene });
|
36
|
-
|
48
|
+
const graphs = interactivityDefinition.graphs.map((graph) => {
|
49
|
+
const parser = new InteractivityGraphToFlowGraphParser(graph, this._loader.gltf, this._loader);
|
50
|
+
return parser.serializeToFlowGraph();
|
51
|
+
});
|
52
|
+
// parse each graph async
|
53
|
+
await Promise.all(graphs.map((graph) => ParseFlowGraphAsync(graph, { coordinator, pathConverter: this._pathConverter })));
|
37
54
|
coordinator.start();
|
38
55
|
}
|
39
56
|
}
|
57
|
+
/**
|
58
|
+
* @internal
|
59
|
+
* populates the object model with the interactivity extension
|
60
|
+
*/
|
61
|
+
export function _AddInteractivityObjectModel(scene) {
|
62
|
+
// Note - all of those are read-only, as per the specs!
|
63
|
+
// active camera rotation
|
64
|
+
AddObjectAccessorToKey("/extensions/KHR_interactivity/?/activeCamera/rotation", {
|
65
|
+
get: () => {
|
66
|
+
if (!scene.activeCamera) {
|
67
|
+
return new Quaternion(NaN, NaN, NaN, NaN);
|
68
|
+
}
|
69
|
+
return Quaternion.FromRotationMatrix(scene.activeCamera.getWorldMatrix()).normalize();
|
70
|
+
},
|
71
|
+
type: "Quaternion",
|
72
|
+
getTarget: () => scene.activeCamera,
|
73
|
+
});
|
74
|
+
// activeCamera position
|
75
|
+
AddObjectAccessorToKey("/extensions/KHR_interactivity/?/activeCamera/position", {
|
76
|
+
get: () => {
|
77
|
+
if (!scene.activeCamera) {
|
78
|
+
return new Vector3(NaN, NaN, NaN);
|
79
|
+
}
|
80
|
+
return scene.activeCamera.position; // not global position
|
81
|
+
},
|
82
|
+
type: "Vector3",
|
83
|
+
getTarget: () => scene.activeCamera,
|
84
|
+
});
|
85
|
+
// /animations/{} pointers:
|
86
|
+
AddObjectAccessorToKey("/animations/{}/extensions/KHR_interactivity/isPlaying", {
|
87
|
+
get: (animation) => {
|
88
|
+
return animation._babylonAnimationGroup?.isPlaying ?? false;
|
89
|
+
},
|
90
|
+
type: "boolean",
|
91
|
+
getTarget: (animation) => {
|
92
|
+
return animation._babylonAnimationGroup;
|
93
|
+
},
|
94
|
+
});
|
95
|
+
AddObjectAccessorToKey("/animations/{}/extensions/KHR_interactivity/minTime", {
|
96
|
+
get: (animation) => {
|
97
|
+
return (animation._babylonAnimationGroup?.from ?? 0) / 60; // fixed factor for duration-to-frames conversion
|
98
|
+
},
|
99
|
+
type: "number",
|
100
|
+
getTarget: (animation) => {
|
101
|
+
return animation._babylonAnimationGroup;
|
102
|
+
},
|
103
|
+
});
|
104
|
+
AddObjectAccessorToKey("/animations/{}/extensions/KHR_interactivity/maxTime", {
|
105
|
+
get: (animation) => {
|
106
|
+
return (animation._babylonAnimationGroup?.to ?? 0) / 60; // fixed factor for duration-to-frames conversion
|
107
|
+
},
|
108
|
+
type: "number",
|
109
|
+
getTarget: (animation) => {
|
110
|
+
return animation._babylonAnimationGroup;
|
111
|
+
},
|
112
|
+
});
|
113
|
+
// playhead
|
114
|
+
AddObjectAccessorToKey("/animations/{}/extensions/KHR_interactivity/playhead", {
|
115
|
+
get: (animation) => {
|
116
|
+
return (animation._babylonAnimationGroup?.getCurrentFrame() ?? 0) / 60; // fixed factor for duration-to-frames conversion
|
117
|
+
},
|
118
|
+
type: "number",
|
119
|
+
getTarget: (animation) => {
|
120
|
+
return animation._babylonAnimationGroup;
|
121
|
+
},
|
122
|
+
});
|
123
|
+
//virtualPlayhead - TODO, do we support this property in our animations? getCurrentFrame is the only method we have for this.
|
124
|
+
AddObjectAccessorToKey("/animations/{}/extensions/KHR_interactivity/virtualPlayhead", {
|
125
|
+
get: (animation) => {
|
126
|
+
return (animation._babylonAnimationGroup?.getCurrentFrame() ?? 0) / 60; // fixed factor for duration-to-frames conversion
|
127
|
+
},
|
128
|
+
type: "number",
|
129
|
+
getTarget: (animation) => {
|
130
|
+
return animation._babylonAnimationGroup;
|
131
|
+
},
|
132
|
+
});
|
133
|
+
}
|
134
|
+
// Register flow graph blocks. Do it here so they are available when the extension is enabled.
|
135
|
+
addToBlockFactory(NAME, "FlowGraphGLTFDataProvider", async () => {
|
136
|
+
return (await import("./KHR_interactivity/flowGraphGLTFDataProvider.js")).FlowGraphGLTFDataProvider;
|
137
|
+
});
|
40
138
|
unregisterGLTFExtension(NAME);
|
41
139
|
registerGLTFExtension(NAME, true, (loader) => new KHR_interactivity(loader));
|
42
140
|
//# sourceMappingURL=KHR_interactivity.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"KHR_interactivity.js","sourceRoot":"","sources":["../../../../../../dev/loaders/src/glTF/2.0/Extensions/KHR_interactivity.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,oBAAoB,EAAE,0DAA4C;AAC3E,OAAO,EAAE,SAAS,EAAE,+CAAiC;AACrD,OAAO,EAAE,gCAAgC,EAAE,MAAM,0BAA0B,CAAC;AAC5E,OAAO,EAAE,kCAAkC,EAAE,MAAM,sCAAsC,CAAC;AAC1F,OAAO,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AAEhG,MAAM,IAAI,GAAG,mBAAmB,CAAC;AAajC;;GAEG;AACH,MAAM,OAAO,iBAAiB;IAY1B;;;OAGG;IACH,YAAoB,OAAmB;QAAnB,YAAO,GAAP,OAAO,CAAY;QAfvC;;WAEG;QACa,SAAI,GAAG,IAAI,CAAC;QAaxB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAClD,IAAI,CAAC,cAAc,GAAG,IAAI,kCAAkC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACpF,CAAC;IAEM,OAAO;QACT,IAAI,CAAC,OAAe,GAAG,IAAI,CAAC;QAC7B,OAAO,IAAI,CAAC,cAAc,CAAC;IAC/B,CAAC;IAEM,OAAO;QACV,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;YACrD,OAAO;QACX,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC;QACxC,MAAM,uBAAuB,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,iBAAsC,CAAC;QAErG,MAAM,IAAI,GAAG,gCAAgC,CAAC,uBAAuB,CAAC,CAAC;QACvE,MAAM,WAAW,GAAG,IAAI,oBAAoB,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QACxD,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,WAAW,EAAE,aAAa,EAAE,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC;QAE3E,WAAW,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;CACJ;AAED,uBAAuB,CAAC,IAAI,CAAC,CAAC;AAC9B,qBAAqB,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC","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 { FlowGraph } from \"core/FlowGraph/flowGraph\";\r\nimport { convertGLTFToSerializedFlowGraph } from \"./interactivityFunctions\";\r\nimport { InteractivityPathToObjectConverter } from \"./interactivityPathToObjectConverter\";\r\nimport { registerGLTFExtension, unregisterGLTFExtension } from \"../glTFLoaderExtensionRegistry\";\r\n\r\nconst NAME = \"KHR_interactivity\";\r\n\r\ndeclare module \"../../glTFFileLoader\" {\r\n // eslint-disable-next-line jsdoc/require-jsdoc\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?: InteractivityPathToObjectConverter;\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 = new InteractivityPathToObjectConverter(this._loader.gltf);\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 public onReady(): 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\r\n const json = convertGLTFToSerializedFlowGraph(interactivityDefinition);\r\n const coordinator = new FlowGraphCoordinator({ scene });\r\n FlowGraph.Parse(json, { coordinator, pathConverter: this._pathConverter });\r\n\r\n coordinator.start();\r\n }\r\n}\r\n\r\nunregisterGLTFExtension(NAME);\r\nregisterGLTFExtension(NAME, true, (loader) => new KHR_interactivity(loader));\r\n"]}
|
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\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 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 const graphs = interactivityDefinition.graphs.map((graph) => {\r\n const parser = new InteractivityGraphToFlowGraphParser(graph, this._loader.gltf, this._loader);\r\n return parser.serializeToFlowGraph();\r\n });\r\n // parse each graph async\r\n await Promise.all(graphs.map((graph) => 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 return Quaternion.FromRotationMatrix(scene.activeCamera.getWorldMatrix()).normalize();\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 return scene.activeCamera.position; // not global position\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"]}
|
@@ -1,5 +1,158 @@
|
|
1
1
|
import { registerGLTFExtension, unregisterGLTFExtension } from "../glTFLoaderExtensionRegistry.js";
|
2
|
+
import { addNewInteractivityFlowGraphMapping } from "./KHR_interactivity/declarationMapper.js";
|
3
|
+
import { AddObjectAccessorToKey } from "./objectModelMapping.js";
|
2
4
|
const NAME = "KHR_node_hoverability";
|
5
|
+
// interactivity
|
6
|
+
const meshPointerOverPrefix = "targetMeshPointerOver_";
|
7
|
+
addNewInteractivityFlowGraphMapping("event/onHoverIn", NAME, {
|
8
|
+
// using GetVariable as the nodeIndex is a configuration and not a value (i.e. it's not mutable)
|
9
|
+
blocks: ["FlowGraphPointerOverEventBlock" /* FlowGraphBlockNames.PointerOverEvent */, "FlowGraphGetVariableBlock" /* FlowGraphBlockNames.GetVariable */, "FlowGraphIndexOfBlock" /* FlowGraphBlockNames.IndexOf */, "KHR_interactivity/FlowGraphGLTFDataProvider"],
|
10
|
+
configuration: {
|
11
|
+
stopPropagation: { name: "stopPropagation" },
|
12
|
+
nodeIndex: {
|
13
|
+
name: "variable",
|
14
|
+
toBlock: "FlowGraphGetVariableBlock" /* FlowGraphBlockNames.GetVariable */,
|
15
|
+
dataTransformer(data) {
|
16
|
+
return [meshPointerOverPrefix + data[0]];
|
17
|
+
},
|
18
|
+
},
|
19
|
+
},
|
20
|
+
outputs: {
|
21
|
+
values: {
|
22
|
+
hoverNodeIndex: { name: "index", toBlock: "FlowGraphIndexOfBlock" /* FlowGraphBlockNames.IndexOf */ },
|
23
|
+
controllerIndex: { name: "pointerId" },
|
24
|
+
},
|
25
|
+
flows: {
|
26
|
+
out: { name: "done" },
|
27
|
+
},
|
28
|
+
},
|
29
|
+
interBlockConnectors: [
|
30
|
+
{
|
31
|
+
input: "targetMesh",
|
32
|
+
output: "value",
|
33
|
+
inputBlockIndex: 0,
|
34
|
+
outputBlockIndex: 1,
|
35
|
+
isVariable: true,
|
36
|
+
},
|
37
|
+
{
|
38
|
+
input: "array",
|
39
|
+
output: "nodes",
|
40
|
+
inputBlockIndex: 2,
|
41
|
+
outputBlockIndex: 3,
|
42
|
+
isVariable: true,
|
43
|
+
},
|
44
|
+
{
|
45
|
+
input: "object",
|
46
|
+
output: "meshUnderPointer",
|
47
|
+
inputBlockIndex: 2,
|
48
|
+
outputBlockIndex: 0,
|
49
|
+
isVariable: true,
|
50
|
+
},
|
51
|
+
],
|
52
|
+
extraProcessor(gltfBlock, _declaration, _mapping, _arrays, serializedObjects, context, globalGLTF) {
|
53
|
+
// add the glTF to the configuration of the last serialized object
|
54
|
+
const serializedObject = serializedObjects[serializedObjects.length - 1];
|
55
|
+
serializedObject.config = serializedObject.config || {};
|
56
|
+
serializedObject.config.glTF = globalGLTF;
|
57
|
+
// find the listener nodeIndex value
|
58
|
+
const nodeIndex = gltfBlock.configuration?.["nodeIndex"]?.value[0];
|
59
|
+
if (nodeIndex === undefined || typeof nodeIndex !== "number") {
|
60
|
+
throw new Error("nodeIndex not found in configuration");
|
61
|
+
}
|
62
|
+
const variableName = meshPointerOverPrefix + nodeIndex;
|
63
|
+
// find the nodeIndex value
|
64
|
+
serializedObjects[1].config.variable = variableName;
|
65
|
+
context._userVariables[variableName] = {
|
66
|
+
className: "Mesh",
|
67
|
+
id: globalGLTF?.nodes?.[nodeIndex]._babylonTransformNode?.id,
|
68
|
+
uniqueId: globalGLTF?.nodes?.[nodeIndex]._babylonTransformNode?.uniqueId,
|
69
|
+
};
|
70
|
+
return serializedObjects;
|
71
|
+
},
|
72
|
+
});
|
73
|
+
const meshPointerOutPrefix = "targetMeshPointerOut_";
|
74
|
+
addNewInteractivityFlowGraphMapping("event/onHoverOut", NAME, {
|
75
|
+
// using GetVariable as the nodeIndex is a configuration and not a value (i.e. it's not mutable)
|
76
|
+
blocks: ["FlowGraphPointerOutEventBlock" /* FlowGraphBlockNames.PointerOutEvent */, "FlowGraphGetVariableBlock" /* FlowGraphBlockNames.GetVariable */, "FlowGraphIndexOfBlock" /* FlowGraphBlockNames.IndexOf */, "KHR_interactivity/FlowGraphGLTFDataProvider"],
|
77
|
+
configuration: {
|
78
|
+
stopPropagation: { name: "stopPropagation" },
|
79
|
+
nodeIndex: {
|
80
|
+
name: "variable",
|
81
|
+
toBlock: "FlowGraphGetVariableBlock" /* FlowGraphBlockNames.GetVariable */,
|
82
|
+
dataTransformer(data) {
|
83
|
+
return [meshPointerOutPrefix + data[0]];
|
84
|
+
},
|
85
|
+
},
|
86
|
+
},
|
87
|
+
outputs: {
|
88
|
+
values: {
|
89
|
+
hoverNodeIndex: { name: "index", toBlock: "FlowGraphIndexOfBlock" /* FlowGraphBlockNames.IndexOf */ },
|
90
|
+
controllerIndex: { name: "pointerId" },
|
91
|
+
},
|
92
|
+
flows: {
|
93
|
+
out: { name: "done" },
|
94
|
+
},
|
95
|
+
},
|
96
|
+
interBlockConnectors: [
|
97
|
+
{
|
98
|
+
input: "targetMesh",
|
99
|
+
output: "value",
|
100
|
+
inputBlockIndex: 0,
|
101
|
+
outputBlockIndex: 1,
|
102
|
+
isVariable: true,
|
103
|
+
},
|
104
|
+
{
|
105
|
+
input: "array",
|
106
|
+
output: "nodes",
|
107
|
+
inputBlockIndex: 2,
|
108
|
+
outputBlockIndex: 3,
|
109
|
+
isVariable: true,
|
110
|
+
},
|
111
|
+
{
|
112
|
+
input: "object",
|
113
|
+
output: "meshOutOfPointer",
|
114
|
+
inputBlockIndex: 2,
|
115
|
+
outputBlockIndex: 0,
|
116
|
+
isVariable: true,
|
117
|
+
},
|
118
|
+
],
|
119
|
+
extraProcessor(gltfBlock, _declaration, _mapping, _arrays, serializedObjects, context, globalGLTF) {
|
120
|
+
// add the glTF to the configuration of the last serialized object
|
121
|
+
const serializedObject = serializedObjects[serializedObjects.length - 1];
|
122
|
+
serializedObject.config = serializedObject.config || {};
|
123
|
+
serializedObject.config.glTF = globalGLTF;
|
124
|
+
const nodeIndex = gltfBlock.configuration?.["nodeIndex"]?.value[0];
|
125
|
+
if (nodeIndex === undefined || typeof nodeIndex !== "number") {
|
126
|
+
throw new Error("nodeIndex not found in configuration");
|
127
|
+
}
|
128
|
+
const variableName = meshPointerOutPrefix + nodeIndex;
|
129
|
+
// find the nodeIndex value
|
130
|
+
serializedObjects[1].config.variable = variableName;
|
131
|
+
context._userVariables[variableName] = {
|
132
|
+
className: "Mesh",
|
133
|
+
id: globalGLTF?.nodes?.[nodeIndex]._babylonTransformNode?.id,
|
134
|
+
uniqueId: globalGLTF?.nodes?.[nodeIndex]._babylonTransformNode?.uniqueId,
|
135
|
+
};
|
136
|
+
return serializedObjects;
|
137
|
+
},
|
138
|
+
});
|
139
|
+
AddObjectAccessorToKey("/nodes/{}/extensions/KHR_node_hoverability/hoverable", {
|
140
|
+
get: (node) => {
|
141
|
+
const tn = node._babylonTransformNode;
|
142
|
+
if (tn && tn.pointerOverDisableMeshTesting !== undefined) {
|
143
|
+
return tn.pointerOverDisableMeshTesting;
|
144
|
+
}
|
145
|
+
return true;
|
146
|
+
},
|
147
|
+
set: (value, node) => {
|
148
|
+
node._primitiveBabylonMeshes?.forEach((mesh) => {
|
149
|
+
mesh.pointerOverDisableMeshTesting = !value;
|
150
|
+
});
|
151
|
+
},
|
152
|
+
getTarget: (node) => node._babylonTransformNode,
|
153
|
+
getPropertyName: [() => "pointerOverDisableMeshTesting"],
|
154
|
+
type: "boolean",
|
155
|
+
});
|
3
156
|
/**
|
4
157
|
* Loader extension for KHR_node_hoverability
|
5
158
|
* @see https://github.com/KhronosGroup/glTF/pull/2426
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"KHR_node_hoverability.js","sourceRoot":"","sources":["../../../../../../dev/loaders/src/glTF/2.0/Extensions/KHR_node_hoverability.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AAEhG,MAAM,IAAI,GAAG,uBAAuB,CAAC;AAarC;;;GAGG;AACH,gEAAgE;AAChE,MAAM,OAAO,qBAAqB;IAY9B;;OAEG;IACH,YAAY,MAAkB;QAd9B;;WAEG;QACa,SAAI,GAAG,IAAI,CAAC;QAYxB,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;QACtB,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;IAChD,CAAC;IAEM,KAAK,CAAC,OAAO;QAChB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;YACtC,0CAA0C;YAC1C,IAAI,IAAI,CAAC,UAAU,EAAE,qBAAqB,IAAI,IAAI,CAAC,UAAU,EAAE,qBAAqB,CAAC,SAAS,KAAK,KAAK,EAAE,CAAC;gBACvG,IAAI,CAAC,qBAAqB,EAAE,cAAc,EAAE,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;oBAC1D,IAAI,CAAC,6BAA6B,GAAG,IAAI,CAAC;gBAC9C,CAAC,CAAC,CAAC;YACP,CAAC;QACL,CAAC,CAAC,CAAC;IACP,CAAC;IAEM,OAAO;QACT,IAAI,CAAC,OAAe,GAAG,IAAI,CAAC;IACjC,CAAC;CACJ;AAED,uBAAuB,CAAC,IAAI,CAAC,CAAC;AAC9B,qBAAqB,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,qBAAqB,CAAC,MAAM,CAAC,CAAC,CAAC","sourcesContent":["import type { GLTFLoader } from \"../glTFLoader\";\nimport type { IGLTFLoaderExtension } from \"../glTFLoaderExtension\";\nimport { registerGLTFExtension, unregisterGLTFExtension } from \"../glTFLoaderExtensionRegistry\";\n\nconst NAME = \"KHR_node_hoverability\";\n\ndeclare module \"../../glTFFileLoader\" {\n // eslint-disable-next-line jsdoc/require-jsdoc\n export interface GLTFLoaderExtensionOptions {\n /**\n * Defines options for the KHR_node_hoverability extension.\n */\n // NOTE: Don't use NAME here as it will break the UMD type declarations.\n [\"KHR_node_hoverability\"]: {};\n }\n}\n\n/**\n * Loader extension for KHR_node_hoverability\n * @see https://github.com/KhronosGroup/glTF/pull/2426\n */\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport class KHR_node_hoverability implements IGLTFLoaderExtension {\n /**\n * The name of this extension.\n */\n public readonly name = NAME;\n /**\n * Defines whether this extension is enabled.\n */\n public enabled: boolean;\n\n private _loader: GLTFLoader;\n\n /**\n * @internal\n */\n constructor(loader: GLTFLoader) {\n this._loader = loader;\n this.enabled = loader.isExtensionUsed(NAME);\n }\n\n public async onReady(): Promise<void> {\n this._loader.gltf.nodes?.forEach((node) => {\n // default is true, so only apply if false\n if (node.extensions?.KHR_node_hoverability && node.extensions?.KHR_node_hoverability.hoverable === false) {\n node._babylonTransformNode?.getChildMeshes().forEach((mesh) => {\n mesh.pointerOverDisableMeshTesting = true;\n });\n }\n });\n }\n\n public dispose() {\n (this._loader as any) = null;\n }\n}\n\nunregisterGLTFExtension(NAME);\nregisterGLTFExtension(NAME, true, (loader) => new KHR_node_hoverability(loader));\n"]}
|
1
|
+
{"version":3,"file":"KHR_node_hoverability.js","sourceRoot":"","sources":["../../../../../../dev/loaders/src/glTF/2.0/Extensions/KHR_node_hoverability.ts"],"names":[],"mappings":"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","sourcesContent":["import { FlowGraphBlockNames } from \"core/FlowGraph/Blocks/flowGraphBlockNames\";\nimport type { GLTFLoader } from \"../glTFLoader\";\nimport type { IGLTFLoaderExtension } from \"../glTFLoaderExtension\";\nimport { registerGLTFExtension, unregisterGLTFExtension } from \"../glTFLoaderExtensionRegistry\";\nimport { addNewInteractivityFlowGraphMapping } from \"./KHR_interactivity/declarationMapper\";\nimport type { INode } from \"../glTFLoaderInterfaces\";\nimport { AddObjectAccessorToKey } from \"./objectModelMapping\";\n\nconst NAME = \"KHR_node_hoverability\";\n\ndeclare module \"../../glTFFileLoader\" {\n // eslint-disable-next-line jsdoc/require-jsdoc\n export interface GLTFLoaderExtensionOptions {\n /**\n * Defines options for the KHR_node_hoverability extension.\n */\n // NOTE: Don't use NAME here as it will break the UMD type declarations.\n [\"KHR_node_hoverability\"]: {};\n }\n}\n\n// interactivity\nconst meshPointerOverPrefix = \"targetMeshPointerOver_\";\naddNewInteractivityFlowGraphMapping(\"event/onHoverIn\", NAME, {\n // using GetVariable as the nodeIndex is a configuration and not a value (i.e. it's not mutable)\n blocks: [FlowGraphBlockNames.PointerOverEvent, FlowGraphBlockNames.GetVariable, FlowGraphBlockNames.IndexOf, \"KHR_interactivity/FlowGraphGLTFDataProvider\"],\n configuration: {\n stopPropagation: { name: \"stopPropagation\" },\n nodeIndex: {\n name: \"variable\",\n toBlock: FlowGraphBlockNames.GetVariable,\n dataTransformer(data) {\n return [meshPointerOverPrefix + data[0]];\n },\n },\n },\n outputs: {\n values: {\n hoverNodeIndex: { name: \"index\", toBlock: FlowGraphBlockNames.IndexOf },\n controllerIndex: { name: \"pointerId\" },\n },\n flows: {\n out: { name: \"done\" },\n },\n },\n interBlockConnectors: [\n {\n input: \"targetMesh\",\n output: \"value\",\n inputBlockIndex: 0,\n outputBlockIndex: 1,\n isVariable: true,\n },\n {\n input: \"array\",\n output: \"nodes\",\n inputBlockIndex: 2,\n outputBlockIndex: 3,\n isVariable: true,\n },\n {\n input: \"object\",\n output: \"meshUnderPointer\",\n inputBlockIndex: 2,\n outputBlockIndex: 0,\n isVariable: true,\n },\n ],\n extraProcessor(gltfBlock, _declaration, _mapping, _arrays, serializedObjects, context, globalGLTF) {\n // add the glTF to the configuration of the last serialized object\n const serializedObject = serializedObjects[serializedObjects.length - 1];\n serializedObject.config = serializedObject.config || {};\n serializedObject.config.glTF = globalGLTF;\n // find the listener nodeIndex value\n const nodeIndex = gltfBlock.configuration?.[\"nodeIndex\"]?.value[0];\n if (nodeIndex === undefined || typeof nodeIndex !== \"number\") {\n throw new Error(\"nodeIndex not found in configuration\");\n }\n const variableName = meshPointerOverPrefix + nodeIndex;\n // find the nodeIndex value\n serializedObjects[1].config.variable = variableName;\n context._userVariables[variableName] = {\n className: \"Mesh\",\n id: globalGLTF?.nodes?.[nodeIndex]._babylonTransformNode?.id,\n uniqueId: globalGLTF?.nodes?.[nodeIndex]._babylonTransformNode?.uniqueId,\n };\n return serializedObjects;\n },\n});\n\nconst meshPointerOutPrefix = \"targetMeshPointerOut_\";\naddNewInteractivityFlowGraphMapping(\"event/onHoverOut\", NAME, {\n // using GetVariable as the nodeIndex is a configuration and not a value (i.e. it's not mutable)\n blocks: [FlowGraphBlockNames.PointerOutEvent, FlowGraphBlockNames.GetVariable, FlowGraphBlockNames.IndexOf, \"KHR_interactivity/FlowGraphGLTFDataProvider\"],\n configuration: {\n stopPropagation: { name: \"stopPropagation\" },\n nodeIndex: {\n name: \"variable\",\n toBlock: FlowGraphBlockNames.GetVariable,\n dataTransformer(data) {\n return [meshPointerOutPrefix + data[0]];\n },\n },\n },\n outputs: {\n values: {\n hoverNodeIndex: { name: \"index\", toBlock: FlowGraphBlockNames.IndexOf },\n controllerIndex: { name: \"pointerId\" },\n },\n flows: {\n out: { name: \"done\" },\n },\n },\n interBlockConnectors: [\n {\n input: \"targetMesh\",\n output: \"value\",\n inputBlockIndex: 0,\n outputBlockIndex: 1,\n isVariable: true,\n },\n {\n input: \"array\",\n output: \"nodes\",\n inputBlockIndex: 2,\n outputBlockIndex: 3,\n isVariable: true,\n },\n {\n input: \"object\",\n output: \"meshOutOfPointer\",\n inputBlockIndex: 2,\n outputBlockIndex: 0,\n isVariable: true,\n },\n ],\n extraProcessor(gltfBlock, _declaration, _mapping, _arrays, serializedObjects, context, globalGLTF) {\n // add the glTF to the configuration of the last serialized object\n const serializedObject = serializedObjects[serializedObjects.length - 1];\n serializedObject.config = serializedObject.config || {};\n serializedObject.config.glTF = globalGLTF;\n\n const nodeIndex = gltfBlock.configuration?.[\"nodeIndex\"]?.value[0];\n if (nodeIndex === undefined || typeof nodeIndex !== \"number\") {\n throw new Error(\"nodeIndex not found in configuration\");\n }\n const variableName = meshPointerOutPrefix + nodeIndex;\n // find the nodeIndex value\n serializedObjects[1].config.variable = variableName;\n context._userVariables[variableName] = {\n className: \"Mesh\",\n id: globalGLTF?.nodes?.[nodeIndex]._babylonTransformNode?.id,\n uniqueId: globalGLTF?.nodes?.[nodeIndex]._babylonTransformNode?.uniqueId,\n };\n return serializedObjects;\n },\n});\n\nAddObjectAccessorToKey(\"/nodes/{}/extensions/KHR_node_hoverability/hoverable\", {\n get: (node: INode) => {\n const tn = node._babylonTransformNode as any;\n if (tn && tn.pointerOverDisableMeshTesting !== undefined) {\n return tn.pointerOverDisableMeshTesting;\n }\n return true;\n },\n set: (value: boolean, node: INode) => {\n node._primitiveBabylonMeshes?.forEach((mesh) => {\n mesh.pointerOverDisableMeshTesting = !value;\n });\n },\n getTarget: (node: INode) => node._babylonTransformNode,\n getPropertyName: [() => \"pointerOverDisableMeshTesting\"],\n type: \"boolean\",\n});\n\n/**\n * Loader extension for KHR_node_hoverability\n * @see https://github.com/KhronosGroup/glTF/pull/2426\n */\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport class KHR_node_hoverability implements IGLTFLoaderExtension {\n /**\n * The name of this extension.\n */\n public readonly name = NAME;\n /**\n * Defines whether this extension is enabled.\n */\n public enabled: boolean;\n\n private _loader: GLTFLoader;\n\n /**\n * @internal\n */\n constructor(loader: GLTFLoader) {\n this._loader = loader;\n this.enabled = loader.isExtensionUsed(NAME);\n }\n\n public async onReady(): Promise<void> {\n this._loader.gltf.nodes?.forEach((node) => {\n // default is true, so only apply if false\n if (node.extensions?.KHR_node_hoverability && node.extensions?.KHR_node_hoverability.hoverable === false) {\n node._babylonTransformNode?.getChildMeshes().forEach((mesh) => {\n mesh.pointerOverDisableMeshTesting = true;\n });\n }\n });\n }\n\n public dispose() {\n (this._loader as any) = null;\n }\n}\n\nunregisterGLTFExtension(NAME);\nregisterGLTFExtension(NAME, true, (loader) => new KHR_node_hoverability(loader));\n"]}
|
@@ -0,0 +1,30 @@
|
|
1
|
+
import type { GLTFLoader } from "../glTFLoader";
|
2
|
+
import type { IGLTFLoaderExtension } from "../glTFLoaderExtension";
|
3
|
+
declare module "../../glTFFileLoader" {
|
4
|
+
interface GLTFLoaderExtensionOptions {
|
5
|
+
/**
|
6
|
+
* Defines options for the KHR_selectability extension.
|
7
|
+
*/
|
8
|
+
["KHR_node_selectability"]: {};
|
9
|
+
}
|
10
|
+
}
|
11
|
+
/**
|
12
|
+
* Loader extension for KHR_selectability
|
13
|
+
*/
|
14
|
+
export declare class KHR_node_selectability implements IGLTFLoaderExtension {
|
15
|
+
/**
|
16
|
+
* The name of this extension.
|
17
|
+
*/
|
18
|
+
readonly name = "KHR_node_selectability";
|
19
|
+
/**
|
20
|
+
* Defines whether this extension is enabled.
|
21
|
+
*/
|
22
|
+
enabled: boolean;
|
23
|
+
private _loader;
|
24
|
+
/**
|
25
|
+
* @internal
|
26
|
+
*/
|
27
|
+
constructor(loader: GLTFLoader);
|
28
|
+
onReady(): Promise<void>;
|
29
|
+
dispose(): void;
|
30
|
+
}
|
@@ -0,0 +1,123 @@
|
|
1
|
+
import { registerGLTFExtension, unregisterGLTFExtension } from "../glTFLoaderExtensionRegistry.js";
|
2
|
+
import { addNewInteractivityFlowGraphMapping } from "./KHR_interactivity/declarationMapper.js";
|
3
|
+
import { AddObjectAccessorToKey } from "./objectModelMapping.js";
|
4
|
+
const NAME = "KHR_node_selectability";
|
5
|
+
// add the interactivity mapping for the onSelect event
|
6
|
+
addNewInteractivityFlowGraphMapping("event/onSelect", NAME, {
|
7
|
+
// using GetVariable as the nodeIndex is a configuration and not a value (i.e. it's not mutable)
|
8
|
+
blocks: ["FlowGraphMeshPickEventBlock" /* FlowGraphBlockNames.MeshPickEvent */, "FlowGraphGetVariableBlock" /* FlowGraphBlockNames.GetVariable */, "FlowGraphIndexOfBlock" /* FlowGraphBlockNames.IndexOf */, "KHR_interactivity/FlowGraphGLTFDataProvider"],
|
9
|
+
configuration: {
|
10
|
+
stopPropagation: { name: "stopPropagation" },
|
11
|
+
nodeIndex: {
|
12
|
+
name: "variable",
|
13
|
+
toBlock: "FlowGraphGetVariableBlock" /* FlowGraphBlockNames.GetVariable */,
|
14
|
+
dataTransformer(data) {
|
15
|
+
return ["pickedMesh_" + data[0]];
|
16
|
+
},
|
17
|
+
},
|
18
|
+
},
|
19
|
+
outputs: {
|
20
|
+
values: {
|
21
|
+
selectedNodeIndex: { name: "index", toBlock: "FlowGraphIndexOfBlock" /* FlowGraphBlockNames.IndexOf */ },
|
22
|
+
controllerIndex: { name: "pointerId" },
|
23
|
+
selectionPoint: { name: "pickedPoint" },
|
24
|
+
selectionRayOrigin: { name: "pickOrigin" },
|
25
|
+
},
|
26
|
+
flows: {
|
27
|
+
out: { name: "done" },
|
28
|
+
},
|
29
|
+
},
|
30
|
+
interBlockConnectors: [
|
31
|
+
{
|
32
|
+
input: "asset",
|
33
|
+
output: "value",
|
34
|
+
inputBlockIndex: 0,
|
35
|
+
outputBlockIndex: 1,
|
36
|
+
isVariable: true,
|
37
|
+
},
|
38
|
+
{
|
39
|
+
input: "array",
|
40
|
+
output: "nodes",
|
41
|
+
inputBlockIndex: 2,
|
42
|
+
outputBlockIndex: 3,
|
43
|
+
isVariable: true,
|
44
|
+
},
|
45
|
+
{
|
46
|
+
input: "object",
|
47
|
+
output: "pickedMesh",
|
48
|
+
inputBlockIndex: 2,
|
49
|
+
outputBlockIndex: 0,
|
50
|
+
isVariable: true,
|
51
|
+
},
|
52
|
+
],
|
53
|
+
extraProcessor(gltfBlock, _declaration, _mapping, _arrays, serializedObjects, context, globalGLTF) {
|
54
|
+
// add the glTF to the configuration of the last serialized object
|
55
|
+
const serializedObject = serializedObjects[serializedObjects.length - 1];
|
56
|
+
serializedObject.config = serializedObject.config || {};
|
57
|
+
serializedObject.config.glTF = globalGLTF;
|
58
|
+
// find the listener nodeIndex value
|
59
|
+
const nodeIndex = gltfBlock.configuration?.["nodeIndex"]?.value[0];
|
60
|
+
if (nodeIndex === undefined || typeof nodeIndex !== "number") {
|
61
|
+
throw new Error("nodeIndex not found in configuration");
|
62
|
+
}
|
63
|
+
const variableName = "pickedMesh_" + nodeIndex;
|
64
|
+
// find the nodeIndex value
|
65
|
+
serializedObjects[1].config.variable = variableName;
|
66
|
+
context._userVariables[variableName] = {
|
67
|
+
className: "Mesh",
|
68
|
+
id: globalGLTF?.nodes?.[nodeIndex]._babylonTransformNode?.id,
|
69
|
+
uniqueId: globalGLTF?.nodes?.[nodeIndex]._babylonTransformNode?.uniqueId,
|
70
|
+
};
|
71
|
+
return serializedObjects;
|
72
|
+
},
|
73
|
+
});
|
74
|
+
// object model extension for selectable
|
75
|
+
AddObjectAccessorToKey("/nodes/{}/extensions/KHR_node_selectability/selectable", {
|
76
|
+
get: (node) => {
|
77
|
+
const tn = node._babylonTransformNode;
|
78
|
+
if (tn && tn.isPickable !== undefined) {
|
79
|
+
return tn.isPickable;
|
80
|
+
}
|
81
|
+
return true;
|
82
|
+
},
|
83
|
+
set: (value, node) => {
|
84
|
+
node._primitiveBabylonMeshes?.forEach((mesh) => {
|
85
|
+
mesh.isPickable = value;
|
86
|
+
});
|
87
|
+
},
|
88
|
+
getTarget: (node) => node._babylonTransformNode,
|
89
|
+
getPropertyName: [() => "isPickable"],
|
90
|
+
type: "boolean",
|
91
|
+
});
|
92
|
+
/**
|
93
|
+
* Loader extension for KHR_selectability
|
94
|
+
*/
|
95
|
+
// eslint-disable-next-line @typescript-eslint/naming-convention
|
96
|
+
export class KHR_node_selectability {
|
97
|
+
/**
|
98
|
+
* @internal
|
99
|
+
*/
|
100
|
+
constructor(loader) {
|
101
|
+
/**
|
102
|
+
* The name of this extension.
|
103
|
+
*/
|
104
|
+
this.name = NAME;
|
105
|
+
this._loader = loader;
|
106
|
+
this.enabled = loader.isExtensionUsed(NAME);
|
107
|
+
}
|
108
|
+
async onReady() {
|
109
|
+
this._loader.gltf.nodes?.forEach((node) => {
|
110
|
+
if (node.extensions?.KHR_node_selectability && node.extensions?.KHR_node_selectability.selectable === false) {
|
111
|
+
node._babylonTransformNode?.getChildMeshes().forEach((mesh) => {
|
112
|
+
mesh.isPickable = false;
|
113
|
+
});
|
114
|
+
}
|
115
|
+
});
|
116
|
+
}
|
117
|
+
dispose() {
|
118
|
+
this._loader = null;
|
119
|
+
}
|
120
|
+
}
|
121
|
+
unregisterGLTFExtension(NAME);
|
122
|
+
registerGLTFExtension(NAME, true, (loader) => new KHR_node_selectability(loader));
|
123
|
+
//# sourceMappingURL=KHR_node_selectability.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"KHR_node_selectability.js","sourceRoot":"","sources":["../../../../../../dev/loaders/src/glTF/2.0/Extensions/KHR_node_selectability.ts"],"names":[],"mappings":"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","sourcesContent":["import { FlowGraphBlockNames } from \"core/FlowGraph/Blocks/flowGraphBlockNames\";\nimport type { GLTFLoader } from \"../glTFLoader\";\nimport type { IGLTFLoaderExtension } from \"../glTFLoaderExtension\";\nimport { registerGLTFExtension, unregisterGLTFExtension } from \"../glTFLoaderExtensionRegistry\";\nimport { addNewInteractivityFlowGraphMapping } from \"./KHR_interactivity/declarationMapper\";\nimport type { INode } from \"../glTFLoaderInterfaces\";\nimport { AddObjectAccessorToKey } from \"./objectModelMapping\";\n\nconst NAME = \"KHR_node_selectability\";\n\ndeclare module \"../../glTFFileLoader\" {\n // eslint-disable-next-line jsdoc/require-jsdoc\n export interface GLTFLoaderExtensionOptions {\n /**\n * Defines options for the KHR_selectability extension.\n */\n // NOTE: Don't use NAME here as it will break the UMD type declarations.\n [\"KHR_node_selectability\"]: {};\n }\n}\n\n// add the interactivity mapping for the onSelect event\naddNewInteractivityFlowGraphMapping(\"event/onSelect\", NAME, {\n // using GetVariable as the nodeIndex is a configuration and not a value (i.e. it's not mutable)\n blocks: [FlowGraphBlockNames.MeshPickEvent, FlowGraphBlockNames.GetVariable, FlowGraphBlockNames.IndexOf, \"KHR_interactivity/FlowGraphGLTFDataProvider\"],\n configuration: {\n stopPropagation: { name: \"stopPropagation\" },\n nodeIndex: {\n name: \"variable\",\n toBlock: FlowGraphBlockNames.GetVariable,\n dataTransformer(data) {\n return [\"pickedMesh_\" + data[0]];\n },\n },\n },\n outputs: {\n values: {\n selectedNodeIndex: { name: \"index\", toBlock: FlowGraphBlockNames.IndexOf },\n controllerIndex: { name: \"pointerId\" },\n selectionPoint: { name: \"pickedPoint\" },\n selectionRayOrigin: { name: \"pickOrigin\" },\n },\n flows: {\n out: { name: \"done\" },\n },\n },\n interBlockConnectors: [\n {\n input: \"asset\",\n output: \"value\",\n inputBlockIndex: 0,\n outputBlockIndex: 1,\n isVariable: true,\n },\n {\n input: \"array\",\n output: \"nodes\",\n inputBlockIndex: 2,\n outputBlockIndex: 3,\n isVariable: true,\n },\n {\n input: \"object\",\n output: \"pickedMesh\",\n inputBlockIndex: 2,\n outputBlockIndex: 0,\n isVariable: true,\n },\n ],\n extraProcessor(gltfBlock, _declaration, _mapping, _arrays, serializedObjects, context, globalGLTF) {\n // add the glTF to the configuration of the last serialized object\n const serializedObject = serializedObjects[serializedObjects.length - 1];\n serializedObject.config = serializedObject.config || {};\n serializedObject.config.glTF = globalGLTF;\n // find the listener nodeIndex value\n const nodeIndex = gltfBlock.configuration?.[\"nodeIndex\"]?.value[0];\n if (nodeIndex === undefined || typeof nodeIndex !== \"number\") {\n throw new Error(\"nodeIndex not found in configuration\");\n }\n const variableName = \"pickedMesh_\" + nodeIndex;\n // find the nodeIndex value\n serializedObjects[1].config.variable = variableName;\n context._userVariables[variableName] = {\n className: \"Mesh\",\n id: globalGLTF?.nodes?.[nodeIndex]._babylonTransformNode?.id,\n uniqueId: globalGLTF?.nodes?.[nodeIndex]._babylonTransformNode?.uniqueId,\n };\n return serializedObjects;\n },\n});\n\n// object model extension for selectable\nAddObjectAccessorToKey(\"/nodes/{}/extensions/KHR_node_selectability/selectable\", {\n get: (node: INode) => {\n const tn = node._babylonTransformNode as any;\n if (tn && tn.isPickable !== undefined) {\n return tn.isPickable;\n }\n return true;\n },\n set: (value: boolean, node: INode) => {\n node._primitiveBabylonMeshes?.forEach((mesh) => {\n mesh.isPickable = value;\n });\n },\n getTarget: (node: INode) => node._babylonTransformNode,\n getPropertyName: [() => \"isPickable\"],\n type: \"boolean\",\n});\n\n/**\n * Loader extension for KHR_selectability\n */\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport class KHR_node_selectability implements IGLTFLoaderExtension {\n /**\n * The name of this extension.\n */\n public readonly name = NAME;\n /**\n * Defines whether this extension is enabled.\n */\n public enabled: boolean;\n\n private _loader: GLTFLoader;\n\n /**\n * @internal\n */\n constructor(loader: GLTFLoader) {\n this._loader = loader;\n this.enabled = loader.isExtensionUsed(NAME);\n }\n\n public async onReady(): Promise<void> {\n this._loader.gltf.nodes?.forEach((node) => {\n if (node.extensions?.KHR_node_selectability && node.extensions?.KHR_node_selectability.selectable === false) {\n node._babylonTransformNode?.getChildMeshes().forEach((mesh) => {\n mesh.isPickable = false;\n });\n }\n });\n }\n\n public dispose() {\n (this._loader as any) = null;\n }\n}\n\nunregisterGLTFExtension(NAME);\nregisterGLTFExtension(NAME, true, (loader) => new KHR_node_selectability(loader));\n"]}
|
@@ -1,5 +1,30 @@
|
|
1
1
|
import { registerGLTFExtension, unregisterGLTFExtension } from "../glTFLoaderExtensionRegistry.js";
|
2
|
+
import { AddObjectAccessorToKey } from "./objectModelMapping.js";
|
2
3
|
const NAME = "KHR_node_visibility";
|
4
|
+
// object model extension for visibility
|
5
|
+
AddObjectAccessorToKey("/nodes/{}/extensions/KHR_node_visibility/visible", {
|
6
|
+
get: (node) => {
|
7
|
+
const tn = node._babylonTransformNode;
|
8
|
+
if (tn && tn.isVisible !== undefined) {
|
9
|
+
return tn.isVisible;
|
10
|
+
}
|
11
|
+
return true;
|
12
|
+
},
|
13
|
+
set: (value, node) => {
|
14
|
+
node._primitiveBabylonMeshes?.forEach((mesh) => {
|
15
|
+
mesh.inheritVisibility = true;
|
16
|
+
});
|
17
|
+
if (node._babylonTransformNode) {
|
18
|
+
node._babylonTransformNode.isVisible = value;
|
19
|
+
}
|
20
|
+
node._primitiveBabylonMeshes?.forEach((mesh) => {
|
21
|
+
mesh.isVisible = value;
|
22
|
+
});
|
23
|
+
},
|
24
|
+
getTarget: (node) => node._babylonTransformNode,
|
25
|
+
getPropertyName: [() => "isVisible"],
|
26
|
+
type: "boolean",
|
27
|
+
});
|
3
28
|
/**
|
4
29
|
* Loader extension for KHR_node_visibility
|
5
30
|
*/
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"KHR_node_visibility.js","sourceRoot":"","sources":["../../../../../../dev/loaders/src/glTF/2.0/Extensions/KHR_node_visibility.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AAEhG,MAAM,IAAI,GAAG,qBAAqB,CAAC;AAanC;;GAEG;AACH,gEAAgE;AAChE,MAAM,OAAO,mBAAmB;IAY5B;;OAEG;IACH,YAAY,MAAkB;QAd9B;;WAEG;QACa,SAAI,GAAG,IAAI,CAAC;QAYxB,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;QACtB,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;IAChD,CAAC;IAEM,KAAK,CAAC,OAAO;QAChB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;YACtC,IAAI,CAAC,uBAAuB,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;gBAC3C,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;YAClC,CAAC,CAAC,CAAC;YACH,qHAAqH;YACrH,IAAI,IAAI,CAAC,UAAU,EAAE,mBAAmB,EAAE,CAAC;gBACvC,IAAI,IAAI,CAAC,UAAU,EAAE,mBAAmB,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;oBACzD,IAAI,IAAI,CAAC,qBAAqB,EAAE,CAAC;wBAC5B,IAAI,CAAC,qBAAsC,CAAC,SAAS,GAAG,KAAK,CAAC;oBACnE,CAAC;oBACD,IAAI,CAAC,uBAAuB,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;wBAC3C,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;oBAC3B,CAAC,CAAC,CAAC;gBACP,CAAC;YACL,CAAC;QACL,CAAC,CAAC,CAAC;IACP,CAAC;IAEM,OAAO;QACT,IAAI,CAAC,OAAe,GAAG,IAAI,CAAC;IACjC,CAAC;CACJ;AAED,uBAAuB,CAAC,IAAI,CAAC,CAAC;AAC9B,qBAAqB,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAC","sourcesContent":["import type { AbstractMesh } from \"core/Meshes/abstractMesh\";\nimport type { GLTFLoader } from \"../glTFLoader\";\nimport type { IGLTFLoaderExtension } from \"../glTFLoaderExtension\";\nimport { registerGLTFExtension, unregisterGLTFExtension } from \"../glTFLoaderExtensionRegistry\";\n\nconst NAME = \"KHR_node_visibility\";\n\ndeclare module \"../../glTFFileLoader\" {\n // eslint-disable-next-line jsdoc/require-jsdoc\n export interface GLTFLoaderExtensionOptions {\n /**\n * Defines options for the KHR_node_visibility extension.\n */\n // NOTE: Don't use NAME here as it will break the UMD type declarations.\n [\"KHR_node_visibility\"]: {};\n }\n}\n\n/**\n * Loader extension for KHR_node_visibility\n */\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport class KHR_node_visibility implements IGLTFLoaderExtension {\n /**\n * The name of this extension.\n */\n public readonly name = NAME;\n /**\n * Defines whether this extension is enabled.\n */\n public enabled: boolean;\n\n private _loader: GLTFLoader;\n\n /**\n * @internal\n */\n constructor(loader: GLTFLoader) {\n this._loader = loader;\n this.enabled = loader.isExtensionUsed(NAME);\n }\n\n public async onReady(): Promise<void> {\n this._loader.gltf.nodes?.forEach((node) => {\n node._primitiveBabylonMeshes?.forEach((mesh) => {\n mesh.inheritVisibility = true;\n });\n // When the JSON Pointer is used we need to change both the transform node and the primitive meshes to the new value.\n if (node.extensions?.KHR_node_visibility) {\n if (node.extensions?.KHR_node_visibility.visible === false) {\n if (node._babylonTransformNode) {\n (node._babylonTransformNode as AbstractMesh).isVisible = false;\n }\n node._primitiveBabylonMeshes?.forEach((mesh) => {\n mesh.isVisible = false;\n });\n }\n }\n });\n }\n\n public dispose() {\n (this._loader as any) = null;\n }\n}\n\nunregisterGLTFExtension(NAME);\nregisterGLTFExtension(NAME, true, (loader) => new KHR_node_visibility(loader));\n"]}
|
1
|
+
{"version":3,"file":"KHR_node_visibility.js","sourceRoot":"","sources":["../../../../../../dev/loaders/src/glTF/2.0/Extensions/KHR_node_visibility.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AAEhG,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAE9D,MAAM,IAAI,GAAG,qBAAqB,CAAC;AAanC,wCAAwC;AACxC,sBAAsB,CAAC,kDAAkD,EAAE;IACvE,GAAG,EAAE,CAAC,IAAW,EAAE,EAAE;QACjB,MAAM,EAAE,GAAG,IAAI,CAAC,qBAA4B,CAAC;QAC7C,IAAI,EAAE,IAAI,EAAE,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YACnC,OAAO,EAAE,CAAC,SAAS,CAAC;QACxB,CAAC;QACD,OAAO,IAAI,CAAC;IAChB,CAAC;IACD,GAAG,EAAE,CAAC,KAAc,EAAE,IAAW,EAAE,EAAE;QACjC,IAAI,CAAC,uBAAuB,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;YAC3C,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;QAClC,CAAC,CAAC,CAAC;QACH,IAAI,IAAI,CAAC,qBAAqB,EAAE,CAAC;YAC5B,IAAI,CAAC,qBAAsC,CAAC,SAAS,GAAG,KAAK,CAAC;QACnE,CAAC;QACD,IAAI,CAAC,uBAAuB,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;YAC3C,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QAC3B,CAAC,CAAC,CAAC;IACP,CAAC;IACD,SAAS,EAAE,CAAC,IAAW,EAAE,EAAE,CAAC,IAAI,CAAC,qBAAqB;IACtD,eAAe,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC;IACpC,IAAI,EAAE,SAAS;CAClB,CAAC,CAAC;AAEH;;GAEG;AACH,gEAAgE;AAChE,MAAM,OAAO,mBAAmB;IAY5B;;OAEG;IACH,YAAY,MAAkB;QAd9B;;WAEG;QACa,SAAI,GAAG,IAAI,CAAC;QAYxB,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;QACtB,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;IAChD,CAAC;IAEM,KAAK,CAAC,OAAO;QAChB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;YACtC,IAAI,CAAC,uBAAuB,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;gBAC3C,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;YAClC,CAAC,CAAC,CAAC;YACH,qHAAqH;YACrH,IAAI,IAAI,CAAC,UAAU,EAAE,mBAAmB,EAAE,CAAC;gBACvC,IAAI,IAAI,CAAC,UAAU,EAAE,mBAAmB,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;oBACzD,IAAI,IAAI,CAAC,qBAAqB,EAAE,CAAC;wBAC5B,IAAI,CAAC,qBAAsC,CAAC,SAAS,GAAG,KAAK,CAAC;oBACnE,CAAC;oBACD,IAAI,CAAC,uBAAuB,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;wBAC3C,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;oBAC3B,CAAC,CAAC,CAAC;gBACP,CAAC;YACL,CAAC;QACL,CAAC,CAAC,CAAC;IACP,CAAC;IAEM,OAAO;QACT,IAAI,CAAC,OAAe,GAAG,IAAI,CAAC;IACjC,CAAC;CACJ;AAED,uBAAuB,CAAC,IAAI,CAAC,CAAC;AAC9B,qBAAqB,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAC","sourcesContent":["import type { AbstractMesh } from \"core/Meshes/abstractMesh\";\nimport type { GLTFLoader } from \"../glTFLoader\";\nimport type { IGLTFLoaderExtension } from \"../glTFLoaderExtension\";\nimport { registerGLTFExtension, unregisterGLTFExtension } from \"../glTFLoaderExtensionRegistry\";\nimport type { INode } from \"../glTFLoaderInterfaces\";\nimport { AddObjectAccessorToKey } from \"./objectModelMapping\";\n\nconst NAME = \"KHR_node_visibility\";\n\ndeclare module \"../../glTFFileLoader\" {\n // eslint-disable-next-line jsdoc/require-jsdoc\n export interface GLTFLoaderExtensionOptions {\n /**\n * Defines options for the KHR_node_visibility extension.\n */\n // NOTE: Don't use NAME here as it will break the UMD type declarations.\n [\"KHR_node_visibility\"]: {};\n }\n}\n\n// object model extension for visibility\nAddObjectAccessorToKey(\"/nodes/{}/extensions/KHR_node_visibility/visible\", {\n get: (node: INode) => {\n const tn = node._babylonTransformNode as any;\n if (tn && tn.isVisible !== undefined) {\n return tn.isVisible;\n }\n return true;\n },\n set: (value: boolean, node: INode) => {\n node._primitiveBabylonMeshes?.forEach((mesh) => {\n mesh.inheritVisibility = true;\n });\n if (node._babylonTransformNode) {\n (node._babylonTransformNode as AbstractMesh).isVisible = value;\n }\n node._primitiveBabylonMeshes?.forEach((mesh) => {\n mesh.isVisible = value;\n });\n },\n getTarget: (node: INode) => node._babylonTransformNode,\n getPropertyName: [() => \"isVisible\"],\n type: \"boolean\",\n});\n\n/**\n * Loader extension for KHR_node_visibility\n */\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport class KHR_node_visibility implements IGLTFLoaderExtension {\n /**\n * The name of this extension.\n */\n public readonly name = NAME;\n /**\n * Defines whether this extension is enabled.\n */\n public enabled: boolean;\n\n private _loader: GLTFLoader;\n\n /**\n * @internal\n */\n constructor(loader: GLTFLoader) {\n this._loader = loader;\n this.enabled = loader.isExtensionUsed(NAME);\n }\n\n public async onReady(): Promise<void> {\n this._loader.gltf.nodes?.forEach((node) => {\n node._primitiveBabylonMeshes?.forEach((mesh) => {\n mesh.inheritVisibility = true;\n });\n // When the JSON Pointer is used we need to change both the transform node and the primitive meshes to the new value.\n if (node.extensions?.KHR_node_visibility) {\n if (node.extensions?.KHR_node_visibility.visible === false) {\n if (node._babylonTransformNode) {\n (node._babylonTransformNode as AbstractMesh).isVisible = false;\n }\n node._primitiveBabylonMeshes?.forEach((mesh) => {\n mesh.isVisible = false;\n });\n }\n }\n });\n }\n\n public dispose() {\n (this._loader as any) = null;\n }\n}\n\nunregisterGLTFExtension(NAME);\nregisterGLTFExtension(NAME, true, (loader) => new KHR_node_visibility(loader));\n"]}
|