@neutrinoparticles/js-v1.1-pixi8 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,482 @@
1
+ // Generated by dts-bundle v0.7.3
2
+ // Dependencies for this module:
3
+ // index.d.ts
4
+
5
+ declare module '@neutrinoparticles/js-v1.1-pixi8' {
6
+ import { Context, ContextOptions } from '@neutrinoparticles/js-v1.1-pixi8/Context';
7
+ export * from '@neutrinoparticles/js-v1.1-pixi8/types';
8
+ export * from '@neutrinoparticles/js-v1.1-pixi8/AplicationPlugin';
9
+ export * from '@neutrinoparticles/js-v1.1-pixi8/Context';
10
+ export * from '@neutrinoparticles/js-v1.1-pixi8/Effect';
11
+ export * from '@neutrinoparticles/js-v1.1-pixi8/EffectModel';
12
+ export * from '@neutrinoparticles/js-v1.1-pixi8/DataTextureManager';
13
+ export * from '@neutrinoparticles/js-v1.1-pixi8/NeutrinoRenderer';
14
+ export * from '@neutrinoparticles/js-v1.1-pixi8/EffectPipe';
15
+ export * from '@neutrinoparticles/js-v1.1-pixi8/TexturesLoader';
16
+ export * from '@neutrinoparticles/js-v1.1-pixi8/PerspectiveProjection';
17
+ export * from '@neutrinoparticles/js-v1.1-pixi8/EffectModelLoader';
18
+ export function registerPlugins(): void;
19
+ export function unregisterPlugins(): void;
20
+ declare module '@neutrinoparticles/js-v1.1-pixi8/index//pixi.js' {
21
+ interface ApplicationOptions {
22
+ neutrino?: ContextOptions;
23
+ }
24
+ interface Application {
25
+ neutrino?: Context;
26
+ }
27
+ }
28
+ }
29
+
30
+ declare module '@neutrinoparticles/js-v1.1-pixi8/Context' {
31
+ import { Renderer } from 'pixi.js';
32
+ import { NeutrinoContext } from '@neutrinoparticles/js-v1.1-pixi8/types';
33
+ export interface ContextOptions {
34
+ texturesBasePath?: string;
35
+ trimmedExtensionsLookupFirst?: boolean;
36
+ }
37
+ export interface ContextLoadData {
38
+ __neutrinoContext__: Context;
39
+ }
40
+ /**
41
+ * Shared GL state for the PIXI v8 NeutrinoParticles integration: the shader
42
+ * program (WebGL2 data-texture path, or the WebGL1 meta-texture path — see
43
+ * docs/tdd/TDD_js-v1.1-webgl1.md), a static quad index buffer (+ VAO on
44
+ * WebGL2 / aId attribute stream on WebGL1), and all uniform locations.
45
+ * Created once per application and reused by every {@link Effect}.
46
+ */
47
+ export class Context {
48
+ readonly neutrino: NeutrinoContext;
49
+ readonly renderer: Renderer;
50
+ readonly gl: WebGL2RenderingContext;
51
+ readonly options: ContextOptions;
52
+ readonly loadData: ContextLoadData;
53
+ static readonly MAX_BATCH_TEXTURES = 8;
54
+ constructor(renderer: Renderer, options?: ContextOptions);
55
+ initializeNoise(path: string, success: () => void, fail: () => void): void;
56
+ generateNoise(): void;
57
+ get shaderProgram(): WebGLProgram;
58
+ get isWebGL1(): boolean;
59
+ /**
60
+ * Textures usable in one batch. 8 on WebGL2; on WebGL1 reduced when the
61
+ * combined texture-unit budget is tight (the vertex stage takes 2 units).
62
+ * A lower cap only produces more batches, never wrong output.
63
+ */
64
+ get maxBatchTextures(): number;
65
+ get uDataTexture(): WebGLUniformLocation | null;
66
+ get uDataTextureWidth(): WebGLUniformLocation | null;
67
+ get uMetaTexture(): WebGLUniformLocation | null;
68
+ get uDataTexSize(): WebGLUniformLocation | null;
69
+ get uCameraRight(): WebGLUniformLocation | null;
70
+ get uCameraUp(): WebGLUniformLocation | null;
71
+ get uCameraDir(): WebGLUniformLocation | null;
72
+ get uViewProjMatrix(): WebGLUniformLocation | null;
73
+ get uModelMatrix(): WebGLUniformLocation | null;
74
+ get uViewportAspect(): WebGLUniformLocation | null;
75
+ get uWorldAlpha(): WebGLUniformLocation | null;
76
+ get uTextures(): (WebGLUniformLocation | null)[];
77
+ get uTexRemaps(): (WebGLUniformLocation | null)[];
78
+ ensureIndexBuffer(maxParticles: number): void;
79
+ get vao(): WebGLVertexArrayObject;
80
+ get indexBuffer(): WebGLBuffer;
81
+ get aIdBuffer(): WebGLBuffer;
82
+ get aIdLocation(): number;
83
+ get indexType(): number;
84
+ /** Unbind any VAO (incl. OES on WebGL1) before raw attribute setup. */
85
+ unbindVao(): void;
86
+ destroy(): void;
87
+ }
88
+ }
89
+
90
+ declare module '@neutrinoparticles/js-v1.1-pixi8/types' {
91
+ export type Vec2 = [number, number];
92
+ export type Vec3 = [number, number, number];
93
+ export type Vec4 = [number, number, number, number];
94
+ export type Quat = [number, number, number, number];
95
+ export type Mat3x2 = [number, number, number, number, number, number];
96
+ export interface RenderInstruction {
97
+ startParticleIndex: number;
98
+ numParticles: number;
99
+ renderStyleIndex: number;
100
+ blendMode: number;
101
+ }
102
+ export interface RenderStyle {
103
+ materialIndex: number;
104
+ textureIndices: number[];
105
+ }
106
+ export interface NeutrinoEffectModel {
107
+ textures: string[];
108
+ materials: number[];
109
+ renderStyles: RenderStyle[];
110
+ totalParticles: number;
111
+ createInstance(position: Vec3, rotation: Quat, options: object): NeutrinoSystem;
112
+ }
113
+ export interface NeutrinoSystem {
114
+ model: NeutrinoEffectModel;
115
+ particleDataUint32: Uint32Array;
116
+ particleDataBuffer: ArrayBuffer;
117
+ particleDataView: DataView;
118
+ dataTextureWidth: number;
119
+ dataTextureHeight: number;
120
+ renderInstructions: RenderInstruction[] & {
121
+ _totalParticles: number;
122
+ };
123
+ update(dt: number, position?: Vec3 | null, rotation?: Quat | null): void;
124
+ construct(cameraDir?: Vec3): void;
125
+ restart(position?: Vec3, rotation?: Quat, options?: object): void;
126
+ resetPosition(position?: Vec3, rotation?: Quat): void;
127
+ pauseAllEmitters(): void;
128
+ unpauseAllEmitters(): void;
129
+ areAllEmittersPaused(): boolean;
130
+ pauseGeneratorsInAllEmitters(): void;
131
+ unpauseGeneratorsInAllEmitters(): void;
132
+ areGeneratorsInAllEmittersPaused(): boolean;
133
+ getNumParticles(): number;
134
+ setPropertyInAllEmitters(name: string, value: number | Vec2 | Vec3): void;
135
+ }
136
+ export interface NeutrinoContext {
137
+ initializeNoise(path: string, success: () => void, fail: () => void): void;
138
+ NoiseGenerator: new () => {
139
+ step(): boolean;
140
+ progress: number;
141
+ };
142
+ axisangle2quat_(axis: Vec3, angleDeg: number): Quat;
143
+ }
144
+ export interface NeutrinoSubRect {
145
+ x: number;
146
+ y: number;
147
+ width: number;
148
+ height: number;
149
+ }
150
+ }
151
+
152
+ declare module '@neutrinoparticles/js-v1.1-pixi8/AplicationPlugin' {
153
+ import { Application } from "pixi.js";
154
+ /**
155
+ * Creates the shared {@link Context} and assigns it to app.neutrino on init.
156
+ */
157
+ export class ApplicationPlugin {
158
+ static get extension(): any;
159
+ static init(this: Application, options: any): void;
160
+ static destroy(this: Application): void;
161
+ }
162
+ }
163
+
164
+ declare module '@neutrinoparticles/js-v1.1-pixi8/Effect' {
165
+ import { Bounds, Container, Instruction, ViewContainer } from 'pixi.js';
166
+ import { EffectModel } from '@neutrinoparticles/js-v1.1-pixi8/EffectModel';
167
+ import { Context } from '@neutrinoparticles/js-v1.1-pixi8/Context';
168
+ import { DataTextureManager } from '@neutrinoparticles/js-v1.1-pixi8/DataTextureManager';
169
+ import { DataTextureManagerGL1 } from '@neutrinoparticles/js-v1.1-pixi8/gl1/DataTextureManagerGL1';
170
+ import { PerspectiveProjection } from '@neutrinoparticles/js-v1.1-pixi8/PerspectiveProjection';
171
+ import { NeutrinoSystem, Vec2, Vec3 } from '@neutrinoparticles/js-v1.1-pixi8/types';
172
+ export enum Pause {
173
+ NO = 0,
174
+ BEFORE_UPDATE_OR_RENDER = 1,
175
+ YES = 2
176
+ }
177
+ export interface EffectOptions {
178
+ position?: Vec3;
179
+ rotation?: number;
180
+ scale?: Vec3;
181
+ pause?: Pause;
182
+ generatorsPaused?: boolean;
183
+ baseParent?: Container;
184
+ projection?: PerspectiveProjection;
185
+ autoInit?: boolean;
186
+ }
187
+ export interface RenderMatrix {
188
+ a: number;
189
+ b: number;
190
+ c: number;
191
+ d: number;
192
+ tx: number;
193
+ ty: number;
194
+ }
195
+ /**
196
+ * A NeutrinoParticles effect instance on a PIXI v8 scene.
197
+ *
198
+ * Extends ViewContainer and plugs into the v8 render graph as a custom render
199
+ * pipe ('neutrino'). Simulation runs on the CPU (neutrinoparticles.js v1.1);
200
+ * geometry is constructed on the GPU from a data texture by {@link NeutrinoRenderer}.
201
+ */
202
+ export class Effect extends ViewContainer implements Instruction {
203
+ readonly renderPipeId: string;
204
+ batched: boolean;
205
+ readonly ctx: Context;
206
+ readonly effectModel: EffectModel;
207
+ effect?: NeutrinoSystem;
208
+ readonly baseParent?: Container;
209
+ readonly projection?: PerspectiveProjection;
210
+ positionZ: number;
211
+ scaleZ: number;
212
+ /** World transform actually fed to the renderer's model matrix (2x3). */
213
+ worldRenderMatrix: RenderMatrix;
214
+ constructor(effectModel: EffectModel, options?: EffectOptions);
215
+ get bounds(): Bounds;
216
+ protected updateBounds(): void;
217
+ init(): void;
218
+ ready(): boolean;
219
+ update(seconds: number): void;
220
+ restart(position?: Vec3, rotation?: number): void;
221
+ resetPosition(position?: Vec3, rotation?: number): void;
222
+ pause(): void;
223
+ unpause(): void;
224
+ pauseGenerators(): void;
225
+ unpauseGenerators(): void;
226
+ setPropertyInAllEmitters(name: string, value: Vec3 | Vec2 | number): void;
227
+ getNumParticles(): number;
228
+ /** @internal — called by EffectPipe during the render pass. */
229
+ _dtm(): DataTextureManager | DataTextureManagerGL1 | undefined;
230
+ /**
231
+ * @internal — called by EffectPipe before constructing the frame.
232
+ * Auto-unpauses an effect whose first interaction is a render rather than an
233
+ * update (Pause.BEFORE_UPDATE_OR_RENDER), then refreshes the world transform
234
+ * from the live scene graph so a parent transform change since the last
235
+ * update() is reflected this frame (mirrors pixi7, which reads
236
+ * baseParent.worldTransform live in its render plugin).
237
+ */
238
+ _prepareRender(): void;
239
+ /**
240
+ * @internal — resolved world alpha fed to the renderer (uWorldAlpha).
241
+ * groupAlpha only accumulates alpha WITHIN the effect's render group; the
242
+ * cross-group factor lives on parentRenderGroup.worldAlpha, so multiply both
243
+ * to honour transparency set on a render-group ancestor.
244
+ */
245
+ get worldAlpha(): number;
246
+ /**
247
+ * @internal — called by EffectPipe. True when the effect is fully
248
+ * transparent, in which case the draw is skipped entirely (mirrors the phaser
249
+ * adapter and PIXI's scene-graph cull of a zero-alpha container). Partial
250
+ * alpha is applied in the shader via uWorldAlpha (see {@link worldAlpha}).
251
+ */
252
+ _isInvisible(): boolean;
253
+ destroy(options?: any): void;
254
+ }
255
+ }
256
+
257
+ declare module '@neutrinoparticles/js-v1.1-pixi8/EffectModel' {
258
+ import { EventEmitter, Texture } from "pixi.js";
259
+ import { Context } from "@neutrinoparticles/js-v1.1-pixi8/Context";
260
+ import { AbstractTexturesLoader } from "@neutrinoparticles/js-v1.1-pixi8/TexturesLoader";
261
+ import { NeutrinoEffectModel, NeutrinoSubRect } from "@neutrinoparticles/js-v1.1-pixi8/types";
262
+ /**
263
+ * Wraps a neutrinoparticles.js v1.1 effect model and loads its textures via the
264
+ * PIXI v8 asset cache. Computes atlas UV remaps (as plain {x,y,width,height}
265
+ * objects — the v1.1 renderer reads them directly, no SubRect wrapper).
266
+ */
267
+ export class EffectModel extends EventEmitter {
268
+ readonly ctx: Context;
269
+ readonly effectModel: NeutrinoEffectModel;
270
+ texturesRemap: Array<NeutrinoSubRect | null>;
271
+ readonly textures: Array<Texture>;
272
+ constructor(context: Context, neutrinoModel: string | NeutrinoEffectModel, texturesLoader: AbstractTexturesLoader);
273
+ ready(): boolean;
274
+ }
275
+ }
276
+
277
+ declare module '@neutrinoparticles/js-v1.1-pixi8/DataTextureManager' {
278
+ /**
279
+ * Manages a small ring of RGBA32F WebGL textures that hold the runtime's flat
280
+ * particle data buffer. Each frame the current texture is re-uploaded (zero-copy
281
+ * from the runtime-owned Uint32Array via a Float32 view) and the ring advances,
282
+ * which avoids GPU pipeline stalls from re-uploading into a texture still in use.
283
+ *
284
+ * Unlike the pixi7 adapter this owns raw GL textures directly (no PIXI texture
285
+ * system), so the exact same class works for both the PIXI v8 and Phaser
286
+ * integrations, which both do their own raw WebGL2 draw.
287
+ */
288
+ export class DataTextureManager {
289
+ readonly textureWidth: number;
290
+ readonly textureHeight: number;
291
+ /**
292
+ * @param gl - WebGL2 context (from the host renderer)
293
+ * @param data - Uint32Array from the runtime. A Float32Array view over the
294
+ * same buffer is uploaded as RGBA32F — bit patterns (incl. NaN/Inf) pass
295
+ * through unchanged.
296
+ * @param textureWidth - from runtime (system.dataTextureWidth)
297
+ * @param textureHeight - from runtime (system.dataTextureHeight)
298
+ */
299
+ constructor(gl: WebGL2RenderingContext, data: Uint32Array, textureWidth: number, textureHeight: number);
300
+ get currentTexture(): WebGLTexture;
301
+ /** Bind the current texture to a unit and upload the latest particle data. */
302
+ uploadAndBind(unit: number): void;
303
+ advance(): void;
304
+ destroy(): void;
305
+ }
306
+ }
307
+
308
+ declare module '@neutrinoparticles/js-v1.1-pixi8/NeutrinoRenderer' {
309
+ import { WebGLRenderer } from "pixi.js";
310
+ import { Context } from "@neutrinoparticles/js-v1.1-pixi8/Context";
311
+ import { Effect } from "@neutrinoparticles/js-v1.1-pixi8/Effect";
312
+ import { DataTextureManager } from "@neutrinoparticles/js-v1.1-pixi8/DataTextureManager";
313
+ import { DataTextureManagerGL1 } from "@neutrinoparticles/js-v1.1-pixi8/gl1/DataTextureManagerGL1";
314
+ /**
315
+ * Raw WebGL2 data-texture renderer for the PIXI v8 integration.
316
+ *
317
+ * Mirrors the pixi7 RendererPlugin: builds draw batches (grouped by blend mode,
318
+ * up to 8 textures each), patches the per-particle texture-slot byte into the
319
+ * runtime data buffer, uploads the data texture, sets camera/projection/model
320
+ * uniforms, and issues one drawElements per batch. Particle textures are bound
321
+ * by their raw WebGL handle (resolved from PIXI via the texture system).
322
+ */
323
+ export class NeutrinoRenderer {
324
+ constructor();
325
+ renderEffect(renderer: WebGLRenderer, ctx: Context, effect: Effect, dtm: DataTextureManager | DataTextureManagerGL1, instructions: any[], numParticles: number): void;
326
+ }
327
+ }
328
+
329
+ declare module '@neutrinoparticles/js-v1.1-pixi8/EffectPipe' {
330
+ import { ExtensionType, InstructionSet, RenderPipe, WebGLRenderer } from "pixi.js";
331
+ import { Effect } from "@neutrinoparticles/js-v1.1-pixi8/Effect";
332
+ /**
333
+ * PIXI v8 render pipe for NeutrinoParticles effects.
334
+ *
335
+ * Each effect is its own instruction (Effect.batched = false). The actual draw
336
+ * happens in {@link execute}, which runs inside the v8 render pass where PIXI
337
+ * owns the GL state — there we construct the frame's geometry and issue the raw
338
+ * WebGL2 data-texture draw via {@link NeutrinoRenderer}.
339
+ */
340
+ export class EffectPipe implements RenderPipe<Effect> {
341
+ static extension: {
342
+ readonly type: readonly [ExtensionType.WebGLPipes];
343
+ readonly name: "neutrino";
344
+ };
345
+ readonly renderer: WebGLRenderer;
346
+ constructor(renderer: WebGLRenderer);
347
+ validateRenderable(_effect: Effect): boolean;
348
+ addRenderable(effect: Effect, instructionSet: InstructionSet): void;
349
+ updateRenderable(_effect: Effect): void;
350
+ destroyRenderable(_effect: Effect): void;
351
+ execute(effect: Effect): void;
352
+ destroy(): void;
353
+ }
354
+ }
355
+
356
+ declare module '@neutrinoparticles/js-v1.1-pixi8/TexturesLoader' {
357
+ import { Loader, Texture } from 'pixi.js';
358
+ /**
359
+ * Texture loader interface used by {@link EffectModel} to load required textures.
360
+ */
361
+ export abstract class AbstractTexturesLoader {
362
+ constructor();
363
+ abstract load(texturePath: string): Promise<Texture>;
364
+ }
365
+ export class AssetsTexturesLoader extends AbstractTexturesLoader {
366
+ constructor(loader: Loader);
367
+ load(texturePath: string): Promise<Texture>;
368
+ }
369
+ export class DefaultAssetsTexturesLoader extends AssetsTexturesLoader {
370
+ static readonly instance: DefaultAssetsTexturesLoader;
371
+ }
372
+ }
373
+
374
+ declare module '@neutrinoparticles/js-v1.1-pixi8/PerspectiveProjection' {
375
+ /**
376
+ * The class implements perspective projection transformation.
377
+ *
378
+ * @example
379
+ * // Create effect instance using loaded model
380
+ * let effect = new PIXINeutrino.Effect(resources.effectModel, {
381
+ * position: [400, 300, 0],
382
+ * projection: new PIXINeutrino.PerspectiveProjection(60.0)
383
+ * });
384
+ *
385
+ * @param {number} [horizontalAngle] Horizontal angle of the perspective projection in degrees.
386
+ */
387
+ import { Rectangle } from "pixi.js";
388
+ import { Vec2, Vec3 } from "@neutrinoparticles/js-v1.1-pixi8/types";
389
+ export class PerspectiveProjection {
390
+ set horizontalAngle(value: number);
391
+ constructor(horizontalAngle: number);
392
+ /**
393
+ * Sets rendering frame for the projection.
394
+ *
395
+ * This method shouldn't be called manually when the class is used with effects. It is called
396
+ * on every render call for each effect automatically.
397
+ * @param {PIXI.Rectangle} frame Rendering frame.
398
+ */
399
+ setScreenFrame(frame: Rectangle): void;
400
+ /**
401
+ * Transforms 3D point accordingly to the projection.
402
+ *
403
+ * Basically, point's position X and Y components are simply scaled dependently on Z position. The method
404
+ * is used in WebGL and Canvas rendering.
405
+ *
406
+ * @param {Array} out [x, y] Transformed position.
407
+ * @param {Array} pos [x, y, z] Untransformed input vertex position.
408
+ * @returns false, if a particle is on the back side of the camera and should be discarded. Otherwise - true.
409
+ */
410
+ transformPosition(out: Vec2, pos: Vec3): boolean;
411
+ /**
412
+ * Transforms 2D size of a particle accordingly to the projection.
413
+ *
414
+ * Basically, size is simply scaled dependently on Z position of a particle. The method is used
415
+ * only in Canvas rendering.
416
+ *
417
+ * @param {Array} outSize [width, height] Transformed size.
418
+ * @param {Array} pos [x, y, z] Untransformed particle position.
419
+ * @param {Array} size [width, height] Untransformed size.
420
+ */
421
+ transformSize(outSize: Vec2, pos: Vec3, size: Vec2): void;
422
+ _getScale(pos: Vec3): number;
423
+ /**
424
+ * Writes the projection as a 4x4 column-major matrix operating in screen
425
+ * space, for the GPU render path. Homogeneous equivalent of
426
+ * transformPosition(): clip.xy = p.xy - center * (p.z / z),
427
+ * clip.w = 1 - p.z / z; the z row is zeroed (no depth on this path).
428
+ * setScreenFrame() must have been called before.
429
+ *
430
+ * @param {Float32Array} out 16-element column-major output matrix.
431
+ */
432
+ writeMatrix(out: Float32Array): void;
433
+ }
434
+ }
435
+
436
+ declare module '@neutrinoparticles/js-v1.1-pixi8/EffectModelLoader' {
437
+ import { ExtensionType, Loader, LoaderParserPriority, ResolvedAsset } from 'pixi.js';
438
+ import { EffectModel } from '@neutrinoparticles/js-v1.1-pixi8/EffectModel';
439
+ export const effectModelLoader: {
440
+ extension: {
441
+ type: ExtensionType;
442
+ priority: LoaderParserPriority;
443
+ };
444
+ test(_url: string, loadAsset: ResolvedAsset, _loader: Loader): any;
445
+ load(url: string, _loadAsset: ResolvedAsset, _loader: Loader): Promise<string>;
446
+ testParse(this: Loader, _asset: any, options: ResolvedAsset): Promise<any>;
447
+ parse(asset: string, options: ResolvedAsset, loader: Loader): Promise<unknown>;
448
+ unload(_effectModel: EffectModel): void;
449
+ };
450
+ }
451
+
452
+ declare module '@neutrinoparticles/js-v1.1-pixi8/gl1/DataTextureManagerGL1' {
453
+ import { MetaTextureManager } from "@neutrinoparticles/js-v1.1-pixi8/gl1/MetaTextureManager";
454
+ export class DataTextureManagerGL1 {
455
+ readonly textureWidth: number;
456
+ readonly textureHeight: number;
457
+ readonly meta: MetaTextureManager;
458
+ constructor(gl: WebGLRenderingContext, data: Uint32Array, textureWidth: number, textureHeight: number);
459
+ get currentDataTexture(): WebGLTexture;
460
+ get currentMetaTexture(): WebGLTexture;
461
+ /**
462
+ * Upload the rows covering `numParticles` into the current ring textures,
463
+ * leaving them bound to `dataUnit` / `metaUnit`. The caller invalidates
464
+ * PIXI's bound-texture bookkeeping for those units.
465
+ */
466
+ upload(numParticles: number, dataUnit: number, metaUnit: number): void;
467
+ advance(): void;
468
+ destroy(): void;
469
+ }
470
+ }
471
+
472
+ declare module '@neutrinoparticles/js-v1.1-pixi8/gl1/MetaTextureManager' {
473
+ export class MetaTextureManager {
474
+ readonly bytes: Uint8Array;
475
+ constructor(textureWidth: number, textureHeight: number);
476
+ /** Repack the packed-u32 record fields for the first `numParticles` records. */
477
+ build(dataUint32: Uint32Array, numParticles: number): void;
478
+ /** Write the batch texture slot into byte0 of M0 (flags) per particle. */
479
+ patchSlot(startParticle: number, count: number, slot: number): void;
480
+ }
481
+ }
482
+