@zephyr3d/scene 0.9.6 → 0.9.8
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 +52 -55
- package/dist/animation/animationset.js.map +1 -1
- package/dist/animation/joint_dynamics/controller.js +92 -32
- 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 +57 -19
- package/dist/animation/joint_dynamics/joint_dynamics_system.js.map +1 -1
- package/dist/animation/joint_dynamics/solver.js +71 -27
- package/dist/animation/joint_dynamics/solver.js.map +1 -1
- package/dist/animation/joint_dynamics_modifier.js +4 -3
- package/dist/animation/joint_dynamics_modifier.js.map +1 -1
- package/dist/animation/skeleton.js +7 -10
- package/dist/animation/skeleton.js.map +1 -1
- package/dist/app/engine.js +3 -9
- package/dist/app/engine.js.map +1 -1
- package/dist/app/scriptregistry.js +47 -16
- package/dist/app/scriptregistry.js.map +1 -1
- package/dist/asset/assetmanager.js +3 -1
- package/dist/asset/assetmanager.js.map +1 -1
- package/dist/asset/model.js +346 -7
- package/dist/asset/model.js.map +1 -1
- package/dist/avatar/wardrobe.js +7 -3
- package/dist/avatar/wardrobe.js.map +1 -1
- package/dist/camera/camera.js +240 -34
- package/dist/camera/camera.js.map +1 -1
- package/dist/index.d.ts +1350 -622
- package/dist/index.js +6 -11
- package/dist/index.js.map +1 -1
- package/dist/material/blinn.js +1 -1
- package/dist/material/blinn.js.map +1 -1
- package/dist/material/lambert.js +1 -1
- package/dist/material/lambert.js.map +1 -1
- package/dist/material/material.js +23 -1
- package/dist/material/material.js.map +1 -1
- package/dist/material/meshmaterial.js +178 -23
- package/dist/material/meshmaterial.js.map +1 -1
- package/dist/material/mixins/albedocolor.js +4 -4
- package/dist/material/mixins/albedocolor.js.map +1 -1
- package/dist/material/mixins/lightmodel/blinnphong.js +2 -1
- package/dist/material/mixins/lightmodel/blinnphong.js.map +1 -1
- package/dist/material/mixins/lightmodel/lambert.js +2 -1
- package/dist/material/mixins/lightmodel/lambert.js.map +1 -1
- package/dist/material/mixins/lightmodel/pbrblueprintmixin.js +63 -16
- package/dist/material/mixins/lightmodel/pbrblueprintmixin.js.map +1 -1
- package/dist/material/mixins/lightmodel/pbrmetallicroughness.js +100 -27
- package/dist/material/mixins/lightmodel/pbrmetallicroughness.js.map +1 -1
- package/dist/material/mixins/lightmodel/pbrspecularglossness.js +16 -6
- package/dist/material/mixins/lightmodel/pbrspecularglossness.js.map +1 -1
- package/dist/material/mixins/lit.js +1 -1
- package/dist/material/mixins/lit.js.map +1 -1
- package/dist/material/mixins/pbr/common.js +276 -65
- package/dist/material/mixins/pbr/common.js.map +1 -1
- package/dist/material/mixins/texture.js +3 -3
- package/dist/material/mixins/texture.js.map +1 -1
- package/dist/material/mixins/vertexcolor.js +2 -2
- package/dist/material/mixins/vertexcolor.js.map +1 -1
- package/dist/material/mtoon.js +574 -0
- package/dist/material/mtoon.js.map +1 -0
- package/dist/material/pbrblueprint.js +494 -331
- package/dist/material/pbrblueprint.js.map +1 -1
- package/dist/material/pbrmr.js +118 -100
- package/dist/material/pbrmr.js.map +1 -1
- package/dist/material/pbrsg.js +1 -1
- package/dist/material/pbrsg.js.map +1 -1
- package/dist/material/shader/helper.js +45 -15
- package/dist/material/shader/helper.js.map +1 -1
- package/dist/material/subsurfaceprofile.js +812 -0
- package/dist/material/subsurfaceprofile.js.map +1 -0
- package/dist/material/unlit.js +1 -1
- package/dist/material/unlit.js.map +1 -1
- package/dist/posteffect/compositor.js +46 -11
- package/dist/posteffect/compositor.js.map +1 -1
- package/dist/posteffect/ssr.js +413 -87
- package/dist/posteffect/ssr.js.map +1 -1
- package/dist/posteffect/sss.js +1053 -0
- package/dist/posteffect/sss.js.map +1 -0
- package/dist/posteffect/taa.js +61 -60
- package/dist/posteffect/taa.js.map +1 -1
- package/dist/render/abuffer_oit.js +63 -12
- package/dist/render/abuffer_oit.js.map +1 -1
- package/dist/render/cluster_light.js +6 -5
- package/dist/render/cluster_light.js.map +1 -1
- package/dist/render/drawable.js +1 -5
- package/dist/render/drawable.js.map +1 -1
- package/dist/render/drawable_mixin.js +2 -1
- package/dist/render/drawable_mixin.js.map +1 -1
- package/dist/render/fbm_wavegenerator.js +2 -1
- package/dist/render/fbm_wavegenerator.js.map +1 -1
- package/dist/render/gerstner_wavegenerator.js +2 -1
- package/dist/render/gerstner_wavegenerator.js.map +1 -1
- package/dist/render/globalbindgroup_allocator.js +2 -1
- package/dist/render/globalbindgroup_allocator.js.map +1 -1
- package/dist/render/lightpass.js +105 -18
- package/dist/render/lightpass.js.map +1 -1
- package/dist/render/render_queue.js +51 -8
- package/dist/render/render_queue.js.map +1 -1
- package/dist/render/renderer.js +73 -59
- package/dist/render/renderer.js.map +1 -1
- package/dist/render/rendergraph/device_pool_allocator.js +8 -0
- package/dist/render/rendergraph/device_pool_allocator.js.map +1 -1
- package/dist/render/rendergraph/forward_plus_builder.js +481 -95
- package/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
- package/dist/render/rendergraph/history_resource_manager.js +55 -0
- package/dist/render/rendergraph/history_resource_manager.js.map +1 -1
- package/dist/render/rendergraph/history_resources.js +3 -1
- package/dist/render/rendergraph/history_resources.js.map +1 -1
- package/dist/render/rendergraph/types.js.map +1 -1
- package/dist/render/renderpass.js +10 -4
- package/dist/render/renderpass.js.map +1 -1
- package/dist/render/sky.js +31 -1
- package/dist/render/sky.js.map +1 -1
- package/dist/render/weightedblended_oit.js +23 -5
- package/dist/render/weightedblended_oit.js.map +1 -1
- package/dist/scene/basesprite.js +4 -2
- package/dist/scene/basesprite.js.map +1 -1
- package/dist/scene/batchgroup.js +3 -1
- package/dist/scene/batchgroup.js.map +1 -1
- package/dist/scene/environment.js +11 -1
- package/dist/scene/environment.js.map +1 -1
- package/dist/scene/light.js +21 -3
- package/dist/scene/light.js.map +1 -1
- package/dist/scene/mesh.js +29 -14
- 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 +5 -2
- package/dist/scene/msdftext.js.map +1 -1
- package/dist/scene/msdftextsprite.js +5 -3
- package/dist/scene/msdftextsprite.js.map +1 -1
- package/dist/scene/particlesys.js +3 -1
- package/dist/scene/particlesys.js.map +1 -1
- package/dist/scene/scene.js +6 -5
- package/dist/scene/scene.js.map +1 -1
- package/dist/scene/terrain-cm/grass.js +4 -2
- package/dist/scene/terrain-cm/grass.js.map +1 -1
- package/dist/scene/terrain-cm/grassmaterial.js +2 -1
- package/dist/scene/terrain-cm/grassmaterial.js.map +1 -1
- package/dist/scene/terrain-cm/terrain-cm.js +4 -2
- package/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
- package/dist/scene/water.js +4 -2
- package/dist/scene/water.js.map +1 -1
- package/dist/shaders/shadow.js +26 -393
- package/dist/shaders/shadow.js.map +1 -1
- package/dist/shadow/esm.js +112 -12
- package/dist/shadow/esm.js.map +1 -1
- package/dist/shadow/pcf_opt.js +2 -2
- package/dist/shadow/pcf_opt.js.map +1 -1
- package/dist/shadow/pcf_pd.js +19 -10
- package/dist/shadow/pcf_pd.js.map +1 -1
- package/dist/shadow/shader.js +58 -7
- package/dist/shadow/shader.js.map +1 -1
- package/dist/shadow/shadow_impl.js +6 -0
- package/dist/shadow/shadow_impl.js.map +1 -1
- package/dist/shadow/shadow_region.js +229 -0
- package/dist/shadow/shadow_region.js.map +1 -0
- package/dist/shadow/shadowmapper.js +67 -59
- package/dist/shadow/shadowmapper.js.map +1 -1
- package/dist/shadow/vsm.js +45 -19
- package/dist/shadow/vsm.js.map +1 -1
- package/dist/utility/blueprint/common/constants.js +8 -8
- package/dist/utility/blueprint/common/constants.js.map +1 -1
- package/dist/utility/blueprint/material/pbr.js +31 -4
- package/dist/utility/blueprint/material/pbr.js.map +1 -1
- package/dist/utility/blueprint/material/texture.js +1 -17
- package/dist/utility/blueprint/material/texture.js.map +1 -1
- package/dist/utility/serialization/manager.js +66 -98
- package/dist/utility/serialization/manager.js.map +1 -1
- package/dist/utility/serialization/scene/animation.js +5 -2
- package/dist/utility/serialization/scene/animation.js.map +1 -1
- package/dist/utility/serialization/scene/batch.js +4 -1
- package/dist/utility/serialization/scene/batch.js.map +1 -1
- package/dist/utility/serialization/scene/camera.js +249 -54
- package/dist/utility/serialization/scene/camera.js.map +1 -1
- package/dist/utility/serialization/scene/common.js +37 -1
- package/dist/utility/serialization/scene/common.js.map +1 -1
- package/dist/utility/serialization/scene/light.js +42 -3
- package/dist/utility/serialization/scene/light.js.map +1 -1
- package/dist/utility/serialization/scene/material.js +1112 -646
- package/dist/utility/serialization/scene/material.js.map +1 -1
- package/dist/utility/serialization/scene/mesh.js +7 -4
- package/dist/utility/serialization/scene/mesh.js.map +1 -1
- package/dist/utility/serialization/scene/node.js +31 -12
- package/dist/utility/serialization/scene/node.js.map +1 -1
- package/dist/utility/serialization/scene/particle.js +4 -1
- package/dist/utility/serialization/scene/particle.js.map +1 -1
- package/dist/utility/serialization/scene/primitive.js +3 -1
- package/dist/utility/serialization/scene/primitive.js.map +1 -1
- package/dist/utility/serialization/scene/scene.js +18 -0
- package/dist/utility/serialization/scene/scene.js.map +1 -1
- package/dist/utility/serialization/scene/sprite.js +6 -3
- package/dist/utility/serialization/scene/sprite.js.map +1 -1
- package/dist/utility/serialization/scene/terrain.js +5 -2
- package/dist/utility/serialization/scene/terrain.js.map +1 -1
- package/dist/utility/serialization/scene/text.js +3 -1
- package/dist/utility/serialization/scene/text.js.map +1 -1
- package/dist/utility/serialization/scene/water.js +4 -1
- package/dist/utility/serialization/scene/water.js.map +1 -1
- package/dist/utility/textures/ltcdata.js +6 -0
- package/dist/utility/textures/ltcdata.js.map +1 -0
- package/dist/utility/textures/ltclut.js +61 -0
- package/dist/utility/textures/ltclut.js.map +1 -0
- package/dist/values.js +9 -1
- package/dist/values.js.map +1 -1
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fbm_wavegenerator.js","sources":["../../src/render/fbm_wavegenerator.ts"],"sourcesContent":["import type { AABB, Immutable } from '@zephyr3d/base';\r\nimport { Disposable, Vector2 } from '@zephyr3d/base';\r\nimport type { WaveGenerator } from './wavegenerator';\r\nimport type { BindGroup, PBGlobalScope, PBInsideFunctionScope, PBShaderExp } from '@zephyr3d/device';\r\nimport { valueNoise } from '../shaders';\r\nimport { ShaderHelper } from '../material';\r\n\r\nconst MAX_NUM_OCTAVES = 16;\r\n\r\n/**\r\n * FBM wave generator.\r\n * @public\r\n */\r\nexport class FBMWaveGenerator extends Disposable implements WaveGenerator {\r\n private _version: number;\r\n private readonly _windVelocity: Vector2;\r\n private _numOctaves: number;\r\n private _amplitude: number;\r\n private _frequency: number;\r\n private readonly _lacunarity: number;\r\n private readonly _gain: number;\r\n /**\r\n * Creates a new Gerstner wave generator.\r\n */\r\n constructor() {\r\n super();\r\n this._version = 0;\r\n this._numOctaves = 4;\r\n this._windVelocity = new Vector2(0.1, 0);\r\n this._amplitude = 0.3;\r\n this._frequency = 3;\r\n this._lacunarity = 1.83;\r\n this._gain = 0.57;\r\n }\r\n clone() {\r\n const other = new FBMWaveGenerator();\r\n other.numOctaves = this.numOctaves;\r\n other.wind = this.wind;\r\n other.amplitude = this.amplitude;\r\n other.frequency = this.frequency;\r\n return other as this;\r\n }\r\n get version() {\r\n return this._version;\r\n }\r\n /** Number of octaves */\r\n get numOctaves() {\r\n return this._numOctaves;\r\n }\r\n set numOctaves(val) {\r\n if (val !== this.numOctaves) {\r\n this._numOctaves = val;\r\n this._version++;\r\n }\r\n }\r\n /** Wave amplitude */\r\n get amplitude() {\r\n return this._amplitude;\r\n }\r\n set amplitude(val) {\r\n if (val !== this._amplitude) {\r\n this._amplitude = val;\r\n this._version++;\r\n }\r\n }\r\n /** Wave frequency */\r\n get frequency() {\r\n return this._frequency;\r\n }\r\n set frequency(val) {\r\n if (val !== this._frequency) {\r\n this._frequency = val;\r\n this._version++;\r\n }\r\n }\r\n /** Wind velocity */\r\n get wind(): Immutable<Vector2> {\r\n return this._windVelocity;\r\n }\r\n set wind(val: Immutable<Vector2>) {\r\n if (!val.equalsTo(this._windVelocity)) {\r\n this._windVelocity.set(val);\r\n this._version++;\r\n }\r\n }\r\n /** @internal */\r\n private calcWaveNormal(\r\n scope: PBInsideFunctionScope,\r\n worldPos: PBShaderExp,\r\n time: PBShaderExp,\r\n windVelocity: PBShaderExp,\r\n amplitude: PBShaderExp,\r\n frequency: PBShaderExp,\r\n gain: PBShaderExp,\r\n lacunarity: PBShaderExp,\r\n numOctaves: PBShaderExp\r\n ) {\r\n const pb = scope.$builder;\r\n const funcName = 'calcWaveNormal';\r\n const that = this;\r\n pb.func(\r\n funcName,\r\n [\r\n pb.vec2('worldPos'),\r\n pb.float('time'),\r\n pb.vec2('windVelocity'),\r\n pb.float('amplitude'),\r\n pb.float('frequency'),\r\n pb.float('gain'),\r\n pb.float('lacunarity'),\r\n pb.int('numOctaves')\r\n ],\r\n function () {\r\n this.$l.epsilon = pb.float(0.1);\r\n this.$l.hr = that.calcWaveHeight(\r\n this,\r\n pb.add(this.worldPos, pb.vec2(this.epsilon, 0)),\r\n this.windVelocity,\r\n this.amplitude,\r\n this.frequency,\r\n this.gain,\r\n this.lacunarity,\r\n this.numOctaves\r\n );\r\n this.$l.hl = that.calcWaveHeight(\r\n this,\r\n pb.sub(this.worldPos, pb.vec2(this.epsilon, 0)),\r\n this.windVelocity,\r\n this.amplitude,\r\n this.frequency,\r\n this.gain,\r\n this.lacunarity,\r\n this.numOctaves\r\n );\r\n this.$l.hu = that.calcWaveHeight(\r\n this,\r\n pb.add(this.worldPos, pb.vec2(0, this.epsilon)),\r\n this.windVelocity,\r\n this.amplitude,\r\n this.frequency,\r\n this.gain,\r\n this.lacunarity,\r\n this.numOctaves\r\n );\r\n this.$l.hd = that.calcWaveHeight(\r\n this,\r\n pb.sub(this.worldPos, pb.vec2(0, this.epsilon)),\r\n this.windVelocity,\r\n this.amplitude,\r\n this.frequency,\r\n this.gain,\r\n this.lacunarity,\r\n this.numOctaves\r\n );\r\n this.$l.dHdx = pb.div(pb.sub(this.hr, this.hl), pb.mul(this.epsilon, 2));\r\n this.$l.dHdz = pb.div(pb.sub(this.hu, this.hd), pb.mul(this.epsilon, 2));\r\n this.$l.normal = pb.normalize(pb.vec3(pb.neg(this.dHdx), 1, pb.neg(this.dHdz)));\r\n this.$return(this.normal);\r\n }\r\n );\r\n return scope[funcName](\r\n worldPos,\r\n time,\r\n windVelocity,\r\n amplitude,\r\n frequency,\r\n gain,\r\n lacunarity,\r\n numOctaves\r\n ) as PBShaderExp;\r\n }\r\n /** @internal */\r\n private calcWaveHeight(\r\n scope: PBInsideFunctionScope,\r\n worldPos: PBShaderExp,\r\n windVelocity: PBShaderExp,\r\n amplitude: PBShaderExp,\r\n frequency: PBShaderExp,\r\n gain: PBShaderExp,\r\n lacunarity: PBShaderExp,\r\n numOctaves: PBShaderExp\r\n ) {\r\n const pb = scope.$builder;\r\n const funcName = 'calcWaveHeight';\r\n const that = this;\r\n pb.func(\r\n funcName,\r\n [\r\n pb.vec2('worldPos'),\r\n pb.vec2('windVelocity'),\r\n pb.float('amplitude'),\r\n pb.float('frequency'),\r\n pb.float('gain'),\r\n pb.float('lacunarity'),\r\n pb.int('numOctaves')\r\n ],\r\n function () {\r\n this.$l.windOffset = pb.mul(this.windVelocity, ShaderHelper.getElapsedTime(this));\r\n this.$l.height = that.fbm(\r\n this,\r\n pb.add(pb.mul(this.worldPos, 0.01), this.windOffset),\r\n this.frequency,\r\n this.gain,\r\n this.lacunarity,\r\n this.numOctaves\r\n );\r\n this.height = pb.add(\r\n this.height,\r\n pb.mul(\r\n 0.3,\r\n that.fbm(\r\n this,\r\n pb.add(pb.mul(this.worldPos, 0.05), pb.mul(this.windOffset, 1.5)),\r\n this.frequency,\r\n this.gain,\r\n this.lacunarity,\r\n this.numOctaves\r\n )\r\n )\r\n );\r\n this.height = pb.add(\r\n this.height,\r\n pb.mul(\r\n 0.1,\r\n that.fbm(\r\n this,\r\n pb.add(pb.mul(this.worldPos, 0.1), pb.mul(this.windOffset, 2)),\r\n this.frequency,\r\n this.gain,\r\n this.lacunarity,\r\n this.numOctaves\r\n )\r\n )\r\n );\r\n this.$return(pb.mul(this.height, this.amplitude));\r\n }\r\n );\r\n return scope[funcName](\r\n worldPos,\r\n windVelocity,\r\n amplitude,\r\n frequency,\r\n gain,\r\n lacunarity,\r\n numOctaves\r\n ) as PBShaderExp;\r\n }\r\n /** @internal */\r\n private fbm(\r\n scope: PBInsideFunctionScope,\r\n st: PBShaderExp,\r\n frequency: PBShaderExp,\r\n gain: PBShaderExp,\r\n lacunarity: PBShaderExp,\r\n numOctaves: PBShaderExp\r\n ) {\r\n const pb = scope.$builder;\r\n const funcName = 'FBM';\r\n pb.func(\r\n funcName,\r\n [pb.vec2('st'), pb.float('frequency'), pb.float('gain'), pb.float('lacunarity'), pb.int('numOctaves')],\r\n function () {\r\n this.$l.m2 = pb.mat2(0.8, 0.6, -0.6, 0.8);\r\n this.$l.p = this.st; //pb.mul(this.st, 0.05);\r\n this.$l.a = pb.float(0);\r\n this.$l.b = pb.float(1);\r\n this.$l.c = pb.float(0);\r\n this.$for(\r\n pb.int('i'),\r\n 0,\r\n pb.getDevice().type === 'webgl' ? MAX_NUM_OCTAVES : this.numOctaves,\r\n function () {\r\n if (pb.getDevice().type === 'webgl') {\r\n this.$if(pb.greaterThanEqual(this.i, this.numOctaves), function () {\r\n this.$break();\r\n });\r\n }\r\n this.$l.n = pb.sub(valueNoise(this, this.p), 0.5);\r\n this.a = pb.add(this.a, pb.mul(this.n, this.b));\r\n this.c = pb.add(this.c, this.b);\r\n this.b = pb.mul(this.b, this.gain);\r\n this.p = pb.mul(this.m2, this.p, this.frequency);\r\n }\r\n );\r\n this.$return(pb.div(this.a, this.c));\r\n }\r\n );\r\n return scope[funcName](st, frequency, gain, lacunarity, numOctaves) as PBShaderExp;\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 const maxHeight = 1.5 * this._amplitude;\r\n outAABB.minPoint.setXYZ(minX, y - maxHeight, 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.normal = that.calcWaveNormal(\r\n this,\r\n this.xz,\r\n ShaderHelper.getElapsedTime(this),\r\n this.windVelocity,\r\n this.waveAmplitude,\r\n this.waveFrequency,\r\n this.waveGain,\r\n this.waveLacunarity,\r\n this.numOctaves\r\n );\r\n this.$return(this.normal);\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.numOctaves = pb.int().uniform(uniformGroup);\r\n scope.windVelocity = pb.vec2().uniform(uniformGroup);\r\n scope.waveAmplitude = pb.float().uniform(uniformGroup);\r\n scope.waveFrequency = pb.float().uniform(uniformGroup);\r\n scope.waveGain = pb.float().uniform(uniformGroup);\r\n scope.waveLacunarity = pb.float().uniform(uniformGroup);\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.outNormal = that.calcWaveNormal(\r\n this,\r\n this.inPos.xz,\r\n ShaderHelper.getElapsedTime(this),\r\n this.windVelocity,\r\n this.waveAmplitude,\r\n this.waveFrequency,\r\n this.waveGain,\r\n this.waveLacunarity,\r\n this.numOctaves\r\n );\r\n this.$l.h = that.calcWaveHeight(\r\n this,\r\n this.inPos.xz,\r\n this.windVelocity,\r\n this.waveAmplitude,\r\n this.waveFrequency,\r\n this.waveGain,\r\n this.waveLacunarity,\r\n this.numOctaves\r\n );\r\n this.outPos = pb.add(this.inPos, pb.vec3(0, this.h, 0));\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('numOctaves', this._numOctaves);\r\n bindGroup.setValue('windVelocity', this._windVelocity);\r\n bindGroup.setValue('waveAmplitude', this._amplitude);\r\n bindGroup.setValue('waveFrequency', this._frequency);\r\n bindGroup.setValue('waveGain', this._gain);\r\n bindGroup.setValue('waveLacunarity', this._lacunarity);\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 'FBMWaveGenerator';\r\n }\r\n}\r\n"],"names":["MAX_NUM_OCTAVES","FBMWaveGenerator","Disposable","_version","_windVelocity","_numOctaves","_amplitude","_frequency","_lacunarity","_gain","Vector2","clone","other","numOctaves","wind","amplitude","frequency","version","val","equalsTo","set","scope","worldPos","time","windVelocity","gain","lacunarity","pb","$builder","funcName","that","func","vec2","float","int","$l","epsilon","hr","calcWaveHeight","add","hl","sub","hu","hd","dHdx","div","mul","dHdz","normal","normalize","vec3","neg","$return","windOffset","ShaderHelper","getElapsedTime","height","fbm","st","m2","mat2","p","a","b","c","$for","getDevice","type","$if","greaterThanEqual","i","$break","n","valueNoise","update","needUpdate","calcClipmapTileAABB","minX","maxX","minZ","maxZ","y","outAABB","maxHeight","minPoint","setXYZ","maxPoint","calcFragmentNormal","xz","calcWaveNormal","waveAmplitude","waveFrequency","waveGain","waveLacunarity","calcFragmentNormalAndFoam","vec4","setupUniforms","uniformGroup","uniform","calcNormalAndPos","inPos","outPos","outNormal","out","h","calcPositionAndNormal","calcVertexPositionAndNormal","applyWaterBindGroup","bindGroup","setValue","isOk","getHash"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"fbm_wavegenerator.js","sources":["../../src/render/fbm_wavegenerator.ts"],"sourcesContent":["import type { AABB, Immutable } from '@zephyr3d/base';\r\nimport { Disposable, Vector2 } from '@zephyr3d/base';\r\nimport type { WaveGenerator } from './wavegenerator';\r\nimport type { BindGroup, PBGlobalScope, PBInsideFunctionScope, PBShaderExp } from '@zephyr3d/device';\r\nimport { valueNoise } from '../shaders';\r\nimport { ShaderHelper } from '../material';\r\n\r\nconst MAX_NUM_OCTAVES = 16;\r\n\r\n/**\r\n * FBM wave generator.\r\n * @public\r\n */\r\nexport class FBMWaveGenerator extends Disposable implements WaveGenerator {\r\n private _version: number;\r\n private readonly _windVelocity: Vector2;\r\n private _numOctaves: number;\r\n private _amplitude: number;\r\n private _frequency: number;\r\n private readonly _lacunarity: number;\r\n private readonly _gain: number;\r\n /**\r\n * Creates a new Gerstner wave generator.\r\n */\r\n constructor() {\r\n super();\r\n this._version = 0;\r\n this._numOctaves = 4;\r\n this._windVelocity = new Vector2(0.1, 0);\r\n this._amplitude = 0.3;\r\n this._frequency = 3;\r\n this._lacunarity = 1.83;\r\n this._gain = 0.57;\r\n }\r\n clone() {\r\n const other = new FBMWaveGenerator();\r\n other.numOctaves = this.numOctaves;\r\n other.wind = this.wind;\r\n other.amplitude = this.amplitude;\r\n other.frequency = this.frequency;\r\n return other as this;\r\n }\r\n get version() {\r\n return this._version;\r\n }\r\n /** Number of octaves */\r\n get numOctaves() {\r\n return this._numOctaves;\r\n }\r\n set numOctaves(val) {\r\n if (val !== this.numOctaves) {\r\n this._numOctaves = val;\r\n this._version++;\r\n }\r\n }\r\n /** Wave amplitude */\r\n get amplitude() {\r\n return this._amplitude;\r\n }\r\n set amplitude(val) {\r\n if (val !== this._amplitude) {\r\n this._amplitude = val;\r\n this._version++;\r\n }\r\n }\r\n /** Wave frequency */\r\n get frequency() {\r\n return this._frequency;\r\n }\r\n set frequency(val) {\r\n if (val !== this._frequency) {\r\n this._frequency = val;\r\n this._version++;\r\n }\r\n }\r\n /** Wind velocity */\r\n get wind(): Immutable<Vector2> {\r\n return this._windVelocity;\r\n }\r\n set wind(val: Immutable<Vector2>) {\r\n if (!val.equalsTo(this._windVelocity)) {\r\n this._windVelocity.set(val);\r\n this._version++;\r\n }\r\n }\r\n /** @internal */\r\n private calcWaveNormal(\r\n scope: PBInsideFunctionScope,\r\n worldPos: PBShaderExp,\r\n time: PBShaderExp,\r\n windVelocity: PBShaderExp,\r\n amplitude: PBShaderExp,\r\n frequency: PBShaderExp,\r\n gain: PBShaderExp,\r\n lacunarity: PBShaderExp,\r\n numOctaves: PBShaderExp\r\n ) {\r\n const pb = scope.$builder;\r\n const funcName = 'calcWaveNormal';\r\n const that = this;\r\n pb.func(\r\n funcName,\r\n [\r\n pb.vec2('worldPos'),\r\n pb.float('time'),\r\n pb.vec2('windVelocity'),\r\n pb.float('amplitude'),\r\n pb.float('frequency'),\r\n pb.float('gain'),\r\n pb.float('lacunarity'),\r\n pb.int('numOctaves')\r\n ],\r\n function () {\r\n this.$l.epsilon = pb.float(0.1);\r\n this.$l.hr = that.calcWaveHeight(\r\n this,\r\n pb.add(this.worldPos, pb.vec2(this.epsilon, 0)),\r\n this.windVelocity,\r\n this.amplitude,\r\n this.frequency,\r\n this.gain,\r\n this.lacunarity,\r\n this.numOctaves\r\n );\r\n this.$l.hl = that.calcWaveHeight(\r\n this,\r\n pb.sub(this.worldPos, pb.vec2(this.epsilon, 0)),\r\n this.windVelocity,\r\n this.amplitude,\r\n this.frequency,\r\n this.gain,\r\n this.lacunarity,\r\n this.numOctaves\r\n );\r\n this.$l.hu = that.calcWaveHeight(\r\n this,\r\n pb.add(this.worldPos, pb.vec2(0, this.epsilon)),\r\n this.windVelocity,\r\n this.amplitude,\r\n this.frequency,\r\n this.gain,\r\n this.lacunarity,\r\n this.numOctaves\r\n );\r\n this.$l.hd = that.calcWaveHeight(\r\n this,\r\n pb.sub(this.worldPos, pb.vec2(0, this.epsilon)),\r\n this.windVelocity,\r\n this.amplitude,\r\n this.frequency,\r\n this.gain,\r\n this.lacunarity,\r\n this.numOctaves\r\n );\r\n this.$l.dHdx = pb.div(pb.sub(this.hr, this.hl), pb.mul(this.epsilon, 2));\r\n this.$l.dHdz = pb.div(pb.sub(this.hu, this.hd), pb.mul(this.epsilon, 2));\r\n this.$l.normal = pb.normalize(pb.vec3(pb.neg(this.dHdx), 1, pb.neg(this.dHdz)));\r\n this.$return(this.normal);\r\n }\r\n );\r\n return scope[funcName](\r\n worldPos,\r\n time,\r\n windVelocity,\r\n amplitude,\r\n frequency,\r\n gain,\r\n lacunarity,\r\n numOctaves\r\n ) as PBShaderExp;\r\n }\r\n /** @internal */\r\n private calcWaveHeight(\r\n scope: PBInsideFunctionScope,\r\n worldPos: PBShaderExp,\r\n windVelocity: PBShaderExp,\r\n amplitude: PBShaderExp,\r\n frequency: PBShaderExp,\r\n gain: PBShaderExp,\r\n lacunarity: PBShaderExp,\r\n numOctaves: PBShaderExp\r\n ) {\r\n const pb = scope.$builder;\r\n const funcName = 'calcWaveHeight';\r\n const that = this;\r\n pb.func(\r\n funcName,\r\n [\r\n pb.vec2('worldPos'),\r\n pb.vec2('windVelocity'),\r\n pb.float('amplitude'),\r\n pb.float('frequency'),\r\n pb.float('gain'),\r\n pb.float('lacunarity'),\r\n pb.int('numOctaves')\r\n ],\r\n function () {\r\n this.$l.windOffset = pb.mul(this.windVelocity, ShaderHelper.getElapsedTime(this));\r\n this.$l.height = that.fbm(\r\n this,\r\n pb.add(pb.mul(this.worldPos, 0.01), this.windOffset),\r\n this.frequency,\r\n this.gain,\r\n this.lacunarity,\r\n this.numOctaves\r\n );\r\n this.height = pb.add(\r\n this.height,\r\n pb.mul(\r\n 0.3,\r\n that.fbm(\r\n this,\r\n pb.add(pb.mul(this.worldPos, 0.05), pb.mul(this.windOffset, 1.5)),\r\n this.frequency,\r\n this.gain,\r\n this.lacunarity,\r\n this.numOctaves\r\n )\r\n )\r\n );\r\n this.height = pb.add(\r\n this.height,\r\n pb.mul(\r\n 0.1,\r\n that.fbm(\r\n this,\r\n pb.add(pb.mul(this.worldPos, 0.1), pb.mul(this.windOffset, 2)),\r\n this.frequency,\r\n this.gain,\r\n this.lacunarity,\r\n this.numOctaves\r\n )\r\n )\r\n );\r\n this.$return(pb.mul(this.height, this.amplitude));\r\n }\r\n );\r\n return scope[funcName](\r\n worldPos,\r\n windVelocity,\r\n amplitude,\r\n frequency,\r\n gain,\r\n lacunarity,\r\n numOctaves\r\n ) as PBShaderExp;\r\n }\r\n /** @internal */\r\n private fbm(\r\n scope: PBInsideFunctionScope,\r\n st: PBShaderExp,\r\n frequency: PBShaderExp,\r\n gain: PBShaderExp,\r\n lacunarity: PBShaderExp,\r\n numOctaves: PBShaderExp\r\n ) {\r\n const pb = scope.$builder;\r\n const funcName = 'FBM';\r\n pb.func(\r\n funcName,\r\n [pb.vec2('st'), pb.float('frequency'), pb.float('gain'), pb.float('lacunarity'), pb.int('numOctaves')],\r\n function () {\r\n this.$l.m2 = pb.mat2(0.8, 0.6, -0.6, 0.8);\r\n this.$l.p = this.st; //pb.mul(this.st, 0.05);\r\n this.$l.a = pb.float(0);\r\n this.$l.b = pb.float(1);\r\n this.$l.c = pb.float(0);\r\n this.$for(\r\n pb.int('i'),\r\n 0,\r\n pb.getDevice().type === 'webgl' ? MAX_NUM_OCTAVES : this.numOctaves,\r\n function () {\r\n if (pb.getDevice().type === 'webgl') {\r\n this.$if(pb.greaterThanEqual(this.i, this.numOctaves), function () {\r\n this.$break();\r\n });\r\n }\r\n this.$l.n = pb.sub(valueNoise(this, this.p), 0.5);\r\n this.a = pb.add(this.a, pb.mul(this.n, this.b));\r\n this.c = pb.add(this.c, this.b);\r\n this.b = pb.mul(this.b, this.gain);\r\n this.p = pb.mul(this.m2, this.p, this.frequency);\r\n }\r\n );\r\n this.$return(pb.div(this.a, this.c));\r\n }\r\n );\r\n return scope[funcName](st, frequency, gain, lacunarity, numOctaves) as PBShaderExp;\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 const maxHeight = 1.5 * this._amplitude;\r\n outAABB.minPoint.setXYZ(minX, y - maxHeight, 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.normal = that.calcWaveNormal(\r\n this,\r\n this.xz,\r\n ShaderHelper.getElapsedTime(this),\r\n this.windVelocity,\r\n this.waveAmplitude,\r\n this.waveFrequency,\r\n this.waveGain,\r\n this.waveLacunarity,\r\n this.numOctaves\r\n );\r\n this.$return(this.normal);\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.numOctaves = pb.int().uniform(uniformGroup);\r\n scope.windVelocity = pb.vec2().uniform(uniformGroup);\r\n scope.waveAmplitude = pb.float().uniform(uniformGroup);\r\n scope.waveFrequency = pb.float().uniform(uniformGroup);\r\n scope.waveGain = pb.float().uniform(uniformGroup);\r\n scope.waveLacunarity = pb.float().uniform(uniformGroup);\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.outNormal = that.calcWaveNormal(\r\n this,\r\n this.inPos.xz,\r\n ShaderHelper.getElapsedTime(this),\r\n this.windVelocity,\r\n this.waveAmplitude,\r\n this.waveFrequency,\r\n this.waveGain,\r\n this.waveLacunarity,\r\n this.numOctaves\r\n );\r\n this.$l.h = that.calcWaveHeight(\r\n this,\r\n this.inPos.xz,\r\n this.windVelocity,\r\n this.waveAmplitude,\r\n this.waveFrequency,\r\n this.waveGain,\r\n this.waveLacunarity,\r\n this.numOctaves\r\n );\r\n this.outPos = pb.add(this.inPos, pb.vec3(0, this.h, 0));\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('numOctaves', this._numOctaves);\r\n bindGroup.setValue('windVelocity', this._windVelocity);\r\n bindGroup.setValue('waveAmplitude', this._amplitude);\r\n bindGroup.setValue('waveFrequency', this._frequency);\r\n bindGroup.setValue('waveGain', this._gain);\r\n bindGroup.setValue('waveLacunarity', this._lacunarity);\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 'FBMWaveGenerator';\r\n }\r\n}\r\n"],"names":["MAX_NUM_OCTAVES","FBMWaveGenerator","Disposable","_version","_windVelocity","_numOctaves","_amplitude","_frequency","_lacunarity","_gain","Vector2","clone","other","numOctaves","wind","amplitude","frequency","version","val","equalsTo","set","scope","worldPos","time","windVelocity","gain","lacunarity","pb","$builder","funcName","that","func","vec2","float","int","$l","epsilon","hr","calcWaveHeight","add","hl","sub","hu","hd","dHdx","div","mul","dHdz","normal","normalize","vec3","neg","$return","windOffset","ShaderHelper","getElapsedTime","height","fbm","st","m2","mat2","p","a","b","c","$for","getDevice","type","$if","greaterThanEqual","i","$break","n","valueNoise","update","needUpdate","calcClipmapTileAABB","minX","maxX","minZ","maxZ","y","outAABB","maxHeight","minPoint","setXYZ","maxPoint","calcFragmentNormal","xz","calcWaveNormal","waveAmplitude","waveFrequency","waveGain","waveLacunarity","calcFragmentNormalAndFoam","vec4","setupUniforms","uniformGroup","uniform","calcNormalAndPos","inPos","outPos","outNormal","out","h","calcPositionAndNormal","calcVertexPositionAndNormal","applyWaterBindGroup","bindGroup","setValue","isOk","getHash"],"mappings":"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"}
|
|
@@ -4,6 +4,7 @@ import '../material/lambert.js';
|
|
|
4
4
|
import '../material/blinn.js';
|
|
5
5
|
import '../material/unlit.js';
|
|
6
6
|
import '../material/particle.js';
|
|
7
|
+
import '../material/subsurfaceprofile.js';
|
|
7
8
|
import '@zephyr3d/device';
|
|
8
9
|
import { MAX_GERSTNER_WAVE_COUNT } from '../values.js';
|
|
9
10
|
import '../material/meshmaterial.js';
|
|
@@ -11,10 +12,10 @@ import '../material/grassmaterial.js';
|
|
|
11
12
|
import '../material/terrain-cm.js';
|
|
12
13
|
import '../material/pbrmr.js';
|
|
13
14
|
import '../material/pbrsg.js';
|
|
15
|
+
import '../material/mtoon.js';
|
|
14
16
|
import '../material/pbrblueprint.js';
|
|
15
17
|
import '../material/sprite.js';
|
|
16
18
|
import '../material/sprite_std.js';
|
|
17
|
-
import '../material/msdf_text.js';
|
|
18
19
|
import '../utility/blueprint/material/texture.js';
|
|
19
20
|
|
|
20
21
|
/**
|
|
@@ -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, 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":";;;;;;;;;;;;;;;;;;;;AAMA;;;IAIO,MAAMA,qBAA8BC,SAAAA,UAAAA,CAAAA;IACjCC,QAAiB;IACjBC,WAAuC;IACvCC,SAAkB;AAC1B;;AAEC,MACD,WAAc,EAAA;QACZ,KAAK,EAAA;AACL,QAAA,IAAI,CAACD,WAAW,GAAG,IAAIE,aAAa,CAAIC,GAAAA,uBAAAA,CAAAA;QACxC,IAAI,CAACC,UAAU,CAAC,CAAA,CAAA;QAChB,IAAI,CAACA,UAAU,CAAC,CAAA,CAAA;QAChB,IAAI,CAACA,UAAU,CAAC,CAAA,CAAA;QAChB,IAAI,CAACA,UAAU,CAAC,CAAA,CAAA;QAChB,IAAI,CAACH,SAAS,GAAG,CAAA;QACjB,IAAI,CAACF,QAAQ,GAAG,CAAA;AAClB;AACA,qBACA,OAAOM,cAAAA,CAAeC,KAAmB,EAAEC,MAAc,EAAE;QACzDD,KAAK,CAACC,SAAS,CAAE,CAAA,GAAGC,KAAKC,MAAM,EAAA,GAAKD,IAAKE,CAAAA,EAAE,GAAG,CAAA;AAC9CJ,QAAAA,KAAK,CAACC,MAAS,GAAA,CAAA,CAAE,GAAGC,IAAKC,CAAAA,MAAM,KAAK,GAAM,GAAA,GAAA;AAC1CH,QAAAA,KAAK,CAACC,MAAS,GAAA,CAAA,CAAE,GAAGC,IAAAA,CAAKC,MAAM,EAAK,GAAA,GAAA;AACpCH,QAAAA,KAAK,CAACC,MAAS,GAAA,CAAA,CAAE,GAAGC,IAAAA,CAAKC,MAAM,EAAK,GAAA,EAAA;AACpCH,QAAAA,KAAK,CAACC,MAAS,GAAA,CAAA,CAAE,GAAGC,IAAKC,CAAAA,MAAM,KAAK,GAAM,GAAA,EAAA;QAC1CH,KAAK,CAACC,MAAS,GAAA,CAAA,CAAE,GAAG,CAAA;AACpBD,QAAAA,KAAK,CAACC,MAAS,GAAA,CAAA,CAAE,GAAGC,IAAKC,CAAAA,MAAM,KAAK,GAAM,GAAA,EAAA;QAC1CH,KAAK,CAACC,MAAS,GAAA,CAAA,CAAE,GAAG,CAAA;AACtB;AACA,qBACAI,MAAAA,CAAOC,IAAkB,EAAEC,KAAa,EAAE;AACxC,QAAA,IAAI,CAACb,WAAW,CAACc,GAAG,CAACF,MAAMC,KAAQ,GAAA,CAAA,CAAA;AACrC;IACAE,KAAQ,GAAA;AACN,QAAA,MAAMC,QAAQ,IAAInB,qBAAAA,EAAAA;AAClBmB,QAAAA,KAAAA,CAAMC,QAAQ,GAAG,IAAI,CAACA,QAAQ;AAC9BD,QAAAA,KAAAA,CAAMhB,WAAW,CAACc,GAAG,CAAC,IAAI,CAACd,WAAW,CAAA;QACtC,OAAOgB,KAAAA;AACT;AACA,IAAA,IAAIE,OAAU,GAAA;QACZ,OAAO,IAAI,CAACnB,QAAQ;AACtB;qCAEA,IAAIkB,QAAW,GAAA;QACb,OAAO,IAAI,CAAChB,SAAS;AACvB;IACA,IAAIgB,QAAAA,CAASE,GAAG,EAAE;QAChB,IAAI,CAACC,OAAOC,SAAS,CAACF,QAAQA,GAAO,IAAA,CAAA,IAAKA,MAAMhB,uBAAyB,EAAA;AACvEmB,YAAAA,OAAAA,CAAQC,KAAK,CAAC,CAAC,qBAAqB,EAAEJ,GAAK,CAAA,CAAA,CAAA;AAC3C,YAAA;AACF;AACA,QAAA,IAAIA,GAAQ,KAAA,IAAI,CAAClB,SAAS,EAAE;YAC1B,IAAK,IAAIuB,IAAI,IAAI,CAACvB,SAAS,EAAEuB,CAAAA,GAAIL,KAAKK,CAAK,EAAA,CAAA;gBACzC,IAAI,CAACpB,UAAU,CAACoB,CAAAA,CAAAA;AAClB;YACA,IAAI,CAACvB,SAAS,GAAGkB,GAAAA;AACjB,YAAA,IAAI,CAACpB,QAAQ,EAAA;AACf;AACF;gCAEA0B,UAAWZ,CAAAA,KAAa,EAAE;QACxB,IAAK,IAAIW,IAAIX,KAAOW,EAAAA,CAAAA,GAAI,IAAI,CAACvB,SAAS,GAAG,CAAA,EAAGuB,CAAK,EAAA,CAAA;AAC/C,YAAA,IAAK,IAAIE,CAAAA,GAAI,CAAGA,EAAAA,CAAAA,GAAI,GAAGA,CAAK,EAAA,CAAA;AAC1B,gBAAA,IAAI,CAAC1B,WAAW,CAACwB,CAAI,GAAA,CAAA,GAAIE,EAAE,GAAG,IAAI,CAAC1B,WAAW,CAAC,CAACwB,IAAI,CAAA,IAAK,IAAIE,CAAE,CAAA;AACjE;AACF;AACA,QAAA,IAAI,CAACzB,SAAS,EAAA;AAChB;gCAEA0B,UAAWd,CAAAA,KAAa,EAAE;QACxB,IAAK,IAAIW,IAAIX,KAAOW,EAAAA,CAAAA,GAAI,IAAI,CAACvB,SAAS,GAAG,CAAA,EAAGuB,CAAK,EAAA,CAAA;AAC/C,YAAA,IAAK,IAAIE,CAAAA,GAAI,CAAGA,EAAAA,CAAAA,GAAI,GAAGA,CAAK,EAAA,CAAA;AAC1B,gBAAA,IAAI,CAAC1B,WAAW,CAAC,CAACwB,IAAI,CAAA,IAAK,CAAIE,GAAAA,CAAAA,CAAE,GAAG,IAAI,CAAC1B,WAAW,CAACwB,CAAAA,GAAI,IAAIE,CAAE,CAAA;AACjE;AACF;AACA,QAAA,IAAI,CAACzB,SAAS,EAAA;AAChB;AACA;;;;AAIC,MACD2B,gBAAiBC,CAAAA,SAAiB,EAAEC,KAAa,EAAE;AACjD,QAAA,IAAID,YAAY1B,uBAAyB,EAAA;AACvC,YAAA,IAAI,CAACH,WAAW,CAAC6B,SAAY,GAAA,CAAA,GAAI,EAAE,GAAGC,KAAAA;AACtC,YAAA,IAAI,CAAC/B,QAAQ,EAAA;AACf;AACF;AACA;;;;MAKAgC,gBAAAA,CAAiBF,SAAiB,EAAE;QAClC,OAAOA,SAAAA,GAAY1B,0BAA0B,IAAI,CAACH,WAAW,CAAC6B,SAAAA,GAAY,CAAI,GAAA,CAAA,CAAE,GAAG,CAAA;AACrF;AACA;;;;AAIC,MACDG,gBAAiBH,CAAAA,SAAiB,EAAEI,SAAiB,EAAE;AACrD,QAAA,IAAIJ,YAAY1B,uBAAyB,EAAA;AACvC,YAAA,IAAI,CAACH,WAAW,CAAC6B,SAAY,GAAA,CAAA,GAAI,EAAE,GAAGI,SAAAA;AACtC,YAAA,IAAI,CAAClC,QAAQ,EAAA;AACf;AACF;AACA;;;;MAKAmC,gBAAAA,CAAiBL,SAAiB,EAAE;QAClC,OAAOA,SAAAA,GAAY1B,0BAA0B,IAAI,CAACH,WAAW,CAAC6B,SAAAA,GAAY,CAAI,GAAA,CAAA,CAAE,GAAG,CAAA;AACrF;AACA;;;;AAIC,MACDM,gBAAiBN,CAAAA,SAAiB,EAAEV,GAAW,EAAE;AAC/C,QAAA,IAAIU,YAAY1B,uBAAyB,EAAA;AACvC,YAAA,IAAI,CAACH,WAAW,CAAC6B,SAAY,GAAA,CAAA,GAAI,EAAE,GAAGV,GAAAA;AACtC,YAAA,IAAI,CAACpB,QAAQ,EAAA;AACf;AACF;AACA;;;;MAKAqC,gBAAAA,CAAiBP,SAAiB,EAAE;QAClC,OAAOA,SAAAA,GAAY1B,0BAA0B,IAAI,CAACH,WAAW,CAAC6B,SAAAA,GAAY,CAAI,GAAA,CAAA,CAAE,GAAG,CAAA;AACrF;AACA;;;;AAIC,MACDQ,aAAcR,CAAAA,SAAiB,EAAEV,GAAW,EAAE;AAC5C,QAAA,IAAIU,YAAY1B,uBAAyB,EAAA;AACvC,YAAA,IAAI,CAACH,WAAW,CAAC6B,SAAY,GAAA,CAAA,GAAI,EAAE,GAAGV,GAAAA;AACtC,YAAA,IAAI,CAACpB,QAAQ,EAAA;AACf;AACF;AACA;;;;MAKAuC,aAAAA,CAAcT,SAAiB,EAAE;QAC/B,OAAOA,SAAAA,GAAY1B,0BAA0B,IAAI,CAACH,WAAW,CAAC6B,SAAAA,GAAY,CAAI,GAAA,CAAA,CAAE,GAAG,CAAA;AACrF;AACA;;;;MAKAU,UAAAA,CAAWV,SAAiB,EAAE;QAC5B,OAAOA,SAAAA,GAAY1B,uBAA0B,GAAA,IAAI,CAACH,WAAW,CAAC6B,SAAY,GAAA,CAAA,GAAI,CAAE,CAAA,KAAK,CAAI,GAAA,KAAA;AAC3F;AACA;;;;AAIC,MACDW,WAAYX,CAAAA,SAAiB,EAAEY,MAAe,EAAE;AAC9C,QAAA,IAAIZ,YAAY1B,uBAAyB,EAAA;YACvC,IAAI,CAACH,WAAW,CAAC6B,SAAAA,GAAY,IAAI,CAAE,CAAA,GAAGY,SAAS,CAAI,GAAA,CAAA;AACnD,YAAA,IAAI,CAAC1C,QAAQ,EAAA;AACf;AACF;AACA;;;;MAKA2C,UAAAA,CAAWb,SAAiB,EAAE;QAC5B,OAAOA,SAAAA,GAAY1B,0BAA0B,IAAI,CAACH,WAAW,CAAC6B,SAAAA,GAAY,CAAI,GAAA,CAAA,CAAE,GAAG,CAAA;AACrF;AACA;;;;MAKAc,UAAAA,CAAWd,SAAiB,EAAE;QAC5B,OAAOA,SAAAA,GAAY1B,0BAA0B,IAAI,CAACH,WAAW,CAAC6B,SAAAA,GAAY,CAAI,GAAA,CAAA,CAAE,GAAG,CAAA;AACrF;AACA;;;;;AAKC,MACDe,UAAUf,SAAiB,EAAEgB,CAAS,EAAEC,CAAS,EAAE;AACjD,QAAA,IAAIjB,YAAY1B,uBAAyB,EAAA;AACvC,YAAA,IAAI,CAACH,WAAW,CAAC6B,SAAY,GAAA,CAAA,GAAI,EAAE,GAAGgB,CAAAA;AACtC,YAAA,IAAI,CAAC7C,WAAW,CAAC6B,SAAY,GAAA,CAAA,GAAI,EAAE,GAAGiB,CAAAA;AACtC,YAAA,IAAI,CAAC/C,QAAQ,EAAA;AACf;AACF;qBAEAK,UAAWoB,CAAAA,CAAS,EAAE;AACpB3B,QAAAA,qBAAAA,CAAsBQ,cAAc,CAAC,IAAI,CAACL,WAAW,EAAEwB,CAAI,GAAA,CAAA,CAAA;AAC7D;8CAEAuB,SAAS;AACT,kDACAC,UAAa,GAAA;QACX,OAAO,KAAA;AACT;AACA,2DACAC,mBAAAA,CAAoBC,IAAY,EAAEC,IAAY,EAAEC,IAAY,EAAEC,IAAY,EAAEC,CAAS,EAAEC,OAAa,EAAE;AACpG,QAAA,IAAIC,SAAY,GAAA,CAAA;QAChB,IAAK,IAAIhC,IAAI,CAAGA,EAAAA,CAAAA,GAAI,IAAI,CAACvB,SAAS,EAAEuB,CAAK,EAAA,CAAA;AACvC,YAAA,MAAMiC,IAAI,IAAI,CAACzD,WAAW,CAACwB,CAAAA,GAAI,IAAI,CAAE,CAAA;AACrC,YAAA,IAAIiC,IAAID,SAAW,EAAA;gBACjBA,SAAYC,GAAAA,CAAAA;AACd;AACF;AACAF,QAAAA,OAAAA,CAAQG,QAAQ,CAACC,MAAM,CAACT,MAAMI,CAAGF,EAAAA,IAAAA,CAAAA;AACjCG,QAAAA,OAAAA,CAAQK,QAAQ,CAACD,MAAM,CAACR,IAAAA,EAAMG,IAAIE,SAAWH,EAAAA,IAAAA,CAAAA;AAC/C;AACA,0DACAQ,kBAAAA,CAAmBC,KAA4B,EAAEC,EAAe,EAAE;QAChE,MAAMC,EAAAA,GAAKF,MAAMG,QAAQ;AACzB,QAAA,MAAMC,OAAO,IAAI;QACjBF,EAAGG,CAAAA,IAAI,CAAC,oBAAsB,EAAA;AAACH,YAAAA,EAAAA,CAAGI,IAAI,CAAC,IAAA;SAAM,EAAE,WAAA;AAC7C,YAAA,IAAI,CAACC,EAAE,CAACC,KAAK,GAAGN,EAAAA,CAAGO,IAAI,CAAC,IAAI,CAACR,EAAE,CAAClB,CAAC,EAAE,CAAA,EAAG,IAAI,CAACkB,EAAE,CAACT,CAAC,CAAA;AAC/C,YAAA,IAAI,CAACe,EAAE,CAACG,MAAM,GAAGR,GAAGO,IAAI,EAAA;AACxB,YAAA,IAAI,CAACF,EAAE,CAACI,SAAS,GAAGT,GAAGO,IAAI,EAAA;AAC3BL,YAAAA,IAAAA,CAAKQ,gBAAgB,CAAC,IAAI,EAAE,IAAI,CAACJ,KAAK,EAAE,IAAI,CAACE,MAAM,EAAE,IAAI,CAACC,SAAS,CAAA;AACnE,YAAA,IAAI,CAACE,OAAO,CAAC,IAAI,CAACF,SAAS,CAAA;AAC7B,SAAA,CAAA;QACA,OAAOX,KAAAA,CAAMD,kBAAkB,CAACE,EAAAA,CAAAA;AAClC;AACA,iEACAa,yBAAAA,CAA0Bd,KAA4B,EAAEC,EAAe,EAAE;QACvE,OAAOD,KAAAA,CAAMG,QAAQ,CAACY,IAAI,CAAC,IAAI,CAAChB,kBAAkB,CAACC,KAAAA,EAAOC,EAAK,CAAA,EAAA,CAAA,CAAA;AACjE;AACA,qDACAe,aAAAA,CAAchB,KAAoB,EAAEiB,YAAoB,EAAE;QACxD,MAAMf,EAAAA,GAAKF,MAAMG,QAAQ;AACzBH,QAAAA,KAAAA,CAAM7C,QAAQ,GAAG+C,EAAAA,CAAGgB,KAAK,EAAA,CAAGC,OAAO,CAACF,YAAAA,CAAAA;QACpCjB,KAAMoB,CAAAA,UAAU,GAAGlB,EAAGa,CAAAA,IAAI,CAAC1E,uBAA0B,GAAA,CAAA,CAAE,EAAG8E,CAAAA,OAAO,CAACF,YAAAA,CAAAA;AACpE;AACA,qBACQI,YACNrB,CAAAA,KAA4B,EAC5BsB,SAAsB,EACtBC,SAAsB,EACtBf,KAAkB,EAClBG,SAAsB,EACtB;QACA,MAAMT,EAAAA,GAAKF,MAAMG,QAAQ;QACzBD,EAAGG,CAAAA,IAAI,CACL,cACA,EAAA;AAACH,YAAAA,EAAAA,CAAGa,IAAI,CAAC,WAAA,CAAA;AAAcb,YAAAA,EAAAA,CAAGa,IAAI,CAAC,WAAA,CAAA;AAAcb,YAAAA,EAAAA,CAAGO,IAAI,CAAC,OAAA,CAAA;YAAUP,EAAGO,CAAAA,IAAI,CAAC,WAAA,CAAA,CAAae,GAAG;SAAG,EAC1F,WAAA;AACE,YAAA,IAAI,CAACjB,EAAE,CAACkB,SAAS,GAAGvB,EAAAA,CAAGwB,GAAG,CAAC,IAAI,CAACJ,SAAS,CAACtC,CAAC,EAAE,IAAA,CAAA;YAC7C,IAAI,CAACuB,EAAE,CAACoB,UAAU,GAAG,IAAI,CAACL,SAAS,CAACM,CAAC;YACrC,IAAI,CAACrB,EAAE,CAACsB,OAAO,GAAG,IAAI,CAACN,SAAS,CAACtB,EAAE;YACnC,IAAI,CAACM,EAAE,CAACuB,IAAI,GAAG,IAAI,CAACP,SAAS,CAACK,CAAC;YAC/B,IAAI,CAACrB,EAAE,CAACwB,SAAS,GAAG7B,GAAGI,IAAI,CAACJ,EAAG8B,CAAAA,GAAG,CAAC,IAAI,CAACV,SAAS,CAACvC,CAAC,CAAA,EAAGmB,EAAG+B,CAAAA,GAAG,CAAC,IAAI,CAACX,SAAS,CAACvC,CAAC,CAAA,CAAA;AAC7E,YAAA,IAAI,CAACwB,EAAE,CAACqB,CAAC,GAAG1B,EAAAA,CAAGwB,GAAG,CAAC,KAAA,EAAOxB,EAAGgC,CAAAA,GAAG,CAACxF,IAAKE,CAAAA,EAAE,GAAG,CAAG,EAAA,IAAI,CAAC+E,UAAU,CAAA,CAAA;AAC7D,YAAA,IAAI,CAACpB,EAAE,CAAC4B,MAAM,GAAGjC,EAAGkC,CAAAA,IAAI,CAAClC,EAAAA,CAAGmC,GAAG,CAAC,GAAK,EAAA,IAAI,CAACT,CAAC,CAAA,CAAA;YAC3C,IAAI,CAACrB,EAAE,CAAC+B,IAAI,GAAG,IAAI,CAAChB,SAAS,CAAC9B,CAAC;YAC/B,IAAI,CAACe,EAAE,CAACgC,EAAE,GAAGrC,GAAGgC,GAAG,CAAC,IAAI,CAACI,IAAI,EAAEpC,GAAGmC,GAAG,CAAC,IAAI,CAACZ,SAAS,EAAE,IAAI,CAACG,CAAC,EAAE,IAAI,CAACzE,QAAQ,CAAA,CAAA;AAC3E,YAAA,IAAI,CAACoD,EAAE,CAACiC,YAAY,GAAGtC,EAAAA,CAAGmC,GAAG,CAAC,IAAI,CAACN,SAAS,EAAE7B,EAAGuC,CAAAA,GAAG,CAAC,CAAG,EAAA,IAAI,CAACX,IAAI,CAAA,CAAA;YACjE,IAAI,CAACvB,EAAE,CAACmC,aAAa,GAAGxC,EAAGmC,CAAAA,GAAG,CAACnC,EAAAA,CAAGuC,GAAG,CAAC,IAAI,CAACjC,KAAK,CAACP,EAAE,EAAE,IAAI,CAAC4B,OAAO,CAAA,EAAG,IAAI,CAACC,IAAI,CAAA;AAC7E,YAAA,IAAI,CAACvB,EAAE,CAACoC,OAAO,GAAGzC,GAAG0C,SAAS,CAAC1C,EAAG2C,CAAAA,GAAG,CAAC,IAAI,CAACL,YAAY,EAAE,IAAI,CAACE,aAAa,CAAA,CAAA;AAC3E,YAAA,IAAI,CAACnC,EAAE,CAACuC,GAAG,GAAG5C,EAAAA,CAAG6C,GAAG,CAAC,IAAI,CAACJ,OAAO,EAAEzC,GAAGuC,GAAG,CAAC,IAAI,CAACjC,KAAK,CAACP,EAAE,EAAEC,EAAGmC,CAAAA,GAAG,CAAC,IAAI,CAACR,OAAO,EAAE,IAAI,CAACC,IAAI,CAAA,CAAA,CAAA;AACvF,YAAA,IAAI,CAACvB,EAAE,CAACyC,IAAI,GAAG9C,EAAAA,CAAGuC,GAAG,CACnBvC,EAAGmC,CAAAA,GAAG,CAAC,IAAI,CAACS,GAAG,EAAE,IAAI,CAAClB,CAAC,CACvB1B,EAAAA,EAAAA,CAAGmC,GAAG,CAAC,IAAI,CAACF,MAAM,EAAEc,YAAaC,CAAAA,cAAc,CAAC,IAAI,CAAA,CAAA,CAAA;YAEtD,IAAI,CAAC3C,EAAE,CAAC4C,OAAO,GAAGjD,GAAG+B,GAAG,CAAC,IAAI,CAACe,IAAI,CAAA;YAClC,IAAI,CAACzC,EAAE,CAAC6C,OAAO,GAAGlD,GAAG8B,GAAG,CAAC,IAAI,CAACgB,IAAI,CAAA;YAClC,IAAI,CAACzC,EAAE,CAAC8C,MAAM,GAAGnD,GAAGmC,GAAG,CAAC,IAAI,CAACM,OAAO,CAACW,EAAE,EAAE,IAAI,CAACf,EAAE,EAAE,IAAI,CAACd,SAAS,EAAE,IAAI,CAAC0B,OAAO,CAAA;YAC9E,IAAI,CAAC5C,EAAE,CAACgD,KAAK,GAAGrD,EAAGgC,CAAAA,GAAG,CAAChC,EAAGmC,CAAAA,GAAG,CAAC,IAAI,CAACe,OAAO,EAAE,IAAI,CAAC3B,SAAS,CAAA,EAAG,IAAI,CAACtE,QAAQ,CAAA;YAC1E,IAAI,CAACoD,EAAE,CAACiD,IAAI,GAAGtD,EAAGO,CAAAA,IAAI,CAAC,IAAI,CAAC4C,MAAM,CAACtE,CAAC,EAAE,IAAI,CAACwE,KAAK,EAAE,IAAI,CAACF,MAAM,CAAC7D,CAAC,CAAA;AAC/D,YAAA,IAAI,CAACe,EAAE,CAACkD,EAAE,GAAGvD,EAAGmC,CAAAA,GAAG,CAAC,IAAI,CAACT,CAAC,EAAE,IAAI,CAACH,SAAS,CAAA;YAC1C,IAAI,CAAClB,EAAE,CAACmD,CAAC,GAAGxD,EAAGO,CAAAA,IAAI,CACjBP,EAAGyD,CAAAA,GAAG,CAACzD,EAAGmC,CAAAA,GAAG,CAAC,IAAI,CAACM,OAAO,CAACW,EAAE,EAAE,IAAI,CAACG,EAAE,EAAE,IAAI,CAACN,OAAO,CAAA,CAAA,EACpDjD,GAAGuC,GAAG,CAAC,GAAGvC,EAAGmC,CAAAA,GAAG,CAAC,IAAI,CAACE,EAAE,EAAE,IAAI,CAACkB,EAAE,EAAE,IAAI,CAACL,OAAO,CAAA,CAAA,CAAA;AAEjD,YAAA,IAAI,CAACzC,SAAS,GAAGT,EAAAA,CAAGgC,GAAG,CAAC,IAAI,CAACwB,CAAC,CAACE,GAAG,EAAE,IAAI,CAACzG,QAAQ,CAAA;YACjD,IAAI,CAAC0D,OAAO,CAACX,EAAAA,CAAGmC,GAAG,CAAC,IAAI,CAACmB,IAAI,EAAEtD,GAAG2D,KAAK,CAAC3D,GAAGmC,GAAG,CAAC,IAAI,CAACZ,SAAS,EAAE,KAAA,CAAA,EAAQ,CAAG,EAAA,CAAA,CAAA,CAAA,CAAA;AAC5E,SAAA,CAAA;AAEF,QAAA,OAAOzB,KAAMqB,CAAAA,YAAY,CAACC,SAAAA,EAAWC,WAAWf,KAAOG,EAAAA,SAAAA,CAAAA;AACzD;qBAEA,gBAAQC,CACNZ,KAA4B,EAC5BQ,KAAkB,EAClBE,MAAmB,EACnBC,SAAsB,EACtB;QACA,MAAMT,EAAAA,GAAKF,MAAMG,QAAQ;AACzB,QAAA,MAAMC,OAAO,IAAI;QACjBF,EAAGG,CAAAA,IAAI,CACL,uBACA,EAAA;AAACH,YAAAA,EAAAA,CAAGO,IAAI,CAAC,OAAA,CAAA;YAAUP,EAAGO,CAAAA,IAAI,CAAC,QAAA,CAAA,CAAUe,GAAG,EAAA;YAAItB,EAAGO,CAAAA,IAAI,CAAC,WAAA,CAAA,CAAae,GAAG;SAAG,EACvE,WAAA;AACE,YAAA,IAAI,CAACd,MAAM,GAAG,IAAI,CAACF,KAAK;AACxB,YAAA,IAAI,CAACG,SAAS,GAAGT,EAAAA,CAAGO,IAAI,CAAC,CAAA,CAAA;AACzB,YAAA,IAAI,CAACqD,IAAI,CACP5D,GAAGgB,KAAK,CAAC,MACT,CACAhB,EAAAA,EAAAA,CAAG6D,SAAS,EAAA,CAAGC,IAAI,KAAK,OAAA,GAAU3H,0BAA0B,IAAI,CAACc,QAAQ,EACzE,WAAA;AACE,gBAAA,IAAI+C,EAAG6D,CAAAA,SAAS,EAAGC,CAAAA,IAAI,KAAK,OAAS,EAAA;AACnC,oBAAA,IAAI,CAACC,GAAG,CAAC/D,EAAAA,CAAGgE,gBAAgB,CAAC,IAAI,CAACxG,CAAC,EAAE,IAAI,CAACP,QAAQ,CAAG,EAAA,WAAA;AACnD,wBAAA,IAAI,CAACgH,MAAM,EAAA;AACb,qBAAA,CAAA;AACF;AACA,gBAAA,IAAI,CAAC5D,EAAE,CAAC6D,UAAU,GAAGlE,GAAGO,IAAI,EAAA;gBAC5B,IAAI,CAACF,EAAE,CAAC8D,OAAO,GAAGjE,IAAKiB,CAAAA,YAAY,CACjC,IAAI,EACJ,IAAI,CAACD,UAAU,CAACkD,EAAE,CAACpE,EAAAA,CAAGmC,GAAG,CAAC,IAAI,CAAC3E,CAAC,EAAE,CAAA,CAAA,CAAA,EAClC,IAAI,CAAC0D,UAAU,CAACkD,EAAE,CAACpE,GAAG2C,GAAG,CAAC3C,EAAGmC,CAAAA,GAAG,CAAC,IAAI,CAAC3E,CAAC,EAAE,IAAI,CAC7C,CAAA,CAAA,EAAA,IAAI,CAAC8C,KAAK,EACV,IAAI,CAAC4D,UAAU,CAAA;AAEjB,gBAAA,IAAI,CAAC1D,MAAM,GAAGR,EAAAA,CAAG2C,GAAG,CAAC,IAAI,CAACnC,MAAM,EAAE,IAAI,CAAC2D,OAAO,CAAA;AAC9C,gBAAA,IAAI,CAAC1D,SAAS,GAAGT,EAAAA,CAAG2C,GAAG,CAAC,IAAI,CAAClC,SAAS,EAAE,IAAI,CAACyD,UAAU,CAAA;AACzD,aAAA,CAAA;AAEJ,SAAA,CAAA;QAEFpE,KAAMuE,CAAAA,qBAAqB,CAAC/D,KAAAA,EAAOE,MAAQC,EAAAA,SAAAA,CAAAA;AAC7C;mEAEA6D,4BACExE,KAA4B,EAC5BQ,KAAkB,EAClBE,MAAmB,EACnBC,SAAsB,EACtB;AACA,QAAA,IAAI,CAACC,gBAAgB,CAACZ,KAAAA,EAAOQ,OAAOE,MAAQC,EAAAA,SAAAA,CAAAA;AAC9C;2DAEA8D,mBAAoBC,CAAAA,SAAoB,EAAE;AACxCA,QAAAA,SAAAA,CAAUC,QAAQ,CAAC,UAAY,EAAA,IAAI,CAACxI,SAAS,CAAA;AAC7CuI,QAAAA,SAAAA,CAAUC,QAAQ,CAAC,YAAc,EAAA,IAAI,CAACzI,WAAW,CAAA;AACnD;AACA,4CACA0I,IAAO,GAAA;QACL,OAAO,IAAA;AACT;AACA,+CACAC,OAAU,GAAA;QACR,OAAO,uBAAA;AACT;AACF;;;;"}
|
|
@@ -3,6 +3,7 @@ import '../material/lambert.js';
|
|
|
3
3
|
import '../material/blinn.js';
|
|
4
4
|
import '../material/unlit.js';
|
|
5
5
|
import '../material/particle.js';
|
|
6
|
+
import '../material/subsurfaceprofile.js';
|
|
6
7
|
import '@zephyr3d/device';
|
|
7
8
|
import '../values.js';
|
|
8
9
|
import '@zephyr3d/base';
|
|
@@ -11,10 +12,10 @@ import '../material/grassmaterial.js';
|
|
|
11
12
|
import '../material/terrain-cm.js';
|
|
12
13
|
import '../material/pbrmr.js';
|
|
13
14
|
import '../material/pbrsg.js';
|
|
15
|
+
import '../material/mtoon.js';
|
|
14
16
|
import '../material/pbrblueprint.js';
|
|
15
17
|
import '../material/sprite.js';
|
|
16
18
|
import '../material/sprite_std.js';
|
|
17
|
-
import '../material/msdf_text.js';
|
|
18
19
|
import '../utility/blueprint/material/texture.js';
|
|
19
20
|
|
|
20
21
|
class GlobalBindGroupAllocator {
|
|
@@ -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;;;;"}
|
package/dist/render/lightpass.js
CHANGED
|
@@ -1,21 +1,27 @@
|
|
|
1
1
|
import { RenderPass } from './renderpass.js';
|
|
2
|
-
import {
|
|
2
|
+
import { MaterialVaryingFlags, RENDER_PASS_TYPE_LIGHT, QUEUE_OPAQUE, QUEUE_TRANSPARENT } from '../values.js';
|
|
3
3
|
import { Vector4 } from '@zephyr3d/base';
|
|
4
4
|
import { ShaderHelper } from '../material/shader/helper.js';
|
|
5
5
|
import { PostEffectLayer } from '../posteffect/posteffect.js';
|
|
6
6
|
|
|
7
|
+
const SURFACE_MRT_FLAGS = MaterialVaryingFlags.SSR_STORE_ROUGHNESS | MaterialVaryingFlags.SSS_STORE_PROFILE | MaterialVaryingFlags.SSS_STORE_DIFFUSE | MaterialVaryingFlags.SSS_STORE_NORMAL | MaterialVaryingFlags.SSS_STORE_TRANSMISSION;
|
|
8
|
+
const ADDITIVE_LIGHT_PASS_OMIT_MRT_FLAGS = MaterialVaryingFlags.SSR_STORE_ROUGHNESS | MaterialVaryingFlags.SSS_STORE_PROFILE | MaterialVaryingFlags.SSS_STORE_NORMAL;
|
|
7
9
|
/**
|
|
8
10
|
* Forward render pass
|
|
9
11
|
* @internal
|
|
10
12
|
*/ class LightPass extends RenderPass {
|
|
11
13
|
/** @internal */ _shadowMapHash;
|
|
12
14
|
/** @internal */ _transmission;
|
|
15
|
+
/** @internal */ _renderOpaque;
|
|
16
|
+
/** @internal */ _renderTransparent;
|
|
13
17
|
/**
|
|
14
18
|
* Creates an instance of ForwardRenderPass
|
|
15
19
|
*/ constructor(){
|
|
16
20
|
super(RENDER_PASS_TYPE_LIGHT);
|
|
17
21
|
this._shadowMapHash = null;
|
|
18
22
|
this._transmission = false;
|
|
23
|
+
this._renderOpaque = true;
|
|
24
|
+
this._renderTransparent = true;
|
|
19
25
|
this._clearColor = Vector4.zero();
|
|
20
26
|
}
|
|
21
27
|
/** @internal */ get transmission() {
|
|
@@ -24,8 +30,54 @@ import { PostEffectLayer } from '../posteffect/posteffect.js';
|
|
|
24
30
|
set transmission(val) {
|
|
25
31
|
this._transmission = val;
|
|
26
32
|
}
|
|
33
|
+
/** @internal */ get renderOpaque() {
|
|
34
|
+
return this._renderOpaque;
|
|
35
|
+
}
|
|
36
|
+
set renderOpaque(val) {
|
|
37
|
+
this._renderOpaque = !!val;
|
|
38
|
+
}
|
|
39
|
+
/** @internal */ get renderTransparent() {
|
|
40
|
+
return this._renderTransparent;
|
|
41
|
+
}
|
|
42
|
+
set renderTransparent(val) {
|
|
43
|
+
this._renderTransparent = !!val;
|
|
44
|
+
}
|
|
45
|
+
/** @internal */ getAdditiveLightPassColorAttachments(ctx, materialFlags) {
|
|
46
|
+
const framebuffer = ctx.device.getFramebuffer();
|
|
47
|
+
if (!framebuffer) {
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
const attachments = [
|
|
51
|
+
framebuffer.getColorAttachments()[0]
|
|
52
|
+
];
|
|
53
|
+
if (materialFlags & MaterialVaryingFlags.SSS_STORE_DIFFUSE) {
|
|
54
|
+
attachments.push(ctx.SSSDiffuseTexture);
|
|
55
|
+
}
|
|
56
|
+
if (materialFlags & MaterialVaryingFlags.SSS_STORE_TRANSMISSION) {
|
|
57
|
+
attachments.push(ctx.SSSTransmissionTexture);
|
|
58
|
+
}
|
|
59
|
+
return attachments.length === 1 ? attachments[0] : attachments;
|
|
60
|
+
}
|
|
61
|
+
/** @internal */ selectTransparentOITShadowLight(ctx, renderQueue) {
|
|
62
|
+
const shadowMapInfo = ctx.shadowMapInfo;
|
|
63
|
+
if (!shadowMapInfo || shadowMapInfo.size === 0) {
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
if (renderQueue.primaryDirectionalLight && shadowMapInfo.has(renderQueue.primaryDirectionalLight)) {
|
|
67
|
+
return renderQueue.primaryDirectionalLight;
|
|
68
|
+
}
|
|
69
|
+
if (renderQueue.primaryTransmissionLight && shadowMapInfo.has(renderQueue.primaryTransmissionLight)) {
|
|
70
|
+
return renderQueue.primaryTransmissionLight;
|
|
71
|
+
}
|
|
72
|
+
for (const light of renderQueue.shadowedLights){
|
|
73
|
+
if (shadowMapInfo.has(light)) {
|
|
74
|
+
return light;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return shadowMapInfo.keys().next().value ?? null;
|
|
78
|
+
}
|
|
27
79
|
/** @internal */ _getGlobalBindGroupHash(ctx, camera) {
|
|
28
|
-
return `${this._shadowMapHash}:${ctx.lightBlending ? 1 : 0}:${camera.oit?.calculateHash() ?? ''}:${ctx.env.getHash(ctx)}:${ctx.materialFlags}:${ctx.linearDepthTexture?.uid ?? 0}:${ctx.sceneColorTexture?.uid ?? 0}:${ctx.HiZTexture?.uid ?? 0}`;
|
|
80
|
+
return `${this._shadowMapHash}:${ctx.currentShadowLight?.runtimeId ?? 0}:${ctx.lightBlending ? 1 : 0}:${camera.oit?.calculateHash() ?? ''}:${ctx.env.getHash(ctx)}:${ctx.materialFlags}:${ctx.linearDepthTexture?.uid ?? 0}:${ctx.sceneColorTexture?.uid ?? 0}:${ctx.HiZTexture?.uid ?? 0}`;
|
|
29
81
|
}
|
|
30
82
|
/** @internal */ renderLightPass(ctx, camera, itemList, lights, flags) {
|
|
31
83
|
const baseLightPass = !ctx.lightBlending;
|
|
@@ -64,8 +116,12 @@ import { PostEffectLayer } from '../posteffect/posteffect.js';
|
|
|
64
116
|
ctx.env = ctx.scene.env;
|
|
65
117
|
ctx.drawEnvLight = false;
|
|
66
118
|
ctx.flip = this.isAutoFlip(ctx);
|
|
67
|
-
const
|
|
68
|
-
const
|
|
119
|
+
const surfaceMRT = ctx.materialFlags & SURFACE_MRT_FLAGS;
|
|
120
|
+
const additiveOpaqueMaterialFlags = ctx.materialFlags & ~ADDITIVE_LIGHT_PASS_OMIT_MRT_FLAGS;
|
|
121
|
+
const additiveTransparentMaterialFlags = ctx.materialFlags & ~SURFACE_MRT_FLAGS;
|
|
122
|
+
const tmpFramebuffer = surfaceMRT ? ctx.device.pool.fetchTemporalFramebuffer(false, ctx.device.getDrawingBufferWidth(), ctx.device.getDrawingBufferHeight(), this.getAdditiveLightPassColorAttachments(ctx, additiveOpaqueMaterialFlags), ctx.device.getFramebuffer().getDepthAttachment()) : null;
|
|
123
|
+
const needsTransparentSingleColorFramebuffer = !!tmpFramebuffer && tmpFramebuffer.getColorAttachments().length > 1;
|
|
124
|
+
const transparentTmpFramebuffer = needsTransparentSingleColorFramebuffer ? ctx.device.pool.fetchTemporalFramebuffer(false, ctx.device.getDrawingBufferWidth(), ctx.device.getDrawingBufferHeight(), this.getAdditiveLightPassColorAttachments(ctx, additiveTransparentMaterialFlags), ctx.device.getFramebuffer().getDepthAttachment()) : tmpFramebuffer;
|
|
69
125
|
const oit = renderQueue.drawTransparent && camera.oit && camera.oit.supportDevice(ctx.device.type) ? camera.oit : null;
|
|
70
126
|
if (!oit && renderQueue.drawTransparent) {
|
|
71
127
|
renderQueue.sortTransparentItems(camera.getWorldPosition());
|
|
@@ -86,28 +142,61 @@ import { PostEffectLayer } from '../posteffect/posteffect.js';
|
|
|
86
142
|
];
|
|
87
143
|
const transparentPass = lists.length - 1;
|
|
88
144
|
for(let i = 0; i < lists.length; i++){
|
|
145
|
+
const isOpaquePass = i === 0;
|
|
146
|
+
if (isOpaquePass && !this._renderOpaque || !isOpaquePass && !this._renderTransparent) {
|
|
147
|
+
continue;
|
|
148
|
+
}
|
|
89
149
|
if (lists[i]) {
|
|
90
150
|
ctx.queue = i === 0 ? QUEUE_OPAQUE : QUEUE_TRANSPARENT;
|
|
91
151
|
ctx.oit = i === 0 || !items ? null : oit;
|
|
152
|
+
const isolateTransparentABufferLightPasses = !!ctx.oit && ctx.queue === QUEUE_TRANSPARENT && ctx.oit.getType() === 'ab';
|
|
92
153
|
if ((ctx.queue === QUEUE_TRANSPARENT || this._transmission) && ctx.scene.env.sky.fogPresents) {
|
|
93
154
|
ctx.materialFlags |= MaterialVaryingFlags.APPLY_FOG;
|
|
94
155
|
}
|
|
95
156
|
const numOitPasses = ctx.oit ? ctx.oit.begin(ctx) : 1;
|
|
96
157
|
for(let p = 0; p < numOitPasses; p++){
|
|
97
|
-
if (ctx.oit) {
|
|
158
|
+
if (ctx.oit && !isolateTransparentABufferLightPasses) {
|
|
98
159
|
if (!ctx.oit.beginPass(ctx, p)) {
|
|
99
160
|
continue;
|
|
100
161
|
}
|
|
101
162
|
}
|
|
163
|
+
const runLightPass = (lights)=>{
|
|
164
|
+
if (ctx.oit && isolateTransparentABufferLightPasses) {
|
|
165
|
+
if (!ctx.oit.beginPass(ctx, p)) {
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
this.renderLightPass(ctx, camera, lists[i], lights, flags);
|
|
169
|
+
ctx.oit.endPass(ctx, p);
|
|
170
|
+
} else {
|
|
171
|
+
this.renderLightPass(ctx, camera, lists[i], lights, flags);
|
|
172
|
+
}
|
|
173
|
+
};
|
|
174
|
+
const runAdditiveLightPass = (lights)=>{
|
|
175
|
+
const passFramebuffer = ctx.queue === QUEUE_TRANSPARENT ? transparentTmpFramebuffer : tmpFramebuffer;
|
|
176
|
+
if (ctx.lightBlending && passFramebuffer && !ctx.oit) {
|
|
177
|
+
const savedMaterialFlags = ctx.materialFlags;
|
|
178
|
+
ctx.materialFlags = ctx.queue === QUEUE_TRANSPARENT ? savedMaterialFlags & ~SURFACE_MRT_FLAGS : savedMaterialFlags & ~ADDITIVE_LIGHT_PASS_OMIT_MRT_FLAGS;
|
|
179
|
+
ctx.device.pushDeviceStates();
|
|
180
|
+
ctx.device.setFramebuffer(passFramebuffer);
|
|
181
|
+
try {
|
|
182
|
+
runLightPass(lights);
|
|
183
|
+
} finally{
|
|
184
|
+
ctx.materialFlags = savedMaterialFlags;
|
|
185
|
+
ctx.device.popDeviceStates();
|
|
186
|
+
}
|
|
187
|
+
} else {
|
|
188
|
+
runLightPass(lights);
|
|
189
|
+
}
|
|
190
|
+
};
|
|
102
191
|
let lightIndex = 0;
|
|
103
192
|
if (ctx.shadowMapInfo) {
|
|
104
193
|
for (const k of ctx.shadowMapInfo.keys()){
|
|
105
194
|
ctx.currentShadowLight = k;
|
|
106
195
|
ctx.lightBlending = lightIndex > 0;
|
|
107
196
|
this._shadowMapHash = ctx.shadowMapInfo.get(k).shaderHash;
|
|
108
|
-
|
|
197
|
+
runAdditiveLightPass([
|
|
109
198
|
k
|
|
110
|
-
]
|
|
199
|
+
]);
|
|
111
200
|
lightIndex++;
|
|
112
201
|
}
|
|
113
202
|
}
|
|
@@ -115,18 +204,9 @@ import { PostEffectLayer } from '../posteffect/posteffect.js';
|
|
|
115
204
|
ctx.currentShadowLight = null;
|
|
116
205
|
ctx.lightBlending = lightIndex > 0;
|
|
117
206
|
this._shadowMapHash = '';
|
|
118
|
-
|
|
119
|
-
ctx.materialFlags &= ~MaterialVaryingFlags.SSR_STORE_ROUGHNESS;
|
|
120
|
-
ctx.device.pushDeviceStates();
|
|
121
|
-
ctx.device.setFramebuffer(tmpFramebuffer);
|
|
122
|
-
}
|
|
123
|
-
this.renderLightPass(ctx, camera, lists[i], renderQueue.unshadowedLights, flags);
|
|
124
|
-
if (ctx.lightBlending && tmpFramebuffer) {
|
|
125
|
-
ctx.materialFlags |= MaterialVaryingFlags.SSR_STORE_ROUGHNESS;
|
|
126
|
-
ctx.device.popDeviceStates();
|
|
127
|
-
}
|
|
207
|
+
runAdditiveLightPass(renderQueue.unshadowedLights);
|
|
128
208
|
}
|
|
129
|
-
if (ctx.oit) {
|
|
209
|
+
if (ctx.oit && !isolateTransparentABufferLightPasses) {
|
|
130
210
|
ctx.oit.endPass(ctx, p);
|
|
131
211
|
}
|
|
132
212
|
}
|
|
@@ -151,12 +231,19 @@ import { PostEffectLayer } from '../posteffect/posteffect.js';
|
|
|
151
231
|
if (!renderQueue.needSceneColor() || ctx.sceneColorTexture) {
|
|
152
232
|
if (i === 0 || i === transparentPass) {
|
|
153
233
|
ctx.compositor?.drawPostEffects(ctx, i === 0 ? PostEffectLayer.opaque : PostEffectLayer.transparent, ctx.linearDepthTexture);
|
|
234
|
+
if (i === 0 && surfaceMRT && (ctx.device.getFramebuffer()?.getColorAttachments().length ?? 0) <= 1) {
|
|
235
|
+
ctx.materialFlags &= ~surfaceMRT;
|
|
236
|
+
}
|
|
154
237
|
}
|
|
155
238
|
}
|
|
156
239
|
}
|
|
157
240
|
if (tmpFramebuffer) {
|
|
158
241
|
ctx.device.pool.releaseFrameBuffer(tmpFramebuffer);
|
|
159
242
|
}
|
|
243
|
+
if (transparentTmpFramebuffer && transparentTmpFramebuffer !== tmpFramebuffer) {
|
|
244
|
+
ctx.device.pool.releaseFrameBuffer(transparentTmpFramebuffer);
|
|
245
|
+
}
|
|
246
|
+
ctx.oit = null;
|
|
160
247
|
}
|
|
161
248
|
}
|
|
162
249
|
|