@woosh/meep-engine 3.68.0 → 3.69.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/CHANGELOG.md +45 -0
- package/editor/ecs/component/editors/ecs/Trail3DEditor.d.ts +2 -17
- package/editor/ecs/component/editors/ecs/Trail3DEditor.d.ts.map +1 -1
- package/editor/ecs/component/editors/ecs/Trail3DEditor.js +3 -18
- package/package.json +1 -1
- package/src/engine/graphics/ecs/trail3d/Trail3D.d.ts +33 -65
- package/src/engine/graphics/ecs/trail3d/Trail3D.d.ts.map +1 -1
- package/src/engine/graphics/ecs/trail3d/Trail3D.js +37 -245
- package/src/engine/graphics/ecs/trail3d/Trail3DFlags.d.ts +0 -4
- package/src/engine/graphics/ecs/trail3d/Trail3DFlags.js +4 -10
- package/src/engine/graphics/ecs/trail3d/seed_trail_stroke.d.ts +13 -10
- package/src/engine/graphics/ecs/trail3d/seed_trail_stroke.d.ts.map +1 -1
- package/src/engine/graphics/ecs/trail3d/seed_trail_stroke.js +28 -37
- package/src/engine/graphics/ecs/trail3d/trail_knot_count.d.ts +10 -0
- package/src/engine/graphics/ecs/trail3d/trail_knot_count.d.ts.map +1 -0
- package/src/engine/graphics/ecs/trail3d/trail_knot_count.js +27 -0
- package/src/engine/graphics/trail/TrailKnots.d.ts +62 -0
- package/src/engine/graphics/trail/TrailKnots.d.ts.map +1 -0
- package/src/engine/graphics/trail/TrailKnots.js +137 -0
- package/src/engine/graphics/trail/tube/TubeXMaterialSpec.d.ts +1 -1
- package/src/engine/graphics/trail/tube/TubeXMaterialSpec.js +1 -1
- package/src/engine/graphics3/EntityRowHold.d.ts +48 -0
- package/src/engine/graphics3/EntityRowHold.d.ts.map +1 -0
- package/src/engine/graphics3/EntityRowHold.js +128 -0
- package/src/engine/graphics3/GPUParticleEmitterSystem.d.ts +6 -2
- package/src/engine/graphics3/GPUParticleEmitterSystem.d.ts.map +1 -1
- package/src/engine/graphics3/GPUParticleEmitterSystem.js +11 -44
- package/src/engine/graphics3/Trail3DSystem.d.ts +69 -35
- package/src/engine/graphics3/Trail3DSystem.d.ts.map +1 -1
- package/src/engine/graphics3/Trail3DSystem.js +380 -81
- package/src/engine/physics/fluid/ecs/FluidObstacle.d.ts +17 -0
- package/src/engine/physics/fluid/ecs/FluidObstacle.d.ts.map +1 -1
- package/src/engine/physics/fluid/ecs/FluidObstacle.js +22 -2
- package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +6 -5
- package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts.map +1 -1
- package/src/engine/physics/fluid/ecs/FluidObstacleSystem.js +14 -3
- package/src/engine/physics/fluid/obstacle/FLUID_OBSTACLE_RECORD_STRUCT.d.ts +9 -1
- package/src/engine/physics/fluid/obstacle/FLUID_OBSTACLE_RECORD_STRUCT.d.ts.map +1 -1
- package/src/engine/physics/fluid/obstacle/FLUID_OBSTACLE_RECORD_STRUCT.js +11 -1
- package/src/engine/physics/fluid/obstacle/fluid_obstacle_record_create.d.ts +5 -0
- package/src/engine/physics/fluid/obstacle/fluid_obstacle_record_create.d.ts.map +1 -1
- package/src/engine/physics/fluid/obstacle/fluid_obstacle_record_create.js +2 -0
- package/src/engine/physics/fluid/obstacle/fluid_obstacle_write_gpu_record.d.ts +4 -3
- package/src/engine/physics/fluid/obstacle/fluid_obstacle_write_gpu_record.d.ts.map +1 -1
- package/src/engine/physics/fluid/obstacle/fluid_obstacle_write_gpu_record.js +11 -3
- package/src/shade/playground/trails/index.html +50 -0
- package/src/shade/playground/trails/main.d.ts +2 -0
- package/src/shade/playground/trails/main.d.ts.map +1 -0
- package/src/shade/playground/trails/main.js +258 -0
- package/src/shade/renderer/animation/animation_curve_write_keys.d.ts +18 -0
- package/src/shade/renderer/animation/animation_curve_write_keys.d.ts.map +1 -0
- package/src/shade/renderer/animation/animation_curve_write_keys.js +34 -0
- package/src/shade/renderer/deferred/tonemap/ColorGrade.d.ts.map +1 -1
- package/src/shade/renderer/deferred/tonemap/ColorGrade.js +13 -36
- package/src/shade/renderer/dynamic/GPUDynamicMeshResidency.js +2 -2
- package/src/shade/renderer/dynamic/chunk_dynamic_mesh_avboit_vertex.d.ts +2 -13
- package/src/shade/renderer/dynamic/chunk_dynamic_mesh_avboit_vertex.d.ts.map +1 -1
- package/src/shade/renderer/dynamic/chunk_dynamic_mesh_avboit_vertex.js +6 -21
- package/src/shade/renderer/dynamic/graph_dynamic_mesh_avboit.d.ts +17 -6
- package/src/shade/renderer/dynamic/graph_dynamic_mesh_avboit.d.ts.map +1 -1
- package/src/shade/renderer/dynamic/graph_dynamic_mesh_avboit.js +38 -178
- package/src/shade/renderer/dynamic/shader_dynamic_mesh_avboit_draw.d.ts +7 -9
- package/src/shade/renderer/dynamic/shader_dynamic_mesh_avboit_draw.d.ts.map +1 -1
- package/src/shade/renderer/dynamic/shader_dynamic_mesh_avboit_draw.js +17 -106
- package/src/shade/renderer/dynamic/shader_dynamic_mesh_avboit_splat.d.ts +7 -17
- package/src/shade/renderer/dynamic/shader_dynamic_mesh_avboit_splat.d.ts.map +1 -1
- package/src/shade/renderer/dynamic/shader_dynamic_mesh_avboit_splat.js +18 -118
- package/src/shade/renderer/fluid/forcing/FLUID_FORCING.d.ts +14 -0
- package/src/shade/renderer/fluid/forcing/FLUID_FORCING.d.ts.map +1 -1
- package/src/shade/renderer/fluid/forcing/FLUID_FORCING.js +18 -0
- package/src/shade/renderer/fluid/forcing/FLUID_FORCING_APPLY_STRUCT.d.ts +3 -1
- package/src/shade/renderer/fluid/forcing/FLUID_FORCING_APPLY_STRUCT.d.ts.map +1 -1
- package/src/shade/renderer/fluid/forcing/FLUID_FORCING_APPLY_STRUCT.js +4 -1
- package/src/shade/renderer/fluid/forcing/GPUFluidForcing.d.ts +9 -0
- package/src/shade/renderer/fluid/forcing/GPUFluidForcing.d.ts.map +1 -1
- package/src/shade/renderer/fluid/forcing/GPUFluidForcing.js +20 -4
- package/src/shade/renderer/fluid/forcing/chunk_fluid_forcing_cell.d.ts +11 -2
- package/src/shade/renderer/fluid/forcing/chunk_fluid_forcing_cell.d.ts.map +1 -1
- package/src/shade/renderer/fluid/forcing/chunk_fluid_forcing_cell.js +59 -2
- package/src/shade/renderer/fluid/forcing/shader_fluid_forcing_apply.d.ts +4 -1
- package/src/shade/renderer/fluid/forcing/shader_fluid_forcing_apply.d.ts.map +1 -1
- package/src/shade/renderer/fluid/forcing/shader_fluid_forcing_apply.js +367 -341
- package/src/shade/renderer/fluid/mac/shader_fluid_mac_advect_correct.d.ts +6 -2
- package/src/shade/renderer/fluid/mac/shader_fluid_mac_advect_correct.d.ts.map +1 -1
- package/src/shade/renderer/fluid/mac/shader_fluid_mac_advect_correct.js +339 -282
- package/src/shade/renderer/grass/press/shader_grass_press_mark.d.ts +3 -2
- package/src/shade/renderer/grass/press/shader_grass_press_mark.d.ts.map +1 -1
- package/src/shade/renderer/grass/press/shader_grass_press_mark.js +5 -3
- package/src/shade/renderer/rasterize/native/avboit/avboit_unlit_draw.d.ts +49 -0
- package/src/shade/renderer/rasterize/native/avboit/avboit_unlit_draw.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/native/avboit/avboit_unlit_draw.js +144 -0
- package/src/shade/renderer/rasterize/native/avboit/avboit_unlit_splat.d.ts +71 -0
- package/src/shade/renderer/rasterize/native/avboit/avboit_unlit_splat.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/native/avboit/avboit_unlit_splat.js +152 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_unlit_varyings.d.ts +21 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_unlit_varyings.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_unlit_varyings.js +30 -0
- package/src/shade/renderer/rasterize/native/avboit/graph_avboit_unlit.d.ts +101 -0
- package/src/shade/renderer/rasterize/native/avboit/graph_avboit_unlit.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/native/avboit/graph_avboit_unlit.js +306 -0
- package/src/shade/renderer/rasterize/native/avboit/shader_avboit_splat.d.ts +9 -0
- package/src/shade/renderer/rasterize/native/avboit/shader_avboit_splat.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/avboit/shader_avboit_splat.js +11 -4
- package/src/shade/renderer/trails/GPUTrailAVBOITChannel.d.ts +69 -0
- package/src/shade/renderer/trails/GPUTrailAVBOITChannel.d.ts.map +1 -0
- package/src/shade/renderer/trails/GPUTrailAVBOITChannel.js +129 -0
- package/src/shade/renderer/trails/GPUTrailSystem.d.ts +164 -0
- package/src/shade/renderer/trails/GPUTrailSystem.d.ts.map +1 -0
- package/src/shade/renderer/trails/GPUTrailSystem.js +725 -0
- package/src/shade/renderer/trails/data/TRAIL_DATABASE_SPEC.d.ts +14 -0
- package/src/shade/renderer/trails/data/TRAIL_DATABASE_SPEC.d.ts.map +1 -0
- package/src/shade/renderer/trails/data/TRAIL_DATABASE_SPEC.js +38 -0
- package/src/shade/renderer/trails/data/TRAIL_KNOT.d.ts +66 -0
- package/src/shade/renderer/trails/data/TRAIL_KNOT.d.ts.map +1 -0
- package/src/shade/renderer/trails/data/TRAIL_KNOT.js +154 -0
- package/src/shade/renderer/trails/data/TRAIL_RECORD.d.ts +19 -0
- package/src/shade/renderer/trails/data/TRAIL_RECORD.d.ts.map +1 -0
- package/src/shade/renderer/trails/data/TRAIL_RECORD.js +68 -0
- package/src/shade/renderer/trails/data/TRAIL_STATE.d.ts +18 -0
- package/src/shade/renderer/trails/data/TRAIL_STATE.d.ts.map +1 -0
- package/src/shade/renderer/trails/data/TRAIL_STATE.js +43 -0
- package/src/shade/renderer/trails/graph_trails.d.ts +58 -0
- package/src/shade/renderer/trails/graph_trails.d.ts.map +1 -0
- package/src/shade/renderer/trails/graph_trails.js +155 -0
- package/src/shade/renderer/trails/graph_trails_avboit.d.ts +126 -0
- package/src/shade/renderer/trails/graph_trails_avboit.d.ts.map +1 -0
- package/src/shade/renderer/trails/graph_trails_avboit.js +300 -0
- package/src/shade/renderer/trails/runtime/TrailFadeCurves.d.ts +56 -0
- package/src/shade/renderer/trails/runtime/TrailFadeCurves.d.ts.map +1 -0
- package/src/shade/renderer/trails/runtime/TrailFadeCurves.js +220 -0
- package/src/shade/renderer/trails/runtime/TrailKnotPool.d.ts +49 -0
- package/src/shade/renderer/trails/runtime/TrailKnotPool.d.ts.map +1 -0
- package/src/shade/renderer/trails/runtime/TrailKnotPool.js +162 -0
- package/src/shade/renderer/trails/runtime/TrailParameters.d.ts +52 -0
- package/src/shade/renderer/trails/runtime/TrailParameters.d.ts.map +1 -0
- package/src/shade/renderer/trails/runtime/TrailParameters.js +126 -0
- package/src/shade/renderer/trails/shaders/chunk_trail_frame_transport.d.ts +23 -0
- package/src/shade/renderer/trails/shaders/chunk_trail_frame_transport.d.ts.map +1 -0
- package/src/shade/renderer/trails/shaders/chunk_trail_frame_transport.js +57 -0
- package/src/shade/renderer/trails/shaders/chunk_trail_knot_alpha.d.ts +14 -0
- package/src/shade/renderer/trails/shaders/chunk_trail_knot_alpha.d.ts.map +1 -0
- package/src/shade/renderer/trails/shaders/chunk_trail_knot_alpha.js +40 -0
- package/src/shade/renderer/trails/shaders/chunk_trail_seed.d.ts +18 -0
- package/src/shade/renderer/trails/shaders/chunk_trail_seed.d.ts.map +1 -0
- package/src/shade/renderer/trails/shaders/chunk_trail_seed.js +64 -0
- package/src/shade/renderer/trails/shaders/chunk_trail_segment.d.ts +14 -0
- package/src/shade/renderer/trails/shaders/chunk_trail_segment.d.ts.map +1 -0
- package/src/shade/renderer/trails/shaders/chunk_trail_segment.js +51 -0
- package/src/shade/renderer/trails/shaders/chunk_trail_update.d.ts +48 -0
- package/src/shade/renderer/trails/shaders/chunk_trail_update.d.ts.map +1 -0
- package/src/shade/renderer/trails/shaders/chunk_trail_update.js +197 -0
- package/src/shade/renderer/trails/shaders/chunk_trail_vertex.d.ts +34 -0
- package/src/shade/renderer/trails/shaders/chunk_trail_vertex.d.ts.map +1 -0
- package/src/shade/renderer/trails/shaders/chunk_trail_vertex.js +111 -0
- package/src/shade/renderer/trails/shaders/shader_trail_avboit.d.ts +24 -0
- package/src/shade/renderer/trails/shaders/shader_trail_avboit.d.ts.map +1 -0
- package/src/shade/renderer/trails/shaders/shader_trail_avboit.js +78 -0
- package/src/shade/renderer/trails/shaders/shader_trail_avboit_segments.d.ts +23 -0
- package/src/shade/renderer/trails/shaders/shader_trail_avboit_segments.d.ts.map +1 -0
- package/src/shade/renderer/trails/shaders/shader_trail_avboit_segments.js +130 -0
- package/src/shade/renderer/trails/shaders/shader_trail_draw_args.d.ts +29 -0
- package/src/shade/renderer/trails/shaders/shader_trail_draw_args.d.ts.map +1 -0
- package/src/shade/renderer/trails/shaders/shader_trail_draw_args.js +78 -0
- package/src/shade/renderer/trails/shaders/shader_trail_seed.d.ts +18 -0
- package/src/shade/renderer/trails/shaders/shader_trail_seed.d.ts.map +1 -0
- package/src/shade/renderer/trails/shaders/shader_trail_seed.js +79 -0
- package/src/shade/renderer/trails/shaders/shader_trail_update.d.ts +20 -0
- package/src/shade/renderer/trails/shaders/shader_trail_update.d.ts.map +1 -0
- package/src/shade/renderer/trails/shaders/shader_trail_update.js +101 -0
- package/src/engine/graphics/ecs/trail3d/advance_trail.d.ts +0 -18
- package/src/engine/graphics/ecs/trail3d/advance_trail.d.ts.map +0 -1
- package/src/engine/graphics/ecs/trail3d/advance_trail.js +0 -42
- package/src/engine/graphics/ecs/trail3d/seed_trail_tube.d.ts +0 -14
- package/src/engine/graphics/ecs/trail3d/seed_trail_tube.d.ts.map +0 -1
- package/src/engine/graphics/ecs/trail3d/seed_trail_tube.js +0 -75
- package/src/engine/graphics/ecs/trail3d/trail_head_position.d.ts +0 -17
- package/src/engine/graphics/ecs/trail3d/trail_head_position.d.ts.map +0 -1
- package/src/engine/graphics/ecs/trail3d/trail_head_position.js +0 -19
- package/src/engine/graphics/trail/tube/TubeX.d.ts +0 -186
- package/src/engine/graphics/trail/tube/TubeX.d.ts.map +0 -1
- package/src/engine/graphics/trail/tube/TubeX.js +0 -575
- package/src/engine/graphics/trail/tube/simulator/TubeXFixedPhysicsSimulator.d.ts +0 -16
- package/src/engine/graphics/trail/tube/simulator/TubeXFixedPhysicsSimulator.d.ts.map +0 -1
- package/src/engine/graphics/trail/tube/simulator/TubeXFixedPhysicsSimulator.js +0 -34
- package/src/engine/graphics/trail/tube/tube_attributes_spec.d.ts +0 -27
- package/src/engine/graphics/trail/tube/tube_attributes_spec.d.ts.map +0 -1
- package/src/engine/graphics/trail/tube/tube_attributes_spec.js +0 -70
- package/src/engine/graphics3/trail/trail_tube_write_geometry.d.ts +0 -38
- package/src/engine/graphics3/trail/trail_tube_write_geometry.d.ts.map +0 -1
- package/src/engine/graphics3/trail/trail_tube_write_geometry.js +0 -119
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { COLLECTION_U32_STRUCT_READ } from "../../gpu_primitive/COLLECTION_U32_STRUCT_READ.js";
|
|
2
|
+
import { chunk_scene_database_access } from "../../scene/chunk_scene_database_access.js";
|
|
3
|
+
import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
|
|
4
|
+
import { ComputeShader } from "../../shader/ComputeShader.js";
|
|
5
|
+
import { ShaderResourceSetDescriptor } from "../../shader/resource/ShaderResourceSetDescriptor.js";
|
|
6
|
+
import { u32 } from "../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
|
|
7
|
+
import { WebGPUArray } from "../../shader/type/WebGPUArray.js";
|
|
8
|
+
import { WebGPUStruct } from "../../shader/type/WebGPUStruct.js";
|
|
9
|
+
import { TRAIL_DESCRIPTOR, TRAIL_STATE_DESCRIPTOR } from "../data/TRAIL_DATABASE_SPEC.js";
|
|
10
|
+
import { chunk_trail_update } from "./chunk_trail_update.js";
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Threads per workgroup; one trail row each. The page iterator wants a multiple of 32.
|
|
14
|
+
* @type {number}
|
|
15
|
+
*/
|
|
16
|
+
export const TRAIL_UPDATE_WORKGROUP_SIZE = 64;
|
|
17
|
+
|
|
18
|
+
const PG = TRAIL_DESCRIPTOR.page_iterator_symbol_prefix(TRAIL_UPDATE_WORKGROUP_SIZE, true);
|
|
19
|
+
const STATE = TRAIL_STATE_DESCRIPTOR;
|
|
20
|
+
|
|
21
|
+
export const TRAIL_UPDATE_SETTINGS = WebGPUStruct.from({
|
|
22
|
+
/** the clock, in ticks */
|
|
23
|
+
now: u32,
|
|
24
|
+
/** element capacity of the trail table: the length of the counts list the scan reads */
|
|
25
|
+
capacity: u32,
|
|
26
|
+
}, "Trail3DUpdateSettings");
|
|
27
|
+
|
|
28
|
+
const resources = new ShaderResourceSetDescriptor();
|
|
29
|
+
|
|
30
|
+
resources.setImmediate("settings", TRAIL_UPDATE_SETTINGS);
|
|
31
|
+
|
|
32
|
+
resources.createGroup()
|
|
33
|
+
.addStorageBuffer("trail_database", WebGPUArray.u32, true)
|
|
34
|
+
.addStorageBuffer("scene_database", WebGPUArray.u32, false)
|
|
35
|
+
.addStorageBuffer("knots", WebGPUArray.u32, true)
|
|
36
|
+
.addStorageBuffer("live_segments", COLLECTION_U32_STRUCT_READ, true);
|
|
37
|
+
|
|
38
|
+
const body = CodeChunk.from(
|
|
39
|
+
//language=WGSL
|
|
40
|
+
`
|
|
41
|
+
@compute @workgroup_size(${TRAIL_UPDATE_WORKGROUP_SIZE}, 1, 1)
|
|
42
|
+
fn main(
|
|
43
|
+
@builtin(workgroup_id) wg_id : vec3<u32>,
|
|
44
|
+
@builtin(local_invocation_index) local_id : u32,
|
|
45
|
+
) {
|
|
46
|
+
// the scan reads exactly this many counts; written before the page test so it lands even when the
|
|
47
|
+
// first page is unallocated
|
|
48
|
+
if (wg_id.x == 0u && local_id == 0u) {
|
|
49
|
+
live_segments.count = settings.capacity;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
if (!${PG}_setup(&trail_database, wg_id.x, local_id)) {
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
let slot = ${PG}_slot_in_page(local_id);
|
|
57
|
+
|
|
58
|
+
if (slot >= ${PG}_ELEMENTS_PER_PAGE || !${PG}_is_occupied(slot)) {
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
let record = ${PG}_read(&trail_database, slot);
|
|
63
|
+
let row = ${PG}_slot_to_index(slot);
|
|
64
|
+
|
|
65
|
+
var state = ${STATE.marshalling_method_read_rw}(&trail_database, row);
|
|
66
|
+
|
|
67
|
+
if (state.seeded_epoch != record.seed_epoch) {
|
|
68
|
+
// a seed has been asked for and not run yet: nothing to draw until it has
|
|
69
|
+
live_segments.elements[row] = 0u;
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
let head = trail_head_world(scene_read_node(&scene_database, record.node).global, record.offset);
|
|
74
|
+
|
|
75
|
+
live_segments.elements[row] = trail_update(record, &state, head, settings.now);
|
|
76
|
+
|
|
77
|
+
${STATE.marshalling_method_write}(&trail_database, row, state);
|
|
78
|
+
}
|
|
79
|
+
`, [
|
|
80
|
+
TRAIL_DESCRIPTOR.chunk_iterate(TRAIL_UPDATE_WORKGROUP_SIZE, true),
|
|
81
|
+
STATE.chunk_read_rw,
|
|
82
|
+
STATE.chunk_write,
|
|
83
|
+
chunk_scene_database_access,
|
|
84
|
+
chunk_trail_update,
|
|
85
|
+
]);
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* One frame of every trail: a thread per row of the trail table, through the table's page iterator.
|
|
89
|
+
* Each reads its entity's world matrix from the scene database — the hierarchy has composed this
|
|
90
|
+
* frame's — runs `trail_update`, writes its state back, and writes how many of its segments can be
|
|
91
|
+
* visible into `live_segments`, the list the scan sums.
|
|
92
|
+
*
|
|
93
|
+
* A row whose state has not been seeded for its record's epoch writes zero and waits for its seed.
|
|
94
|
+
*
|
|
95
|
+
* @type {ComputeShader}
|
|
96
|
+
*/
|
|
97
|
+
export const shader_trail_update = ComputeShader.from({
|
|
98
|
+
label: "Trail Update",
|
|
99
|
+
resources,
|
|
100
|
+
body,
|
|
101
|
+
});
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Age a trail by one frame and put its head where the entity is.
|
|
3
|
-
*
|
|
4
|
-
* **Renderer-neutral**, like {@link seed_trail_tube}: what a backend does afterwards is turn the
|
|
5
|
-
* knots into vertices, and the knots themselves are the same either way.
|
|
6
|
-
*
|
|
7
|
-
* {@link Trail3DFlags.BoundsNeedUpdate} is left set for the caller, because what wants bounds
|
|
8
|
-
* differs by renderer — the legacy path keeps a CPU BVH of trails and Shade culls on the GPU.
|
|
9
|
-
*
|
|
10
|
-
* @param {Trail3D} trail
|
|
11
|
-
* @param {Transform} transform
|
|
12
|
-
* @param {number} timeDelta seconds
|
|
13
|
-
* @param {TubeXFixedPhysicsSimulator} simulator ages the knots and fades them; stateless, so whose
|
|
14
|
-
* it is does not matter, only that the caller owns one
|
|
15
|
-
* @returns {void}
|
|
16
|
-
*/
|
|
17
|
-
export function advance_trail(trail: Trail3D, transform: Transform, timeDelta: number, simulator: TubeXFixedPhysicsSimulator): void;
|
|
18
|
-
//# sourceMappingURL=advance_trail.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"advance_trail.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/graphics/ecs/trail3d/advance_trail.js"],"names":[],"mappings":"AAUA;;;;;;;;;;;;;;;GAeG;AACH,+EALW,MAAM,0CAGJ,IAAI,CAiBhB"}
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
import Vector3 from "../../../../core/geom/Vector3.js";
|
|
2
|
-
import { max2 } from "../../../../core/math/max2.js";
|
|
3
|
-
import { compute_trail_head_position } from "./trail_head_position.js";
|
|
4
|
-
import { Trail3DFlags } from "./Trail3DFlags.js";
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* @type {Vector3}
|
|
8
|
-
*/
|
|
9
|
-
const v3_head = new Vector3();
|
|
10
|
-
|
|
11
|
-
/**
|
|
12
|
-
* Age a trail by one frame and put its head where the entity is.
|
|
13
|
-
*
|
|
14
|
-
* **Renderer-neutral**, like {@link seed_trail_tube}: what a backend does afterwards is turn the
|
|
15
|
-
* knots into vertices, and the knots themselves are the same either way.
|
|
16
|
-
*
|
|
17
|
-
* {@link Trail3DFlags.BoundsNeedUpdate} is left set for the caller, because what wants bounds
|
|
18
|
-
* differs by renderer — the legacy path keeps a CPU BVH of trails and Shade culls on the GPU.
|
|
19
|
-
*
|
|
20
|
-
* @param {Trail3D} trail
|
|
21
|
-
* @param {Transform} transform
|
|
22
|
-
* @param {number} timeDelta seconds
|
|
23
|
-
* @param {TubeXFixedPhysicsSimulator} simulator ages the knots and fades them; stateless, so whose
|
|
24
|
-
* it is does not matter, only that the caller owns one
|
|
25
|
-
* @returns {void}
|
|
26
|
-
*/
|
|
27
|
-
export function advance_trail(trail, transform, timeDelta, simulator) {
|
|
28
|
-
const tube = trail.tube;
|
|
29
|
-
|
|
30
|
-
compute_trail_head_position(v3_head, trail, transform);
|
|
31
|
-
|
|
32
|
-
trail.timeSinceLastUpdate += timeDelta;
|
|
33
|
-
trail.time += timeDelta;
|
|
34
|
-
|
|
35
|
-
const age_offset = max2(0, trail.maxAge - trail.time);
|
|
36
|
-
|
|
37
|
-
simulator.update(tube, trail.maxAge, timeDelta, trail.color.w, trail.fade);
|
|
38
|
-
|
|
39
|
-
if (trail.getFlag(Trail3DFlags.Spawning)) {
|
|
40
|
-
trail.updateHead(v3_head.x, v3_head.y, v3_head.z, age_offset);
|
|
41
|
-
}
|
|
42
|
-
}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Build a trail's knots and collapse them onto the head, ready to be drawn by whichever renderer
|
|
3
|
-
* owns the entity.
|
|
4
|
-
*
|
|
5
|
-
* **Renderer-neutral on purpose.** A trail is a simulation with a picture attached, and the
|
|
6
|
-
* simulation is the same one under either backend — what differs is only what the knots are turned
|
|
7
|
-
* into. Two copies of this would be two trails that age differently.
|
|
8
|
-
*
|
|
9
|
-
* @param {Trail3D} trail
|
|
10
|
-
* @param {Transform} transform
|
|
11
|
-
* @returns {void}
|
|
12
|
-
*/
|
|
13
|
-
export function seed_trail_tube(trail: Trail3D, transform: Transform): void;
|
|
14
|
-
//# sourceMappingURL=seed_trail_tube.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"seed_trail_tube.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/graphics/ecs/trail3d/seed_trail_tube.js"],"names":[],"mappings":"AAwBA;;;;;;;;;;;GAWG;AACH,uEAFa,IAAI,CAwChB"}
|
|
@@ -1,75 +0,0 @@
|
|
|
1
|
-
import Vector3 from "../../../../core/geom/Vector3.js";
|
|
2
|
-
import { clamp } from "../../../../core/math/clamp.js";
|
|
3
|
-
import { TUBE_ATTRIBUTE_ADDRESS_AGE, TUBE_ATTRIBUTE_ADDRESS_UV_V } from "../../trail/tube/tube_attributes_spec.js";
|
|
4
|
-
import { compute_trail_head_position } from "./trail_head_position.js";
|
|
5
|
-
import { Trail3DFlags } from "./Trail3DFlags.js";
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* Knots laid down per second of trail life. The tube is a fixed-capacity ring, so this is what
|
|
9
|
-
* turns an age into a length.
|
|
10
|
-
*
|
|
11
|
-
* @type {number}
|
|
12
|
-
*/
|
|
13
|
-
const SEGMENTS_PER_SECOND = 60;
|
|
14
|
-
|
|
15
|
-
/**
|
|
16
|
-
* @type {number}
|
|
17
|
-
*/
|
|
18
|
-
const MAX_SEGMENTS = 1024;
|
|
19
|
-
|
|
20
|
-
/**
|
|
21
|
-
* @type {Vector3}
|
|
22
|
-
*/
|
|
23
|
-
const v3_head = new Vector3();
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
* Build a trail's knots and collapse them onto the head, ready to be drawn by whichever renderer
|
|
27
|
-
* owns the entity.
|
|
28
|
-
*
|
|
29
|
-
* **Renderer-neutral on purpose.** A trail is a simulation with a picture attached, and the
|
|
30
|
-
* simulation is the same one under either backend — what differs is only what the knots are turned
|
|
31
|
-
* into. Two copies of this would be two trails that age differently.
|
|
32
|
-
*
|
|
33
|
-
* @param {Trail3D} trail
|
|
34
|
-
* @param {Transform} transform
|
|
35
|
-
* @returns {void}
|
|
36
|
-
*/
|
|
37
|
-
export function seed_trail_tube(trail, transform) {
|
|
38
|
-
const segment_count = Math.ceil(clamp(trail.maxAge * SEGMENTS_PER_SECOND, 2, MAX_SEGMENTS));
|
|
39
|
-
|
|
40
|
-
trail.build(segment_count);
|
|
41
|
-
|
|
42
|
-
const tube = trail.tube;
|
|
43
|
-
|
|
44
|
-
trail.time = 0;
|
|
45
|
-
trail.trailingIndex = 0;
|
|
46
|
-
trail.timeSinceLastUpdate = 0;
|
|
47
|
-
trail.distanceSinceLastUpdate = 0;
|
|
48
|
-
|
|
49
|
-
// seed exactly where the per-frame update will place the head, or the first head move bridges
|
|
50
|
-
// the gap with a visible segment
|
|
51
|
-
compute_trail_head_position(v3_head, trail, transform);
|
|
52
|
-
|
|
53
|
-
const position_x = v3_head.x;
|
|
54
|
-
const position_y = v3_head.y;
|
|
55
|
-
const position_z = v3_head.z;
|
|
56
|
-
|
|
57
|
-
const color = trail.color;
|
|
58
|
-
|
|
59
|
-
// initialize knots. setCount has already seeded a valid default frame on every knot, so the
|
|
60
|
-
// freshly built (collapsed) tube is well-formed — a zero-length, invisible point — until the
|
|
61
|
-
// head starts moving and supplies real tangents.
|
|
62
|
-
for (let i = 0; i < segment_count; i++) {
|
|
63
|
-
const f = i / (segment_count - 1);
|
|
64
|
-
|
|
65
|
-
tube.setKnotColor(i, color.x, color.y, color.z);
|
|
66
|
-
tube.setKnotPosition(i, position_x, position_y, position_z);
|
|
67
|
-
tube.setKnotThickness(i, trail.width);
|
|
68
|
-
tube.setKnotAttribute_Scalar(i, TUBE_ATTRIBUTE_ADDRESS_UV_V, f);
|
|
69
|
-
// seeded age = maxAge means "already expired", so alpha follows the fade law: 0
|
|
70
|
-
tube.setKnotAlpha(i, 0);
|
|
71
|
-
tube.setKnotAttribute_Scalar(i, TUBE_ATTRIBUTE_ADDRESS_AGE, trail.maxAge);
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
trail.setFlag(Trail3DFlags.Built);
|
|
75
|
-
}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* World point the trail's head tracks: the component's {@link Trail3D#offset}, which lives in the
|
|
3
|
-
* entity's LOCAL frame, carried through the entity's full transform — so it rides the entity's
|
|
4
|
-
* rotation and scales with it.
|
|
5
|
-
*
|
|
6
|
-
* Seeding and the per-frame head update must agree on this, whichever renderer is drawing. If they
|
|
7
|
-
* disagree, the freshly built tube sits collapsed somewhere the head never visits, and the head's
|
|
8
|
-
* first move draws a segment bridging the two — a one-frame streak as long as the disagreement, in
|
|
9
|
-
* a direction fixed by the offset rather than by travel.
|
|
10
|
-
*
|
|
11
|
-
* @param {Vector3} result
|
|
12
|
-
* @param {Trail3D} trail
|
|
13
|
-
* @param {Transform} transform
|
|
14
|
-
* @returns {void}
|
|
15
|
-
*/
|
|
16
|
-
export function compute_trail_head_position(result: Vector3, trail: Trail3D, transform: Transform): void;
|
|
17
|
-
//# sourceMappingURL=trail_head_position.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"trail_head_position.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/graphics/ecs/trail3d/trail_head_position.js"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,oGAFa,IAAI,CAKhB"}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* World point the trail's head tracks: the component's {@link Trail3D#offset}, which lives in the
|
|
3
|
-
* entity's LOCAL frame, carried through the entity's full transform — so it rides the entity's
|
|
4
|
-
* rotation and scales with it.
|
|
5
|
-
*
|
|
6
|
-
* Seeding and the per-frame head update must agree on this, whichever renderer is drawing. If they
|
|
7
|
-
* disagree, the freshly built tube sits collapsed somewhere the head never visits, and the head's
|
|
8
|
-
* first move draws a segment bridging the two — a one-frame streak as long as the disagreement, in
|
|
9
|
-
* a direction fixed by the offset rather than by travel.
|
|
10
|
-
*
|
|
11
|
-
* @param {Vector3} result
|
|
12
|
-
* @param {Trail3D} trail
|
|
13
|
-
* @param {Transform} transform
|
|
14
|
-
* @returns {void}
|
|
15
|
-
*/
|
|
16
|
-
export function compute_trail_head_position(result, trail, transform) {
|
|
17
|
-
result.copy(trail.offset);
|
|
18
|
-
result.applyMatrix4(transform.matrix);
|
|
19
|
-
}
|
|
@@ -1,186 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Dynamic, non-allocating 3D tube geometry — the volumetric analogue of
|
|
3
|
-
* {@link RibbonX}.
|
|
4
|
-
*
|
|
5
|
-
* A tube is a ring buffer of `count` KNOTS along a centre-line. Each knot owns a
|
|
6
|
-
* ring of `radial + 1` vertices: the extra vertex duplicates vertex 0 so the UV
|
|
7
|
-
* seam (u = 0 meeting u = 1) closes cleanly when the texture wraps the tube.
|
|
8
|
-
* Vertices are extruded in the vertex shader from the knot's stored tangent
|
|
9
|
-
* frame, so the CPU only ever writes per-knot data (centre, frame, colour, …) —
|
|
10
|
-
* never per-triangle.
|
|
11
|
-
*
|
|
12
|
-
* Like {@link RibbonX} the geometry is a fixed-capacity ring: {@link rotate}
|
|
13
|
-
* recycles the oldest knot as the new head and rewrites a single segment's worth
|
|
14
|
-
* of indices, so steady-state updates allocate nothing.
|
|
15
|
-
*
|
|
16
|
-
* **The knots are the tube; a drawable is what a renderer makes of them.** Nothing
|
|
17
|
-
* here belongs to a renderer: {@link TubeXGeometry} wraps this data in three
|
|
18
|
-
* attribute views for the legacy path, and the Shade path extrudes the same rows
|
|
19
|
-
* into dynamic-mesh vertices. The three versions below are what tells either one
|
|
20
|
-
* that its copy is stale.
|
|
21
|
-
*/
|
|
22
|
-
export class TubeX {
|
|
23
|
-
/**
|
|
24
|
-
* The knot rows, interleaved per {@link tube_attributes_spec} — `vertex_count`
|
|
25
|
-
* records of `bytes_per_vertex` bytes, one per ring vertex.
|
|
26
|
-
*
|
|
27
|
-
* @returns {RowFirstTable}
|
|
28
|
-
*/
|
|
29
|
-
get table(): RowFirstTable;
|
|
30
|
-
/**
|
|
31
|
-
* Triangle indices over the ring vertices, sized by {@link setCount} and
|
|
32
|
-
* rewritten one segment at a time by {@link rotate}.
|
|
33
|
-
*
|
|
34
|
-
* @returns {Uint32Array}
|
|
35
|
-
*/
|
|
36
|
-
get indices(): Uint32Array;
|
|
37
|
-
/**
|
|
38
|
-
* @returns {number} bytes one ring vertex occupies in {@link table}
|
|
39
|
-
*/
|
|
40
|
-
get bytes_per_vertex(): number;
|
|
41
|
-
/**
|
|
42
|
-
* @returns {number} ring vertices across the whole tube — `count * (radial + 1)`
|
|
43
|
-
*/
|
|
44
|
-
get vertex_count(): number;
|
|
45
|
-
/**
|
|
46
|
-
* @returns {number}
|
|
47
|
-
*/
|
|
48
|
-
get data_version(): number;
|
|
49
|
-
/**
|
|
50
|
-
* @returns {number}
|
|
51
|
-
*/
|
|
52
|
-
get index_version(): number;
|
|
53
|
-
/**
|
|
54
|
-
* @returns {number}
|
|
55
|
-
*/
|
|
56
|
-
get layout_version(): number;
|
|
57
|
-
/**
|
|
58
|
-
* @returns {number} number of knots
|
|
59
|
-
*/
|
|
60
|
-
getCount(): number;
|
|
61
|
-
/**
|
|
62
|
-
* @returns {number} radial subdivisions
|
|
63
|
-
*/
|
|
64
|
-
getRadialSegments(): number;
|
|
65
|
-
getHeadIndex(): number;
|
|
66
|
-
getTailIndex(): number;
|
|
67
|
-
/**
|
|
68
|
-
* @param {number[]|Float32Array|Float64Array} result
|
|
69
|
-
* @param {number} knot_index
|
|
70
|
-
*/
|
|
71
|
-
getKnotPosition(result: number[] | Float32Array | Float64Array, knot_index: number): void;
|
|
72
|
-
/**
|
|
73
|
-
* Read the stored ring normal of a knot. Used by the head to parallel-transport
|
|
74
|
-
* its frame from the previous knot.
|
|
75
|
-
* @param {number[]|Float32Array|Float64Array} result
|
|
76
|
-
* @param {number} knot_index
|
|
77
|
-
*/
|
|
78
|
-
getKnotNormal(result: number[] | Float32Array | Float64Array, knot_index: number): void;
|
|
79
|
-
/**
|
|
80
|
-
* Read the stored ring binormal of a knot.
|
|
81
|
-
* @param {number[]|Float32Array|Float64Array} result
|
|
82
|
-
* @param {number} knot_index
|
|
83
|
-
*/
|
|
84
|
-
getKnotBinormal(result: number[] | Float32Array | Float64Array, knot_index: number): void;
|
|
85
|
-
/**
|
|
86
|
-
* Read a scalar attribute of a knot. Every vertex of the ring carries the same
|
|
87
|
-
* value, so the first one answers for the knot.
|
|
88
|
-
*
|
|
89
|
-
* @param {number} knot_index
|
|
90
|
-
* @param {number} attribute_index
|
|
91
|
-
* @returns {number}
|
|
92
|
-
*/
|
|
93
|
-
getKnotAttribute_Scalar(knot_index: number, attribute_index: number): number;
|
|
94
|
-
/**
|
|
95
|
-
* Write a vec3 attribute to all ring vertices of a knot.
|
|
96
|
-
* @param {number} knot_index
|
|
97
|
-
* @param {number} attribute_index
|
|
98
|
-
* @param {number} x
|
|
99
|
-
* @param {number} y
|
|
100
|
-
* @param {number} z
|
|
101
|
-
*/
|
|
102
|
-
setKnotAttribute_Vector3(knot_index: number, attribute_index: number, x: number, y: number, z: number): void;
|
|
103
|
-
/**
|
|
104
|
-
* Write a scalar attribute to all ring vertices of a knot.
|
|
105
|
-
* @param {number} knot_index
|
|
106
|
-
* @param {number} attribute_index
|
|
107
|
-
* @param {number} value
|
|
108
|
-
*/
|
|
109
|
-
setKnotAttribute_Scalar(knot_index: number, attribute_index: number, value: number): void;
|
|
110
|
-
/**
|
|
111
|
-
* Add `delta` to a scalar attribute on every ring vertex of a knot.
|
|
112
|
-
* @param {number} knot_index
|
|
113
|
-
* @param {number} attribute_index
|
|
114
|
-
* @param {number} delta
|
|
115
|
-
* @returns {number} incremented value
|
|
116
|
-
*/
|
|
117
|
-
incrementKnotAttribute_Scalar(knot_index: number, attribute_index: number, delta: number): number;
|
|
118
|
-
/**
|
|
119
|
-
* @param {number} knot_index
|
|
120
|
-
* @param {number} x
|
|
121
|
-
* @param {number} y
|
|
122
|
-
* @param {number} z
|
|
123
|
-
*/
|
|
124
|
-
setKnotPosition(knot_index: number, x: number, y: number, z: number): void;
|
|
125
|
-
/**
|
|
126
|
-
* Set the orienting tangent frame of a knot. `nx,ny,nz` and `bx,by,bz` must be
|
|
127
|
-
* unit vectors, mutually orthogonal and perpendicular to the local tangent.
|
|
128
|
-
* @param {number} knot_index
|
|
129
|
-
* @param {number} nx
|
|
130
|
-
* @param {number} ny
|
|
131
|
-
* @param {number} nz
|
|
132
|
-
* @param {number} bx
|
|
133
|
-
* @param {number} by
|
|
134
|
-
* @param {number} bz
|
|
135
|
-
*/
|
|
136
|
-
setKnotFrame(knot_index: number, nx: number, ny: number, nz: number, bx: number, by: number, bz: number): void;
|
|
137
|
-
/**
|
|
138
|
-
* Linear colour, stored at half precision. Not limited to 0..1: values above 1 are HDR.
|
|
139
|
-
*
|
|
140
|
-
* @param {number} knot_index
|
|
141
|
-
* @param {number} r
|
|
142
|
-
* @param {number} g
|
|
143
|
-
* @param {number} b
|
|
144
|
-
*/
|
|
145
|
-
setKnotColor(knot_index: number, r: number, g: number, b: number): void;
|
|
146
|
-
/**
|
|
147
|
-
* @param {number} knot_index
|
|
148
|
-
* @param {number} value
|
|
149
|
-
*/
|
|
150
|
-
setKnotAlpha(knot_index: number, value: number): void;
|
|
151
|
-
/**
|
|
152
|
-
* @param {number} knot_index
|
|
153
|
-
* @param {number} value tube diameter
|
|
154
|
-
*/
|
|
155
|
-
setKnotThickness(knot_index: number, value: number): void;
|
|
156
|
-
/**
|
|
157
|
-
* @param {number} count number of knots (>= 2)
|
|
158
|
-
* @param {number} [radial] radial subdivisions (>= 3)
|
|
159
|
-
*/
|
|
160
|
-
setCount(count: number, radial?: number): void;
|
|
161
|
-
/**
|
|
162
|
-
* NOTE: takes tube thickness into account.
|
|
163
|
-
* @param {AABB3|ArrayLike<number>} result
|
|
164
|
-
*/
|
|
165
|
-
computeBoundingBox(result: AABB3 | ArrayLike<number>): void;
|
|
166
|
-
/**
|
|
167
|
-
* Recycle the oldest knot as the new head, in O(radial). Mirrors
|
|
168
|
-
* {@link RibbonX#rotate}: the head/tail pointers decrement together (preserving
|
|
169
|
-
* `head === (tail + 1) mod count`), and the single tail segment's indices are
|
|
170
|
-
* rewritten to bridge the previous head's ring to the recycled (new head) ring.
|
|
171
|
-
*/
|
|
172
|
-
rotate(): void;
|
|
173
|
-
#private;
|
|
174
|
-
}
|
|
175
|
-
export namespace TubeX {
|
|
176
|
-
export { DEFAULT_RADIAL_SEGMENTS };
|
|
177
|
-
}
|
|
178
|
-
import { RowFirstTable } from "../../../../core/collection/table/RowFirstTable.js";
|
|
179
|
-
/**
|
|
180
|
-
* Default number of radial subdivisions around the tube. Overridable per-tube
|
|
181
|
-
* via {@link TubeX#setCount}; never hard-coded into the geometry.
|
|
182
|
-
* @type {number}
|
|
183
|
-
*/
|
|
184
|
-
declare const DEFAULT_RADIAL_SEGMENTS: number;
|
|
185
|
-
export {};
|
|
186
|
-
//# sourceMappingURL=TubeX.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"TubeX.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/graphics/trail/tube/TubeX.js"],"names":[],"mappings":"AA+BA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH;IAoEI;;;;;OAKG;IACH,2BAEC;IAED;;;;;OAKG;IACH,2BAEC;IAED;;OAEG;IACH,+BAEC;IAED;;OAEG;IACH,2BAEC;IAED;;OAEG;IACH,2BAEC;IAED;;OAEG;IACH,4BAEC;IAED;;OAEG;IACH,6BAEC;IAED;;OAEG;IACH,YAFa,MAAM,CAIlB;IAED;;OAEG;IACH,qBAFa,MAAM,CAIlB;IAED,uBAEC;IAED,uBAEC;IAiGD;;;OAGG;IACH,wBAHW,MAAM,EAAE,GAAC,YAAY,GAAC,YAAY,cAClC,MAAM,QAShB;IAED;;;;;OAKG;IACH,sBAHW,MAAM,EAAE,GAAC,YAAY,GAAC,YAAY,cAClC,MAAM,QAShB;IAED;;;;OAIG;IACH,wBAHW,MAAM,EAAE,GAAC,YAAY,GAAC,YAAY,cAClC,MAAM,QAShB;IAED;;;;;;;OAOG;IACH,oCAJW,MAAM,mBACN,MAAM,GACJ,MAAM,CAIlB;IAED;;;;;;;OAOG;IACH,qCANW,MAAM,mBACN,MAAM,KACN,MAAM,KACN,MAAM,KACN,MAAM,QAehB;IAED;;;;;OAKG;IACH,oCAJW,MAAM,mBACN,MAAM,SACN,MAAM,QAYhB;IAED;;;;;;OAMG;IACH,0CALW,MAAM,mBACN,MAAM,SACN,MAAM,GACJ,MAAM,CAgBlB;IAED;;;;;OAKG;IACH,4BALW,MAAM,KACN,MAAM,KACN,MAAM,KACN,MAAM,QAMhB;IAED;;;;;;;;;;OAUG;IACH,yBARW,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,QAKhB;IAED;;;;;;;OAOG;IACH,yBALW,MAAM,KACN,MAAM,KACN,MAAM,KACN,MAAM,QAMhB;IAED;;;OAGG;IACH,yBAHW,MAAM,SACN,MAAM,QAIhB;IAED;;;OAGG;IACH,6BAHW,MAAM,SACN,MAAM,QAIhB;IAED;;;OAGG;IACH,gBAHW,MAAM,WACN,MAAM,QAuChB;IAED;;;OAGG;IACH,2BAFW,QAAM,UAAU,MAAM,CAAC,QA4BjC;IAED;;;;;OAKG;IACH,eAsBC;;CACJ;;;;8BA3jB6B,oDAAoD;AAgBlF;;;;GAIG;AACH,uCAFU,MAAM,CAEkB"}
|