@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.
Files changed (190) hide show
  1. package/CHANGELOG.md +45 -0
  2. package/editor/ecs/component/editors/ecs/Trail3DEditor.d.ts +2 -17
  3. package/editor/ecs/component/editors/ecs/Trail3DEditor.d.ts.map +1 -1
  4. package/editor/ecs/component/editors/ecs/Trail3DEditor.js +3 -18
  5. package/package.json +1 -1
  6. package/src/engine/graphics/ecs/trail3d/Trail3D.d.ts +33 -65
  7. package/src/engine/graphics/ecs/trail3d/Trail3D.d.ts.map +1 -1
  8. package/src/engine/graphics/ecs/trail3d/Trail3D.js +37 -245
  9. package/src/engine/graphics/ecs/trail3d/Trail3DFlags.d.ts +0 -4
  10. package/src/engine/graphics/ecs/trail3d/Trail3DFlags.js +4 -10
  11. package/src/engine/graphics/ecs/trail3d/seed_trail_stroke.d.ts +13 -10
  12. package/src/engine/graphics/ecs/trail3d/seed_trail_stroke.d.ts.map +1 -1
  13. package/src/engine/graphics/ecs/trail3d/seed_trail_stroke.js +28 -37
  14. package/src/engine/graphics/ecs/trail3d/trail_knot_count.d.ts +10 -0
  15. package/src/engine/graphics/ecs/trail3d/trail_knot_count.d.ts.map +1 -0
  16. package/src/engine/graphics/ecs/trail3d/trail_knot_count.js +27 -0
  17. package/src/engine/graphics/trail/TrailKnots.d.ts +62 -0
  18. package/src/engine/graphics/trail/TrailKnots.d.ts.map +1 -0
  19. package/src/engine/graphics/trail/TrailKnots.js +137 -0
  20. package/src/engine/graphics/trail/tube/TubeXMaterialSpec.d.ts +1 -1
  21. package/src/engine/graphics/trail/tube/TubeXMaterialSpec.js +1 -1
  22. package/src/engine/graphics3/EntityRowHold.d.ts +48 -0
  23. package/src/engine/graphics3/EntityRowHold.d.ts.map +1 -0
  24. package/src/engine/graphics3/EntityRowHold.js +128 -0
  25. package/src/engine/graphics3/GPUParticleEmitterSystem.d.ts +6 -2
  26. package/src/engine/graphics3/GPUParticleEmitterSystem.d.ts.map +1 -1
  27. package/src/engine/graphics3/GPUParticleEmitterSystem.js +11 -44
  28. package/src/engine/graphics3/Trail3DSystem.d.ts +69 -35
  29. package/src/engine/graphics3/Trail3DSystem.d.ts.map +1 -1
  30. package/src/engine/graphics3/Trail3DSystem.js +380 -81
  31. package/src/engine/physics/fluid/ecs/FluidObstacle.d.ts +17 -0
  32. package/src/engine/physics/fluid/ecs/FluidObstacle.d.ts.map +1 -1
  33. package/src/engine/physics/fluid/ecs/FluidObstacle.js +22 -2
  34. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +6 -5
  35. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts.map +1 -1
  36. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.js +14 -3
  37. package/src/engine/physics/fluid/obstacle/FLUID_OBSTACLE_RECORD_STRUCT.d.ts +9 -1
  38. package/src/engine/physics/fluid/obstacle/FLUID_OBSTACLE_RECORD_STRUCT.d.ts.map +1 -1
  39. package/src/engine/physics/fluid/obstacle/FLUID_OBSTACLE_RECORD_STRUCT.js +11 -1
  40. package/src/engine/physics/fluid/obstacle/fluid_obstacle_record_create.d.ts +5 -0
  41. package/src/engine/physics/fluid/obstacle/fluid_obstacle_record_create.d.ts.map +1 -1
  42. package/src/engine/physics/fluid/obstacle/fluid_obstacle_record_create.js +2 -0
  43. package/src/engine/physics/fluid/obstacle/fluid_obstacle_write_gpu_record.d.ts +4 -3
  44. package/src/engine/physics/fluid/obstacle/fluid_obstacle_write_gpu_record.d.ts.map +1 -1
  45. package/src/engine/physics/fluid/obstacle/fluid_obstacle_write_gpu_record.js +11 -3
  46. package/src/shade/playground/trails/index.html +50 -0
  47. package/src/shade/playground/trails/main.d.ts +2 -0
  48. package/src/shade/playground/trails/main.d.ts.map +1 -0
  49. package/src/shade/playground/trails/main.js +258 -0
  50. package/src/shade/renderer/animation/animation_curve_write_keys.d.ts +18 -0
  51. package/src/shade/renderer/animation/animation_curve_write_keys.d.ts.map +1 -0
  52. package/src/shade/renderer/animation/animation_curve_write_keys.js +34 -0
  53. package/src/shade/renderer/deferred/tonemap/ColorGrade.d.ts.map +1 -1
  54. package/src/shade/renderer/deferred/tonemap/ColorGrade.js +13 -36
  55. package/src/shade/renderer/dynamic/GPUDynamicMeshResidency.js +2 -2
  56. package/src/shade/renderer/dynamic/chunk_dynamic_mesh_avboit_vertex.d.ts +2 -13
  57. package/src/shade/renderer/dynamic/chunk_dynamic_mesh_avboit_vertex.d.ts.map +1 -1
  58. package/src/shade/renderer/dynamic/chunk_dynamic_mesh_avboit_vertex.js +6 -21
  59. package/src/shade/renderer/dynamic/graph_dynamic_mesh_avboit.d.ts +17 -6
  60. package/src/shade/renderer/dynamic/graph_dynamic_mesh_avboit.d.ts.map +1 -1
  61. package/src/shade/renderer/dynamic/graph_dynamic_mesh_avboit.js +38 -178
  62. package/src/shade/renderer/dynamic/shader_dynamic_mesh_avboit_draw.d.ts +7 -9
  63. package/src/shade/renderer/dynamic/shader_dynamic_mesh_avboit_draw.d.ts.map +1 -1
  64. package/src/shade/renderer/dynamic/shader_dynamic_mesh_avboit_draw.js +17 -106
  65. package/src/shade/renderer/dynamic/shader_dynamic_mesh_avboit_splat.d.ts +7 -17
  66. package/src/shade/renderer/dynamic/shader_dynamic_mesh_avboit_splat.d.ts.map +1 -1
  67. package/src/shade/renderer/dynamic/shader_dynamic_mesh_avboit_splat.js +18 -118
  68. package/src/shade/renderer/fluid/forcing/FLUID_FORCING.d.ts +14 -0
  69. package/src/shade/renderer/fluid/forcing/FLUID_FORCING.d.ts.map +1 -1
  70. package/src/shade/renderer/fluid/forcing/FLUID_FORCING.js +18 -0
  71. package/src/shade/renderer/fluid/forcing/FLUID_FORCING_APPLY_STRUCT.d.ts +3 -1
  72. package/src/shade/renderer/fluid/forcing/FLUID_FORCING_APPLY_STRUCT.d.ts.map +1 -1
  73. package/src/shade/renderer/fluid/forcing/FLUID_FORCING_APPLY_STRUCT.js +4 -1
  74. package/src/shade/renderer/fluid/forcing/GPUFluidForcing.d.ts +9 -0
  75. package/src/shade/renderer/fluid/forcing/GPUFluidForcing.d.ts.map +1 -1
  76. package/src/shade/renderer/fluid/forcing/GPUFluidForcing.js +20 -4
  77. package/src/shade/renderer/fluid/forcing/chunk_fluid_forcing_cell.d.ts +11 -2
  78. package/src/shade/renderer/fluid/forcing/chunk_fluid_forcing_cell.d.ts.map +1 -1
  79. package/src/shade/renderer/fluid/forcing/chunk_fluid_forcing_cell.js +59 -2
  80. package/src/shade/renderer/fluid/forcing/shader_fluid_forcing_apply.d.ts +4 -1
  81. package/src/shade/renderer/fluid/forcing/shader_fluid_forcing_apply.d.ts.map +1 -1
  82. package/src/shade/renderer/fluid/forcing/shader_fluid_forcing_apply.js +367 -341
  83. package/src/shade/renderer/fluid/mac/shader_fluid_mac_advect_correct.d.ts +6 -2
  84. package/src/shade/renderer/fluid/mac/shader_fluid_mac_advect_correct.d.ts.map +1 -1
  85. package/src/shade/renderer/fluid/mac/shader_fluid_mac_advect_correct.js +339 -282
  86. package/src/shade/renderer/grass/press/shader_grass_press_mark.d.ts +3 -2
  87. package/src/shade/renderer/grass/press/shader_grass_press_mark.d.ts.map +1 -1
  88. package/src/shade/renderer/grass/press/shader_grass_press_mark.js +5 -3
  89. package/src/shade/renderer/rasterize/native/avboit/avboit_unlit_draw.d.ts +49 -0
  90. package/src/shade/renderer/rasterize/native/avboit/avboit_unlit_draw.d.ts.map +1 -0
  91. package/src/shade/renderer/rasterize/native/avboit/avboit_unlit_draw.js +144 -0
  92. package/src/shade/renderer/rasterize/native/avboit/avboit_unlit_splat.d.ts +71 -0
  93. package/src/shade/renderer/rasterize/native/avboit/avboit_unlit_splat.d.ts.map +1 -0
  94. package/src/shade/renderer/rasterize/native/avboit/avboit_unlit_splat.js +152 -0
  95. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_unlit_varyings.d.ts +21 -0
  96. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_unlit_varyings.d.ts.map +1 -0
  97. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_unlit_varyings.js +30 -0
  98. package/src/shade/renderer/rasterize/native/avboit/graph_avboit_unlit.d.ts +101 -0
  99. package/src/shade/renderer/rasterize/native/avboit/graph_avboit_unlit.d.ts.map +1 -0
  100. package/src/shade/renderer/rasterize/native/avboit/graph_avboit_unlit.js +306 -0
  101. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_splat.d.ts +9 -0
  102. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_splat.d.ts.map +1 -1
  103. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_splat.js +11 -4
  104. package/src/shade/renderer/trails/GPUTrailAVBOITChannel.d.ts +69 -0
  105. package/src/shade/renderer/trails/GPUTrailAVBOITChannel.d.ts.map +1 -0
  106. package/src/shade/renderer/trails/GPUTrailAVBOITChannel.js +129 -0
  107. package/src/shade/renderer/trails/GPUTrailSystem.d.ts +164 -0
  108. package/src/shade/renderer/trails/GPUTrailSystem.d.ts.map +1 -0
  109. package/src/shade/renderer/trails/GPUTrailSystem.js +725 -0
  110. package/src/shade/renderer/trails/data/TRAIL_DATABASE_SPEC.d.ts +14 -0
  111. package/src/shade/renderer/trails/data/TRAIL_DATABASE_SPEC.d.ts.map +1 -0
  112. package/src/shade/renderer/trails/data/TRAIL_DATABASE_SPEC.js +38 -0
  113. package/src/shade/renderer/trails/data/TRAIL_KNOT.d.ts +66 -0
  114. package/src/shade/renderer/trails/data/TRAIL_KNOT.d.ts.map +1 -0
  115. package/src/shade/renderer/trails/data/TRAIL_KNOT.js +154 -0
  116. package/src/shade/renderer/trails/data/TRAIL_RECORD.d.ts +19 -0
  117. package/src/shade/renderer/trails/data/TRAIL_RECORD.d.ts.map +1 -0
  118. package/src/shade/renderer/trails/data/TRAIL_RECORD.js +68 -0
  119. package/src/shade/renderer/trails/data/TRAIL_STATE.d.ts +18 -0
  120. package/src/shade/renderer/trails/data/TRAIL_STATE.d.ts.map +1 -0
  121. package/src/shade/renderer/trails/data/TRAIL_STATE.js +43 -0
  122. package/src/shade/renderer/trails/graph_trails.d.ts +58 -0
  123. package/src/shade/renderer/trails/graph_trails.d.ts.map +1 -0
  124. package/src/shade/renderer/trails/graph_trails.js +155 -0
  125. package/src/shade/renderer/trails/graph_trails_avboit.d.ts +126 -0
  126. package/src/shade/renderer/trails/graph_trails_avboit.d.ts.map +1 -0
  127. package/src/shade/renderer/trails/graph_trails_avboit.js +300 -0
  128. package/src/shade/renderer/trails/runtime/TrailFadeCurves.d.ts +56 -0
  129. package/src/shade/renderer/trails/runtime/TrailFadeCurves.d.ts.map +1 -0
  130. package/src/shade/renderer/trails/runtime/TrailFadeCurves.js +220 -0
  131. package/src/shade/renderer/trails/runtime/TrailKnotPool.d.ts +49 -0
  132. package/src/shade/renderer/trails/runtime/TrailKnotPool.d.ts.map +1 -0
  133. package/src/shade/renderer/trails/runtime/TrailKnotPool.js +162 -0
  134. package/src/shade/renderer/trails/runtime/TrailParameters.d.ts +52 -0
  135. package/src/shade/renderer/trails/runtime/TrailParameters.d.ts.map +1 -0
  136. package/src/shade/renderer/trails/runtime/TrailParameters.js +126 -0
  137. package/src/shade/renderer/trails/shaders/chunk_trail_frame_transport.d.ts +23 -0
  138. package/src/shade/renderer/trails/shaders/chunk_trail_frame_transport.d.ts.map +1 -0
  139. package/src/shade/renderer/trails/shaders/chunk_trail_frame_transport.js +57 -0
  140. package/src/shade/renderer/trails/shaders/chunk_trail_knot_alpha.d.ts +14 -0
  141. package/src/shade/renderer/trails/shaders/chunk_trail_knot_alpha.d.ts.map +1 -0
  142. package/src/shade/renderer/trails/shaders/chunk_trail_knot_alpha.js +40 -0
  143. package/src/shade/renderer/trails/shaders/chunk_trail_seed.d.ts +18 -0
  144. package/src/shade/renderer/trails/shaders/chunk_trail_seed.d.ts.map +1 -0
  145. package/src/shade/renderer/trails/shaders/chunk_trail_seed.js +64 -0
  146. package/src/shade/renderer/trails/shaders/chunk_trail_segment.d.ts +14 -0
  147. package/src/shade/renderer/trails/shaders/chunk_trail_segment.d.ts.map +1 -0
  148. package/src/shade/renderer/trails/shaders/chunk_trail_segment.js +51 -0
  149. package/src/shade/renderer/trails/shaders/chunk_trail_update.d.ts +48 -0
  150. package/src/shade/renderer/trails/shaders/chunk_trail_update.d.ts.map +1 -0
  151. package/src/shade/renderer/trails/shaders/chunk_trail_update.js +197 -0
  152. package/src/shade/renderer/trails/shaders/chunk_trail_vertex.d.ts +34 -0
  153. package/src/shade/renderer/trails/shaders/chunk_trail_vertex.d.ts.map +1 -0
  154. package/src/shade/renderer/trails/shaders/chunk_trail_vertex.js +111 -0
  155. package/src/shade/renderer/trails/shaders/shader_trail_avboit.d.ts +24 -0
  156. package/src/shade/renderer/trails/shaders/shader_trail_avboit.d.ts.map +1 -0
  157. package/src/shade/renderer/trails/shaders/shader_trail_avboit.js +78 -0
  158. package/src/shade/renderer/trails/shaders/shader_trail_avboit_segments.d.ts +23 -0
  159. package/src/shade/renderer/trails/shaders/shader_trail_avboit_segments.d.ts.map +1 -0
  160. package/src/shade/renderer/trails/shaders/shader_trail_avboit_segments.js +130 -0
  161. package/src/shade/renderer/trails/shaders/shader_trail_draw_args.d.ts +29 -0
  162. package/src/shade/renderer/trails/shaders/shader_trail_draw_args.d.ts.map +1 -0
  163. package/src/shade/renderer/trails/shaders/shader_trail_draw_args.js +78 -0
  164. package/src/shade/renderer/trails/shaders/shader_trail_seed.d.ts +18 -0
  165. package/src/shade/renderer/trails/shaders/shader_trail_seed.d.ts.map +1 -0
  166. package/src/shade/renderer/trails/shaders/shader_trail_seed.js +79 -0
  167. package/src/shade/renderer/trails/shaders/shader_trail_update.d.ts +20 -0
  168. package/src/shade/renderer/trails/shaders/shader_trail_update.d.ts.map +1 -0
  169. package/src/shade/renderer/trails/shaders/shader_trail_update.js +101 -0
  170. package/src/engine/graphics/ecs/trail3d/advance_trail.d.ts +0 -18
  171. package/src/engine/graphics/ecs/trail3d/advance_trail.d.ts.map +0 -1
  172. package/src/engine/graphics/ecs/trail3d/advance_trail.js +0 -42
  173. package/src/engine/graphics/ecs/trail3d/seed_trail_tube.d.ts +0 -14
  174. package/src/engine/graphics/ecs/trail3d/seed_trail_tube.d.ts.map +0 -1
  175. package/src/engine/graphics/ecs/trail3d/seed_trail_tube.js +0 -75
  176. package/src/engine/graphics/ecs/trail3d/trail_head_position.d.ts +0 -17
  177. package/src/engine/graphics/ecs/trail3d/trail_head_position.d.ts.map +0 -1
  178. package/src/engine/graphics/ecs/trail3d/trail_head_position.js +0 -19
  179. package/src/engine/graphics/trail/tube/TubeX.d.ts +0 -186
  180. package/src/engine/graphics/trail/tube/TubeX.d.ts.map +0 -1
  181. package/src/engine/graphics/trail/tube/TubeX.js +0 -575
  182. package/src/engine/graphics/trail/tube/simulator/TubeXFixedPhysicsSimulator.d.ts +0 -16
  183. package/src/engine/graphics/trail/tube/simulator/TubeXFixedPhysicsSimulator.d.ts.map +0 -1
  184. package/src/engine/graphics/trail/tube/simulator/TubeXFixedPhysicsSimulator.js +0 -34
  185. package/src/engine/graphics/trail/tube/tube_attributes_spec.d.ts +0 -27
  186. package/src/engine/graphics/trail/tube/tube_attributes_spec.d.ts.map +0 -1
  187. package/src/engine/graphics/trail/tube/tube_attributes_spec.js +0 -70
  188. package/src/engine/graphics3/trail/trail_tube_write_geometry.d.ts +0 -38
  189. package/src/engine/graphics3/trail/trail_tube_write_geometry.d.ts.map +0 -1
  190. 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"}