UNPKG

playcanvas

Version:

PlayCanvas WebGL game engine

91 lines (90 loc) 4.39 kB
/** * 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';