playcanvas
Version:
PlayCanvas WebGL game engine
91 lines (90 loc) • 4.39 kB
TypeScript
/**
* Allows an Entity to render a gsplat.
*
* @category Graphics
*/
export class GSplatComponentSystem extends ComponentSystem {
/**
* Fired when a GSplat material is created for a camera and layer combination. In unified
* mode, materials are created during the first frame update when the GSplat is rendered.
* The handler is passed the {@link ShaderMaterial}, the {@link CameraComponent}, and
* the {@link Layer}.
*
* This event is useful for setting up custom material chunks and parameters before the
* first render.
*
* @event
* @example
* app.systems.gsplat.on('material:created', (material, camera, layer) => {
* console.log(`Material created for camera ${camera.entity.name} on layer ${layer.name}`);
* // Set custom material parameters before first render
* material.setParameter('myParam', value);
* });
*/
static EVENT_MATERIALCREATED: string;
/**
* Fired every frame for each camera and layer combination rendering GSplats in unified mode.
* The handler is passed the {@link CameraComponent}, the {@link Layer}, a boolean indicating
* if the current frame has up-to-date sorting, and a number indicating how many resources are
* loading.
*
* The `ready` parameter indicates whether the current frame reflects all recent changes (camera
* movement, splat transforms, lod updates, etc.) with the latest sorting applied. The `loadingCount`
* parameter reports the total number of octree LOD resources currently loading or queued to load.
*
* This event is useful for video capture or other workflows that need to wait for frames
* to be fully ready. Only capture frames and move camera to next position when both
* `ready === true` and `loadingCount === 0`. Note that `loadingCount` can be used as a boolean
* in conditionals (0 is falsy, non-zero is truthy) for backward compatibility.
*
* @event
* @example
* // Wait for frame to be ready before capturing
* app.systems.gsplat.on('frame:ready', (camera, layer, ready, loadingCount) => {
* if (ready && !loadingCount) {
* console.log(`Frame ready to capture for camera ${camera.entity.name}`);
* // Capture frame here
* }
* });
* @example
* // Track loading progress (0..1)
* let maxLoadingCount = 0;
* app.systems.gsplat.on('frame:ready', (camera, layer, ready, loadingCount) => {
* maxLoadingCount = Math.max(maxLoadingCount, loadingCount);
* const progress = maxLoadingCount > 0 ? (maxLoadingCount - loadingCount) / maxLoadingCount : 1;
* console.log(`Loading progress: ${(progress * 100).toFixed(1)}%`);
* });
*/
static EVENT_FRAMEREADY: string;
id: string;
ComponentType: typeof GSplatComponent;
DataType: typeof GSplatComponentData;
schema: string[];
initializeComponentData(component: any, _data: any, properties: any): void;
cloneComponent(entity: any, clone: any): Component;
onRemove(entity: any, component: any): void;
/**
* Gets the GSplat material used by unified GSplat rendering for the given camera and layer.
*
* Returns null if the material hasn't been created yet. In unified mode, materials are created
* during the first frame update when the GSplat is rendered. To be notified immediately when
* materials are created, listen to the 'material:created' event on GSplatComponentSystem:
*
* @param {Camera} camera - The camera instance.
* @param {Layer} layer - The layer instance.
* @returns {ShaderMaterial|null} The material, or null if not created yet.
* @example
* app.systems.gsplat.on('material:created', (material, camera, layer) => {
* // Material is now available
* material.setParameter('myParam', value);
* });
*/
getGSplatMaterial(camera: Camera, layer: Layer): ShaderMaterial | null;
}
import { ComponentSystem } from '../system.js';
import { GSplatComponent } from './component.js';
import { GSplatComponentData } from './data.js';
import { Component } from '../component.js';
import type { Camera } from '../../../scene/camera.js';
import type { Layer } from '../../../scene/layer.js';
import type { ShaderMaterial } from '../../../scene/materials/shader-material.js';