@woosh/meep-engine 3.18.0 → 3.19.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/build/bundle-worker-image-decoder.js +1 -1
- package/editor/view/particles/effect/ParticleCurveEditorView.d.ts.map +1 -1
- package/editor/view/particles/effect/ParticleCurveEditorView.js +303 -120
- package/editor/view/particles/effect/ParticleGradientEditorView.d.ts.map +1 -1
- package/editor/view/particles/effect/ParticleGradientEditorView.js +108 -63
- package/editor/view/particles/effect/ParticleGraphEditorView.js +1 -1
- package/editor/view/particles/effect/ParticleNodeParametersView.d.ts.map +1 -1
- package/editor/view/particles/effect/ParticleNodeParametersView.js +3 -1
- package/editor/view/particles/effect/particle-editor.css +60 -30
- package/package.json +1 -2
- package/samples/engine/README.md +1 -1
- package/src/core/binary/compression/decompress_bytes.d.ts +13 -0
- package/src/core/binary/compression/decompress_bytes.d.ts.map +1 -0
- package/src/core/binary/compression/decompress_bytes.js +28 -0
- package/src/core/model/node-graph/visual/layout/layout_assign_coordinates.js +67 -22
- package/src/engine/asset/loaders/image/ImageDecoderWorker.js +12 -27
- package/src/engine/asset/loaders/image/prototypePNG.js +8 -7
- package/src/engine/ecs/storage/populateEngineSerializationRegistry.d.ts.map +1 -1
- package/src/engine/ecs/storage/populateEngineSerializationRegistry.js +4 -0
- package/src/engine/graphics/ecs/particles/ParticleEffect.d.ts +266 -0
- package/src/engine/graphics/ecs/particles/ParticleEffect.d.ts.map +1 -0
- package/src/engine/graphics/ecs/particles/ParticleEffect.js +455 -0
- package/src/engine/graphics/ecs/particles/ParticleEffectSerializationAdapter.d.ts +58 -0
- package/src/engine/graphics/ecs/particles/ParticleEffectSerializationAdapter.d.ts.map +1 -0
- package/src/engine/graphics/ecs/particles/ParticleEffectSerializationAdapter.js +219 -0
- package/src/engine/graphics3/GPUParticleEmitterSystem.d.ts +178 -25
- package/src/engine/graphics3/GPUParticleEmitterSystem.d.ts.map +1 -1
- package/src/engine/graphics3/GPUParticleEmitterSystem.js +809 -310
- package/src/format/image/png/PNGReader.d.ts +7 -6
- package/src/format/image/png/PNGReader.d.ts.map +1 -1
- package/src/format/image/png/PNGReader.js +13 -12
- package/src/format/image/png/chunk/png_chunk_decode_iTXt.d.ts +3 -2
- package/src/format/image/png/chunk/png_chunk_decode_iTXt.d.ts.map +1 -1
- package/src/format/image/png/chunk/png_chunk_decode_iTXt.js +5 -4
- package/src/format/image/png/chunk/png_chunk_decode_zTXt.d.ts +3 -2
- package/src/format/image/png/chunk/png_chunk_decode_zTXt.d.ts.map +1 -1
- package/src/format/image/png/chunk/png_chunk_decode_zTXt.js +5 -4
- package/src/format/image/png/png_inflate.d.ts +3 -3
- package/src/format/image/png/png_inflate.d.ts.map +1 -1
- package/src/format/image/png/png_inflate.js +29 -39
- package/src/format/texture/ktx2/ktx2_read.d.ts +4 -4
- package/src/format/texture/ktx2/ktx2_read.d.ts.map +1 -1
- package/src/format/texture/ktx2/ktx2_read.js +18 -21
- package/src/shade/playground/particle_ecs/README.md +203 -0
- package/src/shade/playground/particle_ecs/bonfire_editor.d.ts +39 -0
- package/src/shade/playground/particle_ecs/bonfire_editor.d.ts.map +1 -0
- package/src/shade/playground/particle_ecs/bonfire_editor.js +315 -0
- package/src/shade/playground/particle_ecs/bonfire_effects.d.ts +145 -0
- package/src/shade/playground/particle_ecs/bonfire_effects.d.ts.map +1 -0
- package/src/shade/playground/particle_ecs/bonfire_effects.js +202 -0
- package/src/shade/playground/particle_ecs/bonfire_sprites.d.ts +23 -0
- package/src/shade/playground/particle_ecs/bonfire_sprites.d.ts.map +1 -0
- package/src/shade/playground/particle_ecs/bonfire_sprites.js +315 -0
- package/src/shade/playground/particle_ecs/bonfire_world.d.ts +86 -0
- package/src/shade/playground/particle_ecs/bonfire_world.d.ts.map +1 -0
- package/src/shade/playground/particle_ecs/bonfire_world.js +303 -0
- package/src/shade/playground/particle_ecs/effects/embers.json +1634 -0
- package/src/shade/playground/particle_ecs/effects/flame.json +1882 -0
- package/src/shade/playground/particle_ecs/effects/smoke.json +1860 -0
- package/src/shade/playground/particle_ecs/effects/soot.json +1606 -0
- package/src/shade/playground/particle_ecs/index.html +330 -0
- package/src/shade/playground/particle_ecs/main.d.ts +2 -0
- package/src/shade/playground/particle_ecs/main.d.ts.map +1 -0
- package/src/shade/playground/particle_ecs/main.js +566 -0
- package/src/shade/playground/particle_ecs/moonlit_environment.d.ts +16 -0
- package/src/shade/playground/particle_ecs/moonlit_environment.d.ts.map +1 -0
- package/src/shade/playground/particle_ecs/moonlit_environment.js +144 -0
- package/src/shade/playground/particle_editor/README.md +5 -4
- package/src/shade/playground/profile_hotkey.d.ts +58 -0
- package/src/shade/playground/profile_hotkey.d.ts.map +1 -0
- package/src/shade/playground/profile_hotkey.js +325 -0
- package/src/shade/playground/ssr_variance/README.md +105 -0
- package/src/shade/playground/ssr_variance/capture.d.ts +16 -0
- package/src/shade/playground/ssr_variance/capture.d.ts.map +1 -0
- package/src/shade/playground/ssr_variance/capture.js +96 -0
- package/src/shade/playground/ssr_variance/index.html +22 -0
- package/src/shade/playground/ssr_variance/main.d.ts +2 -0
- package/src/shade/playground/ssr_variance/main.d.ts.map +1 -0
- package/src/shade/playground/ssr_variance/main.js +246 -0
- package/src/shade/playground/ssr_variance/reference.d.ts +18 -0
- package/src/shade/playground/ssr_variance/reference.d.ts.map +1 -0
- package/src/shade/playground/ssr_variance/reference.js +78 -0
- package/src/shade/playground/ssr_variance/scene.d.ts +11 -0
- package/src/shade/playground/ssr_variance/scene.d.ts.map +1 -0
- package/src/shade/playground/ssr_variance/scene.js +61 -0
- package/src/shade/playground/ssr_variance/statistics.d.ts +44 -0
- package/src/shade/playground/ssr_variance/statistics.d.ts.map +1 -0
- package/src/shade/playground/ssr_variance/statistics.js +51 -0
- package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts.map +1 -1
- package/src/shade/renderer/loader/gltf/tiny-gltf.js +9 -3
- package/src/shade/renderer/loader/usd/usd_decode_image.d.ts +4 -4
- package/src/shade/renderer/loader/usd/usd_decode_image.d.ts.map +1 -1
- package/src/shade/renderer/loader/usd/usd_decode_image.js +4 -4
- package/src/shade/renderer/particles/DESIGN.md +748 -703
- package/src/shade/renderer/particles/runtime/ParticleEmitter.d.ts +11 -4
- package/src/shade/renderer/particles/runtime/ParticleEmitter.d.ts.map +1 -1
- package/src/shade/renderer/particles/runtime/ParticleEmitter.js +431 -424
- package/src/shade/renderer/postprocess/ssr/SSR.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/ssr/SSR.js +2 -1
- package/src/shade/renderer/postprocess/ssr/reproject/chunk_ssr_reprojection.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/ssr/reproject/chunk_ssr_reprojection.js +0 -6
- package/src/shade/renderer/postprocess/ssr/reproject/chunk_ssr_sample_history.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/ssr/reproject/chunk_ssr_sample_history.js +19 -5
- package/src/shade/renderer/postprocess/ssr/reproject/chunk_ssr_temporal_accumulate.d.ts +4 -0
- package/src/shade/renderer/postprocess/ssr/reproject/chunk_ssr_temporal_accumulate.d.ts.map +1 -0
- package/src/shade/renderer/postprocess/ssr/reproject/chunk_ssr_temporal_accumulate.js +133 -0
- package/src/shade/renderer/postprocess/ssr/ssr_reproject_shader.d.ts +0 -8
- package/src/shade/renderer/postprocess/ssr/ssr_reproject_shader.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/ssr/ssr_reproject_shader.js +16 -113
- package/src/shade/renderer/texture/source/texel_data_from_ktx2.d.ts +2 -2
- package/src/shade/renderer/texture/source/texel_data_from_ktx2.d.ts.map +1 -1
- package/src/shade/renderer/texture/source/texel_data_from_ktx2.js +3 -3
- package/src/shade/renderer/particles/shaders/chunk_particle_emitter_warmup.d.ts +0 -20
- package/src/shade/renderer/particles/shaders/chunk_particle_emitter_warmup.d.ts.map +0 -1
- package/src/shade/renderer/particles/shaders/chunk_particle_emitter_world_sphere.d.ts +0 -14
- package/src/shade/renderer/particles/shaders/chunk_particle_emitter_world_sphere.d.ts.map +0 -1
- package/src/shade/renderer/particles/shaders/shader_particle_reclaim.d.ts +0 -50
- package/src/shade/renderer/particles/shaders/shader_particle_reclaim.d.ts.map +0 -1
- package/src/shade/renderer/postprocess/ssr/reproject/shader_ffx_denoiser_reflections_reproject.d.ts +0 -17
- package/src/shade/renderer/postprocess/ssr/reproject/shader_ffx_denoiser_reflections_reproject.d.ts.map +0 -1
|
@@ -0,0 +1,330 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
6
|
+
<title>Bonfire — ECS GPU particles</title>
|
|
7
|
+
|
|
8
|
+
<!-- the editor's own stylesheets; the panel below only opens once somebody presses E -->
|
|
9
|
+
<link rel="stylesheet" href="/editor/view/node-graph/node-graph.css">
|
|
10
|
+
<link rel="stylesheet" href="/editor/view/particles/effect/particle-editor.css">
|
|
11
|
+
|
|
12
|
+
<style>
|
|
13
|
+
:root {
|
|
14
|
+
color-scheme: dark;
|
|
15
|
+
--panel: rgba(14, 15, 20, 0.78);
|
|
16
|
+
--edge: rgba(255, 255, 255, 0.1);
|
|
17
|
+
--text: #e7e4de;
|
|
18
|
+
--muted: #9a978f;
|
|
19
|
+
--ember: #ff9a3c;
|
|
20
|
+
|
|
21
|
+
/* the editor's tokens, so its panels theme as they do inside the editor shell */
|
|
22
|
+
--meep-panel-bg: #1a1e25;
|
|
23
|
+
--meep-header-bg: #22262e;
|
|
24
|
+
--meep-divider-color: #10131a;
|
|
25
|
+
--meep-fg: #d6dae0;
|
|
26
|
+
--meep-fg-muted: #8b939f;
|
|
27
|
+
--meep-accent: #ff9a3c;
|
|
28
|
+
--meep-error: #ff7a7a;
|
|
29
|
+
--meep-warning: #e2b341;
|
|
30
|
+
--meep-font: 12px 'Segoe UI', system-ui, sans-serif;
|
|
31
|
+
--meep-graph-bg: #12151b;
|
|
32
|
+
--meep-graph-bg-glow: #1a1e26;
|
|
33
|
+
--meep-graph-node-bg: #232830;
|
|
34
|
+
--meep-graph-node-header: #2b313b;
|
|
35
|
+
--meep-graph-node-border: #363c46;
|
|
36
|
+
--meep-graph-input-bg: #171b21;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
* {
|
|
40
|
+
box-sizing: border-box;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
html, body {
|
|
44
|
+
margin: 0;
|
|
45
|
+
height: 100%;
|
|
46
|
+
overflow: hidden;
|
|
47
|
+
background: #05060a;
|
|
48
|
+
color: var(--text);
|
|
49
|
+
font: 13px/1.5 ui-sans-serif, system-ui, "Segoe UI", Roboto, sans-serif;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
#viewport {
|
|
53
|
+
position: fixed;
|
|
54
|
+
inset: 0;
|
|
55
|
+
/* the canvas is sized by the engine and is shorter than this while the editor is open */
|
|
56
|
+
overflow: hidden;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
#viewport canvas {
|
|
60
|
+
display: block;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
.panel {
|
|
64
|
+
position: fixed;
|
|
65
|
+
background: var(--panel);
|
|
66
|
+
border: 1px solid var(--edge);
|
|
67
|
+
border-radius: 10px;
|
|
68
|
+
padding: 12px 14px;
|
|
69
|
+
backdrop-filter: blur(8px);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
#controls {
|
|
73
|
+
top: 14px;
|
|
74
|
+
left: 14px;
|
|
75
|
+
width: 236px;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
#stats {
|
|
79
|
+
top: 14px;
|
|
80
|
+
right: 14px;
|
|
81
|
+
min-width: 190px;
|
|
82
|
+
font-variant-numeric: tabular-nums;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
#hint {
|
|
86
|
+
bottom: 14px;
|
|
87
|
+
left: 14px;
|
|
88
|
+
color: var(--muted);
|
|
89
|
+
max-width: 460px;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
#profile_status {
|
|
93
|
+
bottom: 14px;
|
|
94
|
+
right: 14px;
|
|
95
|
+
max-width: 420px;
|
|
96
|
+
color: var(--muted);
|
|
97
|
+
font-variant-numeric: tabular-nums;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
#profile_status.recording {
|
|
101
|
+
color: #ff6a5c;
|
|
102
|
+
border-color: rgba(255, 106, 92, 0.5);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/* --- the particle editor ------------------------------------------------------------- */
|
|
106
|
+
|
|
107
|
+
/*
|
|
108
|
+
The whole window. E is a mode switch between looking at the fire and editing it, rather than
|
|
109
|
+
a panel that takes a share of the screen: a node graph wants every pixel it can get, and so
|
|
110
|
+
does the fire.
|
|
111
|
+
*/
|
|
112
|
+
#effect_editor {
|
|
113
|
+
position: fixed;
|
|
114
|
+
inset: 0;
|
|
115
|
+
display: flex;
|
|
116
|
+
flex-direction: column;
|
|
117
|
+
background: var(--meep-panel-bg);
|
|
118
|
+
font: var(--meep-font);
|
|
119
|
+
color: var(--meep-fg);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/*
|
|
123
|
+
An id selector outranks the user agent's `[hidden] { display: none }`, so the `display: flex`
|
|
124
|
+
above would otherwise keep the panel over the scene from the moment the page loaded, while
|
|
125
|
+
the `hidden` property everything reads went on saying it was closed. This rule matches the
|
|
126
|
+
attribute at the same specificity and comes later, so the attribute wins — which is what
|
|
127
|
+
makes `hidden` the switch the editor already treats it as.
|
|
128
|
+
*/
|
|
129
|
+
#effect_editor[hidden] {
|
|
130
|
+
display: none;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
#editor_bar {
|
|
134
|
+
display: flex;
|
|
135
|
+
align-items: center;
|
|
136
|
+
gap: 10px;
|
|
137
|
+
padding: 6px 10px;
|
|
138
|
+
background: var(--meep-header-bg);
|
|
139
|
+
border-bottom: 1px solid var(--meep-divider-color);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
#editor_bar strong {
|
|
143
|
+
font-size: 12px;
|
|
144
|
+
font-weight: 600;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
#editor_bar select,
|
|
148
|
+
#editor_bar button {
|
|
149
|
+
font: inherit;
|
|
150
|
+
color: var(--meep-fg);
|
|
151
|
+
background: var(--meep-graph-input-bg);
|
|
152
|
+
border: 1px solid var(--meep-graph-node-border);
|
|
153
|
+
border-radius: 5px;
|
|
154
|
+
padding: 4px 9px;
|
|
155
|
+
cursor: pointer;
|
|
156
|
+
width: auto;
|
|
157
|
+
margin: 0;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
#editor_bar select:hover,
|
|
161
|
+
#editor_bar button:hover {
|
|
162
|
+
border-color: var(--meep-accent);
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
#editor_status {
|
|
166
|
+
flex: 1;
|
|
167
|
+
color: var(--meep-fg-muted);
|
|
168
|
+
font-variant-numeric: tabular-nums;
|
|
169
|
+
white-space: nowrap;
|
|
170
|
+
overflow: hidden;
|
|
171
|
+
text-overflow: ellipsis;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
#editor_status.failed {
|
|
175
|
+
color: var(--meep-error);
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
#editor_mount {
|
|
179
|
+
position: relative;
|
|
180
|
+
flex: 1;
|
|
181
|
+
min-height: 0;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
h1 {
|
|
185
|
+
margin: 0 0 2px;
|
|
186
|
+
font-size: 13px;
|
|
187
|
+
font-weight: 600;
|
|
188
|
+
letter-spacing: 0.02em;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
h1 span {
|
|
192
|
+
color: var(--ember);
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
p.sub {
|
|
196
|
+
margin: 0 0 10px;
|
|
197
|
+
color: var(--muted);
|
|
198
|
+
font-size: 12px;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
label.row {
|
|
202
|
+
display: flex;
|
|
203
|
+
align-items: center;
|
|
204
|
+
gap: 8px;
|
|
205
|
+
padding: 3px 0;
|
|
206
|
+
cursor: pointer;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
label.row input {
|
|
210
|
+
accent-color: var(--ember);
|
|
211
|
+
margin: 0;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
label.row span {
|
|
215
|
+
flex: 1;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
button {
|
|
219
|
+
width: 100%;
|
|
220
|
+
margin-top: 10px;
|
|
221
|
+
padding: 7px 10px;
|
|
222
|
+
font: inherit;
|
|
223
|
+
font-weight: 600;
|
|
224
|
+
color: #1a1206;
|
|
225
|
+
background: var(--ember);
|
|
226
|
+
border: 0;
|
|
227
|
+
border-radius: 7px;
|
|
228
|
+
cursor: pointer;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
button:hover {
|
|
232
|
+
filter: brightness(1.1);
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
dl {
|
|
236
|
+
display: grid;
|
|
237
|
+
grid-template-columns: auto 1fr;
|
|
238
|
+
gap: 2px 12px;
|
|
239
|
+
margin: 0;
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
dt {
|
|
243
|
+
color: var(--muted);
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
dd {
|
|
247
|
+
margin: 0;
|
|
248
|
+
text-align: right;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
#message {
|
|
252
|
+
position: fixed;
|
|
253
|
+
inset: 0;
|
|
254
|
+
display: grid;
|
|
255
|
+
place-content: center;
|
|
256
|
+
padding: 40px;
|
|
257
|
+
text-align: center;
|
|
258
|
+
white-space: pre-wrap;
|
|
259
|
+
color: #ffb4a4;
|
|
260
|
+
pointer-events: none;
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
kbd {
|
|
264
|
+
padding: 1px 5px;
|
|
265
|
+
border: 1px solid var(--edge);
|
|
266
|
+
border-radius: 4px;
|
|
267
|
+
background: rgba(255, 255, 255, 0.06);
|
|
268
|
+
font: inherit;
|
|
269
|
+
font-size: 11px;
|
|
270
|
+
}
|
|
271
|
+
</style>
|
|
272
|
+
</head>
|
|
273
|
+
<body tabindex="0">
|
|
274
|
+
<div id="viewport"></div>
|
|
275
|
+
|
|
276
|
+
<section class="panel" id="controls">
|
|
277
|
+
<h1>Bonfire · <span>ECS particles</span></h1>
|
|
278
|
+
<p class="sub">Four <code>ParticleEffect</code> entities</p>
|
|
279
|
+
|
|
280
|
+
<label class="row"><input type="checkbox" id="flame" checked><span>Flame</span></label>
|
|
281
|
+
<label class="row"><input type="checkbox" id="smoke" checked><span>Smoke</span></label>
|
|
282
|
+
<label class="row"><input type="checkbox" id="embers" checked><span>Embers</span></label>
|
|
283
|
+
<label class="row"><input type="checkbox" id="soot" checked><span>Soot</span></label>
|
|
284
|
+
|
|
285
|
+
<button id="stoke">Stoke the fire</button>
|
|
286
|
+
</section>
|
|
287
|
+
|
|
288
|
+
<section class="panel" id="stats">
|
|
289
|
+
<dl>
|
|
290
|
+
<dt>fps</dt>
|
|
291
|
+
<dd id="stat-fps">—</dd>
|
|
292
|
+
<dt>alive</dt>
|
|
293
|
+
<dd id="stat-alive">—</dd>
|
|
294
|
+
<dt>free</dt>
|
|
295
|
+
<dd id="stat-dead">—</dd>
|
|
296
|
+
<dt>drawn</dt>
|
|
297
|
+
<dd id="stat-draw">—</dd>
|
|
298
|
+
<dt>emitters</dt>
|
|
299
|
+
<dd id="stat-emitters">—</dd>
|
|
300
|
+
</dl>
|
|
301
|
+
</section>
|
|
302
|
+
|
|
303
|
+
<p class="panel" id="hint">
|
|
304
|
+
Drag to orbit, <kbd>W</kbd><kbd>A</kbd><kbd>S</kbd><kbd>D</kbd> to move, wheel to zoom. The
|
|
305
|
+
checkboxes write <code>emitting</code> on a component; the button asks an entity for a burst.
|
|
306
|
+
Both go through the ECS — nothing here touches the scene graph.
|
|
307
|
+
<br><kbd>E</kbd> switches to the particle editor — full screen, editing whichever effect the
|
|
308
|
+
selector names, live. <kbd>Esc</kbd> comes back from anywhere in it.
|
|
309
|
+
</p>
|
|
310
|
+
|
|
311
|
+
<p class="panel" id="profile_status"><kbd>T</kbd> to record a GPU profile</p>
|
|
312
|
+
|
|
313
|
+
<section id="effect_editor" hidden>
|
|
314
|
+
<div id="editor_bar">
|
|
315
|
+
<strong>Effect</strong>
|
|
316
|
+
<select id="editor_effect" title="which effect the graph below edits"></select>
|
|
317
|
+
<button id="editor_download" title="save this effect as JSON — drop it over effects/<name>.json">Download</button>
|
|
318
|
+
<button id="editor_import" title="open a document downloaded earlier">Import…</button>
|
|
319
|
+
<input type="file" id="editor_file" accept="application/json,.json" hidden>
|
|
320
|
+
<span id="editor_status"></span>
|
|
321
|
+
<button id="editor_close" title="Escape, or E when nothing is focused">Close · Esc</button>
|
|
322
|
+
</div>
|
|
323
|
+
<div id="editor_mount"></div>
|
|
324
|
+
</section>
|
|
325
|
+
|
|
326
|
+
<div id="message"></div>
|
|
327
|
+
|
|
328
|
+
<script type="module" src="./main.js"></script>
|
|
329
|
+
</body>
|
|
330
|
+
</html>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../../../../src/shade/playground/particle_ecs/main.js"],"names":[],"mappings":""}
|