@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
@@ -9,7 +9,8 @@
9
9
  * {@link FluidComponent}: the collider's shape — posed rigidly at the
10
10
  * transform's position/rotation via {@link PosedShape3D} — is sampled at the
11
11
  * centre of every fluid cell inside its world AABB, and cells whose signed
12
- * distance is `<= obstacle.inflation` become solid. The fluid then treats
12
+ * distance is `<= obstacle.inflation` become solid. A porous obstacle (`FluidObstacle.drag` above 0)
13
+ * is the GPU fluid's alone and is left out here. The fluid then treats
13
14
  * those cells exactly like hand-authored walls: faces pinned, pressure
14
15
  * Neumann, traces clipped.
15
16
  *
@@ -66,11 +67,11 @@ export class FluidObstacleSystem extends System<any> {
66
67
  /**
67
68
  * @param {FluidComponent} fluid
68
69
  */
69
- static "__#500@#refresh_masks"(fluid: FluidComponent): void;
70
+ static "__#504@#refresh_masks"(fluid: FluidComponent): void;
70
71
  /**
71
72
  * @param {FluidComponent} fluid
72
73
  */
73
- static "__#500@#clear_field"(fluid: FluidComponent): void;
74
+ static "__#504@#clear_field"(fluid: FluidComponent): void;
74
75
  /**
75
76
  * Mark every cell of `fluid` whose centre lies within `inflation` of the
76
77
  * posed shape as solid. Iteration is clipped to the shape's world AABB
@@ -82,7 +83,7 @@ export class FluidObstacleSystem extends System<any> {
82
83
  * @param {number} inflation world-units SDF threshold
83
84
  * @param {Float64Array} point length-3 scratch
84
85
  */
85
- static "__#500@#voxelize"(fluid: FluidComponent, posed: PosedShape3D, aabb: Float64Array, inflation: number, point: Float64Array): void;
86
+ static "__#504@#voxelize"(fluid: FluidComponent, posed: PosedShape3D, aabb: Float64Array, inflation: number, point: Float64Array): void;
86
87
  /**
87
88
  * Write the obstacle's translation velocity onto every face of every cell
88
89
  * it voxelized — the moving-wall boundary condition. Runs AFTER the mask
@@ -102,7 +103,7 @@ export class FluidObstacleSystem extends System<any> {
102
103
  * @param {number} wvy
103
104
  * @param {number} wvz
104
105
  */
105
- static "__#500@#stamp_wall_velocity"(fluid: FluidComponent, posed: PosedShape3D, aabb: Float64Array, inflation: number, point: Float64Array, wvx: number, wvy: number, wvz: number): void;
106
+ static "__#504@#stamp_wall_velocity"(fluid: FluidComponent, posed: PosedShape3D, aabb: Float64Array, inflation: number, point: Float64Array, wvx: number, wvy: number, wvz: number): void;
106
107
  constructor();
107
108
  dependencies: (typeof FluidObstacle)[];
108
109
  components_used: (ResourceAccessSpecification<typeof Transform64> | ResourceAccessSpecification<typeof FluidObstacle> | ResourceAccessSpecification<typeof Collider> | ResourceAccessSpecification<typeof RigidBody> | ResourceAccessSpecification<typeof FluidComponent>)[];
@@ -1 +1 @@
1
- {"version":3,"file":"FluidObstacleSystem.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/physics/fluid/ecs/FluidObstacleSystem.js"],"names":[],"mappings":"AAUA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+DG;AACH;IAuHI;;OAEG;IACH,sCAFW,cAAc,QAIxB;IAED;;OAEG;IACH,oCAFW,cAAc,QAOxB;IAED;;;;;;;;;;OAUG;IACH,iCANW,cAAc,SACd,YAAY,QACZ,YAAY,aACZ,MAAM,SACN,YAAY,QAiDtB;IAED;;;;;;;;;;;;;;;;;;OAkBG;IACH,4CATW,cAAc,SACd,YAAY,QACZ,YAAY,aACZ,MAAM,SACN,YAAY,OACZ,MAAM,OACN,MAAM,OACN,MAAM,QAqEhB;;IAxRD,uCAA+B;IAE/B,6QAOE;;CAgRL;uBAlWsB,wBAAwB;8BAKjB,oBAAoB;4BAJtB,uCAAuC;4CAFvB,uDAAuD;yBAG1E,uBAAuB;0BACtB,wBAAwB;+BACnB,qBAAqB;6BAPvB,gDAAgD"}
1
+ {"version":3,"file":"FluidObstacleSystem.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/physics/fluid/ecs/FluidObstacleSystem.js"],"names":[],"mappings":"AAUA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgEG;AACH;IAiII;;OAEG;IACH,sCAFW,cAAc,QAIxB;IAED;;OAEG;IACH,oCAFW,cAAc,QAOxB;IAED;;;;;;;;;;OAUG;IACH,iCANW,cAAc,SACd,YAAY,QACZ,YAAY,aACZ,MAAM,SACN,YAAY,QAiDtB;IAED;;;;;;;;;;;;;;;;;;OAkBG;IACH,4CATW,cAAc,SACd,YAAY,QACZ,YAAY,aACZ,MAAM,SACN,YAAY,OACZ,MAAM,OACN,MAAM,OACN,MAAM,QAqEhB;;IAlSD,uCAA+B;IAE/B,6QAOE;;CA0RL;uBA7WsB,wBAAwB;8BAKjB,oBAAoB;4BAJtB,uCAAuC;4CAFvB,uDAAuD;yBAG1E,uBAAuB;0BACtB,wBAAwB;+BACnB,qBAAqB;6BAPvB,gDAAgD"}
@@ -19,7 +19,8 @@ import { FluidObstacle } from "./FluidObstacle.js";
19
19
  * {@link FluidComponent}: the collider's shape — posed rigidly at the
