@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
|
@@ -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.
|
|
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 "__#
|
|
70
|
+
static "__#504@#refresh_masks"(fluid: FluidComponent): void;
|
|
70
71
|
/**
|
|
71
72
|
* @param {FluidComponent} fluid
|
|
72
73
|
*/
|
|
73
|
-
static "__#
|
|
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 "__#
|
|
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 "__#
|
|
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
|
|
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.
|
|
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
|
-
|
|
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.
|
|
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
|
|
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.
|
|
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
|
|
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
|
|
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,
|
|
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":"
|
|
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,
|
|
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
|
|
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 @@
|
|
|
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":"
|
|
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"}
|