@hology/core 0.0.212 → 0.0.213
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/dist/effects/sequence/index.d.ts +1 -0
- package/dist/effects/sequence/index.js +1 -1
- package/dist/effects/sequence/sequence-action.d.ts +5 -0
- package/dist/effects/sequence/sequence-actor.d.ts +7 -0
- package/dist/effects/sequence/sequence-actor.js +1 -1
- package/dist/effects/sequence/sequence-animation-retiming.js +1 -1
- package/dist/effects/sequence/sequence-data.d.ts +9 -0
- package/dist/effects/sequence/sequence-data.js +1 -1
- package/dist/effects/sequence/sequence-player.d.ts +12 -1
- package/dist/effects/sequence/sequence-player.js +1 -1
- package/dist/effects/sequence/sequence-transform.d.ts +10 -0
- package/dist/effects/sequence/sequence-transform.js +4 -0
- package/dist/effects/sequence/sequence-value-lane.d.ts +2 -0
- package/dist/effects/sequence/sequence-value-lane.js +1 -1
- package/dist/effects/vfx/vfx-actor.d.ts +5 -0
- package/dist/effects/vfx/vfx-actor.js +1 -1
- package/dist/effects/vfx/vfx-asset.d.ts +2 -1
- package/dist/effects/vfx/vfx-asset.js +1 -1
- package/dist/effects/vfx/vfx-materializer.js +1 -1
- package/dist/effects/vfx/vfx-renderers.d.ts +1 -0
- package/dist/effects/vfx/vfx-renderers.js +1 -1
- package/dist/gameplay/actors/actor.d.ts +3 -5
- package/dist/gameplay/actors/actor.js +1 -1
- package/dist/gameplay/actors/builtin/components/character/character-animation.d.ts +3 -0
- package/dist/gameplay/actors/builtin/components/character/character-animation.js +1 -1
- package/dist/gameplay/actors/builtin/components/character/character-movement-like.d.ts +2 -0
- package/dist/gameplay/actors/builtin/components/character/character-movement.d.ts +13 -0
- package/dist/gameplay/actors/builtin/components/character/character-movement.js +1 -1
- package/dist/gameplay/actors/builtin/components/character/net-character-movement-protocol.d.ts +4 -1
- package/dist/gameplay/actors/builtin/components/character/net-character-movement-protocol.js +1 -1
- package/dist/gameplay/actors/builtin/components/mesh-component.d.ts +1 -0
- package/dist/gameplay/actors/builtin/components/mesh-component.js +1 -1
- package/dist/gameplay/actors/builtin/components/tween-component.js +1 -1
- package/dist/gameplay/actors/builtin/navmesh-actor.d.ts +2 -0
- package/dist/gameplay/actors/builtin/navmesh-actor.js +1 -1
- package/dist/gameplay/actors/builtin/trigger-volume.d.ts +3 -3
- package/dist/gameplay/actors/builtin/trigger-volume.js +1 -1
- package/dist/gameplay/actors/camera/camera-component.d.ts +1 -3
- package/dist/gameplay/actors/camera/camera-component.js +1 -1
- package/dist/gameplay/actors/component.d.ts +3 -0
- package/dist/gameplay/actors/component.js +1 -1
- package/dist/gameplay/actors/type-registry.d.ts +10 -0
- package/dist/gameplay/actors/type-registry.js +4 -0
- package/dist/gameplay/animation/retarget.d.ts +50 -0
- package/dist/gameplay/animation/retarget.js +4 -0
- package/dist/gameplay/animation/root-motion.js +1 -1
- package/dist/gameplay/event-graph/actor-transform-properties.d.ts +6 -0
- package/dist/gameplay/event-graph/actor-transform-properties.js +4 -0
- package/dist/gameplay/event-graph/asset-actor-types.d.ts +3 -0
- package/dist/gameplay/event-graph/asset-actor-types.js +4 -0
- package/dist/gameplay/event-graph/asset-references.d.ts +12 -0
- package/dist/gameplay/event-graph/asset-references.js +4 -0
- package/dist/gameplay/event-graph/compiler.d.ts +107 -0
- package/dist/gameplay/event-graph/compiler.js +4 -0
- package/dist/gameplay/event-graph/decorators.d.ts +74 -0
- package/dist/gameplay/event-graph/decorators.js +4 -0
- package/dist/gameplay/event-graph/document-compiler.d.ts +107 -0
- package/dist/gameplay/event-graph/document-compiler.js +4 -0
- package/dist/gameplay/event-graph/event-graph-demo.d.ts +2 -0
- package/dist/gameplay/event-graph/event-graph-demo.js +4 -0
- package/dist/gameplay/event-graph/graph.d.ts +106 -0
- package/dist/gameplay/event-graph/graph.js +4 -0
- package/dist/gameplay/event-graph/index.d.ts +13 -0
- package/dist/gameplay/event-graph/index.js +4 -0
- package/dist/gameplay/event-graph/model.d.ts +71 -0
- package/dist/gameplay/event-graph/model.js +4 -0
- package/dist/gameplay/event-graph/nodes/execution-nodes.d.ts +115 -0
- package/dist/gameplay/event-graph/nodes/execution-nodes.js +4 -0
- package/dist/gameplay/event-graph/nodes/gameplay-nodes.d.ts +208 -0
- package/dist/gameplay/event-graph/nodes/gameplay-nodes.js +4 -0
- package/dist/gameplay/event-graph/nodes/index.d.ts +4 -0
- package/dist/gameplay/event-graph/nodes/index.js +4 -0
- package/dist/gameplay/event-graph/nodes/value-nodes.d.ts +53 -0
- package/dist/gameplay/event-graph/nodes/value-nodes.js +4 -0
- package/dist/gameplay/event-graph/registry.d.ts +33 -0
- package/dist/gameplay/event-graph/registry.js +4 -0
- package/dist/gameplay/event-graph/runtime-assets.d.ts +21 -0
- package/dist/gameplay/event-graph/runtime-assets.js +4 -0
- package/dist/gameplay/event-graph/runtime.d.ts +160 -0
- package/dist/gameplay/event-graph/runtime.js +4 -0
- package/dist/gameplay/event-graph/type-inference.d.ts +41 -0
- package/dist/gameplay/event-graph/type-inference.js +4 -0
- package/dist/gameplay/event-graph/types.d.ts +77 -0
- package/dist/gameplay/event-graph/types.js +4 -0
- package/dist/gameplay/index.d.ts +15 -2
- package/dist/gameplay/index.js +1 -1
- package/dist/gameplay/initiate.js +1 -1
- package/dist/gameplay/input/input.d.ts +22 -17
- package/dist/gameplay/input/input.js +1 -1
- package/dist/gameplay/net/service/net-decorator.d.ts +1 -1
- package/dist/gameplay/net/service/net-decorator.js +1 -1
- package/dist/gameplay/net/service/net-serializer.js +1 -1
- package/dist/gameplay/net/service/net-service.d.ts +6 -6
- package/dist/gameplay/net/service/net-service.js +1 -1
- package/dist/gameplay/net/service/rpc-decorator.js +1 -1
- package/dist/gameplay/services/asset-loader.d.ts +7 -0
- package/dist/gameplay/services/asset-loader.js +1 -1
- package/dist/gameplay/services/physics/physics-system.d.ts +14 -0
- package/dist/gameplay/services/physics/physics-system.js +1 -1
- package/dist/gameplay/services/world.d.ts +12 -0
- package/dist/gameplay/services/world.js +1 -1
- package/dist/rendering.js +1 -1
- package/dist/scene/asset-resource-loader.d.ts +7 -1
- package/dist/scene/asset-resource-loader.js +1 -1
- package/dist/scene/custom-param-deserialize.js +1 -1
- package/dist/scene/custom-param-runtime-types.js +1 -1
- package/dist/scene/materializer.d.ts +25 -0
- package/dist/scene/materializer.js +1 -1
- package/dist/scene/model.d.ts +114 -2
- package/dist/scene/model.js +1 -1
- package/dist/scene/objects/prefab.js +1 -1
- package/dist/shader/graph/compiler.d.ts +3 -0
- package/dist/shader/graph/compiler.js +1 -1
- package/dist/shader/graph/model.d.ts +1 -1
- package/dist/shader/graph/registry.js +1 -1
- package/dist/test/animation-retarget.test.d.ts +2 -0
- package/dist/test/animation-retarget.test.js +4 -0
- package/dist/test/event-graph-generated-code.test.d.ts +2 -0
- package/dist/test/event-graph-generated-code.test.js +4 -0
- package/dist/test/event-graph-types.test.d.ts +2 -0
- package/dist/test/event-graph-types.test.js +4 -0
- package/dist/test/event-graph.test.d.ts +2 -0
- package/dist/test/event-graph.test.js +4 -0
- package/dist/test/input.test.d.ts +2 -0
- package/dist/test/input.test.js +4 -0
- package/dist/test/net-character-movement.test.js +1 -1
- package/dist/test/prefab-instance-params.test.js +1 -1
- package/dist/test/sequence-camera-control.test.js +1 -1
- package/dist/test/sequence-scene-binding.test.d.ts +2 -0
- package/dist/test/sequence-scene-binding.test.js +4 -0
- package/dist/test/sequence-transform.test.d.ts +2 -0
- package/dist/test/sequence-transform.test.js +4 -0
- package/dist/test/shader-graph.test.js +1 -1
- package/package.json +10 -2
- package/tsconfig.tsbuildinfo +1 -1
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { Euler, Vector3 } from 'three';
|
|
2
|
+
import { PrefabInstance } from '../../scene/objects/prefab.js';
|
|
3
|
+
import { BaseActor } from '../actors/actor.js';
|
|
4
|
+
import type { AssetsProvider } from '../../scene/assets-provider.js';
|
|
5
|
+
import type { World } from '../services/world.js';
|
|
6
|
+
import type { EventGraphAssetRuntime, EventGraphTransientAssetHandle } from './runtime.js';
|
|
7
|
+
export declare class WorldEventGraphAssetRuntime implements EventGraphAssetRuntime {
|
|
8
|
+
private readonly world;
|
|
9
|
+
private readonly assets;
|
|
10
|
+
constructor(world: World, assets: AssetsProvider);
|
|
11
|
+
spawnPrefab(assetId: string, position: Vector3, rotation: Euler): Promise<{
|
|
12
|
+
instance: PrefabInstance;
|
|
13
|
+
mainActor: BaseActor | null;
|
|
14
|
+
}>;
|
|
15
|
+
playVfx(assetId: string, position: Vector3, rotation: Euler): Promise<EventGraphTransientAssetHandle>;
|
|
16
|
+
playSequence(assetId: string, self: BaseActor | null, target: BaseActor | null, cameraControlEnabled: boolean): Promise<EventGraphTransientAssetHandle>;
|
|
17
|
+
destroyPrefab(instance: unknown): void;
|
|
18
|
+
destroyActor(actor: unknown): void;
|
|
19
|
+
private requireAsset;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=runtime-assets.d.ts.map
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import{Prefab as e,PrefabInstance as t}from"../../scene/objects/prefab.js";import{BaseActor as r}from"../actors/actor.js";export class WorldEventGraphAssetRuntime{constructor(e,t){this.world=e,this.assets=t}async spawnPrefab(t,r,s){const a=await this.requireAsset(t,"prefab"),o=await this.world.spawnPrefab(new e(a),r,s);if(null==o)throw new Error(`Failed to spawn prefab asset ${JSON.stringify(t)}`);return{instance:o,mainActor:o.mainActor}}async playVfx(e,t,r){const s=await this.requireAsset(e,"vfx"),{VfxActor:a}=await import("../../effects/vfx/vfx-actor.js"),o=await this.world.spawnActor(a,t,r);try{return await o.fromAsset(s),o.play(),{actor:o,completed:o.onComplete}}catch(e){throw this.destroyActor(o),e}}async playSequence(e,t,r,s){const a=await this.requireAsset(e,"sequence"),[{SequenceActor:o},{SequenceRole:n}]=await Promise.all([import("../../effects/sequence/sequence-actor.js"),import("../../effects/sequence/sequence-data.js")]),i=await this.world.spawnActor(o);try{return await i.loadFromAsset(a),null!=t&&i.bindRole(n.Self,t),null!=r&&i.bindRole(n.Target,r),i.play({cameraControlEnabled:s}),{actor:i,completed:i.onComplete}}catch(e){throw this.destroyActor(i),e}}destroyPrefab(e){if(!(e instanceof t))throw new Error("Event graph prefab handle is invalid");this.world.removePrefab(e)}destroyActor(e){if(!(e instanceof r))throw new Error("Event graph actor handle is invalid");this.world.actors.includes(e)&&this.world.removeActor(e)}async requireAsset(e,t){const r=await this.assets.getAsset(e);if(null==r)throw new Error(`Event graph could not resolve asset ${JSON.stringify(e)}`);if(r.type!==t)throw new Error(`Event graph expected ${t} asset ${JSON.stringify(e)}, received ${r.type}`);return r}}/*
|
|
2
|
+
* Copyright (©) 2026 Hology Interactive AB. All rights reserved.
|
|
3
|
+
* See the LICENSE.md file for details.
|
|
4
|
+
*/
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
import { type Observable } from 'rxjs';
|
|
2
|
+
import { Euler, Vector2, Vector3 } from 'three';
|
|
3
|
+
import type { Type } from '../../utils/type.js';
|
|
4
|
+
import { BaseActor } from '../actors/actor.js';
|
|
5
|
+
import { ActorComponent } from '../actors/component.js';
|
|
6
|
+
import type { EventGraphDocument, EventGraphTransformAxis, EventGraphTransformSpace } from './model.js';
|
|
7
|
+
import { EventGraphCompiler, type EventGraphExecutionContext } from './document-compiler.js';
|
|
8
|
+
export interface EventGraphWorld {
|
|
9
|
+
spawnActor(type: new (...args: any[]) => BaseActor): Promise<BaseActor>;
|
|
10
|
+
findActorByType?(type: Type<BaseActor>): BaseActor | undefined;
|
|
11
|
+
findActorsByType?(type: Type<BaseActor>): BaseActor[];
|
|
12
|
+
}
|
|
13
|
+
export interface EventGraphTransientAssetHandle {
|
|
14
|
+
actor: unknown;
|
|
15
|
+
completed?: Observable<unknown>;
|
|
16
|
+
}
|
|
17
|
+
export interface EventGraphAssetRuntime {
|
|
18
|
+
spawnPrefab(assetId: string, position: Vector3, rotation: Euler): Promise<{
|
|
19
|
+
instance: unknown;
|
|
20
|
+
mainActor: unknown | null;
|
|
21
|
+
}>;
|
|
22
|
+
playVfx(assetId: string, position: Vector3, rotation: Euler): Promise<EventGraphTransientAssetHandle>;
|
|
23
|
+
playSequence(assetId: string, self: BaseActor | null, target: BaseActor | null, cameraControlEnabled: boolean): Promise<EventGraphTransientAssetHandle>;
|
|
24
|
+
destroyPrefab(instance: unknown): void;
|
|
25
|
+
destroyActor(actor: unknown): void;
|
|
26
|
+
}
|
|
27
|
+
export interface EventGraphInstanceOptions {
|
|
28
|
+
world: EventGraphWorld;
|
|
29
|
+
assets?: EventGraphAssetRuntime;
|
|
30
|
+
actorsById: ReadonlyMap<string, BaseActor>;
|
|
31
|
+
mainActor?: BaseActor | null;
|
|
32
|
+
updates?: Observable<number>;
|
|
33
|
+
timer?: {
|
|
34
|
+
setInterval(callback: () => void, intervalMs: number, owner?: BaseActor): number;
|
|
35
|
+
clearInterval(intervalId: number): void;
|
|
36
|
+
createTimer?(durationMs: number): Observable<void>;
|
|
37
|
+
};
|
|
38
|
+
physics?: {
|
|
39
|
+
updateActorTransform(actor: BaseActor): void;
|
|
40
|
+
};
|
|
41
|
+
onError?: (error: unknown, eventNodeId: string) => void;
|
|
42
|
+
}
|
|
43
|
+
/** Owns the compiled handlers, state, and subscriptions for one spawned prefab. */
|
|
44
|
+
export declare class EventGraphInstance implements EventGraphExecutionContext {
|
|
45
|
+
private readonly options;
|
|
46
|
+
private readonly compiled;
|
|
47
|
+
private readonly subscriptions;
|
|
48
|
+
private readonly variables;
|
|
49
|
+
private readonly variableTypes;
|
|
50
|
+
private readonly pendingDelays;
|
|
51
|
+
private readonly pendingTweens;
|
|
52
|
+
private readonly completedTweens;
|
|
53
|
+
private readonly tweensByTarget;
|
|
54
|
+
private readonly transientActors;
|
|
55
|
+
private readonly dynamicEventSourceSubscriptions;
|
|
56
|
+
private readonly intervals;
|
|
57
|
+
private readonly doOnceStates;
|
|
58
|
+
private readonly gateStates;
|
|
59
|
+
private readonly vector2Pool;
|
|
60
|
+
private readonly vector3Pool;
|
|
61
|
+
private readonly eulerPool;
|
|
62
|
+
private vector2PoolIndex;
|
|
63
|
+
private vector3PoolIndex;
|
|
64
|
+
private eulerPoolIndex;
|
|
65
|
+
private updateSubscription?;
|
|
66
|
+
private started;
|
|
67
|
+
private ended;
|
|
68
|
+
constructor(graph: EventGraphDocument, options: EventGraphInstanceOptions, compiler?: EventGraphCompiler);
|
|
69
|
+
beginPlay(): Promise<void>;
|
|
70
|
+
endPlay(): void;
|
|
71
|
+
actor(id: string): BaseActor;
|
|
72
|
+
component(target: unknown, property: string): ActorComponent;
|
|
73
|
+
getProperty(target: unknown, property: string): unknown;
|
|
74
|
+
setProperty(target: unknown, property: string, value: unknown): void;
|
|
75
|
+
tweenProperty(target: unknown, property: string, to: unknown, duration: number, curve: string, completed: (() => unknown) | undefined, eventNodeId: string): void;
|
|
76
|
+
tweenMoveTo(target: unknown, position: Vector3, duration: number, curve: string, space: EventGraphTransformSpace, completed: (() => unknown) | undefined, eventNodeId: string): void;
|
|
77
|
+
tweenMoveBy(target: unknown, offset: Vector3, duration: number, curve: string, space: EventGraphTransformSpace, completed: (() => unknown) | undefined, eventNodeId: string): void;
|
|
78
|
+
tweenRotateTo(target: unknown, rotation: Euler, duration: number, curve: string, space: EventGraphTransformSpace, completed: (() => unknown) | undefined, eventNodeId: string): void;
|
|
79
|
+
tweenRotateBy(target: unknown, angleDegrees: number, duration: number, curve: string, space: EventGraphTransformSpace, axis: EventGraphTransformAxis, completed: (() => unknown) | undefined, eventNodeId: string): void;
|
|
80
|
+
tweenScaleTo(target: unknown, scale: Vector3, duration: number, curve: string, completed: (() => unknown) | undefined, eventNodeId: string): void;
|
|
81
|
+
tweenScaleBy(target: unknown, factor: Vector3, duration: number, curve: string, completed: (() => unknown) | undefined, eventNodeId: string): void;
|
|
82
|
+
callMethod(target: unknown, method: string, args: unknown[]): unknown;
|
|
83
|
+
actorClass(classId: string): Type<BaseActor>;
|
|
84
|
+
findActorByType(actorClass: unknown): BaseActor | undefined;
|
|
85
|
+
findActorsByType(actorClass: unknown): BaseActor[];
|
|
86
|
+
bindEventSource(nodeId: string, target: unknown, method: string, args: unknown[], callback: ((value: unknown) => unknown) | undefined, eventNodeId: string): void;
|
|
87
|
+
spawnActor(classId: string): Promise<BaseActor>;
|
|
88
|
+
getVariable(name: string): unknown;
|
|
89
|
+
setVariable(name: string, value: unknown): void;
|
|
90
|
+
delay(durationMs: number): Promise<void>;
|
|
91
|
+
setInterval(nodeId: string, intervalMs: number, callback: (() => unknown) | undefined, eventNodeId: string): number | undefined;
|
|
92
|
+
clearInterval(intervalId: number): void;
|
|
93
|
+
doOnce(nodeId: string, entryPort: string, startClosed: boolean): boolean;
|
|
94
|
+
gate(nodeId: string, entryPort: string, startClosed: boolean): boolean;
|
|
95
|
+
spawnPrefab(assetId: string, position: Vector3, rotation: Euler): Promise<{
|
|
96
|
+
instance: unknown;
|
|
97
|
+
mainActor: unknown | null;
|
|
98
|
+
}>;
|
|
99
|
+
playVfx(assetId: string, position: Vector3, rotation: Euler, autoDestroy: boolean): Promise<unknown>;
|
|
100
|
+
playSequence(assetId: string, target: unknown | null, cameraControlEnabled: boolean, autoDestroy: boolean): Promise<unknown>;
|
|
101
|
+
destroyPrefab(instance: unknown): void;
|
|
102
|
+
destroyActor(actor: unknown): void;
|
|
103
|
+
onActorCompleted(actor: unknown, callback: () => unknown, eventNodeId: string): void;
|
|
104
|
+
readValue(value: unknown): unknown;
|
|
105
|
+
mathAdd(a: unknown, b: unknown): unknown;
|
|
106
|
+
mathSubtract(a: unknown, b: unknown): unknown;
|
|
107
|
+
mathMultiply(a: unknown, b: unknown): unknown;
|
|
108
|
+
mathDivide(a: unknown, b: unknown): unknown;
|
|
109
|
+
mathModulo(a: unknown, b: unknown): unknown;
|
|
110
|
+
vectorLength(value: unknown): number;
|
|
111
|
+
vectorLengthSquared(value: unknown): number;
|
|
112
|
+
vectorDistance(a: unknown, b: unknown): number;
|
|
113
|
+
vectorDistanceSquared(a: unknown, b: unknown): number;
|
|
114
|
+
vectorNormalize(value: unknown): unknown;
|
|
115
|
+
vectorDot(a: unknown, b: unknown): number;
|
|
116
|
+
vectorCross(a: unknown, b: unknown): Vector3;
|
|
117
|
+
vectorLerp(a: unknown, b: unknown, alpha: number): unknown;
|
|
118
|
+
vectorApplyRotation(value: unknown, rotation: Euler): Vector3;
|
|
119
|
+
createVector2(x: number, y: number): Vector2;
|
|
120
|
+
createVector3(x: number, y: number, z: number): Vector3;
|
|
121
|
+
createEuler(x: number, y: number, z: number): Euler;
|
|
122
|
+
private beginValueScope;
|
|
123
|
+
private invokeHandler;
|
|
124
|
+
private invokeCallback;
|
|
125
|
+
private createScopedEuler;
|
|
126
|
+
private mathBinary;
|
|
127
|
+
private mathVector2;
|
|
128
|
+
private mathVector3;
|
|
129
|
+
private setActorTransformProperty;
|
|
130
|
+
private createMoveTween;
|
|
131
|
+
private startTween;
|
|
132
|
+
private ensureUpdateSubscription;
|
|
133
|
+
private tickTweens;
|
|
134
|
+
private applyTween;
|
|
135
|
+
private applyTweenRotation;
|
|
136
|
+
private finishTween;
|
|
137
|
+
private cancelTween;
|
|
138
|
+
private cancelTweens;
|
|
139
|
+
private releaseUpdateSubscriptionIfIdle;
|
|
140
|
+
private requireAssets;
|
|
141
|
+
private requireAssetId;
|
|
142
|
+
private retainTransientHandle;
|
|
143
|
+
private releaseTransientActor;
|
|
144
|
+
private destroyTransientActors;
|
|
145
|
+
private subscribeObservable;
|
|
146
|
+
private subscribeEventSource;
|
|
147
|
+
private createEventSourceObservable;
|
|
148
|
+
private resolveEventSourceArgument;
|
|
149
|
+
private dispatch;
|
|
150
|
+
private assertExposedProperty;
|
|
151
|
+
private writableExposedPropertyInfo;
|
|
152
|
+
private assertObject;
|
|
153
|
+
private unsubscribeAll;
|
|
154
|
+
private replaceDynamicEventSourceSubscription;
|
|
155
|
+
private removeSubscription;
|
|
156
|
+
private cancelDelays;
|
|
157
|
+
private clearIntervals;
|
|
158
|
+
private reportError;
|
|
159
|
+
}
|
|
160
|
+
//# sourceMappingURL=runtime.d.ts.map
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import{isObservable as e,take as t}from"rxjs";import{Euler as r,MathUtils as n,Quaternion as o,Vector2 as s,Vector3 as i}from"three";import{Curve2 as a}from"../../utils/curve.js";import{BaseActor as c,getActorClassById as l}from"../actors/actor.js";import{ActorComponent as u}from"../actors/component.js";import{inferEventGraphLiteralType as h,isTweenableEventGraphType as p}from"./types.js";import{EventGraphCompiler as d}from"./document-compiler.js";import{isEventGraphEventSource as f,getEventGraphPropertyInfo as w,isEventGraphCallable as y,isEventGraphProperty as v}from"./decorators.js";import{getEventGraphActorTransformPropertyInfo as m,isEventGraphActorTransformProperty as b}from"./actor-transform-properties.js";export class EventGraphInstance{constructor(e,t,r=new d){this.options=t,this.subscriptions=[],this.variables=new Map,this.variableTypes=new Map,this.pendingDelays=new Set,this.pendingTweens=new Set,this.completedTweens=[],this.tweensByTarget=new WeakMap,this.transientActors=new Map,this.dynamicEventSourceSubscriptions=new Map,this.intervals=new Map,this.doOnceStates=new Map,this.gateStates=new Map,this.vector2Pool=[],this.vector3Pool=[],this.eulerPool=[],this.vector2PoolIndex=0,this.vector3PoolIndex=0,this.eulerPoolIndex=0,this.started=!1,this.ended=!1,this.compiled=r.compile(e,{resolveActorClass:e=>{const r="$self"===e?t.mainActor:t.actorsById.get(e);return r?.constructor}});for(const t of e.variables??[]){const e=t.type??h(t.defaultValue);this.variableTypes.set(t.name,e),this.variables.set(t.name,g(t.defaultValue,e))}}async beginPlay(){if(!this.started){if(this.ended)throw new Error("Cannot begin play for an event graph that has ended");this.started=!0;try{for(const e of this.compiled.observables)this.subscriptions.push(this.subscribeObservable(e));for(const e of this.compiled.eventSources)this.subscriptions.push(this.subscribeEventSource(e));for(const e of this.compiled.beginPlay)await this.invokeHandler(e);!this.ended&&this.compiled.update.length>0&&this.ensureUpdateSubscription()}catch(e){throw this.unsubscribeAll(),this.clearIntervals(),this.cancelDelays(),this.cancelTweens(),this.destroyTransientActors(),this.ended=!0,e}}}endPlay(){this.ended||(this.ended=!0,this.unsubscribeAll(),this.clearIntervals(),this.cancelDelays(),this.cancelTweens(),this.dispatch(this.compiled.endPlay),this.destroyTransientActors())}actor(e){const t="$self"===e?this.options.mainActor:this.options.actorsById.get(e);if(null==t)throw new Error(`Event graph could not resolve prefab actor ${JSON.stringify(e)}`);return t}component(e,t){if(this.assertObject(e,"component target"),!(e instanceof c))throw new Error("Event graph component target must be an actor");const r=e[t];if(!(r instanceof u))throw new Error(`Actor property ${JSON.stringify(t)} is not an actor component`);return r}getProperty(e,t){return e instanceof c&&b(t)?e.object[t]:(this.assertExposedProperty(e,t),e[t])}setProperty(e,t,r){if(e instanceof c&&b(t))return void this.setActorTransformProperty(e,t,r);const n=this.writableExposedPropertyInfo(e,t);e[t]=E(r,n.type,e[t])}tweenProperty(e,t,r,n,s,i,a){if(this.ended)return;const c=q(e),l=m(t)??w(c,t);if(null==l)throw new Error(`Property ${JSON.stringify(t)} is not marked with @EventGraphProperty`);if(!l.writable)throw new Error(`Property ${JSON.stringify(t)} is read-only`);if(!p(l.type))throw new Error(`Property ${JSON.stringify(t)} cannot be tweened`);const u=j(this.getProperty(c,t),l,"current"),h=j(r,l,"to"),d={kind:"property",target:c,property:t,type:l.type,from:u,to:h,value:(f=u,"number"==typeof f?f:f.clone()),...N(n,s,i,a)};var f;"euler"===l.type.kind&&(d.fromQuaternion=(new o).setFromEuler(u),d.toQuaternion=(new o).setFromEuler(h),d.quaternion=new o),this.startTween(d)}tweenMoveTo(e,t,r,n,o,s,i){this.ended||this.startTween(this.createMoveTween(e,$(t,"Move To position"),r,n,o,!1,s,i))}tweenMoveBy(e,t,r,n,o,s,i){this.ended||this.startTween(this.createMoveTween(e,$(t,"Move By offset"),r,n,o,!0,s,i))}tweenRotateTo(e,t,r,n,s,i,a){if(this.ended)return;const c=q(e);if(B(s),!T(t))throw new Error("Rotate To rotation must be a Three.js Euler");const l="world"===s?c.object.getWorldQuaternion(new o):c.object.quaternion.clone();this.startTween({kind:"rotateTo",target:c,property:"rotation",space:s,from:l,to:(new o).setFromEuler(t),value:new o,parentQuaternion:new o,localQuaternion:new o,...N(r,n,i,a)})}tweenRotateBy(e,t,r,s,i,a,c,l){if(this.ended)return;const u=q(e);if(B(i),!Number.isFinite(t))throw new Error("Rotate By angle must be a finite number");const h="world"===i?u.object.getWorldQuaternion(new o):u.object.quaternion.clone();this.startTween({kind:"rotateBy",target:u,property:"rotation",space:i,from:h,axis:M(a),angle:n.degToRad(t),delta:new o,value:new o,parentQuaternion:new o,localQuaternion:new o,...N(r,s,c,l)})}tweenScaleTo(e,t,r,n,o,s){if(this.ended)return;const a=q(e);this.startTween({kind:"scale",target:a,property:"scale",from:a.object.scale.clone(),to:$(t,"Scale To value").clone(),value:new i,...N(r,n,o,s)})}tweenScaleBy(e,t,r,n,o,s){if(this.ended)return;const a=q(e),c=a.object.scale.clone();this.startTween({kind:"scale",target:a,property:"scale",from:c,to:c.clone().multiply($(t,"Scale By factor")),value:new i,...N(r,n,o,s)})}callMethod(e,t,r){if(this.assertObject(e,"method target"),!y(e,t))throw new Error(`Method ${JSON.stringify(t)} is not marked with @EventGraphCallable`);const n=e[t];if("function"!=typeof n)throw new Error(`Event graph target has no method ${JSON.stringify(t)}`);return n.apply(e,r)}actorClass(e){const t=l(e);if(null==t)throw new Error(`Event graph could not resolve actor class ${JSON.stringify(e)}`);return t}findActorByType(e){const t=this.options.world.findActorByType;if(null==t)throw new Error("Event graph world does not support finding actors by type");return t.call(this.options.world,S(e))}findActorsByType(e){const t=this.options.world.findActorsByType;if(null==t)throw new Error("Event graph world does not support finding actors by type");return t.call(this.options.world,S(e))}bindEventSource(e,t,r,n,o,s){if(this.ended)return;this.replaceDynamicEventSourceSubscription(e,void 0);const i=this.createEventSourceObservable(t,r,n).subscribe(e=>{null==o||this.ended||this.invokeCallback(()=>o(e),s)});this.replaceDynamicEventSourceSubscription(e,i)}async spawnActor(e){const t=l(e);if(null==t)throw new Error(`Event graph could not resolve actor class ${JSON.stringify(e)}`);return this.options.world.spawnActor(t)}getVariable(e){if(!this.variables.has(e))throw new Error(`Event graph variable ${JSON.stringify(e)} is not declared`);return this.variables.get(e)}setVariable(e,t){if(!this.variables.has(e))throw new Error(`Event graph variable ${JSON.stringify(e)} is not declared`);this.variables.set(e,E(t,this.variableTypes.get(e),this.variables.get(e)))}delay(e){if(this.ended)return Promise.reject(new D);if(!Number.isFinite(e)||e<0)return Promise.reject(new Error("Event graph delay must be a finite non-negative number"));const t=this.options.timer;return null==t?.createTimer?Promise.reject(new Error("Event graph delay requires a game-time timer")):new Promise((r,n)=>{const o={subscription:void 0,reject:n};o.subscription=t.createTimer(e).subscribe({next:()=>{this.pendingDelays.delete(o),r()},error:e=>{this.pendingDelays.delete(o),n(e)}}),o.subscription.closed?this.pendingDelays.delete(o):this.pendingDelays.add(o)})}setInterval(e,t,r,n){if(this.ended)return;if(!Number.isFinite(t)||t<=0)throw new Error("Event graph interval must be a finite number greater than zero");const o=this.options.timer;if(null==o)throw new Error("Event graph interval requires a game-time timer");const s=this.intervals.get(e);if(null!=s&&o.clearInterval(s),this.intervals.delete(e),null==r){const r=o.setInterval(()=>{},t,this.options.mainActor??void 0);return this.intervals.set(e,r),r}const i=o.setInterval(()=>{this.ended||this.invokeCallback(r,n)},t,this.options.mainActor??void 0);return this.intervals.set(e,i),i}clearInterval(e){if(!Number.isSafeInteger(e))throw new Error("Event graph timer must be a valid timer id");this.options.timer?.clearInterval(e);for(const[t,r]of this.intervals)if(r===e){this.intervals.delete(t);break}}doOnce(e,t,r){if("reset"===t)return this.doOnceStates.set(e,!1),!1;if("exec"!==t)throw new Error(`Unsupported Do Once input ${JSON.stringify(t)}`);return!(this.doOnceStates.get(e)??r)&&(this.doOnceStates.set(e,!0),!0)}gate(e,t,r){let n=this.gateStates.get(e)??!r;if("open"===t)n=!0;else if("close"===t)n=!1;else if("toggle"===t)n=!n;else if("enter"!==t)throw new Error(`Unsupported Gate input ${JSON.stringify(t)}`);return this.gateStates.set(e,n),"enter"===t&&n}async spawnPrefab(e,t,r){const n=this.requireAssets(),o=$(t,"Spawn Prefab position").clone(),s=J(r,"Spawn Prefab rotation").clone(),i=await n.spawnPrefab(this.requireAssetId(e),o,s);if(this.ended)throw n.destroyPrefab(i.instance),new D;return i}async playVfx(e,t,r,n){const o=this.requireAssets(),s=$(t,"Play VFX position").clone(),i=J(r,"Play VFX rotation").clone(),a=await o.playVfx(this.requireAssetId(e),s,i);return this.retainTransientHandle(o,a,n)}async playSequence(e,t,r,n){if(null!=t&&!(t instanceof c))throw new Error("Event graph sequence target must be an actor");const o=this.requireAssets(),s=await o.playSequence(this.requireAssetId(e),this.options.mainActor??null,t,r);return this.retainTransientHandle(o,s,n)}destroyPrefab(e){this.requireAssets().destroyPrefab(e)}destroyActor(e){const t=this.requireAssets();this.releaseTransientActor(t,e)}onActorCompleted(e,r,n){const o=this.transientActors.get(e)?.completed;if(null==o)throw new Error("Event graph actor does not expose a completion signal");const s=o.pipe(t(1)).subscribe(()=>{this.invokeCallback(r,n)});this.subscriptions.push(s)}readValue(e){return A(e)?this.createVector2(e.x,e.y):P(e)?this.createVector3(e.x,e.y,e.z):T(e)?this.createScopedEuler(e.x,e.y,e.z,e.order):e}mathAdd(e,t){return this.mathBinary(e,t,"add")}mathSubtract(e,t){return this.mathBinary(e,t,"subtract")}mathMultiply(e,t){return this.mathBinary(e,t,"multiply")}mathDivide(e,t){return this.mathBinary(e,t,"divide")}mathModulo(e,t){return this.mathBinary(e,t,"modulo")}vectorLength(e){if(A(e)||P(e))return e.length();throw new Error("Event graph Vector Length requires a Vector2 or Vector3")}vectorLengthSquared(e){if(A(e)||P(e))return e.lengthSq();throw new Error("Event graph Vector Length Squared requires a Vector2 or Vector3")}vectorDistance(e,t){if(A(e)&&A(t)||P(e)&&P(t))return e.distanceTo(t);throw new Error("Event graph Vector Distance requires matching Vector2 or Vector3 values")}vectorDistanceSquared(e,t){if(A(e)&&A(t)||P(e)&&P(t))return e.distanceToSquared(t);throw new Error("Event graph Vector Distance Squared requires matching Vector2 or Vector3 values")}vectorNormalize(e){if(A(e))return this.createVector2(e.x,e.y).normalize();if(P(e))return this.createVector3(e.x,e.y,e.z).normalize();throw new Error("Event graph Vector Normalize requires a Vector2 or Vector3")}vectorDot(e,t){if(A(e)&&A(t)||P(e)&&P(t))return e.dot(t);throw new Error("Event graph Dot Product requires matching Vector2 or Vector3 values")}vectorCross(e,t){if(!P(e)||!P(t))throw new Error("Event graph Cross Product requires Vector3 values");return this.createVector3(e.x,e.y,e.z).cross(t)}vectorLerp(e,t,r){if(!Number.isFinite(r))throw new Error("Event graph Vector Lerp alpha must be a finite number");if(A(e)&&A(t))return this.createVector2(e.x,e.y).lerp(t,r);if(P(e)&&P(t))return this.createVector3(e.x,e.y,e.z).lerp(t,r);throw new Error("Event graph Vector Lerp requires matching Vector2 or Vector3 values")}vectorApplyRotation(e,t){if(!P(e))throw new Error("Event graph Apply Rotation value must be a Vector3");return this.createVector3(e.x,e.y,e.z).applyEuler(J(t,"Apply Rotation rotation"))}createVector2(e,t){let r=this.vector2Pool[this.vector2PoolIndex];return null==r&&(r=new s,this.vector2Pool[this.vector2PoolIndex]=r),this.vector2PoolIndex++,r.set(e,t)}createVector3(e,t,r){let n=this.vector3Pool[this.vector3PoolIndex];return null==n&&(n=new i,this.vector3Pool[this.vector3PoolIndex]=n),this.vector3PoolIndex++,n.set(e,t,r)}createEuler(e,t,r){return this.createScopedEuler(e,t,r,"XYZ")}beginValueScope(){this.vector2PoolIndex=0,this.vector3PoolIndex=0,this.eulerPoolIndex=0}invokeHandler(e,t){return this.beginValueScope(),e.invoke(this,t)}invokeCallback(e,t){try{this.beginValueScope();const r=e();Q(r)&&r.catch(e=>this.reportError(e,t))}catch(e){this.reportError(e,t)}}createScopedEuler(e,t,n,o){let s=this.eulerPool[this.eulerPoolIndex];return null==s&&(s=new r,this.eulerPool[this.eulerPoolIndex]=s),this.eulerPoolIndex++,s.set(e,t,n,o)}mathBinary(e,t,r){if("number"==typeof e&&"number"==typeof t)return O(e,t,r);if(A(e)||A(t))return this.mathVector2(e,t,r);if(P(e)||P(t))return this.mathVector3(e,t,r);throw new Error(`Event graph ${r} requires numbers, Vector2, or Vector3 values`)}mathVector2(e,t,r){if(!V(e)||!V(t))throw new Error(`Event graph ${r} requires numbers or Vector2 values`);return this.createVector2(O(x(e,"x"),x(t,"x"),r),O(x(e,"y"),x(t,"y"),r))}mathVector3(e,t,r){if(!k(e)||!k(t))throw new Error(`Event graph ${r} requires numbers or Vector3 values`);return this.createVector3(O(I(e,"x"),I(t,"x"),r),O(I(e,"y"),I(t,"y"),r),O(I(e,"z"),I(t,"z"),r))}setActorTransformProperty(e,t,r){if("rotation"===t){if(!T(r))throw new Error("Event graph actor rotation must be a Three.js Euler");return e.object.rotation.copy(r),void this.options.physics?.updateActorTransform(e)}if(!P(r))throw new Error(`Event graph actor ${t} must be a Three.js Vector3`);e.object[t].copy(r),"position"===t&&this.options.physics?.updateActorTransform(e)}createMoveTween(e,t,r,n,o,s,a,c){const l=q(e);B(o);const u="world"===o?l.object.getWorldPosition(new i):l.object.position.clone();return{kind:"move",target:l,property:"position",space:o,from:u,to:s?u.clone().add(t):t.clone(),value:new i,localValue:new i,...N(r,n,a,c)}}startTween(e){this.cancelTween(e.target,e.property);let t=this.tweensByTarget.get(e.target);if(null==t&&(t=new Map,this.tweensByTarget.set(e.target,t)),t.set(e.property,e),this.pendingTweens.add(e),0===e.duration)return this.applyTween(e,1),void queueMicrotask(()=>{!this.ended&&this.pendingTweens.has(e)&&this.finishTween(e)});this.ensureUpdateSubscription(),this.applyTween(e,0)}ensureUpdateSubscription(){if(null==this.updateSubscription){if(null==this.options.updates)throw new Error("Event graph frame updates are required for Update events and property tweens");this.updateSubscription=this.options.updates.subscribe(e=>{this.tickTweens(e),this.dispatch(this.compiled.update,e)}),this.subscriptions.push(this.updateSubscription)}}tickTweens(e){if(Number.isFinite(e)&&!(e<0)){this.completedTweens.length=0;for(const t of this.pendingTweens){t.elapsed=Math.min(t.elapsed+e,t.duration);const r=t.elapsed/t.duration;this.applyTween(t,r>=1?1:t.curve.getY(r)),r>=1&&this.completedTweens.push(t)}for(const e of this.completedTweens)this.finishTween(e);this.completedTweens.length=0}}applyTween(e,t){if("property"===e.kind){let r;if("number"===e.type.kind)r=e.from+(e.to-e.from)*t;else if("vector2"===e.type.kind)r=e.value.lerpVectors(e.from,e.to,t);else if("vector3"===e.type.kind)r=e.value.lerpVectors(e.from,e.to,t);else{const n=e.quaternion.slerpQuaternions(e.fromQuaternion,e.toQuaternion,t);r=e.value.setFromQuaternion(n,e.from.order)}return void this.setProperty(e.target,e.property,r)}if("move"===e.kind){e.value.lerpVectors(e.from,e.to,t);const r="world"===e.space&&null!=e.target.object.parent?e.target.object.parent.worldToLocal(e.localValue.copy(e.value)):e.value;return e.target.object.position.copy(r),void this.options.physics?.updateActorTransform(e.target)}"scale"!==e.kind?("rotateTo"===e.kind?e.value.slerpQuaternions(e.from,e.to,t):"local"===e.space?(e.delta.setFromAxisAngle(e.axis,e.angle*t),e.value.multiplyQuaternions(e.from,e.delta)):(e.delta.setFromAxisAngle(e.axis,e.angle*t),e.value.multiplyQuaternions(e.delta,e.from)),this.applyTweenRotation(e,e.value)):e.target.object.scale.copy(e.value.lerpVectors(e.from,e.to,t))}applyTweenRotation(e,t){const r="world"===e.space&&null!=e.target.object.parent?e.localQuaternion.multiplyQuaternions(e.target.object.parent.getWorldQuaternion(e.parentQuaternion).invert(),t):t;e.target.object.quaternion.copy(r),this.options.physics?.updateActorTransform(e.target)}finishTween(e){this.pendingTweens.delete(e)&&(this.tweensByTarget.get(e.target)?.delete(e.property),null==e.completed||this.ended||this.invokeCallback(e.completed,e.eventNodeId),this.releaseUpdateSubscriptionIfIdle())}cancelTween(e,t){const r=this.tweensByTarget.get(e)?.get(t);null!=r&&(this.pendingTweens.delete(r),this.tweensByTarget.get(e)?.delete(t))}cancelTweens(){for(const e of this.pendingTweens)this.tweensByTarget.get(e.target)?.delete(e.property);this.pendingTweens.clear(),this.completedTweens.length=0}releaseUpdateSubscriptionIfIdle(){const e=this.updateSubscription;if(null==e||this.compiled.update.length>0||this.pendingTweens.size>0)return;e.unsubscribe();const t=this.subscriptions.indexOf(e);t>=0&&this.subscriptions.splice(t,1),this.updateSubscription=void 0}requireAssets(){if(null==this.options.assets)throw new Error("Event graph asset runtime is not configured");return this.options.assets}requireAssetId(e){if("string"!=typeof e||0===e.length)throw new Error("Event graph asset reference is missing");return e}retainTransientHandle(e,t,r){if(this.ended)throw e.destroyActor(t.actor),new D;const n=r?t.completed?.subscribe(()=>queueMicrotask(()=>{this.transientActors.has(t.actor)&&this.releaseTransientActor(e,t.actor)})):void 0;return this.transientActors.set(t.actor,{completed:t.completed,autoDestroySubscription:n}),t.actor}releaseTransientActor(e,t){const r=this.transientActors.get(t);r?.autoDestroySubscription?.unsubscribe(),this.transientActors.delete(t),e.destroyActor(t)}destroyTransientActors(){const e=this.options.assets;if(null!=e)for(const t of[...this.transientActors.keys()])this.releaseTransientActor(e,t)}subscribeObservable(t){let r=this.actor(t.actorId);null!=t.component&&(r=this.component(r,t.component));const n=this.getProperty(r,t.property);if(!e(n))throw new Error(`Event graph property ${JSON.stringify(t.property)} on actor ${JSON.stringify(t.actorId)} is not an RxJS Observable`);return n.subscribe(e=>this.dispatch([t],e))}subscribeEventSource(e){let t=this.actor(e.actorId);null!=e.component&&(t=this.component(t,e.component));const r=e.args.map(e=>this.resolveEventSourceArgument(e));return this.createEventSourceObservable(t,e.method,r).subscribe(t=>this.dispatch([e],t))}createEventSourceObservable(t,r,n){if(this.assertObject(t,"event source target"),!f(t,r))throw new Error(`Method ${JSON.stringify(r)} is not marked with @EventGraphEventSource`);const o=t[r];if("function"!=typeof o)throw new Error(`Event graph target has no event source ${JSON.stringify(r)}`);const s=o.apply(t,n);if(!e(s))throw new Error(`Event source ${JSON.stringify(r)} did not return an RxJS Observable`);return s}resolveEventSourceArgument(e){return"actor"===e.kind?this.actor(e.actorId):this.actorClass(e.classId)}dispatch(e,t){if(!this.ended||e===this.compiled.endPlay)for(const r of e)try{const e=this.invokeHandler(r,t);Q(e)&&e.catch(e=>this.reportError(e,r.eventNodeId))}catch(e){this.reportError(e,r.eventNodeId)}}assertExposedProperty(e,t){if(this.assertObject(e,"property target"),!v(e,t))throw new Error(`Property ${JSON.stringify(t)} is not marked with @EventGraphProperty`)}writableExposedPropertyInfo(e,t){this.assertObject(e,"property target");const r=w(e,t);if(null==r)throw new Error(`Property ${JSON.stringify(t)} is not marked with @EventGraphProperty`);if(!r.writable)throw new Error(`Property ${JSON.stringify(t)} is read-only`);return r}assertObject(e,t){if("object"!=typeof e&&"function"!=typeof e||null==e)throw new Error(`Event graph ${t} is not an object`)}unsubscribeAll(){for(const e of this.subscriptions)e.unsubscribe();this.subscriptions.length=0,this.dynamicEventSourceSubscriptions.clear(),this.updateSubscription=void 0}replaceDynamicEventSourceSubscription(e,t){const r=this.dynamicEventSourceSubscriptions.get(e);null!=r&&this.removeSubscription(r),this.dynamicEventSourceSubscriptions.delete(e),null!=t&&(this.dynamicEventSourceSubscriptions.set(e,t),this.subscriptions.push(t))}removeSubscription(e){e.unsubscribe();const t=this.subscriptions.indexOf(e);t>=0&&this.subscriptions.splice(t,1),this.updateSubscription===e&&(this.updateSubscription=void 0)}cancelDelays(){for(const e of this.pendingDelays)e.subscription?.unsubscribe(),e.reject(new D);this.pendingDelays.clear()}clearIntervals(){const e=this.options.timer;if(null!=e)for(const t of this.intervals.values())e.clearInterval(t);this.intervals.clear()}reportError(e,t){e instanceof D||(null==this.options.onError?console.error(`Event graph handler ${JSON.stringify(t)} failed`,e):this.options.onError(e,t))}}function g(e,t){if(null==e)return e;if("vector2"===t.kind){const t=e;return new s(t[0],t[1])}if("vector3"===t.kind){const t=e;return new i(t[0],t[1],t[2])}if("euler"===t.kind){const t=e;return new r(t[0],t[1],t[2])}if("asset"===t.kind)return e.assetId;if("actorClass"===t.kind){const t=l(String(e));if(null==t)throw new Error(`Event graph could not resolve actor class ${JSON.stringify(e)}`);return t}return"optional"===t.kind?g(e,t.value):"array"===t.kind&&Array.isArray(e)?e.map(e=>g(e,t.element)):structuredClone(e)}function E(e,t,r){if("optional"===t?.kind)return null==e?e:E(e,t.value,r);if("array"===t?.kind&&Array.isArray(e)){const n=Array.isArray(r)?r:void 0;return e.map((e,r)=>E(e,t.element,n?.[r]))}return!A(e)||null!=t&&"any"!==t.kind&&"vector2"!==t.kind?!P(e)||null!=t&&"any"!==t.kind&&"vector3"!==t.kind?!T(e)||null!=t&&"any"!==t.kind&&"euler"!==t.kind?e:T(r)?r.copy(e):e.clone():P(r)?r.copy(e):e.clone():A(r)?r.copy(e):e.clone()}function S(e){if("function"!=typeof e||e!==c&&!0!==e.__isActor&&!(e.prototype instanceof c))throw new Error("Event graph actor class input must be an actor type");return e}function T(e){return"object"==typeof e&&null!=e&&!0===e.isEuler}function A(e){return"object"==typeof e&&null!=e&&!0===e.isVector2}function P(e){return"object"==typeof e&&null!=e&&!0===e.isVector3}function V(e){return"number"==typeof e||A(e)}function k(e){return"number"==typeof e||P(e)}function x(e,t){return"number"==typeof e?e:e[t]}function I(e,t){return"number"==typeof e?e:e[t]}function O(e,t,r){switch(r){case"add":return e+t;case"subtract":return e-t;case"multiply":return e*t;case"divide":return e/t;case"modulo":return e%t}}function j(e,t,r){if("number"===t.type.kind){if("number"!=typeof e||!Number.isFinite(e))throw new Error(`Event graph tween ${r} value for ${JSON.stringify(t.propertyName)} must be a finite number`);return e}if("vector2"===t.type.kind&&A(e))return e.clone();if("vector3"===t.type.kind&&P(e))return e.clone();if("euler"===t.type.kind&&T(e))return e.clone();throw new Error(`Event graph tween ${r} value for ${JSON.stringify(t.propertyName)} must be ${t.type.kind}`)}function N(e,t,r,n){if(!Number.isFinite(e)||e<0)throw new Error("Event graph tween duration must be a finite non-negative number");return{duration:e,elapsed:0,curve:a.decode(t),completed:r,eventNodeId:n}}function q(e){if(!(e instanceof c))throw new Error("Event graph tween target must be an actor");return e}function $(e,t){if(!P(e))throw new Error(`${t} must be a Three.js Vector3`);return e}function J(e,t){if(!T(e))throw new Error(`${t} must be a Three.js Euler`);return e}function B(e){if("local"!==e&&"world"!==e)throw new Error(`Event graph transform space must be "local" or "world", received ${JSON.stringify(e)}`)}function M(e){if("x"===e)return new i(1,0,0);if("y"===e)return new i(0,1,0);if("z"===e)return new i(0,0,1);throw new Error(`Event graph rotation axis must be "x", "y", or "z", received ${JSON.stringify(e)}`)}class D extends Error{constructor(){super("Event graph execution was cancelled")}}function Q(e){return null!=e&&"function"==typeof e.then&&"function"==typeof e.catch}/*
|
|
2
|
+
* Copyright (©) 2026 Hology Interactive AB. All rights reserved.
|
|
3
|
+
* See the LICENSE.md file for details.
|
|
4
|
+
*/
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { Type } from '../../utils/type.js';
|
|
2
|
+
import type { BaseActor } from '../actors/actor.js';
|
|
3
|
+
import { type EventGraphCallableInfo, type EventGraphEventSourceInfo, type EventGraphPropertyInfo } from './decorators.js';
|
|
4
|
+
import type { EventGraphDocument } from './model.js';
|
|
5
|
+
import { type EventGraphType } from './types.js';
|
|
6
|
+
export interface EventGraphTypeContext {
|
|
7
|
+
/** Resolves a prefab-local actor id, including `$self`, to its concrete class. */
|
|
8
|
+
resolveActorClass?(actorId: string): Type<BaseActor> | undefined;
|
|
9
|
+
/** When present, an undefined result means the referenced asset is missing. */
|
|
10
|
+
resolveAssetType?(assetId: string): string | undefined;
|
|
11
|
+
}
|
|
12
|
+
/** Creates the class resolver shared by prefab editors and build-time compilation. */
|
|
13
|
+
export declare function createEventGraphTypeContext(actorClassesById: ReadonlyMap<string, Type<BaseActor>>, mainActorId?: string): EventGraphTypeContext;
|
|
14
|
+
export interface EventGraphTypeDiagnostic {
|
|
15
|
+
severity: 'error' | 'warning';
|
|
16
|
+
nodeId: string;
|
|
17
|
+
port?: string;
|
|
18
|
+
message: string;
|
|
19
|
+
}
|
|
20
|
+
export interface EventGraphNodeTypeInfo {
|
|
21
|
+
inputs: Readonly<Record<string, EventGraphType>>;
|
|
22
|
+
outputs: Readonly<Record<string, EventGraphType>>;
|
|
23
|
+
}
|
|
24
|
+
export interface EventGraphTypeAnalysis {
|
|
25
|
+
nodes: ReadonlyMap<string, EventGraphNodeTypeInfo>;
|
|
26
|
+
diagnostics: readonly EventGraphTypeDiagnostic[];
|
|
27
|
+
getInputType(nodeId: string, port: string): EventGraphType;
|
|
28
|
+
getOutputType(nodeId: string, port: string): EventGraphType;
|
|
29
|
+
}
|
|
30
|
+
export interface EventGraphTypeMembers {
|
|
31
|
+
properties: readonly EventGraphPropertyInfo[];
|
|
32
|
+
callables: readonly EventGraphCallableInfo[];
|
|
33
|
+
eventSources: readonly EventGraphEventSourceInfo[];
|
|
34
|
+
}
|
|
35
|
+
/** Returns the exposed members an editor can offer after resolving a data-pin type. */
|
|
36
|
+
export declare function getEventGraphMembersForType(type: EventGraphType): EventGraphTypeMembers;
|
|
37
|
+
/** Infers data-port types and reports issues without requiring a compilable document. */
|
|
38
|
+
export declare function analyzeEventGraphTypes(graph: EventGraphDocument, context?: EventGraphTypeContext): EventGraphTypeAnalysis;
|
|
39
|
+
/** Performs type analysis and throws a combined error for compiler-facing use. */
|
|
40
|
+
export declare function assertEventGraphTypes(graph: EventGraphDocument, context?: EventGraphTypeContext): EventGraphTypeAnalysis;
|
|
41
|
+
//# sourceMappingURL=type-inference.d.ts.map
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import{getActorClassById as e,getComponentClassById as t}from"../actors/type-registry.js";import{getEventGraphCallableInfo as r,getEventGraphCallableInfos as n,getEventGraphEventSourceInfo as s,getEventGraphEventSourceInfos as o,getEventGraphPropertyInfo as a,getEventGraphPropertyInfos as i}from"./decorators.js";import{EVENT_GRAPH_ACTOR_TRANSFORM_PROPERTIES as u,getEventGraphActorTransformPropertyInfo as l,isEventGraphActorTransformProperty as c}from"./actor-transform-properties.js";import{isEventGraphAssetReference as p}from"./asset-references.js";import{SEQUENCE_ACTOR_TYPE_ID as d,VFX_ACTOR_TYPE_ID as v}from"./asset-actor-types.js";import{getEventGraphInputDefault as h,getEventGraphNodePorts as y}from"./registry.js";import{EVENT_GRAPH_ACTOR_TYPE as f,EVENT_GRAPH_ANY_TYPE as m,EVENT_GRAPH_BOOLEAN_TYPE as g,EVENT_GRAPH_COMPONENT_TYPE as b,EVENT_GRAPH_NUMBER_TYPE as k,EVENT_GRAPH_OBJECT_TYPE as T,EVENT_GRAPH_ROTATION_TYPE as $,EVENT_GRAPH_STRING_TYPE as I,EVENT_GRAPH_VECTOR2_TYPE as S,EVENT_GRAPH_VECTOR3_TYPE as V,eventGraphActorType as C,eventGraphAssetType as N,eventGraphOptionalType as w,eventGraphTypeName as x,inferEventGraphLiteralType as A,isTweenableEventGraphType as O,isEventGraphLiteralAssignableToType as q,isEventGraphTypeAssignable as E}from"./types.js";export function createEventGraphTypeContext(e,t){return{resolveActorClass(r){const n="$self"===r?t:r;return null!=n?e.get(n):void 0}}}export function getEventGraphMembersForType(e){const t=P(e),r=null!=t?i(t):[];return{properties:"actor"===e.kind?[...u,...r.filter(e=>!c(e.propertyName))]:r,callables:null!=t?n(t):[],eventSources:null!=t?o(t):[]}}export function analyzeEventGraphTypes(e,t={}){return new M(e,t).analyze()}export function assertEventGraphTypes(e,t={}){const r=analyzeEventGraphTypes(e,t),n=r.diagnostics.filter(e=>"error"===e.severity);if(n.length>0)throw new Error(`Event graph type errors:\n${n.map(U).join("\n")}`);return r}class M{constructor(e,t){this.graph=e,this.context=t,this.graphNodes=new Map,this.variables=new Map,this.incoming=new Map,this.nodeTypes=new Map,this.resolving=new Set,this.diagnostics=[],this.diagnosticKeys=new Set;for(const t of e.nodes)this.graphNodes.set(t.id,t);for(const t of e.variables??[])this.variables.set(t.name,t.type??A(t.defaultValue));for(const t of e.edges)this.isDataPort(t.from.nodeId,t.from.port,"outputs")&&this.incoming.set(K(t.to),t.from)}analyze(){for(const e of this.graph.nodes)this.inferNode(e);for(const e of this.graph.nodes)this.validateInputs(e);const e=this.nodeTypes;return{nodes:e,diagnostics:this.diagnostics,getInputType:(t,r)=>e.get(t)?.inputs[r]??m,getOutputType:(t,r)=>e.get(t)?.outputs[r]??m}}inferNode(e){const t=this.nodeTypes.get(e.id);if(null!=t)return t;if(this.resolving.has(e.id))return{inputs:{},outputs:{}};this.resolving.add(e.id);const r={inputs:Object.fromEntries(y(e,"inputs").filter(e=>"data"===e.kind).map(e=>[e.name,e.type??m])),outputs:Object.fromEntries(y(e,"outputs").filter(e=>"data"===e.kind).map(e=>[e.name,e.type??m]))};this.nodeTypes.set(e.id,r);try{return this.inferSpecializedNode(e,r),r}finally{this.resolving.delete(e.id)}}inferSpecializedNode(r,n){switch(r.kind){case"constant.boolean":return void(n.outputs.value=g);case"constant.number":return void(n.outputs.value=k);case"constant.string":return void(n.outputs.value=I);case"constant.vector2":return void(n.outputs.value=S);case"constant.vector3":return void(n.outputs.value=V);case"event.update":return void(n.outputs.deltaTime=k);case"event.observable":{const e=this.observableTargetType(r),t=this.propertyInfo(e,R(r,"property"));return void("observable"===t?.type.kind?n.outputs.value=t.type.value:"any"===t?.type.kind?n.outputs.value=m:null!=t?this.error(r,"value",`${t.label} is not an Observable`):null!=P(e)&&this.error(r,"value",`Property ${JSON.stringify(R(r,"property"))} is not exposed to event graphs`))}case"event.source":{const e=this.observableTargetType(r),t=this.eventSourceInfo(e,R(r,"source"));return void(null!=t?(n.outputs.value=this.eventSourcePayloadType(r,t),this.validateStaticEventSourceArguments(r,t)):null!=P(e)&&this.error(r,"value",`Event source ${JSON.stringify(R(r,"source"))} is not exposed to event graphs`))}case"flow.switch":{const e=this.inputValueType(r,"value");return void("vector2"!==e.kind&&"vector3"!==e.kind||this.error(r,"value",`Switch does not support ${x(e)} values`))}case"flow.isValid":{const e=this.inputValueType(r,"value");return n.inputs.value=e,void(n.outputs.value="optional"===e.kind?e.value:"null"===e.kind?m:e)}case"variable.get":return void(n.outputs.value=this.variableType(r));case"variable.set":return void(n.inputs.value=this.variableType(r));case"actor.reference":{const e=R(r,"actorId"),t=null!=e?this.context.resolveActorClass?.(e):void 0;return void(n.outputs.value=null!=t?C(t):f)}case"actor.spawnClass":{const t=e(R(r,"classId")??"");return void(n.outputs.value=null!=t?C(t):f)}case"flow.forEach":{const e=this.inputValueType(r,"array"),t="array"===e.kind?e:{kind:"array",element:m};return n.inputs.array=t,n.outputs.arrayElement=t.element,void(n.outputs.arrayIndex=k)}case"actor.findByType":case"actor.findAllByType":{const e=this.actorClassInputType(r,"actorClass");n.inputs.actorClass=e;const t=null!=e.classId?{kind:"actor",classId:e.classId}:f;return void(n.outputs.value="actor.findByType"===r.kind?w(t):{kind:"array",element:t})}case"asset.reference":{const e=r.params?.reference;return void(p(e)?n.outputs.value=N(e.assetType):this.error(r,void 0,"Asset Reference requires a valid asset"))}case"vfx.play":return void(n.outputs.value={kind:"actor",classId:v});case"sequence.play":return void(n.outputs.value={kind:"actor",classId:d});case"actor.component":{n.inputs.target=f;const e=t(R(r,"componentTypeId")??"");if(null!=e)return void(n.outputs.value={kind:"component",classId:e.__componentId??e.name});const s=this.propertyInfo(this.inputValueType(r,"target"),R(r,"property"));return void("component"===s?.type.kind?n.outputs.value=s.type:null!=s&&this.error(r,"target",`${s.label} is not an actor component`))}case"actor.getProperty":{const e=this.inputValueType(r,"target"),t=this.propertyInfo(e,R(r,"property"));return void(null!=t?n.outputs.value=t.type:null!=P(e)&&this.error(r,"target",`Property ${JSON.stringify(R(r,"property"))} is not exposed to event graphs`))}case"actor.setProperty":{const e=this.inputValueType(r,"target"),t=this.propertyInfo(e,R(r,"property"));return void(null!=t?(n.inputs.value=t.type,t.writable||this.error(r,"value",`${t.label} is read-only`)):null!=P(e)&&this.error(r,"target",`Property ${JSON.stringify(R(r,"property"))} is not exposed to event graphs`))}case"actor.tweenProperty":{const e=this.inputValueType(r,"target"),t=R(r,"property"),s=this.propertyInfo(e,t);return void(null!=s?(n.inputs.to=s.type,s.writable||this.error(r,"to",`${s.label} is read-only`),O(s.type)||this.error(r,"to",`${s.label} cannot be tweened`)):null==t?this.error(r,"target","Tween Property requires a property"):null!=P(e)&&this.error(r,"target",`Property ${JSON.stringify(t)} is not exposed to event graphs`))}case"actor.callMethod":case"actor.tryCallMethod":{const e=this.inputValueType(r,"target"),t=this.callableInfo(e,R(r,"method")),s=G(r,"argumentCount")??0;for(let e=0;e<s;e++)n.inputs[`arg${e}`]=t?.parameters[e]?.type??m;if(null!=t){if(n.outputs.value=t.returnType,t.parametersKnown){const e=t.parameters.filter(e=>!0!==e.optional).length;(s<e||s>t.parameters.length)&&this.error(r,void 0,`${t.label} expects ${e===t.parameters.length?e:`${e}-${t.parameters.length}`} arguments, received ${s}`)}t.awaitResult&&!0!==r.params?.awaitResult&&this.error(r,void 0,`${t.label} is asynchronous and must be awaited`)}else null!=P(e)&&this.error(r,"target",`Method ${JSON.stringify(R(r,"method"))} is not exposed to event graphs`);return}case"event.bindSource":{n.inputs.target=null!=R(r,"component")||null!=R(r,"componentTypeId")?f:T;const e=this.eventBindSourceTargetType(r),t=this.eventSourceInfo(e,R(r,"source")),s=G(r,"argumentCount")??0;if(null!=t){n.outputs.value=this.eventSourcePayloadType(r,t);let e=0;for(const r of t.parameters)"actorClass"!==r.type.kind&&(n.inputs["arg"+e++]=r.type);t.parametersKnown&&s!==e&&this.error(r,void 0,`${t.label} expects ${e} connected arguments, received ${s}`),this.validateEventSourceActorClassArguments(r,t)}else null!=P(e)&&this.error(r,"target",`Event source ${JSON.stringify(R(r,"source"))} is not exposed to event graphs`);return}case"math.add":case"math.subtract":case"math.multiply":case"math.divide":case"math.modulo":return void this.inferMathNode(r,n);case"vector.length":case"vector.lengthSquared":return void this.inferVectorUnaryNode(r,n,k);case"vector.normalize":return void this.inferVectorUnaryNode(r,n,m);case"vector.distance":case"vector.distanceSquared":case"vector.dot":return void this.inferVectorBinaryNode(r,n,k);case"vector.lerp":return this.inferVectorBinaryNode(r,n,m),void(n.inputs.alpha=k);case"vector.cross":return n.inputs.a=V,n.inputs.b=V,void(n.outputs.value=V);case"vector.applyRotation":return n.inputs.value=V,n.inputs.rotation=$,void(n.outputs.value=V);case"boolean.and":case"boolean.or":return n.inputs.a=g,n.inputs.b=g,void(n.outputs.value=g);case"boolean.not":return n.inputs.value=g,void(n.outputs.value=g);case"compare.greaterThan":case"compare.greaterThanOrEqual":case"compare.lessThan":case"compare.lessThanOrEqual":{const e=(s=this.inputValueType(r,"a"),o=this.inputValueType(r,"b"),"string"===s.kind||"string"===o.kind?I:k);return n.inputs.a=e,n.inputs.b=e,void(n.outputs.value=g)}case"compare.equal":case"compare.notEqual":{const e=this.inputValueType(r,"a"),t=this.inputValueType(r,"b");return"vector2"!==e.kind&&"vector3"!==e.kind||!this.inputLiteralMatches(r,"b",e)?"vector2"!==t.kind&&"vector3"!==t.kind||!this.inputLiteralMatches(r,"a",t)?(n.inputs.a="any"===t.kind?e:t,n.inputs.b="any"===e.kind?t:e,void(n.outputs.value=g)):(n.inputs.a=t,n.inputs.b=t,void(n.outputs.value=g)):(n.inputs.a=e,n.inputs.b=e,void(n.outputs.value=g))}}var s,o}validateInputs(e){const t=this.inferNode(e);for(const[r,n]of Object.entries(t.inputs)){const t=this.input(e,r);if(null==t)continue;const s="value"in t?A(t.value):this.outputType(t);("value"in t?q(t.value,n):E(s,n))||this.error(e,r,`Expected ${x(n)}, received ${x(s)}`)}}inputValueType(e,t){const r=this.input(e,t);return null==r?m:"value"in r?A(r.value):this.outputType(r)}outputType(e){const t=this.graphNodes.get(e.nodeId);return null!=t?this.inferNode(t).outputs[e.port]??m:m}input(e,t){const r=this.incoming.get(K({nodeId:e.id,port:t}))??e.inputs?.[t];if(null!=r)return r;const n=h(e,t);return void 0!==n?{value:n}:void 0}inputLiteralMatches(e,t,r){const n=this.input(e,t);return null!=n&&"value"in n&&q(n.value,r)}inferMathNode(e,t){const r=this.inputValueType(e,"a"),n=this.inputValueType(e,"b"),s=this.vectorOperandType(e,"a",r),o=this.vectorOperandType(e,"b",n),a=function(e){switch(e){case"math.add":return"Add";case"math.subtract":return"Subtract";case"math.multiply":return"Multiply";case"math.divide":return"Divide";case"math.modulo":return"Modulo";default:return"Math"}}(e.kind);if("math.add"===e.kind){const s=function(e,t){return"string"!==e.kind||"string"!==t.kind&&"any"!==t.kind?"string"===t.kind&&"any"===e.kind?I:void 0:I}(r,n);if(null!=s)return t.inputs.a=s,t.inputs.b=s,void(t.outputs.value=s);if("string"===r.kind||"string"===n.kind)return t.inputs.a=m,t.inputs.b=m,t.outputs.value=m,void this.error(e,void 0,`Add requires two numbers, two strings, or vector-compatible operands, received ${x(r)} and ${x(n)}`)}const i=j(s,o);return"mismatch"===i?(t.inputs.a=s??m,t.inputs.b=o??m,t.outputs.value=m,void this.error(e,void 0,`${a} requires vector operands to have the same dimension, received ${x(s)} and ${x(o)}`)):null!=i?(t.inputs.a=J(r,s,i),t.inputs.b=J(n,o,i),t.outputs.value=i,void(B(r,s,i)&&B(n,o,i)||this.error(e,void 0,`${a} requires numbers or ${x(i)} values, received ${x(r)} and ${x(n)}`))):(t.inputs.a=k,t.inputs.b=k,t.outputs.value=k,void(D(r)&&D(n)||this.error(e,void 0,`${a} requires number or vector operands, received ${x(r)} and ${x(n)}`)))}vectorOperandType(e,t,r){if("vector2"===r.kind)return S;if("vector3"===r.kind)return V;const n=this.input(e,t);return null!=n&&"value"in n?q(n.value,S)?S:q(n.value,V)?V:void 0:void 0}inferVectorUnaryNode(e,t,r){const n=this.inputValueType(e,"value"),s=this.vectorOperandType(e,"value",n);t.inputs.value=s??m,t.outputs.value="any"===r.kind?s??m:r,null==s&&"any"!==n.kind&&this.error(e,"value",`${L(e.kind)} requires a Vector2 or Vector3, received ${x(n)}`)}inferVectorBinaryNode(e,t,r){const n=this.inputValueType(e,"a"),s=this.inputValueType(e,"b"),o=this.vectorOperandType(e,"a",n),a=this.vectorOperandType(e,"b",s),i=j(o,a);return"mismatch"===i?(t.inputs.a=o??m,t.inputs.b=a??m,t.outputs.value=r,void this.error(e,void 0,`${L(e.kind)} requires matching vector dimensions, received ${x(o)} and ${x(a)}`)):null!=i?(t.inputs.a=z(n,o,i),t.inputs.b=z(s,a,i),void(t.outputs.value="any"===r.kind?i:r)):(t.inputs.a=m,t.inputs.b=m,t.outputs.value=r,void("any"!==n.kind&&"any"!==s.kind&&this.error(e,void 0,`${L(e.kind)} requires Vector2 or Vector3 inputs, received ${x(n)} and ${x(s)}`)))}observableTargetType(e){const t=R(e,"actorId"),r=null!=t?this.context.resolveActorClass?.(t):void 0;let n=null!=r?C(r):f;const s=R(e,"component"),o=R(e,"componentTypeId");return this.componentTargetType(n,s,o)}actorClassInputType(t,r){const n=this.input(t,r);if(null==n)return{kind:"actorClass"};if("value"in n)return"string"!=typeof n.value||0===n.value.length?{kind:"actorClass"}:null==e(n.value)?(this.error(t,r,`Actor class ${JSON.stringify(n.value)} does not exist`),{kind:"actorClass"}):{kind:"actorClass",classId:n.value};const s=this.outputType(n);return"actorClass"===s.kind?s:{kind:"actorClass"}}eventBindSourceTargetType(e){const t=this.inputValueType(e,"target"),r=R(e,"component"),n=R(e,"componentTypeId");return this.componentTargetType(t,r,n)}componentTargetType(e,t,r){if(null!=t){const r=this.propertyInfo(e,t)?.type;if(null!=r)return r}return null!=r?{kind:"component",classId:r}:null!=t?b:e}eventSourceInfo(e,t){if(null==t)return;const r=P(e);return null!=r?s(r,t):void 0}eventSourcePayloadType(e,t){let r=t.valueType,n=0;for(let s=0;s<t.parameters.length;s++){const o=t.parameters[s];if("actor"===r.kind&&"actorClass"===o.type.kind){const t=R(e,`arg${s}ActorClassId`);null!=t&&(r={kind:"actor",classId:t})}else if("actor"===r.kind&&"actor"===o.type.kind)if("event.source"===e.kind){const t=R(e,`arg${s}ActorId`),n=null!=t?this.context.resolveActorClass?.(t):void 0;null!=n&&(r=C(n))}else{const t=this.inputValueType(e,`arg${n}`);"actor"===t.kind&&null!=t.classId&&(r=t)}"actorClass"!==o.type.kind&&n++}return r}validateStaticEventSourceArguments(t,r){for(let n=0;n<r.parameters.length;n++){const s=r.parameters[n];if("actorClass"===s.type.kind){const o=R(t,`arg${n}ActorClassId`);null==o?this.error(t,void 0,`${r.label} requires an actor class for ${s.name}`):null==e(o)&&this.error(t,void 0,`Actor class ${JSON.stringify(o)} does not exist`);continue}if("actor"===s.type.kind){const e=R(t,`arg${n}ActorId`);null==e?this.error(t,void 0,`${r.label} requires an actor for ${s.name}`):null!=this.context.resolveActorClass&&null==this.context.resolveActorClass(e)&&this.error(t,void 0,`Actor ${JSON.stringify(e)} does not exist`);continue}this.error(t,void 0,`${r.label} parameter ${s.name} cannot be authored on a static event source`)}}validateEventSourceActorClassArguments(t,r){for(let n=0;n<r.parameters.length;n++){const s=r.parameters[n];if("actorClass"!==s.type.kind)continue;const o=R(t,`arg${n}ActorClassId`);null==o?this.error(t,void 0,`${r.label} requires an actor class for ${s.name}`):null==e(o)&&this.error(t,void 0,`Actor class ${JSON.stringify(o)} does not exist`)}}propertyInfo(e,t){if(null==t)return;if("actor"===e.kind){const e=l(t);if(null!=e)return e}const r=P(e);return null!=r?a(r,t):void 0}callableInfo(e,t){if(null==t)return;const n=P(e);return null!=n?r(n,t):void 0}variableType(e){return this.variables.get(R(e,"variable")??"")??m}isDataPort(e,t,r){const n=this.graphNodes.get(e);return null!=n&&y(n,r).some(e=>e.name===t&&"data"===e.kind)}error(e,t,r){const n=`${e.id}:${t??""}:${r}`;this.diagnosticKeys.has(n)||(this.diagnosticKeys.add(n),this.diagnostics.push({severity:"error",nodeId:e.id,...null!=t?{port:t}:{},message:r}))}}function P(r){return"actor"===r.kind&&null!=r.classId?e(r.classId):"component"===r.kind&&null!=r.classId?t(r.classId):void 0}function j(e,t){return null==e?t:null==t||e.kind===t.kind?e:"mismatch"}function J(e,t,r){return null!=t?t.kind===r.kind?r:t:"number"===e.kind?k:(e.kind,m)}function z(e,t,r){return null!=t?t.kind===r.kind?r:t:"any"===e.kind?r:m}function B(e,t,r){return"any"===e.kind||"number"===e.kind||t?.kind===r.kind}function D(e){return"number"===e.kind||"any"===e.kind}function L(e){switch(e){case"vector.length":return"Length";case"vector.lengthSquared":return"Length Squared";case"vector.distance":return"Distance";case"vector.distanceSquared":return"Distance Squared";case"vector.normalize":return"Normalize";case"vector.dot":return"Dot Product";case"vector.cross":return"Cross Product";case"vector.lerp":return"Lerp";case"vector.applyRotation":return"Apply Rotation";default:return"Vector"}}function R(e,t){const r=e.params?.[t];return"string"==typeof r&&r.length>0?r:void 0}function G(e,t){const r=e.params?.[t];return"number"==typeof r?r:void 0}function K(e){return`${e.nodeId}:${e.port}`}function U(e){return`- ${null==e.port?e.nodeId:`${e.nodeId}:${e.port}`}: ${e.message}`}/*
|
|
2
|
+
* Copyright (©) 2026 Hology Interactive AB. All rights reserved.
|
|
3
|
+
* See the LICENSE.md file for details.
|
|
4
|
+
*/
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import type { EventGraphAssetKind } from './model.js';
|
|
2
|
+
export type EventGraphType = {
|
|
3
|
+
kind: 'any';
|
|
4
|
+
} | {
|
|
5
|
+
kind: 'void';
|
|
6
|
+
} | {
|
|
7
|
+
kind: 'null';
|
|
8
|
+
} | {
|
|
9
|
+
kind: 'boolean';
|
|
10
|
+
} | {
|
|
11
|
+
kind: 'number';
|
|
12
|
+
} | {
|
|
13
|
+
kind: 'string';
|
|
14
|
+
} | {
|
|
15
|
+
kind: 'vector2';
|
|
16
|
+
} | {
|
|
17
|
+
kind: 'vector3';
|
|
18
|
+
} | {
|
|
19
|
+
kind: 'euler';
|
|
20
|
+
} | {
|
|
21
|
+
kind: 'asset';
|
|
22
|
+
assetType: EventGraphAssetKind;
|
|
23
|
+
} | {
|
|
24
|
+
kind: 'optional';
|
|
25
|
+
value: EventGraphType;
|
|
26
|
+
} | {
|
|
27
|
+
kind: 'object';
|
|
28
|
+
classId?: string;
|
|
29
|
+
} | {
|
|
30
|
+
kind: 'actor';
|
|
31
|
+
classId?: string;
|
|
32
|
+
} | {
|
|
33
|
+
kind: 'actorClass';
|
|
34
|
+
classId?: string;
|
|
35
|
+
} | {
|
|
36
|
+
kind: 'component';
|
|
37
|
+
classId?: string;
|
|
38
|
+
} | {
|
|
39
|
+
kind: 'observable';
|
|
40
|
+
value: EventGraphType;
|
|
41
|
+
} | {
|
|
42
|
+
kind: 'array';
|
|
43
|
+
element: EventGraphType;
|
|
44
|
+
};
|
|
45
|
+
export type EventGraphTypeSource = EventGraphType | Function;
|
|
46
|
+
export declare const EVENT_GRAPH_ANY_TYPE: EventGraphType;
|
|
47
|
+
export declare const EVENT_GRAPH_VOID_TYPE: EventGraphType;
|
|
48
|
+
export declare const EVENT_GRAPH_BOOLEAN_TYPE: EventGraphType;
|
|
49
|
+
export declare const EVENT_GRAPH_NUMBER_TYPE: EventGraphType;
|
|
50
|
+
export declare const EVENT_GRAPH_STRING_TYPE: EventGraphType;
|
|
51
|
+
export declare const EVENT_GRAPH_VECTOR2_TYPE: EventGraphType;
|
|
52
|
+
export declare const EVENT_GRAPH_VECTOR3_TYPE: EventGraphType;
|
|
53
|
+
export declare const EVENT_GRAPH_ROTATION_TYPE: EventGraphType;
|
|
54
|
+
/** @deprecated Use EVENT_GRAPH_ROTATION_TYPE. */
|
|
55
|
+
export declare const EVENT_GRAPH_EULER_TYPE: {
|
|
56
|
+
kind: "euler";
|
|
57
|
+
};
|
|
58
|
+
export declare const EVENT_GRAPH_OBJECT_TYPE: EventGraphType;
|
|
59
|
+
export declare const EVENT_GRAPH_ACTOR_TYPE: EventGraphType;
|
|
60
|
+
export declare const EVENT_GRAPH_ACTOR_CLASS_TYPE: EventGraphType;
|
|
61
|
+
export declare const EVENT_GRAPH_COMPONENT_TYPE: EventGraphType;
|
|
62
|
+
export declare function isTweenableEventGraphType(type: EventGraphType): boolean;
|
|
63
|
+
export declare function eventGraphAssetType(assetType: EventGraphAssetKind): EventGraphType;
|
|
64
|
+
export declare function eventGraphOptionalType(value: EventGraphType): EventGraphType;
|
|
65
|
+
export declare function eventGraphActorType(type?: Function): EventGraphType;
|
|
66
|
+
export declare function eventGraphActorClassType(type?: Function): EventGraphType;
|
|
67
|
+
export declare function eventGraphComponentType(type?: Function): EventGraphType;
|
|
68
|
+
export declare function resolveEventGraphType(source?: EventGraphTypeSource | null): EventGraphType;
|
|
69
|
+
export declare function eventGraphTypeFromConstructor(type?: Function | null): EventGraphType;
|
|
70
|
+
export declare function inferEventGraphLiteralType(value: unknown): EventGraphType;
|
|
71
|
+
export declare function isEventGraphType(value: unknown): value is EventGraphType;
|
|
72
|
+
/** Returns true when a value of `actual` can connect to a port expecting `expected`. */
|
|
73
|
+
export declare function isEventGraphTypeAssignable(actual: EventGraphType, expected: EventGraphType): boolean;
|
|
74
|
+
/** Validates a serialized literal against its contextual graph type. */
|
|
75
|
+
export declare function isEventGraphLiteralAssignableToType(value: unknown, expected: EventGraphType): boolean;
|
|
76
|
+
export declare function eventGraphTypeName(type: EventGraphType): string;
|
|
77
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import{Observable as e}from"rxjs";import{Euler as n,Vector2 as t,Vector3 as r}from"three";import{getActorClassById as s,getActorClassId as a,getComponentClassById as o,getComponentClassId as i}from"../actors/type-registry.js";import{isEventGraphAssetReference as p}from"./asset-references.js";export const EVENT_GRAPH_ANY_TYPE=Object.freeze({kind:"any"});export const EVENT_GRAPH_VOID_TYPE=Object.freeze({kind:"void"});export const EVENT_GRAPH_BOOLEAN_TYPE=Object.freeze({kind:"boolean"});export const EVENT_GRAPH_NUMBER_TYPE=Object.freeze({kind:"number"});export const EVENT_GRAPH_STRING_TYPE=Object.freeze({kind:"string"});export const EVENT_GRAPH_VECTOR2_TYPE=Object.freeze({kind:"vector2"});export const EVENT_GRAPH_VECTOR3_TYPE=Object.freeze({kind:"vector3"});export const EVENT_GRAPH_ROTATION_TYPE=Object.freeze({kind:"euler"});export const EVENT_GRAPH_EULER_TYPE=EVENT_GRAPH_ROTATION_TYPE;export const EVENT_GRAPH_OBJECT_TYPE=Object.freeze({kind:"object"});export const EVENT_GRAPH_ACTOR_TYPE=Object.freeze({kind:"actor"});export const EVENT_GRAPH_ACTOR_CLASS_TYPE=Object.freeze({kind:"actorClass"});export const EVENT_GRAPH_COMPONENT_TYPE=Object.freeze({kind:"component"});export function isTweenableEventGraphType(e){return"number"===e.kind||"vector2"===e.kind||"vector3"===e.kind||"euler"===e.kind}export function eventGraphAssetType(e){return{kind:"asset",assetType:e}}export function eventGraphOptionalType(e){return{kind:"optional",value:e}}export function eventGraphActorType(e){return{kind:"actor",...null!=e?{classId:a(e)??e.name}:{}}}export function eventGraphActorClassType(e){return{kind:"actorClass",...null!=e?{classId:a(e)??e.name}:{}}}export function eventGraphComponentType(e){return{kind:"component",...null!=e?{classId:i(e)??e.name}:{}}}export function resolveEventGraphType(e){return null==e?EVENT_GRAPH_ANY_TYPE:isEventGraphType(e)?e:eventGraphTypeFromConstructor(e)}export function eventGraphTypeFromConstructor(s){return null==s?EVENT_GRAPH_VOID_TYPE:s===Number?EVENT_GRAPH_NUMBER_TYPE:s===String?EVENT_GRAPH_STRING_TYPE:s===Boolean?EVENT_GRAPH_BOOLEAN_TYPE:s===t?EVENT_GRAPH_VECTOR2_TYPE:s===r?EVENT_GRAPH_VECTOR3_TYPE:s===n?EVENT_GRAPH_ROTATION_TYPE:s===Array?{kind:"array",element:EVENT_GRAPH_ANY_TYPE}:s===e||null!=s.prototype&&s.prototype instanceof e?{kind:"observable",value:EVENT_GRAPH_ANY_TYPE}:null!=a(s)||!0===s.__isActor?eventGraphActorType(s):null!=i(s)||!0===s.__isActorComponent?eventGraphComponentType(s):s===Object||s===Promise?EVENT_GRAPH_OBJECT_TYPE:{kind:"object",classId:s.name||void 0}}export function inferEventGraphLiteralType(e){if(void 0===e)return EVENT_GRAPH_ANY_TYPE;if(null===e)return{kind:"null"};if("boolean"==typeof e)return EVENT_GRAPH_BOOLEAN_TYPE;if("number"==typeof e)return EVENT_GRAPH_NUMBER_TYPE;if("string"==typeof e)return EVENT_GRAPH_STRING_TYPE;if(p(e))return eventGraphAssetType(e.assetType);if(Array.isArray(e)){return{kind:"array",element:e.length>0?inferEventGraphLiteralType(e[0]):EVENT_GRAPH_ANY_TYPE}}return EVENT_GRAPH_OBJECT_TYPE}export function isEventGraphType(e){if(null==e||"object"!=typeof e||"string"!=typeof e.kind)return!1;const n=e;switch(n.kind){case"any":case"void":case"null":case"boolean":case"number":case"string":case"vector2":case"vector3":case"euler":return!0;case"asset":return"prefab"===n.assetType||"vfx"===n.assetType||"sequence"===n.assetType;case"optional":return isEventGraphType(n.value)&&"void"!==n.value.kind;case"object":case"actor":case"actorClass":case"component":return null==n.classId||"string"==typeof n.classId;case"observable":return isEventGraphType(n.value);case"array":return isEventGraphType(n.element);default:return!1}}export function isEventGraphTypeAssignable(e,n){return"any"===e.kind||"any"===n.kind||("optional"===n.kind?"null"===e.kind||isEventGraphTypeAssignable("optional"===e.kind?e.value:e,n.value):"optional"!==e.kind&&("object"===n.kind?null==n.classId?"object"===e.kind||"actor"===e.kind||"component"===e.kind||"vector2"===e.kind||"vector3"===e.kind:"object"===e.kind&&(null==e.classId||e.classId===n.classId):e.kind===n.kind&&("asset"===e.kind&&"asset"===n.kind?e.assetType===n.assetType:"actor"===e.kind&&"actor"===n.kind||"actorClass"===e.kind&&"actorClass"===n.kind?l(e.classId,n.classId,s):"component"===e.kind&&"component"===n.kind?l(e.classId,n.classId,o):"observable"===e.kind&&"observable"===n.kind?isEventGraphTypeAssignable(e.value,n.value):"array"!==e.kind||"array"!==n.kind||isEventGraphTypeAssignable(e.element,n.element))))}export function isEventGraphLiteralAssignableToType(e,n){return"any"===n.kind?c(e):"actorClass"===n.kind?"string"==typeof e&&e.length>0:"vector2"===n.kind?T(e,2):"vector3"===n.kind||"euler"===n.kind?T(e,3):"asset"===n.kind?p(e)&&e.assetType===n.assetType&&e.assetId.length>0:"optional"===n.kind?null===e||isEventGraphLiteralAssignableToType(e,n.value):"array"===n.kind?Array.isArray(e)&&e.every(e=>isEventGraphLiteralAssignableToType(e,n.element)):c(e)&&isEventGraphTypeAssignable(inferEventGraphLiteralType(e),n)}export function eventGraphTypeName(e){return"actor"===e.kind||"component"===e.kind||"object"===e.kind?e.classId??e.kind:"actorClass"===e.kind?null!=e.classId?`${e.classId} Class`:"Actor Class":"observable"===e.kind?`Observable<${eventGraphTypeName(e.value)}>`:"array"===e.kind?`${eventGraphTypeName(e.element)}[]`:"asset"===e.kind?"vfx"===e.assetType?"VFX Asset":`${e.assetType[0].toUpperCase()}${e.assetType.slice(1)} Asset`:"optional"===e.kind?`${eventGraphTypeName(e.value)}?`:"euler"===e.kind?"Rotation":e.kind}function l(e,n,t){if(null==n||null==e)return!0;if(e===n)return!0;const r=t(e),s=t(n);return null!=r&&null!=s&&r.prototype instanceof s}function c(e){return"number"==typeof e?Number.isFinite(e):Array.isArray(e)?e.every(c):null==e||"object"!=typeof e||Object.values(e).every(c)}function T(e,n){return Array.isArray(e)&&e.length===n&&e.every(e=>"number"==typeof e&&Number.isFinite(e))}/*
|
|
2
|
+
* Copyright (©) 2026 Hology Interactive AB. All rights reserved.
|
|
3
|
+
* See the LICENSE.md file for details.
|
|
4
|
+
*/
|
package/dist/gameplay/index.d.ts
CHANGED
|
@@ -4,8 +4,8 @@ export * from './initiate.js';
|
|
|
4
4
|
export * from './inject.js';
|
|
5
5
|
export { Service, Inject } from 'typedi';
|
|
6
6
|
export { ActorFactory } from './actors/factory.js';
|
|
7
|
-
export { Actor, BaseActor, getActorClassById } from './actors/actor.js';
|
|
8
|
-
export { Component, ActorComponent, type ComponentOptions, attach, Attach } from './actors/component.js';
|
|
7
|
+
export { Actor, BaseActor, getActorClassById, getActorClassId, getRegisteredActorClasses } from './actors/actor.js';
|
|
8
|
+
export { Component, ActorComponent, type ComponentOptions, attach, Attach, getComponentClassById, getComponentClassId, getRegisteredComponentClasses } from './actors/component.js';
|
|
9
9
|
export * from './services/world.js';
|
|
10
10
|
export * from './services/game-time-scheduler.js';
|
|
11
11
|
export * from './services/camera-shake.js';
|
|
@@ -13,6 +13,7 @@ export * from './services/render.js';
|
|
|
13
13
|
export * from './services/physics/physics-system.js';
|
|
14
14
|
export * from './animation/anim-sm.js';
|
|
15
15
|
export * from './animation/root-motion.js';
|
|
16
|
+
export * from './animation/retarget.js';
|
|
16
17
|
export * from './services/asset-loader.js';
|
|
17
18
|
export * from './services/pointer-events.js';
|
|
18
19
|
export { VisualEffect } from '../effects/vfx/vfx-param.js';
|
|
@@ -21,6 +22,18 @@ export * from '../shader/parameter.js';
|
|
|
21
22
|
export * from './ai/index.js';
|
|
22
23
|
export * from '../effects/vfx/index.js';
|
|
23
24
|
export * from './services/shader-provider.js';
|
|
25
|
+
export { EventGraphCallable, EventGraphEventSource, EventGraphProperty, getEventGraphCallableInfo, getEventGraphCallableInfos, getEventGraphCallableMethods, getEventGraphEventSourceInfo, getEventGraphEventSourceInfos, getEventGraphEventSourceMethods, getEventGraphPropertyInfo, getEventGraphPropertyInfos, getEventGraphProperties, isEventGraphEventSource, } from './event-graph/decorators.js';
|
|
26
|
+
export type { EventGraphCallableInfo, EventGraphCallableOptions, EventGraphEventSourceInfo, EventGraphEventSourceOptions, EventGraphParameterInfo, EventGraphPropertyInfo, EventGraphPropertyOptions, } from './event-graph/decorators.js';
|
|
27
|
+
export { EventGraphCompiler, validateEventGraphDocument } from './event-graph/document-compiler.js';
|
|
28
|
+
export type { CompiledEventGraph, CompiledEventGraphHandler, CompiledEventSourceArgument, CompiledEventSourceEvent, CompiledObservableEvent, EventGraphExecutionContext, EventGraphHandler, EventGraphDiagnostic, EventGraphValidationResult, } from './event-graph/document-compiler.js';
|
|
29
|
+
export type { EventGraphDocument, EventGraphEdge, EventGraphInput, EventGraphNode, EventGraphNodeKind, EventGraphSocketRef, EventGraphVariable, EventGraphVector2Literal, EventGraphVector3Literal, } from './event-graph/model.js';
|
|
30
|
+
export { createDefaultEventGraphDocument, hasExecutableEventGraphDocument } from './event-graph/model.js';
|
|
31
|
+
export { EVENT_GRAPH_NODE_DEFINITIONS, getEventGraphNodePorts, getEventGraphPortDefinition } from './event-graph/registry.js';
|
|
32
|
+
export { EventGraphInstance } from './event-graph/runtime.js';
|
|
33
|
+
export { analyzeEventGraphTypes, assertEventGraphTypes, createEventGraphTypeContext, getEventGraphMembersForType, } from './event-graph/type-inference.js';
|
|
34
|
+
export type { EventGraphNodeTypeInfo, EventGraphTypeAnalysis, EventGraphTypeContext, EventGraphTypeDiagnostic, EventGraphTypeMembers, } from './event-graph/type-inference.js';
|
|
35
|
+
export { EVENT_GRAPH_ACTOR_TYPE, EVENT_GRAPH_ACTOR_CLASS_TYPE, EVENT_GRAPH_ANY_TYPE, EVENT_GRAPH_BOOLEAN_TYPE, EVENT_GRAPH_COMPONENT_TYPE, EVENT_GRAPH_NUMBER_TYPE, EVENT_GRAPH_OBJECT_TYPE, EVENT_GRAPH_STRING_TYPE, EVENT_GRAPH_VOID_TYPE, EVENT_GRAPH_VECTOR2_TYPE, EVENT_GRAPH_VECTOR3_TYPE, eventGraphActorClassType, eventGraphActorType, eventGraphComponentType, eventGraphTypeName, isEventGraphTypeAssignable, } from './event-graph/types.js';
|
|
36
|
+
export type { EventGraphType, EventGraphTypeSource } from './event-graph/types.js';
|
|
24
37
|
export * from './net/net-connection.js';
|
|
25
38
|
export * from './net/net-session.js';
|
|
26
39
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/gameplay/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import"reflect-metadata";export{Container as DIContainer}from"typedi";export*from"./initiate.js";export*from"./inject.js";export{Service,Inject}from"typedi";export{ActorFactory}from"./actors/factory.js";export{Actor,BaseActor,getActorClassById}from"./actors/actor.js";export{Component,ActorComponent,attach,Attach}from"./actors/component.js";export*from"./services/world.js";export*from"./services/game-time-scheduler.js";export*from"./services/camera-shake.js";export*from"./services/render.js";export*from"./services/physics/physics-system.js";export*from"./animation/anim-sm.js";export*from"./animation/root-motion.js";export*from"./services/asset-loader.js";export*from"./services/pointer-events.js";export{VisualEffect}from"../effects/vfx/vfx-param.js";export{DataAssetRef}from"../scene/objects/data-asset.js";export*from"../shader/parameter.js";export*from"./ai/index.js";export*from"../effects/vfx/index.js";export*from"./services/shader-provider.js";export*from"./net/net-connection.js";export*from"./net/net-session.js";/*
|
|
1
|
+
import"reflect-metadata";export{Container as DIContainer}from"typedi";export*from"./initiate.js";export*from"./inject.js";export{Service,Inject}from"typedi";export{ActorFactory}from"./actors/factory.js";export{Actor,BaseActor,getActorClassById,getActorClassId,getRegisteredActorClasses}from"./actors/actor.js";export{Component,ActorComponent,attach,Attach,getComponentClassById,getComponentClassId,getRegisteredComponentClasses}from"./actors/component.js";export*from"./services/world.js";export*from"./services/game-time-scheduler.js";export*from"./services/camera-shake.js";export*from"./services/render.js";export*from"./services/physics/physics-system.js";export*from"./animation/anim-sm.js";export*from"./animation/root-motion.js";export*from"./animation/retarget.js";export*from"./services/asset-loader.js";export*from"./services/pointer-events.js";export{VisualEffect}from"../effects/vfx/vfx-param.js";export{DataAssetRef}from"../scene/objects/data-asset.js";export*from"../shader/parameter.js";export*from"./ai/index.js";export*from"../effects/vfx/index.js";export*from"./services/shader-provider.js";export{EventGraphCallable,EventGraphEventSource,EventGraphProperty,getEventGraphCallableInfo,getEventGraphCallableInfos,getEventGraphCallableMethods,getEventGraphEventSourceInfo,getEventGraphEventSourceInfos,getEventGraphEventSourceMethods,getEventGraphPropertyInfo,getEventGraphPropertyInfos,getEventGraphProperties,isEventGraphEventSource}from"./event-graph/decorators.js";export{EventGraphCompiler,validateEventGraphDocument}from"./event-graph/document-compiler.js";export{createDefaultEventGraphDocument,hasExecutableEventGraphDocument}from"./event-graph/model.js";export{EVENT_GRAPH_NODE_DEFINITIONS,getEventGraphNodePorts,getEventGraphPortDefinition}from"./event-graph/registry.js";export{EventGraphInstance}from"./event-graph/runtime.js";export{analyzeEventGraphTypes,assertEventGraphTypes,createEventGraphTypeContext,getEventGraphMembersForType}from"./event-graph/type-inference.js";export{EVENT_GRAPH_ACTOR_TYPE,EVENT_GRAPH_ACTOR_CLASS_TYPE,EVENT_GRAPH_ANY_TYPE,EVENT_GRAPH_BOOLEAN_TYPE,EVENT_GRAPH_COMPONENT_TYPE,EVENT_GRAPH_NUMBER_TYPE,EVENT_GRAPH_OBJECT_TYPE,EVENT_GRAPH_STRING_TYPE,EVENT_GRAPH_VOID_TYPE,EVENT_GRAPH_VECTOR2_TYPE,EVENT_GRAPH_VECTOR3_TYPE,eventGraphActorClassType,eventGraphActorType,eventGraphComponentType,eventGraphTypeName,isEventGraphTypeAssignable}from"./event-graph/types.js";export*from"./net/net-connection.js";export*from"./net/net-session.js";/*
|
|
2
2
|
* Copyright (©) 2026 Hology Interactive AB. All rights reserved.
|
|
3
3
|
* See the LICENSE.md file for details.
|
|
4
4
|
*/
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import e from"typedi";import{loadScene as t}from"../scene/bootstrap.js";import{ActorFactory as s}from"./actors/factory.js";import{World as n}from"./services/world.js";import{SceneMaterializer as o}from"../scene/materializer.js";import{ViewController as r}from"./services/render.js";import{RenderingView as i}from"../rendering.js";import{PhysicsSystem as a}from"./services/physics/physics-system.js";import{MeshComponent as c}from"./actors/builtin/components/mesh-component.js";import{builtInComponents as d}from"./actors/builtin/components/index.js";import{activeContainerInstance as m}from"./actors/internal/container-map.js";import{InputService as l}from"./input/index.js";import{RuntimeAssetsService as p}from"../scene/runtime-asset-service.js";import{AssetResourceLoader as h}from"../scene/asset-resource-loader.js";import{AssetLoader as u}from"./services/asset-loader.js";import{polyfillClient as f}from"./polyfill.js";import{Subject as g}from"rxjs";import{PointerEvents as w}from"./services/pointer-events.js";import{RuntimeBundledBackendService as
|
|
1
|
+
import e from"typedi";import{loadScene as t}from"../scene/bootstrap.js";import{ActorFactory as s}from"./actors/factory.js";import{World as n}from"./services/world.js";import{SceneMaterializer as o}from"../scene/materializer.js";import{ViewController as r}from"./services/render.js";import{RenderingView as i}from"../rendering.js";import{PhysicsSystem as a}from"./services/physics/physics-system.js";import{MeshComponent as c}from"./actors/builtin/components/mesh-component.js";import{builtInComponents as d}from"./actors/builtin/components/index.js";import{activeContainerInstance as m}from"./actors/internal/container-map.js";import{InputService as l}from"./input/index.js";import{RuntimeAssetsService as p}from"../scene/runtime-asset-service.js";import{AssetResourceLoader as h}from"../scene/asset-resource-loader.js";import{AssetLoader as u}from"./services/asset-loader.js";import{polyfillClient as f}from"./polyfill.js";import{Subject as g}from"rxjs";import{PointerEvents as w}from"./services/pointer-events.js";import{RuntimeBundledBackendService as v}from"../scene/runtime-bundled-backend-service.js";import{Scene as b}from"three";import{ShaderProvider as j}from"./services/shader-provider.js";import{SceneDataService as S}from"../scene/scene-data-service.js";import{NetMode as y}from"./net/net-session.js";import{AssetsProvider as x}from"../scene/assets-provider.js";export function initiateGame(g,I){if(f(),0!=I.element.childNodes.length)return console.error("Can not initialize the game with a non-empty html element"),null;e.has(r);const E=e.of("default"),R=new HologyRuntime(E),G=new s(E,{inEditor:!1});var P;G.classes=I.actors,e.set(s,G),P=I.element,Object.assign(P.style,{position:"absolute",top:"0",left:"0",width:"100%",height:"100%",overflow:"hidden"});const D=new i(I.element,{enableXR:!0===I.xr?.enabled,maxPixelRatio:I.rendering?.maxPixelRatio,resolutionScale:I.rendering?.resolutionScale,dynamicResolution:I.rendering?.dynamicResolution,upscaling:I.rendering?.upscaling,msaa:I.rendering?.msaa,fpsCap:I.rendering?.fpsCap,depthPrepass:{enabled:!0===I.rendering?.depthPrepass?.enabled},bloom:{enabled:!1!==I?.rendering?.bloom?.enabled},reflection:{enabled:!1!==I?.rendering?.reflection?.enabled},shadows:{cascadeUpdateIntervals:[22,40,60,120]}});D.renderer.shadowMap.enabled=I.rendering?.shadows?.enabled??!0,D.renderer.shadowMap.autoUpdate=I.rendering?.shadows?.autoUpdate??!0,D.renderer.debug.checkShaderErrors=!1,e.set(i,D);const M=new r(D);e.set(r,M);const z=new v,A=new p(z),O=new h;O.setDataDir(I.dataDir),O.initKtx2(D.renderer);const C=Object.entries(I.shaders).map(([e,t])=>({name:e,type:t})),H=Object.entries(I.actors).map(([e,t])=>({name:e,type:t})),N={...d,...I.components??{}},T=Object.entries(N).map(([e,t])=>({name:e,type:t})),U=new j(C);e.set(j,U);const k=new u(O,A,C);e.set(x,A),e.set(h,O),e.set(u,k);const F=new b,W=new o(F,new S,A,O,D,C,H,G,T);W.inEditor=!1,W.netMode=I.multi?.session?.mode??y.none,e.set(o,W);const _=e.get(n);return e.set(n,_),_.materializer=W,(async()=>{const s=e.get(a);if(await s.start(),R.isShutdown)return;if(await z.preloadData(),R.isShutdown)return;if(_.scene=F,null!=I.multi?.session){const{NetService:e}=await import("./net/service/net-service.js"),t=E.get(e);t.session=I.multi.session,t.start(),R.shutdownStarted.subscribe(()=>t.stop())}const{scene:n,actors:o,materializer:r}=await t(D,I.sceneName,I.dataDir,I.shaders,I.actors,N,G,z,A,O,{detailTier:I.detailTier,nodeMode:I.multi?.session?.mode??y.none});_.scene=n,s.scene=_.scene;for(const e of F.children)_.scene.add(e);if(R.isShutdown)return void D.stop();e.import([c]);for(const e of o)_.addActor(e);s.addFromScene(n),await _.startSceneEventGraphs(r),console.log("Start compile shaders"),console.time("compile shaders"),await D.compileAsync(),console.timeEnd("compile shaders"),console.log("Finished compile shaders. Programs: ",D.renderer.info.programs?.length??0),console.log("Start init scene textures"),console.time("init scene textures"),D.initTextures(),console.timeEnd("init scene textures");const i=E.get(l);D.loop(e=>{i.update(e)}),R.status=5,R.shutdownStarted.subscribe(()=>{O.disposeAll()}),m.value=E,E.remove(g),E.set({id:g,type:g});const d=E.get(g);m.value=null,R.gameInstance=d,E.get(w).start(),d instanceof GameInstance&&await d.onStart(),R._resolver(!0)})(),R}export class GameInstance{onStart(){}onShutdown(){}}export function createHologyScene(){}export class HologyRuntime{constructor(e){this.containerInstance=e,this.status=0,this.isShutdown=!1,this.shutdownStarted=new g,this.ready=new Promise(e=>{this._resolver=e})}getWorld(){return this.containerInstance.get(n)}getService(e){return this.containerInstance.get(e)}shutdown(){this.isShutdown=!0;const e=this.shutdownStarted;e.next(),e.complete(),this.gameInstance instanceof GameInstance&&this.gameInstance.onShutdown(),this.containerInstance.get(l).stop();const t=this.containerInstance.get(i);t?.stop();const s=this.getWorld();s.stopSceneEventGraphs();const n=this.containerInstance.get(r);n.setMuted(!0),n.dispose();for(const e of[...s.actors])s.removeActor(e);this.containerInstance.get(a).stop(),this.containerInstance.get(o).dispose(),this.containerInstance.get(w).stop(),this.containerInstance.reset(),this.shutdownStarted.complete()}}/*
|
|
2
2
|
* Copyright (©) 2026 Hology Interactive AB. All rights reserved.
|
|
3
3
|
* See the LICENSE.md file for details.
|
|
4
4
|
*/
|
|
@@ -11,20 +11,34 @@ export declare class AxisInput {
|
|
|
11
11
|
readonly setY: (value: number) => void;
|
|
12
12
|
}
|
|
13
13
|
type Callback = () => void;
|
|
14
|
+
export type ButtonInputMode = 'hold' | 'toggle';
|
|
14
15
|
/**
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
16
|
+
* ButtonInput stores a boolean activation state from key/button press/release events.
|
|
17
|
+
*
|
|
18
|
+
* In hold mode, the input stays active while the key/button is down.
|
|
19
|
+
* In toggle mode, the input flips each time the key/button is released.
|
|
20
|
+
* Start/end callbacks are emitted after activated has changed.
|
|
20
21
|
*/
|
|
21
|
-
export declare class
|
|
22
|
+
export declare class ButtonInput {
|
|
23
|
+
mode: ButtonInputMode;
|
|
22
24
|
private readonly emitter;
|
|
23
25
|
activated: boolean;
|
|
26
|
+
constructor(mode?: ButtonInputMode, activated?: boolean);
|
|
27
|
+
setActivated(active: boolean): void;
|
|
24
28
|
readonly toggle: (active: boolean) => void;
|
|
25
29
|
onStart(cb: Callback): void;
|
|
26
30
|
onEnd(cb: Callback): void;
|
|
27
31
|
}
|
|
32
|
+
/**
|
|
33
|
+
* ActionInput is for activating state while holding down a key.
|
|
34
|
+
* Example use case:
|
|
35
|
+
* - Sprinting temporarily
|
|
36
|
+
* - Jump
|
|
37
|
+
* - Shoot
|
|
38
|
+
*/
|
|
39
|
+
export declare class ActionInput extends ButtonInput {
|
|
40
|
+
constructor(activated?: boolean);
|
|
41
|
+
}
|
|
28
42
|
/**
|
|
29
43
|
* ToggleInput will be activated after a keypress. It is used
|
|
30
44
|
* for state that should be activated or deactivated without continuously
|
|
@@ -34,21 +48,12 @@ export declare class ActionInput {
|
|
|
34
48
|
* A ToggleInput may be for something slower paced or for something that should
|
|
35
49
|
* persist longer.
|
|
36
50
|
*
|
|
37
|
-
*
|
|
51
|
+
* Example use case:
|
|
38
52
|
* - Switch between running to normal walking speed.
|
|
39
53
|
* - Turning on a flash light.
|
|
40
54
|
*/
|
|
41
|
-
export declare class ToggleInput {
|
|
42
|
-
private readonly emitter;
|
|
43
|
-
activated: boolean;
|
|
55
|
+
export declare class ToggleInput extends ButtonInput {
|
|
44
56
|
constructor(activated?: boolean);
|
|
45
|
-
/**
|
|
46
|
-
* When called with true, does nothing if already activated.
|
|
47
|
-
* When called with false, toggles the state and emits the appropriate event.
|
|
48
|
-
*/
|
|
49
|
-
readonly toggle: (active: boolean) => void;
|
|
50
|
-
onStart(cb: Callback): void;
|
|
51
|
-
onEnd(cb: Callback): void;
|
|
52
57
|
}
|
|
53
58
|
export declare class RotationInput {
|
|
54
59
|
readonly rotation: Euler;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{Euler as t,Vector2 as i}from"three";import{ArrayMap as s}from"../../utils/collections.js";import{clamp as
|
|
1
|
+
import{Euler as t,Vector2 as i}from"three";import{ArrayMap as s}from"../../utils/collections.js";import{clamp as o}from"../../utils/math.js";export class AxisInput{constructor(){this.vector=new i,this.togglePositiveY=t=>{this.vector.y=t?1:Math.min(this.vector.y,0)},this.toggleNegativeY=t=>{this.vector.y=t?-1:Math.max(this.vector.y,0)},this.togglePositiveX=t=>{this.vector.x=t?1:Math.min(this.vector.x,0)},this.toggleNegativeX=t=>{this.vector.x=t?-1:Math.max(this.vector.x,0)},this.setX=t=>{this.vector.x=t},this.setY=t=>{this.vector.y=t}}get horizontal(){return this.vector.x}get vertical(){return this.vector.y}}class e{constructor(){this.map=new s}emit(t){this.map.get(t).forEach(t=>t())}add(t,i){this.map.push(t,i)}}export class ButtonInput{constructor(t="hold",i=!1){this.mode=t,this.emitter=new e,this.activated=!1,this.toggle=t=>{if("toggle"!==this.mode)this.setActivated(t);else{if(t)return;this.setActivated(!this.activated)}},this.activated=i}setActivated(t){t!==this.activated&&(this.activated=t,this.activated?this.emitter.emit("start"):this.emitter.emit("end"))}onStart(t){this.emitter.add("start",t)}onEnd(t){this.emitter.add("end",t)}}export class ActionInput extends ButtonInput{constructor(t=!1){super("hold",t)}}export class ToggleInput extends ButtonInput{constructor(t=!1){super("toggle",t)}}const h=2*Math.PI;export class RotationInput{constructor(){this.rotation=new t,this.rotateX=t=>{this.rotation.x=(this.rotation.x+t)%h},this.rotateY=t=>{this.rotation.y=(this.rotation.y+t)%h},this.rotateZ=t=>{this.rotation.z=(this.rotation.z+t)%h}}}export class RestrictedRotationInput extends RotationInput{constructor(i=-1/0,s=1/0,e=-1/0,h=1/0,r=-1/0,a=1/0){super(),this.minX=i,this.maxX=s,this.minY=e,this.maxY=h,this.minZ=r,this.maxZ=a,this.rotation=new t,this.rotateX=t=>{this.rotation.x=o(this.rotation.x+t,this.minX,this.maxX)},this.rotateY=t=>{this.rotation.y=o(this.rotation.y+t,this.minY,this.maxY)},this.rotateZ=t=>{this.rotation.z=o(this.rotation.z+t,this.minZ,this.maxZ)}}}export class DecimalInput{constructor(t=0,i,s){this.min=i,this.max=s,this.increment=t=>{this.value=o(this.value+t,this.min,this.max)},this.set=t=>{this.value=t},this.value=t}}/*
|
|
2
2
|
* Copyright (©) 2026 Hology Interactive AB. All rights reserved.
|
|
3
3
|
* See the LICENSE.md file for details.
|
|
4
4
|
*/
|