20
20
  * transform's position/rotation via {@link PosedShape3D} — is sampled at the
21
21
  * centre of every fluid cell inside its world AABB, and cells whose signed
22
- * distance is `<= obstacle.inflation` become solid. The fluid then treats
22
+ * distance is `<= obstacle.inflation` become solid. A porous obstacle (`FluidObstacle.drag` above 0)
23
+ * is the GPU fluid's alone and is left out here. The fluid then treats
23
24
  * those cells exactly like hand-authored walls: faces pinned, pressure
24
25
  * Neumann, traces clipped.
25
26
  *
@@ -119,8 +120,10 @@ export class FluidObstacleSystem extends System {
119
120
  // With no obstacles the system must not touch any mask — fields with
120
121
  // hand-authored solids keep them.
121
122
  let obstacle_count = 0;
122
- ecd.traverseEntities([FluidObstacle, Collider, RigidBody, Transform64], function () {
123
- obstacle_count++;
123
+ ecd.traverseEntities([FluidObstacle, Collider, RigidBody, Transform64], function (obstacle) {
124
+ if (obstacle.drag === 0) {
125
+ obstacle_count++;
126
+ }
124
127
  });
125
128
  if (obstacle_count === 0) {
126
129
  return;
@@ -136,6 +139,10 @@ export class FluidObstacleSystem extends System {
136
139
  const point = this.#point;
137
140
 
138
141
  ecd.traverseEntities([FluidObstacle, Collider, RigidBody, Transform64], function (obstacle, collider, body, transform) {
142
+ if (obstacle.drag !== 0) {
143
+ return;
144
+ }
145
+
139
146
  posed.setup_components(
140
147
  collider.shape,
141
148
  transform.translation_x, transform.translation_y, transform.translation_z,
@@ -161,6 +168,10 @@ export class FluidObstacleSystem extends System {
161
168
  // (and pulls) the surrounding fluid. The source is the solver's own
162
169
  // linearVelocity, NOT a pose delta — teleports stamp nothing.
163
170
  ecd.traverseEntities([FluidObstacle, Collider, RigidBody, Transform64], function (obstacle, collider, body, transform) {
171
+ if (obstacle.drag !== 0) {
172
+ return;
173
+ }
174
+
164
175
  const lv = body.linearVelocity;
165
176
  const vx = lv[0];
166
177
  const vy = lv[1];
@@ -8,7 +8,7 @@
8
8
  * of rows; one with no record of its own (a mesh, a heightmap, a scaled wrapper) is one row, its
9
9
  * oriented box (`shape_record_pack_bounding_box`), until the SDF stage. A hull's planes are rows of a
10
10
  * plane table, `vec4<f32>` each in core's `(n, offset)` layout, from `shape_parameters.x` for
11
- * `shape_parameters.y` planes. 80 bytes.
11
+ * `shape_parameters.y` planes. 96 bytes.
12
12
  *
13
13
  * Written field by field in two halves: {@link fluid_obstacle_write_gpu_shape} when the collider's
14
14
  * shape changes, {@link fluid_obstacle_write_gpu_motion} every frame, so an obstacle whose inflation
@@ -25,6 +25,14 @@
25
25
  * `fluid_obstacle_record_signed_distance` and `fluid_obstacle_record_wall_velocity`
26
26
  * (`chunk_fluid_obstacle_record`) are those, with CPU twins.
27
27
  *
28
+ * ## Solid or porous
29
+ *
30
+ * A record whose `drag` is 0 is **solid**: the air in it moves with the wall, and the faces of its
31
+ * cells are pinned. One whose `drag` is above 0 is **porous**: the air passes through it and is
32
+ * slowed toward the wall's velocity by `drag · |u − v| · (u − v)` a second, `u` the air's velocity
33
+ * and `v` the wall's (`FluidObstacle.drag`). The solid is the limit of the porous as the drag grows
34
+ * without bound. A porous record has no inflation: what it slows is what its surface holds.
35
+ *
28
36
  * @type {WebGPUStruct}
29
37
  */
30
38
  export const FLUID_OBSTACLE_RECORD_STRUCT: WebGPUStruct;
@@ -1 +1 @@
1
- {"version":3,"file":"FLUID_OBSTACLE_RECORD_STRUCT.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/physics/fluid/obstacle/FLUID_OBSTACLE_RECORD_STRUCT.js"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,2CAFU,YAAY,CAmBI;6BAhDG,wDAAwD"}
1
+ {"version":3,"file":"FLUID_OBSTACLE_RECORD_STRUCT.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/physics/fluid/obstacle/FLUID_OBSTACLE_RECORD_STRUCT.js"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,2CAFU,YAAY,CAqBI;6BA1DG,wDAAwD"}
@@ -11,7 +11,7 @@ import { WebGPUStruct } from "../../../../shade/renderer/shader/type/WebGPUStruc
11
11
  * of rows; one with no record of its own (a mesh, a heightmap, a scaled wrapper) is one row, its
12
12
  * oriented box (`shape_record_pack_bounding_box`), until the SDF stage. A hull's planes are rows of a
13
13
  * plane table, `vec4<f32>` each in core's `(n, offset)` layout, from `shape_parameters.x` for
14
- * `shape_parameters.y` planes. 80 bytes.
14
+ * `shape_parameters.y` planes. 96 bytes.
15
15
  *
16
16
  * Written field by field in two halves: {@link fluid_obstacle_write_gpu_shape} when the collider's
17
17
  * shape changes, {@link fluid_obstacle_write_gpu_motion} every frame, so an obstacle whose inflation
@@ -28,6 +28,14 @@ import { WebGPUStruct } from "../../../../shade/renderer/shader/type/WebGPUStruc
28
28
  * `fluid_obstacle_record_signed_distance` and `fluid_obstacle_record_wall_velocity`
29
29
  * (`chunk_fluid_obstacle_record`) are those, with CPU twins.
30
30
  *
31
+ * ## Solid or porous
32
+ *
33
+ * A record whose `drag` is 0 is **solid**: the air in it moves with the wall, and the faces of its
34
+ * cells are pinned. One whose `drag` is above 0 is **porous**: the air passes through it and is
35
+ * slowed toward the wall's velocity by `drag · |u − v| · (u − v)` a second, `u` the air's velocity
36
+ * and `v` the wall's (`FluidObstacle.drag`). The solid is the limit of the porous as the drag grows
37
+ * without bound. A porous record has no inflation: what it slows is what its surface holds.
38
+ *
31
39
  * @type {WebGPUStruct}
32
40
  */
33
41
  export const FLUID_OBSTACLE_RECORD_STRUCT = WebGPUStruct.from({
@@ -47,4 +55,6 @@ export const FLUID_OBSTACLE_RECORD_STRUCT = WebGPUStruct.from({
47
55
  angular_velocity: vec3f,
48
56
  /** The transforms row that poses the record; `NODE3D_SCENE_ID` (0) for the world. */
49
57
  node: u32,
58
+ /** `FluidObstacle.drag`, 1/m: 0 for a solid, above 0 for a porous obstacle's drag. */
59
+ drag: f32,
50
60
  }, "FluidObstacleRecord");
@@ -8,6 +8,7 @@
8
8
  * @property {number} inflation metres
9
9
  * @property {Float32Array} angular_velocity `[x, y, z]`, world rad/s
10
10
  * @property {number} node the transforms row that poses the record
11
+ * @property {number} drag 1/m: 0 for a solid, above 0 for a porous obstacle's drag
11
12
  */
12
13
  /**
13
14
  * A staging record for one row of {@link FLUID_OBSTACLE_RECORD_STRUCT}: what
@@ -54,5 +55,9 @@ export type FluidObstacleRecord = {
54
55
  * the transforms row that poses the record
55
56
  */
56
57
  node: number;
58
+ /**
59
+ * 1/m: 0 for a solid, above 0 for a porous obstacle's drag
60
+ */
61
+ drag: number;
57
62
  };
58
63
  //# sourceMappingURL=fluid_obstacle_record_create.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"fluid_obstacle_record_create.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/physics/fluid/obstacle/fluid_obstacle_record_create.js"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH;;;;;;;;;;GAUG;AACH,gDAFa,mBAAmB,CAa/B;;;;;sBAhCa,YAAY;;;;sBACZ,YAAY;;;;gBACZ,MAAM;;;;mBACN,YAAY;;;;qBACZ,YAAY;;;;eACZ,MAAM;;;;sBACN,YAAY;;;;UACZ,MAAM"}
1
+ {"version":3,"file":"fluid_obstacle_record_create.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/physics/fluid/obstacle/fluid_obstacle_record_create.js"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH;;;;;;;;;;GAUG;AACH,gDAFa,mBAAmB,CAc/B;;;;;sBAlCa,YAAY;;;;sBACZ,YAAY;;;;gBACZ,MAAM;;;;mBACN,YAAY;;;;qBACZ,YAAY;;;;eACZ,MAAM;;;;sBACN,YAAY;;;;UACZ,MAAM;;;;UACN,MAAM"}
@@ -8,6 +8,7 @@
8
8
  * @property {number} inflation metres
9
9
  * @property {Float32Array} angular_velocity `[x, y, z]`, world rad/s
10
10
  * @property {number} node the transforms row that poses the record
11
+ * @property {number} drag 1/m: 0 for a solid, above 0 for a porous obstacle's drag
11
12
  */
12
13
 
13
14
  /**
@@ -31,5 +32,6 @@ export function fluid_obstacle_record_create() {
31
32
  inflation: 0,
32
33
  angular_velocity: new Float32Array(3),
33
34
  node: 0,
35
+ drag: 0,
34
36
  };
35
37
  }
@@ -39,8 +39,8 @@ export function fluid_obstacle_record_plane_count(record: FluidObstacleRecord):
39
39
  */
40
40
  export function fluid_obstacle_write_gpu_shape(record: FluidObstacleRecord, planes: Float32Array, plane_index: number, shape: AbstractShape3D, element: number): number;
41
41
  /**
42
- * Write the motion half of a record: the obstacle's inflation and its body's linear and angular
43
- * velocity, comparing each as it is assigned. Every record of a collider's run takes the same.
42
+ * Write the motion half of a record: the obstacle's inflation and drag and its body's linear and
43
+ * angular velocity, comparing each as it is assigned. Every record of a collider's run takes the same.
44
44
  * Allocates nothing.
45
45
  *
46
46
  * @param {FluidObstacleRecord} record
@@ -64,7 +64,8 @@ export function fluid_obstacle_write_gpu_motion(record: FluidObstacleRecord, obs
64
64
  * - {@link fluid_obstacle_write_gpu_shape}: the shape record, its pose within the collider and a
65
65
  * hull's planes. A collider's shape is shared and never mutated, so it changes only when the
66
66
  * collider is handed another shape object, which is when a caller writes this half, and on link;
67
- * - {@link fluid_obstacle_write_gpu_motion}: the inflation and the body's velocities, every frame.
67
+ * - {@link fluid_obstacle_write_gpu_motion}: the inflation, the drag and the body's velocities,
68
+ * every frame.
68
69
  *
69
70
  * So an obstacle whose inflation and motion have not changed (a static wall, a sleeping body) writes
70
71
  * nothing, and its pose is its node's. A caller links a collider as
@@ -1 +1 @@
1
- {"version":3,"file":"fluid_obstacle_write_gpu_record.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/physics/fluid/obstacle/fluid_obstacle_write_gpu_record.js"],"names":[],"mappings":"AAgEA;;;;;;GAMG;AACH,qEAFa,MAAM,CAUlB;AAED;;;;;GAKG;AACH,oEAFa,MAAM,CAclB;AAED;;;;;;GAMG;AACH,gFAFa,MAAM,CAOlB;AAED;;;;;;;;;;;;;;;GAeG;AACH,oFAPW,YAAY,eACZ,MAAM,mCAEN,MAAM,GACJ,MAAM,CA4FlB;AAED;;;;;;;;;GASG;AACH,wHAFa,OAAO,CAyCnB;AAhQD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AAEH;;;GAGG;AACH,4CAFU,MAAM,CAE+B;AAE/C;;;GAGG;AACH,4CAFU,MAAM,CAE+B"}
1
+ {"version":3,"file":"fluid_obstacle_write_gpu_record.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/physics/fluid/obstacle/fluid_obstacle_write_gpu_record.js"],"names":[],"mappings":"AAiEA;;;;;;GAMG;AACH,qEAFa,MAAM,CAUlB;AAED;;;;;GAKG;AACH,oEAFa,MAAM,CAclB;AAED;;;;;;GAMG;AACH,gFAFa,MAAM,CAOlB;AAED;;;;;;;;;;;;;;;GAeG;AACH,oFAPW,YAAY,eACZ,MAAM,mCAEN,MAAM,GACJ,MAAM,CA4FlB;AAED;;;;;;;;;GASG;AACH,wHAFa,OAAO,CAgDnB;AAxQD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AAEH;;;GAGG;AACH,4CAFU,MAAM,CAE+B;AAE/C;;;GAGG;AACH,4CAFU,MAAM,CAE+B"}
@@ -28,7 +28,8 @@ import { shape_record_pack_bounding_box } from "../../../../core/geom/3d/shape/r
28
28
  * - {@link fluid_obstacle_write_gpu_shape}: the shape record, its pose within the collider and a
29
29
  * hull's planes. A collider's shape is shared and never mutated, so it changes only when the
30
30
  * collider is handed another shape object, which is when a caller writes this half, and on link;
31
- * - {@link fluid_obstacle_write_gpu_motion}: the inflation and the body's velocities, every frame.
31
+ * - {@link fluid_obstacle_write_gpu_motion}: the inflation, the drag and the body's velocities,
32
+ * every frame.
32
33
  *
33
34
  * So an obstacle whose inflation and motion have not changed (a static wall, a sleeping body) writes
34
35
  * nothing, and its pose is its node's. A caller links a collider as
@@ -221,8 +222,8 @@ export function fluid_obstacle_write_gpu_shape(record, planes, plane_index, shap
221
222
  }
222
223
 
223
224
  /**
224
- * Write the motion half of a record: the obstacle's inflation and its body's linear and angular
225
- * velocity, comparing each as it is assigned. Every record of a collider's run takes the same.
225
+ * Write the motion half of a record: the obstacle's inflation and drag and its body's linear and
226
+ * angular velocity, comparing each as it is assigned. Every record of a collider's run takes the same.
226
227
  * Allocates nothing.
227
228
  *
228
229
  * @param {FluidObstacleRecord} record
@@ -240,6 +241,13 @@ export function fluid_obstacle_write_gpu_motion(record, obstacle, body) {
240
241
  changed = true;
241
242
  }
242
243
 
244
+ const drag = Math.fround(obstacle.drag);
245
+
246
+ if (record.drag !== drag) {
247
+ record.drag = drag;
248
+ changed = true;
249
+ }
250
+
243
251
  const linear = body.linearVelocity;
244
252
  const linear_velocity = record.linear_velocity;
245
253
 
@@ -0,0 +1,50 @@
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>Trails</title>
7
+ <style>
8
+ :root {
9
+ color-scheme: dark;
10
+ }
11
+
12
+ html, body {
13
+ margin: 0;
14
+ height: 100%;
15
+ overflow: hidden;
16
+ background: #0b0d10;
17
+ color: #e4e6ea;
18
+ font: 13px system-ui, sans-serif;
19
+ }
20
+
21
+ #viewport {
22
+ position: fixed;
23
+ inset: 0;
24
+ }
25
+
26
+ #hud {
27
+ position: fixed;
28
+ left: 12px;
29
+ top: 10px;
30
+ padding: 6px 10px;
31
+ border-radius: 6px;
32
+ background: rgba(10, 12, 16, 0.7);
33
+ font-variant-numeric: tabular-nums;
34
+ }
35
+
36
+ #message {
37
+ position: fixed;
38
+ inset: 40% 10% auto 10%;
39
+ white-space: pre-wrap;
40
+ text-align: center;
41
+ }
42
+ </style>
43
+ </head>
44
+ <body tabindex="-1">
45
+ <div id="viewport"></div>
46
+ <div id="hud">starting…</div>
47
+ <div id="message"></div>
48
+ <script type="module" src="./main.js"></script>
49
+ </body>
50
+ </html>
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=main.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../../../../src/shade/playground/trails/main.js"],"names":[],"mappings":""}
@@ -0,0 +1,258 @@
1
+ import Vector3 from "../../../core/geom/Vector3.js";
2
+ import { DEG_TO_RAD } from "../../../core/math/DEG_TO_RAD.js";
3
+ import { Entity } from "../../../engine/ecs/Entity.js";
4
+ import { EntityComponentDataset } from "../../../engine/ecs/EntityComponentDataset.js";
5
+ import { EntityManager } from "../../../engine/ecs/EntityManager.js";
6
+ import { t64_announce_change } from "../../../engine/ecs/transform/t64_announce_change.js";
7
+ import { Transform64 } from "../../../engine/ecs/transform/Transform64.js";
8
+ import Trail3D from "../../../engine/graphics/ecs/trail3d/Trail3D.js";
9
+ import { GraphicsEngine } from "../../../engine/graphics3/GraphicsEngine.js";
10
+ import { Trail3DSystem } from "../../../engine/graphics3/Trail3DSystem.js";
11
+ import { OrbitalCameraController } from "../../renderer/camera/orbital/OrbitalCameraController.js";
12
+ import { create_frame_loop } from "../../renderer/create_frame_loop.js";
13
+ import { Scene } from "../../renderer/scene/Scene.js";
14
+ import { ShadeTransparencyMode } from "../../renderer/ShadeTransparencyMode.js";
15
+
16
+ /**
17
+ * A field of trails on figures-of-eight, simulated in compute and extruded in the vertex stage by
18
+ * `Trail3DSystem`, drawn through AVBOIT.
19
+ *
20
+ * Query: `n` trails (64), `age` maxAge in seconds (2), `radial` (8, or a list such as
21
+ * `4,8,16` taken in turn), `width` (0.08), `debug` to drive frames by hand through `__step(n, dt)`
22
+ * instead of the frame loop.
23
+ */
24
+
25
+ const query = new URLSearchParams(location.search);
26
+
27
+ const number = (name, fallback) => {
28
+ const value = Number(query.get(name));
29
+
30
+ return query.has(name) && Number.isFinite(value) ? value : fallback;
31
+ };
32
+
33
+ const COUNT = Math.max(1, Math.floor(number("n", 64)));
34
+ const MAX_AGE = number("age", 2);
35
+ /** Radial segments, one value or a comma list the trails take in turn: each distinct value is its own draw. */
36
+ const RADIALS = (query.get("radial") ?? "8").split(",").map(v => Math.max(3, Math.floor(Number(v) || 8)));
37
+ const WIDTH = number("width", 0.08);
38
+
39
+ /** Trails per row of the field. */
40
+ const ROW = Math.ceil(Math.sqrt(COUNT));
41
+
42
+ /** Spacing of the field. */
43
+ const SPACING = 3;
44
+
45
+ const element = id => document.getElementById(id);
46
+
47
+ const view_size = () => [Math.max(1, window.innerWidth), Math.max(1, window.innerHeight)];
48
+
49
+ /**
50
+ * Where trail `i` is at time `t`: a figure-of-eight round its own place in the field, each at its own
51
+ * phase, rising and falling.
52
+ *
53
+ * @param {number} i
54
+ * @param {number} t
55
+ * @param {number[]} out
56
+ */
57
+ function place(i, t, out) {
58
+ const column = i % ROW;
59
+ const row = Math.floor(i / ROW);
60
+
61
+ const phase = i * 0.6180339 * Math.PI * 2;
62
+ const a = phase + t * 1.3;
63
+
64
+ out[0] = (column - (ROW - 1) * 0.5) * SPACING + Math.sin(a) * 1.2;
65
+ out[1] = 1.5 + Math.sin(a * 2 + phase) * 0.5;
66
+ out[2] = (row - (ROW - 1) * 0.5) * SPACING + Math.sin(a * 2) * 0.8;
67
+ }
68
+
69
+ /**
70
+ * A colour per trail, bright and linear.
71
+ *
72
+ * @param {number} i
73
+ * @returns {number[]}
74
+ */
75
+ function tint(i) {
76
+ const h = (i * 0.137) % 1;
77
+ const k = n => (n + h * 6) % 6;
78
+ const f = n => 1 - Math.max(0, Math.min(k(n), 4 - k(n), 1));
79
+
80
+ return [f(5) * 2, f(3) * 2, f(1) * 2];
81
+ }
82
+
83
+ async function main() {
84
+ const graphics = new GraphicsEngine();
85
+ const scene = new Scene();
86
+
87
+ graphics.set_scene(scene);
88
+
89
+ element("viewport").appendChild(graphics.viewport.el);
90
+
91
+ const [width, height] = view_size();
92
+
93
+ graphics.viewport.size.set(width, height);
94
+
95
+ const dataset = new EntityComponentDataset();
96
+ const entities = new EntityManager();
97
+
98
+ const system = new Trail3DSystem(graphics, scene);
99
+
100
+ entities.addSystem(system);
101
+ entities.attachDataset(dataset);
102
+
103
+ await new Promise((resolve, reject) => entities.startup(resolve, reject));
104
+
105
+ const transforms = [];
106
+ const position = [0, 0, 0];
107
+
108
+ for (let i = 0; i < COUNT; i++) {
109
+ const trail = new Trail3D();
110
+
111
+ trail.maxAge = MAX_AGE;
112
+ trail.width = WIDTH;
113
+ trail.radialSegments = RADIALS[i % RADIALS.length];
114
+
115
+ const [r, g, b] = tint(i);
116
+
117
+ trail.color.set(r, g, b, 0.9);
118
+
119
+ const transform = new Transform64();
120
+
121
+ place(i, 0, position);
122
+ transform.setTranslation(position[0], position[1], position[2]);
123
+ transform.updateMatrix();
124
+
125
+ const entity = new Entity().add(transform).add(trail).build(dataset);
126
+
127
+ transforms.push({ entity, transform });
128
+ }
129
+
130
+ const camera = graphics.camera.camera;
131
+ const extent = ROW * SPACING;
132
+
133
+ camera.near = 0.05;
134
+ camera.far = 1000;
135
+ camera.fov = 50 * DEG_TO_RAD;
136
+
137
+ const controller = new OrbitalCameraController(camera, document.body);
138
+
139
+ controller.look(new Vector3(0, extent * 0.55 + 4, extent * 0.75 + 6), new Vector3(0, 1.5, 0));
140
+
141
+ graphics.on.contextFailed.add(failure => show_message("There will be no rendering.\n\n" + failure.message));
142
+
143
+ try {
144
+ await graphics.start();
145
+ } catch (e) {
146
+ console.error(e);
147
+ return;
148
+ }
149
+
150
+ const renderer = graphics.renderer;
151
+
152
+ /** What the device reported on its own: validation failures and the like. */
153
+ const gpu_errors = [];
154
+
155
+ renderer.graphics.device.addEventListener("uncapturederror", event => {
156
+ gpu_errors.push(event.error.message);
157
+ console.error(event.error.message);
158
+ });
159
+
160
+ renderer.transparency_mode = ShadeTransparencyMode.AVBOIT;
161
+ renderer.feature_automatic_exposure_enabled = false;
162
+ renderer.exposure_compensation = 0;
163
+
164
+ let time = 0;
165
+ let frame_index = 0;
166
+
167
+ /** Frames the renderer drew: none while its pipelines compile. */
168
+ let drawn = 0;
169
+
170
+ /** CPU milliseconds of the last frames: the tick and the render call. */
171
+ const cpu_ms = [];
172
+
173
+ function frame(dt) {
174
+ const [w, h] = view_size();
175
+
176
+ if (w !== graphics.viewport.size.x || h !== graphics.viewport.size.y) {
177
+ graphics.viewport.size.set(w, h);
178
+ }
179
+
180
+ time += dt;
181
+
182
+ for (let i = 0; i < transforms.length; i++) {
183
+ const { entity, transform } = transforms[i];
184
+
185
+ place(i, time, position);
186
+ transform.setTranslation(position[0], position[1], position[2]);
187
+ transform.updateMatrix();
188
+
189
+ t64_announce_change(dataset, entity);
190
+ }
191
+
192
+ controller.update();
193
+
194
+ const t0 = performance.now();
195
+
196
+ entities.update(dt);
197
+ if (graphics.render(dt)) {
198
+ drawn++;
199
+ }
200
+
201
+ cpu_ms.push(performance.now() - t0);
202
+
203
+ if (cpu_ms.length > 600) {
204
+ cpu_ms.shift();
205
+ }
206
+
207
+ frame_index++;
208
+
209
+ if (frame_index % 30 === 0) {
210
+ const sorted = [...cpu_ms].sort((a, b) => a - b);
211
+
212
+ element("hud").textContent = `${COUNT} trails · ${MAX_AGE} s · radial ${RADIALS.join(",")} · `
213
+ + `CPU ${sorted[Math.floor(sorted.length / 2)].toFixed(2)} ms/frame (median)`;
214
+ }
215
+ }
216
+
217
+ Object.assign(globalThis, {
218
+ graphics, renderer, scene, dataset, entities, system, camera, controller, Vector3,
219
+ __cpu_ms: cpu_ms,
220
+ __gpu_errors: gpu_errors,
221
+ __frame_index: () => frame_index,
222
+ __drawn: () => drawn,
223
+ __seek: t => {
224
+ time = t;
225
+ },
226
+ });
227
+
228
+ if (query.has("debug")) {
229
+ globalThis.__step = (n = 1, dt = 1 / 60) => {
230
+ for (let i = 0; i < n; i++) {
231
+ frame(dt);
232
+ }
233
+
234
+ return frame_index;
235
+ };
236
+
237
+ globalThis.__ready = true;
238
+
239
+ return;
240
+ }
241
+
242
+ globalThis.__ready = true;
243
+
244
+ create_frame_loop(dt => frame(Math.min(dt, 0.05)));
245
+ }
246
+
247
+ function show_message(text) {
248
+ const node = element("message");
249
+
250
+ if (node !== null) {
251
+ node.textContent = text;
252
+ }
253
+ }
254
+
255
+ main().catch(e => {
256
+ console.error(e);
257
+ show_message("The trails playground failed to start — see the console.\n\n" + e.message);
258
+ });
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Write a curve's keys into `out` at float index `at`, laid out as `ANIMATION_CURVE_KEYFRAME_STRUCT`, the
3
+ * form `chunk_animation_curve_evaluate_keys` reads them in.
4
+ *
5
+ * @param {Float32Array} out
6
+ * @param {number} at float index
7
+ * @param {import("../../../engine/animation/curve/AnimationCurve.js").AnimationCurve} curve
8
+ * @returns {number} the float index after the curve's keys
9
+ */
10
+ export function animation_curve_write_keys(out: Float32Array, at: number, curve: import("../../../engine/animation/curve/AnimationCurve.js").AnimationCurve): number;
11
+ /**
12
+ * Floats of one keyframe in an `ANIMATION_CURVE_KEYFRAME_STRUCT` array: time, value, in tangent, out
13
+ * tangent.
14
+ *
15
+ * @type {number}
16
+ */
17
+ export const ANIMATION_CURVE_KEYFRAME_FLOATS: number;
18
+ //# sourceMappingURL=animation_curve_write_keys.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"animation_curve_write_keys.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/animation/animation_curve_write_keys.js"],"names":[],"mappings":"AAQA;;;;;;;;GAQG;AACH,gDALW,YAAY,MACZ,MAAM,SACN,OAAO,mDAAmD,EAAE,cAAc,GACxE,MAAM,CAkBlB;AAjCD;;;;;GAKG;AACH,8CAFU,MAAM,CAEiC"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Floats of one keyframe in an `ANIMATION_CURVE_KEYFRAME_STRUCT` array: time, value, in tangent, out
3
+ * tangent.
4
+ *
5
+ * @type {number}
6
+ */
7
+ export const ANIMATION_CURVE_KEYFRAME_FLOATS = 4;
8
+
9
+ /**
10
+ * Write a curve's keys into `out` at float index `at`, laid out as `ANIMATION_CURVE_KEYFRAME_STRUCT`, the
11
+ * form `chunk_animation_curve_evaluate_keys` reads them in.
12
+ *
13
+ * @param {Float32Array} out
14
+ * @param {number} at float index
15
+ * @param {import("../../../engine/animation/curve/AnimationCurve.js").AnimationCurve} curve
16
+ * @returns {number} the float index after the curve's keys
17
+ */
18
+ export function animation_curve_write_keys(out, at, curve) {
19
+ const keys = curve.keys;
20
+ const count = keys.length;
21
+
22
+ for (let i = 0; i < count; i++) {
23
+ const key = keys[i];
24
+
25
+ out[at] = key.time;
26
+ out[at + 1] = key.value;
27
+ out[at + 2] = key.inTangent;
28
+ out[at + 3] = key.outTangent;
29
+
30
+ at += ANIMATION_CURVE_KEYFRAME_FLOATS;
31
+ }
32
+
33
+ return at;
34
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"ColorGrade.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/deferred/tonemap/ColorGrade.js"],"names":[],"mappings":"AAOA;;;;;;;;;;;;;;;GAeG;AACH,8CA2BG;AAEH;;;GAGG;AACH,wCAFU,MAAM,CAE4B;AAE5C;;;GAGG;AACH,qCAFU,MAAM,CAEwB;AAExC;;;GAGG;AACH;IACI;;;;OAIG;IACH,qBAFU,OAAO,CAEoB;IAErC;;;;OAIG;IACH,mBAFU,OAAO,CAEkB;IAEnC;;;;OAIG;IACH,gBAFU,OAAO,CAEe;IAEhC;;;OAGG;IACH,eAFU,OAAO,CAEc;IAE/B;;;;OAIG;IACH,iBAFU,OAAO,CAEgB;CACpC;AAwED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH;IACI;;;OAGG;IACH,mBAFU,MAAM,CAEsC;IAEtD;;;OAGG;IACH,YAFU,MAAM,CAEwB;IAExC;;;;OAIG;IACH,iBAFU,cAAc,CAEM;IAE9B;;;OAGG;IACH,kBAFU,cAAc,CAEO;IAE/B;;;OAGG;IACH,mBAFU,cAAc,CAEQ;IAEhC;;;OAGG;IACH,qBAFU,cAAc,CAEU;IAElC;;;OAGG;IACH,aAFU,MAAM,CAEG;IAEnB;;;OAGG;IACH,gBAFU,MAAM,CAEK;IAErB;;;OAGG;IACH,gBAFU,MAAM,CAEG;IAEnB;;;;OAIG;IACH,oBAFU,cAAc,CAES;IAEjC;;;;OAIG;IACH,yBAFU,cAAc,CAEc;IAEtC;;;;OAIG;IACH,wBAFU,cAAc,CAEa;IAErC;;;;;OAKG;IACH,0BAFU,cAAc,CAEe;IAEvC;;;;;OAKG;IACH,8BAFU,cAAc,CAEmB;IAE3C;;;;;OAKG;IACH,gCAFU,cAAc,CAEqB;IAE7C;;;;;OAKG;IACH,+BAFU,cAAc,CAEoB;IAE5C;;;;OAIG;IACH,wBAFU,cAAc,CAEa;IAErC;;;;OAIG;IACH,0BAFU,cAAc,CAEe;IAEvC;;;;OAIG;IACH,yBAFU,cAAc,CAEc;IAEtC;;;;OAIG;IACH,wBAFU,cAAc,CAEa;IAarC;;;;;;;OAOG;IACH,QAFa,YAAY,CAgFxB;;CACJ;6BAtb4B,mCAAmC;wBAHxC,kCAAkC;+BAC3B,sDAAsD"}
1
+ {"version":3,"file":"ColorGrade.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/deferred/tonemap/ColorGrade.js"],"names":[],"mappings":"AAQA;;;;;;;;;;;;;;;GAeG;AACH,8CA2BG;AAEH;;;GAGG;AACH,wCAFU,MAAM,CAE4B;AAE5C;;;GAGG;AACH,qCAFU,MAAM,CAEsD;AAEtE;;;GAGG;AACH;IACI;;;;OAIG;IACH,qBAFU,OAAO,CAEoB;IAErC;;;;OAIG;IACH,mBAFU,OAAO,CAEkB;IAEnC;;;;OAIG;IACH,gBAFU,OAAO,CAEe;IAEhC;;;OAGG;IACH,eAFU,OAAO,CAEc;IAE/B;;;;OAIG;IACH,iBAFU,OAAO,CAEgB;CACpC;AAgDD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH;IACI;;;OAGG;IACH,mBAFU,MAAM,CAEsC;IAEtD;;;OAGG;IACH,YAFU,MAAM,CAEwB;IAExC;;;;OAIG;IACH,iBAFU,cAAc,CAEM;IAE9B;;;OAGG;IACH,kBAFU,cAAc,CAEO;IAE/B;;;OAGG;IACH,mBAFU,cAAc,CAEQ;IAEhC;;;OAGG;IACH,qBAFU,cAAc,CAEU;IAElC;;;OAGG;IACH,aAFU,MAAM,CAEG;IAEnB;;;OAGG;IACH,gBAFU,MAAM,CAEK;IAErB;;;OAGG;IACH,gBAFU,MAAM,CAEG;IAEnB;;;;OAIG;IACH,oBAFU,cAAc,CAES;IAEjC;;;;OAIG;IACH,yBAFU,cAAc,CAEc;IAEtC;;;;OAIG;IACH,wBAFU,cAAc,CAEa;IAErC;;;;;OAKG;IACH,0BAFU,cAAc,CAEe;IAEvC;;;;;OAKG;IACH,8BAFU,cAAc,CAEmB;IAE3C;;;;;OAKG;IACH,gCAFU,cAAc,CAEqB;IAE7C;;;;;OAKG;IACH,+BAFU,cAAc,CAEoB;IAE5C;;;;OAIG;IACH,wBAFU,cAAc,CAEa;IAErC;;;;OAIG;IACH,0BAFU,cAAc,CAEe;IAEvC;;;;OAIG;IACH,yBAFU,cAAc,CAEc;IAEtC;;;;OAIG;IACH,wBAFU,cAAc,CAEa;IAarC;;;;;;;OAOG;IACH,QAFa,YAAY,CAgFxB;;CACJ;6BA9Z4B,mCAAmC;wBAJxC,kCAAkC;+BAC3B,sDAAsD"}