storysplat-viewer 2.2.6 → 2.2.9
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/index.esm.js +1 -1
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/storysplat-viewer.umd.js +1 -1
- package/dist/storysplat-viewer.umd.js.map +1 -1
- package/dist/types/dynamic-viewer/FrameSequencePlayer.d.ts +87 -0
- package/dist/types/index.d.ts +2 -0
- package/dist/types/types/index.d.ts +17 -1
- package/package.json +1 -1
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FrameSequencePlayer - 4DGS Frame-by-Frame Playback
|
|
3
|
+
*
|
|
4
|
+
* Handles loading and playing back sequences of PLY/SOG splat files
|
|
5
|
+
* for volumetric video (4D Gaussian Splatting) playback.
|
|
6
|
+
*/
|
|
7
|
+
import * as pc from 'playcanvas';
|
|
8
|
+
export interface FrameSequenceConfig {
|
|
9
|
+
frameUrls: string[];
|
|
10
|
+
fps?: number;
|
|
11
|
+
loop?: boolean;
|
|
12
|
+
preloadCount?: number;
|
|
13
|
+
autoplay?: boolean;
|
|
14
|
+
}
|
|
15
|
+
export interface FrameSequencePlayerOptions {
|
|
16
|
+
onFrameChange?: (frame: number, total: number) => void;
|
|
17
|
+
onLoadProgress?: (loaded: number, total: number) => void;
|
|
18
|
+
onError?: (error: string) => void;
|
|
19
|
+
}
|
|
20
|
+
type FramePlayerEventCallback = (...args: any[]) => void;
|
|
21
|
+
export declare class FrameSequencePlayer {
|
|
22
|
+
private options;
|
|
23
|
+
private app;
|
|
24
|
+
private frameUrls;
|
|
25
|
+
private frameAssets;
|
|
26
|
+
private entities;
|
|
27
|
+
private activeEntityIndex;
|
|
28
|
+
private currentFrame;
|
|
29
|
+
private fps;
|
|
30
|
+
private isPlaying;
|
|
31
|
+
private loop;
|
|
32
|
+
private preloadCount;
|
|
33
|
+
private lastFrameTime;
|
|
34
|
+
private frameInterval;
|
|
35
|
+
private loadingFrames;
|
|
36
|
+
private destroyed;
|
|
37
|
+
private listeners;
|
|
38
|
+
constructor(app: pc.Application, config: FrameSequenceConfig, options?: FrameSequencePlayerOptions);
|
|
39
|
+
private createSplatEntity;
|
|
40
|
+
/**
|
|
41
|
+
* Preload initial frames for smooth playback start
|
|
42
|
+
*/
|
|
43
|
+
private preloadInitialFrames;
|
|
44
|
+
/**
|
|
45
|
+
* Preload a specific frame
|
|
46
|
+
*/
|
|
47
|
+
preloadFrame(index: number): Promise<pc.Asset | null>;
|
|
48
|
+
/**
|
|
49
|
+
* Unload a frame to free memory
|
|
50
|
+
*/
|
|
51
|
+
unloadFrame(index: number): void;
|
|
52
|
+
/**
|
|
53
|
+
* Update the preload window based on current frame
|
|
54
|
+
*/
|
|
55
|
+
private updatePreloadWindow;
|
|
56
|
+
/**
|
|
57
|
+
* Display a specific frame using double-buffering
|
|
58
|
+
*/
|
|
59
|
+
private displayFrame;
|
|
60
|
+
/**
|
|
61
|
+
* Main update loop - called every frame
|
|
62
|
+
*/
|
|
63
|
+
update(dt: number): void;
|
|
64
|
+
play(): void;
|
|
65
|
+
pause(): void;
|
|
66
|
+
stop(): void;
|
|
67
|
+
setFrame(index: number): void;
|
|
68
|
+
nextFrame(): void;
|
|
69
|
+
previousFrame(): void;
|
|
70
|
+
getCurrentFrame(): number;
|
|
71
|
+
getTotalFrames(): number;
|
|
72
|
+
getProgress(): number;
|
|
73
|
+
setProgress(progress: number): void;
|
|
74
|
+
getFps(): number;
|
|
75
|
+
setFps(fps: number): void;
|
|
76
|
+
getIsPlaying(): boolean;
|
|
77
|
+
setLoop(loop: boolean): void;
|
|
78
|
+
getLoop(): boolean;
|
|
79
|
+
setPosition(x: number, y: number, z: number): void;
|
|
80
|
+
setRotation(x: number, y: number, z: number): void;
|
|
81
|
+
setScale(x: number, y: number, z: number): void;
|
|
82
|
+
on(event: string, callback: FramePlayerEventCallback): void;
|
|
83
|
+
off(event: string, callback: FramePlayerEventCallback): void;
|
|
84
|
+
private emit;
|
|
85
|
+
destroy(): void;
|
|
86
|
+
}
|
|
87
|
+
export {};
|
package/dist/types/index.d.ts
CHANGED
|
@@ -15,6 +15,8 @@ export { generateHTML, generateHTMLFromUrl } from './html-generation/generateHTM
|
|
|
15
15
|
export type { GenerateHTMLOptions } from './html-generation/generateHTML';
|
|
16
16
|
export { createViewer, createViewerFromUrl } from './dynamic-viewer/createViewer';
|
|
17
17
|
export { createViewerFromSceneId, fetchSceneMeta, SceneNotFoundError, SceneApiError } from './dynamic-viewer/createViewerFromSceneId';
|
|
18
|
+
export { FrameSequencePlayer } from './dynamic-viewer/FrameSequencePlayer';
|
|
19
|
+
export type { FrameSequenceConfig, FrameSequencePlayerOptions } from './dynamic-viewer/FrameSequencePlayer';
|
|
18
20
|
export { transformSceneToExportProps, exportPropsToViewerConfig } from './transformers/sceneToConfig';
|
|
19
21
|
export type { ExportProps, TemplateType, SceneData, WaypointData, HotspotData, ViewerInstance, ViewerOptions, ViewerEvent, ViewerFromSceneIdOptions } from './types';
|
|
20
22
|
export type { RevealPreset, RevealPresetConfig } from './effects';
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export type { ViewerConfig } from '../transformers/sceneToConfig';
|
|
5
5
|
export type { ViewerFromSceneIdOptions } from '../dynamic-viewer/createViewerFromSceneId';
|
|
6
|
+
export type { FrameSequenceConfig, FrameSequencePlayerOptions } from '../dynamic-viewer/FrameSequencePlayer';
|
|
6
7
|
/**
|
|
7
8
|
* HTML Mesh configuration (renders HTML as 3D texture)
|
|
8
9
|
*/
|
|
@@ -414,6 +415,14 @@ export interface SceneData {
|
|
|
414
415
|
additionalSplats?: SplatSwapPoint[];
|
|
415
416
|
/** Keep preloaded splats in memory (true = hide/show, false = dispose/reload) */
|
|
416
417
|
keepMeshesInMemory?: boolean;
|
|
418
|
+
/** Frame sequence configuration for 4DGS playback */
|
|
419
|
+
frameSequence?: {
|
|
420
|
+
frameUrls: string[];
|
|
421
|
+
fps?: number;
|
|
422
|
+
loop?: boolean;
|
|
423
|
+
preloadCount?: number;
|
|
424
|
+
autoplay?: boolean;
|
|
425
|
+
};
|
|
417
426
|
}
|
|
418
427
|
/**
|
|
419
428
|
* Splat swap point - defines when to swap to a different splat during navigation
|
|
@@ -668,6 +677,13 @@ export interface ViewerInstance {
|
|
|
668
677
|
pause: () => void;
|
|
669
678
|
stop: () => void;
|
|
670
679
|
isPlaying: () => boolean;
|
|
680
|
+
setFrame?: (index: number) => void;
|
|
681
|
+
getCurrentFrame?: () => number;
|
|
682
|
+
getTotalFrames?: () => number;
|
|
683
|
+
setFps?: (fps: number) => void;
|
|
684
|
+
getFps?: () => number;
|
|
685
|
+
getFrameProgress?: () => number;
|
|
686
|
+
setFrameProgress?: (progress: number) => void;
|
|
671
687
|
destroy: () => void;
|
|
672
688
|
resize: () => void;
|
|
673
689
|
navigateToScene: (sceneId: string) => Promise<void>;
|
|
@@ -694,7 +710,7 @@ export interface ViewerOptions {
|
|
|
694
710
|
/**
|
|
695
711
|
* Events emitted by viewer
|
|
696
712
|
*/
|
|
697
|
-
export type ViewerEvent = 'ready' | 'waypointChange' | 'playbackStart' | 'playbackStop' | 'error' | 'loaded' | 'progress' | 'warning' | 'portalActivated';
|
|
713
|
+
export type ViewerEvent = 'ready' | 'waypointChange' | 'playbackStart' | 'playbackStop' | 'error' | 'loaded' | 'progress' | 'warning' | 'portalActivated' | 'frameChange' | 'frameComplete';
|
|
698
714
|
/**
|
|
699
715
|
* Warning event data structure
|
|
700
716
|
*/
|
package/package.json
CHANGED