@babylonjs/loaders 9.26.0 → 9.26.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/FBX/fbxConstraintBehavior.d.ts +188 -0
- package/FBX/fbxConstraintBehavior.js +532 -0
- package/FBX/fbxConstraintBehavior.js.map +1 -0
- package/FBX/fbxFileLoader.pure.d.ts +175 -6
- package/FBX/fbxFileLoader.pure.js +1521 -286
- package/FBX/fbxFileLoader.pure.js.map +1 -1
- package/FBX/index.d.ts +4 -1
- package/FBX/index.js +1 -0
- package/FBX/index.js.map +1 -1
- package/FBX/interpreter/animation.d.ts +73 -33
- package/FBX/interpreter/animation.js +620 -223
- package/FBX/interpreter/animation.js.map +1 -1
- package/FBX/interpreter/animationCurve.d.ts +91 -0
- package/FBX/interpreter/animationCurve.js +623 -0
- package/FBX/interpreter/animationCurve.js.map +1 -0
- package/FBX/interpreter/blendShapes.js +9 -18
- package/FBX/interpreter/blendShapes.js.map +1 -1
- package/FBX/interpreter/connections.d.ts +1 -1
- package/FBX/interpreter/connections.js +173 -34
- package/FBX/interpreter/connections.js.map +1 -1
- package/FBX/interpreter/constraints.d.ts +68 -0
- package/FBX/interpreter/constraints.js +143 -0
- package/FBX/interpreter/constraints.js.map +1 -0
- package/FBX/interpreter/fbxInterpreter.d.ts +89 -4
- package/FBX/interpreter/fbxInterpreter.js +474 -122
- package/FBX/interpreter/fbxInterpreter.js.map +1 -1
- package/FBX/interpreter/geometry.d.ts +1 -1
- package/FBX/interpreter/geometry.js +150 -92
- package/FBX/interpreter/geometry.js.map +1 -1
- package/FBX/interpreter/legacyDocument.d.ts +11 -0
- package/FBX/interpreter/legacyDocument.js +425 -0
- package/FBX/interpreter/legacyDocument.js.map +1 -0
- package/FBX/interpreter/materialModel.d.ts +71 -0
- package/FBX/interpreter/materialModel.js +622 -0
- package/FBX/interpreter/materialModel.js.map +1 -0
- package/FBX/interpreter/materials.d.ts +13 -1
- package/FBX/interpreter/materials.js +88 -5
- package/FBX/interpreter/materials.js.map +1 -1
- package/FBX/interpreter/nodeTransform.d.ts +32 -0
- package/FBX/interpreter/nodeTransform.js +54 -0
- package/FBX/interpreter/nodeTransform.js.map +1 -0
- package/FBX/interpreter/nurbs.d.ts +99 -0
- package/FBX/interpreter/nurbs.js +627 -0
- package/FBX/interpreter/nurbs.js.map +1 -0
- package/FBX/interpreter/propertyTemplates.d.ts +23 -0
- package/FBX/interpreter/propertyTemplates.js +109 -2
- package/FBX/interpreter/propertyTemplates.js.map +1 -1
- package/FBX/interpreter/rig.js +16 -0
- package/FBX/interpreter/rig.js.map +1 -1
- package/FBX/interpreter/sceneDiagnostics.js +28 -3
- package/FBX/interpreter/sceneDiagnostics.js.map +1 -1
- package/FBX/interpreter/skeleton.d.ts +4 -18
- package/FBX/interpreter/skeleton.js +16 -94
- package/FBX/interpreter/skeleton.js.map +1 -1
- package/FBX/parsers/fbxAsciiParser.js +119 -9
- package/FBX/parsers/fbxAsciiParser.js.map +1 -1
- package/FBX/parsers/fbxBinaryParser.js +74 -22
- package/FBX/parsers/fbxBinaryParser.js.map +1 -1
- package/FBX/pure.d.ts +1 -0
- package/FBX/pure.js +1 -0
- package/FBX/pure.js.map +1 -1
- package/FBX/types/fbxTypes.d.ts +18 -2
- package/FBX/types/fbxTypes.js +40 -12
- package/FBX/types/fbxTypes.js.map +1 -1
- package/SPLAT/gaussianSplattingStream.d.ts +79 -25
- package/SPLAT/gaussianSplattingStream.js +320 -95
- package/SPLAT/gaussianSplattingStream.js.map +1 -1
- package/USD/usdCommandProtocol.d.ts +20 -4
- package/USD/usdCommandProtocol.js +25 -3
- package/USD/usdCommandProtocol.js.map +1 -1
- package/USD/usdFileLoader.pure.js +2 -0
- package/USD/usdFileLoader.pure.js.map +1 -1
- package/USD/usdSceneMaterializer.js +430 -92
- package/USD/usdSceneMaterializer.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_interactivity/declarationMapper.d.ts +110 -3
- package/glTF/2.0/Extensions/KHR_interactivity/declarationMapper.js +468 -74
- package/glTF/2.0/Extensions/KHR_interactivity/declarationMapper.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_interactivity/flowGraphEventReferenceBlock.d.ts +47 -0
- package/glTF/2.0/Extensions/KHR_interactivity/flowGraphEventReferenceBlock.js +68 -0
- package/glTF/2.0/Extensions/KHR_interactivity/flowGraphEventReferenceBlock.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_interactivity/flowGraphGLTFDataProvider.d.ts +2 -2
- package/glTF/2.0/Extensions/KHR_interactivity/flowGraphGLTFDataProvider.js +1 -1
- package/glTF/2.0/Extensions/KHR_interactivity/flowGraphGLTFDataProvider.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_interactivity/flowGraphObjectReferenceBlock.d.ts +24 -0
- package/glTF/2.0/Extensions/KHR_interactivity/flowGraphObjectReferenceBlock.js +38 -0
- package/glTF/2.0/Extensions/KHR_interactivity/flowGraphObjectReferenceBlock.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_interactivity/flowGraphUnsupportedInteractivityBlock.d.ts +41 -0
- package/glTF/2.0/Extensions/KHR_interactivity/flowGraphUnsupportedInteractivityBlock.js +63 -0
- package/glTF/2.0/Extensions/KHR_interactivity/flowGraphUnsupportedInteractivityBlock.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_interactivity/index.d.ts +5 -0
- package/glTF/2.0/Extensions/KHR_interactivity/index.js +5 -0
- package/glTF/2.0/Extensions/KHR_interactivity/index.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_interactivity/interactivityGraphModel.d.ts +112 -0
- package/glTF/2.0/Extensions/KHR_interactivity/interactivityGraphModel.js +773 -0
- package/glTF/2.0/Extensions/KHR_interactivity/interactivityGraphModel.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_interactivity/interactivityGraphParser.d.ts +18 -10
- package/glTF/2.0/Extensions/KHR_interactivity/interactivityGraphParser.js +299 -54
- package/glTF/2.0/Extensions/KHR_interactivity/interactivityGraphParser.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_interactivity/interactivityHostResolver.d.ts +2 -1
- package/glTF/2.0/Extensions/KHR_interactivity/interactivityHostResolver.js +7 -2
- package/glTF/2.0/Extensions/KHR_interactivity/interactivityHostResolver.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_interactivity/interactivityNodeState.d.ts +24 -0
- package/glTF/2.0/Extensions/KHR_interactivity/interactivityNodeState.js +89 -0
- package/glTF/2.0/Extensions/KHR_interactivity/interactivityNodeState.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_interactivity/pure.d.ts +5 -0
- package/glTF/2.0/Extensions/KHR_interactivity/pure.js +5 -0
- package/glTF/2.0/Extensions/KHR_interactivity/pure.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_interactivity.pure.d.ts +55 -1
- package/glTF/2.0/Extensions/KHR_interactivity.pure.js +124 -76
- package/glTF/2.0/Extensions/KHR_interactivity.pure.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_interactivity.types.d.ts +18 -1
- package/glTF/2.0/Extensions/KHR_interactivity.types.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_node_hoverability.pure.d.ts +2 -0
- package/glTF/2.0/Extensions/KHR_node_hoverability.pure.js +114 -56
- package/glTF/2.0/Extensions/KHR_node_hoverability.pure.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_node_selectability.pure.d.ts +2 -0
- package/glTF/2.0/Extensions/KHR_node_selectability.pure.js +80 -35
- package/glTF/2.0/Extensions/KHR_node_selectability.pure.js.map +1 -1
- package/glTF/2.0/Extensions/interactivityRefPathToObjectConverter.js +3 -2
- package/glTF/2.0/Extensions/interactivityRefPathToObjectConverter.js.map +1 -1
- package/glTF/2.0/Extensions/objectModelMapping.d.ts +4 -2
- package/glTF/2.0/Extensions/objectModelMapping.js +33 -4
- package/glTF/2.0/Extensions/objectModelMapping.js.map +1 -1
- package/glTF/2.0/glTFLoader.pure.d.ts +1 -1
- package/glTF/2.0/glTFLoader.pure.js +9 -4
- package/glTF/2.0/glTFLoader.pure.js.map +1 -1
- package/glTF/2.0/glTFLoaderExtension.d.ts +2 -1
- package/glTF/2.0/glTFLoaderExtension.js.map +1 -1
- package/package.json +3 -3
|
@@ -1,6 +1,57 @@
|
|
|
1
1
|
import { type GLTFLoader } from "../glTFLoader.pure.js";
|
|
2
2
|
import { type IGLTFLoaderExtension } from "../glTFLoaderExtension.js";
|
|
3
|
+
import { FlowGraphCoordinator } from "@babylonjs/core/FlowGraph/flowGraphCoordinator.js";
|
|
3
4
|
import { type Scene } from "@babylonjs/core/scene.js";
|
|
5
|
+
import { CompositePathToObjectConverter } from "./compositePathToObjectConverter.js";
|
|
6
|
+
import { InteractivityHostResolver } from "./KHR_interactivity/interactivityHostResolver.js";
|
|
7
|
+
import { type IObjectAccessor, type ISerializedFlowGraph } from "@babylonjs/core/FlowGraph/typeDefinitions.js";
|
|
8
|
+
import { type IKHRInteractivityDiagnostic, type IKHRInteractivityDocument, type IKHRInteractivityGraphModel } from "./KHR_interactivity/interactivityGraphModel.js";
|
|
9
|
+
import { type FlowGraph } from "@babylonjs/core/FlowGraph/flowGraph.js";
|
|
10
|
+
/**
|
|
11
|
+
* Runtime projection of one canonical KHR_interactivity graph.
|
|
12
|
+
*/
|
|
13
|
+
export interface IKHRInteractivityGraphImportResult {
|
|
14
|
+
/** Canonical source graph and diagnostics. */
|
|
15
|
+
graph: IKHRInteractivityGraphModel;
|
|
16
|
+
/** Executable FlowGraph serialization when lowering succeeded. */
|
|
17
|
+
serializedFlowGraph?: ISerializedFlowGraph;
|
|
18
|
+
/** Runtime FlowGraph when runtime construction was requested. */
|
|
19
|
+
flowGraph?: FlowGraph;
|
|
20
|
+
/** Coordinator that owns the runtime FlowGraph. */
|
|
21
|
+
coordinator?: FlowGraphCoordinator;
|
|
22
|
+
/** Additional lowering/runtime diagnostics. */
|
|
23
|
+
diagnostics: IKHRInteractivityDiagnostic[];
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Completed KHR_interactivity import result associated with a loaded scene.
|
|
27
|
+
*/
|
|
28
|
+
export interface IKHRInteractivityImportResult {
|
|
29
|
+
/** Stable zero-based identity of this interactivity asset among assets appended to the scene. */
|
|
30
|
+
assetIndex: number;
|
|
31
|
+
/** Canonical, lossless source document. */
|
|
32
|
+
document: IKHRInteractivityDocument;
|
|
33
|
+
/** Graph import results in source order. */
|
|
34
|
+
graphs: IKHRInteractivityGraphImportResult[];
|
|
35
|
+
/** Shared path converter required by pointer blocks. */
|
|
36
|
+
pathConverter: CompositePathToObjectConverter<IObjectAccessor>;
|
|
37
|
+
/** Live glTF loader data used by glTF data-provider blocks. */
|
|
38
|
+
glTF: GLTFLoader["gltf"];
|
|
39
|
+
/** Host resolver that supplies KHR reference semantics to executable graphs. */
|
|
40
|
+
hostResolver: InteractivityHostResolver;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Gets the completed KHR_interactivity import result for a loaded scene.
|
|
44
|
+
* @param scene scene loaded from the glTF asset
|
|
45
|
+
* @returns the import result, or undefined when the scene has no KHR_interactivity data
|
|
46
|
+
*/
|
|
47
|
+
export declare function GetKHRInteractivityImportResult(scene: Scene): IKHRInteractivityImportResult | undefined;
|
|
48
|
+
/**
|
|
49
|
+
* Gets every completed KHR_interactivity import result appended to a loaded scene.
|
|
50
|
+
* Results remain in asset load order and each result has a stable {@link IKHRInteractivityImportResult.assetIndex}.
|
|
51
|
+
* @param scene scene containing the loaded glTF assets
|
|
52
|
+
* @returns the scene's import results, or an empty array when it has no KHR_interactivity data
|
|
53
|
+
*/
|
|
54
|
+
export declare function GetKHRInteractivityImportResults(scene: Scene): readonly IKHRInteractivityImportResult[];
|
|
4
55
|
/**
|
|
5
56
|
* Loader extension for KHR_interactivity
|
|
6
57
|
*/
|
|
@@ -10,6 +61,8 @@ export declare class KHR_interactivity implements IGLTFLoaderExtension {
|
|
|
10
61
|
* The name of this extension.
|
|
11
62
|
*/
|
|
12
63
|
readonly name = "KHR_interactivity";
|
|
64
|
+
/** Runs after extensions that contribute interactivity operations and object state. */
|
|
65
|
+
readonly order = 200;
|
|
13
66
|
/**
|
|
14
67
|
* Defines whether this extension is enabled.
|
|
15
68
|
*/
|
|
@@ -21,6 +74,7 @@ export declare class KHR_interactivity implements IGLTFLoaderExtension {
|
|
|
21
74
|
* @param _loader
|
|
22
75
|
*/
|
|
23
76
|
constructor(_loader: GLTFLoader);
|
|
77
|
+
private _initializePathConverter;
|
|
24
78
|
dispose(): void;
|
|
25
79
|
onReady(): Promise<void>;
|
|
26
80
|
}
|
|
@@ -28,7 +82,7 @@ export declare class KHR_interactivity implements IGLTFLoaderExtension {
|
|
|
28
82
|
* @internal
|
|
29
83
|
* populates the object model with the interactivity extension
|
|
30
84
|
*/
|
|
31
|
-
export declare function _AddInteractivityObjectModel(scene: Scene): void;
|
|
85
|
+
export declare function _AddInteractivityObjectModel(scene: Scene, targetFps: number, mapping: object): void;
|
|
32
86
|
/**
|
|
33
87
|
* @internal
|
|
34
88
|
* Registers KHR_interactivity runtime dependencies without changing the extension registry.
|
|
@@ -13,7 +13,27 @@ import { InteractivityAssetPathToObjectConverter, InteractivityAssetCapabilities
|
|
|
13
13
|
import { EventReferencePrefix, DelayReferencePrefix } from "./KHR_interactivity/interactivityReferences.js";
|
|
14
14
|
import { InteractivityHostResolver } from "./KHR_interactivity/interactivityHostResolver.js";
|
|
15
15
|
import { Logger } from "@babylonjs/core/Misc/logger.js";
|
|
16
|
+
import { CreateKHRInteractivityDocument, } from "./KHR_interactivity/interactivityGraphModel.js";
|
|
16
17
|
const NAME = "KHR_interactivity";
|
|
18
|
+
const _ImportResults = /*#__PURE__*/ new WeakMap();
|
|
19
|
+
/**
|
|
20
|
+
* Gets the completed KHR_interactivity import result for a loaded scene.
|
|
21
|
+
* @param scene scene loaded from the glTF asset
|
|
22
|
+
* @returns the import result, or undefined when the scene has no KHR_interactivity data
|
|
23
|
+
*/
|
|
24
|
+
export function GetKHRInteractivityImportResult(scene) {
|
|
25
|
+
const results = _ImportResults.get(scene);
|
|
26
|
+
return results?.[results.length - 1];
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Gets every completed KHR_interactivity import result appended to a loaded scene.
|
|
30
|
+
* Results remain in asset load order and each result has a stable {@link IKHRInteractivityImportResult.assetIndex}.
|
|
31
|
+
* @param scene scene containing the loaded glTF assets
|
|
32
|
+
* @returns the scene's import results, or an empty array when it has no KHR_interactivity data
|
|
33
|
+
*/
|
|
34
|
+
export function GetKHRInteractivityImportResults(scene) {
|
|
35
|
+
return _ImportResults.get(scene) ?? [];
|
|
36
|
+
}
|
|
17
37
|
/**
|
|
18
38
|
* Loader extension for KHR_interactivity
|
|
19
39
|
*/
|
|
@@ -28,82 +48,101 @@ export class KHR_interactivity {
|
|
|
28
48
|
* The name of this extension.
|
|
29
49
|
*/
|
|
30
50
|
this.name = NAME;
|
|
51
|
+
/** Runs after extensions that contribute interactivity operations and object state. */
|
|
52
|
+
this.order = 200;
|
|
31
53
|
this.enabled = this._loader.isExtensionUsed(NAME);
|
|
32
|
-
this._gltfPathConverter = GetPathToObjectConverter(this._loader.gltf);
|
|
33
|
-
const scene = _loader.babylonScene;
|
|
34
|
-
if (this._gltfPathConverter) {
|
|
35
|
-
// Build a composite that handles both:
|
|
36
|
-
// - The Babylon-scene namespace (`/extensions/BABYLON_scene_objects/...`),
|
|
37
|
-
// used by ref values that point at scene objects not described by the
|
|
38
|
-
// source glTF (e.g. refs emitted by engine-side event blocks).
|
|
39
|
-
// - The standard glTF object model (everything else), via the existing
|
|
40
|
-
// glTF converter as a fallback.
|
|
41
|
-
const initialPrefixes = [];
|
|
42
|
-
if (scene) {
|
|
43
|
-
initialPrefixes.push({
|
|
44
|
-
prefix: BABYLON_SCENE_OBJECT_MODEL_PREFIX,
|
|
45
|
-
converter: new BabylonScenePathToObjectConverter(scene, CreateDefaultBabylonSceneObjectModelTree()),
|
|
46
|
-
});
|
|
47
|
-
}
|
|
48
|
-
// KHR_interactivity ref-validity pointers (`/extensions/KHR_interactivity/events/{}`
|
|
49
|
-
// and `/extensions/KHR_interactivity/delays/{}`) are virtual: they validate an opaque
|
|
50
|
-
// event/delay reference rather than addressing a glTF object, so route them to a
|
|
51
|
-
// dedicated converter instead of the glTF fallback.
|
|
52
|
-
const refConverter = new InteractivityRefPathToObjectConverter();
|
|
53
|
-
initialPrefixes.push({ prefix: EventReferencePrefix, converter: refConverter });
|
|
54
|
-
initialPrefixes.push({ prefix: DelayReferencePrefix, converter: refConverter });
|
|
55
|
-
// Asset capabilities and runtime limits (`/extensions/KHR_interactivity/asset/...` and
|
|
56
|
-
// `/extensions/KHR_interactivity/limits/...`) are virtual too: they describe the asset and the
|
|
57
|
-
// implementation running it rather than addressing a glTF object. The set of enabled extensions is
|
|
58
|
-
// resolved eagerly because the loader is released once loading completes, while the behavior graph
|
|
59
|
-
// keeps querying these pointers at runtime.
|
|
60
|
-
const enabledExtensions = new Set((this._loader.gltf.extensionsUsed ?? []).filter((name) => registeredGLTFExtensions.has(name) && this._loader.parent.extensionOptions[name]?.enabled !== false));
|
|
61
|
-
const assetConverter = new InteractivityAssetPathToObjectConverter(this._loader.gltf, (extensionName) => enabledExtensions.has(extensionName));
|
|
62
|
-
initialPrefixes.push({ prefix: InteractivityAssetCapabilitiesPrefix, converter: assetConverter });
|
|
63
|
-
initialPrefixes.push({ prefix: InteractivityLimitsPrefix, converter: assetConverter });
|
|
64
|
-
this._pathConverter = new CompositePathToObjectConverter(initialPrefixes, this._gltfPathConverter);
|
|
65
|
-
}
|
|
66
54
|
// avoid starting animations automatically.
|
|
67
55
|
_loader._skipStartAnimationStep = true;
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
56
|
+
}
|
|
57
|
+
_initializePathConverter(scene) {
|
|
58
|
+
this._gltfPathConverter = GetPathToObjectConverter(this._loader.gltf, (mapping) => _AddInteractivityObjectModel(scene, this._loader.parent.targetFps, mapping));
|
|
59
|
+
const initialPrefixes = [
|
|
60
|
+
{
|
|
61
|
+
prefix: BABYLON_SCENE_OBJECT_MODEL_PREFIX,
|
|
62
|
+
converter: new BabylonScenePathToObjectConverter(scene, CreateDefaultBabylonSceneObjectModelTree()),
|
|
63
|
+
},
|
|
64
|
+
];
|
|
65
|
+
const refConverter = new InteractivityRefPathToObjectConverter();
|
|
66
|
+
initialPrefixes.push({ prefix: EventReferencePrefix, converter: refConverter });
|
|
67
|
+
initialPrefixes.push({ prefix: DelayReferencePrefix, converter: refConverter });
|
|
68
|
+
const enabledExtensions = new Set((this._loader.gltf.extensionsUsed ?? []).filter((name) => registeredGLTFExtensions.has(name) && this._loader.parent.extensionOptions[name]?.enabled !== false));
|
|
69
|
+
const assetConverter = new InteractivityAssetPathToObjectConverter(this._loader.gltf, (extensionName) => enabledExtensions.has(extensionName));
|
|
70
|
+
initialPrefixes.push({ prefix: InteractivityAssetCapabilitiesPrefix, converter: assetConverter });
|
|
71
|
+
initialPrefixes.push({ prefix: InteractivityLimitsPrefix, converter: assetConverter });
|
|
72
|
+
const pathConverter = new CompositePathToObjectConverter(initialPrefixes, this._gltfPathConverter);
|
|
73
|
+
this._pathConverter = pathConverter;
|
|
74
|
+
return pathConverter;
|
|
72
75
|
}
|
|
73
76
|
dispose() {
|
|
74
77
|
this._loader = null;
|
|
75
78
|
delete this._gltfPathConverter;
|
|
76
79
|
delete this._pathConverter;
|
|
77
80
|
}
|
|
78
|
-
// eslint-disable-next-line no-restricted-syntax, @typescript-eslint/no-misused-promises
|
|
79
81
|
async onReady() {
|
|
80
|
-
if (!this._loader.babylonScene
|
|
82
|
+
if (!this._loader.babylonScene) {
|
|
81
83
|
return;
|
|
82
84
|
}
|
|
83
85
|
const scene = this._loader.babylonScene;
|
|
86
|
+
const pathConverter = this._initializePathConverter(scene);
|
|
84
87
|
const interactivityDefinition = this._loader.gltf.extensions?.KHR_interactivity;
|
|
85
88
|
if (!interactivityDefinition) {
|
|
86
89
|
// This can technically throw, but it's not a critical error
|
|
87
90
|
return;
|
|
88
91
|
}
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
92
|
+
const supportedExtensions = new Set((this._loader.gltf.extensionsUsed ?? []).filter((extensionName) => this._loader.parent.extensionOptions[extensionName]?.enabled !== false));
|
|
93
|
+
const document = CreateKHRInteractivityDocument(interactivityDefinition, supportedExtensions, this._loader.gltf.nodes?.length ?? 0);
|
|
94
|
+
const options = this._loader.parent.extensionOptions[NAME];
|
|
95
|
+
const autoStart = options?.autoStart ?? true;
|
|
96
|
+
const parseOnly = options?.parseOnly ?? false;
|
|
97
|
+
const strictValidation = options?.strictValidation ?? true;
|
|
98
|
+
const importResults = _ImportResults.get(scene) ?? [];
|
|
99
|
+
const result = {
|
|
100
|
+
assetIndex: importResults.length,
|
|
101
|
+
document,
|
|
102
|
+
graphs: [],
|
|
103
|
+
pathConverter,
|
|
104
|
+
glTF: this._loader.gltf,
|
|
105
|
+
hostResolver: new InteractivityHostResolver(),
|
|
106
|
+
};
|
|
107
|
+
importResults.push(result);
|
|
108
|
+
_ImportResults.set(scene, importResults);
|
|
109
|
+
await Promise.all(document.graphs.map(async (graphModel) => {
|
|
110
|
+
const graphResult = {
|
|
111
|
+
graph: graphModel,
|
|
112
|
+
diagnostics: graphModel.diagnostics.slice(),
|
|
113
|
+
};
|
|
114
|
+
result.graphs[graphModel.index] = graphResult;
|
|
115
|
+
if (!graphModel.valid && strictValidation) {
|
|
116
|
+
Logger.Error(`KHR_interactivity: rejecting behavior graph #${graphModel.index}: ${graphModel.diagnostics.map((diagnostic) => diagnostic.message).join("; ")}`);
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
96
119
|
try {
|
|
97
|
-
const parser = new InteractivityGraphToFlowGraphParser(
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
120
|
+
const parser = new InteractivityGraphToFlowGraphParser(strictValidation ? graphModel.effectiveSource : graphModel.source, this._loader.gltf, this._loader.parent.targetFps, graphModel.index, supportedExtensions, strictValidation ? graphModel.declarations : undefined);
|
|
121
|
+
const serializedFlowGraph = parser.serializeToFlowGraph();
|
|
122
|
+
graphResult.serializedFlowGraph = serializedFlowGraph;
|
|
123
|
+
if (parseOnly) {
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
const coordinator = new FlowGraphCoordinator({ scene, hostResolver: result.hostResolver });
|
|
127
|
+
coordinator.dispatchEventsSynchronously = false;
|
|
128
|
+
graphResult.coordinator = coordinator;
|
|
129
|
+
graphResult.flowGraph = await ParseFlowGraphAsync(serializedFlowGraph, { coordinator, pathConverter });
|
|
130
|
+
if (autoStart && graphModel.index === document.defaultGraphIndex) {
|
|
131
|
+
coordinator.start();
|
|
132
|
+
}
|
|
101
133
|
}
|
|
102
134
|
catch (error) {
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
135
|
+
const message = error?.message ?? String(error);
|
|
136
|
+
graphResult.diagnostics.push({
|
|
137
|
+
path: graphModel.path,
|
|
138
|
+
message,
|
|
139
|
+
severity: "error",
|
|
140
|
+
});
|
|
141
|
+
Logger.Error(`KHR_interactivity: rejecting behavior graph #${graphModel.index}: ${message}`);
|
|
142
|
+
graphResult.coordinator?.dispose();
|
|
143
|
+
delete graphResult.coordinator;
|
|
144
|
+
delete graphResult.flowGraph;
|
|
145
|
+
delete graphResult.serializedFlowGraph;
|
|
107
146
|
}
|
|
108
147
|
}));
|
|
109
148
|
}
|
|
@@ -112,7 +151,7 @@ export class KHR_interactivity {
|
|
|
112
151
|
* @internal
|
|
113
152
|
* populates the object model with the interactivity extension
|
|
114
153
|
*/
|
|
115
|
-
export function _AddInteractivityObjectModel(scene) {
|
|
154
|
+
export function _AddInteractivityObjectModel(scene, targetFps, mapping) {
|
|
116
155
|
// Note - all of those are read-only, as per the specs!
|
|
117
156
|
// active camera rotation
|
|
118
157
|
AddObjectAccessorToKey("/extensions/KHR_interactivity/?/activeCamera/rotation", {
|
|
@@ -129,7 +168,7 @@ export function _AddInteractivityObjectModel(scene) {
|
|
|
129
168
|
},
|
|
130
169
|
type: "Quaternion",
|
|
131
170
|
getTarget: () => scene.activeCamera,
|
|
132
|
-
});
|
|
171
|
+
}, mapping);
|
|
133
172
|
// activeCamera position
|
|
134
173
|
AddObjectAccessorToKey("/extensions/KHR_interactivity/?/activeCamera/position", {
|
|
135
174
|
get: () => {
|
|
@@ -144,7 +183,7 @@ export function _AddInteractivityObjectModel(scene) {
|
|
|
144
183
|
},
|
|
145
184
|
type: "Vector3",
|
|
146
185
|
getTarget: () => scene.activeCamera,
|
|
147
|
-
});
|
|
186
|
+
}, mapping);
|
|
148
187
|
// activeCamera projection properties. Per the spec these read-only values are NaN when there is no
|
|
149
188
|
// active camera, or when the active camera does not use the projection type of the requested pointer
|
|
150
189
|
// (all perspective properties are NaN for an orthographic camera, and vice-versa).
|
|
@@ -167,7 +206,7 @@ export function _AddInteractivityObjectModel(scene) {
|
|
|
167
206
|
get: () => getActivePerspectiveValue((camera) => camera.getEngine().getAspectRatio(camera)),
|
|
168
207
|
type: "number",
|
|
169
208
|
getTarget: () => scene.activeCamera,
|
|
170
|
-
});
|
|
209
|
+
}, mapping);
|
|
171
210
|
// perspective/yfov (vertical field of view, in radians)
|
|
172
211
|
AddObjectAccessorToKey("/extensions/KHR_interactivity/?/activeCamera/perspective/yfov", {
|
|
173
212
|
get: () => getActivePerspectiveValue((camera) => {
|
|
@@ -181,19 +220,19 @@ export function _AddInteractivityObjectModel(scene) {
|
|
|
181
220
|
}),
|
|
182
221
|
type: "number",
|
|
183
222
|
getTarget: () => scene.activeCamera,
|
|
184
|
-
});
|
|
223
|
+
}, mapping);
|
|
185
224
|
// perspective/znear (distance to the near clipping plane)
|
|
186
225
|
AddObjectAccessorToKey("/extensions/KHR_interactivity/?/activeCamera/perspective/znear", {
|
|
187
226
|
get: () => getActivePerspectiveValue((camera) => camera.minZ),
|
|
188
227
|
type: "number",
|
|
189
228
|
getTarget: () => scene.activeCamera,
|
|
190
|
-
});
|
|
229
|
+
}, mapping);
|
|
191
230
|
// perspective/zfar (distance to the far clipping plane; Babylon uses maxZ === 0 to mean an infinite far plane)
|
|
192
231
|
AddObjectAccessorToKey("/extensions/KHR_interactivity/?/activeCamera/perspective/zfar", {
|
|
193
232
|
get: () => getActivePerspectiveValue((camera) => (camera.maxZ === 0 ? Infinity : camera.maxZ)),
|
|
194
233
|
type: "number",
|
|
195
234
|
getTarget: () => scene.activeCamera,
|
|
196
|
-
});
|
|
235
|
+
}, mapping);
|
|
197
236
|
// orthographic/xmag (half the orthographic width)
|
|
198
237
|
AddObjectAccessorToKey("/extensions/KHR_interactivity/?/activeCamera/orthographic/xmag", {
|
|
199
238
|
get: () => getActiveOrthographicValue((camera) => {
|
|
@@ -202,7 +241,7 @@ export function _AddInteractivityObjectModel(scene) {
|
|
|
202
241
|
}),
|
|
203
242
|
type: "number",
|
|
204
243
|
getTarget: () => scene.activeCamera,
|
|
205
|
-
});
|
|
244
|
+
}, mapping);
|
|
206
245
|
// orthographic/ymag (half the orthographic height)
|
|
207
246
|
AddObjectAccessorToKey("/extensions/KHR_interactivity/?/activeCamera/orthographic/ymag", {
|
|
208
247
|
get: () => getActiveOrthographicValue((camera) => {
|
|
@@ -211,19 +250,20 @@ export function _AddInteractivityObjectModel(scene) {
|
|
|
211
250
|
}),
|
|
212
251
|
type: "number",
|
|
213
252
|
getTarget: () => scene.activeCamera,
|
|
214
|
-
});
|
|
253
|
+
}, mapping);
|
|
215
254
|
// orthographic/znear (distance to the near clipping plane)
|
|
216
255
|
AddObjectAccessorToKey("/extensions/KHR_interactivity/?/activeCamera/orthographic/znear", {
|
|
217
256
|
get: () => getActiveOrthographicValue((camera) => camera.minZ),
|
|
218
257
|
type: "number",
|
|
219
258
|
getTarget: () => scene.activeCamera,
|
|
220
|
-
});
|
|
259
|
+
}, mapping);
|
|
221
260
|
// orthographic/zfar (distance to the far clipping plane)
|
|
222
261
|
AddObjectAccessorToKey("/extensions/KHR_interactivity/?/activeCamera/orthographic/zfar", {
|
|
223
262
|
get: () => getActiveOrthographicValue((camera) => camera.maxZ),
|
|
224
263
|
type: "number",
|
|
225
264
|
getTarget: () => scene.activeCamera,
|
|
226
|
-
});
|
|
265
|
+
}, mapping);
|
|
266
|
+
const getAnimationFps = (animation) => animation._babylonAnimationGroup?.targetedAnimations?.[0]?.animation.framePerSecond ?? targetFps;
|
|
227
267
|
// /animations/{} pointers:
|
|
228
268
|
AddObjectAccessorToKey("/animations/{}/extensions/KHR_interactivity/isPlaying", {
|
|
229
269
|
get: (animation) => {
|
|
@@ -233,45 +273,44 @@ export function _AddInteractivityObjectModel(scene) {
|
|
|
233
273
|
getTarget: (animation) => {
|
|
234
274
|
return animation._babylonAnimationGroup;
|
|
235
275
|
},
|
|
236
|
-
});
|
|
276
|
+
}, mapping);
|
|
237
277
|
AddObjectAccessorToKey("/animations/{}/extensions/KHR_interactivity/minTime", {
|
|
238
278
|
get: (animation) => {
|
|
239
|
-
return (animation._babylonAnimationGroup?.from ?? 0) /
|
|
279
|
+
return (animation._babylonAnimationGroup?.from ?? 0) / getAnimationFps(animation);
|
|
240
280
|
},
|
|
241
281
|
type: "number",
|
|
242
282
|
getTarget: (animation) => {
|
|
243
283
|
return animation._babylonAnimationGroup;
|
|
244
284
|
},
|
|
245
|
-
});
|
|
285
|
+
}, mapping);
|
|
246
286
|
AddObjectAccessorToKey("/animations/{}/extensions/KHR_interactivity/maxTime", {
|
|
247
287
|
get: (animation) => {
|
|
248
|
-
return (animation._babylonAnimationGroup?.to ?? 0) /
|
|
288
|
+
return (animation._babylonAnimationGroup?.to ?? 0) / getAnimationFps(animation);
|
|
249
289
|
},
|
|
250
290
|
type: "number",
|
|
251
291
|
getTarget: (animation) => {
|
|
252
292
|
return animation._babylonAnimationGroup;
|
|
253
293
|
},
|
|
254
|
-
});
|
|
294
|
+
}, mapping);
|
|
255
295
|
// playhead
|
|
256
296
|
AddObjectAccessorToKey("/animations/{}/extensions/KHR_interactivity/playhead", {
|
|
257
297
|
get: (animation) => {
|
|
258
|
-
return (animation._babylonAnimationGroup?.
|
|
298
|
+
return (animation._babylonAnimationGroup?.getRetainedCurrentFrame() ?? 0) / getAnimationFps(animation);
|
|
259
299
|
},
|
|
260
300
|
type: "number",
|
|
261
301
|
getTarget: (animation) => {
|
|
262
302
|
return animation._babylonAnimationGroup;
|
|
263
303
|
},
|
|
264
|
-
});
|
|
265
|
-
//virtualPlayhead - TODO, do we support this property in our animations? getCurrentFrame is the only method we have for this.
|
|
304
|
+
}, mapping);
|
|
266
305
|
AddObjectAccessorToKey("/animations/{}/extensions/KHR_interactivity/virtualPlayhead", {
|
|
267
306
|
get: (animation) => {
|
|
268
|
-
return (animation._babylonAnimationGroup?.
|
|
307
|
+
return (animation._babylonAnimationGroup?.getVirtualCurrentFrame() ?? 0) / getAnimationFps(animation);
|
|
269
308
|
},
|
|
270
309
|
type: "number",
|
|
271
310
|
getTarget: (animation) => {
|
|
272
311
|
return animation._babylonAnimationGroup;
|
|
273
312
|
},
|
|
274
|
-
});
|
|
313
|
+
}, mapping);
|
|
275
314
|
}
|
|
276
315
|
let _RuntimeRegistered = false;
|
|
277
316
|
/**
|
|
@@ -286,6 +325,15 @@ export function _RegisterKHRInteractivityRuntime() {
|
|
|
286
325
|
addToBlockFactory(NAME, "FlowGraphGLTFDataProvider", async () => {
|
|
287
326
|
return (await import("./KHR_interactivity/flowGraphGLTFDataProvider.js")).FlowGraphGLTFDataProvider;
|
|
288
327
|
});
|
|
328
|
+
addToBlockFactory(NAME, "FlowGraphUnsupportedInteractivityBlock", async () => {
|
|
329
|
+
return (await import("./KHR_interactivity/flowGraphUnsupportedInteractivityBlock.js")).FlowGraphUnsupportedInteractivityBlock;
|
|
330
|
+
});
|
|
331
|
+
addToBlockFactory(NAME, "FlowGraphObjectReferenceBlock", async () => {
|
|
332
|
+
return (await import("./KHR_interactivity/flowGraphObjectReferenceBlock.js")).FlowGraphObjectReferenceBlock;
|
|
333
|
+
});
|
|
334
|
+
addToBlockFactory(NAME, "FlowGraphEventReferenceBlock", async () => {
|
|
335
|
+
return (await import("./KHR_interactivity/flowGraphEventReferenceBlock.js")).FlowGraphEventReferenceBlock;
|
|
336
|
+
});
|
|
289
337
|
}
|
|
290
338
|
let _Registered = false;
|
|
291
339
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"KHR_interactivity.pure.js","sourceRoot":"","sources":["../../../../../../dev/loaders/src/glTF/2.0/Extensions/KHR_interactivity.pure.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.pure\";\r\nimport { type IGLTFLoaderExtension } from \"../glTFLoaderExtension\";\r\nimport { FlowGraphCoordinator } from \"core/FlowGraph/flowGraphCoordinator\";\r\nimport { ParseFlowGraphAsync } from \"core/FlowGraph/flowGraphParser\";\r\nimport { registerGLTFExtension, unregisterGLTFExtension, registeredGLTFExtensions } 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.pure\";\r\nimport { type Scene } from \"core/scene\";\r\nimport { type Camera } from \"core/Cameras/camera\";\r\nimport { Constants } from \"core/Engines/constants\";\r\nimport { type IAnimation } from \"../glTFLoaderInterfaces\";\r\nimport { CompositePathToObjectConverter, type IPathConverterPrefixEntry } from \"./compositePathToObjectConverter\";\r\nimport { BabylonScenePathToObjectConverter, BABYLON_SCENE_OBJECT_MODEL_PREFIX, CreateDefaultBabylonSceneObjectModelTree } from \"./babylonScenePathToObjectConverter\";\r\nimport { InteractivityRefPathToObjectConverter } from \"./interactivityRefPathToObjectConverter\";\r\nimport { InteractivityAssetPathToObjectConverter, InteractivityAssetCapabilitiesPrefix, InteractivityLimitsPrefix } from \"./interactivityAssetPathToObjectConverter\";\r\nimport { EventReferencePrefix, DelayReferencePrefix } from \"./KHR_interactivity/interactivityReferences\";\r\nimport { InteractivityHostResolver } from \"./KHR_interactivity/interactivityHostResolver\";\r\nimport { type IObjectAccessor } from \"core/FlowGraph/typeDefinitions\";\r\nimport { type IPathToObjectConverter } from \"core/ObjectModel/objectModelInterfaces\";\r\nimport { Logger } from \"core/Misc/logger\";\r\n\r\nconst NAME = \"KHR_interactivity\";\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 _gltfPathConverter?: GLTFPathToObjectConverter<any, any, any>;\r\n private _pathConverter?: CompositePathToObjectConverter<IObjectAccessor>;\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._gltfPathConverter = GetPathToObjectConverter(this._loader.gltf);\r\n const scene = _loader.babylonScene;\r\n if (this._gltfPathConverter) {\r\n // Build a composite that handles both:\r\n // - The Babylon-scene namespace (`/extensions/BABYLON_scene_objects/...`),\r\n // used by ref values that point at scene objects not described by the\r\n // source glTF (e.g. refs emitted by engine-side event blocks).\r\n // - The standard glTF object model (everything else), via the existing\r\n // glTF converter as a fallback.\r\n const initialPrefixes: IPathConverterPrefixEntry<IObjectAccessor>[] = [];\r\n if (scene) {\r\n initialPrefixes.push({\r\n prefix: BABYLON_SCENE_OBJECT_MODEL_PREFIX,\r\n converter: new BabylonScenePathToObjectConverter(scene, CreateDefaultBabylonSceneObjectModelTree()),\r\n });\r\n }\r\n // KHR_interactivity ref-validity pointers (`/extensions/KHR_interactivity/events/{}`\r\n // and `/extensions/KHR_interactivity/delays/{}`) are virtual: they validate an opaque\r\n // event/delay reference rather than addressing a glTF object, so route them to a\r\n // dedicated converter instead of the glTF fallback.\r\n const refConverter = new InteractivityRefPathToObjectConverter();\r\n initialPrefixes.push({ prefix: EventReferencePrefix, converter: refConverter });\r\n initialPrefixes.push({ prefix: DelayReferencePrefix, converter: refConverter });\r\n // Asset capabilities and runtime limits (`/extensions/KHR_interactivity/asset/...` and\r\n // `/extensions/KHR_interactivity/limits/...`) are virtual too: they describe the asset and the\r\n // implementation running it rather than addressing a glTF object. The set of enabled extensions is\r\n // resolved eagerly because the loader is released once loading completes, while the behavior graph\r\n // keeps querying these pointers at runtime.\r\n const enabledExtensions = new Set(\r\n (this._loader.gltf.extensionsUsed ?? []).filter((name) => registeredGLTFExtensions.has(name) && this._loader.parent.extensionOptions[name]?.enabled !== false)\r\n );\r\n const assetConverter = new InteractivityAssetPathToObjectConverter(this._loader.gltf, (extensionName) => enabledExtensions.has(extensionName));\r\n initialPrefixes.push({ prefix: InteractivityAssetCapabilitiesPrefix, converter: assetConverter });\r\n initialPrefixes.push({ prefix: InteractivityLimitsPrefix, converter: assetConverter });\r\n this._pathConverter = new CompositePathToObjectConverter<IObjectAccessor>(\r\n initialPrefixes,\r\n this._gltfPathConverter as unknown as IPathToObjectConverter<IObjectAccessor>\r\n );\r\n }\r\n // avoid starting animations automatically.\r\n _loader._skipStartAnimationStep = true;\r\n\r\n // Update object model with new pointers\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._gltfPathConverter;\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 // The specification requires an invalid behavior graph to be rejected. Parse each graph into its\r\n // own coordinator so a graph that throws part-way can be disposed without leaving a half-built graph\r\n // registered — a shared coordinator's start() would otherwise run that partial graph. A scene\r\n // supports many coordinators, and glTF behavior graphs are independent of one another.\r\n await Promise.all(\r\n interactivityDefinition.graphs.map(async (graph, index) => {\r\n const coordinator = new FlowGraphCoordinator({ scene, hostResolver: new InteractivityHostResolver() });\r\n coordinator.dispatchEventsSynchronously = false; // glTF interactivity dispatches events asynchronously\r\n try {\r\n const parser = new InteractivityGraphToFlowGraphParser(graph, this._loader.gltf, this._loader.parent.targetFps);\r\n await ParseFlowGraphAsync(parser.serializeToFlowGraph(), { coordinator, pathConverter: this._pathConverter });\r\n // Only start graphs that parsed cleanly; keep loading the rest of the asset either way.\r\n coordinator.start();\r\n } catch (error) {\r\n Logger.Error(`KHR_interactivity: rejecting behavior graph #${index}: ${(error as Error)?.message ?? error}`);\r\n // Dispose the coordinator (and the partially-built graph it holds) so nothing from the\r\n // rejected graph stays registered or running.\r\n coordinator.dispose();\r\n }\r\n })\r\n );\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 // activeCamera projection properties. Per the spec these read-only values are NaN when there is no\r\n // active camera, or when the active camera does not use the projection type of the requested pointer\r\n // (all perspective properties are NaN for an orthographic camera, and vice-versa).\r\n const getActivePerspectiveValue = (compute: (camera: Camera) => number): number => {\r\n const camera = scene.activeCamera;\r\n if (!camera || camera.mode === Constants.ORTHOGRAPHIC_CAMERA) {\r\n return NaN;\r\n }\r\n return compute(camera);\r\n };\r\n const getActiveOrthographicValue = (compute: (camera: Camera) => number): number => {\r\n const camera = scene.activeCamera;\r\n if (!camera || camera.mode !== Constants.ORTHOGRAPHIC_CAMERA) {\r\n return NaN;\r\n }\r\n return compute(camera);\r\n };\r\n\r\n // perspective/aspectRatio (width over height)\r\n AddObjectAccessorToKey(\"/extensions/KHR_interactivity/?/activeCamera/perspective/aspectRatio\", {\r\n get: () => getActivePerspectiveValue((camera) => camera.getEngine().getAspectRatio(camera)),\r\n type: \"number\",\r\n getTarget: () => scene.activeCamera,\r\n });\r\n // perspective/yfov (vertical field of view, in radians)\r\n AddObjectAccessorToKey(\"/extensions/KHR_interactivity/?/activeCamera/perspective/yfov\", {\r\n get: () =>\r\n getActivePerspectiveValue((camera) => {\r\n // Babylon stores the vertical fov when fovMode is vertical-fixed (the default and what the glTF\r\n // loader sets). For a horizontal-fixed camera, convert the horizontal fov to vertical.\r\n if (camera.fovMode === Constants.FOVMODE_VERTICAL_FIXED) {\r\n return camera.fov;\r\n }\r\n const aspectRatio = camera.getEngine().getAspectRatio(camera);\r\n return aspectRatio ? 2 * Math.atan(Math.tan(camera.fov / 2) / aspectRatio) : camera.fov;\r\n }),\r\n type: \"number\",\r\n getTarget: () => scene.activeCamera,\r\n });\r\n // perspective/znear (distance to the near clipping plane)\r\n AddObjectAccessorToKey(\"/extensions/KHR_interactivity/?/activeCamera/perspective/znear\", {\r\n get: () => getActivePerspectiveValue((camera) => camera.minZ),\r\n type: \"number\",\r\n getTarget: () => scene.activeCamera,\r\n });\r\n // perspective/zfar (distance to the far clipping plane; Babylon uses maxZ === 0 to mean an infinite far plane)\r\n AddObjectAccessorToKey(\"/extensions/KHR_interactivity/?/activeCamera/perspective/zfar\", {\r\n get: () => getActivePerspectiveValue((camera) => (camera.maxZ === 0 ? Infinity : camera.maxZ)),\r\n type: \"number\",\r\n getTarget: () => scene.activeCamera,\r\n });\r\n // orthographic/xmag (half the orthographic width)\r\n AddObjectAccessorToKey(\"/extensions/KHR_interactivity/?/activeCamera/orthographic/xmag\", {\r\n get: () =>\r\n getActiveOrthographicValue((camera) => {\r\n const halfWidth = camera.getEngine().getRenderWidth() / 2;\r\n return ((camera.orthoRight ?? halfWidth) - (camera.orthoLeft ?? -halfWidth)) / 2;\r\n }),\r\n type: \"number\",\r\n getTarget: () => scene.activeCamera,\r\n });\r\n // orthographic/ymag (half the orthographic height)\r\n AddObjectAccessorToKey(\"/extensions/KHR_interactivity/?/activeCamera/orthographic/ymag\", {\r\n get: () =>\r\n getActiveOrthographicValue((camera) => {\r\n const halfHeight = camera.getEngine().getRenderHeight() / 2;\r\n return ((camera.orthoTop ?? halfHeight) - (camera.orthoBottom ?? -halfHeight)) / 2;\r\n }),\r\n type: \"number\",\r\n getTarget: () => scene.activeCamera,\r\n });\r\n // orthographic/znear (distance to the near clipping plane)\r\n AddObjectAccessorToKey(\"/extensions/KHR_interactivity/?/activeCamera/orthographic/znear\", {\r\n get: () => getActiveOrthographicValue((camera) => camera.minZ),\r\n type: \"number\",\r\n getTarget: () => scene.activeCamera,\r\n });\r\n // orthographic/zfar (distance to the far clipping plane)\r\n AddObjectAccessorToKey(\"/extensions/KHR_interactivity/?/activeCamera/orthographic/zfar\", {\r\n get: () => getActiveOrthographicValue((camera) => camera.maxZ),\r\n type: \"number\",\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\nlet _RuntimeRegistered = false;\r\n/**\r\n * @internal\r\n * Registers KHR_interactivity runtime dependencies without changing the extension registry.\r\n */\r\nexport function _RegisterKHRInteractivityRuntime(): void {\r\n if (_RuntimeRegistered) {\r\n return;\r\n }\r\n _RuntimeRegistered = true;\r\n\r\n addToBlockFactory(NAME, \"FlowGraphGLTFDataProvider\", async () => {\r\n return (await import(\"./KHR_interactivity/flowGraphGLTFDataProvider\")).FlowGraphGLTFDataProvider;\r\n });\r\n}\r\n\r\nlet _Registered = false;\r\n/**\r\n * Registers the KHR_interactivity glTF loader extension.\r\n * Safe to call multiple times; only the first call has an effect.\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport function RegisterKHR_interactivity(): void {\r\n if (_Registered) {\r\n return;\r\n }\r\n _Registered = true;\r\n\r\n _RegisterKHRInteractivityRuntime();\r\n\r\n unregisterGLTFExtension(NAME);\r\n\r\n registerGLTFExtension(NAME, true, (loader) => new KHR_interactivity(loader));\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"KHR_interactivity.pure.js","sourceRoot":"","sources":["../../../../../../dev/loaders/src/glTF/2.0/Extensions/KHR_interactivity.pure.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.pure\";\r\nimport { type IGLTFLoaderExtension } from \"../glTFLoaderExtension\";\r\nimport { FlowGraphCoordinator } from \"core/FlowGraph/flowGraphCoordinator\";\r\nimport { ParseFlowGraphAsync } from \"core/FlowGraph/flowGraphParser\";\r\nimport { registerGLTFExtension, unregisterGLTFExtension, registeredGLTFExtensions } 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.pure\";\r\nimport { type Scene } from \"core/scene\";\r\nimport { type Camera } from \"core/Cameras/camera\";\r\nimport { Constants } from \"core/Engines/constants\";\r\nimport { type IAnimation } from \"../glTFLoaderInterfaces\";\r\nimport { CompositePathToObjectConverter, type IPathConverterPrefixEntry } from \"./compositePathToObjectConverter\";\r\nimport { BabylonScenePathToObjectConverter, BABYLON_SCENE_OBJECT_MODEL_PREFIX, CreateDefaultBabylonSceneObjectModelTree } from \"./babylonScenePathToObjectConverter\";\r\nimport { InteractivityRefPathToObjectConverter } from \"./interactivityRefPathToObjectConverter\";\r\nimport { InteractivityAssetPathToObjectConverter, InteractivityAssetCapabilitiesPrefix, InteractivityLimitsPrefix } from \"./interactivityAssetPathToObjectConverter\";\r\nimport { EventReferencePrefix, DelayReferencePrefix } from \"./KHR_interactivity/interactivityReferences\";\r\nimport { InteractivityHostResolver } from \"./KHR_interactivity/interactivityHostResolver\";\r\nimport { type IObjectAccessor, type ISerializedFlowGraph } from \"core/FlowGraph/typeDefinitions\";\r\nimport { type IPathToObjectConverter } from \"core/ObjectModel/objectModelInterfaces\";\r\nimport { Logger } from \"core/Misc/logger\";\r\nimport {\r\n CreateKHRInteractivityDocument,\r\n type IKHRInteractivityDiagnostic,\r\n type IKHRInteractivityDocument,\r\n type IKHRInteractivityGraphModel,\r\n} from \"./KHR_interactivity/interactivityGraphModel\";\r\nimport { type FlowGraph } from \"core/FlowGraph/flowGraph\";\r\n\r\nconst NAME = \"KHR_interactivity\";\r\n\r\n/**\r\n * Runtime projection of one canonical KHR_interactivity graph.\r\n */\r\nexport interface IKHRInteractivityGraphImportResult {\r\n /** Canonical source graph and diagnostics. */\r\n graph: IKHRInteractivityGraphModel;\r\n /** Executable FlowGraph serialization when lowering succeeded. */\r\n serializedFlowGraph?: ISerializedFlowGraph;\r\n /** Runtime FlowGraph when runtime construction was requested. */\r\n flowGraph?: FlowGraph;\r\n /** Coordinator that owns the runtime FlowGraph. */\r\n coordinator?: FlowGraphCoordinator;\r\n /** Additional lowering/runtime diagnostics. */\r\n diagnostics: IKHRInteractivityDiagnostic[];\r\n}\r\n\r\n/**\r\n * Completed KHR_interactivity import result associated with a loaded scene.\r\n */\r\nexport interface IKHRInteractivityImportResult {\r\n /** Stable zero-based identity of this interactivity asset among assets appended to the scene. */\r\n assetIndex: number;\r\n /** Canonical, lossless source document. */\r\n document: IKHRInteractivityDocument;\r\n /** Graph import results in source order. */\r\n graphs: IKHRInteractivityGraphImportResult[];\r\n /** Shared path converter required by pointer blocks. */\r\n pathConverter: CompositePathToObjectConverter<IObjectAccessor>;\r\n /** Live glTF loader data used by glTF data-provider blocks. */\r\n glTF: GLTFLoader[\"gltf\"];\r\n /** Host resolver that supplies KHR reference semantics to executable graphs. */\r\n hostResolver: InteractivityHostResolver;\r\n}\r\n\r\nconst _ImportResults = /*#__PURE__*/ new WeakMap<Scene, IKHRInteractivityImportResult[]>();\r\n\r\n/**\r\n * Gets the completed KHR_interactivity import result for a loaded scene.\r\n * @param scene scene loaded from the glTF asset\r\n * @returns the import result, or undefined when the scene has no KHR_interactivity data\r\n */\r\nexport function GetKHRInteractivityImportResult(scene: Scene): IKHRInteractivityImportResult | undefined {\r\n const results = _ImportResults.get(scene);\r\n return results?.[results.length - 1];\r\n}\r\n\r\n/**\r\n * Gets every completed KHR_interactivity import result appended to a loaded scene.\r\n * Results remain in asset load order and each result has a stable {@link IKHRInteractivityImportResult.assetIndex}.\r\n * @param scene scene containing the loaded glTF assets\r\n * @returns the scene's import results, or an empty array when it has no KHR_interactivity data\r\n */\r\nexport function GetKHRInteractivityImportResults(scene: Scene): readonly IKHRInteractivityImportResult[] {\r\n return _ImportResults.get(scene) ?? [];\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 /** Runs after extensions that contribute interactivity operations and object state. */\r\n public readonly order = 200;\r\n /**\r\n * Defines whether this extension is enabled.\r\n */\r\n public enabled: boolean;\r\n\r\n private _gltfPathConverter?: GLTFPathToObjectConverter<any, any, any>;\r\n private _pathConverter?: CompositePathToObjectConverter<IObjectAccessor>;\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 // avoid starting animations automatically.\r\n _loader._skipStartAnimationStep = true;\r\n }\r\n\r\n private _initializePathConverter(scene: Scene): CompositePathToObjectConverter<IObjectAccessor> {\r\n this._gltfPathConverter = GetPathToObjectConverter(this._loader.gltf, (mapping) => _AddInteractivityObjectModel(scene, this._loader.parent.targetFps, mapping));\r\n const initialPrefixes: IPathConverterPrefixEntry<IObjectAccessor>[] = [\r\n {\r\n prefix: BABYLON_SCENE_OBJECT_MODEL_PREFIX,\r\n converter: new BabylonScenePathToObjectConverter(scene, CreateDefaultBabylonSceneObjectModelTree()),\r\n },\r\n ];\r\n const refConverter = new InteractivityRefPathToObjectConverter();\r\n initialPrefixes.push({ prefix: EventReferencePrefix, converter: refConverter });\r\n initialPrefixes.push({ prefix: DelayReferencePrefix, converter: refConverter });\r\n const enabledExtensions = new Set(\r\n (this._loader.gltf.extensionsUsed ?? []).filter((name) => registeredGLTFExtensions.has(name) && this._loader.parent.extensionOptions[name]?.enabled !== false)\r\n );\r\n const assetConverter = new InteractivityAssetPathToObjectConverter(this._loader.gltf, (extensionName) => enabledExtensions.has(extensionName));\r\n initialPrefixes.push({ prefix: InteractivityAssetCapabilitiesPrefix, converter: assetConverter });\r\n initialPrefixes.push({ prefix: InteractivityLimitsPrefix, converter: assetConverter });\r\n const pathConverter = new CompositePathToObjectConverter<IObjectAccessor>(initialPrefixes, this._gltfPathConverter as unknown as IPathToObjectConverter<IObjectAccessor>);\r\n this._pathConverter = pathConverter;\r\n return pathConverter;\r\n }\r\n\r\n public dispose() {\r\n (this._loader as any) = null;\r\n delete this._gltfPathConverter;\r\n delete this._pathConverter;\r\n }\r\n\r\n public async onReady(): Promise<void> {\r\n if (!this._loader.babylonScene) {\r\n return;\r\n }\r\n const scene = this._loader.babylonScene;\r\n const pathConverter = this._initializePathConverter(scene);\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 supportedExtensions = new Set(\r\n (this._loader.gltf.extensionsUsed ?? []).filter((extensionName) => this._loader.parent.extensionOptions[extensionName]?.enabled !== false)\r\n );\r\n const document = CreateKHRInteractivityDocument(interactivityDefinition, supportedExtensions, this._loader.gltf.nodes?.length ?? 0);\r\n const options = this._loader.parent.extensionOptions[NAME];\r\n const autoStart = options?.autoStart ?? true;\r\n const parseOnly = options?.parseOnly ?? false;\r\n const strictValidation = options?.strictValidation ?? true;\r\n const importResults = _ImportResults.get(scene) ?? [];\r\n const result: IKHRInteractivityImportResult = {\r\n assetIndex: importResults.length,\r\n document,\r\n graphs: [],\r\n pathConverter,\r\n glTF: this._loader.gltf,\r\n hostResolver: new InteractivityHostResolver(),\r\n };\r\n importResults.push(result);\r\n _ImportResults.set(scene, importResults);\r\n\r\n await Promise.all(\r\n document.graphs.map(async (graphModel) => {\r\n const graphResult: IKHRInteractivityGraphImportResult = {\r\n graph: graphModel,\r\n diagnostics: graphModel.diagnostics.slice(),\r\n };\r\n result.graphs[graphModel.index] = graphResult;\r\n if (!graphModel.valid && strictValidation) {\r\n Logger.Error(`KHR_interactivity: rejecting behavior graph #${graphModel.index}: ${graphModel.diagnostics.map((diagnostic) => diagnostic.message).join(\"; \")}`);\r\n return;\r\n }\r\n try {\r\n const parser = new InteractivityGraphToFlowGraphParser(\r\n strictValidation ? graphModel.effectiveSource : graphModel.source,\r\n this._loader.gltf,\r\n this._loader.parent.targetFps,\r\n graphModel.index,\r\n supportedExtensions,\r\n strictValidation ? graphModel.declarations : undefined\r\n );\r\n const serializedFlowGraph = parser.serializeToFlowGraph();\r\n graphResult.serializedFlowGraph = serializedFlowGraph;\r\n if (parseOnly) {\r\n return;\r\n }\r\n const coordinator = new FlowGraphCoordinator({ scene, hostResolver: result.hostResolver });\r\n coordinator.dispatchEventsSynchronously = false;\r\n graphResult.coordinator = coordinator;\r\n graphResult.flowGraph = await ParseFlowGraphAsync(serializedFlowGraph, { coordinator, pathConverter });\r\n if (autoStart && graphModel.index === document.defaultGraphIndex) {\r\n coordinator.start();\r\n }\r\n } catch (error) {\r\n const message = (error as Error)?.message ?? String(error);\r\n graphResult.diagnostics.push({\r\n path: graphModel.path,\r\n message,\r\n severity: \"error\",\r\n });\r\n Logger.Error(`KHR_interactivity: rejecting behavior graph #${graphModel.index}: ${message}`);\r\n graphResult.coordinator?.dispose();\r\n delete graphResult.coordinator;\r\n delete graphResult.flowGraph;\r\n delete graphResult.serializedFlowGraph;\r\n }\r\n })\r\n );\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, targetFps: number, mapping: object) {\r\n // Note - all of those are read-only, as per the specs!\r\n\r\n // active camera rotation\r\n AddObjectAccessorToKey(\r\n \"/extensions/KHR_interactivity/?/activeCamera/rotation\",\r\n {\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 mapping\r\n );\r\n // activeCamera position\r\n AddObjectAccessorToKey(\r\n \"/extensions/KHR_interactivity/?/activeCamera/position\",\r\n {\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 mapping\r\n );\r\n\r\n // activeCamera projection properties. Per the spec these read-only values are NaN when there is no\r\n // active camera, or when the active camera does not use the projection type of the requested pointer\r\n // (all perspective properties are NaN for an orthographic camera, and vice-versa).\r\n const getActivePerspectiveValue = (compute: (camera: Camera) => number): number => {\r\n const camera = scene.activeCamera;\r\n if (!camera || camera.mode === Constants.ORTHOGRAPHIC_CAMERA) {\r\n return NaN;\r\n }\r\n return compute(camera);\r\n };\r\n const getActiveOrthographicValue = (compute: (camera: Camera) => number): number => {\r\n const camera = scene.activeCamera;\r\n if (!camera || camera.mode !== Constants.ORTHOGRAPHIC_CAMERA) {\r\n return NaN;\r\n }\r\n return compute(camera);\r\n };\r\n\r\n // perspective/aspectRatio (width over height)\r\n AddObjectAccessorToKey(\r\n \"/extensions/KHR_interactivity/?/activeCamera/perspective/aspectRatio\",\r\n {\r\n get: () => getActivePerspectiveValue((camera) => camera.getEngine().getAspectRatio(camera)),\r\n type: \"number\",\r\n getTarget: () => scene.activeCamera,\r\n },\r\n mapping\r\n );\r\n // perspective/yfov (vertical field of view, in radians)\r\n AddObjectAccessorToKey(\r\n \"/extensions/KHR_interactivity/?/activeCamera/perspective/yfov\",\r\n {\r\n get: () =>\r\n getActivePerspectiveValue((camera) => {\r\n // Babylon stores the vertical fov when fovMode is vertical-fixed (the default and what the glTF\r\n // loader sets). For a horizontal-fixed camera, convert the horizontal fov to vertical.\r\n if (camera.fovMode === Constants.FOVMODE_VERTICAL_FIXED) {\r\n return camera.fov;\r\n }\r\n const aspectRatio = camera.getEngine().getAspectRatio(camera);\r\n return aspectRatio ? 2 * Math.atan(Math.tan(camera.fov / 2) / aspectRatio) : camera.fov;\r\n }),\r\n type: \"number\",\r\n getTarget: () => scene.activeCamera,\r\n },\r\n mapping\r\n );\r\n // perspective/znear (distance to the near clipping plane)\r\n AddObjectAccessorToKey(\r\n \"/extensions/KHR_interactivity/?/activeCamera/perspective/znear\",\r\n {\r\n get: () => getActivePerspectiveValue((camera) => camera.minZ),\r\n type: \"number\",\r\n getTarget: () => scene.activeCamera,\r\n },\r\n mapping\r\n );\r\n // perspective/zfar (distance to the far clipping plane; Babylon uses maxZ === 0 to mean an infinite far plane)\r\n AddObjectAccessorToKey(\r\n \"/extensions/KHR_interactivity/?/activeCamera/perspective/zfar\",\r\n {\r\n get: () => getActivePerspectiveValue((camera) => (camera.maxZ === 0 ? Infinity : camera.maxZ)),\r\n type: \"number\",\r\n getTarget: () => scene.activeCamera,\r\n },\r\n mapping\r\n );\r\n // orthographic/xmag (half the orthographic width)\r\n AddObjectAccessorToKey(\r\n \"/extensions/KHR_interactivity/?/activeCamera/orthographic/xmag\",\r\n {\r\n get: () =>\r\n getActiveOrthographicValue((camera) => {\r\n const halfWidth = camera.getEngine().getRenderWidth() / 2;\r\n return ((camera.orthoRight ?? halfWidth) - (camera.orthoLeft ?? -halfWidth)) / 2;\r\n }),\r\n type: \"number\",\r\n getTarget: () => scene.activeCamera,\r\n },\r\n mapping\r\n );\r\n // orthographic/ymag (half the orthographic height)\r\n AddObjectAccessorToKey(\r\n \"/extensions/KHR_interactivity/?/activeCamera/orthographic/ymag\",\r\n {\r\n get: () =>\r\n getActiveOrthographicValue((camera) => {\r\n const halfHeight = camera.getEngine().getRenderHeight() / 2;\r\n return ((camera.orthoTop ?? halfHeight) - (camera.orthoBottom ?? -halfHeight)) / 2;\r\n }),\r\n type: \"number\",\r\n getTarget: () => scene.activeCamera,\r\n },\r\n mapping\r\n );\r\n // orthographic/znear (distance to the near clipping plane)\r\n AddObjectAccessorToKey(\r\n \"/extensions/KHR_interactivity/?/activeCamera/orthographic/znear\",\r\n {\r\n get: () => getActiveOrthographicValue((camera) => camera.minZ),\r\n type: \"number\",\r\n getTarget: () => scene.activeCamera,\r\n },\r\n mapping\r\n );\r\n // orthographic/zfar (distance to the far clipping plane)\r\n AddObjectAccessorToKey(\r\n \"/extensions/KHR_interactivity/?/activeCamera/orthographic/zfar\",\r\n {\r\n get: () => getActiveOrthographicValue((camera) => camera.maxZ),\r\n type: \"number\",\r\n getTarget: () => scene.activeCamera,\r\n },\r\n mapping\r\n );\r\n\r\n const getAnimationFps = (animation: IAnimation): number => animation._babylonAnimationGroup?.targetedAnimations?.[0]?.animation.framePerSecond ?? targetFps;\r\n\r\n // /animations/{} pointers:\r\n AddObjectAccessorToKey(\r\n \"/animations/{}/extensions/KHR_interactivity/isPlaying\",\r\n {\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 mapping\r\n );\r\n AddObjectAccessorToKey(\r\n \"/animations/{}/extensions/KHR_interactivity/minTime\",\r\n {\r\n get: (animation: IAnimation) => {\r\n return (animation._babylonAnimationGroup?.from ?? 0) / getAnimationFps(animation);\r\n },\r\n type: \"number\",\r\n getTarget: (animation: IAnimation) => {\r\n return animation._babylonAnimationGroup;\r\n },\r\n },\r\n mapping\r\n );\r\n AddObjectAccessorToKey(\r\n \"/animations/{}/extensions/KHR_interactivity/maxTime\",\r\n {\r\n get: (animation: IAnimation) => {\r\n return (animation._babylonAnimationGroup?.to ?? 0) / getAnimationFps(animation);\r\n },\r\n type: \"number\",\r\n getTarget: (animation: IAnimation) => {\r\n return animation._babylonAnimationGroup;\r\n },\r\n },\r\n mapping\r\n );\r\n // playhead\r\n AddObjectAccessorToKey(\r\n \"/animations/{}/extensions/KHR_interactivity/playhead\",\r\n {\r\n get: (animation: IAnimation) => {\r\n return (animation._babylonAnimationGroup?.getRetainedCurrentFrame() ?? 0) / getAnimationFps(animation);\r\n },\r\n type: \"number\",\r\n getTarget: (animation: IAnimation) => {\r\n return animation._babylonAnimationGroup;\r\n },\r\n },\r\n mapping\r\n );\r\n AddObjectAccessorToKey(\r\n \"/animations/{}/extensions/KHR_interactivity/virtualPlayhead\",\r\n {\r\n get: (animation: IAnimation) => {\r\n return (animation._babylonAnimationGroup?.getVirtualCurrentFrame() ?? 0) / getAnimationFps(animation);\r\n },\r\n type: \"number\",\r\n getTarget: (animation: IAnimation) => {\r\n return animation._babylonAnimationGroup;\r\n },\r\n },\r\n mapping\r\n );\r\n}\r\n\r\nlet _RuntimeRegistered = false;\r\n/**\r\n * @internal\r\n * Registers KHR_interactivity runtime dependencies without changing the extension registry.\r\n */\r\nexport function _RegisterKHRInteractivityRuntime(): void {\r\n if (_RuntimeRegistered) {\r\n return;\r\n }\r\n _RuntimeRegistered = true;\r\n\r\n addToBlockFactory(NAME, \"FlowGraphGLTFDataProvider\", async () => {\r\n return (await import(\"./KHR_interactivity/flowGraphGLTFDataProvider\")).FlowGraphGLTFDataProvider;\r\n });\r\n addToBlockFactory(NAME, \"FlowGraphUnsupportedInteractivityBlock\", async () => {\r\n return (await import(\"./KHR_interactivity/flowGraphUnsupportedInteractivityBlock\")).FlowGraphUnsupportedInteractivityBlock;\r\n });\r\n addToBlockFactory(NAME, \"FlowGraphObjectReferenceBlock\", async () => {\r\n return (await import(\"./KHR_interactivity/flowGraphObjectReferenceBlock\")).FlowGraphObjectReferenceBlock;\r\n });\r\n addToBlockFactory(NAME, \"FlowGraphEventReferenceBlock\", async () => {\r\n return (await import(\"./KHR_interactivity/flowGraphEventReferenceBlock\")).FlowGraphEventReferenceBlock;\r\n });\r\n}\r\n\r\nlet _Registered = false;\r\n/**\r\n * Registers the KHR_interactivity glTF loader extension.\r\n * Safe to call multiple times; only the first call has an effect.\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport function RegisterKHR_interactivity(): void {\r\n if (_Registered) {\r\n return;\r\n }\r\n _Registered = true;\r\n\r\n _RegisterKHRInteractivityRuntime();\r\n\r\n unregisterGLTFExtension(NAME);\r\n\r\n registerGLTFExtension(NAME, true, (loader) => new KHR_interactivity(loader));\r\n}\r\n"]}
|
|
@@ -4,6 +4,23 @@ declare module "../../glTFFileLoader.js" {
|
|
|
4
4
|
/**
|
|
5
5
|
* Defines options for the KHR_interactivity extension.
|
|
6
6
|
*/
|
|
7
|
-
["KHR_interactivity"]: {
|
|
7
|
+
["KHR_interactivity"]: {
|
|
8
|
+
/**
|
|
9
|
+
* Whether the selected default graph starts automatically after import.
|
|
10
|
+
* Defaults to true.
|
|
11
|
+
*/
|
|
12
|
+
autoStart?: boolean;
|
|
13
|
+
/**
|
|
14
|
+
* Whether to retain only the canonical source model and executable
|
|
15
|
+
* FlowGraph serialization without constructing runtime graphs.
|
|
16
|
+
* Defaults to false.
|
|
17
|
+
*/
|
|
18
|
+
parseOnly?: boolean;
|
|
19
|
+
/**
|
|
20
|
+
* Whether to enforce the ratified graph validation rules.
|
|
21
|
+
* Defaults to true. Set to false only for pre-ratification assets.
|
|
22
|
+
*/
|
|
23
|
+
strictValidation?: boolean;
|
|
24
|
+
};
|
|
8
25
|
}
|
|
9
26
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"KHR_interactivity.types.js","sourceRoot":"","sources":["../../../../../../dev/loaders/src/glTF/2.0/Extensions/KHR_interactivity.types.ts"],"names":[],"mappings":"","sourcesContent":["export {};\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"]}
|
|
1
|
+
{"version":3,"file":"KHR_interactivity.types.js","sourceRoot":"","sources":["../../../../../../dev/loaders/src/glTF/2.0/Extensions/KHR_interactivity.types.ts"],"names":[],"mappings":"","sourcesContent":["export {};\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 * Whether the selected default graph starts automatically after import.\r\n * Defaults to true.\r\n */\r\n autoStart?: boolean;\r\n /**\r\n * Whether to retain only the canonical source model and executable\r\n * FlowGraph serialization without constructing runtime graphs.\r\n * Defaults to false.\r\n */\r\n parseOnly?: boolean;\r\n /**\r\n * Whether to enforce the ratified graph validation rules.\r\n * Defaults to true. Set to false only for pre-ratification assets.\r\n */\r\n strictValidation?: boolean;\r\n };\r\n }\r\n}\r\n"]}
|
|
@@ -9,6 +9,8 @@ export declare class KHR_node_hoverability implements IGLTFLoaderExtension {
|
|
|
9
9
|
* The name of this extension.
|
|
10
10
|
*/
|
|
11
11
|
readonly name = "KHR_node_hoverability";
|
|
12
|
+
/** Applies node state before KHR_interactivity graphs start. */
|
|
13
|
+
readonly order = 100;
|
|
12
14
|
/**
|
|
13
15
|
* Defines whether this extension is enabled.
|
|
14
16
|
*/
|