import type * as spec from '@galacean/effects-specification'; import type { Matrix4 } from '@galacean/effects-math/es/core/matrix4'; import { Vector2 } from '@galacean/effects-math/es/core/vector2'; import { Vector3 } from '@galacean/effects-math/es/core/vector3'; import type { Engine } from '../../engine'; import { ValueGetter } from '../../math'; import type { GPUCapability, SharedShaderWithSource } from '../../render'; import { Geometry, Mesh } from '../../render'; import { Texture } from '../../texture'; import { Transform } from '../../transform'; export type Point = { vel: Vector3; lifetime: number; color: spec.vec4; uv: number[]; dirX: Vector3; dirY: Vector3; delay: number; sprite?: [start: number, duration: number, cycles: number]; transform: Transform; gravity: spec.vec3; size: Vector2; }; export interface ParticleMeshData { gravityModifier: ValueGetter; sizeOverLifetime?: { x: ValueGetter; y?: ValueGetter; separateAxes?: boolean; }; meshSlots?: number[]; forceTarget?: { curve: ValueGetter; target: spec.vec3; }; colorOverLifetime?: { color?: number[][] | Texture; opacity?: ValueGetter; separateAxes?: boolean; }; linearVelOverLifetime?: { asMovement?: boolean; x?: ValueGetter; y?: ValueGetter; z?: ValueGetter; enabled?: boolean; } & Record; orbitalVelOverLifetime?: { asRotation?: boolean; x?: ValueGetter; y?: ValueGetter; z?: ValueGetter; enabled?: boolean; center?: spec.vec3; } & Record; rotationOverLifetime?: { asRotation?: boolean; x?: ValueGetter; y?: ValueGetter; z?: ValueGetter; }; speedOverLifetime?: ValueGetter; } export interface ParticleMeshProps extends ParticleMeshData { renderMode?: number; blending?: number; mask: number; maskMode: number; side: number; transparentOcclusion?: boolean; matrix?: Matrix4; sprite?: { animate?: boolean; blend?: boolean; col: number; row: number; total: number; }; gravity?: spec.vec3; useSprite?: boolean; textureFlip?: boolean; occlusion?: boolean; diffuse?: Texture; forceTarget?: { curve: ValueGetter; target: spec.vec3; }; maxCount: number; shaderCachePrefix: string; name: string; anchor: Vector2; } export declare class ParticleMesh implements ParticleMeshData { duration: number; geometry: Geometry; mesh: Mesh; particleCount: number; maxParticleBufferCount: number; gravityModifier: ValueGetter; sizeOverLifetime?: { x: ValueGetter; y?: ValueGetter; separateAxes?: boolean; }; forceTarget?: { curve: ValueGetter; target: spec.vec3; }; colorOverLifetime?: { color?: number[][]; opacity?: ValueGetter; separateAxes?: boolean; }; 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; }; rotationOverLifetime?: { asRotation?: boolean; x?: ValueGetter; y?: ValueGetter; z?: ValueGetter; }; speedOverLifetime?: ValueGetter; time: number; maxCount: number; readonly useSprite?: boolean; readonly textureOffsets: number[]; readonly anchor: Vector2; private cachedRotationVector3; private cachedRotationMatrix; private cachedLinearMove; private tempMatrix3; VERT_MAX_KEY_FRAME_COUNT: number; constructor(engine: Engine, props: ParticleMeshProps); getPointColor(index: number): number[]; clearPoints(): void; resetGeometryData(geometry: Geometry): void; onUpdate(dt: number): void; minusTime(time: number): void; removePoint(index: number): void; setPoint(index: number, point: Point): void; private applyTranslation; private applyRotation; private applyLinearMove; private expandArray; } export declare function getParticleMeshShader(item: spec.ParticleItem, gpuCapability: GPUCapability, env?: string): { shader: SharedShaderWithSource; vertex: number; fragment: number; }; export declare function modifyMaxKeyframeShader(shader: SharedShaderWithSource, maxVertex: number, maxFrag: number): void;