import type { Ray } from '@galacean/effects-math/es/core/index'; import { Vector3 } from '@galacean/effects-math/es/core/index'; import type { vec2, vec3, vec4 } from '@galacean/effects-specification'; import * as spec from '@galacean/effects-specification'; import { Component } from '../../components'; import type { Engine } from '../../engine'; import type { ValueGetter } from '../../math'; import type { Mesh, Renderer } from '../../render'; import type { Maskable } from '../../material'; import { MaskProcessor } from '../../material'; import type { ShapeGenerator, ShapeParticle } from '../../shape'; import { Texture } from '../../texture'; import type { BoundingBoxSphere, HitTestCustomParams } from '../interact/click-handler'; import { Burst } from './burst'; import type { Point } from './particle-mesh'; import { ParticleSystemRenderer } from './particle-system-renderer'; type ParticleSystemRayCastOptions = { ray: Ray; radius: number; removeParticle?: boolean; multiple: boolean; }; type ParticleOptions = { startSpeed: ValueGetter; startLifetime: ValueGetter; startDelay: ValueGetter; startColor: ValueGetter; start3DRotation?: boolean; startRotationX?: ValueGetter; startRotationY?: ValueGetter; startRotationZ?: ValueGetter; startRotation?: ValueGetter; start3DSize: boolean; startSizeX?: ValueGetter; startSizeY?: ValueGetter; startSize?: ValueGetter; sizeAspect?: ValueGetter; startTurbulence: boolean; turbulenceX?: ValueGetter; turbulenceY?: ValueGetter; turbulenceZ?: ValueGetter; turbulence?: [ turbulenceX: ValueGetter, turbulenceY: ValueGetter, turbulenceZ: ValueGetter ]; looping: boolean; maxCount: number; gravity: vec3; gravityModifier: ValueGetter; renderLevel?: spec.RenderLevel; particleFollowParent?: boolean; forceTarget?: { curve: ValueGetter; target: spec.vec3; }; speedOverLifetime?: ValueGetter; linearVelOverLifetime?: { asMovement?: boolean; x?: ValueGetter; y?: ValueGetter; z?: ValueGetter; enabled?: boolean; }; orbitalVelOverLifetime?: { asRotation?: boolean; x?: ValueGetter; y?: ValueGetter; z?: ValueGetter; enabled?: boolean; center?: spec.vec3; }; }; type ParticleEmissionOptions = { rateOverTime: ValueGetter; bursts: Burst[]; burstOffsets: Record; }; type TrailOptions = { lifetime: ValueGetter; minimumVertexDistance: number; dieWithParticles: boolean; sizeAffectsWidth: boolean; sizeAffectsLifetime: boolean; parentAffectsPosition: boolean; inheritParticleColor: boolean; maxPointPerTrail: number; colorOverLifetime: number[]; widthOverTrail: ValueGetter; colorOverTrail: number[]; opacityOverLifetime: ValueGetter; texture?: Texture; orderOffset?: number; blending: number; occlusion: boolean; transparentOcclusion: boolean; textureMap?: vec4; }; interface ParticleTextureSheetAnimation { col: number; row: number; total: number; animate: boolean; animationDelay: ValueGetter; animationDuration: ValueGetter; cycles: ValueGetter; endAtLifetime?: ValueGetter; blend?: boolean; } type ParticleInteraction = { behavior?: spec.ParticleInteractionBehavior; multiple?: boolean; radius: number; }; export interface ParticleSystemOptions extends spec.ParticleOptions { meshSlots?: number[]; } export interface ParticleSystemProps extends Omit { options: ParticleSystemOptions; renderer: ParticleSystemRendererOptions; trails?: ParticleTrailProps; mask?: spec.MaskOptions; } export interface ParticleSystemRendererOptions extends Required> { texture: Texture; anchor?: vec2; particleOrigin?: spec.ParticleOrigin; } export interface ParticleTrailProps extends Omit { texture: Texture; textureMap: vec4; mask?: spec.MaskOptions; } export type ParticleContent = [number, number, number, Point]; export declare class ParticleSystem extends Component implements Maskable { renderer: ParticleSystemRenderer; options: ParticleOptions; shape: ShapeGenerator; emission: ParticleEmissionOptions; trails: Pick; meshes: Mesh[]; textureSheetAnimation?: ParticleTextureSheetAnimation; interaction?: ParticleInteraction; emissionStopped: boolean; destroyed: boolean; props: ParticleSystemProps; time: number; readonly maskManager: MaskProcessor; private generatedCount; private loopStartTime; private particleLink; private started; private ended; private lastEmitTime; private frozen; private upDirectionWorld; private uvs; private basicTransform; private clickedPoint; constructor(engine: Engine, props?: ParticleSystemProps); get timePassed(): number; get lifetime(): number; get particleCount(): number; /** * 获取当前粒子系统的最大粒子数。当系统的粒子数量达到最大值时,发射器会暂时停止发射粒子。 * @since 2.3.0 */ get maxParticles(): number; /** * 设置当前粒子系统的最大粒子数。当系统的粒子数量达到最大值时,发射器会暂时停止发射粒子。 * 注意:暂时不支持增加拖尾数量 * @since 2.3.0 */ set maxParticles(count: number); isFrozen(): boolean; isEnded(): boolean; initEmitterTransform(): void; private updateEmitterTransform; private addParticle; setVisible(visible: boolean): void; getTextures(): Texture[]; startEmit(): void; stop(): void; reset(): void; onStart(): void; onUpdate(dt: number): void; update(delta: number): void; drawStencilMask(renderer: Renderer): void; onDestroy(): void; getParticleBoxes(): { center: Vector3; size: Vector3; }[]; raycast(options: ParticleSystemRayCastOptions): Vector3[] | undefined; clearPointTrail(pointIndex: number): void; updatePointTrail(pointIndex: number, emitterLifetime: number, point: Point, startTime: number): void; /** * 通过索引获取指定index粒子当前时刻的位置 * @params index - 粒子索引 */ getPointPositionByIndex(index: number): Vector3 | null; /** * 通过粒子参数获取当前时刻粒子的位置 */ getPointPosition(point: Point): Vector3; initPoint(data: ShapeParticle): Point; addBurst(burst: Burst, offsets: vec3[]): number; removeBurst(index: number): void; createPoint(lifetime: number): Point; stopParticleEmission(): void; resumeParticleEmission(): void; getBoundingBox(): void | BoundingBoxSphere; getHitTestParams: (force?: boolean) => void | HitTestCustomParams; fromData(data: unknown): void; } export {};