@codexo/exojs-particles 0.15.3 → 0.16.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.
- package/README.md +21 -43
- package/dist/esm/ParticleStorage.d.ts +188 -0
- package/dist/esm/ParticleStorage.d.ts.map +1 -0
- package/dist/esm/ParticleStorage.js +208 -0
- package/dist/esm/ParticleStorage.js.map +1 -0
- package/dist/esm/ParticleSystem.d.ts +189 -60
- package/dist/esm/ParticleSystem.d.ts.map +1 -0
- package/dist/esm/ParticleSystem.js +660 -560
- package/dist/esm/ParticleSystem.js.map +1 -1
- package/dist/esm/distributions/BoxArea.d.ts +1 -0
- package/dist/esm/distributions/BoxArea.d.ts.map +1 -0
- package/dist/esm/distributions/BoxArea.js +38 -44
- package/dist/esm/distributions/BoxArea.js.map +1 -1
- package/dist/esm/distributions/CircleArea.d.ts +1 -0
- package/dist/esm/distributions/CircleArea.d.ts.map +1 -0
- package/dist/esm/distributions/CircleArea.js +30 -28
- package/dist/esm/distributions/CircleArea.js.map +1 -1
- package/dist/esm/distributions/ColorGradient.d.ts +3 -2
- package/dist/esm/distributions/ColorGradient.d.ts.map +1 -0
- package/dist/esm/distributions/ColorGradient.js +70 -75
- package/dist/esm/distributions/ColorGradient.js.map +1 -1
- package/dist/esm/distributions/ConeDirection.d.ts +2 -1
- package/dist/esm/distributions/ConeDirection.d.ts.map +1 -0
- package/dist/esm/distributions/ConeDirection.js +41 -39
- package/dist/esm/distributions/ConeDirection.js.map +1 -1
- package/dist/esm/distributions/Constant.d.ts +1 -0
- package/dist/esm/distributions/Constant.d.ts.map +1 -0
- package/dist/esm/distributions/Constant.js +32 -32
- package/dist/esm/distributions/Constant.js.map +1 -1
- package/dist/esm/distributions/Curve.d.ts +2 -1
- package/dist/esm/distributions/Curve.d.ts.map +1 -0
- package/dist/esm/distributions/Curve.js +46 -55
- package/dist/esm/distributions/Curve.js.map +1 -1
- package/dist/esm/distributions/Distribution.d.ts +4 -3
- package/dist/esm/distributions/Distribution.d.ts.map +1 -0
- package/dist/esm/distributions/LineSegment.d.ts +1 -0
- package/dist/esm/distributions/LineSegment.d.ts.map +1 -0
- package/dist/esm/distributions/LineSegment.js +25 -23
- package/dist/esm/distributions/LineSegment.js.map +1 -1
- package/dist/esm/distributions/Range.d.ts +1 -0
- package/dist/esm/distributions/Range.d.ts.map +1 -0
- package/dist/esm/distributions/Range.js +18 -16
- package/dist/esm/distributions/Range.js.map +1 -1
- package/dist/esm/distributions/VectorRange.d.ts +1 -0
- package/dist/esm/distributions/VectorRange.d.ts.map +1 -0
- package/dist/esm/distributions/VectorRange.js +29 -27
- package/dist/esm/distributions/VectorRange.js.map +1 -1
- package/dist/esm/distributions/index.d.ts +1 -0
- package/dist/esm/distributions/index.d.ts.map +1 -0
- package/dist/esm/gpu/ParticleGpuState.d.ts +143 -18
- package/dist/esm/gpu/ParticleGpuState.d.ts.map +1 -0
- package/dist/esm/gpu/ParticleGpuState.js +655 -497
- package/dist/esm/gpu/ParticleGpuState.js.map +1 -1
- package/dist/esm/gpu/shaders/particle-simulate.wgsl.js +6 -0
- package/dist/esm/gpu/shaders/particle-simulate.wgsl.js.map +1 -0
- package/dist/esm/index.d.ts +1 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +39 -32
- package/dist/esm/modules/AlphaFadeOverLifetime.d.ts +4 -3
- package/dist/esm/modules/AlphaFadeOverLifetime.d.ts.map +1 -0
- package/dist/esm/modules/AlphaFadeOverLifetime.js +68 -55
- package/dist/esm/modules/AlphaFadeOverLifetime.js.map +1 -1
- package/dist/esm/modules/ApplyForce.d.ts +4 -3
- package/dist/esm/modules/ApplyForce.d.ts.map +1 -0
- package/dist/esm/modules/ApplyForce.js +49 -43
- package/dist/esm/modules/ApplyForce.js.map +1 -1
- package/dist/esm/modules/AttractToPoint.d.ts +4 -3
- package/dist/esm/modules/AttractToPoint.d.ts.map +1 -0
- package/dist/esm/modules/AttractToPoint.js +73 -62
- package/dist/esm/modules/AttractToPoint.js.map +1 -1
- package/dist/esm/modules/BurstSpawn.d.ts +6 -18
- package/dist/esm/modules/BurstSpawn.d.ts.map +1 -0
- package/dist/esm/modules/BurstSpawn.js +56 -91
- package/dist/esm/modules/BurstSpawn.js.map +1 -1
- package/dist/esm/modules/ColorOverLifetime.d.ts +4 -3
- package/dist/esm/modules/ColorOverLifetime.d.ts.map +1 -0
- package/dist/esm/modules/ColorOverLifetime.js +65 -53
- package/dist/esm/modules/ColorOverLifetime.js.map +1 -1
- package/dist/esm/modules/ColorOverSpeed.d.ts +5 -4
- package/dist/esm/modules/ColorOverSpeed.d.ts.map +1 -0
- package/dist/esm/modules/ColorOverSpeed.js +90 -75
- package/dist/esm/modules/ColorOverSpeed.js.map +1 -1
- package/dist/esm/modules/DeathModule.d.ts +26 -10
- package/dist/esm/modules/DeathModule.d.ts.map +1 -0
- package/dist/esm/modules/DeathModule.js +38 -22
- package/dist/esm/modules/DeathModule.js.map +1 -1
- package/dist/esm/modules/Drag.d.ts +3 -2
- package/dist/esm/modules/Drag.d.ts.map +1 -0
- package/dist/esm/modules/Drag.js +43 -37
- package/dist/esm/modules/Drag.js.map +1 -1
- package/dist/esm/modules/OrbitalForce.d.ts +4 -3
- package/dist/esm/modules/OrbitalForce.d.ts.map +1 -0
- package/dist/esm/modules/OrbitalForce.js +70 -58
- package/dist/esm/modules/OrbitalForce.js.map +1 -1
- package/dist/esm/modules/RateSpawn.d.ts +7 -22
- package/dist/esm/modules/RateSpawn.d.ts.map +1 -0
- package/dist/esm/modules/RateSpawn.js +39 -71
- package/dist/esm/modules/RateSpawn.js.map +1 -1
- package/dist/esm/modules/RepelFromPoint.d.ts +4 -3
- package/dist/esm/modules/RepelFromPoint.d.ts.map +1 -0
- package/dist/esm/modules/RepelFromPoint.js +72 -62
- package/dist/esm/modules/RepelFromPoint.js.map +1 -1
- package/dist/esm/modules/RotateOverLifetime.d.ts +3 -2
- package/dist/esm/modules/RotateOverLifetime.d.ts.map +1 -0
- package/dist/esm/modules/RotateOverLifetime.js +40 -36
- package/dist/esm/modules/RotateOverLifetime.js.map +1 -1
- package/dist/esm/modules/ScaleOverLifetime.d.ts +5 -4
- package/dist/esm/modules/ScaleOverLifetime.d.ts.map +1 -0
- package/dist/esm/modules/ScaleOverLifetime.js +60 -50
- package/dist/esm/modules/ScaleOverLifetime.js.map +1 -1
- package/dist/esm/modules/SpawnModule.d.ts +15 -12
- package/dist/esm/modules/SpawnModule.d.ts.map +1 -0
- package/dist/esm/modules/SpawnModule.js +32 -28
- package/dist/esm/modules/SpawnModule.js.map +1 -1
- package/dist/esm/modules/SpawnOnDeath.d.ts +13 -9
- package/dist/esm/modules/SpawnOnDeath.d.ts.map +1 -0
- package/dist/esm/modules/SpawnOnDeath.js +41 -43
- package/dist/esm/modules/SpawnOnDeath.js.map +1 -1
- package/dist/esm/modules/Turbulence.d.ts +4 -3
- package/dist/esm/modules/Turbulence.d.ts.map +1 -0
- package/dist/esm/modules/Turbulence.js +101 -89
- package/dist/esm/modules/Turbulence.js.map +1 -1
- package/dist/esm/modules/UpdateModule.d.ts +21 -13
- package/dist/esm/modules/UpdateModule.d.ts.map +1 -0
- package/dist/esm/modules/UpdateModule.js +65 -63
- package/dist/esm/modules/UpdateModule.js.map +1 -1
- package/dist/esm/modules/VelocityOverLifetime.d.ts +7 -6
- package/dist/esm/modules/VelocityOverLifetime.d.ts.map +1 -0
- package/dist/esm/modules/VelocityOverLifetime.js +75 -73
- package/dist/esm/modules/VelocityOverLifetime.js.map +1 -1
- package/dist/esm/modules/WgslContribution.d.ts +16 -15
- package/dist/esm/modules/WgslContribution.d.ts.map +1 -0
- package/dist/esm/modules/WgslContribution.js +37 -29
- package/dist/esm/modules/WgslContribution.js.map +1 -1
- package/dist/esm/modules/index.d.ts +3 -1
- package/dist/esm/modules/index.d.ts.map +1 -0
- package/dist/esm/modules/spawnFields.d.ts +32 -0
- package/dist/esm/modules/spawnFields.d.ts.map +1 -0
- package/dist/esm/modules/spawnFields.js +31 -0
- package/dist/esm/modules/spawnFields.js.map +1 -0
- package/dist/esm/particlesBuildInfo.d.ts +1 -0
- package/dist/esm/particlesBuildInfo.d.ts.map +1 -0
- package/dist/esm/particlesBuildInfo.js +6 -4
- package/dist/esm/particlesBuildInfo.js.map +1 -1
- package/dist/esm/particlesExtension.d.ts +13 -5
- package/dist/esm/particlesExtension.d.ts.map +1 -0
- package/dist/esm/particlesExtension.js +38 -42
- package/dist/esm/particlesExtension.js.map +1 -1
- package/dist/esm/public.d.ts +11 -0
- package/dist/esm/public.d.ts.map +1 -0
- package/dist/esm/renderModes/MeshParticles.d.ts +128 -0
- package/dist/esm/renderModes/MeshParticles.d.ts.map +1 -0
- package/dist/esm/renderModes/MeshParticles.js +263 -0
- package/dist/esm/renderModes/MeshParticles.js.map +1 -0
- package/dist/esm/renderModes/ParticleBufferLayout.d.ts +59 -0
- package/dist/esm/renderModes/ParticleBufferLayout.d.ts.map +1 -0
- package/dist/esm/renderModes/ParticleBufferLayout.js +99 -0
- package/dist/esm/renderModes/ParticleBufferLayout.js.map +1 -0
- package/dist/esm/renderModes/ParticleInstanceWriter.d.ts +58 -0
- package/dist/esm/renderModes/ParticleInstanceWriter.d.ts.map +1 -0
- package/dist/esm/renderModes/ParticleInstanceWriter.js +173 -0
- package/dist/esm/renderModes/ParticleInstanceWriter.js.map +1 -0
- package/dist/esm/renderModes/ParticleMaterial.d.ts +18 -0
- package/dist/esm/renderModes/ParticleMaterial.d.ts.map +1 -0
- package/dist/esm/renderModes/ParticleMaterial.js +24 -0
- package/dist/esm/renderModes/ParticleMaterial.js.map +1 -0
- package/dist/esm/renderModes/ParticleRenderMode.d.ts +114 -0
- package/dist/esm/renderModes/ParticleRenderMode.d.ts.map +1 -0
- package/dist/esm/renderModes/ParticleRenderMode.js +99 -0
- package/dist/esm/renderModes/ParticleRenderMode.js.map +1 -0
- package/dist/esm/renderModes/QuadParticles.d.ts +55 -0
- package/dist/esm/renderModes/QuadParticles.d.ts.map +1 -0
- package/dist/esm/renderModes/QuadParticles.js +95 -0
- package/dist/esm/renderModes/QuadParticles.js.map +1 -0
- package/dist/esm/renderModes/RibbonParticles.d.ts +96 -0
- package/dist/esm/renderModes/RibbonParticles.d.ts.map +1 -0
- package/dist/esm/renderModes/RibbonParticles.js +202 -0
- package/dist/esm/renderModes/RibbonParticles.js.map +1 -0
- package/dist/esm/renderModes/shaders/mesh-particles.wgsl.js +6 -0
- package/dist/esm/renderModes/shaders/mesh-particles.wgsl.js.map +1 -0
- package/dist/esm/renderModes/shaders/mesh.vert.js +6 -0
- package/dist/esm/renderModes/shaders/mesh.vert.js.map +1 -0
- package/dist/esm/renderModes/shaders/quad-particles.wgsl.js +6 -0
- package/dist/esm/renderModes/shaders/quad-particles.wgsl.js.map +1 -0
- package/dist/esm/renderModes/shaders/ribbon-particles.wgsl.js +6 -0
- package/dist/esm/renderModes/shaders/ribbon-particles.wgsl.js.map +1 -0
- package/dist/esm/renderModes/shaders/ribbon.frag.js +6 -0
- package/dist/esm/renderModes/shaders/ribbon.frag.js.map +1 -0
- package/dist/esm/renderModes/shaders/ribbon.vert.js +6 -0
- package/dist/esm/renderModes/shaders/ribbon.vert.js.map +1 -0
- package/dist/esm/renderers/WebGl2ParticleRenderer.d.ts +48 -20
- package/dist/esm/renderers/WebGl2ParticleRenderer.d.ts.map +1 -0
- package/dist/esm/renderers/WebGl2ParticleRenderer.js +317 -321
- package/dist/esm/renderers/WebGl2ParticleRenderer.js.map +1 -1
- package/dist/esm/renderers/WebGpuParticleRenderer.d.ts +99 -18
- package/dist/esm/renderers/WebGpuParticleRenderer.d.ts.map +1 -0
- package/dist/esm/renderers/WebGpuParticleRenderer.js +542 -551
- package/dist/esm/renderers/WebGpuParticleRenderer.js.map +1 -1
- package/dist/esm/renderers/shaders/particle.frag.js +6 -0
- package/dist/esm/renderers/shaders/particle.frag.js.map +1 -0
- package/dist/esm/renderers/shaders/particle.vert.js +6 -0
- package/dist/esm/renderers/shaders/particle.vert.js.map +1 -0
- package/package.json +8 -15
- package/dist/esm/index.js.map +0 -1
- package/dist/esm/register.d.ts +0 -1
- package/dist/esm/register.js +0 -43
- package/dist/esm/register.js.map +0 -1
- package/dist/esm/renderers/glsl/particle.frag.js +0 -4
- package/dist/esm/renderers/glsl/particle.frag.js.map +0 -1
- package/dist/esm/renderers/glsl/particle.vert.js +0 -4
- package/dist/esm/renderers/glsl/particle.vert.js.map +0 -1
|
@@ -1,325 +1,321 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import
|
|
3
|
-
import vertexSource from './glsl/particle.vert.js';
|
|
1
|
+
import { assertVertexGeometryCompatible } from "../renderModes/ParticleBufferLayout.js";
|
|
2
|
+
import { AbstractWebGl2Renderer, BufferTypes, BufferUsage, RenderingPrimitives, Shader, WebGl2RenderBuffer, WebGl2VertexArrayObject, createWebGl2ShaderProgram, uploadBufferRange, uploadBufferStore } from "@codexo/exojs/renderer-sdk";
|
|
4
3
|
|
|
4
|
+
//#region src/renderers/WebGl2ParticleRenderer.ts
|
|
5
|
+
const resolvePrimitive = (topology) => {
|
|
6
|
+
switch (topology) {
|
|
7
|
+
case "triangle-list": return RenderingPrimitives.Triangles;
|
|
8
|
+
case "triangle-strip": return RenderingPrimitives.TriangleStrip;
|
|
9
|
+
}
|
|
10
|
+
};
|
|
11
|
+
const usageByGeometryUsage = {
|
|
12
|
+
static: BufferUsage.StaticDraw,
|
|
13
|
+
dynamic: BufferUsage.DynamicDraw,
|
|
14
|
+
stream: BufferUsage.StreamDraw
|
|
15
|
+
};
|
|
5
16
|
/**
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
*
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
drawInstanced: (vao, count, start, instanceCount, type) => {
|
|
308
|
-
const gl = connection.gl;
|
|
309
|
-
if (vao.indexBuffer) {
|
|
310
|
-
gl.drawElementsInstanced(type, count, gl.UNSIGNED_SHORT, start, instanceCount);
|
|
311
|
-
}
|
|
312
|
-
else {
|
|
313
|
-
gl.drawArraysInstanced(type, start, count, instanceCount);
|
|
314
|
-
}
|
|
315
|
-
},
|
|
316
|
-
destroy: (vao) => {
|
|
317
|
-
connection.gl.deleteVertexArray(connection.vaoHandle);
|
|
318
|
-
vao.disconnect();
|
|
319
|
-
},
|
|
320
|
-
};
|
|
321
|
-
}
|
|
322
|
-
}
|
|
17
|
+
* Attribute component types that reach the shader as raw integers rather than
|
|
18
|
+
* as floats. Everything else - including normalised integer types such as the
|
|
19
|
+
* quad mode's `u8x4` colour - goes through `vertexAttribPointer` and arrives as
|
|
20
|
+
* a float, so only these two need `vertexAttribIPointer`.
|
|
21
|
+
*/
|
|
22
|
+
const integerAttributeTypes = /* @__PURE__ */ new Set(["u32", "i32"]);
|
|
23
|
+
const resolveAttributeType = (gl, type) => {
|
|
24
|
+
switch (type) {
|
|
25
|
+
case "f32": return gl.FLOAT;
|
|
26
|
+
case "u8": return gl.UNSIGNED_BYTE;
|
|
27
|
+
case "u16": return gl.UNSIGNED_SHORT;
|
|
28
|
+
case "u32": return gl.UNSIGNED_INT;
|
|
29
|
+
case "i32": return gl.INT;
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* Particle renderer for WebGL2.
|
|
34
|
+
*
|
|
35
|
+
* One ParticleSystem = one batch. The system's {@link ParticleRenderMode} owns
|
|
36
|
+
* the *how* - vertex layout, shader pair, draw model and the loop that fills
|
|
37
|
+
* the buffer - and this renderer is the executor: each `render(system)` flushes
|
|
38
|
+
* any pending batch, sets the system-level uniforms (transform, local bounds,
|
|
39
|
+
* texture) and asks the mode to build its vertex data. The next `flush()`
|
|
40
|
+
* uploads that data and issues the single draw the mode declares.
|
|
41
|
+
*
|
|
42
|
+
* Everything mode-specific is read off the mode's `dataLayout`/`Material`, so a
|
|
43
|
+
* new primitive is a new mode rather than a change here: the vertex array
|
|
44
|
+
* object is wired from the layout's named attributes, the draw is instanced or
|
|
45
|
+
* plain per `ParticleRenderMode.instanced`, and its primitive comes from the
|
|
46
|
+
* topology.
|
|
47
|
+
*
|
|
48
|
+
* A mode declaring a `vertexGeometry` adds a second buffer to that vertex array
|
|
49
|
+
* object, stepping per vertex (divisor 0) beside the per-instance one, and its
|
|
50
|
+
* geometry supplies the topology and indices instead.
|
|
51
|
+
*/
|
|
52
|
+
var WebGl2ParticleRenderer = class extends AbstractWebGl2Renderer {
|
|
53
|
+
/**
|
|
54
|
+
* The particle system's transform is bound as a `u_systemTransform` uniform and
|
|
55
|
+
* each particle is positioned system-locally, so this renderer never reads the
|
|
56
|
+
* shared {@link TransformBuffer}; the render-group upload boundary skips writing
|
|
57
|
+
* transform records for particle draws.
|
|
58
|
+
* @internal
|
|
59
|
+
*/
|
|
60
|
+
_consumesSharedTransform = false;
|
|
61
|
+
/** Particles the GL-side vertex store is pre-sized for. A hint, not a limit. */
|
|
62
|
+
_batchSize;
|
|
63
|
+
_resources = /* @__PURE__ */ new Map();
|
|
64
|
+
/**
|
|
65
|
+
* Materials this renderer already registered a dispose listener on.
|
|
66
|
+
*
|
|
67
|
+
* `Material` has no unsubscribe, and a disconnect clears {@link _resources}
|
|
68
|
+
* without clearing the material's callback set - so registering on every
|
|
69
|
+
* resource creation would leave one dead closure per material behind on
|
|
70
|
+
* every device-loss/reconnect cycle. The listener stays valid across those
|
|
71
|
+
* cycles (it resolves the entry through the map when it fires), so it is
|
|
72
|
+
* registered once and this set remembers that. Weak, so a material dropped
|
|
73
|
+
* without `destroy()` stays collectable.
|
|
74
|
+
*/
|
|
75
|
+
_disposeListenerRegistered = /* @__PURE__ */ new WeakSet();
|
|
76
|
+
_drawCount = 0;
|
|
77
|
+
_pendingMode = null;
|
|
78
|
+
_pendingResources = null;
|
|
79
|
+
_currentTexture = null;
|
|
80
|
+
_currentBlendMode = null;
|
|
81
|
+
_connection = null;
|
|
82
|
+
constructor(batchSize) {
|
|
83
|
+
super();
|
|
84
|
+
this._batchSize = batchSize;
|
|
85
|
+
}
|
|
86
|
+
render(system) {
|
|
87
|
+
const backend = this.getBackend();
|
|
88
|
+
const { texture, blendMode } = system;
|
|
89
|
+
const textureChanged = texture !== this._currentTexture;
|
|
90
|
+
const blendModeChanged = blendMode !== this._currentBlendMode;
|
|
91
|
+
this.flush();
|
|
92
|
+
if (textureChanged) {
|
|
93
|
+
this._currentTexture = texture;
|
|
94
|
+
backend.bindTexture(texture);
|
|
95
|
+
}
|
|
96
|
+
if (blendModeChanged) {
|
|
97
|
+
this._currentBlendMode = blendMode;
|
|
98
|
+
backend.setBlendMode(blendMode);
|
|
99
|
+
}
|
|
100
|
+
const mode = system.renderMode;
|
|
101
|
+
const resources = this._getOrCreateResources(mode);
|
|
102
|
+
const shader = resources.shader;
|
|
103
|
+
if (shader.uniforms.has("u_systemTransform")) shader.getUniform("u_systemTransform").setValue(system.getGlobalTransform().toArray(false));
|
|
104
|
+
if (shader.uniforms.has("u_localBounds")) shader.getUniform("u_localBounds").setValue(system.vertices);
|
|
105
|
+
mode.build(system, system._storage);
|
|
106
|
+
this._pendingMode = mode;
|
|
107
|
+
this._pendingResources = resources;
|
|
108
|
+
this._drawCount = mode.count;
|
|
109
|
+
return this;
|
|
110
|
+
}
|
|
111
|
+
flush() {
|
|
112
|
+
const backend = this.getBackendOrNull();
|
|
113
|
+
const mode = this._pendingMode;
|
|
114
|
+
const resources = this._pendingResources;
|
|
115
|
+
if (this._drawCount === 0 || backend === null || mode === null || resources === null) return;
|
|
116
|
+
const view = backend.view;
|
|
117
|
+
if (resources.view !== view || resources.viewId !== view.updateId) {
|
|
118
|
+
resources.view = view;
|
|
119
|
+
resources.viewId = view.updateId;
|
|
120
|
+
if (resources.shader.uniforms.has("u_projection")) resources.shader.getUniform("u_projection").setValue(view.getTransform().toArray(false));
|
|
121
|
+
}
|
|
122
|
+
resources.shader.sync();
|
|
123
|
+
backend.bindVertexArrayObject(resources.vao);
|
|
124
|
+
const meshGeometry = mode.vertexGeometry;
|
|
125
|
+
if (meshGeometry !== null && resources.meshBuffer !== null && resources.meshVersion !== meshGeometry.version) {
|
|
126
|
+
resources.meshVersion = meshGeometry.version;
|
|
127
|
+
resources.meshBuffer.upload(meshGeometry.vertexData);
|
|
128
|
+
}
|
|
129
|
+
resources.vertexBuffer.upload(this._resolveUploadSource(mode, resources), 0, this._drawCount * resources.stride);
|
|
130
|
+
const sampler = mode.material.sampler;
|
|
131
|
+
if (sampler !== null) backend.bindMaterialSampler(sampler, 0);
|
|
132
|
+
if (resources.instanced) resources.vao.drawInstanced(resources.indexCount, 0, this._drawCount, resources.primitive);
|
|
133
|
+
else resources.vao.draw(resources.indexBuffer !== null ? resources.indexCount : this._drawCount, 0, resources.primitive);
|
|
134
|
+
if (sampler !== null) backend.unbindMaterialSampler(0);
|
|
135
|
+
backend.stats.batches++;
|
|
136
|
+
backend.stats.drawCalls++;
|
|
137
|
+
this._drawCount = 0;
|
|
138
|
+
this._pendingMode = null;
|
|
139
|
+
this._pendingResources = null;
|
|
140
|
+
}
|
|
141
|
+
onConnect(backend) {
|
|
142
|
+
this._connection = {
|
|
143
|
+
gl: backend.context,
|
|
144
|
+
buffers: /* @__PURE__ */ new Map()
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
onDisconnect() {
|
|
148
|
+
for (const resources of this._resources.values()) this._destroyResources(resources);
|
|
149
|
+
this._resources.clear();
|
|
150
|
+
this._connection = null;
|
|
151
|
+
this._currentTexture = null;
|
|
152
|
+
this._currentBlendMode = null;
|
|
153
|
+
this._drawCount = 0;
|
|
154
|
+
this._pendingMode = null;
|
|
155
|
+
this._pendingResources = null;
|
|
156
|
+
}
|
|
157
|
+
destroy() {
|
|
158
|
+
this.disconnect();
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* The mode's scratch buffer as bytes. The view is cached and only rebuilt
|
|
162
|
+
* when the mode swaps in a larger backing buffer; how much of it this draw
|
|
163
|
+
* uploads is expressed as an element count at the upload call, so a steady
|
|
164
|
+
* frame allocates nothing at all.
|
|
165
|
+
*/
|
|
166
|
+
_resolveUploadSource(mode, resources) {
|
|
167
|
+
const data = mode.data;
|
|
168
|
+
if (resources.source !== data) {
|
|
169
|
+
resources.source = data;
|
|
170
|
+
resources.bytes = new Uint8Array(data);
|
|
171
|
+
}
|
|
172
|
+
return resources.bytes;
|
|
173
|
+
}
|
|
174
|
+
_getOrCreateResources(mode) {
|
|
175
|
+
const connection = this._connection;
|
|
176
|
+
if (connection === null) throw new Error("WebGl2ParticleRenderer is not connected to a backend.");
|
|
177
|
+
const material = mode.material;
|
|
178
|
+
const cached = this._resources.get(material);
|
|
179
|
+
if (cached !== void 0) return cached;
|
|
180
|
+
const created = this._createResources(mode, material, connection);
|
|
181
|
+
this._resources.set(material, created);
|
|
182
|
+
if (!this._disposeListenerRegistered.has(material)) {
|
|
183
|
+
this._disposeListenerRegistered.add(material);
|
|
184
|
+
material._onDispose(() => {
|
|
185
|
+
this._disposeListenerRegistered.delete(material);
|
|
186
|
+
const stored = this._resources.get(material);
|
|
187
|
+
if (stored === void 0) return;
|
|
188
|
+
if (this._pendingResources === stored) {
|
|
189
|
+
this._drawCount = 0;
|
|
190
|
+
this._pendingMode = null;
|
|
191
|
+
this._pendingResources = null;
|
|
192
|
+
}
|
|
193
|
+
this._destroyResources(stored);
|
|
194
|
+
this._resources.delete(material);
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
return created;
|
|
198
|
+
}
|
|
199
|
+
_createResources(mode, material, connection) {
|
|
200
|
+
const gl = connection.gl;
|
|
201
|
+
const glsl = material.shader.glsl;
|
|
202
|
+
if (glsl === null) throw new Error("Particle material shader has no `glsl` source; cannot render through the WebGL2 backend.");
|
|
203
|
+
const layout = mode.dataLayout;
|
|
204
|
+
const meshGeometry = mode.vertexGeometry;
|
|
205
|
+
assertVertexGeometryCompatible(layout, meshGeometry, mode.instanced, mode.constructor.name);
|
|
206
|
+
const shader = new Shader(glsl.vertex, glsl.fragment);
|
|
207
|
+
shader.connect(createWebGl2ShaderProgram(gl));
|
|
208
|
+
shader.sync();
|
|
209
|
+
const indices = meshGeometry !== null ? meshGeometry.indices : layout.indices;
|
|
210
|
+
const topology = meshGeometry !== null ? meshGeometry.topology : layout.topology;
|
|
211
|
+
const indexCount = meshGeometry !== null ? meshGeometry.indexCount : layout.indexCount;
|
|
212
|
+
const indexBuffer = indices !== null ? new WebGl2RenderBuffer(BufferTypes.ElementArrayBuffer, indices, BufferUsage.StaticDraw).connect(this._createBufferRuntime(connection)) : null;
|
|
213
|
+
const vertexBuffer = new WebGl2RenderBuffer(BufferTypes.ArrayBuffer, new ArrayBuffer(this._batchSize * layout.stride), usageByGeometryUsage[layout.usage]).connect(this._createBufferRuntime(connection));
|
|
214
|
+
const meshBuffer = meshGeometry !== null ? new WebGl2RenderBuffer(BufferTypes.ArrayBuffer, meshGeometry.vertexData, usageByGeometryUsage[meshGeometry.usage]).connect(this._createBufferRuntime(connection)) : null;
|
|
215
|
+
const vaoHandle = gl.createVertexArray();
|
|
216
|
+
if (vaoHandle === null) throw new Error("WebGl2ParticleRenderer: could not create vertex array object.");
|
|
217
|
+
const divisor = mode.instanced ? 1 : 0;
|
|
218
|
+
const vao = new WebGl2VertexArrayObject();
|
|
219
|
+
if (indexBuffer !== null) vao.addIndex(indexBuffer);
|
|
220
|
+
for (const attribute of layout.attributes) vao.addAttribute(vertexBuffer, shader.getAttribute(attribute.name), resolveAttributeType(gl, attribute.type), attribute.normalized, layout.stride, attribute.offset, !attribute.normalized && integerAttributeTypes.has(attribute.type), divisor);
|
|
221
|
+
if (meshGeometry !== null && meshBuffer !== null) for (const attribute of meshGeometry.attributes) vao.addAttribute(meshBuffer, shader.getAttribute(attribute.name), resolveAttributeType(gl, attribute.type), attribute.normalized, meshGeometry.stride, attribute.offset, !attribute.normalized && integerAttributeTypes.has(attribute.type), 0);
|
|
222
|
+
vao.connect(this._createVaoRuntime(connection, vaoHandle, indices instanceof Uint32Array ? gl.UNSIGNED_INT : gl.UNSIGNED_SHORT));
|
|
223
|
+
return {
|
|
224
|
+
shader,
|
|
225
|
+
vao,
|
|
226
|
+
vertexBuffer,
|
|
227
|
+
meshBuffer,
|
|
228
|
+
meshVersion: meshGeometry?.version ?? -1,
|
|
229
|
+
indexBuffer,
|
|
230
|
+
stride: layout.stride,
|
|
231
|
+
primitive: resolvePrimitive(topology),
|
|
232
|
+
instanced: mode.instanced,
|
|
233
|
+
indexCount,
|
|
234
|
+
bytes: /* @__PURE__ */ new Uint8Array(0),
|
|
235
|
+
source: null,
|
|
236
|
+
view: null,
|
|
237
|
+
viewId: -1
|
|
238
|
+
};
|
|
239
|
+
}
|
|
240
|
+
_destroyResources(resources) {
|
|
241
|
+
resources.vao.destroy();
|
|
242
|
+
resources.vertexBuffer.destroy();
|
|
243
|
+
resources.meshBuffer?.destroy();
|
|
244
|
+
resources.indexBuffer?.destroy();
|
|
245
|
+
resources.shader.destroy();
|
|
246
|
+
}
|
|
247
|
+
_createBufferRuntime(connection) {
|
|
248
|
+
const handle = connection.gl.createBuffer();
|
|
249
|
+
if (handle === null) throw new Error("WebGl2ParticleRenderer: could not create render buffer.");
|
|
250
|
+
return {
|
|
251
|
+
bind: (buffer) => {
|
|
252
|
+
connection.gl.bindBuffer(buffer.type, handle);
|
|
253
|
+
},
|
|
254
|
+
upload: (buffer, offset) => {
|
|
255
|
+
const gl = connection.gl;
|
|
256
|
+
const state = connection.buffers.get(buffer);
|
|
257
|
+
gl.bindBuffer(buffer.type, handle);
|
|
258
|
+
if (state && state.dataByteLength >= buffer.uploadByteLength) {
|
|
259
|
+
uploadBufferRange(gl, buffer, offset);
|
|
260
|
+
state.dataByteLength = buffer.uploadByteLength;
|
|
261
|
+
} else {
|
|
262
|
+
uploadBufferStore(gl, buffer);
|
|
263
|
+
connection.buffers.set(buffer, {
|
|
264
|
+
handle,
|
|
265
|
+
dataByteLength: buffer.uploadByteLength
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
},
|
|
269
|
+
destroy: (buffer) => {
|
|
270
|
+
connection.gl.deleteBuffer(handle);
|
|
271
|
+
connection.buffers.delete(buffer);
|
|
272
|
+
buffer.disconnect();
|
|
273
|
+
}
|
|
274
|
+
};
|
|
275
|
+
}
|
|
276
|
+
_createVaoRuntime(connection, vaoHandle, indexType) {
|
|
277
|
+
let appliedVersion = -1;
|
|
278
|
+
return {
|
|
279
|
+
bind: (vao) => {
|
|
280
|
+
const gl = connection.gl;
|
|
281
|
+
gl.bindVertexArray(vaoHandle);
|
|
282
|
+
if (appliedVersion !== vao.version) {
|
|
283
|
+
let lastBuffer = null;
|
|
284
|
+
for (const attribute of vao.attributes) {
|
|
285
|
+
if (lastBuffer !== attribute.buffer) {
|
|
286
|
+
attribute.buffer.bind();
|
|
287
|
+
lastBuffer = attribute.buffer;
|
|
288
|
+
}
|
|
289
|
+
if (attribute.integer) gl.vertexAttribIPointer(attribute.location, attribute.size, attribute.type, attribute.stride, attribute.start);
|
|
290
|
+
else gl.vertexAttribPointer(attribute.location, attribute.size, attribute.type, attribute.normalized, attribute.stride, attribute.start);
|
|
291
|
+
gl.enableVertexAttribArray(attribute.location);
|
|
292
|
+
gl.vertexAttribDivisor(attribute.location, attribute.divisor);
|
|
293
|
+
}
|
|
294
|
+
if (vao.indexBuffer) vao.indexBuffer.bind();
|
|
295
|
+
appliedVersion = vao.version;
|
|
296
|
+
}
|
|
297
|
+
},
|
|
298
|
+
unbind: () => {
|
|
299
|
+
connection.gl.bindVertexArray(null);
|
|
300
|
+
},
|
|
301
|
+
draw: (vao, size, start, type) => {
|
|
302
|
+
const gl = connection.gl;
|
|
303
|
+
if (vao.indexBuffer) gl.drawElements(type, size, indexType, start);
|
|
304
|
+
else gl.drawArrays(type, start, size);
|
|
305
|
+
},
|
|
306
|
+
drawInstanced: (vao, count, start, instanceCount, type) => {
|
|
307
|
+
const gl = connection.gl;
|
|
308
|
+
if (vao.indexBuffer) gl.drawElementsInstanced(type, count, indexType, start, instanceCount);
|
|
309
|
+
else gl.drawArraysInstanced(type, start, count, instanceCount);
|
|
310
|
+
},
|
|
311
|
+
destroy: (vao) => {
|
|
312
|
+
connection.gl.deleteVertexArray(vaoHandle);
|
|
313
|
+
vao.disconnect();
|
|
314
|
+
}
|
|
315
|
+
};
|
|
316
|
+
}
|
|
317
|
+
};
|
|
323
318
|
|
|
319
|
+
//#endregion
|
|
324
320
|
export { WebGl2ParticleRenderer };
|
|
325
|
-
//# sourceMappingURL=WebGl2ParticleRenderer.js.map
|
|
321
|
+
//# sourceMappingURL=WebGl2ParticleRenderer.js.map
|