import * as spec from '@galacean/effects-specification'; import type { Ray } from '@galacean/effects-math/es/core/ray'; import type { Matrix4 } from '@galacean/effects-math/es/core/matrix4'; import { Camera } from './camera'; import type { Component, PostProcessVolume } from './components'; import { CompositionComponent } from './components'; import type { EventSystem, Region } from './plugins'; import type { Renderer } from './render'; import { RenderFrame } from './render'; import type { Scene } from './scene'; import type { Texture } from './texture'; import type { Constructor, Disposable, LostHandler } from './utils'; import { VFXItem } from './vfx-item'; import type { CompositionEvent } from './events'; import { EventEmitter } from './events'; import { SceneTicking } from './composition/scene-ticking'; /** * 合成统计信息 */ export interface CompositionStatistic { loadStart: number; /** * 加载耗时 */ loadTime: number; /** * Shader 编译耗时 */ compileTime: number; /** * 从加载到渲染第一帧的时间(含 Shader 编译) */ firstFrameTime: number; } /** * 合成消息对象 */ export interface MessageItem { /** * 元素 ID */ id: string; /** * 元素名称 */ name: string; /** * 消息阶段(2:开始,1:结束) */ phrase: typeof spec.MESSAGE_ITEM_PHRASE_BEGIN | typeof spec.MESSAGE_ITEM_PHRASE_END; /** * 合成 ID */ compositionId: string; } /** * */ export interface CompositionHitTestOptions { /** * */ maxCount?: number; /** * * @param region * @returns */ stop?: (region: Region) => boolean; /** * * @param item * @returns */ skip?: (item: VFXItem) => boolean; } /** * */ export interface CompositionProps { /** * */ reusable?: boolean; /** * */ baseRenderOrder?: number; /** * */ renderer: Renderer; /** * * @param message * @returns */ onItemMessage?: (message: MessageItem) => void; /** * */ event?: EventSystem; /** * */ width: number; /** * */ height: number; /** * */ speed?: number; } /** * 合成抽象类:核心对象,通常一个场景只包含一个合成,可能会有多个合成。 * 合成中包含了相关的 Item 元素,支持对 Item 元素的创建、更新和销毁。 * 也负责 Item 相关的动画播放控制,和持有渲染帧数据。 */ export declare class Composition extends EventEmitter> implements Disposable, LostHandler { renderer: Renderer; /** * */ sceneTicking: SceneTicking; /** * 当前帧的渲染数据对象 */ renderFrame: RenderFrame; /** * 动画播放速度 */ speed: number; /** * 是否卸载纹理贴图,就是将纹理贴图大小设置为1x1 */ textureOffloaded: boolean; videoState: (number | undefined)[]; /** * 合成渲染顺序,默认按升序渲染 */ renderOrder: number; /** * 播放完成后是否需要再使用,是的话生命周期结束后不会自动 dispose */ reusable: boolean; /** * 合成内的元素否允许点击、拖拽交互 * @since 1.6.0 */ interactive: boolean; /** * 合成是否结束 */ isEnded: boolean; /** * 合成id */ readonly id: string; /** * 画布宽度 */ readonly width: number; /** * 画布高度 */ readonly height: number; /** * 鼠标和触屏处理系统 */ readonly event?: EventSystem; /** * 当前合成名称 */ readonly name: string; /** * 用于保存与当前合成相关的插件数据 */ readonly loaderData: Record; /** * 场景加载和首帧渲染时间 */ readonly statistic: CompositionStatistic; /** * 合成对应的 url 或者 JSON */ readonly url: Scene.LoadType; /** * 合成根元素 */ readonly rootItem: VFXItem; /** * 预合成数组 */ readonly refContent: VFXItem[]; /** * 合成的相机对象 */ readonly camera: Camera; /** * 合成开始渲染的时间 */ readonly startTime: number; /** * 后处理渲染配置 */ globalVolume?: PostProcessVolume; /** * 是否开启后处理 */ postProcessingEnabled: boolean; /** * 合成中消息元素创建/销毁时触发的回调 */ onItemMessage?: (message: MessageItem) => void; /** * 销毁状态位 */ protected destroyed: boolean; protected rootComposition: CompositionComponent; /** * 合成暂停/播放 标识 */ private paused; private isEndCalled; private _textures; private videos; /** * Composition 构造函数 * @param props - composition 的创建参数 * @param scene */ constructor(props: CompositionProps, scene: Scene); /** * 所有合成 Item 的根变换 */ get transform(): import("@galacean/effects-core").Transform; /** * 获取场景中的纹理数组 */ get textures(): Texture[]; /** * 获取合成中所有元素 */ get items(): VFXItem[]; /** * 获取合成当前时间 */ get time(): number; /** * 获取销毁状态 */ get isDestroyed(): boolean; set viewportMatrix(matrix: Matrix4); get viewportMatrix(): Matrix4; /** * 获取合成的时长 */ getDuration(): number; /** * 重新开始合成 */ restart(): void; /** * 设置当前合成的渲染顺序 * @param index - 序号,大的后绘制 */ setIndex(index: number): void; /** * 获取当前合成的渲染顺序 * @returns */ getIndex(): number; /** * 设置合成的动画速度 * @param speed - 速度 */ setSpeed(speed: number): void; /** * 设置合成的可见性 * @since 2.0.0 * @param visible - 是否可见 */ setVisible(visible: boolean): void; /** * 获取合成的动画速度 * @returns */ getSpeed(): number; /** * */ play(): void; /** * 暂停合成的播放 */ pause(): void; /** * * @returns */ getPaused(): boolean; /** * 恢复合成的播放 */ resume(): void; /** * 跳转合成到指定时间播放 * @param time - 相对 startTime 的时间 */ gotoAndPlay(time: number): void; /** * 跳转合成到指定时间并暂停 * @param time - 相对 startTime 的时间 */ gotoAndStop(time: number): void; /** * */ createRenderFrame(): void; /** * 跳到指定时间点(不做任何播放行为) * @param time - 相对 startTime 的时间 */ setTime(time: number): void; addItem(item: VFXItem): void; /** * 获取合成上某一类型的组件 * @since 2.6.0 * @param classConstructor - 要获取的组件类型 * @returns 查询结果中符合类型的第一个组件 */ getComponent(classConstructor: Constructor): T; /** * 前进合成到指定时间 * @param time - 相对0时刻的时间 */ private forwardTime; /** * 重置状态函数 */ protected reset(): void; prepareRender(): void; /** * 合成更新,针对所有 item 的更新 * @param deltaTime - 更新的时间步长 */ update(deltaTime: number): void; private shouldDispose; /** * 更新相机 * @override */ private updateCamera; /** * 更新主合成组件 */ private updateCompositionTime; /** * 通过名称获取元素 * @param name - 元素名称 * @returns 元素对象 */ getItemByName(name: string): VFXItem | undefined; /** * 获取指定位置和相机连成的射线 * @param x * @param y * @returns */ getHitTestRay(x: number, y: number): Ray; /** * 获取 engine 对象 * @returns */ getEngine(): import("@galacean/effects-core").Engine; /** * Item 求交测试,返回求交结果列表,x 和 y 是归一化到[-1, 1]区间的值,x 向右,y 向上 * @param x - 鼠标或触点的 x,已经归一化到[-1, 1] * @param y - 鼠标或触点的 y,已经归一化到[-1, 1] * @param force - 是否强制求交,没有交互信息的 Item 也要进行求交测试 * @param options - 最大求交数和求交时的回调 */ hitTest(x: number, y: number, force?: boolean, options?: CompositionHitTestOptions): Region[]; /** * InteractItem 生命周期开始时的调用 * @param item - 交互元素 * @param type - 交互类型 */ addInteractiveItem(item: VFXItem, type: spec.InteractType): string | undefined; /** * InteractItem 生命周期结束时的调用 * @param item - 交互元素 * @param type - 交互类型 */ removeInteractiveItem(item: VFXItem, type: spec.InteractType): void; lost(e: Event): void; /** * 合成对象销毁 */ dispose(): void; /** * 合成整体在水平方向移动 x 像素,垂直方向移动 y 像素 */ translateByPixel(x: number, y: number): void; /** * 设置合成在画布上的像素位置 * Tips: * - 坐标原点在 canvas 左上角,x 正方向水平向右, y 正方向垂直向下 * - 设置后会覆盖原有的位置信息 * @param x - x 坐标 * @param y - y 坐标 */ setPositionByPixel(x: number, y: number): void; /** * 设置合成在 3D 坐标轴上相对当前的位移 */ translate(x: number, y: number, z: number): void; /** * 设置合成在 3D 坐标轴上相对原点的位移 */ setPosition(x: number, y: number, z: number): void; /** * 设置合成在 3D 坐标轴上相对当前的旋转(角度) */ rotate(x: number, y: number, z: number): void; /** * 设置合成在 3D 坐标轴上的相对原点的旋转(角度) */ setRotation(x: number, y: number, z: number): void; /** * 设置合成在 3D 坐标轴上相对当前的缩放 */ scale(x: number, y: number, z: number): void; /** * 设置合成在 3D 坐标轴上的缩放 */ setScale(x: number, y: number, z: number): void; /** * 卸载贴图纹理方法,减少内存 */ offloadTexture(): void; /** * 重新加载纹理 */ reloadTexture(): Promise; }