import type { PredyPlayerRenderFrame } from '../render/PredyPlayerRenderFrame'; import type { PredyPlayerLoadOptions, PredyPlayer, PlayerScene, PredyPlayerPlayOptions } from './type'; import type { Composition } from './Composition'; import type { TextureOptions, TypedArray, Renderer } from '@predy-js/render-interface'; import { VFXItem } from './VFXItem'; import type { JSONScene } from '@predy-js/specification'; import type { Region } from '../plugin/interact/ClickHandler'; export type PredyPluginLoaderData = Record; export interface PredyPlayerPluginLoadOptions extends PredyPlayerLoadOptions { readonly env: string; } export type ImageSource = HTMLImageElement | ImageData | HTMLCanvasElement | HTMLVideoElement | ImageBitmap | ArrayBuffer | MImageData; export type MImageData = { width: number; height: number; data: TypedArray; }; /** * 请记住,整个load阶段都不会创建GL相关的对象,只创建JS对象 */ export interface PredyPluginLoadedScene extends PlayerScene { images: Array; textures: Array; bins: Array; storage: PredyPluginLoaderData; playOptions?: PredyPlayerPlayOptions; totalTime: number; currentTime?: number; } /** * 点击事件参数 */ export interface PluginClickEvent { readonly regions: Region[]; preventDefault(): void; readonly defaultPrevented: boolean; } export declare class PredyPlugin { name: string; /** * plugin的数组内排序,按照升序排列 * 默认为100 */ order?: number; /*** * player.loadSceneAsync 函数调用的时候会触发此函数, * 此阶段可以对资源JSON进行处理,替换调JSON中的数据,或者直接终止加载流程 * 一旦被reject,加载过程将失败 * @param json 动画资源 * @param options 加载参数 */ static processRawJSONAsync(json: JSONScene, options: PredyPlayerLoadOptions): Promise; /** * player.loadSceneAsync 函数调用的时候会触发此函数, * 此阶段时,json中的图片和二进制已经被加载完成,可以对加载好的资源做进一步处理, * 如果promise被reject, loadSceneAsync函数同样会被reject,表示场景加载失败 * 请记住,整个load阶段都不要创建GL相关的对象,只创建JS对象 * 此阶段晚于 processRawJSONAsync * @param scene * @param options */ static prepareResourceAsync(scene: PredyPluginLoadedScene, options: PredyPlayerPluginLoadOptions): Promise; /** * 在加载到JSON后,就可以进行提前编译 * @param json * @param renderer */ static precompileAsync(json: PredyPluginLoadedScene, renderer: Renderer): Promise; static onPlayerDestroy(player: PredyPlayer): void; static onPlayerCreated(player: PredyPlayer): void; /** * 合成创建时的回调。 * 通过composition.textures访问 Texture 数组,此数组的配置来源于 scene.textures, * scene.textures的TextureOptions数组会被PredyPlayer创建为composition.textures * @param composition * @param scene */ onCompositionConstructed(composition: Composition, scene: PredyPluginLoadedScene): void; /** * trigger when item lifetime begins, only trigger once before composition recreate, * even if item end behavior is freeze/looping or player reverses time before lifetime begins * 元素delay结束后触发,无论元素结束行为是冻结或循环,或者播放器时间倒播到元素开始之前, * 合成播放阶段只触发一次此函数 * @param composition * @param item */ onCompositionItemLifeBegin(composition: Composition, item: VFXItem): void; /** * trigger when item lifetime ends, * no matter whatever item endBehavior is,this will always be triggered * 元素生命周期结束时回调,无论元素的结束行为是什么都会在duration结束后触发 * 生命周期结束后,如果为循环或者冻结,则不会触发元素删除事件 * @param composition * @param item */ onCompositionItemLifeEnd(composition: Composition, item: VFXItem): void; /** * trigger when item removed from composition, * if item end behavior is freeze/looping or composition will reverse time, * this method will trigger when item destroyed with composition ends. * 元素销毁时触发。 * 当元素的结束行为是冻结或循环,或者合成会进行倒播放时,元素销毁会在合成销毁时会被调用。 * @param composition * @param item */ onCompositionItemRemoved(composition: Composition, item: VFXItem): void; /** * 合成重播时的回调 * @param composition * @param frame */ onCompositionReset(composition: Composition, frame: PredyPlayerRenderFrame): void; /** * 合成即将重播,此函数后frame会被销毁 * @param composition * @param frame */ onCompositionWillReset(composition: Composition, frame: PredyPlayerRenderFrame): void; /** * 合成要快进或者快退时的回调,回调之后,composition会进行tick * @param composition * @param time 单位秒 */ onCompositionWillForwardTime(composition: Composition, time: number): void; /** * 合成销毁时的会调,需要销毁composition中对应的资源 * @param composition */ onCompositionDestroyed(composition: Composition): void; /** * 合成更新时的回调,每帧都会进行调用,此时元素位置已经更新 * @param composition * @param dt 更新的毫秒 */ onCompositionDidUpdate(composition: Composition, dt: number): void; /** * 合成更新后,在渲染前进行RenderFrame的配置,添加渲染的Mesh到renderFrame中, * 如果此函数返回true,将进行renderFrame后处理函数配置 * mesh的priority 必须等于 item.listIndex ,否则渲染顺序将不符合Mars的规则 * @param composition * @param frame */ prepareRenderFrame(composition: Composition, frame: PredyPlayerRenderFrame): boolean; /** * 当所有的plugin都调用过prepareRenderFrame后,对于需要进行后处理的plugin,调用此函数, * 此函数一般用于切割renderPass,如果对于renderPass有切割,记得在销毁时还原切割 * @param composition * @param frame */ postProcessFrame(composition: Composition, frame: PredyPlayerRenderFrame): void; /** * 合成的交互元素被点击时触发 */ onCompositionItemClicked(composition: Composition, event: PluginClickEvent): void; } interface PluginCtrl { new (): PredyPlugin; onPlayerDestroy(player: PredyPlayer): void; onPlayerCreated(player: PredyPlayer): void; prepareResourceAsync(scene: any, options: PredyPlayerLoadOptions): Promise; } export declare const defaultPlugins: string[]; /** * 注册plugin * @param name * @param pluginClass class of plugin * @param itemClass class of item * @param isDefault load */ export declare function registerPlugin(name: string, pluginClass: PluginCtrl, itemClass: { new (options: any, composition: Composition): VFXItem; }, isDefault?: boolean): void; export declare function broadcastPlayerEvent(player: PredyPlayer, create: any): void; export declare function unregisterPlugin(name: any): void; export declare function getPluginLoader(name: any): PredyPlugin; export declare class PluginSystem { readonly plugins: PredyPlugin[]; constructor(pluginNames: string[]); initializeComposition(comp: Composition, scene: PredyPluginLoadedScene): void; destroyComposition(comp: Composition): void; resetComposition(comp: Composition, renderFrame: PredyPlayerRenderFrame): void; onCompositionItemClicked(comp: Composition, regions: Region[]): PluginClickEvent; createPluginItem(type: string, options: any, composition: Composition): VFXItem; onPlayerDestroy(player: PredyPlayer): void; processRawJSONAsync(json: any, options: PredyPlayerLoadOptions): Promise>; private callStaticAsync; precompileAsync(scene: JSONScene, renderer: Renderer): Promise>; loadResourcesAsync(scene: PredyPluginLoadedScene, options: PredyPlayerLoadOptions): Promise>; } export {};