@@ -42,7 +42,8 @@ class GSplatComponentSystem extends ComponentSystem {
4242 /**
4343 * Fired when a GSplat material is created for a camera and layer combination. In unified
4444 * mode, materials are created during the first frame update when the GSplat is rendered.
45- * The handler is passed the {@link ShaderMaterial}, the {@link Camera}, and the {@link Layer}.
45+ * The handler is passed the {@link ShaderMaterial}, the {@link CameraComponent}, and
46+ * the {@link Layer}.
4647 *
4748 * This event is useful for setting up custom material chunks and parameters before the
4849 * first render.
@@ -57,6 +58,30 @@ class GSplatComponentSystem extends ComponentSystem {
5758 */
5859 static EVENT_MATERIALCREATED = 'material:created' ;
5960
61+ /**
62+ * Fired every frame for each camera and layer combination rendering GSplats in unified mode.
63+ * The handler is passed the {@link CameraComponent}, the {@link Layer}, a boolean indicating
64+ * if the current frame has up-to-date sorting, and a boolean indicating if resources are loading.
65+ *
66+ * The `ready` parameter indicates whether the current frame reflects all recent changes (camera
67+ * movement, splat transforms, lod updates, etc.) with the latest sorting applied. The `loading`
68+ * parameter indicates if octree LOD resources are still being loaded.
69+ *
70+ * This event is useful for video capture or other workflows that need to wait for frames
71+ * to be fully ready. Only capture frames and move camera to next position when both
72+ * `ready === true` and `loading === false`.
73+ *
74+ * @event
75+ * @example
76+ * app.systems.gsplat.on('frame:ready', (camera, layer, ready, loading) => {
77+ * if (ready && !loading) {
78+ * console.log(`Frame ready to capture for camera ${camera.entity.name}`);
79+ * // Capture frame here
80+ * }
81+ * });
82+ */
83+ static EVENT_FRAMEREADY = 'frame:ready' ;
84+
6085 /**
6186 * Create a new GSplatComponentSystem.
6287 *
0 commit comments