@zephyr3d/scene 0.9.25 → 0.9.27
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/dist/animation/animationset.js +92 -30
- package/dist/animation/animationset.js.map +1 -1
- package/dist/animation/hair/gpu_hair_simulation.js +1090 -0
- package/dist/animation/hair/gpu_hair_simulation.js.map +1 -0
- package/dist/animation/joint_dynamics/controller.js +7 -5
- package/dist/animation/joint_dynamics/controller.js.map +1 -1
- package/dist/animation/joint_dynamics/convex_collider.js +320 -0
- package/dist/animation/joint_dynamics/convex_collider.js.map +1 -0
- package/dist/animation/joint_dynamics/joint_dynamics_system.js +81 -5
- package/dist/animation/joint_dynamics/joint_dynamics_system.js.map +1 -1
- package/dist/animation/morphtrack.js +3 -4
- package/dist/animation/morphtrack.js.map +1 -1
- package/dist/animation/skeleton.js +79 -25
- package/dist/animation/skeleton.js.map +1 -1
- package/dist/animation/spring/multi_chain_spring_system.js +577 -179
- package/dist/animation/spring/multi_chain_spring_system.js.map +1 -1
- package/dist/animation/spring/spring_collider.js +4 -3
- package/dist/animation/spring/spring_collider.js.map +1 -1
- package/dist/animation/spring/spring_node_pose_tracker.js +40 -0
- package/dist/animation/spring/spring_node_pose_tracker.js.map +1 -0
- package/dist/animation/spring/spring_particle.js +2 -0
- package/dist/animation/spring/spring_particle.js.map +1 -1
- package/dist/animation/spring/spring_system.js +11 -3
- package/dist/animation/spring/spring_system.js.map +1 -1
- package/dist/animation/spring_modifier.js +10 -0
- package/dist/animation/spring_modifier.js.map +1 -1
- package/dist/app/engine.js +53 -43
- package/dist/app/engine.js.map +1 -1
- package/dist/app/scriptingsystem.js +119 -6
- package/dist/app/scriptingsystem.js.map +1 -1
- package/dist/app/scriptregistry.js +3 -2
- package/dist/app/scriptregistry.js.map +1 -1
- package/dist/asset/assetmanager.js +284 -67
- package/dist/asset/assetmanager.js.map +1 -1
- package/dist/asset/loaders/zhair/zhair_format.js +288 -0
- package/dist/asset/loaders/zhair/zhair_format.js.map +1 -0
- package/dist/asset/loaders/zhair/zhair_loader.js +221 -0
- package/dist/asset/loaders/zhair/zhair_loader.js.map +1 -0
- package/dist/asset/model.js +184 -69
- package/dist/asset/model.js.map +1 -1
- package/dist/camera/camera.js +268 -44
- package/dist/camera/camera.js.map +1 -1
- package/dist/camera/perspectivecamera.js +3 -1
- package/dist/camera/perspectivecamera.js.map +1 -1
- package/dist/index.d.ts +9044 -5139
- package/dist/index.js +17 -6
- package/dist/index.js.map +1 -1
- package/dist/material/eye.js +932 -0
- package/dist/material/eye.js.map +1 -0
- package/dist/material/hair.js +917 -0
- package/dist/material/hair.js.map +1 -0
- package/dist/material/hairstrand.js +842 -0
- package/dist/material/hairstrand.js.map +1 -0
- package/dist/material/hairstrand_data.js +162 -0
- package/dist/material/hairstrand_data.js.map +1 -0
- package/dist/material/lambert.js +5 -2
- package/dist/material/lambert.js.map +1 -1
- package/dist/material/material.js +48 -10
- package/dist/material/material.js.map +1 -1
- package/dist/material/meshmaterial.js +120 -19
- package/dist/material/meshmaterial.js.map +1 -1
- package/dist/material/mixins/albedocolor.js +1 -1
- package/dist/material/mixins/albedocolor.js.map +1 -1
- package/dist/material/mixins/lightmodel/blinnphong.js +5 -3
- package/dist/material/mixins/lightmodel/blinnphong.js.map +1 -1
- package/dist/material/mixins/lightmodel/lambert.js +5 -4
- package/dist/material/mixins/lightmodel/lambert.js.map +1 -1
- package/dist/material/mixins/lightmodel/pbrblueprintmixin.js +3 -3
- package/dist/material/mixins/lightmodel/pbrblueprintmixin.js.map +1 -1
- package/dist/material/mixins/lightmodel/pbrmetallicroughness.js +5 -5
- package/dist/material/mixins/lightmodel/pbrmetallicroughness.js.map +1 -1
- package/dist/material/mixins/lightmodel/pbrspecularglossness.js +3 -3
- package/dist/material/mixins/lightmodel/pbrspecularglossness.js.map +1 -1
- package/dist/material/mixins/lit.js +106 -19
- package/dist/material/mixins/lit.js.map +1 -1
- package/dist/material/mixins/pbr/common.js +4 -4
- package/dist/material/mixins/pbr/common.js.map +1 -1
- package/dist/material/mixins/texture.js +48 -11
- package/dist/material/mixins/texture.js.map +1 -1
- package/dist/material/mtoon.js +6 -5
- package/dist/material/mtoon.js.map +1 -1
- package/dist/material/pbrblueprint.js +146 -28
- package/dist/material/pbrblueprint.js.map +1 -1
- package/dist/material/pbrblueprint_instance.js +501 -0
- package/dist/material/pbrblueprint_instance.js.map +1 -0
- package/dist/material/pbrmr.js +15 -16
- package/dist/material/pbrmr.js.map +1 -1
- package/dist/material/shader/helper.js +734 -23
- package/dist/material/shader/helper.js.map +1 -1
- package/dist/material/shader/terrain_blend.js +55 -0
- package/dist/material/shader/terrain_blend.js.map +1 -0
- package/dist/material/skin.js +192 -32
- package/dist/material/skin.js.map +1 -1
- package/dist/material/spriteblueprint.js +16 -1
- package/dist/material/spriteblueprint.js.map +1 -1
- package/dist/material/subsurfaceprofile.js +86 -23
- package/dist/material/subsurfaceprofile.js.map +1 -1
- package/dist/material/water.js +2059 -72
- package/dist/material/water.js.map +1 -1
- package/dist/posteffect/bloom.js +167 -7
- package/dist/posteffect/bloom.js.map +1 -1
- package/dist/posteffect/coloradjust.js +2 -1
- package/dist/posteffect/coloradjust.js.map +1 -1
- package/dist/posteffect/compositor.js.map +1 -1
- package/dist/posteffect/fxaa.js +2 -1
- package/dist/posteffect/fxaa.js.map +1 -1
- package/dist/posteffect/grayscale.js +3 -1
- package/dist/posteffect/grayscale.js.map +1 -1
- package/dist/posteffect/motionblur.js +664 -56
- package/dist/posteffect/motionblur.js.map +1 -1
- package/dist/posteffect/posteffect.js +12 -1
- package/dist/posteffect/posteffect.js.map +1 -1
- package/dist/posteffect/sao.js +46 -44
- package/dist/posteffect/sao.js.map +1 -1
- package/dist/posteffect/skinsss.js +368 -69
- package/dist/posteffect/skinsss.js.map +1 -1
- package/dist/posteffect/ssgi.js +16 -9
- package/dist/posteffect/ssgi.js.map +1 -1
- package/dist/posteffect/ssr.js +3 -0
- package/dist/posteffect/ssr.js.map +1 -1
- package/dist/posteffect/sss.js +121 -36
- package/dist/posteffect/sss.js.map +1 -1
- package/dist/posteffect/taa.js.map +1 -1
- package/dist/posteffect/tonemap.js +44 -1
- package/dist/posteffect/tonemap.js.map +1 -1
- package/dist/render/abuffer_oit.js +8 -2
- package/dist/render/abuffer_oit.js.map +1 -1
- package/dist/render/clipmap.js +156 -5
- package/dist/render/clipmap.js.map +1 -1
- package/dist/render/cull_visitor.js +20 -0
- package/dist/render/cull_visitor.js.map +1 -1
- package/dist/render/depthpass.js +36 -2
- package/dist/render/depthpass.js.map +1 -1
- package/dist/render/drawable_mixin.js +26 -1
- package/dist/render/drawable_mixin.js.map +1 -1
- package/dist/render/dualdepthpeeling_oit.js +3 -2
- package/dist/render/dualdepthpeeling_oit.js.map +1 -1
- package/dist/render/envlight.js +1 -1
- package/dist/render/envlight.js.map +1 -1
- package/dist/render/fbm_wavegenerator.js +6 -3
- package/dist/render/fbm_wavegenerator.js.map +1 -1
- package/dist/render/fft_wavegenerator.js +57 -15
- package/dist/render/fft_wavegenerator.js.map +1 -1
- package/dist/render/gerstner_wavegenerator.js +130 -20
- package/dist/render/gerstner_wavegenerator.js.map +1 -1
- package/dist/render/globalbindgroup_allocator.js +3 -0
- package/dist/render/globalbindgroup_allocator.js.map +1 -1
- package/dist/render/hzb.js +80 -22
- package/dist/render/hzb.js.map +1 -1
- package/dist/render/lightpass.js +6 -3
- package/dist/render/lightpass.js.map +1 -1
- package/dist/render/oit.js +29 -0
- package/dist/render/oit.js.map +1 -0
- package/dist/render/render_queue.js +39 -0
- package/dist/render/render_queue.js.map +1 -1
- package/dist/render/renderer.js +4 -0
- package/dist/render/renderer.js.map +1 -1
- package/dist/render/rendergraph/blackboard.js +1 -0
- package/dist/render/rendergraph/blackboard.js.map +1 -1
- package/dist/render/rendergraph/device_pool_allocator.js.map +1 -1
- package/dist/render/rendergraph/executor.js +2 -0
- package/dist/render/rendergraph/executor.js.map +1 -1
- package/dist/render/rendergraph/forward_plus_builder.js +379 -10
- package/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
- package/dist/render/rendergraph/frame_resource_requirements.js +1 -0
- package/dist/render/rendergraph/frame_resource_requirements.js.map +1 -1
- package/dist/render/rendergraph/history_resources.js +8 -1
- package/dist/render/rendergraph/history_resources.js.map +1 -1
- package/dist/render/rendergraph/rendergraph.js.map +1 -1
- package/dist/render/rendergraph/texture_affinity_cache.js +1 -1
- package/dist/render/rendergraph/texture_affinity_cache.js.map +1 -1
- package/dist/render/rendergraph/types.js.map +1 -1
- package/dist/render/shadow_mask_pass.js +73 -8
- package/dist/render/shadow_mask_pass.js.map +1 -1
- package/dist/render/sky.js +166 -126
- package/dist/render/sky.js.map +1 -1
- package/dist/render/underwater.js +624 -0
- package/dist/render/underwater.js.map +1 -0
- package/dist/render/water_caustics.js +1380 -0
- package/dist/render/water_caustics.js.map +1 -0
- package/dist/render/weightedblended_oit.js +3 -2
- package/dist/render/weightedblended_oit.js.map +1 -1
- package/dist/scene/basesprite.js +8 -0
- package/dist/scene/basesprite.js.map +1 -1
- package/dist/scene/batchgroup.js +3 -0
- package/dist/scene/batchgroup.js.map +1 -1
- package/dist/scene/environment.js +4 -1
- package/dist/scene/environment.js.map +1 -1
- package/dist/scene/hair.js +963 -0
- package/dist/scene/hair.js.map +1 -0
- package/dist/scene/light.js +5 -1
- package/dist/scene/light.js.map +1 -1
- package/dist/scene/mesh.js +481 -47
- package/dist/scene/mesh.js.map +1 -1
- package/dist/scene/meshdrawable.js +6 -0
- package/dist/scene/meshdrawable.js.map +1 -1
- package/dist/scene/msdftext.js +3 -0
- package/dist/scene/msdftext.js.map +1 -1
- package/dist/scene/msdftextsprite.js +3 -0
- package/dist/scene/msdftextsprite.js.map +1 -1
- package/dist/scene/particlesys.js +6 -0
- package/dist/scene/particlesys.js.map +1 -1
- package/dist/scene/scene.js +3 -0
- package/dist/scene/scene.js.map +1 -1
- package/dist/scene/scene_node.js +6 -1
- package/dist/scene/scene_node.js.map +1 -1
- package/dist/scene/terrain-cm/grass.js +3 -0
- package/dist/scene/terrain-cm/grass.js.map +1 -1
- package/dist/scene/terrain-cm/grassmaterial.js +3 -0
- package/dist/scene/terrain-cm/grassmaterial.js.map +1 -1
- package/dist/scene/terrain-cm/terrain-cm.js +6 -0
- package/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
- package/dist/scene/terrain-cm/texture_cache.js +309 -0
- package/dist/scene/terrain-cm/texture_cache.js.map +1 -0
- package/dist/scene/water.js +546 -4
- package/dist/scene/water.js.map +1 -1
- package/dist/shaders/atmosphere.js.map +1 -1
- package/dist/shaders/diffusion.js +54 -0
- package/dist/shaders/diffusion.js.map +1 -0
- package/dist/shaders/shadow.js +33 -21
- package/dist/shaders/shadow.js.map +1 -1
- package/dist/shaders/temporal.js +71 -33
- package/dist/shaders/temporal.js.map +1 -1
- package/dist/shaders/water.js +22 -19
- package/dist/shaders/water.js.map +1 -1
- package/dist/shaders/water_medium.js +56 -0
- package/dist/shaders/water_medium.js.map +1 -0
- package/dist/shadow/dom.js +546 -0
- package/dist/shadow/dom.js.map +1 -0
- package/dist/shadow/pcf_opt.js +3 -5
- package/dist/shadow/pcf_opt.js.map +1 -1
- package/dist/shadow/pcf_pd.js +1 -1
- package/dist/shadow/pcf_pd.js.map +1 -1
- package/dist/shadow/receiver_bias.js +41 -0
- package/dist/shadow/receiver_bias.js.map +1 -0
- package/dist/shadow/shader.js +20 -60
- package/dist/shadow/shader.js.map +1 -1
- package/dist/shadow/shadow_impl.js +89 -0
- package/dist/shadow/shadow_impl.js.map +1 -1
- package/dist/shadow/shadow_region.js +1 -1
- package/dist/shadow/shadow_region.js.map +1 -1
- package/dist/shadow/shadowmapper.js +150 -37
- package/dist/shadow/shadowmapper.js.map +1 -1
- package/dist/shapes/shape.js +11 -2
- package/dist/shapes/shape.js.map +1 -1
- package/dist/shapes/sphere.js +50 -9
- package/dist/shapes/sphere.js.map +1 -1
- package/dist/utility/blueprint/common/constants.js +112 -2
- package/dist/utility/blueprint/common/constants.js.map +1 -1
- package/dist/utility/blueprint/material/func.js +142 -49
- package/dist/utility/blueprint/material/func.js.map +1 -1
- package/dist/utility/blueprint/material/ir.js +490 -25
- package/dist/utility/blueprint/material/ir.js.map +1 -1
- package/dist/utility/blueprint/material/texture.js +898 -4
- package/dist/utility/blueprint/material/texture.js.map +1 -1
- package/dist/utility/serialization/manager.js +434 -101
- package/dist/utility/serialization/manager.js.map +1 -1
- package/dist/utility/serialization/scene/animation.js +401 -5
- package/dist/utility/serialization/scene/animation.js.map +1 -1
- package/dist/utility/serialization/scene/batch.js +4 -0
- package/dist/utility/serialization/scene/batch.js.map +1 -1
- package/dist/utility/serialization/scene/camera.js +186 -26
- package/dist/utility/serialization/scene/camera.js.map +1 -1
- package/dist/utility/serialization/scene/common.js +26 -5
- package/dist/utility/serialization/scene/common.js.map +1 -1
- package/dist/utility/serialization/scene/hair.js +1141 -0
- package/dist/utility/serialization/scene/hair.js.map +1 -0
- package/dist/utility/serialization/scene/light.js +84 -4
- package/dist/utility/serialization/scene/light.js.map +1 -1
- package/dist/utility/serialization/scene/material.js +1867 -166
- package/dist/utility/serialization/scene/material.js.map +1 -1
- package/dist/utility/serialization/scene/mesh.js +231 -14
- package/dist/utility/serialization/scene/mesh.js.map +1 -1
- package/dist/utility/serialization/scene/node.js +141 -7
- package/dist/utility/serialization/scene/node.js.map +1 -1
- package/dist/utility/serialization/scene/particle.js +4 -0
- package/dist/utility/serialization/scene/particle.js.map +1 -1
- package/dist/utility/serialization/scene/primitive.js +18 -0
- package/dist/utility/serialization/scene/primitive.js.map +1 -1
- package/dist/utility/serialization/scene/sprite.js +4 -0
- package/dist/utility/serialization/scene/sprite.js.map +1 -1
- package/dist/utility/serialization/scene/terrain.js +4 -0
- package/dist/utility/serialization/scene/terrain.js.map +1 -1
- package/dist/utility/serialization/scene/text.js +4 -0
- package/dist/utility/serialization/scene/text.js.map +1 -1
- package/dist/utility/serialization/scene/water.js +1105 -21
- package/dist/utility/serialization/scene/water.js.map +1 -1
- package/dist/utility/serialization/types.js.map +1 -1
- package/dist/utility/shprojector.js +9 -8
- package/dist/utility/shprojector.js.map +1 -1
- package/dist/values.js +49 -2
- package/dist/values.js.map +1 -1
- package/package.json +3 -3
- package/dist/render/rendergraph/frame_graph_context.js +0 -41
- package/dist/render/rendergraph/frame_graph_context.js.map +0 -1
- package/dist/shaders/ssgi.js +0 -63
- package/dist/shaders/ssgi.js.map +0 -1
- package/dist/shaders/ssgi_reprojection.js +0 -118
- package/dist/shaders/ssgi_reprojection.js.map +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Disposable } from '@zephyr3d/base';
|
|
1
|
+
import { Disposable, PRNG } from '@zephyr3d/base';
|
|
2
2
|
import { ShaderHelper } from '../material/shader/helper.js';
|
|
3
3
|
import '../material/lambert.js';
|
|
4
4
|
import '../material/blinn.js';
|
|
@@ -6,9 +6,12 @@ import '../material/unlit.js';
|
|
|
6
6
|
import '../material/particle.js';
|
|
7
7
|
import '../material/subsurfaceprofile.js';
|
|
8
8
|
import '../material/skin.js';
|
|
9
|
+
import '../material/eye.js';
|
|
9
10
|
import '@zephyr3d/device';
|
|
10
11
|
import { MAX_GERSTNER_WAVE_COUNT } from '../values.js';
|
|
11
12
|
import '../material/meshmaterial.js';
|
|
13
|
+
import '../material/hair.js';
|
|
14
|
+
import '../material/hairstrand.js';
|
|
12
15
|
import '../material/grassmaterial.js';
|
|
13
16
|
import '../material/terrain-cm.js';
|
|
14
17
|
import '../material/pbrmr.js';
|
|
@@ -26,26 +29,35 @@ import '../utility/blueprint/material/texture.js';
|
|
|
26
29
|
_version;
|
|
27
30
|
_waveParams;
|
|
28
31
|
_numWaves;
|
|
32
|
+
_rand;
|
|
33
|
+
_foamParams;
|
|
29
34
|
/**
|
|
30
35
|
* Creates a new Gerstner wave generator.
|
|
31
|
-
*/ constructor(){
|
|
36
|
+
*/ constructor(randomSeed = 0){
|
|
32
37
|
super();
|
|
33
38
|
this._waveParams = new Float32Array(8 * MAX_GERSTNER_WAVE_COUNT);
|
|
39
|
+
this._rand = new PRNG(randomSeed);
|
|
34
40
|
this.randomWave(0);
|
|
35
41
|
this.randomWave(1);
|
|
36
42
|
this.randomWave(2);
|
|
37
43
|
this.randomWave(3);
|
|
38
44
|
this._numWaves = 4;
|
|
39
45
|
this._version = 0;
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
46
|
+
// Same defaults as the FFT generator, so switching between the two does not
|
|
47
|
+
// change the foam response out of the box.
|
|
48
|
+
this._foamParams = new Float32Array([
|
|
49
|
+
1.2,
|
|
50
|
+
7.2
|
|
51
|
+
]);
|
|
52
|
+
}
|
|
53
|
+
/** @internal */ static randomWaveData(rand, array, offset) {
|
|
54
|
+
array[offset + 0] = rand.get() * Math.PI * 2;
|
|
55
|
+
array[offset + 1] = rand.get() * 0.5 + 0.5;
|
|
56
|
+
array[offset + 2] = rand.get() * 0.1;
|
|
57
|
+
array[offset + 3] = rand.get() * 10;
|
|
58
|
+
array[offset + 4] = rand.get() * 100 - 50;
|
|
47
59
|
array[offset + 5] = 0;
|
|
48
|
-
array[offset + 6] =
|
|
60
|
+
array[offset + 6] = rand.get() * 100 - 50;
|
|
49
61
|
array[offset + 7] = 0;
|
|
50
62
|
}
|
|
51
63
|
/** @internal */ setRaw(data, index) {
|
|
@@ -55,8 +67,12 @@ import '../utility/blueprint/material/texture.js';
|
|
|
55
67
|
const other = new GerstnerWaveGenerator();
|
|
56
68
|
other.numWaves = this.numWaves;
|
|
57
69
|
other._waveParams.set(this._waveParams);
|
|
70
|
+
other._foamParams.set(this._foamParams);
|
|
58
71
|
return other;
|
|
59
72
|
}
|
|
73
|
+
get rand() {
|
|
74
|
+
return this._rand;
|
|
75
|
+
}
|
|
60
76
|
get version() {
|
|
61
77
|
return this._version;
|
|
62
78
|
}
|
|
@@ -77,20 +93,37 @@ import '../utility/blueprint/material/texture.js';
|
|
|
77
93
|
}
|
|
78
94
|
}
|
|
79
95
|
/** Delete wave at index */ deleteWave(index) {
|
|
96
|
+
if (index < 0 || index >= this._numWaves) {
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
80
99
|
for(let i = index; i < this._numWaves - 1; i++){
|
|
81
100
|
for(let j = 0; j < 8; j++){
|
|
82
101
|
this._waveParams[i * 8 + j] = this._waveParams[(i + 1) * 8 + j];
|
|
83
102
|
}
|
|
84
103
|
}
|
|
85
104
|
this._numWaves--;
|
|
105
|
+
this._version++;
|
|
86
106
|
}
|
|
87
|
-
/**
|
|
88
|
-
|
|
107
|
+
/** Insert a wave slot at index, shifting the subsequent waves up */ insertWave(index) {
|
|
108
|
+
// Bounded by the parameter buffer; the shader reads this many slots.
|
|
109
|
+
if (this._numWaves >= MAX_GERSTNER_WAVE_COUNT) {
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
// Shift from the tail backwards so the gap opens at `index` without
|
|
113
|
+
// overwriting the slot that is about to move. Copying forward here would
|
|
114
|
+
// duplicate `waveParams[index]` into every later slot instead of moving
|
|
115
|
+
// them up. The new slot is filled with a random wave rather than left at
|
|
116
|
+
// zero: a zero wavelength makes `w = 2*PI / length` infinite and drives the
|
|
117
|
+
// vertex shader into NaN, which collapses the whole surface, so the slot
|
|
118
|
+
// has to be a valid wave even before the caller writes its parameters.
|
|
119
|
+
for(let i = this._numWaves - 1; i >= index; i--){
|
|
89
120
|
for(let j = 0; j < 8; j++){
|
|
90
121
|
this._waveParams[(i + 1) * 8 + j] = this._waveParams[i * 8 + j];
|
|
91
122
|
}
|
|
92
123
|
}
|
|
124
|
+
this.randomWave(index);
|
|
93
125
|
this._numWaves++;
|
|
126
|
+
this._version++;
|
|
94
127
|
}
|
|
95
128
|
/**
|
|
96
129
|
* Sets the angle of the wave direction in radians.
|
|
@@ -177,6 +210,24 @@ import '../utility/blueprint/material/texture.js';
|
|
|
177
210
|
this._version++;
|
|
178
211
|
}
|
|
179
212
|
}
|
|
213
|
+
/** Gets the foam width. */ get foamWidth() {
|
|
214
|
+
return this._foamParams[0];
|
|
215
|
+
}
|
|
216
|
+
set foamWidth(val) {
|
|
217
|
+
if (val !== this._foamParams[0]) {
|
|
218
|
+
this._foamParams[0] = val;
|
|
219
|
+
this._version++;
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
/** Gets the foam contrast. */ get foamContrast() {
|
|
223
|
+
return this._foamParams[1];
|
|
224
|
+
}
|
|
225
|
+
set foamContrast(val) {
|
|
226
|
+
if (val !== this._foamParams[1]) {
|
|
227
|
+
this._foamParams[1] = val;
|
|
228
|
+
this._version++;
|
|
229
|
+
}
|
|
230
|
+
}
|
|
180
231
|
/**
|
|
181
232
|
* Gets the X coordinate of the wave origin if it is an omni-directional wave.
|
|
182
233
|
* @param waveIndex - index of the wave to set.
|
|
@@ -204,7 +255,7 @@ import '../utility/blueprint/material/texture.js';
|
|
|
204
255
|
}
|
|
205
256
|
}
|
|
206
257
|
/** @internal */ randomWave(i) {
|
|
207
|
-
GerstnerWaveGenerator.randomWaveData(this._waveParams, i * 8);
|
|
258
|
+
GerstnerWaveGenerator.randomWaveData(this._rand, this._waveParams, i * 8);
|
|
208
259
|
}
|
|
209
260
|
/** {@inheritDoc WaveGenerator.update} */ update() {}
|
|
210
261
|
/** {@inheritDoc WaveGenerator.needUpdate} */ needUpdate() {
|
|
@@ -221,7 +272,7 @@ import '../utility/blueprint/material/texture.js';
|
|
|
221
272
|
outAABB.minPoint.setXYZ(minX, y, minZ);
|
|
222
273
|
outAABB.maxPoint.setXYZ(maxX, y + maxHeight, maxZ);
|
|
223
274
|
}
|
|
224
|
-
/** {@inheritDoc WaveGenerator.calcFragmentNormal} */ calcFragmentNormal(scope, xz) {
|
|
275
|
+
/** {@inheritDoc WaveGenerator.calcFragmentNormal} */ calcFragmentNormal(scope, xz, _vertexNormal) {
|
|
225
276
|
const pb = scope.$builder;
|
|
226
277
|
const that = this;
|
|
227
278
|
pb.func('calcFragmentNormal', [
|
|
@@ -235,21 +286,64 @@ import '../utility/blueprint/material/texture.js';
|
|
|
235
286
|
});
|
|
236
287
|
return scope.calcFragmentNormal(xz);
|
|
237
288
|
}
|
|
238
|
-
/** {@inheritDoc WaveGenerator.calcFragmentNormalAndFoam} */ calcFragmentNormalAndFoam(scope, xz) {
|
|
239
|
-
|
|
289
|
+
/** {@inheritDoc WaveGenerator.calcFragmentNormalAndFoam} */ calcFragmentNormalAndFoam(scope, xz, _vertexNormal) {
|
|
290
|
+
const pb = scope.$builder;
|
|
291
|
+
const that = this;
|
|
292
|
+
pb.func('calcNormalAndFoam', [
|
|
293
|
+
pb.vec2('xz')
|
|
294
|
+
], function() {
|
|
295
|
+
this.$l.inPos = pb.vec3(this.xz.x, 0, this.xz.y);
|
|
296
|
+
this.$l.outPos = pb.vec3();
|
|
297
|
+
this.$l.outNormal = pb.vec3(0);
|
|
298
|
+
// Horizontal-gradient terms accumulated over the waves. The displacement
|
|
299
|
+
// derivative terms come out of gerstnerWave; summed, they feed det(I + J),
|
|
300
|
+
// the fold signal the foam is derived from - the same Jacobian the FFT
|
|
301
|
+
// generator uses, so both generators key foam off the same physics.
|
|
302
|
+
this.$l.dxdx = pb.float(0);
|
|
303
|
+
this.$l.dzdz = pb.float(0);
|
|
304
|
+
this.$l.dxdz = pb.float(0);
|
|
305
|
+
this.$for(pb.float('i'), 0, pb.getDevice().type === 'webgl' ? MAX_GERSTNER_WAVE_COUNT : this.numWaves, function() {
|
|
306
|
+
if (pb.getDevice().type === 'webgl') {
|
|
307
|
+
this.$if(pb.greaterThanEqual(this.i, this.numWaves), function() {
|
|
308
|
+
this.$break();
|
|
309
|
+
});
|
|
310
|
+
}
|
|
311
|
+
this.$l.waveNormal = pb.vec3();
|
|
312
|
+
this.$l.waveDxdx = pb.float();
|
|
313
|
+
this.$l.waveDzdz = pb.float();
|
|
314
|
+
this.$l.waveDxdz = pb.float();
|
|
315
|
+
this.$l.wavePos = that.gerstnerWave(this, this.waveParams.at(pb.mul(this.i, 2)), this.waveParams.at(pb.add(pb.mul(this.i, 2), 1)), this.inPos, this.waveNormal, this.waveDxdx, this.waveDzdz, this.waveDxdz);
|
|
316
|
+
this.outPos = pb.add(this.outPos, this.wavePos);
|
|
317
|
+
this.outNormal = pb.add(this.outNormal, this.waveNormal);
|
|
318
|
+
this.dxdx = pb.add(this.dxdx, this.waveDxdx);
|
|
319
|
+
this.dzdz = pb.add(this.dzdz, this.waveDzdz);
|
|
320
|
+
this.dxdz = pb.add(this.dxdz, this.waveDxdz);
|
|
321
|
+
});
|
|
322
|
+
// Jacobian determinant of the horizontal displacement, det(I + J). When the
|
|
323
|
+
// surface folds over the determinant drops below the foamParams.x threshold
|
|
324
|
+
// and the coverage ramps in. Mirrors the FFT generator's foam.
|
|
325
|
+
this.$l.val = pb.sub(pb.mul(pb.add(1, this.dxdx), pb.add(1, this.dzdz)), pb.mul(this.dxdz, this.dxdz));
|
|
326
|
+
this.$l.foam = pb.abs(pb.pow(pb.neg(pb.min(0, pb.sub(this.val, this.foamParams.x))), this.foamParams.y));
|
|
327
|
+
this.$return(pb.vec4(this.outNormal, this.foam));
|
|
328
|
+
});
|
|
329
|
+
return scope.calcNormalAndFoam(xz);
|
|
240
330
|
}
|
|
241
331
|
/** {@inheritDoc WaveGenerator.setupUniforms} */ setupUniforms(scope, uniformGroup) {
|
|
242
332
|
const pb = scope.$builder;
|
|
243
333
|
scope.numWaves = pb.float().uniform(uniformGroup);
|
|
244
334
|
scope.waveParams = pb.vec4[MAX_GERSTNER_WAVE_COUNT * 2]().uniform(uniformGroup);
|
|
335
|
+
scope.foamParams = pb.vec2().uniform(uniformGroup);
|
|
245
336
|
}
|
|
246
|
-
/** @internal */ gerstnerWave(scope, waveParam, omniParam, inPos, outNormal) {
|
|
337
|
+
/** @internal */ gerstnerWave(scope, waveParam, omniParam, inPos, outNormal, outDxdx, outDzdz, outDxdz) {
|
|
247
338
|
const pb = scope.$builder;
|
|
248
339
|
pb.func('gerstnerWave', [
|
|
249
340
|
pb.vec4('waveParam'),
|
|
250
341
|
pb.vec4('omniParam'),
|
|
251
342
|
pb.vec3('inPos'),
|
|
252
|
-
pb.vec3('outNormal').out()
|
|
343
|
+
pb.vec3('outNormal').out(),
|
|
344
|
+
pb.float('outDxdx').out(),
|
|
345
|
+
pb.float('outDzdz').out(),
|
|
346
|
+
pb.float('outDxdz').out()
|
|
253
347
|
], function() {
|
|
254
348
|
this.$l.amplitude = pb.max(this.waveParam.z, 0.01);
|
|
255
349
|
this.$l.wavelength = this.waveParam.w;
|
|
@@ -273,9 +367,21 @@ import '../utility/blueprint/material/texture.js';
|
|
|
273
367
|
this.$l.wa = pb.mul(this.w, this.amplitude);
|
|
274
368
|
this.$l.n = pb.vec3(pb.neg(pb.mul(this.windDir.xy, this.wa, this.cosCalc)), pb.sub(1, pb.mul(this.qi, this.wa, this.sinCalc)));
|
|
275
369
|
this.outNormal = pb.div(this.n.xzy, this.numWaves);
|
|
370
|
+
// Horizontal-gradient of the displacement, per wave. `waveXZ =
|
|
371
|
+
// windDir.xy * qi * amp * cos`, and the derivative of `cos(calc)` w.r.t.
|
|
372
|
+
// xz is `-w * sin(calc)`, so the gradient is the outer product of
|
|
373
|
+
// `windDir.xy` with itself scaled by `-qi * wa * sin`. The sign matters:
|
|
374
|
+
// at a crest (sin positive, cal near PI/2) the surface is compressed
|
|
375
|
+
// horizontally, which is what pushes `det(I + J)` down and fires the
|
|
376
|
+
// fold signal. Summed over waves and run through det(I + J), this is the
|
|
377
|
+
// same Jacobian criterion the FFT generator uses.
|
|
378
|
+
this.$l.jac = pb.neg(pb.mul(this.qi, this.wa, this.sinCalc));
|
|
379
|
+
this.outDxdx = pb.mul(this.jac, this.windDir.x, this.windDir.x);
|
|
380
|
+
this.outDzdz = pb.mul(this.jac, this.windDir.y, this.windDir.y);
|
|
381
|
+
this.outDxdz = pb.mul(this.jac, this.windDir.x, this.windDir.y);
|
|
276
382
|
this.$return(pb.mul(this.wave, pb.clamp(pb.mul(this.amplitude, 10000), 0, 1)));
|
|
277
383
|
});
|
|
278
|
-
return scope.gerstnerWave(waveParam, omniParam, inPos, outNormal);
|
|
384
|
+
return scope.gerstnerWave(waveParam, omniParam, inPos, outNormal, outDxdx, outDzdz, outDxdz);
|
|
279
385
|
}
|
|
280
386
|
/** @internal */ calcNormalAndPos(scope, inPos, outPos, outNormal) {
|
|
281
387
|
const pb = scope.$builder;
|
|
@@ -294,7 +400,10 @@ import '../utility/blueprint/material/texture.js';
|
|
|
294
400
|
});
|
|
295
401
|
}
|
|
296
402
|
this.$l.waveNormal = pb.vec3();
|
|
297
|
-
this.$l.
|
|
403
|
+
this.$l.waveDxdx = pb.float();
|
|
404
|
+
this.$l.waveDzdz = pb.float();
|
|
405
|
+
this.$l.waveDxdz = pb.float();
|
|
406
|
+
this.$l.wavePos = that.gerstnerWave(this, this.waveParams.at(pb.mul(this.i, 2)), this.waveParams.at(pb.add(pb.mul(this.i, 2), 1)), this.inPos, this.waveNormal, this.waveDxdx, this.waveDzdz, this.waveDxdz);
|
|
298
407
|
this.outPos = pb.add(this.outPos, this.wavePos);
|
|
299
408
|
this.outNormal = pb.add(this.outNormal, this.waveNormal);
|
|
300
409
|
});
|
|
@@ -307,6 +416,7 @@ import '../utility/blueprint/material/texture.js';
|
|
|
307
416
|
/** {@inheritDoc WaveGenerator.applyWaterBindGroup} */ applyWaterBindGroup(bindGroup) {
|
|
308
417
|
bindGroup.setValue('numWaves', this._numWaves);
|
|
309
418
|
bindGroup.setValue('waveParams', this._waveParams);
|
|
419
|
+
bindGroup.setValue('foamParams', this._foamParams);
|
|
310
420
|
}
|
|
311
421
|
/** {@inheritDoc WaveGenerator.isOk} */ isOk() {
|
|
312
422
|
return true;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gerstner_wavegenerator.js","sources":["../../src/render/gerstner_wavegenerator.ts"],"sourcesContent":["import { Disposable, type AABB } from '@zephyr3d/base';\r\nimport type { WaveGenerator } from './wavegenerator';\r\nimport type { BindGroup, PBGlobalScope, PBInsideFunctionScope, PBShaderExp } from '@zephyr3d/device';\r\nimport { ShaderHelper } from '../material';\r\nimport { MAX_GERSTNER_WAVE_COUNT } from '../values';\r\n\r\n/**\r\n * Gerstner wave generator.\r\n * @public\r\n */\r\nexport class GerstnerWaveGenerator extends Disposable implements WaveGenerator {\r\n private _version: number;\r\n private _waveParams: Float32Array<ArrayBuffer>;\r\n private _numWaves: number;\r\n /**\r\n * Creates a new Gerstner wave generator.\r\n */\r\n constructor() {\r\n super();\r\n this._waveParams = new Float32Array(8 * MAX_GERSTNER_WAVE_COUNT);\r\n this.randomWave(0);\r\n this.randomWave(1);\r\n this.randomWave(2);\r\n this.randomWave(3);\r\n this._numWaves = 4;\r\n this._version = 0;\r\n }\r\n /** @internal */\r\n static randomWaveData(array: Float32Array, offset: number) {\r\n array[offset + 0] = Math.random() * Math.PI * 2;\r\n array[offset + 1] = Math.random() * 0.5 + 0.5;\r\n array[offset + 2] = Math.random() * 0.1;\r\n array[offset + 3] = Math.random() * 10;\r\n array[offset + 4] = Math.random() * 100 - 50;\r\n array[offset + 5] = 0;\r\n array[offset + 6] = Math.random() * 100 - 50;\r\n array[offset + 7] = 0;\r\n }\r\n /** @internal */\r\n setRaw(data: Float32Array, index: number) {\r\n this._waveParams.set(data, index * 8);\r\n }\r\n clone() {\r\n const other = new GerstnerWaveGenerator();\r\n other.numWaves = this.numWaves;\r\n other._waveParams.set(this._waveParams);\r\n return other as this;\r\n }\r\n get version() {\r\n return this._version;\r\n }\r\n /** Gets the number of waves. */\r\n get numWaves() {\r\n return this._numWaves;\r\n }\r\n set numWaves(val) {\r\n if (!Number.isInteger(val) || val <= 0 || val > MAX_GERSTNER_WAVE_COUNT) {\r\n console.error(`Invalid wave number: ${val}`);\r\n return;\r\n }\r\n if (val !== this._numWaves) {\r\n for (let i = this._numWaves; i < val; i++) {\r\n this.randomWave(i);\r\n }\r\n this._numWaves = val;\r\n this._version++;\r\n }\r\n }\r\n /** Delete wave at index */\r\n deleteWave(index: number) {\r\n for (let i = index; i < this._numWaves - 1; i++) {\r\n for (let j = 0; j < 8; j++) {\r\n this._waveParams[i * 8 + j] = this._waveParams[(i + 1) * 8 + j];\r\n }\r\n }\r\n this._numWaves--;\r\n }\r\n /** Delete wave at index */\r\n insertWave(index: number) {\r\n for (let i = index; i < this._numWaves - 1; i++) {\r\n for (let j = 0; j < 8; j++) {\r\n this._waveParams[(i + 1) * 8 + j] = this._waveParams[i * 8 + j];\r\n }\r\n }\r\n this._numWaves++;\r\n }\r\n /**\r\n * Sets the angle of the wave direction in radians.\r\n * @param waveIndex - index of the wave to set.\r\n * @param angle - angle of the wave direction in radians.\r\n */\r\n setWaveDirection(waveIndex: number, angle: number) {\r\n if (waveIndex < MAX_GERSTNER_WAVE_COUNT) {\r\n this._waveParams[waveIndex * 8 + 0] = angle;\r\n this._version++;\r\n }\r\n }\r\n /**\r\n * Gets the angle of the wave direction in radians.\r\n * @param waveIndex - index of the wave to get.\r\n * @returns Angle of the wave direction in radians.\r\n */\r\n getWaveDirection(waveIndex: number) {\r\n return waveIndex < MAX_GERSTNER_WAVE_COUNT ? this._waveParams[waveIndex * 8 + 0] : 0;\r\n }\r\n /**\r\n * Sets the steepness of the wave.\r\n * @param waveIndex - index of the wave to set.\r\n * @param steepness - Steepness of the wave.\r\n */\r\n setWaveSteepness(waveIndex: number, steepness: number) {\r\n if (waveIndex < MAX_GERSTNER_WAVE_COUNT) {\r\n this._waveParams[waveIndex * 8 + 1] = steepness;\r\n this._version++;\r\n }\r\n }\r\n /**\r\n * Gets the steepness of the wave.\r\n * @param waveIndex - index of the wave to set.\r\n * @returns Steepness of the wave.\r\n */\r\n getWaveSteepness(waveIndex: number) {\r\n return waveIndex < MAX_GERSTNER_WAVE_COUNT ? this._waveParams[waveIndex * 8 + 1] : 0;\r\n }\r\n /**\r\n * Sets the amplitude of the wave.\r\n * @param waveIndex - index of the wave to set.\r\n * @param val - Amplitude of the wave.\r\n */\r\n setWaveAmplitude(waveIndex: number, val: number) {\r\n if (waveIndex < MAX_GERSTNER_WAVE_COUNT) {\r\n this._waveParams[waveIndex * 8 + 2] = val;\r\n this._version++;\r\n }\r\n }\r\n /**\r\n * Gets the amplitude of the wave.\r\n * @param waveIndex - index of the wave to set.\r\n * @returns Amplitude of the wave.\r\n */\r\n getWaveAmplitude(waveIndex: number) {\r\n return waveIndex < MAX_GERSTNER_WAVE_COUNT ? this._waveParams[waveIndex * 8 + 2] : 0;\r\n }\r\n /**\r\n * Sets the length of the wave.\r\n * @param waveIndex - index of the wave to set.\r\n * @param val - Length of the wave.\r\n */\r\n setWaveLength(waveIndex: number, val: number) {\r\n if (waveIndex < MAX_GERSTNER_WAVE_COUNT) {\r\n this._waveParams[waveIndex * 8 + 3] = val;\r\n this._version++;\r\n }\r\n }\r\n /**\r\n * Gets the length of the wave.\r\n * @param waveIndex - index of the wave to set.\r\n * @returns Length of the wave.\r\n */\r\n getWaveLength(waveIndex: number) {\r\n return waveIndex < MAX_GERSTNER_WAVE_COUNT ? this._waveParams[waveIndex * 8 + 3] : 0;\r\n }\r\n /**\r\n * Query if the wave is an omni-directional wave.\r\n * @param waveIndex - index of the wave to set.\r\n * @returns true if the wave is an omni-directional wave, false otherwise.\r\n */\r\n isOmniWave(waveIndex: number) {\r\n return waveIndex < MAX_GERSTNER_WAVE_COUNT ? this._waveParams[waveIndex * 8 + 7] !== 0 : false;\r\n }\r\n /**\r\n * Sets whether the wave is an omni-directional wave.\r\n * @param waveIndex - index of the wave to set.\r\n * @param isOmni - true if the wave is an omni-directional wave, false otherwise.\r\n */\r\n setOmniWave(waveIndex: number, isOmni: boolean) {\r\n if (waveIndex < MAX_GERSTNER_WAVE_COUNT) {\r\n this._waveParams[waveIndex * 8 + 7] = isOmni ? 1 : 0;\r\n this._version++;\r\n }\r\n }\r\n /**\r\n * Gets the X coordinate of the wave origin if it is an omni-directional wave.\r\n * @param waveIndex - index of the wave to set.\r\n * @returns X coordinate of the wave origin if it is an omni-directional wave, 0 otherwise.\r\n */\r\n getOriginX(waveIndex: number) {\r\n return waveIndex < MAX_GERSTNER_WAVE_COUNT ? this._waveParams[waveIndex * 8 + 4] : 0;\r\n }\r\n /**\r\n * Gets the Z coordinate of the wave origin if it is an omni-directional wave.\r\n * @param waveIndex - index of the wave to set.\r\n * @returns Z coordinate of the wave origin if it is an omni-directional wave, 0 otherwise.\r\n */\r\n getOriginZ(waveIndex: number) {\r\n return waveIndex < MAX_GERSTNER_WAVE_COUNT ? this._waveParams[waveIndex * 8 + 6] : 0;\r\n }\r\n /**\r\n * Sets the X and Z coordinates of the wave origin if it is an omni-directional wave.\r\n * @param waveIndex - index of the wave to set.\r\n * @param x - X coordinate of the wave origin\r\n * @param z - Z coordinate of the wave origin\r\n */\r\n setOrigin(waveIndex: number, x: number, z: number) {\r\n if (waveIndex < MAX_GERSTNER_WAVE_COUNT) {\r\n this._waveParams[waveIndex * 8 + 4] = x;\r\n this._waveParams[waveIndex * 8 + 6] = z;\r\n this._version++;\r\n }\r\n }\r\n /** @internal */\r\n randomWave(i: number) {\r\n GerstnerWaveGenerator.randomWaveData(this._waveParams, i * 8);\r\n }\r\n /** {@inheritDoc WaveGenerator.update} */\r\n update() {}\r\n /** {@inheritDoc WaveGenerator.needUpdate} */\r\n needUpdate() {\r\n return false;\r\n }\r\n /** {@inheritDoc WaveGenerator.calcClipmapTileAABB} */\r\n calcClipmapTileAABB(minX: number, maxX: number, minZ: number, maxZ: number, y: number, outAABB: AABB) {\r\n let maxHeight = 0;\r\n for (let i = 0; i < this._numWaves; i++) {\r\n const h = this._waveParams[i * 8 + 2];\r\n if (h > maxHeight) {\r\n maxHeight = h;\r\n }\r\n }\r\n outAABB.minPoint.setXYZ(minX, y, minZ);\r\n outAABB.maxPoint.setXYZ(maxX, y + maxHeight, maxZ);\r\n }\r\n /** {@inheritDoc WaveGenerator.calcFragmentNormal} */\r\n calcFragmentNormal(scope: PBInsideFunctionScope, xz: PBShaderExp) {\r\n const pb = scope.$builder;\r\n const that = this;\r\n pb.func('calcFragmentNormal', [pb.vec2('xz')], function () {\r\n this.$l.inPos = pb.vec3(this.xz.x, 0, this.xz.y);\r\n this.$l.outPos = pb.vec3();\r\n this.$l.outNormal = pb.vec3();\r\n that.calcNormalAndPos(this, this.inPos, this.outPos, this.outNormal);\r\n this.$return(this.outNormal);\r\n });\r\n return scope.calcFragmentNormal(xz) as PBShaderExp;\r\n }\r\n /** {@inheritDoc WaveGenerator.calcFragmentNormalAndFoam} */\r\n calcFragmentNormalAndFoam(scope: PBInsideFunctionScope, xz: PBShaderExp) {\r\n return scope.$builder.vec4(this.calcFragmentNormal(scope, xz), 0);\r\n }\r\n /** {@inheritDoc WaveGenerator.setupUniforms} */\r\n setupUniforms(scope: PBGlobalScope, uniformGroup: number) {\r\n const pb = scope.$builder;\r\n scope.numWaves = pb.float().uniform(uniformGroup);\r\n scope.waveParams = pb.vec4[MAX_GERSTNER_WAVE_COUNT * 2]().uniform(uniformGroup);\r\n }\r\n /** @internal */\r\n private gerstnerWave(\r\n scope: PBInsideFunctionScope,\r\n waveParam: PBShaderExp,\r\n omniParam: PBShaderExp,\r\n inPos: PBShaderExp,\r\n outNormal: PBShaderExp\r\n ) {\r\n const pb = scope.$builder;\r\n pb.func(\r\n 'gerstnerWave',\r\n [pb.vec4('waveParam'), pb.vec4('omniParam'), pb.vec3('inPos'), pb.vec3('outNormal').out()],\r\n function () {\r\n this.$l.amplitude = pb.max(this.waveParam.z, 0.01);\r\n this.$l.wavelength = this.waveParam.w;\r\n this.$l.omniPos = this.omniParam.xz;\r\n this.$l.omni = this.omniParam.w;\r\n this.$l.direction = pb.vec2(pb.sin(this.waveParam.x), pb.cos(this.waveParam.x));\r\n this.$l.w = pb.max(0.001, pb.div(Math.PI * 2, this.wavelength));\r\n this.$l.wSpeed = pb.sqrt(pb.mul(9.8, this.w));\r\n this.$l.peak = this.waveParam.y;\r\n this.$l.qi = pb.div(this.peak, pb.mul(this.amplitude, this.w, this.numWaves));\r\n this.$l.dirWaveInput = pb.mul(this.direction, pb.sub(1, this.omni));\r\n this.$l.omniWaveInput = pb.mul(pb.sub(this.inPos.xz, this.omniPos), this.omni);\r\n this.$l.windDir = pb.normalize(pb.add(this.dirWaveInput, this.omniWaveInput));\r\n this.$l.dir = pb.dot(this.windDir, pb.sub(this.inPos.xz, pb.mul(this.omniPos, this.omni)));\r\n this.$l.calc = pb.sub(\r\n pb.mul(this.dir, this.w),\r\n pb.mul(this.wSpeed, ShaderHelper.getElapsedTime(this))\r\n );\r\n this.$l.cosCalc = pb.cos(this.calc);\r\n this.$l.sinCalc = pb.sin(this.calc);\r\n this.$l.waveXZ = pb.mul(this.windDir.xy, this.qi, this.amplitude, this.cosCalc);\r\n this.$l.waveY = pb.div(pb.mul(this.sinCalc, this.amplitude), this.numWaves);\r\n this.$l.wave = pb.vec3(this.waveXZ.x, this.waveY, this.waveXZ.y);\r\n this.$l.wa = pb.mul(this.w, this.amplitude);\r\n this.$l.n = pb.vec3(\r\n pb.neg(pb.mul(this.windDir.xy, this.wa, this.cosCalc)),\r\n pb.sub(1, pb.mul(this.qi, this.wa, this.sinCalc))\r\n );\r\n this.outNormal = pb.div(this.n.xzy, this.numWaves);\r\n this.$return(pb.mul(this.wave, pb.clamp(pb.mul(this.amplitude, 10000), 0, 1)));\r\n }\r\n );\r\n return scope.gerstnerWave(waveParam, omniParam, inPos, outNormal) as PBShaderExp;\r\n }\r\n /** @internal */\r\n private calcNormalAndPos(\r\n scope: PBInsideFunctionScope,\r\n inPos: PBShaderExp,\r\n outPos: PBShaderExp,\r\n outNormal: PBShaderExp\r\n ) {\r\n const pb = scope.$builder;\r\n const that = this;\r\n pb.func(\r\n 'calcPositionAndNormal',\r\n [pb.vec3('inPos'), pb.vec3('outPos').out(), pb.vec3('outNormal').out()],\r\n function () {\r\n this.outPos = this.inPos;\r\n this.outNormal = pb.vec3(0);\r\n this.$for(\r\n pb.float('i'),\r\n 0,\r\n pb.getDevice().type === 'webgl' ? MAX_GERSTNER_WAVE_COUNT : this.numWaves,\r\n function () {\r\n if (pb.getDevice().type === 'webgl') {\r\n this.$if(pb.greaterThanEqual(this.i, this.numWaves), function () {\r\n this.$break();\r\n });\r\n }\r\n this.$l.waveNormal = pb.vec3();\r\n this.$l.wavePos = that.gerstnerWave(\r\n this,\r\n this.waveParams.at(pb.mul(this.i, 2)),\r\n this.waveParams.at(pb.add(pb.mul(this.i, 2), 1)),\r\n this.inPos,\r\n this.waveNormal\r\n );\r\n this.outPos = pb.add(this.outPos, this.wavePos);\r\n this.outNormal = pb.add(this.outNormal, this.waveNormal);\r\n }\r\n );\r\n }\r\n );\r\n scope.calcPositionAndNormal(inPos, outPos, outNormal);\r\n }\r\n /** {@inheritDoc WaveGenerator.calcVertexPositionAndNormal} */\r\n calcVertexPositionAndNormal(\r\n scope: PBInsideFunctionScope,\r\n inPos: PBShaderExp,\r\n outPos: PBShaderExp,\r\n outNormal: PBShaderExp\r\n ) {\r\n this.calcNormalAndPos(scope, inPos, outPos, outNormal);\r\n }\r\n /** {@inheritDoc WaveGenerator.applyWaterBindGroup} */\r\n applyWaterBindGroup(bindGroup: BindGroup) {\r\n bindGroup.setValue('numWaves', this._numWaves);\r\n bindGroup.setValue('waveParams', this._waveParams);\r\n }\r\n /** {@inheritDoc WaveGenerator.isOk} */\r\n isOk() {\r\n return true;\r\n }\r\n /** {@inheritDoc WaveGenerator.getHash} */\r\n getHash() {\r\n return 'GerstnerWaveGenerator';\r\n }\r\n}\r\n"],"names":["GerstnerWaveGenerator","Disposable","_version","_waveParams","_numWaves","Float32Array","MAX_GERSTNER_WAVE_COUNT","randomWave","randomWaveData","array","offset","Math","random","PI","setRaw","data","index","set","clone","other","numWaves","version","val","Number","isInteger","console","error","i","deleteWave","j","insertWave","setWaveDirection","waveIndex","angle","getWaveDirection","setWaveSteepness","steepness","getWaveSteepness","setWaveAmplitude","getWaveAmplitude","setWaveLength","getWaveLength","isOmniWave","setOmniWave","isOmni","getOriginX","getOriginZ","setOrigin","x","z","update","needUpdate","calcClipmapTileAABB","minX","maxX","minZ","maxZ","y","outAABB","maxHeight","h","minPoint","setXYZ","maxPoint","calcFragmentNormal","scope","xz","pb","$builder","that","func","vec2","$l","inPos","vec3","outPos","outNormal","calcNormalAndPos","$return","calcFragmentNormalAndFoam","vec4","setupUniforms","uniformGroup","float","uniform","waveParams","gerstnerWave","waveParam","omniParam","out","amplitude","max","wavelength","w","omniPos","omni","direction","sin","cos","div","wSpeed","sqrt","mul","peak","qi","dirWaveInput","sub","omniWaveInput","windDir","normalize","add","dir","dot","calc","ShaderHelper","getElapsedTime","cosCalc","sinCalc","waveXZ","xy","waveY","wave","wa","n","neg","xzy","clamp","$for","getDevice","type","$if","greaterThanEqual","$break","waveNormal","wavePos","at","calcPositionAndNormal","calcVertexPositionAndNormal","applyWaterBindGroup","bindGroup","setValue","isOk","getHash"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"gerstner_wavegenerator.js","sources":["../../src/render/gerstner_wavegenerator.ts"],"sourcesContent":["import { Disposable, PRNG, type AABB } from '@zephyr3d/base';\r\nimport type { WaveGenerator } from './wavegenerator';\r\nimport type { BindGroup, PBGlobalScope, PBInsideFunctionScope, PBShaderExp } from '@zephyr3d/device';\r\nimport { ShaderHelper } from '../material';\r\nimport { MAX_GERSTNER_WAVE_COUNT } from '../values';\r\n\r\n/**\r\n * Gerstner wave generator.\r\n * @public\r\n */\r\nexport class GerstnerWaveGenerator extends Disposable implements WaveGenerator {\r\n private _version: number;\r\n private _waveParams: Float32Array<ArrayBuffer>;\r\n private _numWaves: number;\r\n private _rand: PRNG;\r\n private readonly _foamParams: Float32Array<ArrayBuffer>;\r\n /**\r\n * Creates a new Gerstner wave generator.\r\n */\r\n constructor(randomSeed = 0) {\r\n super();\r\n this._waveParams = new Float32Array(8 * MAX_GERSTNER_WAVE_COUNT);\r\n this._rand = new PRNG(randomSeed);\r\n this.randomWave(0);\r\n this.randomWave(1);\r\n this.randomWave(2);\r\n this.randomWave(3);\r\n this._numWaves = 4;\r\n this._version = 0;\r\n // Same defaults as the FFT generator, so switching between the two does not\r\n // change the foam response out of the box.\r\n this._foamParams = new Float32Array([1.2, 7.2]);\r\n }\r\n /** @internal */\r\n static randomWaveData(rand: PRNG, array: Float32Array, offset: number) {\r\n array[offset + 0] = rand.get() * Math.PI * 2;\r\n array[offset + 1] = rand.get() * 0.5 + 0.5;\r\n array[offset + 2] = rand.get() * 0.1;\r\n array[offset + 3] = rand.get() * 10;\r\n array[offset + 4] = rand.get() * 100 - 50;\r\n array[offset + 5] = 0;\r\n array[offset + 6] = rand.get() * 100 - 50;\r\n array[offset + 7] = 0;\r\n }\r\n /** @internal */\r\n setRaw(data: Float32Array, index: number) {\r\n this._waveParams.set(data, index * 8);\r\n }\r\n clone() {\r\n const other = new GerstnerWaveGenerator();\r\n other.numWaves = this.numWaves;\r\n other._waveParams.set(this._waveParams);\r\n other._foamParams.set(this._foamParams);\r\n return other as this;\r\n }\r\n get rand() {\r\n return this._rand;\r\n }\r\n get version() {\r\n return this._version;\r\n }\r\n /** Gets the number of waves. */\r\n get numWaves() {\r\n return this._numWaves;\r\n }\r\n set numWaves(val) {\r\n if (!Number.isInteger(val) || val <= 0 || val > MAX_GERSTNER_WAVE_COUNT) {\r\n console.error(`Invalid wave number: ${val}`);\r\n return;\r\n }\r\n if (val !== this._numWaves) {\r\n for (let i = this._numWaves; i < val; i++) {\r\n this.randomWave(i);\r\n }\r\n this._numWaves = val;\r\n this._version++;\r\n }\r\n }\r\n /** Delete wave at index */\r\n deleteWave(index: number) {\r\n if (index < 0 || index >= this._numWaves) {\r\n return;\r\n }\r\n for (let i = index; i < this._numWaves - 1; i++) {\r\n for (let j = 0; j < 8; j++) {\r\n this._waveParams[i * 8 + j] = this._waveParams[(i + 1) * 8 + j];\r\n }\r\n }\r\n this._numWaves--;\r\n this._version++;\r\n }\r\n /** Insert a wave slot at index, shifting the subsequent waves up */\r\n insertWave(index: number) {\r\n // Bounded by the parameter buffer; the shader reads this many slots.\r\n if (this._numWaves >= MAX_GERSTNER_WAVE_COUNT) {\r\n return;\r\n }\r\n // Shift from the tail backwards so the gap opens at `index` without\r\n // overwriting the slot that is about to move. Copying forward here would\r\n // duplicate `waveParams[index]` into every later slot instead of moving\r\n // them up. The new slot is filled with a random wave rather than left at\r\n // zero: a zero wavelength makes `w = 2*PI / length` infinite and drives the\r\n // vertex shader into NaN, which collapses the whole surface, so the slot\r\n // has to be a valid wave even before the caller writes its parameters.\r\n for (let i = this._numWaves - 1; i >= index; i--) {\r\n for (let j = 0; j < 8; j++) {\r\n this._waveParams[(i + 1) * 8 + j] = this._waveParams[i * 8 + j];\r\n }\r\n }\r\n this.randomWave(index);\r\n this._numWaves++;\r\n this._version++;\r\n }\r\n /**\r\n * Sets the angle of the wave direction in radians.\r\n * @param waveIndex - index of the wave to set.\r\n * @param angle - angle of the wave direction in radians.\r\n */\r\n setWaveDirection(waveIndex: number, angle: number) {\r\n if (waveIndex < MAX_GERSTNER_WAVE_COUNT) {\r\n this._waveParams[waveIndex * 8 + 0] = angle;\r\n this._version++;\r\n }\r\n }\r\n /**\r\n * Gets the angle of the wave direction in radians.\r\n * @param waveIndex - index of the wave to get.\r\n * @returns Angle of the wave direction in radians.\r\n */\r\n getWaveDirection(waveIndex: number) {\r\n return waveIndex < MAX_GERSTNER_WAVE_COUNT ? this._waveParams[waveIndex * 8 + 0] : 0;\r\n }\r\n /**\r\n * Sets the steepness of the wave.\r\n * @param waveIndex - index of the wave to set.\r\n * @param steepness - Steepness of the wave.\r\n */\r\n setWaveSteepness(waveIndex: number, steepness: number) {\r\n if (waveIndex < MAX_GERSTNER_WAVE_COUNT) {\r\n this._waveParams[waveIndex * 8 + 1] = steepness;\r\n this._version++;\r\n }\r\n }\r\n /**\r\n * Gets the steepness of the wave.\r\n * @param waveIndex - index of the wave to set.\r\n * @returns Steepness of the wave.\r\n */\r\n getWaveSteepness(waveIndex: number) {\r\n return waveIndex < MAX_GERSTNER_WAVE_COUNT ? this._waveParams[waveIndex * 8 + 1] : 0;\r\n }\r\n /**\r\n * Sets the amplitude of the wave.\r\n * @param waveIndex - index of the wave to set.\r\n * @param val - Amplitude of the wave.\r\n */\r\n setWaveAmplitude(waveIndex: number, val: number) {\r\n if (waveIndex < MAX_GERSTNER_WAVE_COUNT) {\r\n this._waveParams[waveIndex * 8 + 2] = val;\r\n this._version++;\r\n }\r\n }\r\n /**\r\n * Gets the amplitude of the wave.\r\n * @param waveIndex - index of the wave to set.\r\n * @returns Amplitude of the wave.\r\n */\r\n getWaveAmplitude(waveIndex: number) {\r\n return waveIndex < MAX_GERSTNER_WAVE_COUNT ? this._waveParams[waveIndex * 8 + 2] : 0;\r\n }\r\n /**\r\n * Sets the length of the wave.\r\n * @param waveIndex - index of the wave to set.\r\n * @param val - Length of the wave.\r\n */\r\n setWaveLength(waveIndex: number, val: number) {\r\n if (waveIndex < MAX_GERSTNER_WAVE_COUNT) {\r\n this._waveParams[waveIndex * 8 + 3] = val;\r\n this._version++;\r\n }\r\n }\r\n /**\r\n * Gets the length of the wave.\r\n * @param waveIndex - index of the wave to set.\r\n * @returns Length of the wave.\r\n */\r\n getWaveLength(waveIndex: number) {\r\n return waveIndex < MAX_GERSTNER_WAVE_COUNT ? this._waveParams[waveIndex * 8 + 3] : 0;\r\n }\r\n /**\r\n * Query if the wave is an omni-directional wave.\r\n * @param waveIndex - index of the wave to set.\r\n * @returns true if the wave is an omni-directional wave, false otherwise.\r\n */\r\n isOmniWave(waveIndex: number) {\r\n return waveIndex < MAX_GERSTNER_WAVE_COUNT ? this._waveParams[waveIndex * 8 + 7] !== 0 : false;\r\n }\r\n /**\r\n * Sets whether the wave is an omni-directional wave.\r\n * @param waveIndex - index of the wave to set.\r\n * @param isOmni - true if the wave is an omni-directional wave, false otherwise.\r\n */\r\n setOmniWave(waveIndex: number, isOmni: boolean) {\r\n if (waveIndex < MAX_GERSTNER_WAVE_COUNT) {\r\n this._waveParams[waveIndex * 8 + 7] = isOmni ? 1 : 0;\r\n this._version++;\r\n }\r\n }\r\n /** Gets the foam width. */\r\n get foamWidth() {\r\n return this._foamParams[0];\r\n }\r\n set foamWidth(val) {\r\n if (val !== this._foamParams[0]) {\r\n this._foamParams[0] = val;\r\n this._version++;\r\n }\r\n }\r\n /** Gets the foam contrast. */\r\n get foamContrast() {\r\n return this._foamParams[1];\r\n }\r\n set foamContrast(val) {\r\n if (val !== this._foamParams[1]) {\r\n this._foamParams[1] = val;\r\n this._version++;\r\n }\r\n }\r\n /**\r\n * Gets the X coordinate of the wave origin if it is an omni-directional wave.\r\n * @param waveIndex - index of the wave to set.\r\n * @returns X coordinate of the wave origin if it is an omni-directional wave, 0 otherwise.\r\n */\r\n getOriginX(waveIndex: number) {\r\n return waveIndex < MAX_GERSTNER_WAVE_COUNT ? this._waveParams[waveIndex * 8 + 4] : 0;\r\n }\r\n /**\r\n * Gets the Z coordinate of the wave origin if it is an omni-directional wave.\r\n * @param waveIndex - index of the wave to set.\r\n * @returns Z coordinate of the wave origin if it is an omni-directional wave, 0 otherwise.\r\n */\r\n getOriginZ(waveIndex: number) {\r\n return waveIndex < MAX_GERSTNER_WAVE_COUNT ? this._waveParams[waveIndex * 8 + 6] : 0;\r\n }\r\n /**\r\n * Sets the X and Z coordinates of the wave origin if it is an omni-directional wave.\r\n * @param waveIndex - index of the wave to set.\r\n * @param x - X coordinate of the wave origin\r\n * @param z - Z coordinate of the wave origin\r\n */\r\n setOrigin(waveIndex: number, x: number, z: number) {\r\n if (waveIndex < MAX_GERSTNER_WAVE_COUNT) {\r\n this._waveParams[waveIndex * 8 + 4] = x;\r\n this._waveParams[waveIndex * 8 + 6] = z;\r\n this._version++;\r\n }\r\n }\r\n /** @internal */\r\n randomWave(i: number) {\r\n GerstnerWaveGenerator.randomWaveData(this._rand, this._waveParams, i * 8);\r\n }\r\n /** {@inheritDoc WaveGenerator.update} */\r\n update() {}\r\n /** {@inheritDoc WaveGenerator.needUpdate} */\r\n needUpdate() {\r\n return false;\r\n }\r\n /** {@inheritDoc WaveGenerator.calcClipmapTileAABB} */\r\n calcClipmapTileAABB(minX: number, maxX: number, minZ: number, maxZ: number, y: number, outAABB: AABB) {\r\n let maxHeight = 0;\r\n for (let i = 0; i < this._numWaves; i++) {\r\n const h = this._waveParams[i * 8 + 2];\r\n if (h > maxHeight) {\r\n maxHeight = h;\r\n }\r\n }\r\n outAABB.minPoint.setXYZ(minX, y, minZ);\r\n outAABB.maxPoint.setXYZ(maxX, y + maxHeight, maxZ);\r\n }\r\n /** {@inheritDoc WaveGenerator.calcFragmentNormal} */\r\n calcFragmentNormal(scope: PBInsideFunctionScope, xz: PBShaderExp, _vertexNormal: PBShaderExp) {\r\n const pb = scope.$builder;\r\n const that = this;\r\n pb.func('calcFragmentNormal', [pb.vec2('xz')], function () {\r\n this.$l.inPos = pb.vec3(this.xz.x, 0, this.xz.y);\r\n this.$l.outPos = pb.vec3();\r\n this.$l.outNormal = pb.vec3();\r\n that.calcNormalAndPos(this, this.inPos, this.outPos, this.outNormal);\r\n this.$return(this.outNormal);\r\n });\r\n return scope.calcFragmentNormal(xz) as PBShaderExp;\r\n }\r\n /** {@inheritDoc WaveGenerator.calcFragmentNormalAndFoam} */\r\n calcFragmentNormalAndFoam(scope: PBInsideFunctionScope, xz: PBShaderExp, _vertexNormal: PBShaderExp) {\r\n const pb = scope.$builder;\r\n const that = this;\r\n pb.func('calcNormalAndFoam', [pb.vec2('xz')], function () {\r\n this.$l.inPos = pb.vec3(this.xz.x, 0, this.xz.y);\r\n this.$l.outPos = pb.vec3();\r\n this.$l.outNormal = pb.vec3(0);\r\n // Horizontal-gradient terms accumulated over the waves. The displacement\r\n // derivative terms come out of gerstnerWave; summed, they feed det(I + J),\r\n // the fold signal the foam is derived from - the same Jacobian the FFT\r\n // generator uses, so both generators key foam off the same physics.\r\n this.$l.dxdx = pb.float(0);\r\n this.$l.dzdz = pb.float(0);\r\n this.$l.dxdz = pb.float(0);\r\n this.$for(\r\n pb.float('i'),\r\n 0,\r\n pb.getDevice().type === 'webgl' ? MAX_GERSTNER_WAVE_COUNT : this.numWaves,\r\n function () {\r\n if (pb.getDevice().type === 'webgl') {\r\n this.$if(pb.greaterThanEqual(this.i, this.numWaves), function () {\r\n this.$break();\r\n });\r\n }\r\n this.$l.waveNormal = pb.vec3();\r\n this.$l.waveDxdx = pb.float();\r\n this.$l.waveDzdz = pb.float();\r\n this.$l.waveDxdz = pb.float();\r\n this.$l.wavePos = that.gerstnerWave(\r\n this,\r\n this.waveParams.at(pb.mul(this.i, 2)),\r\n this.waveParams.at(pb.add(pb.mul(this.i, 2), 1)),\r\n this.inPos,\r\n this.waveNormal,\r\n this.waveDxdx,\r\n this.waveDzdz,\r\n this.waveDxdz\r\n );\r\n this.outPos = pb.add(this.outPos, this.wavePos);\r\n this.outNormal = pb.add(this.outNormal, this.waveNormal);\r\n this.dxdx = pb.add(this.dxdx, this.waveDxdx);\r\n this.dzdz = pb.add(this.dzdz, this.waveDzdz);\r\n this.dxdz = pb.add(this.dxdz, this.waveDxdz);\r\n }\r\n );\r\n // Jacobian determinant of the horizontal displacement, det(I + J). When the\r\n // surface folds over the determinant drops below the foamParams.x threshold\r\n // and the coverage ramps in. Mirrors the FFT generator's foam.\r\n this.$l.val = pb.sub(pb.mul(pb.add(1, this.dxdx), pb.add(1, this.dzdz)), pb.mul(this.dxdz, this.dxdz));\r\n this.$l.foam = pb.abs(\r\n pb.pow(pb.neg(pb.min(0, pb.sub(this.val, this.foamParams.x))), this.foamParams.y)\r\n );\r\n this.$return(pb.vec4(this.outNormal, this.foam));\r\n });\r\n return scope.calcNormalAndFoam(xz) as PBShaderExp;\r\n }\r\n /** {@inheritDoc WaveGenerator.setupUniforms} */\r\n setupUniforms(scope: PBGlobalScope, uniformGroup: number) {\r\n const pb = scope.$builder;\r\n scope.numWaves = pb.float().uniform(uniformGroup);\r\n scope.waveParams = pb.vec4[MAX_GERSTNER_WAVE_COUNT * 2]().uniform(uniformGroup);\r\n scope.foamParams = pb.vec2().uniform(uniformGroup);\r\n }\r\n /** @internal */\r\n private gerstnerWave(\r\n scope: PBInsideFunctionScope,\r\n waveParam: PBShaderExp,\r\n omniParam: PBShaderExp,\r\n inPos: PBShaderExp,\r\n outNormal: PBShaderExp,\r\n outDxdx: PBShaderExp,\r\n outDzdz: PBShaderExp,\r\n outDxdz: PBShaderExp\r\n ) {\r\n const pb = scope.$builder;\r\n pb.func(\r\n 'gerstnerWave',\r\n [\r\n pb.vec4('waveParam'),\r\n pb.vec4('omniParam'),\r\n pb.vec3('inPos'),\r\n pb.vec3('outNormal').out(),\r\n pb.float('outDxdx').out(),\r\n pb.float('outDzdz').out(),\r\n pb.float('outDxdz').out()\r\n ],\r\n function () {\r\n this.$l.amplitude = pb.max(this.waveParam.z, 0.01);\r\n this.$l.wavelength = this.waveParam.w;\r\n this.$l.omniPos = this.omniParam.xz;\r\n this.$l.omni = this.omniParam.w;\r\n this.$l.direction = pb.vec2(pb.sin(this.waveParam.x), pb.cos(this.waveParam.x));\r\n this.$l.w = pb.max(0.001, pb.div(Math.PI * 2, this.wavelength));\r\n this.$l.wSpeed = pb.sqrt(pb.mul(9.8, this.w));\r\n this.$l.peak = this.waveParam.y;\r\n this.$l.qi = pb.div(this.peak, pb.mul(this.amplitude, this.w, this.numWaves));\r\n this.$l.dirWaveInput = pb.mul(this.direction, pb.sub(1, this.omni));\r\n this.$l.omniWaveInput = pb.mul(pb.sub(this.inPos.xz, this.omniPos), this.omni);\r\n this.$l.windDir = pb.normalize(pb.add(this.dirWaveInput, this.omniWaveInput));\r\n this.$l.dir = pb.dot(this.windDir, pb.sub(this.inPos.xz, pb.mul(this.omniPos, this.omni)));\r\n this.$l.calc = pb.sub(\r\n pb.mul(this.dir, this.w),\r\n pb.mul(this.wSpeed, ShaderHelper.getElapsedTime(this))\r\n );\r\n this.$l.cosCalc = pb.cos(this.calc);\r\n this.$l.sinCalc = pb.sin(this.calc);\r\n this.$l.waveXZ = pb.mul(this.windDir.xy, this.qi, this.amplitude, this.cosCalc);\r\n this.$l.waveY = pb.div(pb.mul(this.sinCalc, this.amplitude), this.numWaves);\r\n this.$l.wave = pb.vec3(this.waveXZ.x, this.waveY, this.waveXZ.y);\r\n this.$l.wa = pb.mul(this.w, this.amplitude);\r\n this.$l.n = pb.vec3(\r\n pb.neg(pb.mul(this.windDir.xy, this.wa, this.cosCalc)),\r\n pb.sub(1, pb.mul(this.qi, this.wa, this.sinCalc))\r\n );\r\n this.outNormal = pb.div(this.n.xzy, this.numWaves);\r\n // Horizontal-gradient of the displacement, per wave. `waveXZ =\r\n // windDir.xy * qi * amp * cos`, and the derivative of `cos(calc)` w.r.t.\r\n // xz is `-w * sin(calc)`, so the gradient is the outer product of\r\n // `windDir.xy` with itself scaled by `-qi * wa * sin`. The sign matters:\r\n // at a crest (sin positive, cal near PI/2) the surface is compressed\r\n // horizontally, which is what pushes `det(I + J)` down and fires the\r\n // fold signal. Summed over waves and run through det(I + J), this is the\r\n // same Jacobian criterion the FFT generator uses.\r\n this.$l.jac = pb.neg(pb.mul(this.qi, this.wa, this.sinCalc));\r\n this.outDxdx = pb.mul(this.jac, this.windDir.x, this.windDir.x);\r\n this.outDzdz = pb.mul(this.jac, this.windDir.y, this.windDir.y);\r\n this.outDxdz = pb.mul(this.jac, this.windDir.x, this.windDir.y);\r\n this.$return(pb.mul(this.wave, pb.clamp(pb.mul(this.amplitude, 10000), 0, 1)));\r\n }\r\n );\r\n return scope.gerstnerWave(\r\n waveParam,\r\n omniParam,\r\n inPos,\r\n outNormal,\r\n outDxdx,\r\n outDzdz,\r\n outDxdz\r\n ) as PBShaderExp;\r\n }\r\n /** @internal */\r\n private calcNormalAndPos(\r\n scope: PBInsideFunctionScope,\r\n inPos: PBShaderExp,\r\n outPos: PBShaderExp,\r\n outNormal: PBShaderExp\r\n ) {\r\n const pb = scope.$builder;\r\n const that = this;\r\n pb.func(\r\n 'calcPositionAndNormal',\r\n [pb.vec3('inPos'), pb.vec3('outPos').out(), pb.vec3('outNormal').out()],\r\n function () {\r\n this.outPos = this.inPos;\r\n this.outNormal = pb.vec3(0);\r\n this.$for(\r\n pb.float('i'),\r\n 0,\r\n pb.getDevice().type === 'webgl' ? MAX_GERSTNER_WAVE_COUNT : this.numWaves,\r\n function () {\r\n if (pb.getDevice().type === 'webgl') {\r\n this.$if(pb.greaterThanEqual(this.i, this.numWaves), function () {\r\n this.$break();\r\n });\r\n }\r\n this.$l.waveNormal = pb.vec3();\r\n this.$l.waveDxdx = pb.float();\r\n this.$l.waveDzdz = pb.float();\r\n this.$l.waveDxdz = pb.float();\r\n this.$l.wavePos = that.gerstnerWave(\r\n this,\r\n this.waveParams.at(pb.mul(this.i, 2)),\r\n this.waveParams.at(pb.add(pb.mul(this.i, 2), 1)),\r\n this.inPos,\r\n this.waveNormal,\r\n this.waveDxdx,\r\n this.waveDzdz,\r\n this.waveDxdz\r\n );\r\n this.outPos = pb.add(this.outPos, this.wavePos);\r\n this.outNormal = pb.add(this.outNormal, this.waveNormal);\r\n }\r\n );\r\n }\r\n );\r\n scope.calcPositionAndNormal(inPos, outPos, outNormal);\r\n }\r\n /** {@inheritDoc WaveGenerator.calcVertexPositionAndNormal} */\r\n calcVertexPositionAndNormal(\r\n scope: PBInsideFunctionScope,\r\n inPos: PBShaderExp,\r\n outPos: PBShaderExp,\r\n outNormal: PBShaderExp\r\n ) {\r\n this.calcNormalAndPos(scope, inPos, outPos, outNormal);\r\n }\r\n /** {@inheritDoc WaveGenerator.applyWaterBindGroup} */\r\n applyWaterBindGroup(bindGroup: BindGroup) {\r\n bindGroup.setValue('numWaves', this._numWaves);\r\n bindGroup.setValue('waveParams', this._waveParams);\r\n bindGroup.setValue('foamParams', this._foamParams);\r\n }\r\n /** {@inheritDoc WaveGenerator.isOk} */\r\n isOk() {\r\n return true;\r\n }\r\n /** {@inheritDoc WaveGenerator.getHash} */\r\n getHash() {\r\n return 'GerstnerWaveGenerator';\r\n }\r\n}\r\n"],"names":["GerstnerWaveGenerator","Disposable","_version","_waveParams","_numWaves","_rand","_foamParams","randomSeed","Float32Array","MAX_GERSTNER_WAVE_COUNT","PRNG","randomWave","randomWaveData","rand","array","offset","get","Math","PI","setRaw","data","index","set","clone","other","numWaves","version","val","Number","isInteger","console","error","i","deleteWave","j","insertWave","setWaveDirection","waveIndex","angle","getWaveDirection","setWaveSteepness","steepness","getWaveSteepness","setWaveAmplitude","getWaveAmplitude","setWaveLength","getWaveLength","isOmniWave","setOmniWave","isOmni","foamWidth","foamContrast","getOriginX","getOriginZ","setOrigin","x","z","update","needUpdate","calcClipmapTileAABB","minX","maxX","minZ","maxZ","y","outAABB","maxHeight","h","minPoint","setXYZ","maxPoint","calcFragmentNormal","scope","xz","_vertexNormal","pb","$builder","that","func","vec2","$l","inPos","vec3","outPos","outNormal","calcNormalAndPos","$return","calcFragmentNormalAndFoam","dxdx","float","dzdz","dxdz","$for","getDevice","type","$if","greaterThanEqual","$break","waveNormal","waveDxdx","waveDzdz","waveDxdz","wavePos","gerstnerWave","waveParams","at","mul","add","sub","foam","abs","pow","neg","min","foamParams","vec4","calcNormalAndFoam","setupUniforms","uniformGroup","uniform","waveParam","omniParam","outDxdx","outDzdz","outDxdz","out","amplitude","max","wavelength","w","omniPos","omni","direction","sin","cos","div","wSpeed","sqrt","peak","qi","dirWaveInput","omniWaveInput","windDir","normalize","dir","dot","calc","ShaderHelper","getElapsedTime","cosCalc","sinCalc","waveXZ","xy","waveY","wave","wa","n","xzy","jac","clamp","calcPositionAndNormal","calcVertexPositionAndNormal","applyWaterBindGroup","bindGroup","setValue","isOk","getHash"],"mappings":"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"}
|
|
@@ -5,10 +5,13 @@ import '../material/unlit.js';
|
|
|
5
5
|
import '../material/particle.js';
|
|
6
6
|
import '../material/subsurfaceprofile.js';
|
|
7
7
|
import '../material/skin.js';
|
|
8
|
+
import '../material/eye.js';
|
|
8
9
|
import '@zephyr3d/device';
|
|
9
10
|
import '../values.js';
|
|
10
11
|
import '@zephyr3d/base';
|
|
11
12
|
import '../material/meshmaterial.js';
|
|
13
|
+
import '../material/hair.js';
|
|
14
|
+
import '../material/hairstrand.js';
|
|
12
15
|
import '../material/grassmaterial.js';
|
|
13
16
|
import '../material/terrain-cm.js';
|
|
14
17
|
import '../material/pbrmr.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"globalbindgroup_allocator.js","sources":["../../src/render/globalbindgroup_allocator.ts"],"sourcesContent":["import type { BindGroup, BindGroupLayout } from '@zephyr3d/device';\r\nimport type { DrawContext } from './drawable';\r\nimport { ShaderHelper } from '../material';\r\n\r\nexport class GlobalBindGroupAllocator {\r\n static _layouts: Record<string, BindGroupLayout> = {};\r\n static _allocators: GlobalBindGroupAllocator[] = [];\r\n private _bindGroups: Record<string, BindGroup>;\r\n constructor() {\r\n this._bindGroups = {};\r\n }\r\n static get() {\r\n return this._allocators.pop() ?? new GlobalBindGroupAllocator();\r\n }\r\n static release(allocator: GlobalBindGroupAllocator) {\r\n this._allocators.push(allocator);\r\n }\r\n /**\r\n * Allocate global bind group according to current draw context\r\n * @param ctx - Draw context\r\n * @returns Global bind group\r\n */\r\n getGlobalBindGroup(ctx: DrawContext) {\r\n const hash = ctx.renderPassHash!;\r\n let bindGroup = this._bindGroups[hash];\r\n if (!bindGroup) {\r\n let layout = GlobalBindGroupAllocator._layouts[hash];\r\n if (!layout) {\r\n const ret = ctx.device.programBuilder.buildRender({\r\n vertex(pb) {\r\n ShaderHelper.prepareVertexShader(pb, ctx);\r\n pb.main(function () {});\r\n },\r\n fragment(pb) {\r\n ShaderHelper.prepareFragmentShader(pb, ctx);\r\n pb.main(function () {});\r\n }\r\n });\r\n layout = ret[2][0];\r\n GlobalBindGroupAllocator._layouts[hash] = layout;\r\n }\r\n bindGroup = ctx.device.createBindGroup(layout);\r\n this._bindGroups[hash] = bindGroup;\r\n }\r\n return bindGroup;\r\n }\r\n}\r\n"],"names":["GlobalBindGroupAllocator","_layouts","_allocators","_bindGroups","get","pop","release","allocator","push","getGlobalBindGroup","ctx","hash","renderPassHash","bindGroup","layout","ret","device","programBuilder","buildRender","vertex","pb","ShaderHelper","prepareVertexShader","main","fragment","prepareFragmentShader","createBindGroup"],"mappings":"
|
|
1
|
+
{"version":3,"file":"globalbindgroup_allocator.js","sources":["../../src/render/globalbindgroup_allocator.ts"],"sourcesContent":["import type { BindGroup, BindGroupLayout } from '@zephyr3d/device';\r\nimport type { DrawContext } from './drawable';\r\nimport { ShaderHelper } from '../material';\r\n\r\nexport class GlobalBindGroupAllocator {\r\n static _layouts: Record<string, BindGroupLayout> = {};\r\n static _allocators: GlobalBindGroupAllocator[] = [];\r\n private _bindGroups: Record<string, BindGroup>;\r\n constructor() {\r\n this._bindGroups = {};\r\n }\r\n static get() {\r\n return this._allocators.pop() ?? new GlobalBindGroupAllocator();\r\n }\r\n static release(allocator: GlobalBindGroupAllocator) {\r\n this._allocators.push(allocator);\r\n }\r\n /**\r\n * Allocate global bind group according to current draw context\r\n * @param ctx - Draw context\r\n * @returns Global bind group\r\n */\r\n getGlobalBindGroup(ctx: DrawContext) {\r\n const hash = ctx.renderPassHash!;\r\n let bindGroup = this._bindGroups[hash];\r\n if (!bindGroup) {\r\n let layout = GlobalBindGroupAllocator._layouts[hash];\r\n if (!layout) {\r\n const ret = ctx.device.programBuilder.buildRender({\r\n vertex(pb) {\r\n ShaderHelper.prepareVertexShader(pb, ctx);\r\n pb.main(function () {});\r\n },\r\n fragment(pb) {\r\n ShaderHelper.prepareFragmentShader(pb, ctx);\r\n pb.main(function () {});\r\n }\r\n });\r\n layout = ret[2][0];\r\n GlobalBindGroupAllocator._layouts[hash] = layout;\r\n }\r\n bindGroup = ctx.device.createBindGroup(layout);\r\n this._bindGroups[hash] = bindGroup;\r\n }\r\n return bindGroup;\r\n }\r\n}\r\n"],"names":["GlobalBindGroupAllocator","_layouts","_allocators","_bindGroups","get","pop","release","allocator","push","getGlobalBindGroup","ctx","hash","renderPassHash","bindGroup","layout","ret","device","programBuilder","buildRender","vertex","pb","ShaderHelper","prepareVertexShader","main","fragment","prepareFragmentShader","createBindGroup"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAIO,MAAMA,wBAAAA,CAAAA;IACX,OAAOC,QAAAA,GAA4C,EAAG;IACtD,OAAOC,WAAAA,GAA0C,EAAE;IAC3CC,WAAuC;IAC/C,WAAc,EAAA;QACZ,IAAI,CAACA,WAAW,GAAG,EAAC;AACtB;AACA,IAAA,OAAOC,GAAM,GAAA;AACX,QAAA,OAAO,IAAI,CAACF,WAAW,CAACG,GAAG,MAAM,IAAIL,wBAAAA,EAAAA;AACvC;IACA,OAAOM,OAAAA,CAAQC,SAAmC,EAAE;AAClD,QAAA,IAAI,CAACL,WAAW,CAACM,IAAI,CAACD,SAAAA,CAAAA;AACxB;AACA;;;;MAKAE,kBAAAA,CAAmBC,GAAgB,EAAE;QACnC,MAAMC,IAAAA,GAAOD,IAAIE,cAAc;AAC/B,QAAA,IAAIC,SAAY,GAAA,IAAI,CAACV,WAAW,CAACQ,IAAK,CAAA;AACtC,QAAA,IAAI,CAACE,SAAW,EAAA;AACd,YAAA,IAAIC,MAASd,GAAAA,wBAAAA,CAAyBC,QAAQ,CAACU,IAAK,CAAA;AACpD,YAAA,IAAI,CAACG,MAAQ,EAAA;AACX,gBAAA,MAAMC,MAAML,GAAIM,CAAAA,MAAM,CAACC,cAAc,CAACC,WAAW,CAAC;AAChDC,oBAAAA,MAAAA,CAAAA,CAAOC,EAAE,EAAA;wBACPC,YAAaC,CAAAA,mBAAmB,CAACF,EAAIV,EAAAA,GAAAA,CAAAA;wBACrCU,EAAGG,CAAAA,IAAI,CAAC,WAAa,EAAA,CAAA;AACvB,qBAAA;AACAC,oBAAAA,QAAAA,CAAAA,CAASJ,EAAE,EAAA;wBACTC,YAAaI,CAAAA,qBAAqB,CAACL,EAAIV,EAAAA,GAAAA,CAAAA;wBACvCU,EAAGG,CAAAA,IAAI,CAAC,WAAa,EAAA,CAAA;AACvB;AACF,iBAAA,CAAA;AACAT,gBAAAA,MAAAA,GAASC,GAAG,CAAC,CAAE,CAAA,CAAC,CAAE,CAAA;gBAClBf,wBAAyBC,CAAAA,QAAQ,CAACU,IAAAA,CAAK,GAAGG,MAAAA;AAC5C;AACAD,YAAAA,SAAAA,GAAYH,GAAIM,CAAAA,MAAM,CAACU,eAAe,CAACZ,MAAAA,CAAAA;AACvC,YAAA,IAAI,CAACX,WAAW,CAACQ,IAAAA,CAAK,GAAGE,SAAAA;AAC3B;QACA,OAAOA,SAAAA;AACT;AACF;;;;"}
|