@hology/core 0.0.193 → 0.0.195
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 +5 -0
- package/dist/effects/sequence/index.js +1 -1
- package/dist/effects/sequence/sequence-action.d.ts +2 -1
- package/dist/effects/sequence/sequence-actor.d.ts +9 -0
- package/dist/effects/sequence/sequence-actor.js +1 -1
- package/dist/effects/sequence/sequence-animation-retiming.d.ts +15 -0
- package/dist/effects/sequence/sequence-animation-retiming.js +4 -0
- package/dist/effects/sequence/sequence-data.d.ts +48 -2
- package/dist/effects/sequence/sequence-data.js +1 -1
- package/dist/effects/sequence/sequence-definitions.d.ts +53 -0
- package/dist/effects/sequence/sequence-definitions.js +4 -0
- package/dist/effects/sequence/sequence-event.d.ts +24 -1
- package/dist/effects/sequence/sequence-event.js +1 -1
- package/dist/effects/sequence/sequence-locator.d.ts +14 -0
- package/dist/effects/sequence/sequence-locator.js +4 -0
- package/dist/effects/sequence/sequence-ops.d.ts +48 -0
- package/dist/effects/sequence/sequence-ops.js +4 -0
- package/dist/effects/sequence/sequence-player.d.ts +37 -3
- package/dist/effects/sequence/sequence-player.js +1 -1
- package/dist/effects/sequence/sequence-value-lane.d.ts +21 -0
- package/dist/effects/sequence/sequence-value-lane.js +4 -0
- package/dist/gameplay/actors/builtin/components/character/character-animation.d.ts +1 -0
- package/dist/gameplay/actors/builtin/components/character/character-animation.js +1 -1
- package/dist/gameplay/actors/builtin/components/character/character-movement.js +1 -1
- package/dist/gameplay/actors/builtin/post-process-volume-actor.d.ts +25 -1
- package/dist/gameplay/actors/builtin/post-process-volume-actor.js +1 -1
- package/dist/gameplay/index.d.ts +1 -0
- package/dist/gameplay/index.js +1 -1
- package/dist/gameplay/initiate.d.ts +4 -0
- package/dist/gameplay/initiate.js +1 -1
- package/dist/gameplay/services/game-time-scheduler.d.ts +25 -0
- package/dist/gameplay/services/game-time-scheduler.js +4 -0
- package/dist/gameplay/services/render.d.ts +11 -2
- package/dist/gameplay/services/render.js +1 -1
- package/dist/rendering/color-pass.d.ts +62 -7
- package/dist/rendering/color-pass.js +1 -1
- package/dist/rendering.d.ts +25 -0
- package/dist/rendering.js +1 -1
- package/dist/scene/custom-param-deserialize.d.ts +18 -0
- package/dist/scene/custom-param-deserialize.js +4 -0
- package/dist/scene/materializer.d.ts +1 -0
- package/dist/scene/materializer.js +1 -1
- package/dist/shader/builtin/landscape-composite-shader.js +1 -1
- package/dist/shader/parameter.d.ts +5 -0
- package/dist/test/post-process-color-grading.test.d.ts +2 -0
- package/dist/test/post-process-color-grading.test.js +4 -0
- package/dist/test/sequence-animation-retiming.test.d.ts +2 -0
- package/dist/test/sequence-animation-retiming.test.js +4 -0
- package/package.json +2 -2
- package/tsconfig.tsbuildinfo +1 -1
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
export * from './sequence-data.js';
|
|
2
|
+
export * from './sequence-locator.js';
|
|
3
|
+
export * from './sequence-definitions.js';
|
|
2
4
|
export * from './sequence-event.js';
|
|
5
|
+
export * from './sequence-ops.js';
|
|
3
6
|
export * from './sequence-player.js';
|
|
4
7
|
export * from './sequence-actor.js';
|
|
5
8
|
export * from './sequencer.js';
|
|
6
9
|
export * from './sequence-action.js';
|
|
7
10
|
export * from './audio-parameters.js';
|
|
11
|
+
export * from './sequence-value-lane.js';
|
|
12
|
+
export * from './sequence-animation-retiming.js';
|
|
8
13
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export*from"./sequence-data.js";export*from"./sequence-event.js";export*from"./sequence-player.js";export*from"./sequence-actor.js";export*from"./sequencer.js";export*from"./sequence-action.js";export*from"./audio-parameters.js";/*
|
|
1
|
+
export*from"./sequence-data.js";export*from"./sequence-locator.js";export*from"./sequence-definitions.js";export*from"./sequence-event.js";export*from"./sequence-ops.js";export*from"./sequence-player.js";export*from"./sequence-actor.js";export*from"./sequencer.js";export*from"./sequence-action.js";export*from"./audio-parameters.js";export*from"./sequence-value-lane.js";export*from"./sequence-animation-retiming.js";/*
|
|
2
2
|
* Copyright (©) 2026 Hology Interactive AB. All rights reserved.
|
|
3
3
|
* See the LICENSE.md file for details.
|
|
4
4
|
*/
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { SequenceRole } from './sequence-data.js';
|
|
2
2
|
import { BaseActor } from '../../gameplay/actors/actor.js';
|
|
3
3
|
import { Object3D } from 'three';
|
|
4
|
+
import { SequenceLocatorReader } from './sequence-locator.js';
|
|
4
5
|
/**
|
|
5
6
|
* SequenceAction is used to play, pause, stop, etc. a sequence.
|
|
6
7
|
*/
|
|
7
|
-
export interface SequenceAction {
|
|
8
|
+
export interface SequenceAction extends SequenceLocatorReader {
|
|
8
9
|
/** Bind a role to a runtime target for dynamic actor binding */
|
|
9
10
|
bindRole(role: SequenceRole, target: BaseActor | Object3D): void;
|
|
10
11
|
play(): void;
|
|
@@ -5,6 +5,7 @@ import { Asset } from '../../scene/model.js';
|
|
|
5
5
|
import { Subject } from 'rxjs';
|
|
6
6
|
import { Object3D } from 'three';
|
|
7
7
|
import { SequenceAction } from './sequence-action.js';
|
|
8
|
+
import { SequenceLocatorSnapshot } from './sequence-locator.js';
|
|
8
9
|
/**
|
|
9
10
|
* SequenceActor is an actor that plays a sequence in the world.
|
|
10
11
|
*
|
|
@@ -70,6 +71,12 @@ export declare class SequenceActor extends BaseActor implements SequenceAction {
|
|
|
70
71
|
*/
|
|
71
72
|
get externalTimeControl(): boolean;
|
|
72
73
|
set externalTimeControl(value: boolean);
|
|
74
|
+
/**
|
|
75
|
+
* When true, editor-only sequence events are allowed to fire.
|
|
76
|
+
* This should only be enabled for editor preview playback.
|
|
77
|
+
*/
|
|
78
|
+
get inEditor(): boolean;
|
|
79
|
+
set inEditor(value: boolean);
|
|
73
80
|
readonly onComplete: Subject<void>;
|
|
74
81
|
readonly onLoop: Subject<number>;
|
|
75
82
|
private player;
|
|
@@ -105,6 +112,8 @@ export declare class SequenceActor extends BaseActor implements SequenceAction {
|
|
|
105
112
|
* Bind a scene object by ID to a target
|
|
106
113
|
*/
|
|
107
114
|
bindObject(objectId: string, target: Object3D | BaseActor): void;
|
|
115
|
+
getLocator(bindingId: string): SequenceLocatorSnapshot | null;
|
|
116
|
+
getLocators(bindingId: string): SequenceLocatorSnapshot[];
|
|
108
117
|
/**
|
|
109
118
|
* Start or resume playback
|
|
110
119
|
*/
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{__decorate as e,__metadata as t}from"tslib";import{Actor as s,BaseActor as r}from"../../gameplay/actors/actor.js";import{inject as
|
|
1
|
+
import{__decorate as e,__metadata as t}from"tslib";import{Actor as s,BaseActor as r}from"../../gameplay/actors/actor.js";import{inject as i}from"../../gameplay/inject.js";import{ViewController as a}from"../../gameplay/services/render.js";import{AssetLoader as o}from"../../gameplay/services/asset-loader.js";import{World as l}from"../../gameplay/services/world.js";import{ActorFactory as p}from"../../gameplay/actors/factory.js";import{VfxService as n}from"../../effects/vfx/vfx-service.js";import{Parameter as h}from"../../shader/parameter.js";import{createSequenceData as c}from"./sequence-data.js";import{SequencePlayer as y,SequencePlaybackState as d}from"./sequence-player.js";import{Subject as m,takeUntil as u}from"rxjs";let f=class extends r{constructor(){super(...arguments),this.sequenceData=c(),this.sequenceAssetId=null,this.onComplete=new m,this.onLoop=new m,this.player=new y,this.viewController=i(a),this.assetLoader=i(o),this.world=i(l),this.actorFactory=i(p),this.vfxService=i(n),this.sourceAsset=null}get timescale(){return this.player.timescale}set timescale(e){this.player.timescale=e}get loop(){return this.player.loop}set loop(e){this.player.loop=e}get state(){return this.player.state}get time(){return this.player.time}get duration(){return this.player.duration}get paused(){return this.player.state===d.Paused}get externalTimeControl(){return this.player.externalTimeControl}set externalTimeControl(e){this.player.externalTimeControl=e}get inEditor(){return this.player.inEditor}set inEditor(e){this.player.inEditor=e}async onInit(){this.player.setWorld(this.world),this.player.setAudioListener(this.viewController.audioListener),this.player.setAssetLoader(this.assetLoader),this.player.setActorFactory(this.actorFactory),this.player.setVfxService(this.vfxService),this.viewController.onUpdate(this).pipe(u(this.disposed)).subscribe(e=>this.player.update(e)),this.player.onComplete.pipe(u(this.disposed)).subscribe(()=>this.onComplete.next()),this.player.onLoop.pipe(u(this.disposed)).subscribe(e=>this.onLoop.next(e)),this.sequenceAssetId?await this.loadFromAssetId(this.sequenceAssetId):this.sequenceData&&this.player.load(this.sequenceData)}async loadFromAsset(e){if("sequence"!==e.type)throw new Error(`Asset must be a sequence asset but is ${e.type}`);this.sourceAsset=e,this.sourceAsset.sequence&&(this.sequenceData=this.sourceAsset.sequence,this.player.load(this.sequenceData))}async loadFromAssetId(e){const t=await this.assetLoader.getAsset(e);t&&await this.loadFromAsset(t)}setSequenceData(e){this.sequenceData=e,this.player.load(e)}bindRole(e,t){this.player.bindRole(e,t)}bindObject(e,t){this.player.bindObject(e,t)}getLocator(e){return this.player.getLocator(e)}getLocators(e){return this.player.getLocators(e)}play(){this.player.play()}pause(){this.player.pause()}stop(){this.player.stop()}restart(){this.player.restart()}seek(e){this.player.seek(e)}refreshAsset(e){this.player.refreshAsset(e)}onUpdate(e){}onEndPlay(){this.player.dispose()}dispose(){this.world.removeActor(this)}};e([h({label:"Sequence Data"}),t("design:type",Object)],f.prototype,"sequenceData",void 0),f=e([s()],f);export{f as SequenceActor};/*
|
|
2
2
|
* Copyright (©) 2026 Hology Interactive AB. All rights reserved.
|
|
3
3
|
* See the LICENSE.md file for details.
|
|
4
4
|
*/
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import * as THREE from 'three';
|
|
2
|
+
import { AnimationClipInstance, AnimationClipRetiming, AnimationClipRetimingMode, AnimationClipRetimingPoint } from './sequence-data.js';
|
|
3
|
+
export declare const MAX_ANIMATION_CLIP_RETIME_POINTS = 3;
|
|
4
|
+
export interface AnimationClipRetimingControlPoint extends AnimationClipRetimingPoint {
|
|
5
|
+
implicit: boolean;
|
|
6
|
+
}
|
|
7
|
+
export declare function getAnimationClipRetimingMode(retiming: AnimationClipRetiming | null | undefined): AnimationClipRetimingMode;
|
|
8
|
+
export declare function isAnimationClipUsingRetiming(clip: Pick<AnimationClipInstance, 'retiming'>): boolean;
|
|
9
|
+
export declare function normalizeAnimationClipRetiming(retiming: AnimationClipRetiming | null | undefined): AnimationClipRetiming;
|
|
10
|
+
export declare function getAnimationClipRetimingControlPoints(retiming: AnimationClipRetiming | null | undefined): AnimationClipRetimingControlPoint[];
|
|
11
|
+
export declare function evaluateAnimationClipSourceProgress(retiming: AnimationClipRetiming | null | undefined, clipProgress: number): number;
|
|
12
|
+
export declare function evaluateAnimationClipOutputProgress(retiming: AnimationClipRetiming | null | undefined, sourceProgress: number): number;
|
|
13
|
+
export declare function getAnimationClipRetimingSignature(clip: Pick<AnimationClipInstance, 'duration' | 'clipStartOffset' | 'clipEndOffset' | 'retiming' | 'rootMotion'>): string;
|
|
14
|
+
export declare function buildRetimedAnimationClip(sourceClip: THREE.AnimationClip, clip: AnimationClipInstance): THREE.AnimationClip;
|
|
15
|
+
//# sourceMappingURL=sequence-animation-retiming.d.ts.map
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import*as t from"three";const i=1e-4;export const MAX_ANIMATION_CLIP_RETIME_POINTS=3;export function getAnimationClipRetimingMode(t){return t?.mode??"uniform"}export function isAnimationClipUsingRetiming(t){return"uniform"!==getAnimationClipRetimingMode(t.retiming)}export function normalizeAnimationClipRetiming(t){const e=getAnimationClipRetimingMode(t),r="impact"===e?1:3,s=(Array.isArray(t?.points)?t.points:[]).map((t,i)=>({id:"string"==typeof t?.id&&t.id.trim().length>0?t.id:`retime-${i}`,clipProgress:n(t?.clipProgress,.5),sourceProgress:n(t?.sourceProgress,.5)})).sort((t,i)=>t.clipProgress-i.clipProgress||t.sourceProgress-i.sourceProgress).slice(0,r),u=[];let c=0,l=0;for(let t=0;t<s.length;t++){const e=s[t],n=s.length-t-1,r=1-i*(n+1),m=o(e.clipProgress,c+i,r),a=o(e.sourceProgress,l+i,r);u.push({id:e.id,clipProgress:m,sourceProgress:a}),c=m,l=a}return{mode:e,points:u}}export function getAnimationClipRetimingControlPoints(t){return[{id:"retime-start",clipProgress:0,sourceProgress:0,implicit:!0},...normalizeAnimationClipRetiming(t).points.map(t=>({...t,implicit:!1})),{id:"retime-end",clipProgress:1,sourceProgress:1,implicit:!0}]}export function evaluateAnimationClipSourceProgress(t,i){return e(getAnimationClipRetimingControlPoints(t),r(i),"clipProgress","sourceProgress")}export function evaluateAnimationClipOutputProgress(t,i){return e(getAnimationClipRetimingControlPoints(t),r(i),"sourceProgress","clipProgress")}export function getAnimationClipRetimingSignature(t){const i=normalizeAnimationClipRetiming(t.retiming);return JSON.stringify({duration:u(t.duration),clipStartOffset:u(t.clipStartOffset),clipEndOffset:u(t.clipEndOffset),rootMotion:t.rootMotion,retiming:i})}export function buildRetimedAnimationClip(n,u){const l=Math.max(0,n.duration),m=o(u.clipStartOffset,0,l),a=o(l-u.clipEndOffset,m,l),p=Math.max(0,a-m),g=Math.max(i,u.duration),f=getAnimationClipRetimingControlPoints(u.retiming),P=n.tracks.map(t=>{const n=t.clone(),o=t.getValueSize(),u=function(t,n,o,u,c,l,m){const a=function(t,i,e){const n=new Set([s(i),s(e)]);for(const r of t.times)r>=i&&r<=e&&n.add(s(r));return[...n].sort((t,i)=>t-i)}(t,n,o);if(0===a.length)return{times:[],values:[]};const p=t.createInterpolant(),g=[],f=[];for(const t of a){const o=e(l,u<=i?0:r((t-n)/u),"sourceProgress","clipProgress");g.push(s(c*o));const a=p.evaluate(t);if(1===m&&!Array.isArray(a)&&"object"!=typeof a){f.push(a);continue}const P=Array.from(a);for(let t=0;t<m;t++)f.push(P[t]??P[P.length-1]??0)}if(1===g.length&&c>i){g.push(c);for(let t=0;t<m;t++)f.push(f[t])}return{times:g,values:f}}(t,m,a,p,g,f,o);if(0===u.times.length)return null;const l=n;return l.times=c(l.TimeBufferType,u.times),l.values=c(l.ValueBufferType,u.values),l}).filter(Boolean);return new t.AnimationClip(n.name,g,P,n.blendMode)}function e(t,e,n,o){const s=r(e);for(let e=1;e<t.length;e++){const u=t[e-1],c=t[e],l=c[n];if(s>l&&e<t.length-1)continue;const m=u[n],a=u[o],p=c[o],g=l-m;if(g<=i)return r(p);const f=r((s-m)/g);return r(a+(p-a)*f)}return r(t[t.length-1][o])}function n(t,i){return"number"==typeof t&&Number.isFinite(t)?t:i}function r(t){return o(t,0,1)}function o(t,i,e){return Math.min(Math.max(t,i),e)}function s(t){return Math.round(1e6*t)/1e6}function u(t){return Math.round(1e5*t)/1e5}function c(t,i){return t===Array?i.slice():new t(i)}/*
|
|
2
|
+
* Copyright (©) 2026 Hology Interactive AB. All rights reserved.
|
|
3
|
+
* See the LICENSE.md file for details.
|
|
4
|
+
*/
|
|
@@ -35,7 +35,7 @@ export declare enum SequenceRole {
|
|
|
35
35
|
/** Secondary actor (e.g., companion, summoned entity) */
|
|
36
36
|
Secondary = "secondary"
|
|
37
37
|
}
|
|
38
|
-
export type SequenceTrackType = 'object' | 'camera' | 'audio' | 'vfx' | 'spawn' | 'group';
|
|
38
|
+
export type SequenceTrackType = 'object' | 'locator' | 'camera' | 'audio' | 'vfx' | 'spawn' | 'group';
|
|
39
39
|
/**
|
|
40
40
|
* Base interface for all track types
|
|
41
41
|
*/
|
|
@@ -75,6 +75,15 @@ export interface ObjectTrack extends BaseTrack {
|
|
|
75
75
|
*/
|
|
76
76
|
role: SequenceRole | null;
|
|
77
77
|
}
|
|
78
|
+
/**
|
|
79
|
+
* Locator track - a lightweight named transform source owned by the sequence.
|
|
80
|
+
* Useful for authored spawn points, attachment pivots, and gameplay query points.
|
|
81
|
+
*/
|
|
82
|
+
export interface LocatorTrack extends BaseTrack {
|
|
83
|
+
type: 'locator';
|
|
84
|
+
/** Optional gameplay-facing identifier used for runtime lookup. */
|
|
85
|
+
bindingId?: string;
|
|
86
|
+
}
|
|
78
87
|
/**
|
|
79
88
|
* Camera track - controls a sequence-owned camera
|
|
80
89
|
*/
|
|
@@ -147,7 +156,7 @@ export interface GroupTrack extends BaseTrack {
|
|
|
147
156
|
/** Child tracks within this group */
|
|
148
157
|
childTracks: SequenceTrack[];
|
|
149
158
|
}
|
|
150
|
-
export type SequenceTrack = ObjectTrack | CameraTrack | AudioTrack | VfxTrack | SpawnTrack | GroupTrack;
|
|
159
|
+
export type SequenceTrack = ObjectTrack | LocatorTrack | CameraTrack | AudioTrack | VfxTrack | SpawnTrack | GroupTrack;
|
|
151
160
|
export type SubTrackType = 'transform' | 'animation' | 'property' | 'material' | 'visibility' | 'event' | 'audioParameter';
|
|
152
161
|
/**
|
|
153
162
|
* Base interface for sub-tracks
|
|
@@ -237,6 +246,25 @@ export interface AudioParameterSubTrack extends BaseSubTrack {
|
|
|
237
246
|
keyframes: PropertyKeyframe[];
|
|
238
247
|
}
|
|
239
248
|
export type SubTrack = TransformSubTrack | AnimationSubTrack | PropertySubTrack | MaterialSubTrack | VisibilitySubTrack | EventSubTrack | AudioParameterSubTrack;
|
|
249
|
+
export type SequenceValueSubTrack = PropertySubTrack | MaterialSubTrack | AudioParameterSubTrack;
|
|
250
|
+
export type SequenceKeyframeSubTrack = TransformSubTrack | PropertySubTrack | MaterialSubTrack | VisibilitySubTrack | AudioParameterSubTrack;
|
|
251
|
+
export type SequenceDirectClipTrack = AudioTrack | VfxTrack | SpawnTrack;
|
|
252
|
+
export type SequenceAnimationHostTrack = ObjectTrack | CameraTrack | SpawnTrack;
|
|
253
|
+
export type AnimationClipRetimingMode = 'uniform' | 'impact' | 'advanced';
|
|
254
|
+
export interface AnimationClipRetimingPoint {
|
|
255
|
+
/** Unique identifier */
|
|
256
|
+
id: string;
|
|
257
|
+
/** Progress through the placed sequence clip (0-1) */
|
|
258
|
+
clipProgress: number;
|
|
259
|
+
/** Progress through the trimmed source clip span (0-1) */
|
|
260
|
+
sourceProgress: number;
|
|
261
|
+
}
|
|
262
|
+
export interface AnimationClipRetiming {
|
|
263
|
+
/** Retiming UI mode */
|
|
264
|
+
mode: AnimationClipRetimingMode;
|
|
265
|
+
/** Internal control points. Endpoints (0,0) and (1,1) are implicit. */
|
|
266
|
+
points: AnimationClipRetimingPoint[];
|
|
267
|
+
}
|
|
240
268
|
/**
|
|
241
269
|
* Interpolation mode for keyframes
|
|
242
270
|
*/
|
|
@@ -302,6 +330,8 @@ export interface AnimationClipInstance {
|
|
|
302
330
|
playbackRate: number;
|
|
303
331
|
/** Fade in duration */
|
|
304
332
|
fadeInDuration: number;
|
|
333
|
+
/** Optional retiming controls for redistributing time within the clip */
|
|
334
|
+
retiming?: AnimationClipRetiming;
|
|
305
335
|
/** Blend out duration */
|
|
306
336
|
/** Whether this animation has root motion enabled */
|
|
307
337
|
rootMotion: boolean;
|
|
@@ -379,6 +409,8 @@ export interface SequenceEventData {
|
|
|
379
409
|
id: string;
|
|
380
410
|
/** Time in seconds to trigger the event */
|
|
381
411
|
time: number;
|
|
412
|
+
/** When true, the event only fires during editor playback/preview */
|
|
413
|
+
editorOnly?: boolean;
|
|
382
414
|
/** Name of the function to call on the target */
|
|
383
415
|
functionName: string;
|
|
384
416
|
/** Arguments to pass to the function */
|
|
@@ -432,6 +464,14 @@ export declare function createAudioParameterSubTrack(parameter?: AudioParameterI
|
|
|
432
464
|
* Creates a new property sub-track
|
|
433
465
|
*/
|
|
434
466
|
export declare function createPropertySubTrack(propertyPath?: string, propertyType?: SerializedParamType): PropertySubTrack;
|
|
467
|
+
/**
|
|
468
|
+
* Creates a new material sub-track
|
|
469
|
+
*/
|
|
470
|
+
export declare function createMaterialSubTrack(uniformName?: string, uniformType?: SerializedParamType, materialSlot?: string | number): MaterialSubTrack;
|
|
471
|
+
/**
|
|
472
|
+
* Creates a new visibility sub-track
|
|
473
|
+
*/
|
|
474
|
+
export declare function createVisibilitySubTrack(name?: string): VisibilitySubTrack;
|
|
435
475
|
/**
|
|
436
476
|
* Creates a new transform keyframe
|
|
437
477
|
*/
|
|
@@ -444,6 +484,8 @@ export declare function createPropertyKeyframe(time: number, value?: CustomParam
|
|
|
444
484
|
* Creates a new animation clip instance
|
|
445
485
|
*/
|
|
446
486
|
export declare function createAnimationClipInstance(animationClipAssetId: AssetId | null, startTime: number, duration: number): AnimationClipInstance;
|
|
487
|
+
export declare function createAnimationClipRetimingPoint(clipProgress?: number, sourceProgress?: number): AnimationClipRetimingPoint;
|
|
488
|
+
export declare function createAnimationClipRetiming(mode?: AnimationClipRetimingMode, points?: AnimationClipRetimingPoint[]): AnimationClipRetiming;
|
|
447
489
|
/**
|
|
448
490
|
* Creates a new audio clip instance
|
|
449
491
|
*/
|
|
@@ -460,4 +502,8 @@ export declare function createEventSubTrack(name?: string): EventSubTrack;
|
|
|
460
502
|
* Creates a new sequence event
|
|
461
503
|
*/
|
|
462
504
|
export declare function createSequenceEventData(time: number, functionName?: string): SequenceEventData;
|
|
505
|
+
/**
|
|
506
|
+
* Creates a new locator track
|
|
507
|
+
*/
|
|
508
|
+
export declare function createLocatorTrack(name?: string): LocatorTrack;
|
|
463
509
|
//# sourceMappingURL=sequence-data.d.ts.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{SerializedParamType as e}from"../../scene/model.js";import{randomString as t}from"../../utils/math.js";import{getAudioParameterDefinition as r}from"./audio-parameters.js";export class Sequence{constructor(e){this.data=e}}export var SequenceRole;!function(e){e.Self="self",e.Target="target",e.Target2="target2",e.Target3="target3",e.Secondary="secondary"}(SequenceRole||(SequenceRole={}));export function createSequenceData(){return{duration:5,loop:!1,playbackRate:1,tracks:[]}}export function createObjectTrack(e="Object Track"){return{id:t(),name:e,type:"object",muted:!1,locked:!1,targetId:null,role:null,subTracks:[]}}export function createCameraTrack(e="Camera Track"){return{id:t(),name:e,type:"camera",muted:!1,locked:!1,cameraSettings:{fov:60,near:.1,far:1e3},subTracks:[]}}export function createAudioTrack(e="Audio Track"){return{id:t(),name:e,type:"audio",muted:!1,locked:!1,clips:[],subTracks:[],volume:1,spatial:!1}}export function createVfxTrack(e="VFX Track"){return{id:t(),name:e,type:"vfx",muted:!1,locked:!1,clips:[],position:[0,0,0],rotation:[0,0,0],scale:[1,1,1],subTracks:[]}}export function createSpawnTrack(e="Spawn Track"){return{id:t(),name:e,type:"spawn",muted:!1,locked:!1,spawnType:"mesh",role:null,clips:[],subTracks:[]}}export function createSpawnClipInstance(e,r){return{id:t(),startTime:e,duration:r}}export function createGroupTrack(e="Group"){return{id:t(),name:e,type:"group",muted:!1,locked:!1,collapsed:!1,childTracks:[],subTracks:[]}}export function createTransformSubTrack(){return{id:t(),name:"Transform",type:"transform",muted:!1,components:{position:!0,rotation:!0,scale:!0},keyframes:[]}}export function createAnimationSubTrack(e="Animation"){return{id:t(),name:e,type:"animation",muted:!1,clips:[]}}export function createAudioParameterSubTrack(e="volume"){const a=r(e);return{id:t(),name:a.displayName,type:"audioParameter",muted:!1,parameter:e,keyframes:[]}}export function createPropertySubTrack(r="",a=e.Number){return{id:t(),name:r||"Property",type:"property",muted:!1,propertyPath:r,propertyType:a,keyframes:[]}}export function createTransformKeyframe(e){return{id:t(),time:e,position:[0,0,0],rotation:[0,0,0],scale:[1,1,1],interpolation:"cubic"}}export function createPropertyKeyframe(r,a={type:e.Number,value:0}){return{id:t(),time:r,value:a,interpolation:"linear"}}export function createAnimationClipInstance(e,r,a){return{id:t(),animationClipAssetId:e,startTime:r,duration:a,clipStartOffset:0,clipEndOffset:0,playbackRate:1,fadeInDuration:.2,rootMotion:!1}}export function createAudioClipInstance(e,r,a){return{id:t(),audioAssetId:e,startTime:r,duration:a,clipStartOffset:0,playbackRate:1,volume:1,fadeInDuration:0,fadeOutDuration:0,volumeRandomization:0,pitchRandomization:0}}export function createVfxClipInstance(e,r,a){return{id:t(),vfxAssetId:e,startTime:r,duration:a,endBehavior:"finish",expireWithinSeconds:.25}}export function createEventSubTrack(e="Events"){return{id:t(),name:e,type:"event",muted:!1,events:[]}}export function createSequenceEventData(e,r=""){return{id:t(),time:e,functionName:r,arguments:[]}}/*
|
|
1
|
+
import{SerializedParamType as e}from"../../scene/model.js";import{randomString as t}from"../../utils/math.js";import{getAudioParameterDefinition as r}from"./audio-parameters.js";export class Sequence{constructor(e){this.data=e}}export var SequenceRole;!function(e){e.Self="self",e.Target="target",e.Target2="target2",e.Target3="target3",e.Secondary="secondary"}(SequenceRole||(SequenceRole={}));export function createSequenceData(){return{duration:5,loop:!1,playbackRate:1,tracks:[]}}export function createObjectTrack(e="Object Track"){return{id:t(),name:e,type:"object",muted:!1,locked:!1,targetId:null,role:null,subTracks:[]}}export function createCameraTrack(e="Camera Track"){return{id:t(),name:e,type:"camera",muted:!1,locked:!1,cameraSettings:{fov:60,near:.1,far:1e3},subTracks:[]}}export function createAudioTrack(e="Audio Track"){return{id:t(),name:e,type:"audio",muted:!1,locked:!1,clips:[],subTracks:[],volume:1,spatial:!1}}export function createVfxTrack(e="VFX Track"){return{id:t(),name:e,type:"vfx",muted:!1,locked:!1,clips:[],position:[0,0,0],rotation:[0,0,0],scale:[1,1,1],subTracks:[]}}export function createSpawnTrack(e="Spawn Track"){return{id:t(),name:e,type:"spawn",muted:!1,locked:!1,spawnType:"mesh",role:null,clips:[],subTracks:[]}}export function createSpawnClipInstance(e,r){return{id:t(),startTime:e,duration:r}}export function createGroupTrack(e="Group"){return{id:t(),name:e,type:"group",muted:!1,locked:!1,collapsed:!1,childTracks:[],subTracks:[]}}export function createTransformSubTrack(){return{id:t(),name:"Transform",type:"transform",muted:!1,components:{position:!0,rotation:!0,scale:!0},keyframes:[]}}export function createAnimationSubTrack(e="Animation"){return{id:t(),name:e,type:"animation",muted:!1,clips:[]}}export function createAudioParameterSubTrack(e="volume"){const a=r(e);return{id:t(),name:a.displayName,type:"audioParameter",muted:!1,parameter:e,keyframes:[]}}export function createPropertySubTrack(r="",a=e.Number){return{id:t(),name:r||"Property",type:"property",muted:!1,propertyPath:r,propertyType:a,keyframes:[]}}export function createMaterialSubTrack(r="",a=e.Number,n=0){return{id:t(),name:r||"Material",type:"material",muted:!1,materialSlot:n,uniformName:r,uniformType:a,keyframes:[]}}export function createVisibilitySubTrack(e="Visibility"){return{id:t(),name:e,type:"visibility",muted:!1,keyframes:[]}}export function createTransformKeyframe(e){return{id:t(),time:e,position:[0,0,0],rotation:[0,0,0],scale:[1,1,1],interpolation:"cubic"}}export function createPropertyKeyframe(r,a={type:e.Number,value:0}){return{id:t(),time:r,value:a,interpolation:"linear"}}export function createAnimationClipInstance(e,r,a){return{id:t(),animationClipAssetId:e,startTime:r,duration:a,clipStartOffset:0,clipEndOffset:0,playbackRate:1,fadeInDuration:.2,retiming:void 0,rootMotion:!1}}export function createAnimationClipRetimingPoint(e=.35,r=.55){return{id:t(),clipProgress:e,sourceProgress:r}}export function createAnimationClipRetiming(e="impact",t=("uniform"===e?[]:[createAnimationClipRetimingPoint()])){return{mode:e,points:t}}export function createAudioClipInstance(e,r,a){return{id:t(),audioAssetId:e,startTime:r,duration:a,clipStartOffset:0,playbackRate:1,volume:1,fadeInDuration:0,fadeOutDuration:0,volumeRandomization:0,pitchRandomization:0}}export function createVfxClipInstance(e,r,a){return{id:t(),vfxAssetId:e,startTime:r,duration:a,endBehavior:"finish",expireWithinSeconds:.25}}export function createEventSubTrack(e="Events"){return{id:t(),name:e,type:"event",muted:!1,events:[]}}export function createSequenceEventData(e,r=""){return{id:t(),time:e,editorOnly:!1,functionName:r,arguments:[]}}export function createLocatorTrack(e="Locator"){return{id:t(),name:e,type:"locator",muted:!1,locked:!1,subTracks:[]}}/*
|
|
2
2
|
* Copyright (©) 2026 Hology Interactive AB. All rights reserved.
|
|
3
3
|
* See the LICENSE.md file for details.
|
|
4
4
|
*/
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { AnimationClipInstance, SequenceTrack, SequenceTrackType, SubTrack, SubTrackType } from './sequence-data.js';
|
|
2
|
+
import { AudioParameterId } from './audio-parameters.js';
|
|
3
|
+
export type SequenceTrackRuntimeEvaluator = 'object' | 'locator' | 'camera' | 'audio' | 'vfx' | 'spawn' | 'group';
|
|
4
|
+
export type SequenceSubTrackRuntimeEvaluator = 'transform' | 'animation' | 'visibility' | 'parameter' | 'event';
|
|
5
|
+
export type SequenceSubTrackLaneKind = 'keyframes' | 'clips' | 'events';
|
|
6
|
+
type DirectTrackClip = SequenceTrack extends infer TTrack ? TTrack extends {
|
|
7
|
+
clips: Array<infer TClip>;
|
|
8
|
+
} ? TClip : never : never;
|
|
9
|
+
export interface SequenceTrackDefinition<TTrack extends SequenceTrack = SequenceTrack> {
|
|
10
|
+
type: TTrack['type'];
|
|
11
|
+
label: string;
|
|
12
|
+
icon: string;
|
|
13
|
+
runtimeEvaluator: SequenceTrackRuntimeEvaluator;
|
|
14
|
+
createTrack: (startTime?: number, defaultDuration?: number) => TTrack;
|
|
15
|
+
createDirectClip?: (startTime?: number, defaultDuration?: number) => DirectTrackClip;
|
|
16
|
+
allowedSubTrackTypes: readonly SubTrackType[];
|
|
17
|
+
supportsParenting?: boolean;
|
|
18
|
+
exposedInEditor?: boolean;
|
|
19
|
+
}
|
|
20
|
+
export interface SequenceSubTrackDefinition<TSubTrack extends SubTrack = SubTrack> {
|
|
21
|
+
type: TSubTrack['type'];
|
|
22
|
+
label: string;
|
|
23
|
+
icon: string;
|
|
24
|
+
laneKind: SequenceSubTrackLaneKind;
|
|
25
|
+
runtimeEvaluator: SequenceSubTrackRuntimeEvaluator;
|
|
26
|
+
createSubTrack: (options?: {
|
|
27
|
+
parameter?: AudioParameterId;
|
|
28
|
+
}) => TSubTrack;
|
|
29
|
+
createClip?: (startTime?: number, defaultDuration?: number) => AnimationClipInstance;
|
|
30
|
+
supportedTrackTypes: readonly SequenceTrackType[];
|
|
31
|
+
allowMultiple?: boolean;
|
|
32
|
+
exposedInEditor?: boolean;
|
|
33
|
+
valueLane?: {
|
|
34
|
+
kind: 'number' | 'customParam';
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
export interface AudioParameterSubTrackOption {
|
|
38
|
+
parameter: AudioParameterId;
|
|
39
|
+
label: string;
|
|
40
|
+
icon: string;
|
|
41
|
+
}
|
|
42
|
+
export declare const audioParameterSubTrackOptions: AudioParameterSubTrackOption[];
|
|
43
|
+
export declare function getSequenceTrackDefinitions(): SequenceTrackDefinition[];
|
|
44
|
+
export declare function getSequenceSubTrackDefinitions(): SequenceSubTrackDefinition[];
|
|
45
|
+
export declare function getSequenceTrackDefinition(type: SequenceTrackType): SequenceTrackDefinition;
|
|
46
|
+
export declare function getSequenceSubTrackDefinition(type: SubTrackType): SequenceSubTrackDefinition;
|
|
47
|
+
export declare function getEditorSequenceTrackDefinitions(): SequenceTrackDefinition[];
|
|
48
|
+
export declare function getEditorSequenceSubTrackDefinitions(track: SequenceTrack): SequenceSubTrackDefinition[];
|
|
49
|
+
export declare function canTrackAddSubTrack(track: SequenceTrack, type: SubTrackType, options?: {
|
|
50
|
+
parameter?: AudioParameterId;
|
|
51
|
+
}): boolean;
|
|
52
|
+
export {};
|
|
53
|
+
//# sourceMappingURL=sequence-definitions.d.ts.map
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import{createAnimationClipInstance as e,createAnimationSubTrack as a,createAudioClipInstance as r,createAudioParameterSubTrack as t,createAudioTrack as n,createCameraTrack as o,createEventSubTrack as i,createGroupTrack as l,createLocatorTrack as p,createMaterialSubTrack as c,createObjectTrack as u,createPropertySubTrack as s,createSpawnClipInstance as m,createSpawnTrack as d,createTransformSubTrack as T,createVfxClipInstance as b,createVfxTrack as k,createVisibilitySubTrack as y}from"./sequence-data.js";const f=[{type:"object",label:"Object Track",icon:"mdil-hexagon",runtimeEvaluator:"object",createTrack:()=>u(),allowedSubTrackTypes:["transform","animation","property","material","visibility","event"],supportsParenting:!0,exposedInEditor:!1},{type:"locator",label:"Locator",icon:"mdil-map-marker-radius",runtimeEvaluator:"locator",createTrack:()=>p(),allowedSubTrackTypes:["transform"],supportsParenting:!0,exposedInEditor:!0},{type:"camera",label:"Camera Track",icon:"mdil-camcorder",runtimeEvaluator:"camera",createTrack:(r=0,t=2)=>{const n=o(),i=a();return i.clips.push(e(null,r,t)),n.subTracks.push(i),n},allowedSubTrackTypes:["transform","animation","property","event"],exposedInEditor:!0},{type:"audio",label:"Audio Track",icon:"mdil-volume-high",runtimeEvaluator:"audio",createTrack:(e=0,a=2)=>{const t=n();return t.clips.push(r(null,e,a)),t},createDirectClip:(e=0,a=2)=>r(null,e,a),allowedSubTrackTypes:["audioParameter"],supportsParenting:!0,exposedInEditor:!0},{type:"vfx",label:"VFX Track",icon:"mdil-star",runtimeEvaluator:"vfx",createTrack:(e=0,a=2)=>{const r=k();return r.clips.push(b(null,e,a)),r},createDirectClip:(e=0,a=2)=>b(null,e,a),allowedSubTrackTypes:["transform"],supportsParenting:!0,exposedInEditor:!0},{type:"spawn",label:"Spawn Track",icon:"mdil-plus-box",runtimeEvaluator:"spawn",createTrack:(e=0,a=2)=>{const r=d();return r.clips.push(m(e,a)),r},createDirectClip:(e=0,a=2)=>m(e,a),allowedSubTrackTypes:["transform","animation","property","event"],supportsParenting:!0,exposedInEditor:!0},{type:"group",label:"Group",icon:"mdil-folder",runtimeEvaluator:"group",createTrack:()=>l(),allowedSubTrackTypes:[],exposedInEditor:!1}],v=[{type:"transform",label:"Transform",icon:"mdil-move-resize",laneKind:"keyframes",runtimeEvaluator:"transform",createSubTrack:()=>T(),supportedTrackTypes:["object","locator","camera","spawn","vfx"],exposedInEditor:!0},{type:"animation",label:"Animation",icon:"mdil-run",laneKind:"clips",runtimeEvaluator:"animation",createSubTrack:()=>a(),createClip:(a=0,r=2)=>e(null,a,r),supportedTrackTypes:["object","camera","spawn"],exposedInEditor:!0},{type:"property",label:"Property",icon:"mdil-tune",laneKind:"keyframes",runtimeEvaluator:"parameter",createSubTrack:()=>s(),supportedTrackTypes:["object","camera","spawn"],exposedInEditor:!1,valueLane:{kind:"customParam"}},{type:"material",label:"Material",icon:"mdil-palette",laneKind:"keyframes",runtimeEvaluator:"parameter",createSubTrack:()=>c(),supportedTrackTypes:["object","spawn"],exposedInEditor:!1,valueLane:{kind:"customParam"}},{type:"visibility",label:"Visibility",icon:"mdil-eye",laneKind:"keyframes",runtimeEvaluator:"visibility",createSubTrack:()=>y(),supportedTrackTypes:["object","spawn","vfx"],exposedInEditor:!1},{type:"event",label:"Events",icon:"mdil-flash-outline",laneKind:"events",runtimeEvaluator:"event",createSubTrack:()=>i(),supportedTrackTypes:["object","spawn","camera"],exposedInEditor:!0},{type:"audioParameter",label:"Audio Parameter",icon:"mdil-tune",laneKind:"keyframes",runtimeEvaluator:"parameter",createSubTrack:e=>t(e?.parameter),supportedTrackTypes:["audio"],allowMultiple:!0,exposedInEditor:!0,valueLane:{kind:"number"}}];export const audioParameterSubTrackOptions=[{parameter:"volume",label:"Volume",icon:"mdil-tune"},{parameter:"detune",label:"Detune",icon:"mdil-music-note"},{parameter:"pan",label:"Pan",icon:"mdil-panorama-horizontal"},{parameter:"spatialBlend",label:"Spatial Blend",icon:"mdil-cube-outline"},{parameter:"lowpass",label:"Low Pass Filter",icon:"mdil-filter-variant"},{parameter:"highpass",label:"High Pass Filter",icon:"mdil-filter-variant"}];const E=new Map(f.map(e=>[e.type,e])),x=new Map(v.map(e=>[e.type,e]));export function getSequenceTrackDefinitions(){return f}export function getSequenceSubTrackDefinitions(){return v}export function getSequenceTrackDefinition(e){return E.get(e)}export function getSequenceSubTrackDefinition(e){return x.get(e)}export function getEditorSequenceTrackDefinitions(){return f.filter(e=>!1!==e.exposedInEditor)}export function getEditorSequenceSubTrackDefinitions(e){return v.filter(a=>!1!==a.exposedInEditor&&a.supportedTrackTypes.some(a=>a===e.type))}export function canTrackAddSubTrack(e,a,r){if(e.locked)return!1;const t=getSequenceSubTrackDefinition(a);return!!t.supportedTrackTypes.some(a=>a===e.type)&&("audioParameter"===a?!!r?.parameter&&!e.subTracks.some(e=>"audioParameter"===e.type&&e.parameter===r.parameter):!!t.allowMultiple||!e.subTracks.some(e=>e.type===a))}/*
|
|
2
|
+
* Copyright (©) 2026 Hology Interactive AB. All rights reserved.
|
|
3
|
+
* See the LICENSE.md file for details.
|
|
4
|
+
*/
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import 'reflect-metadata';
|
|
2
|
+
import type { ParameterOptions, ParameterType, PropertyParameter } from '../../shader/parameter.js';
|
|
2
3
|
import { Type } from '../../utils/type.js';
|
|
3
4
|
/**
|
|
4
5
|
* Metadata about a sequence event method on an actor
|
|
@@ -8,6 +9,17 @@ export interface SequenceEventInfo {
|
|
|
8
9
|
name: string;
|
|
9
10
|
/** Actual method name on the actor class */
|
|
10
11
|
methodName: string;
|
|
12
|
+
/** Configurable parameters that are passed to the method in declaration order */
|
|
13
|
+
parameters: PropertyParameter[];
|
|
14
|
+
}
|
|
15
|
+
export interface SequenceEventParameterDefinition {
|
|
16
|
+
name?: string;
|
|
17
|
+
type?: ParameterType;
|
|
18
|
+
options?: ParameterOptions;
|
|
19
|
+
}
|
|
20
|
+
export interface SequenceEventOptions {
|
|
21
|
+
displayName?: string;
|
|
22
|
+
parameters?: SequenceEventParameterDefinition[];
|
|
11
23
|
}
|
|
12
24
|
/**
|
|
13
25
|
* Decorator to mark an actor method as callable from sequences.
|
|
@@ -23,9 +35,20 @@ export interface SequenceEventInfo {
|
|
|
23
35
|
* onSequenceHit() {
|
|
24
36
|
* // Handle hit event
|
|
25
37
|
* }
|
|
38
|
+
*
|
|
39
|
+
* @SequenceEvent({
|
|
40
|
+
* displayName: 'Fire Projectile',
|
|
41
|
+
* parameters: [
|
|
42
|
+
* { name: 'origin', type: Vector3, options: { label: 'Spawn Position' } },
|
|
43
|
+
* { name: 'speed', type: Number, options: { range: [0, 100], stepSize: 0.1 } }
|
|
44
|
+
* ]
|
|
45
|
+
* })
|
|
46
|
+
* fireProjectile(origin: Vector3, speed: number) {
|
|
47
|
+
* // Handle projectile spawning
|
|
48
|
+
* }
|
|
26
49
|
* }
|
|
27
50
|
*/
|
|
28
|
-
export declare function SequenceEvent(
|
|
51
|
+
export declare function SequenceEvent(displayNameOrOptions?: string | SequenceEventOptions): (target: Object, methodName: string) => void;
|
|
29
52
|
/**
|
|
30
53
|
* Extract all sequence events from an actor class and its parent classes.
|
|
31
54
|
* This is used by the editor to populate the event function dropdown.
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import"reflect-metadata";import{ArrayMap as e}from"../../utils/collections.js";const t=new e;export function SequenceEvent(e){return function(n
|
|
1
|
+
import"reflect-metadata";import{ArrayMap as e}from"../../utils/collections.js";const t=new e;export function SequenceEvent(e){let a;return a=null==e?{}:"string"==typeof e?{displayName:e}:e,function(e,n){null!=e&&t.push(e.constructor,{name:a.displayName??n?.replace(/^on/,""),methodName:n,parameters:a.parameters})}}export function extractSequenceEvents(e){if(null==e)return[];const n=(t.get(e)||[]).map(t=>({name:t.name,methodName:t.methodName,parameters:a(e,t.methodName,t.parameters)}));return[...extractSequenceEvents(Object.getPrototypeOf(e)).filter(e=>n.every(t=>t.methodName!==e.methodName)),...n]}function a(e,t,a){const r=Reflect.getMetadata("sequence:paramnames",e.prototype,t)??[],o=Reflect.getMetadata("design:paramtypes",e.prototype,t)??[],p=Reflect.getMetadata("prefab:paramtypes",e.prototype,t)??[],l=Math.max(r.length,o.length,a?.length??0),m=[];for(let e=0;e<l;e++){const t=a?.[e],l=t?.type??o[e];if(null==l)continue;const c=r[e],s=t?.name??c??`arg${e+1}`,u={...t?.options??{}};u.prefabOf??(u.prefabOf=p[e]??void 0),null==u.label&&(u.label=n(c??s)),m.push({name:s,type:l,options:u})}return m}function n(e){return e.replace(/([a-z0-9])([A-Z])/g,"$1 $2").replace(/[_-]+/g," ").replace(/^\w/,e=>e.toUpperCase())}/*
|
|
2
2
|
* Copyright (©) 2026 Hology Interactive AB. All rights reserved.
|
|
3
3
|
* See the LICENSE.md file for details.
|
|
4
4
|
*/
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Quaternion, Vector3 } from 'three';
|
|
2
|
+
export interface SequenceLocatorSnapshot {
|
|
3
|
+
trackId: string;
|
|
4
|
+
name: string;
|
|
5
|
+
bindingId?: string;
|
|
6
|
+
position: Vector3;
|
|
7
|
+
rotation: Quaternion;
|
|
8
|
+
scale: Vector3;
|
|
9
|
+
}
|
|
10
|
+
export interface SequenceLocatorReader {
|
|
11
|
+
getLocator(bindingId: string): SequenceLocatorSnapshot | null;
|
|
12
|
+
getLocators(bindingId: string): SequenceLocatorSnapshot[];
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=sequence-locator.d.ts.map
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { AnimationClipInstance, PropertyKeyframe, SequenceData, SequenceEventData, SequenceTrack, SubTrack, SubTrackType, TransformKeyframe, VisibilityKeyframe } from './sequence-data.js';
|
|
2
|
+
export interface SequenceTrackReference {
|
|
3
|
+
trackId: string;
|
|
4
|
+
}
|
|
5
|
+
export interface SequenceSubTrackReference extends SequenceTrackReference {
|
|
6
|
+
subTrackId: string;
|
|
7
|
+
}
|
|
8
|
+
export interface SequenceClipReference extends SequenceSubTrackReference {
|
|
9
|
+
clipId: string;
|
|
10
|
+
}
|
|
11
|
+
export interface SequenceDirectClipReference extends SequenceTrackReference {
|
|
12
|
+
clipId: string;
|
|
13
|
+
}
|
|
14
|
+
export interface SequenceKeyframeReference extends SequenceSubTrackReference {
|
|
15
|
+
keyframeId: string;
|
|
16
|
+
keyframeIndex: number;
|
|
17
|
+
subTrackType: SubTrackType;
|
|
18
|
+
time: number;
|
|
19
|
+
}
|
|
20
|
+
export interface SequenceOperationResult<TReference = void> {
|
|
21
|
+
data: SequenceData;
|
|
22
|
+
ref?: TReference;
|
|
23
|
+
}
|
|
24
|
+
type EditableKeyframe = TransformKeyframe | PropertyKeyframe | VisibilityKeyframe;
|
|
25
|
+
type EditableTimedItem = EditableKeyframe | SequenceEventData;
|
|
26
|
+
type DirectTrackClip = SequenceTrack extends infer TTrack ? TTrack extends {
|
|
27
|
+
clips: Array<infer TClip>;
|
|
28
|
+
} ? TClip : never : never;
|
|
29
|
+
export declare function addTrack(data: SequenceData, track: SequenceTrack): SequenceData;
|
|
30
|
+
export declare function updateTrack(data: SequenceData, trackId: string, updater: (track: SequenceTrack) => SequenceTrack): SequenceData;
|
|
31
|
+
export declare function removeTrack(data: SequenceData, trackId: string): SequenceData;
|
|
32
|
+
export declare function moveTrack(data: SequenceData, trackId: string, direction: 'up' | 'down'): SequenceData;
|
|
33
|
+
export declare function duplicateTrack(data: SequenceData, trackId: string): SequenceOperationResult<SequenceTrackReference>;
|
|
34
|
+
export declare function addSubTrack(data: SequenceData, trackId: string, subTrack: SubTrack): SequenceOperationResult<SequenceSubTrackReference>;
|
|
35
|
+
export declare function updateSubTrack(data: SequenceData, trackId: string, subTrackId: string, updater: (subTrack: SubTrack) => SubTrack): SequenceData;
|
|
36
|
+
export declare function removeSubTrack(data: SequenceData, trackId: string, subTrackId: string): SequenceData;
|
|
37
|
+
export declare function addTrackClip(data: SequenceData, trackId: string, clip: DirectTrackClip): SequenceOperationResult<SequenceDirectClipReference>;
|
|
38
|
+
export declare function updateTrackClip(data: SequenceData, trackId: string, clipId: string, updater: (clip: DirectTrackClip) => DirectTrackClip): SequenceData;
|
|
39
|
+
export declare function removeTrackClip(data: SequenceData, trackId: string, clipId: string): SequenceData;
|
|
40
|
+
export declare function addAnimationClip(data: SequenceData, trackId: string, subTrackId: string, clip: AnimationClipInstance): SequenceOperationResult<SequenceClipReference>;
|
|
41
|
+
export declare function updateAnimationClip(data: SequenceData, trackId: string, subTrackId: string, clipId: string, updater: (clip: AnimationClipInstance) => AnimationClipInstance): SequenceData;
|
|
42
|
+
export declare function removeAnimationClip(data: SequenceData, trackId: string, subTrackId: string, clipId: string): SequenceData;
|
|
43
|
+
export declare function addSubTrackKeyframe(data: SequenceData, trackId: string, subTrackId: string, keyframe: EditableTimedItem): SequenceOperationResult<SequenceKeyframeReference>;
|
|
44
|
+
export declare function updateSubTrackKeyframe(data: SequenceData, trackId: string, subTrackId: string, keyframeId: string, updater: (keyframe: EditableTimedItem) => EditableTimedItem): SequenceOperationResult<SequenceKeyframeReference>;
|
|
45
|
+
export declare function removeSubTrackKeyframe(data: SequenceData, trackId: string, subTrackId: string, keyframeId: string): SequenceData;
|
|
46
|
+
export declare function cloneTrackWithFreshIds(track: SequenceTrack): SequenceTrack;
|
|
47
|
+
export {};
|
|
48
|
+
//# sourceMappingURL=sequence-ops.d.ts.map
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import{randomString as r}from"../../utils/math.js";import{sortTimedSequenceItems as e}from"./sequence-value-lane.js";export function addTrack(r,e){return{...r,tracks:[...r.tracks,e]}}export function updateTrack(r,e,t){return{...r,tracks:r.tracks.map(r=>r.id===e?t(r):r)}}export function removeTrack(r,e){return{...r,tracks:r.tracks.filter(r=>r.id!==e)}}export function moveTrack(r,e,t){const a=r.tracks.findIndex(r=>r.id===e);if(a<0)return r;const n="up"===t?a-1:a+1;if(n<0||n>=r.tracks.length)return r;const i=[...r.tracks];return[i[a],i[n]]=[i[n],i[a]],{...r,tracks:i}}export function duplicateTrack(r,e){const t=r.tracks.findIndex(r=>r.id===e);if(t<0)return{data:r};const a=cloneTrackWithFreshIds(r.tracks[t]);a.name=`${r.tracks[t].name} (Copy)`;const n=[...r.tracks];return n.splice(t+1,0,a),{data:{...r,tracks:n},ref:{trackId:a.id}}}export function addSubTrack(r,e,t){return{data:updateTrack(r,e,r=>({...r,subTracks:[...r.subTracks,t]})),ref:{trackId:e,subTrackId:t.id}}}export function updateSubTrack(r,e,t,a){return updateTrack(r,e,r=>({...r,subTracks:r.subTracks.map(r=>r.id===t?a(r):r)}))}export function removeSubTrack(r,e,t){return updateTrack(r,e,r=>({...r,subTracks:r.subTracks.filter(r=>r.id!==t)}))}export function addTrackClip(r,e,t){return{data:updateTrack(r,e,r=>i(r)?{...r,clips:[...r.clips,t]}:r),ref:{trackId:e,clipId:t.id}}}export function updateTrackClip(r,e,t,a){return updateTrack(r,e,r=>i(r)?{...r,clips:r.clips.map(r=>r.id===t?a(r):r)}:r)}export function removeTrackClip(r,e,t){return updateTrack(r,e,r=>i(r)?{...r,clips:r.clips.filter(r=>r.id!==t)}:r)}export function addAnimationClip(r,e,t,a){return{data:n(r,e,t,r=>({...r,clips:[...r.clips,a]})),ref:{trackId:e,subTrackId:t,clipId:a.id}}}export function updateAnimationClip(r,e,t,a,i){return n(r,e,t,r=>({...r,clips:r.clips.map(r=>r.id===a?i(r):r)}))}export function removeAnimationClip(r,e,t,a){return n(r,e,t,r=>({...r,clips:r.clips.filter(r=>r.id!==a)}))}export function addSubTrackKeyframe(r,t,a,n){let i=-1,p="transform";return{data:updateSubTrack(r,t,a,r=>{if(p=r.type,u(r)&&d(n)){const t=e([...r.events,n]);return i=t.findIndex(r=>r.id===n.id),{...r,events:t}}if(c(r)&&!d(n)){const t=e([...r.keyframes,n]);return i=t.findIndex(r=>r.id===n.id),{...r,keyframes:t}}return r}),ref:-1===i?void 0:{trackId:t,subTrackId:a,keyframeId:n.id,keyframeIndex:i,subTrackType:p,time:n.time}}}export function updateSubTrackKeyframe(r,t,a,n,i){let d;return{data:updateSubTrack(r,t,a,r=>{if(u(r)){const c=e(r.events.map(r=>r.id===n?i(r):r)),u=c.findIndex(r=>r.id===n);return u>=0&&(d={trackId:t,subTrackId:a,keyframeId:n,keyframeIndex:u,subTrackType:r.type,time:c[u].time}),{...r,events:c}}if(c(r)){const c=e(r.keyframes.map(r=>r.id===n?i(r):r)),u=c.findIndex(r=>r.id===n);return u>=0&&(d={trackId:t,subTrackId:a,keyframeId:n,keyframeIndex:u,subTrackType:r.type,time:c[u].time}),{...r,keyframes:c}}return r}),ref:d}}export function removeSubTrackKeyframe(r,e,t,a){return updateSubTrack(r,e,t,r=>u(r)?{...r,events:r.events.filter(r=>r.id!==a)}:c(r)?{...r,keyframes:r.keyframes.filter(r=>r.id!==a)}:r)}export function cloneTrackWithFreshIds(r){return t(JSON.parse(JSON.stringify(r)))}function t(e){return e.id=r(),e.subTracks=e.subTracks.map(a),"group"===e.type&&(e.childTracks=e.childTracks.map(r=>t(r))),i(e)&&(e.clips=e.clips.map(e=>({...e,id:r()}))),e}function a(e){return e.id=r(),"animation"===e.type?(e.clips=e.clips.map(e=>({...e,id:r()})),e):"event"===e.type?(e.events=e.events.map(e=>({...e,id:r()})),e):(c(e)&&(e.keyframes=e.keyframes.map(e=>({...e,id:r()}))),e)}function n(r,e,t,a){return updateSubTrack(r,e,t,r=>"animation"===r.type?a(r):r)}function i(r){return"audio"===r.type||"vfx"===r.type||"spawn"===r.type}function c(r){return"transform"===r.type||"property"===r.type||"audioParameter"===r.type||"material"===r.type||"visibility"===r.type}function u(r){return"event"===r.type}function d(r){return"arguments"in r}/*
|
|
2
|
+
* Copyright (©) 2026 Hology Interactive AB. All rights reserved.
|
|
3
|
+
* See the LICENSE.md file for details.
|
|
4
|
+
*/
|
|
@@ -8,6 +8,7 @@ import { AssetLoader } from '../../gameplay/services/asset-loader.js';
|
|
|
8
8
|
import { World } from '../../gameplay/services/world.js';
|
|
9
9
|
import { PrefabInstance } from '../../scene/objects/prefab.js';
|
|
10
10
|
import { SequenceData, SequenceRole, SequenceTrack } from './sequence-data.js';
|
|
11
|
+
import { SequenceLocatorReader, SequenceLocatorSnapshot } from './sequence-locator.js';
|
|
11
12
|
import { CharacterAnimationComponent } from '../../gameplay/actors/index.js';
|
|
12
13
|
/**
|
|
13
14
|
* Playback state of the sequence
|
|
@@ -79,13 +80,14 @@ export type SpawnedInstance = ({
|
|
|
79
80
|
* SequencePlayer is the runtime system that plays a sequence.
|
|
80
81
|
* It manages track bindings, playback state, and updates.
|
|
81
82
|
*/
|
|
82
|
-
export declare class SequencePlayer {
|
|
83
|
+
export declare class SequencePlayer implements SequenceLocatorReader {
|
|
83
84
|
private _state;
|
|
84
85
|
private _time;
|
|
85
86
|
private _duration;
|
|
86
87
|
private _timescale;
|
|
87
88
|
private _loop;
|
|
88
89
|
private _externalTimeControl;
|
|
90
|
+
private _inEditor;
|
|
89
91
|
private bindings;
|
|
90
92
|
private roleBindings;
|
|
91
93
|
private sequenceData;
|
|
@@ -101,6 +103,7 @@ export declare class SequencePlayer {
|
|
|
101
103
|
private loadingAudioBuffers;
|
|
102
104
|
private animationClips;
|
|
103
105
|
private loadingAnimationClips;
|
|
106
|
+
private retimedAnimationClips;
|
|
104
107
|
private audioByClip;
|
|
105
108
|
private activeAudioClips;
|
|
106
109
|
private audioGainNodes;
|
|
@@ -116,10 +119,15 @@ export declare class SequencePlayer {
|
|
|
116
119
|
private pendingSpawns;
|
|
117
120
|
private vfxActors;
|
|
118
121
|
private activeVfxClips;
|
|
122
|
+
private locatorMarkers;
|
|
119
123
|
private clearCounter;
|
|
120
124
|
private audioFilters;
|
|
121
125
|
private audioPannerNodes;
|
|
122
126
|
private firedEvents;
|
|
127
|
+
private readonly sequenceEventSyncResolvers;
|
|
128
|
+
private readonly sequenceEventAsyncResolvers;
|
|
129
|
+
private readonly trackRuntimeEvaluators;
|
|
130
|
+
private readonly subTrackRuntimeEvaluators;
|
|
123
131
|
constructor();
|
|
124
132
|
/**
|
|
125
133
|
* Current playback state
|
|
@@ -150,6 +158,12 @@ export declare class SequencePlayer {
|
|
|
150
158
|
*/
|
|
151
159
|
get externalTimeControl(): boolean;
|
|
152
160
|
set externalTimeControl(value: boolean);
|
|
161
|
+
/**
|
|
162
|
+
* When true, editor-only sequence events are allowed to fire.
|
|
163
|
+
* Runtime gameplay should leave this as false.
|
|
164
|
+
*/
|
|
165
|
+
get inEditor(): boolean;
|
|
166
|
+
set inEditor(value: boolean);
|
|
153
167
|
/**
|
|
154
168
|
* Set world dependency
|
|
155
169
|
*/
|
|
@@ -171,8 +185,11 @@ export declare class SequencePlayer {
|
|
|
171
185
|
* Load sequence data and prepare for playback
|
|
172
186
|
*/
|
|
173
187
|
load(data: SequenceData): void;
|
|
188
|
+
private preloadSequenceResources;
|
|
174
189
|
private getAudioAssetIdsForSequence;
|
|
175
190
|
private preloadAudioBuffersForSequence;
|
|
191
|
+
private getAnimationClipAssetIdsForSequence;
|
|
192
|
+
private preloadAnimationClipsForSequence;
|
|
176
193
|
/**
|
|
177
194
|
* Bind a role to a runtime target.
|
|
178
195
|
* This allows tracks with a role to target a different actor at runtime.
|
|
@@ -186,10 +203,16 @@ export declare class SequencePlayer {
|
|
|
186
203
|
* Bind a scene object by ID to a target
|
|
187
204
|
*/
|
|
188
205
|
bindObject(objectId: string, target: Object3D | BaseActor): void;
|
|
206
|
+
getLocator(bindingId: string): SequenceLocatorSnapshot | null;
|
|
207
|
+
getLocators(bindingId: string): SequenceLocatorSnapshot[];
|
|
189
208
|
/**
|
|
190
209
|
* Resolve all track bindings based on current proxy bindings and scene references
|
|
191
210
|
*/
|
|
192
211
|
private resolveBindings;
|
|
212
|
+
private initializeLocatorBindings;
|
|
213
|
+
private clearLocatorBindings;
|
|
214
|
+
private updateLocatorMarkerVisibility;
|
|
215
|
+
private disableLocatorInteraction;
|
|
193
216
|
private resolveTrackBinding;
|
|
194
217
|
private createBinding;
|
|
195
218
|
/**
|
|
@@ -225,11 +248,13 @@ export declare class SequencePlayer {
|
|
|
225
248
|
private evaluate;
|
|
226
249
|
private evaluateTrack;
|
|
227
250
|
private evaluateObjectTrack;
|
|
251
|
+
private evaluateLocatorTrack;
|
|
228
252
|
private evaluateSubTracks;
|
|
229
253
|
private evaluateTransformSubTrack;
|
|
230
254
|
private evaluateAnimationSubTrack;
|
|
231
255
|
private evaluateVisibilitySubTrack;
|
|
232
256
|
private evaluatePropertySubTrack;
|
|
257
|
+
private evaluateParameterSubTrack;
|
|
233
258
|
private evaluateEventSubTrack;
|
|
234
259
|
private evaluateCameraTrack;
|
|
235
260
|
private evaluateAudioTrack;
|
|
@@ -300,9 +325,14 @@ export declare class SequencePlayer {
|
|
|
300
325
|
* Spawn for clip (async wrapper)
|
|
301
326
|
*/
|
|
302
327
|
private spawnForClip;
|
|
303
|
-
private
|
|
304
|
-
private
|
|
328
|
+
private getPlayableObject;
|
|
329
|
+
private applyResolvedPropertyValue;
|
|
330
|
+
private applyResolvedMaterialValue;
|
|
305
331
|
private ensureAnimationClip;
|
|
332
|
+
private prepareAnimationPlayback;
|
|
333
|
+
private getPlayableAnimationClip;
|
|
334
|
+
private getAnimationPlaybackLocalTime;
|
|
335
|
+
private clearRetimedAnimationClipCache;
|
|
306
336
|
private captureOriginalTransforms;
|
|
307
337
|
private restoreOriginalTransforms;
|
|
308
338
|
private stopAllAnimations;
|
|
@@ -322,5 +352,9 @@ export declare class SequencePlayer {
|
|
|
322
352
|
private evaluateAudioSubTracks;
|
|
323
353
|
private stringToRandom;
|
|
324
354
|
refreshAsset(assetId: string): void;
|
|
355
|
+
private invokeSequenceEvent;
|
|
356
|
+
private resolveSequenceEventActorReference;
|
|
357
|
+
private resolveSequenceEventSequence;
|
|
358
|
+
private resolveSequenceEventAnimationClip;
|
|
325
359
|
}
|
|
326
360
|
//# sourceMappingURL=sequence-player.d.ts.map
|