@zephyr3d/scene 0.9.5 → 0.9.7
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/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 +21 -20
- 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 +134 -140
- 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 +20 -16
- package/dist/avatar/wardrobe.js.map +1 -1
- package/dist/camera/camera.js +416 -210
- package/dist/camera/camera.js.map +1 -1
- package/dist/index.d.ts +1350 -621
- 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 +105 -32
- 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/msdf_text.js +3 -3
- package/dist/material/msdf_text.js.map +1 -1
- package/dist/material/mtoon.js +574 -0
- package/dist/material/mtoon.js.map +1 -0
- package/dist/material/pbrblueprint.js +499 -336
- 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 +324 -294
- 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 +422 -96
- 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 +110 -23
- 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 +80 -66
- 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/text/font/cff_font.js +890 -0
- package/dist/text/font/cff_font.js.map +1 -0
- package/dist/text/font/font_asset.js +17 -3
- package/dist/text/font/font_asset.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 +327 -359
- 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
- package/dist/animation/ik/ik_chain_builder.js +0 -68
- package/dist/animation/ik/ik_chain_builder.js.map +0 -1
- package/dist/animation/ik/ik_pole_constraint.js +0 -123
- package/dist/animation/ik/ik_pole_constraint.js.map +0 -1
- package/dist/animation/ik/ik_track.js +0 -96
- package/dist/animation/ik/ik_track.js.map +0 -1
- package/dist/animation/ik_postprocessor.js +0 -71
- package/dist/animation/ik_postprocessor.js.map +0 -1
- package/dist/animation/joint_dynamics/math.js +0 -16
- package/dist/animation/joint_dynamics/math.js.map +0 -1
- package/dist/animation/manual_transform_processor.js +0 -156
- package/dist/animation/manual_transform_processor.js.map +0 -1
- package/dist/animation/skeleton_postprocessor.js +0 -50
- package/dist/animation/skeleton_postprocessor.js.map +0 -1
- package/dist/animation/spring2/collision.js +0 -469
- package/dist/animation/spring2/collision.js.map +0 -1
- package/dist/animation/spring2/constraints.js +0 -329
- package/dist/animation/spring2/constraints.js.map +0 -1
- package/dist/animation/spring2/controller.js +0 -434
- package/dist/animation/spring2/controller.js.map +0 -1
- package/dist/animation/spring2/math.js +0 -16
- package/dist/animation/spring2/math.js.map +0 -1
- package/dist/animation/spring2/solver.js +0 -624
- package/dist/animation/spring2/solver.js.map +0 -1
- package/dist/animation/spring2/spring_system.js +0 -118
- package/dist/animation/spring2/spring_system.js.map +0 -1
- package/dist/animation/spring2/types.js +0 -19
- package/dist/animation/spring2/types.js.map +0 -1
- package/dist/animation/spring_postprocessor.js +0 -54
- package/dist/animation/spring_postprocessor.js.map +0 -1
- package/dist/asset/loaders/gltf/gltf_loader.js +0 -1276
- package/dist/asset/loaders/gltf/gltf_loader.js.map +0 -1
- package/dist/asset/loaders/gltf/helpers.js +0 -331
- package/dist/asset/loaders/gltf/helpers.js.map +0 -1
- package/dist/material/sprite3d.js +0 -301
- package/dist/material/sprite3d.js.map +0 -1
- package/dist/material/sprite3d_std.js +0 -116
- package/dist/material/sprite3d_std.js.map +0 -1
- package/dist/material/sprite3dblueprint.js +0 -235
- package/dist/material/sprite3dblueprint.js.map +0 -1
- package/dist/material/sprite_sdf.js +0 -106
- package/dist/material/sprite_sdf.js.map +0 -1
- package/dist/material/terrainmaterial.js +0 -368
- package/dist/material/terrainmaterial.js.map +0 -1
- package/dist/node_modules/@zephyr3d/runtime/dist/runtime/runtimemgr.js +0 -38
- package/dist/node_modules/@zephyr3d/runtime/dist/runtime/runtimemgr.js.map +0 -1
- package/dist/node_modules/@zephyr3d/runtime/dist/runtime/runtimescript.js +0 -10
- package/dist/node_modules/@zephyr3d/runtime/dist/runtime/runtimescript.js.map +0 -1
- package/dist/node_modules/@zephyr3d/runtime/dist/runtime/scriptingsystem.js +0 -127
- package/dist/node_modules/@zephyr3d/runtime/dist/runtime/scriptingsystem.js.map +0 -1
- package/dist/node_modules/@zephyr3d/runtime/dist/runtime/scriptregistry.js +0 -263
- package/dist/node_modules/@zephyr3d/runtime/dist/runtime/scriptregistry.js.map +0 -1
- package/dist/render/deferredlightpass.js +0 -510
- package/dist/render/deferredlightpass.js.map +0 -1
- package/dist/render/deferredshadowlightpass.js +0 -428
- package/dist/render/deferredshadowlightpass.js.map +0 -1
- package/dist/render/gbufferpass.js +0 -50
- package/dist/render/gbufferpass.js.map +0 -1
- package/dist/scene/sdftextsprite.js +0 -322
- package/dist/scene/sdftextsprite.js.map +0 -1
- package/dist/scene/sprite3d.js +0 -18
- package/dist/scene/sprite3d.js.map +0 -1
- package/dist/scene/terrain/grass.js +0 -280
- package/dist/scene/terrain/grass.js.map +0 -1
- package/dist/scene/terrain/heightfield.js +0 -475
- package/dist/scene/terrain/heightfield.js.map +0 -1
- package/dist/scene/terrain/patch.js +0 -532
- package/dist/scene/terrain/patch.js.map +0 -1
- package/dist/scene/terrain/quadtree.js +0 -461
- package/dist/scene/terrain/quadtree.js.map +0 -1
- package/dist/scene/terrain/terrain.js +0 -231
- package/dist/scene/terrain/terrain.js.map +0 -1
- package/dist/src/animation/animation.js +0 -127
- package/dist/src/animation/animation.js.map +0 -1
- package/dist/src/animation/animationset.js +0 -255
- package/dist/src/animation/animationset.js.map +0 -1
- package/dist/src/animation/animationtrack.js +0 -34
- package/dist/src/animation/animationtrack.js.map +0 -1
- package/dist/src/animation/eulerrotationtrack.js +0 -52
- package/dist/src/animation/eulerrotationtrack.js.map +0 -1
- package/dist/src/animation/morphtarget.js +0 -93
- package/dist/src/animation/morphtarget.js.map +0 -1
- package/dist/src/animation/morphtrack.js +0 -70
- package/dist/src/animation/morphtrack.js.map +0 -1
- package/dist/src/animation/proptrack.js +0 -161
- package/dist/src/animation/proptrack.js.map +0 -1
- package/dist/src/animation/rotationtrack.js +0 -51
- package/dist/src/animation/rotationtrack.js.map +0 -1
- package/dist/src/animation/scaletrack.js +0 -50
- package/dist/src/animation/scaletrack.js.map +0 -1
- package/dist/src/animation/skeleton.js +0 -204
- package/dist/src/animation/skeleton.js.map +0 -1
- package/dist/src/animation/translationtrack.js +0 -50
- package/dist/src/animation/translationtrack.js.map +0 -1
- package/dist/src/app/app.js +0 -129
- package/dist/src/app/app.js.map +0 -1
- package/dist/src/app/inputmgr.js +0 -267
- package/dist/src/app/inputmgr.js.map +0 -1
- package/dist/src/asset/assetmanager.js +0 -404
- package/dist/src/asset/assetmanager.js.map +0 -1
- package/dist/src/asset/builtin.js +0 -337
- package/dist/src/asset/builtin.js.map +0 -1
- package/dist/src/asset/loaders/dds/dds.js +0 -470
- package/dist/src/asset/loaders/dds/dds.js.map +0 -1
- package/dist/src/asset/loaders/dds/dds_loader.js +0 -28
- package/dist/src/asset/loaders/dds/dds_loader.js.map +0 -1
- package/dist/src/asset/loaders/gltf/gltf_loader.js +0 -1265
- package/dist/src/asset/loaders/gltf/gltf_loader.js.map +0 -1
- package/dist/src/asset/loaders/gltf/helpers.js +0 -327
- package/dist/src/asset/loaders/gltf/helpers.js.map +0 -1
- package/dist/src/asset/loaders/hdr/hdr.js +0 -180
- package/dist/src/asset/loaders/hdr/hdr.js.map +0 -1
- package/dist/src/asset/loaders/image/tga_Loader.js +0 -116
- package/dist/src/asset/loaders/image/tga_Loader.js.map +0 -1
- package/dist/src/asset/loaders/image/webimage_loader.js +0 -63
- package/dist/src/asset/loaders/image/webimage_loader.js.map +0 -1
- package/dist/src/asset/loaders/loader.js +0 -45
- package/dist/src/asset/loaders/loader.js.map +0 -1
- package/dist/src/asset/model.js +0 -414
- package/dist/src/asset/model.js.map +0 -1
- package/dist/src/blitter/bilateralblur.js +0 -221
- package/dist/src/blitter/bilateralblur.js.map +0 -1
- package/dist/src/blitter/blitter.js +0 -390
- package/dist/src/blitter/blitter.js.map +0 -1
- package/dist/src/blitter/box.js +0 -118
- package/dist/src/blitter/box.js.map +0 -1
- package/dist/src/blitter/copy.js +0 -22
- package/dist/src/blitter/copy.js.map +0 -1
- package/dist/src/blitter/gaussianblur.js +0 -228
- package/dist/src/blitter/gaussianblur.js.map +0 -1
- package/dist/src/camera/base.js +0 -92
- package/dist/src/camera/base.js.map +0 -1
- package/dist/src/camera/camera.js +0 -1005
- package/dist/src/camera/camera.js.map +0 -1
- package/dist/src/camera/fps.js +0 -238
- package/dist/src/camera/fps.js.map +0 -1
- package/dist/src/camera/orbit.js +0 -245
- package/dist/src/camera/orbit.js.map +0 -1
- package/dist/src/camera/orthocamera.js +0 -167
- package/dist/src/camera/orthocamera.js.map +0 -1
- package/dist/src/camera/perspectivecamera.js +0 -141
- package/dist/src/camera/perspectivecamera.js.map +0 -1
- package/dist/src/index.js +0 -120
- package/dist/src/index.js.map +0 -1
- package/dist/src/material/blinn.js +0 -81
- package/dist/src/material/blinn.js.map +0 -1
- package/dist/src/material/grassmaterial.js +0 -113
- package/dist/src/material/grassmaterial.js.map +0 -1
- package/dist/src/material/lambert.js +0 -92
- package/dist/src/material/lambert.js.map +0 -1
- package/dist/src/material/material.js +0 -301
- package/dist/src/material/material.js.map +0 -1
- package/dist/src/material/meshmaterial.js +0 -704
- package/dist/src/material/meshmaterial.js.map +0 -1
- package/dist/src/material/mixins/albedocolor.js +0 -76
- package/dist/src/material/mixins/albedocolor.js.map +0 -1
- package/dist/src/material/mixins/foliage.js +0 -47
- package/dist/src/material/mixins/foliage.js.map +0 -1
- package/dist/src/material/mixins/lightmodel/blinnphong.js +0 -112
- package/dist/src/material/mixins/lightmodel/blinnphong.js.map +0 -1
- package/dist/src/material/mixins/lightmodel/lambert.js +0 -58
- package/dist/src/material/mixins/lightmodel/lambert.js.map +0 -1
- package/dist/src/material/mixins/lightmodel/pbrmetallicroughness.js +0 -178
- package/dist/src/material/mixins/lightmodel/pbrmetallicroughness.js.map +0 -1
- package/dist/src/material/mixins/lightmodel/pbrspecularglossness.js +0 -139
- package/dist/src/material/mixins/lightmodel/pbrspecularglossness.js.map +0 -1
- package/dist/src/material/mixins/lit.js +0 -476
- package/dist/src/material/mixins/lit.js.map +0 -1
- package/dist/src/material/mixins/pbr/common.js +0 -918
- package/dist/src/material/mixins/pbr/common.js.map +0 -1
- package/dist/src/material/mixins/texture.js +0 -172
- package/dist/src/material/mixins/texture.js.map +0 -1
- package/dist/src/material/mixins/vertexcolor.js +0 -56
- package/dist/src/material/mixins/vertexcolor.js.map +0 -1
- package/dist/src/material/particle.js +0 -178
- package/dist/src/material/particle.js.map +0 -1
- package/dist/src/material/pbrmr.js +0 -97
- package/dist/src/material/pbrmr.js.map +0 -1
- package/dist/src/material/pbrsg.js +0 -97
- package/dist/src/material/pbrsg.js.map +0 -1
- package/dist/src/material/shader/helper.js +0 -1209
- package/dist/src/material/shader/helper.js.map +0 -1
- package/dist/src/material/terrain-cm.js +0 -606
- package/dist/src/material/terrain-cm.js.map +0 -1
- package/dist/src/material/terrainmaterial.js +0 -375
- package/dist/src/material/terrainmaterial.js.map +0 -1
- package/dist/src/material/unlit.js +0 -41
- package/dist/src/material/unlit.js.map +0 -1
- package/dist/src/material/water.js +0 -417
- package/dist/src/material/water.js.map +0 -1
- package/dist/src/posteffect/bloom.js +0 -361
- package/dist/src/posteffect/bloom.js.map +0 -1
- package/dist/src/posteffect/compositor.js +0 -226
- package/dist/src/posteffect/compositor.js.map +0 -1
- package/dist/src/posteffect/fxaa.js +0 -273
- package/dist/src/posteffect/fxaa.js.map +0 -1
- package/dist/src/posteffect/grayscale.js +0 -69
- package/dist/src/posteffect/grayscale.js.map +0 -1
- package/dist/src/posteffect/motionblur.js +0 -96
- package/dist/src/posteffect/motionblur.js.map +0 -1
- package/dist/src/posteffect/posteffect.js +0 -126
- package/dist/src/posteffect/posteffect.js.map +0 -1
- package/dist/src/posteffect/sao.js +0 -324
- package/dist/src/posteffect/sao.js.map +0 -1
- package/dist/src/posteffect/ssr.js +0 -489
- package/dist/src/posteffect/ssr.js.map +0 -1
- package/dist/src/posteffect/taa.js +0 -172
- package/dist/src/posteffect/taa.js.map +0 -1
- package/dist/src/posteffect/tonemap.js +0 -94
- package/dist/src/posteffect/tonemap.js.map +0 -1
- package/dist/src/render/abuffer_oit.js +0 -361
- package/dist/src/render/abuffer_oit.js.map +0 -1
- package/dist/src/render/clipmap.js +0 -851
- package/dist/src/render/clipmap.js.map +0 -1
- package/dist/src/render/cluster_light.js +0 -333
- package/dist/src/render/cluster_light.js.map +0 -1
- package/dist/src/render/cull_visitor.js +0 -187
- package/dist/src/render/cull_visitor.js.map +0 -1
- package/dist/src/render/depthpass.js +0 -68
- package/dist/src/render/depthpass.js.map +0 -1
- package/dist/src/render/drawable_mixin.js +0 -227
- package/dist/src/render/drawable_mixin.js.map +0 -1
- package/dist/src/render/envlight.js +0 -463
- package/dist/src/render/envlight.js.map +0 -1
- package/dist/src/render/fbm_wavegenerator.js +0 -251
- package/dist/src/render/fbm_wavegenerator.js.map +0 -1
- package/dist/src/render/fft_wavegenerator.js +0 -1006
- package/dist/src/render/fft_wavegenerator.js.map +0 -1
- package/dist/src/render/fullscreenquad.js +0 -38
- package/dist/src/render/fullscreenquad.js.map +0 -1
- package/dist/src/render/gerstner_wavegenerator.js +0 -314
- package/dist/src/render/gerstner_wavegenerator.js.map +0 -1
- package/dist/src/render/globalbindgroup_allocator.js +0 -60
- package/dist/src/render/globalbindgroup_allocator.js.map +0 -1
- package/dist/src/render/hzb.js +0 -273
- package/dist/src/render/hzb.js.map +0 -1
- package/dist/src/render/lightpass.js +0 -172
- package/dist/src/render/lightpass.js.map +0 -1
- package/dist/src/render/objectcolorpass.js +0 -51
- package/dist/src/render/objectcolorpass.js.map +0 -1
- package/dist/src/render/primitive.js +0 -364
- package/dist/src/render/primitive.js.map +0 -1
- package/dist/src/render/render_queue.js +0 -467
- package/dist/src/render/render_queue.js.map +0 -1
- package/dist/src/render/renderbundle_wrapper.js +0 -152
- package/dist/src/render/renderbundle_wrapper.js.map +0 -1
- package/dist/src/render/renderer.js +0 -455
- package/dist/src/render/renderer.js.map +0 -1
- package/dist/src/render/renderpass.js +0 -200
- package/dist/src/render/renderpass.js.map +0 -1
- package/dist/src/render/shadowmap_pass.js +0 -56
- package/dist/src/render/shadowmap_pass.js.map +0 -1
- package/dist/src/render/sky.js +0 -1103
- package/dist/src/render/sky.js.map +0 -1
- package/dist/src/render/weightedblended_oit.js +0 -168
- package/dist/src/render/weightedblended_oit.js.map +0 -1
- package/dist/src/scene/batchgroup.js +0 -162
- package/dist/src/scene/batchgroup.js.map +0 -1
- package/dist/src/scene/environment.js +0 -209
- package/dist/src/scene/environment.js.map +0 -1
- package/dist/src/scene/graph_node.js +0 -72
- package/dist/src/scene/graph_node.js.map +0 -1
- package/dist/src/scene/light.js +0 -416
- package/dist/src/scene/light.js.map +0 -1
- package/dist/src/scene/mesh.js +0 -341
- package/dist/src/scene/mesh.js.map +0 -1
- package/dist/src/scene/octree.js +0 -649
- package/dist/src/scene/octree.js.map +0 -1
- package/dist/src/scene/particlesys.js +0 -738
- package/dist/src/scene/particlesys.js.map +0 -1
- package/dist/src/scene/raycast_visitor.js +0 -103
- package/dist/src/scene/raycast_visitor.js.map +0 -1
- package/dist/src/scene/scene.js +0 -284
- package/dist/src/scene/scene.js.map +0 -1
- package/dist/src/scene/scene_node.js +0 -732
- package/dist/src/scene/scene_node.js.map +0 -1
- package/dist/src/scene/terrain/grass.js +0 -278
- package/dist/src/scene/terrain/grass.js.map +0 -1
- package/dist/src/scene/terrain/heightfield.js +0 -475
- package/dist/src/scene/terrain/heightfield.js.map +0 -1
- package/dist/src/scene/terrain/patch.js +0 -530
- package/dist/src/scene/terrain/patch.js.map +0 -1
- package/dist/src/scene/terrain/quadtree.js +0 -461
- package/dist/src/scene/terrain/quadtree.js.map +0 -1
- package/dist/src/scene/terrain/terrain.js +0 -246
- package/dist/src/scene/terrain/terrain.js.map +0 -1
- package/dist/src/scene/terrain-cm/grass.js +0 -594
- package/dist/src/scene/terrain-cm/grass.js.map +0 -1
- package/dist/src/scene/terrain-cm/grassmaterial.js +0 -159
- package/dist/src/scene/terrain-cm/grassmaterial.js.map +0 -1
- package/dist/src/scene/terrain-cm/terrain-cm.js +0 -538
- package/dist/src/scene/terrain-cm/terrain-cm.js.map +0 -1
- package/dist/src/scene/water.js +0 -374
- package/dist/src/scene/water.js.map +0 -1
- package/dist/src/shaders/atmosphere.js +0 -957
- package/dist/src/shaders/atmosphere.js.map +0 -1
- package/dist/src/shaders/fog.js +0 -112
- package/dist/src/shaders/fog.js.map +0 -1
- package/dist/src/shaders/misc.js +0 -266
- package/dist/src/shaders/misc.js.map +0 -1
- package/dist/src/shaders/noise.js +0 -222
- package/dist/src/shaders/noise.js.map +0 -1
- package/dist/src/shaders/pbr.js +0 -51
- package/dist/src/shaders/pbr.js.map +0 -1
- package/dist/src/shaders/shadow.js +0 -636
- package/dist/src/shaders/shadow.js.map +0 -1
- package/dist/src/shaders/ssr.js +0 -490
- package/dist/src/shaders/ssr.js.map +0 -1
- package/dist/src/shaders/temporal.js +0 -215
- package/dist/src/shaders/temporal.js.map +0 -1
- package/dist/src/shaders/water.js +0 -756
- package/dist/src/shaders/water.js.map +0 -1
- package/dist/src/shadow/esm.js +0 -237
- package/dist/src/shadow/esm.js.map +0 -1
- package/dist/src/shadow/pcf_opt.js +0 -181
- package/dist/src/shadow/pcf_opt.js.map +0 -1
- package/dist/src/shadow/pcf_pd.js +0 -189
- package/dist/src/shadow/pcf_pd.js.map +0 -1
- package/dist/src/shadow/shader.js +0 -37
- package/dist/src/shadow/shader.js.map +0 -1
- package/dist/src/shadow/shadow_impl.js +0 -15
- package/dist/src/shadow/shadow_impl.js.map +0 -1
- package/dist/src/shadow/shadowmapper.js +0 -790
- package/dist/src/shadow/shadowmapper.js.map +0 -1
- package/dist/src/shadow/ssm.js +0 -159
- package/dist/src/shadow/ssm.js.map +0 -1
- package/dist/src/shadow/vsm.js +0 -297
- package/dist/src/shadow/vsm.js.map +0 -1
- package/dist/src/shapes/box.js +0 -386
- package/dist/src/shapes/box.js.map +0 -1
- package/dist/src/shapes/cylinder.js +0 -125
- package/dist/src/shapes/cylinder.js.map +0 -1
- package/dist/src/shapes/plane.js +0 -88
- package/dist/src/shapes/plane.js.map +0 -1
- package/dist/src/shapes/shape.js +0 -87
- package/dist/src/shapes/shape.js.map +0 -1
- package/dist/src/shapes/sphere.js +0 -114
- package/dist/src/shapes/sphere.js.map +0 -1
- package/dist/src/shapes/tetrahedron.js +0 -188
- package/dist/src/shapes/tetrahedron.js.map +0 -1
- package/dist/src/shapes/torus.js +0 -111
- package/dist/src/shapes/torus.js.map +0 -1
- package/dist/src/utility/aabbtree.js +0 -400
- package/dist/src/utility/aabbtree.js.map +0 -1
- package/dist/src/utility/bounding_volume.js +0 -29
- package/dist/src/utility/bounding_volume.js.map +0 -1
- package/dist/src/utility/debug.js +0 -28
- package/dist/src/utility/debug.js.map +0 -1
- package/dist/src/utility/draco/decoder.js +0 -116
- package/dist/src/utility/draco/decoder.js.map +0 -1
- package/dist/src/utility/misc.js +0 -105
- package/dist/src/utility/misc.js.map +0 -1
- package/dist/src/utility/panorama.js +0 -163
- package/dist/src/utility/panorama.js.map +0 -1
- package/dist/src/utility/pmrem.js +0 -354
- package/dist/src/utility/pmrem.js.map +0 -1
- package/dist/src/utility/rendermipmap.js +0 -115
- package/dist/src/utility/rendermipmap.js.map +0 -1
- package/dist/src/utility/serialization/json.js +0 -402
- package/dist/src/utility/serialization/json.js.map +0 -1
- package/dist/src/utility/serialization/manager.js +0 -623
- package/dist/src/utility/serialization/manager.js.map +0 -1
- package/dist/src/utility/serialization/scene/animation.js +0 -248
- package/dist/src/utility/serialization/scene/animation.js.map +0 -1
- package/dist/src/utility/serialization/scene/batch.js +0 -59
- package/dist/src/utility/serialization/scene/batch.js.map +0 -1
- package/dist/src/utility/serialization/scene/camera.js +0 -790
- package/dist/src/utility/serialization/scene/camera.js.map +0 -1
- package/dist/src/utility/serialization/scene/common.js +0 -222
- package/dist/src/utility/serialization/scene/common.js.map +0 -1
- package/dist/src/utility/serialization/scene/light.js +0 -575
- package/dist/src/utility/serialization/scene/light.js.map +0 -1
- package/dist/src/utility/serialization/scene/material.js +0 -1111
- package/dist/src/utility/serialization/scene/material.js.map +0 -1
- package/dist/src/utility/serialization/scene/mesh.js +0 -148
- package/dist/src/utility/serialization/scene/mesh.js.map +0 -1
- package/dist/src/utility/serialization/scene/misc.js +0 -39
- package/dist/src/utility/serialization/scene/misc.js.map +0 -1
- package/dist/src/utility/serialization/scene/node.js +0 -451
- package/dist/src/utility/serialization/scene/node.js.map +0 -1
- package/dist/src/utility/serialization/scene/particle.js +0 -425
- package/dist/src/utility/serialization/scene/particle.js.map +0 -1
- package/dist/src/utility/serialization/scene/primitive.js +0 -692
- package/dist/src/utility/serialization/scene/primitive.js.map +0 -1
- package/dist/src/utility/serialization/scene/scene.js +0 -704
- package/dist/src/utility/serialization/scene/scene.js.map +0 -1
- package/dist/src/utility/serialization/scene/terrain.js +0 -488
- package/dist/src/utility/serialization/scene/terrain.js.map +0 -1
- package/dist/src/utility/serialization/scene/water.js +0 -465
- package/dist/src/utility/serialization/scene/water.js.map +0 -1
- package/dist/src/utility/shprojector.js +0 -297
- package/dist/src/utility/shprojector.js.map +0 -1
- package/dist/src/utility/textures/ggxlut.js +0 -213
- package/dist/src/utility/textures/ggxlut.js.map +0 -1
- package/dist/src/utility/textures/gradientnoise.js +0 -62
- package/dist/src/utility/textures/gradientnoise.js.map +0 -1
- package/dist/src/utility/textures/randomnoise.js +0 -41
- package/dist/src/utility/textures/randomnoise.js.map +0 -1
- package/dist/src/values.js +0 -162
- package/dist/src/values.js.map +0 -1
- package/dist/utility/blueprint/material/common.js +0 -7
- package/dist/utility/blueprint/material/common.js.map +0 -1
- package/dist/utility/serialization/blueprint/constants.js +0 -255
- package/dist/utility/serialization/blueprint/constants.js.map +0 -1
- package/dist/utility/serialization/blueprint/material/constants.js +0 -203
- package/dist/utility/serialization/blueprint/material/constants.js.map +0 -1
- package/dist/utility/serialization/blueprint/material/texture.js +0 -165
- package/dist/utility/serialization/blueprint/material/texture.js.map +0 -1
- package/dist/utility/serialization/scene/cloth_script.js +0 -834
- package/dist/utility/serialization/scene/cloth_script.js.map +0 -1
- package/dist/utility/serialization/scene/spring_script.js +0 -596
- package/dist/utility/serialization/scene/spring_script.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grass.js","sources":["../../../src/scene/terrain-cm/grass.ts"],"sourcesContent":["import type { IndexBuffer, StructuredBuffer, Texture2D } from '@zephyr3d/device';\r\nimport type { Nullable, Vector4 } from '@zephyr3d/base';\r\nimport { AABB, ClipState, nextPowerOf2, DRef, DWeakRef, Disposable } from '@zephyr3d/base';\r\nimport type { DrawContext } from '../../render';\r\nimport { Primitive } from '../../render';\r\nimport { ClipmapGrassMaterial } from './grassmaterial';\r\nimport type { ClipmapTerrain } from './terrain-cm';\r\nimport type { Camera } from '../../camera';\r\nimport { getDevice } from '../../app/api';\r\n\r\nconst MAX_INSTANCES_PER_NODE = 2048;\r\n\r\n/**\r\n * Grass blade instance information\r\n * @public\r\n */\r\nexport type GrassInstanceInfo = {\r\n /** x position of the blade */\r\n x: number;\r\n /** y position of the blade */\r\n y: number;\r\n /** Rotation angle of the blade */\r\n angle: number;\r\n};\r\n// Two floats\r\nconst INSTANCE_BYTES = 4 * 4;\r\n\r\n/**\r\n * Grass glade instance manager class\r\n * @internal\r\n */\r\nexport class GrassInstances extends Disposable {\r\n private readonly _instances: GrassInstanceInfo[];\r\n private readonly _baseVertexBuffer: DRef<StructuredBuffer>;\r\n private readonly _indexBuffer: DRef<IndexBuffer>;\r\n private readonly _instanceBuffer: DRef<StructuredBuffer>;\r\n private readonly _primitive: DRef<Primitive>;\r\n constructor(baseVertexBuffer: StructuredBuffer, indexBuffer: IndexBuffer) {\r\n super();\r\n this._instances = [];\r\n this._baseVertexBuffer = new DRef(baseVertexBuffer);\r\n this._indexBuffer = new DRef(indexBuffer);\r\n this._instanceBuffer = new DRef();\r\n this._primitive = new DRef();\r\n }\r\n get numInstances() {\r\n return this._instances.length;\r\n }\r\n get instanceBuffer() {\r\n return this._instanceBuffer.get()!;\r\n }\r\n setBaseVertexBuffer(baseVertexBuffer: StructuredBuffer) {\r\n if (baseVertexBuffer !== this._baseVertexBuffer.get()) {\r\n this._baseVertexBuffer.set(baseVertexBuffer);\r\n this._primitive.dispose();\r\n }\r\n }\r\n draw() {\r\n if (this._instances.length > 0) {\r\n if (!this._primitive.get()) {\r\n const primitive = new Primitive();\r\n primitive.setVertexBuffer(this._baseVertexBuffer.get()!);\r\n primitive.setVertexBuffer(this._instanceBuffer.get()!, 'instance');\r\n primitive.setIndexBuffer(this._indexBuffer.get());\r\n primitive.primitiveType = 'triangle-list';\r\n primitive.indexStart = 0;\r\n primitive.indexCount = this._indexBuffer.get()!.length;\r\n this._primitive.set(primitive);\r\n }\r\n this._primitive.get()!.drawInstanced(this._instances.length);\r\n }\r\n }\r\n updateBuffers() {\r\n const device = getDevice();\r\n if (this._instances.length === 0) {\r\n this._instanceBuffer.set(null);\r\n return;\r\n }\r\n if (this._instances.length > 0 && !this._instanceBuffer.get()) {\r\n this._instanceBuffer.set(\r\n device.createVertexBuffer('tex1_f32x4', new Uint8Array(this._instances.length * INSTANCE_BYTES))\r\n );\r\n }\r\n let buffer = this._instanceBuffer.get()!;\r\n const currentBytes = buffer.byteLength;\r\n const bytesRequired = this._instances.length * INSTANCE_BYTES;\r\n if (currentBytes < bytesRequired) {\r\n buffer = device.createVertexBuffer('tex1_f32x4', new Uint8Array(nextPowerOf2(bytesRequired)))!;\r\n this._instanceBuffer.set(buffer);\r\n this._primitive.dispose();\r\n }\r\n const data = new Float32Array(4 * this._instances.length);\r\n for (let i = 0; i < this._instances.length; i++) {\r\n data[i * 4 + 0] = this._instances[i].x;\r\n data[i * 4 + 1] = this._instances[i].y;\r\n data[i * 4 + 2] = Math.sin(this._instances[i].angle);\r\n data[i * 4 + 3] = Math.cos(this._instances[i].angle);\r\n }\r\n buffer.bufferSubData(0, data);\r\n }\r\n removeInstances(minX: number, minZ: number, maxX: number, maxZ: number, num: number) {\r\n if (num <= 0) {\r\n return 0;\r\n }\r\n let removed = 0;\r\n for (let i = this._instances.length - 1; i >= 0; i--) {\r\n const instance = this._instances[i];\r\n if (instance.x >= minX && instance.x <= maxX && instance.y >= minZ && instance.y <= maxZ) {\r\n this._instances.splice(i, 1);\r\n removed++;\r\n if (removed === num) {\r\n break;\r\n }\r\n }\r\n }\r\n if (removed > 0) {\r\n this.updateBuffers();\r\n }\r\n return removed;\r\n }\r\n addInstances(instances: GrassInstanceInfo[]) {\r\n this._instances.push(...instances);\r\n this.updateBuffers();\r\n }\r\n protected onDispose() {\r\n super.onDispose();\r\n this._baseVertexBuffer.dispose();\r\n this._indexBuffer.dispose();\r\n this._instanceBuffer.dispose();\r\n this._primitive.dispose();\r\n }\r\n}\r\n\r\n/**\r\n * Grass layer class\r\n * @public\r\n */\r\nexport class GrassLayer extends Disposable {\r\n private static readonly _indexBuffer: DRef<IndexBuffer> = new DRef();\r\n private readonly _material: DRef<ClipmapGrassMaterial>;\r\n private readonly _quadtree: DRef<GrassQuadtreeNode>;\r\n private _bladeWidth: number;\r\n private _bladeHeight: number;\r\n private readonly _baseVertexBuffer: DRef<StructuredBuffer>;\r\n /**\r\n * Creates an instance of GrassLayer\r\n * @param terrain - Clipmap terrain object\r\n * @param bladeWidth - Grass blade width\r\n * @param bladeHeight - Grass blade height\r\n * @param albedoMap - Albedo texture for the blade\r\n */\r\n constructor(terrain: ClipmapTerrain, bladeWidth: number, bladeHeight: number, albedoMap?: Texture2D) {\r\n super();\r\n this._material = new DRef(new ClipmapGrassMaterial(terrain));\r\n this._material.get()!.albedoTexture = albedoMap ?? null;\r\n if (albedoMap) {\r\n this._material.get()!.setTextureSize(albedoMap.width, albedoMap.height);\r\n }\r\n this._bladeWidth = bladeWidth;\r\n this._bladeHeight = bladeHeight;\r\n this._baseVertexBuffer = new DRef(this.createBaseVertexBuffer(this._bladeWidth, this._bladeHeight));\r\n this._quadtree = new DRef(\r\n new GrassQuadtreeNode(this._baseVertexBuffer.get()!, GrassLayer._getIndexBuffer()!)\r\n );\r\n }\r\n /** @internal */\r\n get quadtree() {\r\n return this._quadtree.get();\r\n }\r\n /** @internal */\r\n updateMaterial() {\r\n this._material.get()!.uniformChanged();\r\n }\r\n /**\r\n * Sets the albedo texture of grass blades in this layer\r\n * @param albedoMap - Albedo texture to set\r\n */\r\n setAlbedoMap(albedoMap: Texture2D) {\r\n this._material.get()!.albedoTexture = albedoMap;\r\n if (albedoMap) {\r\n this._material.get()!.setTextureSize(albedoMap.width, albedoMap.height);\r\n }\r\n }\r\n /**\r\n * Gets the albedo texture of grass blades in this layer\r\n * @returns - Albedo texture of grass blades in this layer\r\n */\r\n getAlbedoMap() {\r\n return this._material.get()!.albedoTexture;\r\n }\r\n /**\r\n * Add grass blades to this layer in a region\r\n * @param instances - Grass blade instances to add\r\n */\r\n addInstances(instances: GrassInstanceInfo[]) {\r\n return this._quadtree.get()!.addInstances(instances);\r\n }\r\n /**\r\n * Remove grass blades to this layer in a region\r\n * @param minX - Minimum x position of the region\r\n * @param minZ - Minimum z position of the region\r\n * @param maxX - Maximum x position of the region\r\n * @param maxZ - Maximum z position of the region\r\n * @param numInstances - How many grass blades to add\r\n */\r\n removeInstances(minX: number, minZ: number, maxX: number, maxZ: number, numInstances: number) {\r\n this._quadtree.get()!.removeInstances(minX, minZ, maxX, maxZ, numInstances);\r\n }\r\n /** Grass blade width in this layer */\r\n get bladeWidth() {\r\n return this._bladeWidth;\r\n }\r\n set bladeWidth(val: number) {\r\n this.setBladeSize(val, this._bladeHeight);\r\n }\r\n /** Grass blade height in this layer */\r\n get bladeHeight() {\r\n return this._bladeHeight;\r\n }\r\n set bladeHeight(val: number) {\r\n this.setBladeSize(this._bladeWidth, val);\r\n }\r\n /**\r\n * Sets the size of grass blades in this layer\r\n * @param width - Grass blade width\r\n * @param height - Grass blade height\r\n */\r\n setBladeSize(width: number, height: number) {\r\n if (width !== this._bladeWidth || height !== this._bladeHeight) {\r\n this._bladeWidth = width;\r\n this._bladeHeight = height;\r\n this._baseVertexBuffer.set(this.createBaseVertexBuffer(this._bladeWidth, this._bladeHeight));\r\n this._quadtree.get()!.setBaseVertexBuffer(this._baseVertexBuffer.get()!);\r\n }\r\n }\r\n /** @internal */\r\n private static _getIndexBuffer() {\r\n if (!this._indexBuffer.get()) {\r\n this._indexBuffer.set(\r\n getDevice().createIndexBuffer(\r\n new Uint16Array([0, 1, 2, 0, 2, 3, 4, 5, 6, 4, 6, 7, 8, 9, 10, 8, 10, 11])\r\n )\r\n );\r\n }\r\n return this._indexBuffer.get();\r\n }\r\n /** @internal */\r\n private createBaseVertexBuffer(bladeWidth: number, bladeHeight: number) {\r\n const device = getDevice();\r\n const r = bladeWidth * 0.5;\r\n const t = bladeHeight;\r\n const c = r * Math.cos(Math.PI / 3);\r\n const s = r * Math.sin(Math.PI / 3);\r\n const vertices = new Float32Array([\r\n r,\r\n 0,\r\n 0,\r\n 0,\r\n 1,\r\n r,\r\n t,\r\n 0,\r\n 0,\r\n 0,\r\n -r,\r\n t,\r\n 0,\r\n 1,\r\n 0,\r\n -r,\r\n 0,\r\n 0,\r\n 1,\r\n 1,\r\n\r\n c,\r\n 0,\r\n s,\r\n 0,\r\n 1,\r\n -c,\r\n 0,\r\n -s,\r\n 1,\r\n 1,\r\n -c,\r\n t,\r\n -s,\r\n 1,\r\n 0,\r\n c,\r\n t,\r\n s,\r\n 0,\r\n 0,\r\n\r\n -c,\r\n 0,\r\n s,\r\n 0,\r\n 1,\r\n c,\r\n 0,\r\n -s,\r\n 1,\r\n 1,\r\n c,\r\n t,\r\n -s,\r\n 1,\r\n 0,\r\n -c,\r\n t,\r\n s,\r\n 0,\r\n 0\r\n ]);\r\n return device.createInterleavedVertexBuffer(['position_f32x3', 'tex0_f32x2'], vertices);\r\n }\r\n /** @internal */\r\n draw(ctx: DrawContext, region: Vector4, minY: number, maxY: number) {\r\n this._material.get()!.apply(ctx);\r\n for (let pass = 0; pass < this._material.get()!.numPasses; pass++) {\r\n this._material.get()!.bind(ctx.device, pass);\r\n this._quadtree.get()!.draw(ctx.camera, region, minY, maxY, false);\r\n }\r\n }\r\n /** @internal */\r\n protected onDispose() {\r\n super.onDispose();\r\n this._material.dispose();\r\n this._quadtree.dispose();\r\n this._baseVertexBuffer.dispose();\r\n }\r\n}\r\n/**\r\n * Grass renderer for clipmap terrain\r\n * @public\r\n */\r\nexport class GrassRenderer extends Disposable {\r\n private readonly _terrain: DWeakRef<ClipmapTerrain>;\r\n private _numGrassBlades: number;\r\n private _layers: GrassLayer[];\r\n /**\r\n * Creates an instance of GrassRenderer\r\n * @param terrain - Clipmap terrain object\r\n */\r\n constructor(terrain: ClipmapTerrain) {\r\n super();\r\n this._terrain = new DWeakRef(terrain);\r\n this._numGrassBlades = 0;\r\n this._layers = [];\r\n }\r\n /** @internal */\r\n updateMaterial() {\r\n for (const layer of this._layers) {\r\n layer.updateMaterial();\r\n }\r\n }\r\n /** How many grass blades */\r\n get numGrassBlades() {\r\n return this._numGrassBlades;\r\n }\r\n /** How many grass layers */\r\n get numLayers() {\r\n return this._layers.length;\r\n }\r\n /**\r\n * Gets the grass layer at given index\r\n * @param index - Index of the grass layer\r\n * @returns The grass layer at the index\r\n */\r\n getLayer(index: number) {\r\n return this._layers[index];\r\n }\r\n /**\r\n * Adds a grass layer\r\n * @param bladeWidth - Width of grass blades in this layer\r\n * @param bladeHeight - Height of grass blades in this layer\r\n * @param albedoMap - Albedo texture of grass blades in this layer\r\n * @returns Index of the added grass layer\r\n */\r\n addLayer(bladeWidth: number, bladeHeight: number, albedoMap?: Texture2D) {\r\n const layer = new GrassLayer(this._terrain.get()!, bladeWidth, bladeHeight, albedoMap);\r\n this._layers.push(layer);\r\n return this._layers.length - 1;\r\n }\r\n /**\r\n * Gets the albedo texture of grass blades in the grass layer at given index\r\n * @param layer - Index of the grass layer to get\r\n * @returns Albedo texture of grass blades in the grass layer\r\n */\r\n getGrassTexture(layer: number) {\r\n return this._layers[layer]?.getAlbedoMap() ?? null;\r\n }\r\n /**\r\n * Sets the albedo texture of grass blades in the grass layer at given index\r\n * @param layer - Index of the grass layer to set\r\n * @param texture - Albedo texture to set\r\n */\r\n setGrassTexture(layer: number, texture: Texture2D) {\r\n const grassLayer = this._layers[layer];\r\n if (grassLayer) {\r\n grassLayer.setAlbedoMap(texture);\r\n } else {\r\n console.error(`Invalid grass layer: ${layer}`);\r\n }\r\n }\r\n /**\r\n * Gets width of the grass blades in the grass layer at given index\r\n * @param layer - Index of the grass layer\r\n * @returns Width of the grass blades in the layer\r\n */\r\n getBladeWidth(layer: number) {\r\n return this._layers[layer]?.bladeWidth ?? 0;\r\n }\r\n /**\r\n * Gets height of the grass blades in the grass layer at given index\r\n * @param layer - Index of the grass layer\r\n * @returns Height of the grass blades in the layer\r\n */\r\n getBladeHeight(layer: number) {\r\n return this._layers[layer]?.bladeHeight ?? 0;\r\n }\r\n /**\r\n * Sets size of the grass blades in the grass layer at given index\r\n * @param layer - Index of the grass layer\r\n * @param width - Width to set\r\n * @param height - Height to set\r\n */\r\n setBladeSize(layer: number, width: number, height: number) {\r\n const grassLayer = this._layers[layer];\r\n if (grassLayer) {\r\n grassLayer.setBladeSize(width, height);\r\n } else {\r\n console.error(`Invalid grass layer: ${layer}`);\r\n }\r\n }\r\n /**\r\n * Add grass instances to the grass layer at given index\r\n * @param layer - Index of the grass layer\r\n * @param instances - Grass blade instances to add\r\n */\r\n addInstances(layer: number, instances: GrassInstanceInfo[]) {\r\n const grassLayer = this._layers[layer];\r\n if (!grassLayer) {\r\n console.error(`Invalid grass layer: ${layer}`);\r\n } else {\r\n this._numGrassBlades += grassLayer.addInstances(instances);\r\n }\r\n }\r\n /**\r\n * Remove grass instances from the grass layer at given index within a region\r\n * @param layer - Index of the grass layer\r\n * @param minX - Minimum x of the region\r\n * @param minZ - Minimum z of the region\r\n * @param maxX - Maximum x of the region\r\n * @param maxZ - Maximum z of the region\r\n * @param num - How many grass blades to remove\r\n */\r\n removeInstances(layer: number, minX: number, minZ: number, maxX: number, maxZ: number, num: number) {\r\n const grassLayer = this._layers[layer];\r\n if (!grassLayer) {\r\n console.error(`Invalid grass layer: ${layer}`);\r\n } else {\r\n grassLayer.removeInstances(minX, minZ, maxX, maxZ, num);\r\n }\r\n }\r\n /** @internal */\r\n draw(ctx: DrawContext) {\r\n const bv = this._terrain.get()!.getWorldBoundingVolume()!.toAABB();\r\n const minY = bv.minPoint.y;\r\n const maxY = bv.maxPoint.y;\r\n for (const layer of this._layers) {\r\n layer.draw(ctx, this._terrain.get()!.worldRegion, minY - layer.bladeHeight, maxY + layer.bladeHeight);\r\n }\r\n }\r\n protected onDispose() {\r\n super.onDispose();\r\n this._terrain.dispose();\r\n for (const layer of this._layers) {\r\n layer.dispose();\r\n }\r\n }\r\n}\r\n\r\n/** @internal */\r\nexport class GrassQuadtreeNode extends Disposable {\r\n private static readonly _cullAABB = new AABB();\r\n private readonly _grassInstances: DRef<GrassInstances>;\r\n private _children: Nullable<GrassQuadtreeNode[]>;\r\n private readonly _baseVertexBuffer: DRef<StructuredBuffer>;\r\n private readonly _indexBuffer: DRef<IndexBuffer>;\r\n private _minX: number;\r\n private _minZ: number;\r\n private _maxX: number;\r\n private _maxZ: number;\r\n constructor(baseVertexBuffer: StructuredBuffer, indexBuffer: IndexBuffer) {\r\n super();\r\n this._baseVertexBuffer = new DRef(baseVertexBuffer);\r\n this._indexBuffer = new DRef(indexBuffer);\r\n this._grassInstances = new DRef(new GrassInstances(baseVertexBuffer, indexBuffer));\r\n this._children = null;\r\n this._minX = 0;\r\n this._minZ = 0;\r\n this._maxX = 1;\r\n this._maxZ = 1;\r\n }\r\n get grassInstances() {\r\n return this._grassInstances.get();\r\n }\r\n get children() {\r\n return this._children;\r\n }\r\n draw(camera: Camera, region: Vector4, minY: number, maxY: number, skipClipTest: boolean) {\r\n if (!skipClipTest) {\r\n const cullAABB = GrassQuadtreeNode._cullAABB;\r\n const x = region.x;\r\n const z = region.y;\r\n const dx = region.z - x;\r\n const dz = region.w - z;\r\n cullAABB.minPoint.setXYZ(x + this._minX * dx, minY, z + this._minZ * dz);\r\n cullAABB.maxPoint.setXYZ(x + this._maxX * dx, maxY, z + this._maxZ * dz);\r\n const clipState = camera.clipMask\r\n ? cullAABB.getClipStateWithFrustumMask(camera.frustum, camera.clipMask)\r\n : cullAABB.getClipStateWithFrustum(camera.frustum);\r\n if (clipState === ClipState.NOT_CLIPPED) {\r\n return;\r\n }\r\n skipClipTest = clipState === ClipState.A_INSIDE_B;\r\n }\r\n if (this._grassInstances.get()!.numInstances > 0) {\r\n this._grassInstances.get()!.draw();\r\n }\r\n if (this._children) {\r\n for (const child of this._children) {\r\n child.draw(camera, region, minY, maxY, skipClipTest);\r\n }\r\n }\r\n }\r\n setBaseVertexBuffer(baseVertexBuffer: StructuredBuffer) {\r\n if (baseVertexBuffer !== this._baseVertexBuffer.get()) {\r\n this._baseVertexBuffer.set(baseVertexBuffer);\r\n this._grassInstances.get()!.setBaseVertexBuffer(baseVertexBuffer);\r\n if (this._children) {\r\n for (const child of this._children) {\r\n child.setBaseVertexBuffer(baseVertexBuffer);\r\n }\r\n }\r\n }\r\n }\r\n removeInstances(minX: number, minZ: number, maxX: number, maxZ: number, numInstances: number) {\r\n let n = Math.min(this._grassInstances.get()!.numInstances, numInstances);\r\n if (n <= 0) {\r\n return 0;\r\n }\r\n let removed = 0;\r\n if (this._children) {\r\n for (const child of this._children) {\r\n if (child._minX < maxX && child._minZ < maxZ && child._maxX > minX && child._maxZ > minZ) {\r\n removed += child.removeInstances(minX, minZ, maxX, maxZ, n);\r\n n -= removed;\r\n }\r\n }\r\n }\r\n if (n > 0) {\r\n removed += this._grassInstances.get()!.removeInstances(minX, minZ, maxX, maxZ, n);\r\n }\r\n return removed;\r\n }\r\n addInstances(instances: GrassInstanceInfo[]) {\r\n if (instances.length === 0) {\r\n return 0;\r\n }\r\n let n = Math.min(instances.length, MAX_INSTANCES_PER_NODE - this._grassInstances.get()!.numInstances);\r\n this._grassInstances.get()!.addInstances(instances.slice(0, n));\r\n if (n < instances.length) {\r\n if (!this._children) {\r\n this._children = [\r\n new GrassQuadtreeNode(this._baseVertexBuffer.get()!, this._indexBuffer.get()!),\r\n new GrassQuadtreeNode(this._baseVertexBuffer.get()!, this._indexBuffer.get()!),\r\n new GrassQuadtreeNode(this._baseVertexBuffer.get()!, this._indexBuffer.get()!),\r\n new GrassQuadtreeNode(this._baseVertexBuffer.get()!, this._indexBuffer.get()!)\r\n ];\r\n this._children[0]._minX = this._minX;\r\n this._children[0]._minZ = this._minZ;\r\n this._children[0]._maxX = (this._minX + this._maxX) * 0.5;\r\n this._children[0]._maxZ = (this._minZ + this._maxZ) * 0.5;\r\n this._children[1]._minX = this._children[0]._maxX;\r\n this._children[1]._minZ = this._minZ;\r\n this._children[1]._maxX = this._maxX;\r\n this._children[1]._maxZ = this._children[0]._maxZ;\r\n this._children[2]._minX = this._minX;\r\n this._children[2]._minZ = this._children[0]._maxZ;\r\n this._children[2]._maxX = this._children[0]._maxX;\r\n this._children[2]._maxZ = this._maxZ;\r\n this._children[3]._minX = this._children[0]._maxX;\r\n this._children[3]._minZ = this._children[0]._maxZ;\r\n this._children[3]._maxX = this._maxX;\r\n this._children[3]._maxZ = this._maxZ;\r\n }\r\n instances = instances.slice(n);\r\n for (const child of this._children) {\r\n if (instances.length > 0) {\r\n const childInstances = instances.filter(\r\n (val) =>\r\n val.x >= child._minX && val.y >= child._minZ && val.x < child._maxX && val.y < child._maxZ\r\n );\r\n n += child.addInstances(childInstances);\r\n instances = instances.filter(\r\n (val) =>\r\n !(val.x >= child._minX && val.y >= child._minZ && val.x < child._maxX && val.y < child._maxZ)\r\n );\r\n }\r\n }\r\n }\r\n return n;\r\n }\r\n protected onDispose() {\r\n super.onDispose();\r\n this._baseVertexBuffer.dispose();\r\n this._indexBuffer.dispose();\r\n this._grassInstances.dispose();\r\n if (this._children) {\r\n for (const child of this._children) {\r\n child.dispose();\r\n }\r\n }\r\n }\r\n}\r\n"],"names":["MAX_INSTANCES_PER_NODE","INSTANCE_BYTES","GrassInstances","Disposable","_instances","_baseVertexBuffer","_indexBuffer","_instanceBuffer","_primitive","baseVertexBuffer","indexBuffer","DRef","numInstances","length","instanceBuffer","get","setBaseVertexBuffer","set","dispose","draw","primitive","Primitive","setVertexBuffer","setIndexBuffer","primitiveType","indexStart","indexCount","drawInstanced","updateBuffers","device","getDevice","createVertexBuffer","Uint8Array","buffer","currentBytes","byteLength","bytesRequired","nextPowerOf2","data","Float32Array","i","x","y","Math","sin","angle","cos","bufferSubData","removeInstances","minX","minZ","maxX","maxZ","num","removed","instance","splice","addInstances","instances","push","onDispose","GrassLayer","_material","_quadtree","_bladeWidth","_bladeHeight","terrain","bladeWidth","bladeHeight","albedoMap","ClipmapGrassMaterial","albedoTexture","setTextureSize","width","height","createBaseVertexBuffer","GrassQuadtreeNode","_getIndexBuffer","quadtree","updateMaterial","uniformChanged","setAlbedoMap","getAlbedoMap","val","setBladeSize","createIndexBuffer","Uint16Array","r","t","c","PI","s","vertices","createInterleavedVertexBuffer","ctx","region","minY","maxY","apply","pass","numPasses","bind","camera","GrassRenderer","_terrain","_numGrassBlades","_layers","DWeakRef","layer","numGrassBlades","numLayers","getLayer","index","addLayer","getGrassTexture","setGrassTexture","texture","grassLayer","console","error","getBladeWidth","getBladeHeight","bv","getWorldBoundingVolume","toAABB","minPoint","maxPoint","worldRegion","_cullAABB","AABB","_grassInstances","_children","_minX","_minZ","_maxX","_maxZ","grassInstances","children","skipClipTest","cullAABB","z","dx","dz","w","setXYZ","clipState","clipMask","getClipStateWithFrustumMask","frustum","getClipStateWithFrustum","ClipState","NOT_CLIPPED","A_INSIDE_B","child","n","min","slice","childInstances","filter"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"grass.js","sources":["../../../src/scene/terrain-cm/grass.ts"],"sourcesContent":["import type { IndexBuffer, StructuredBuffer, Texture2D } from '@zephyr3d/device';\r\nimport type { Nullable, Vector4 } from '@zephyr3d/base';\r\nimport { AABB, ClipState, nextPowerOf2, DRef, DWeakRef, Disposable } from '@zephyr3d/base';\r\nimport type { DrawContext } from '../../render';\r\nimport { Primitive } from '../../render';\r\nimport { ClipmapGrassMaterial } from './grassmaterial';\r\nimport type { ClipmapTerrain } from './terrain-cm';\r\nimport type { Camera } from '../../camera';\r\nimport { getDevice } from '../../app/api';\r\n\r\nconst MAX_INSTANCES_PER_NODE = 2048;\r\n\r\n/**\r\n * Grass blade instance information\r\n * @public\r\n */\r\nexport type GrassInstanceInfo = {\r\n /** x position of the blade */\r\n x: number;\r\n /** y position of the blade */\r\n y: number;\r\n /** Rotation angle of the blade */\r\n angle: number;\r\n};\r\n// Two floats\r\nconst INSTANCE_BYTES = 4 * 4;\r\n\r\n/**\r\n * Grass glade instance manager class\r\n * @internal\r\n */\r\nexport class GrassInstances extends Disposable {\r\n private readonly _instances: GrassInstanceInfo[];\r\n private readonly _baseVertexBuffer: DRef<StructuredBuffer>;\r\n private readonly _indexBuffer: DRef<IndexBuffer>;\r\n private readonly _instanceBuffer: DRef<StructuredBuffer>;\r\n private readonly _primitive: DRef<Primitive>;\r\n constructor(baseVertexBuffer: StructuredBuffer, indexBuffer: IndexBuffer) {\r\n super();\r\n this._instances = [];\r\n this._baseVertexBuffer = new DRef(baseVertexBuffer);\r\n this._indexBuffer = new DRef(indexBuffer);\r\n this._instanceBuffer = new DRef();\r\n this._primitive = new DRef();\r\n }\r\n get numInstances() {\r\n return this._instances.length;\r\n }\r\n get instanceBuffer() {\r\n return this._instanceBuffer.get()!;\r\n }\r\n setBaseVertexBuffer(baseVertexBuffer: StructuredBuffer) {\r\n if (baseVertexBuffer !== this._baseVertexBuffer.get()) {\r\n this._baseVertexBuffer.set(baseVertexBuffer);\r\n this._primitive.dispose();\r\n }\r\n }\r\n draw() {\r\n if (this._instances.length > 0) {\r\n if (!this._primitive.get()) {\r\n const primitive = new Primitive();\r\n primitive.setVertexBuffer(this._baseVertexBuffer.get()!);\r\n primitive.setVertexBuffer(this._instanceBuffer.get()!, 'instance');\r\n primitive.setIndexBuffer(this._indexBuffer.get());\r\n primitive.primitiveType = 'triangle-list';\r\n primitive.indexStart = 0;\r\n primitive.indexCount = this._indexBuffer.get()!.length;\r\n this._primitive.set(primitive);\r\n }\r\n this._primitive.get()!.drawInstanced(this._instances.length);\r\n }\r\n }\r\n updateBuffers() {\r\n const device = getDevice();\r\n if (this._instances.length === 0) {\r\n this._instanceBuffer.set(null);\r\n return;\r\n }\r\n if (this._instances.length > 0 && !this._instanceBuffer.get()) {\r\n this._instanceBuffer.set(\r\n device.createVertexBuffer('tex1_f32x4', new Uint8Array(this._instances.length * INSTANCE_BYTES))\r\n );\r\n }\r\n let buffer = this._instanceBuffer.get()!;\r\n const currentBytes = buffer.byteLength;\r\n const bytesRequired = this._instances.length * INSTANCE_BYTES;\r\n if (currentBytes < bytesRequired) {\r\n buffer = device.createVertexBuffer('tex1_f32x4', new Uint8Array(nextPowerOf2(bytesRequired)))!;\r\n this._instanceBuffer.set(buffer);\r\n this._primitive.dispose();\r\n }\r\n const data = new Float32Array(4 * this._instances.length);\r\n for (let i = 0; i < this._instances.length; i++) {\r\n data[i * 4 + 0] = this._instances[i].x;\r\n data[i * 4 + 1] = this._instances[i].y;\r\n data[i * 4 + 2] = Math.sin(this._instances[i].angle);\r\n data[i * 4 + 3] = Math.cos(this._instances[i].angle);\r\n }\r\n buffer.bufferSubData(0, data);\r\n }\r\n removeInstances(minX: number, minZ: number, maxX: number, maxZ: number, num: number) {\r\n if (num <= 0) {\r\n return 0;\r\n }\r\n let removed = 0;\r\n for (let i = this._instances.length - 1; i >= 0; i--) {\r\n const instance = this._instances[i];\r\n if (instance.x >= minX && instance.x <= maxX && instance.y >= minZ && instance.y <= maxZ) {\r\n this._instances.splice(i, 1);\r\n removed++;\r\n if (removed === num) {\r\n break;\r\n }\r\n }\r\n }\r\n if (removed > 0) {\r\n this.updateBuffers();\r\n }\r\n return removed;\r\n }\r\n addInstances(instances: GrassInstanceInfo[]) {\r\n this._instances.push(...instances);\r\n this.updateBuffers();\r\n }\r\n protected onDispose() {\r\n super.onDispose();\r\n this._baseVertexBuffer.dispose();\r\n this._indexBuffer.dispose();\r\n this._instanceBuffer.dispose();\r\n this._primitive.dispose();\r\n }\r\n}\r\n\r\n/**\r\n * Grass layer class\r\n * @public\r\n */\r\nexport class GrassLayer extends Disposable {\r\n private static readonly _indexBuffer: DRef<IndexBuffer> = new DRef();\r\n private readonly _material: DRef<ClipmapGrassMaterial>;\r\n private readonly _quadtree: DRef<GrassQuadtreeNode>;\r\n private _bladeWidth: number;\r\n private _bladeHeight: number;\r\n private readonly _baseVertexBuffer: DRef<StructuredBuffer>;\r\n /**\r\n * Creates an instance of GrassLayer\r\n * @param terrain - Clipmap terrain object\r\n * @param bladeWidth - Grass blade width\r\n * @param bladeHeight - Grass blade height\r\n * @param albedoMap - Albedo texture for the blade\r\n */\r\n constructor(terrain: ClipmapTerrain, bladeWidth: number, bladeHeight: number, albedoMap?: Texture2D) {\r\n super();\r\n this._material = new DRef(new ClipmapGrassMaterial(terrain));\r\n this._material.get()!.albedoTexture = albedoMap ?? null;\r\n if (albedoMap) {\r\n this._material.get()!.setTextureSize(albedoMap.width, albedoMap.height);\r\n }\r\n this._bladeWidth = bladeWidth;\r\n this._bladeHeight = bladeHeight;\r\n this._baseVertexBuffer = new DRef(this.createBaseVertexBuffer(this._bladeWidth, this._bladeHeight));\r\n this._quadtree = new DRef(\r\n new GrassQuadtreeNode(this._baseVertexBuffer.get()!, GrassLayer._getIndexBuffer()!)\r\n );\r\n }\r\n /** @internal */\r\n get quadtree() {\r\n return this._quadtree.get();\r\n }\r\n /** @internal */\r\n updateMaterial() {\r\n this._material.get()!.uniformChanged();\r\n }\r\n /**\r\n * Sets the albedo texture of grass blades in this layer\r\n * @param albedoMap - Albedo texture to set\r\n */\r\n setAlbedoMap(albedoMap: Texture2D) {\r\n this._material.get()!.albedoTexture = albedoMap;\r\n if (albedoMap) {\r\n this._material.get()!.setTextureSize(albedoMap.width, albedoMap.height);\r\n }\r\n }\r\n /**\r\n * Gets the albedo texture of grass blades in this layer\r\n * @returns - Albedo texture of grass blades in this layer\r\n */\r\n getAlbedoMap() {\r\n return this._material.get()!.albedoTexture;\r\n }\r\n /**\r\n * Add grass blades to this layer in a region\r\n * @param instances - Grass blade instances to add\r\n */\r\n addInstances(instances: GrassInstanceInfo[]) {\r\n return this._quadtree.get()!.addInstances(instances);\r\n }\r\n /**\r\n * Remove grass blades to this layer in a region\r\n * @param minX - Minimum x position of the region\r\n * @param minZ - Minimum z position of the region\r\n * @param maxX - Maximum x position of the region\r\n * @param maxZ - Maximum z position of the region\r\n * @param numInstances - How many grass blades to add\r\n */\r\n removeInstances(minX: number, minZ: number, maxX: number, maxZ: number, numInstances: number) {\r\n this._quadtree.get()!.removeInstances(minX, minZ, maxX, maxZ, numInstances);\r\n }\r\n /** Grass blade width in this layer */\r\n get bladeWidth() {\r\n return this._bladeWidth;\r\n }\r\n set bladeWidth(val: number) {\r\n this.setBladeSize(val, this._bladeHeight);\r\n }\r\n /** Grass blade height in this layer */\r\n get bladeHeight() {\r\n return this._bladeHeight;\r\n }\r\n set bladeHeight(val: number) {\r\n this.setBladeSize(this._bladeWidth, val);\r\n }\r\n /**\r\n * Sets the size of grass blades in this layer\r\n * @param width - Grass blade width\r\n * @param height - Grass blade height\r\n */\r\n setBladeSize(width: number, height: number) {\r\n if (width !== this._bladeWidth || height !== this._bladeHeight) {\r\n this._bladeWidth = width;\r\n this._bladeHeight = height;\r\n this._baseVertexBuffer.set(this.createBaseVertexBuffer(this._bladeWidth, this._bladeHeight));\r\n this._quadtree.get()!.setBaseVertexBuffer(this._baseVertexBuffer.get()!);\r\n }\r\n }\r\n /** @internal */\r\n private static _getIndexBuffer() {\r\n if (!this._indexBuffer.get()) {\r\n this._indexBuffer.set(\r\n getDevice().createIndexBuffer(\r\n new Uint16Array([0, 1, 2, 0, 2, 3, 4, 5, 6, 4, 6, 7, 8, 9, 10, 8, 10, 11])\r\n )\r\n );\r\n }\r\n return this._indexBuffer.get();\r\n }\r\n /** @internal */\r\n private createBaseVertexBuffer(bladeWidth: number, bladeHeight: number) {\r\n const device = getDevice();\r\n const r = bladeWidth * 0.5;\r\n const t = bladeHeight;\r\n const c = r * Math.cos(Math.PI / 3);\r\n const s = r * Math.sin(Math.PI / 3);\r\n const vertices = new Float32Array([\r\n r,\r\n 0,\r\n 0,\r\n 0,\r\n 1,\r\n r,\r\n t,\r\n 0,\r\n 0,\r\n 0,\r\n -r,\r\n t,\r\n 0,\r\n 1,\r\n 0,\r\n -r,\r\n 0,\r\n 0,\r\n 1,\r\n 1,\r\n\r\n c,\r\n 0,\r\n s,\r\n 0,\r\n 1,\r\n -c,\r\n 0,\r\n -s,\r\n 1,\r\n 1,\r\n -c,\r\n t,\r\n -s,\r\n 1,\r\n 0,\r\n c,\r\n t,\r\n s,\r\n 0,\r\n 0,\r\n\r\n -c,\r\n 0,\r\n s,\r\n 0,\r\n 1,\r\n c,\r\n 0,\r\n -s,\r\n 1,\r\n 1,\r\n c,\r\n t,\r\n -s,\r\n 1,\r\n 0,\r\n -c,\r\n t,\r\n s,\r\n 0,\r\n 0\r\n ]);\r\n return device.createInterleavedVertexBuffer(['position_f32x3', 'tex0_f32x2'], vertices);\r\n }\r\n /** @internal */\r\n draw(ctx: DrawContext, region: Vector4, minY: number, maxY: number) {\r\n this._material.get()!.apply(ctx);\r\n for (let pass = 0; pass < this._material.get()!.numPasses; pass++) {\r\n this._material.get()!.bind(ctx.device, pass);\r\n this._quadtree.get()!.draw(ctx.camera, region, minY, maxY, false);\r\n }\r\n }\r\n /** @internal */\r\n protected onDispose() {\r\n super.onDispose();\r\n this._material.dispose();\r\n this._quadtree.dispose();\r\n this._baseVertexBuffer.dispose();\r\n }\r\n}\r\n/**\r\n * Grass renderer for clipmap terrain\r\n * @public\r\n */\r\nexport class GrassRenderer extends Disposable {\r\n private readonly _terrain: DWeakRef<ClipmapTerrain>;\r\n private _numGrassBlades: number;\r\n private _layers: GrassLayer[];\r\n /**\r\n * Creates an instance of GrassRenderer\r\n * @param terrain - Clipmap terrain object\r\n */\r\n constructor(terrain: ClipmapTerrain) {\r\n super();\r\n this._terrain = new DWeakRef(terrain);\r\n this._numGrassBlades = 0;\r\n this._layers = [];\r\n }\r\n /** @internal */\r\n updateMaterial() {\r\n for (const layer of this._layers) {\r\n layer.updateMaterial();\r\n }\r\n }\r\n /** How many grass blades */\r\n get numGrassBlades() {\r\n return this._numGrassBlades;\r\n }\r\n /** How many grass layers */\r\n get numLayers() {\r\n return this._layers.length;\r\n }\r\n /**\r\n * Gets the grass layer at given index\r\n * @param index - Index of the grass layer\r\n * @returns The grass layer at the index\r\n */\r\n getLayer(index: number) {\r\n return this._layers[index];\r\n }\r\n /**\r\n * Adds a grass layer\r\n * @param bladeWidth - Width of grass blades in this layer\r\n * @param bladeHeight - Height of grass blades in this layer\r\n * @param albedoMap - Albedo texture of grass blades in this layer\r\n * @returns Index of the added grass layer\r\n */\r\n addLayer(bladeWidth: number, bladeHeight: number, albedoMap?: Texture2D) {\r\n const layer = new GrassLayer(this._terrain.get()!, bladeWidth, bladeHeight, albedoMap);\r\n this._layers.push(layer);\r\n return this._layers.length - 1;\r\n }\r\n /**\r\n * Gets the albedo texture of grass blades in the grass layer at given index\r\n * @param layer - Index of the grass layer to get\r\n * @returns Albedo texture of grass blades in the grass layer\r\n */\r\n getGrassTexture(layer: number) {\r\n return this._layers[layer]?.getAlbedoMap() ?? null;\r\n }\r\n /**\r\n * Sets the albedo texture of grass blades in the grass layer at given index\r\n * @param layer - Index of the grass layer to set\r\n * @param texture - Albedo texture to set\r\n */\r\n setGrassTexture(layer: number, texture: Texture2D) {\r\n const grassLayer = this._layers[layer];\r\n if (grassLayer) {\r\n grassLayer.setAlbedoMap(texture);\r\n } else {\r\n console.error(`Invalid grass layer: ${layer}`);\r\n }\r\n }\r\n /**\r\n * Gets width of the grass blades in the grass layer at given index\r\n * @param layer - Index of the grass layer\r\n * @returns Width of the grass blades in the layer\r\n */\r\n getBladeWidth(layer: number) {\r\n return this._layers[layer]?.bladeWidth ?? 0;\r\n }\r\n /**\r\n * Gets height of the grass blades in the grass layer at given index\r\n * @param layer - Index of the grass layer\r\n * @returns Height of the grass blades in the layer\r\n */\r\n getBladeHeight(layer: number) {\r\n return this._layers[layer]?.bladeHeight ?? 0;\r\n }\r\n /**\r\n * Sets size of the grass blades in the grass layer at given index\r\n * @param layer - Index of the grass layer\r\n * @param width - Width to set\r\n * @param height - Height to set\r\n */\r\n setBladeSize(layer: number, width: number, height: number) {\r\n const grassLayer = this._layers[layer];\r\n if (grassLayer) {\r\n grassLayer.setBladeSize(width, height);\r\n } else {\r\n console.error(`Invalid grass layer: ${layer}`);\r\n }\r\n }\r\n /**\r\n * Add grass instances to the grass layer at given index\r\n * @param layer - Index of the grass layer\r\n * @param instances - Grass blade instances to add\r\n */\r\n addInstances(layer: number, instances: GrassInstanceInfo[]) {\r\n const grassLayer = this._layers[layer];\r\n if (!grassLayer) {\r\n console.error(`Invalid grass layer: ${layer}`);\r\n } else {\r\n this._numGrassBlades += grassLayer.addInstances(instances);\r\n }\r\n }\r\n /**\r\n * Remove grass instances from the grass layer at given index within a region\r\n * @param layer - Index of the grass layer\r\n * @param minX - Minimum x of the region\r\n * @param minZ - Minimum z of the region\r\n * @param maxX - Maximum x of the region\r\n * @param maxZ - Maximum z of the region\r\n * @param num - How many grass blades to remove\r\n */\r\n removeInstances(layer: number, minX: number, minZ: number, maxX: number, maxZ: number, num: number) {\r\n const grassLayer = this._layers[layer];\r\n if (!grassLayer) {\r\n console.error(`Invalid grass layer: ${layer}`);\r\n } else {\r\n grassLayer.removeInstances(minX, minZ, maxX, maxZ, num);\r\n }\r\n }\r\n /** @internal */\r\n draw(ctx: DrawContext) {\r\n const bv = this._terrain.get()!.getWorldBoundingVolume()!.toAABB();\r\n const minY = bv.minPoint.y;\r\n const maxY = bv.maxPoint.y;\r\n for (const layer of this._layers) {\r\n layer.draw(ctx, this._terrain.get()!.worldRegion, minY - layer.bladeHeight, maxY + layer.bladeHeight);\r\n }\r\n }\r\n protected onDispose() {\r\n super.onDispose();\r\n this._terrain.dispose();\r\n for (const layer of this._layers) {\r\n layer.dispose();\r\n }\r\n }\r\n}\r\n\r\n/** @internal */\r\nexport class GrassQuadtreeNode extends Disposable {\r\n private static readonly _cullAABB = new AABB();\r\n private readonly _grassInstances: DRef<GrassInstances>;\r\n private _children: Nullable<GrassQuadtreeNode[]>;\r\n private readonly _baseVertexBuffer: DRef<StructuredBuffer>;\r\n private readonly _indexBuffer: DRef<IndexBuffer>;\r\n private _minX: number;\r\n private _minZ: number;\r\n private _maxX: number;\r\n private _maxZ: number;\r\n constructor(baseVertexBuffer: StructuredBuffer, indexBuffer: IndexBuffer) {\r\n super();\r\n this._baseVertexBuffer = new DRef(baseVertexBuffer);\r\n this._indexBuffer = new DRef(indexBuffer);\r\n this._grassInstances = new DRef(new GrassInstances(baseVertexBuffer, indexBuffer));\r\n this._children = null;\r\n this._minX = 0;\r\n this._minZ = 0;\r\n this._maxX = 1;\r\n this._maxZ = 1;\r\n }\r\n get grassInstances() {\r\n return this._grassInstances.get();\r\n }\r\n get children() {\r\n return this._children;\r\n }\r\n draw(camera: Camera, region: Vector4, minY: number, maxY: number, skipClipTest: boolean) {\r\n if (!skipClipTest) {\r\n const cullAABB = GrassQuadtreeNode._cullAABB;\r\n const x = region.x;\r\n const z = region.y;\r\n const dx = region.z - x;\r\n const dz = region.w - z;\r\n cullAABB.minPoint.setXYZ(x + this._minX * dx, minY, z + this._minZ * dz);\r\n cullAABB.maxPoint.setXYZ(x + this._maxX * dx, maxY, z + this._maxZ * dz);\r\n const clipState = camera.clipMask\r\n ? cullAABB.getClipStateWithFrustumMask(camera.frustum, camera.clipMask)\r\n : cullAABB.getClipStateWithFrustum(camera.frustum);\r\n if (clipState === ClipState.NOT_CLIPPED) {\r\n return;\r\n }\r\n skipClipTest = clipState === ClipState.A_INSIDE_B;\r\n }\r\n if (this._grassInstances.get()!.numInstances > 0) {\r\n this._grassInstances.get()!.draw();\r\n }\r\n if (this._children) {\r\n for (const child of this._children) {\r\n child.draw(camera, region, minY, maxY, skipClipTest);\r\n }\r\n }\r\n }\r\n setBaseVertexBuffer(baseVertexBuffer: StructuredBuffer) {\r\n if (baseVertexBuffer !== this._baseVertexBuffer.get()) {\r\n this._baseVertexBuffer.set(baseVertexBuffer);\r\n this._grassInstances.get()!.setBaseVertexBuffer(baseVertexBuffer);\r\n if (this._children) {\r\n for (const child of this._children) {\r\n child.setBaseVertexBuffer(baseVertexBuffer);\r\n }\r\n }\r\n }\r\n }\r\n removeInstances(minX: number, minZ: number, maxX: number, maxZ: number, numInstances: number) {\r\n let n = Math.min(this._grassInstances.get()!.numInstances, numInstances);\r\n if (n <= 0) {\r\n return 0;\r\n }\r\n let removed = 0;\r\n if (this._children) {\r\n for (const child of this._children) {\r\n if (child._minX < maxX && child._minZ < maxZ && child._maxX > minX && child._maxZ > minZ) {\r\n removed += child.removeInstances(minX, minZ, maxX, maxZ, n);\r\n n -= removed;\r\n }\r\n }\r\n }\r\n if (n > 0) {\r\n removed += this._grassInstances.get()!.removeInstances(minX, minZ, maxX, maxZ, n);\r\n }\r\n return removed;\r\n }\r\n addInstances(instances: GrassInstanceInfo[]) {\r\n if (instances.length === 0) {\r\n return 0;\r\n }\r\n let n = Math.min(instances.length, MAX_INSTANCES_PER_NODE - this._grassInstances.get()!.numInstances);\r\n this._grassInstances.get()!.addInstances(instances.slice(0, n));\r\n if (n < instances.length) {\r\n if (!this._children) {\r\n this._children = [\r\n new GrassQuadtreeNode(this._baseVertexBuffer.get()!, this._indexBuffer.get()!),\r\n new GrassQuadtreeNode(this._baseVertexBuffer.get()!, this._indexBuffer.get()!),\r\n new GrassQuadtreeNode(this._baseVertexBuffer.get()!, this._indexBuffer.get()!),\r\n new GrassQuadtreeNode(this._baseVertexBuffer.get()!, this._indexBuffer.get()!)\r\n ];\r\n this._children[0]._minX = this._minX;\r\n this._children[0]._minZ = this._minZ;\r\n this._children[0]._maxX = (this._minX + this._maxX) * 0.5;\r\n this._children[0]._maxZ = (this._minZ + this._maxZ) * 0.5;\r\n this._children[1]._minX = this._children[0]._maxX;\r\n this._children[1]._minZ = this._minZ;\r\n this._children[1]._maxX = this._maxX;\r\n this._children[1]._maxZ = this._children[0]._maxZ;\r\n this._children[2]._minX = this._minX;\r\n this._children[2]._minZ = this._children[0]._maxZ;\r\n this._children[2]._maxX = this._children[0]._maxX;\r\n this._children[2]._maxZ = this._maxZ;\r\n this._children[3]._minX = this._children[0]._maxX;\r\n this._children[3]._minZ = this._children[0]._maxZ;\r\n this._children[3]._maxX = this._maxX;\r\n this._children[3]._maxZ = this._maxZ;\r\n }\r\n instances = instances.slice(n);\r\n for (const child of this._children) {\r\n if (instances.length > 0) {\r\n const childInstances = instances.filter(\r\n (val) =>\r\n val.x >= child._minX && val.y >= child._minZ && val.x < child._maxX && val.y < child._maxZ\r\n );\r\n n += child.addInstances(childInstances);\r\n instances = instances.filter(\r\n (val) =>\r\n !(val.x >= child._minX && val.y >= child._minZ && val.x < child._maxX && val.y < child._maxZ)\r\n );\r\n }\r\n }\r\n }\r\n return n;\r\n }\r\n protected onDispose() {\r\n super.onDispose();\r\n this._baseVertexBuffer.dispose();\r\n this._indexBuffer.dispose();\r\n this._grassInstances.dispose();\r\n if (this._children) {\r\n for (const child of this._children) {\r\n child.dispose();\r\n }\r\n }\r\n }\r\n}\r\n"],"names":["MAX_INSTANCES_PER_NODE","INSTANCE_BYTES","GrassInstances","Disposable","_instances","_baseVertexBuffer","_indexBuffer","_instanceBuffer","_primitive","baseVertexBuffer","indexBuffer","DRef","numInstances","length","instanceBuffer","get","setBaseVertexBuffer","set","dispose","draw","primitive","Primitive","setVertexBuffer","setIndexBuffer","primitiveType","indexStart","indexCount","drawInstanced","updateBuffers","device","getDevice","createVertexBuffer","Uint8Array","buffer","currentBytes","byteLength","bytesRequired","nextPowerOf2","data","Float32Array","i","x","y","Math","sin","angle","cos","bufferSubData","removeInstances","minX","minZ","maxX","maxZ","num","removed","instance","splice","addInstances","instances","push","onDispose","GrassLayer","_material","_quadtree","_bladeWidth","_bladeHeight","terrain","bladeWidth","bladeHeight","albedoMap","ClipmapGrassMaterial","albedoTexture","setTextureSize","width","height","createBaseVertexBuffer","GrassQuadtreeNode","_getIndexBuffer","quadtree","updateMaterial","uniformChanged","setAlbedoMap","getAlbedoMap","val","setBladeSize","createIndexBuffer","Uint16Array","r","t","c","PI","s","vertices","createInterleavedVertexBuffer","ctx","region","minY","maxY","apply","pass","numPasses","bind","camera","GrassRenderer","_terrain","_numGrassBlades","_layers","DWeakRef","layer","numGrassBlades","numLayers","getLayer","index","addLayer","getGrassTexture","setGrassTexture","texture","grassLayer","console","error","getBladeWidth","getBladeHeight","bv","getWorldBoundingVolume","toAABB","minPoint","maxPoint","worldRegion","_cullAABB","AABB","_grassInstances","_children","_minX","_minZ","_maxX","_maxZ","grassInstances","children","skipClipTest","cullAABB","z","dx","dz","w","setXYZ","clipState","clipMask","getClipStateWithFrustumMask","frustum","getClipStateWithFrustum","ClipState","NOT_CLIPPED","A_INSIDE_B","child","n","min","slice","childInstances","filter"],"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 { RENDER_PASS_TYPE_LIGHT } from '../../values.js';
|
|
9
10
|
import { applyMaterialMixins, MeshMaterial } from '../../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
|
import { mixinPBRMetallicRoughness } from '../../material/mixins/lightmodel/pbrmetallicroughness.js';
|
|
20
21
|
import { mixinFoliage } from '../../material/mixins/foliage.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grassmaterial.js","sources":["../../../src/scene/terrain-cm/grassmaterial.ts"],"sourcesContent":["import type { Clonable } from '@zephyr3d/base';\r\nimport { Vector2, Vector4, DWeakRef } from '@zephyr3d/base';\r\nimport type { BindGroup, PBFunctionScope, RenderStateSet } from '@zephyr3d/device';\r\nimport {\r\n applyMaterialMixins,\r\n MeshMaterial,\r\n mixinFoliage,\r\n mixinPBRMetallicRoughness,\r\n ShaderHelper\r\n} from '../../material';\r\nimport type { DrawContext } from '../../render';\r\nimport { RENDER_PASS_TYPE_LIGHT } from '../../values';\r\nimport type { ClipmapTerrain } from './terrain-cm';\r\nimport { fetchSampler } from '../../utility/misc';\r\n\r\n/**\r\n * Terrain grass material\r\n * @public\r\n */\r\nexport class ClipmapGrassMaterial\r\n extends applyMaterialMixins(MeshMaterial, mixinPBRMetallicRoughness, mixinFoliage)\r\n implements Clonable<ClipmapGrassMaterial>\r\n{\r\n /** @internal */\r\n private readonly _terrain: DWeakRef<ClipmapTerrain>;\r\n /** @internal */\r\n private readonly _terrainPosScale: Vector4;\r\n /** @internal */\r\n private readonly _heightMapSize: Vector2;\r\n /** @internal */\r\n private readonly _textureSize: Vector2;\r\n /**\r\n * Creates an instance of GrassMaterial class\r\n * @param terrain - Clipmap terrain object\r\n * @param heightMap - height map\r\n * @param grassTexture - grass texture\r\n */\r\n constructor(terrain: ClipmapTerrain) {\r\n super();\r\n this.metallic = 0;\r\n this.roughness = 1;\r\n this.doubleSidedLighting = false;\r\n this.specularFactor = new Vector4(1, 1, 1, 0.2);\r\n this._terrain = new DWeakRef(terrain);\r\n this._terrainPosScale = new Vector4();\r\n this._heightMapSize = new Vector2(1 / terrain.heightMap!.width, 1 / terrain.heightMap!.height);\r\n this._textureSize = Vector2.one();\r\n }\r\n clone() {\r\n const other = new ClipmapGrassMaterial(this._terrain.get()!);\r\n other.copyFrom(this);\r\n return other;\r\n }\r\n copyFrom(other: this) {\r\n super.copyFrom(other);\r\n this._terrainPosScale.set(other._terrainPosScale);\r\n this._heightMapSize.set(other._heightMapSize);\r\n this._textureSize.set(other._textureSize);\r\n }\r\n setTextureSize(w: number, h: number) {\r\n this._textureSize.setXY(w, h);\r\n this.uniformChanged();\r\n }\r\n /**\r\n * {@inheritDoc MeshMaterial.isTransparentPass}\r\n * @override\r\n */\r\n isTransparentPass(_pass: number) {\r\n return false;\r\n }\r\n /**\r\n * {@inheritDoc Material.supportLighting}\r\n * @override\r\n */\r\n supportLighting() {\r\n return true;\r\n }\r\n /**\r\n * {@inheritDoc Material.supportInstancing}\r\n * @override\r\n */\r\n supportInstancing() {\r\n return false;\r\n }\r\n applyUniformValues(bindGroup: BindGroup, ctx: DrawContext, pass: number) {\r\n super.applyUniformValues(bindGroup, ctx, pass);\r\n const terrain = this._terrain.get()!;\r\n this._terrainPosScale.setXYZW(terrain.scale.x, terrain.scale.y, terrain.scale.z, terrain.worldMatrix.m13);\r\n bindGroup.setTexture('terrainHeightMap', terrain.heightMap!, fetchSampler('clamp_linear_nomip'));\r\n bindGroup.setValue('heightMapSize', this._heightMapSize);\r\n bindGroup.setValue('terrainRegion', terrain.worldRegion);\r\n bindGroup.setValue('terrainPosScale', this._terrainPosScale);\r\n if (this.needFragmentColor(ctx)) {\r\n bindGroup.setValue('albedoTextureSize', this._textureSize);\r\n }\r\n }\r\n vertexShader(scope: PBFunctionScope) {\r\n super.vertexShader(scope);\r\n const pb = scope.$builder;\r\n scope.$inputs.pos = pb.vec3().attrib('position');\r\n scope.$inputs.albedoUV = pb.vec2().attrib('texCoord0');\r\n scope.$inputs.placement = pb.vec4().attrib('texCoord1');\r\n scope.terrainHeightMap = pb.tex2D().uniform(2);\r\n scope.heightMapSize = pb.vec2().uniform(2);\r\n scope.terrainRegion = pb.vec4().uniform(2);\r\n scope.terrainPosScale = pb.vec4().uniform(2);\r\n\r\n pb.func('calcHeightMapNormal', [pb.vec2('uv'), pb.vec2('texelSize'), pb.vec3('scale')], function () {\r\n this.$l.hL = pb.textureSampleLevel(\r\n this.terrainHeightMap,\r\n pb.sub(this.uv, pb.vec2(this.texelSize.x, 0)),\r\n 0\r\n ).r;\r\n this.$l.hR = pb.textureSampleLevel(\r\n this.terrainHeightMap,\r\n pb.add(this.uv, pb.vec2(this.texelSize.x, 0)),\r\n 0\r\n ).r;\r\n this.$l.hD = pb.textureSampleLevel(\r\n this.terrainHeightMap,\r\n pb.add(this.uv, pb.vec2(0, this.texelSize.y)),\r\n 0\r\n ).r;\r\n this.$l.hU = pb.textureSampleLevel(\r\n this.terrainHeightMap,\r\n pb.sub(this.uv, pb.vec2(0, this.texelSize.y)),\r\n 0\r\n ).r;\r\n this.$l.dHdU = pb.div(pb.mul(pb.sub(this.hR, this.hL), this.scale.y), pb.mul(this.scale.x, 2));\r\n this.$l.dHdV = pb.div(pb.mul(pb.sub(this.hD, this.hU), this.scale.y), pb.mul(this.scale.z, 2));\r\n this.t = pb.normalize(pb.vec3(1, this.dHdU, 0));\r\n this.b = pb.normalize(pb.vec3(0, this.dHdV, 1));\r\n this.$return(pb.normalize(pb.cross(this.b, this.t)));\r\n });\r\n\r\n scope.$l.uv = scope.$inputs.placement.xy;\r\n scope.$l.heightSample = pb.textureSampleLevel(scope.terrainHeightMap, scope.uv, 0);\r\n scope.$l.height = pb.add(pb.mul(scope.heightSample.r, scope.terrainPosScale.y), scope.terrainPosScale.w);\r\n scope.$l.normal = scope.calcHeightMapNormal(scope.uv, scope.heightMapSize, scope.terrainPosScale.xyz);\r\n scope.$l.axisX = pb.vec3(scope.$inputs.placement.z, 0, scope.$inputs.placement.w);\r\n scope.$l.axisZ = pb.cross(scope.axisX, scope.normal);\r\n scope.$l.axisX = pb.cross(scope.normal, scope.axisZ);\r\n scope.$l.rotPos = pb.mul(pb.mat3(scope.axisX, scope.normal, scope.axisZ), scope.$inputs.pos);\r\n scope.$l.posXZ = pb.add(\r\n pb.mul(scope.$inputs.placement.xy, pb.sub(scope.terrainRegion.zw, scope.terrainRegion.xy)),\r\n scope.terrainRegion.xy\r\n );\r\n scope.$outputs.zAlbedoTexCoord = scope.$inputs.albedoUV;\r\n scope.$outputs.worldPos = pb.add(scope.rotPos, pb.vec3(scope.posXZ.x, scope.height, scope.posXZ.y));\r\n ShaderHelper.setClipSpacePosition(\r\n scope,\r\n pb.mul(ShaderHelper.getViewProjectionMatrix(scope), pb.vec4(scope.$outputs.worldPos, 1))\r\n );\r\n scope.$outputs.worldNorm = scope.normal;\r\n ShaderHelper.resolveMotionVector(scope, scope.$outputs.worldPos, scope.$outputs.worldPos);\r\n }\r\n fragmentShader(scope: PBFunctionScope) {\r\n super.fragmentShader(scope);\r\n const pb = scope.$builder;\r\n const that = this;\r\n if (this.needFragmentColor()) {\r\n scope.albedoTextureSize = pb.vec2().uniform(2);\r\n scope.$l.albedo = this.calculateAlbedoColor(scope);\r\n scope.albedo = that.calculateFoliageAlbedo(\r\n scope,\r\n scope.albedo,\r\n pb.mul(that.getAlbedoTexCoord(scope), scope.albedoTextureSize)\r\n );\r\n scope.$l.litColor = pb.vec3(0);\r\n if (this.drawContext.renderPass!.type === RENDER_PASS_TYPE_LIGHT) {\r\n scope.$l.normalInfo = this.calculateNormalAndTBN(\r\n scope,\r\n scope.$inputs.worldPos,\r\n scope.$inputs.worldNorm\r\n );\r\n scope.$l.viewVec = this.calculateViewVector(scope, scope.$inputs.worldPos);\r\n scope.$l.litColor = this.PBRLight(\r\n scope,\r\n scope.$inputs.worldPos,\r\n scope.normalInfo.normal,\r\n scope.viewVec,\r\n scope.albedo,\r\n scope.normalInfo.TBN\r\n );\r\n }\r\n this.outputFragmentColor(scope, scope.$inputs.worldPos, pb.vec4(scope.litColor, scope.albedo.a));\r\n } else {\r\n this.outputFragmentColor(scope, scope.$inputs.worldPos, null);\r\n }\r\n }\r\n apply(ctx: DrawContext) {\r\n this.alphaToCoverage = ctx.device.getFrameBufferSampleCount() > 1;\r\n this.alphaCutoff = this.alphaToCoverage ? 1 : 0.8;\r\n return super.apply(ctx);\r\n }\r\n protected updateRenderStates(pass: number, stateSet: RenderStateSet, ctx: DrawContext) {\r\n super.updateRenderStates(pass, stateSet, ctx);\r\n stateSet.useRasterizerState().setCullMode('none');\r\n }\r\n}\r\n"],"names":["ClipmapGrassMaterial","applyMaterialMixins","MeshMaterial","mixinPBRMetallicRoughness","mixinFoliage","terrain","metallic","roughness","doubleSidedLighting","specularFactor","Vector4","_terrain","DWeakRef","_terrainPosScale","_heightMapSize","Vector2","heightMap","width","height","_textureSize","one","clone","other","get","copyFrom","set","setTextureSize","w","h","setXY","uniformChanged","isTransparentPass","_pass","supportLighting","supportInstancing","applyUniformValues","bindGroup","ctx","pass","setXYZW","scale","x","y","z","worldMatrix","m13","setTexture","fetchSampler","setValue","worldRegion","needFragmentColor","vertexShader","scope","pb","$builder","$inputs","pos","vec3","attrib","albedoUV","vec2","placement","vec4","terrainHeightMap","tex2D","uniform","heightMapSize","terrainRegion","terrainPosScale","func","$l","hL","textureSampleLevel","sub","uv","texelSize","r","hR","add","hD","hU","dHdU","div","mul","dHdV","t","normalize","b","$return","cross","xy","heightSample","normal","calcHeightMapNormal","xyz","axisX","axisZ","rotPos","mat3","posXZ","zw","$outputs","zAlbedoTexCoord","worldPos","ShaderHelper","setClipSpacePosition","getViewProjectionMatrix","worldNorm","resolveMotionVector","fragmentShader","that","albedoTextureSize","albedo","calculateAlbedoColor","calculateFoliageAlbedo","getAlbedoTexCoord","litColor","drawContext","renderPass","type","RENDER_PASS_TYPE_LIGHT","normalInfo","calculateNormalAndTBN","viewVec","calculateViewVector","PBRLight","TBN","outputFragmentColor","a","apply","alphaToCoverage","device","getFrameBufferSampleCount","alphaCutoff","updateRenderStates","stateSet","useRasterizerState","setCullMode"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"grassmaterial.js","sources":["../../../src/scene/terrain-cm/grassmaterial.ts"],"sourcesContent":["import type { Clonable } from '@zephyr3d/base';\r\nimport { Vector2, Vector4, DWeakRef } from '@zephyr3d/base';\r\nimport type { BindGroup, PBFunctionScope, RenderStateSet } from '@zephyr3d/device';\r\nimport {\r\n applyMaterialMixins,\r\n MeshMaterial,\r\n mixinFoliage,\r\n mixinPBRMetallicRoughness,\r\n ShaderHelper\r\n} from '../../material';\r\nimport type { DrawContext } from '../../render';\r\nimport { RENDER_PASS_TYPE_LIGHT } from '../../values';\r\nimport type { ClipmapTerrain } from './terrain-cm';\r\nimport { fetchSampler } from '../../utility/misc';\r\n\r\n/**\r\n * Terrain grass material\r\n * @public\r\n */\r\nexport class ClipmapGrassMaterial\r\n extends applyMaterialMixins(MeshMaterial, mixinPBRMetallicRoughness, mixinFoliage)\r\n implements Clonable<ClipmapGrassMaterial>\r\n{\r\n /** @internal */\r\n private readonly _terrain: DWeakRef<ClipmapTerrain>;\r\n /** @internal */\r\n private readonly _terrainPosScale: Vector4;\r\n /** @internal */\r\n private readonly _heightMapSize: Vector2;\r\n /** @internal */\r\n private readonly _textureSize: Vector2;\r\n /**\r\n * Creates an instance of GrassMaterial class\r\n * @param terrain - Clipmap terrain object\r\n * @param heightMap - height map\r\n * @param grassTexture - grass texture\r\n */\r\n constructor(terrain: ClipmapTerrain) {\r\n super();\r\n this.metallic = 0;\r\n this.roughness = 1;\r\n this.doubleSidedLighting = false;\r\n this.specularFactor = new Vector4(1, 1, 1, 0.2);\r\n this._terrain = new DWeakRef(terrain);\r\n this._terrainPosScale = new Vector4();\r\n this._heightMapSize = new Vector2(1 / terrain.heightMap!.width, 1 / terrain.heightMap!.height);\r\n this._textureSize = Vector2.one();\r\n }\r\n clone() {\r\n const other = new ClipmapGrassMaterial(this._terrain.get()!);\r\n other.copyFrom(this);\r\n return other;\r\n }\r\n copyFrom(other: this) {\r\n super.copyFrom(other);\r\n this._terrainPosScale.set(other._terrainPosScale);\r\n this._heightMapSize.set(other._heightMapSize);\r\n this._textureSize.set(other._textureSize);\r\n }\r\n setTextureSize(w: number, h: number) {\r\n this._textureSize.setXY(w, h);\r\n this.uniformChanged();\r\n }\r\n /**\r\n * {@inheritDoc MeshMaterial.isTransparentPass}\r\n * @override\r\n */\r\n isTransparentPass(_pass: number) {\r\n return false;\r\n }\r\n /**\r\n * {@inheritDoc Material.supportLighting}\r\n * @override\r\n */\r\n supportLighting() {\r\n return true;\r\n }\r\n /**\r\n * {@inheritDoc Material.supportInstancing}\r\n * @override\r\n */\r\n supportInstancing() {\r\n return false;\r\n }\r\n applyUniformValues(bindGroup: BindGroup, ctx: DrawContext, pass: number) {\r\n super.applyUniformValues(bindGroup, ctx, pass);\r\n const terrain = this._terrain.get()!;\r\n this._terrainPosScale.setXYZW(terrain.scale.x, terrain.scale.y, terrain.scale.z, terrain.worldMatrix.m13);\r\n bindGroup.setTexture('terrainHeightMap', terrain.heightMap!, fetchSampler('clamp_linear_nomip'));\r\n bindGroup.setValue('heightMapSize', this._heightMapSize);\r\n bindGroup.setValue('terrainRegion', terrain.worldRegion);\r\n bindGroup.setValue('terrainPosScale', this._terrainPosScale);\r\n if (this.needFragmentColor(ctx)) {\r\n bindGroup.setValue('albedoTextureSize', this._textureSize);\r\n }\r\n }\r\n vertexShader(scope: PBFunctionScope) {\r\n super.vertexShader(scope);\r\n const pb = scope.$builder;\r\n scope.$inputs.pos = pb.vec3().attrib('position');\r\n scope.$inputs.albedoUV = pb.vec2().attrib('texCoord0');\r\n scope.$inputs.placement = pb.vec4().attrib('texCoord1');\r\n scope.terrainHeightMap = pb.tex2D().uniform(2);\r\n scope.heightMapSize = pb.vec2().uniform(2);\r\n scope.terrainRegion = pb.vec4().uniform(2);\r\n scope.terrainPosScale = pb.vec4().uniform(2);\r\n\r\n pb.func('calcHeightMapNormal', [pb.vec2('uv'), pb.vec2('texelSize'), pb.vec3('scale')], function () {\r\n this.$l.hL = pb.textureSampleLevel(\r\n this.terrainHeightMap,\r\n pb.sub(this.uv, pb.vec2(this.texelSize.x, 0)),\r\n 0\r\n ).r;\r\n this.$l.hR = pb.textureSampleLevel(\r\n this.terrainHeightMap,\r\n pb.add(this.uv, pb.vec2(this.texelSize.x, 0)),\r\n 0\r\n ).r;\r\n this.$l.hD = pb.textureSampleLevel(\r\n this.terrainHeightMap,\r\n pb.add(this.uv, pb.vec2(0, this.texelSize.y)),\r\n 0\r\n ).r;\r\n this.$l.hU = pb.textureSampleLevel(\r\n this.terrainHeightMap,\r\n pb.sub(this.uv, pb.vec2(0, this.texelSize.y)),\r\n 0\r\n ).r;\r\n this.$l.dHdU = pb.div(pb.mul(pb.sub(this.hR, this.hL), this.scale.y), pb.mul(this.scale.x, 2));\r\n this.$l.dHdV = pb.div(pb.mul(pb.sub(this.hD, this.hU), this.scale.y), pb.mul(this.scale.z, 2));\r\n this.t = pb.normalize(pb.vec3(1, this.dHdU, 0));\r\n this.b = pb.normalize(pb.vec3(0, this.dHdV, 1));\r\n this.$return(pb.normalize(pb.cross(this.b, this.t)));\r\n });\r\n\r\n scope.$l.uv = scope.$inputs.placement.xy;\r\n scope.$l.heightSample = pb.textureSampleLevel(scope.terrainHeightMap, scope.uv, 0);\r\n scope.$l.height = pb.add(pb.mul(scope.heightSample.r, scope.terrainPosScale.y), scope.terrainPosScale.w);\r\n scope.$l.normal = scope.calcHeightMapNormal(scope.uv, scope.heightMapSize, scope.terrainPosScale.xyz);\r\n scope.$l.axisX = pb.vec3(scope.$inputs.placement.z, 0, scope.$inputs.placement.w);\r\n scope.$l.axisZ = pb.cross(scope.axisX, scope.normal);\r\n scope.$l.axisX = pb.cross(scope.normal, scope.axisZ);\r\n scope.$l.rotPos = pb.mul(pb.mat3(scope.axisX, scope.normal, scope.axisZ), scope.$inputs.pos);\r\n scope.$l.posXZ = pb.add(\r\n pb.mul(scope.$inputs.placement.xy, pb.sub(scope.terrainRegion.zw, scope.terrainRegion.xy)),\r\n scope.terrainRegion.xy\r\n );\r\n scope.$outputs.zAlbedoTexCoord = scope.$inputs.albedoUV;\r\n scope.$outputs.worldPos = pb.add(scope.rotPos, pb.vec3(scope.posXZ.x, scope.height, scope.posXZ.y));\r\n ShaderHelper.setClipSpacePosition(\r\n scope,\r\n pb.mul(ShaderHelper.getViewProjectionMatrix(scope), pb.vec4(scope.$outputs.worldPos, 1))\r\n );\r\n scope.$outputs.worldNorm = scope.normal;\r\n ShaderHelper.resolveMotionVector(scope, scope.$outputs.worldPos, scope.$outputs.worldPos);\r\n }\r\n fragmentShader(scope: PBFunctionScope) {\r\n super.fragmentShader(scope);\r\n const pb = scope.$builder;\r\n const that = this;\r\n if (this.needFragmentColor()) {\r\n scope.albedoTextureSize = pb.vec2().uniform(2);\r\n scope.$l.albedo = this.calculateAlbedoColor(scope);\r\n scope.albedo = that.calculateFoliageAlbedo(\r\n scope,\r\n scope.albedo,\r\n pb.mul(that.getAlbedoTexCoord(scope), scope.albedoTextureSize)\r\n );\r\n scope.$l.litColor = pb.vec3(0);\r\n if (this.drawContext.renderPass!.type === RENDER_PASS_TYPE_LIGHT) {\r\n scope.$l.normalInfo = this.calculateNormalAndTBN(\r\n scope,\r\n scope.$inputs.worldPos,\r\n scope.$inputs.worldNorm\r\n );\r\n scope.$l.viewVec = this.calculateViewVector(scope, scope.$inputs.worldPos);\r\n scope.$l.litColor = this.PBRLight(\r\n scope,\r\n scope.$inputs.worldPos,\r\n scope.normalInfo.normal,\r\n scope.viewVec,\r\n scope.albedo,\r\n scope.normalInfo.TBN\r\n );\r\n }\r\n this.outputFragmentColor(scope, scope.$inputs.worldPos, pb.vec4(scope.litColor, scope.albedo.a));\r\n } else {\r\n this.outputFragmentColor(scope, scope.$inputs.worldPos, null);\r\n }\r\n }\r\n apply(ctx: DrawContext) {\r\n this.alphaToCoverage = ctx.device.getFrameBufferSampleCount() > 1;\r\n this.alphaCutoff = this.alphaToCoverage ? 1 : 0.8;\r\n return super.apply(ctx);\r\n }\r\n protected updateRenderStates(pass: number, stateSet: RenderStateSet, ctx: DrawContext) {\r\n super.updateRenderStates(pass, stateSet, ctx);\r\n stateSet.useRasterizerState().setCullMode('none');\r\n }\r\n}\r\n"],"names":["ClipmapGrassMaterial","applyMaterialMixins","MeshMaterial","mixinPBRMetallicRoughness","mixinFoliage","terrain","metallic","roughness","doubleSidedLighting","specularFactor","Vector4","_terrain","DWeakRef","_terrainPosScale","_heightMapSize","Vector2","heightMap","width","height","_textureSize","one","clone","other","get","copyFrom","set","setTextureSize","w","h","setXY","uniformChanged","isTransparentPass","_pass","supportLighting","supportInstancing","applyUniformValues","bindGroup","ctx","pass","setXYZW","scale","x","y","z","worldMatrix","m13","setTexture","fetchSampler","setValue","worldRegion","needFragmentColor","vertexShader","scope","pb","$builder","$inputs","pos","vec3","attrib","albedoUV","vec2","placement","vec4","terrainHeightMap","tex2D","uniform","heightMapSize","terrainRegion","terrainPosScale","func","$l","hL","textureSampleLevel","sub","uv","texelSize","r","hR","add","hD","hU","dHdU","div","mul","dHdV","t","normalize","b","$return","cross","xy","heightSample","normal","calcHeightMapNormal","xyz","axisX","axisZ","rotPos","mat3","posXZ","zw","$outputs","zAlbedoTexCoord","worldPos","ShaderHelper","setClipSpacePosition","getViewProjectionMatrix","worldNorm","resolveMotionVector","fragmentShader","that","albedoTextureSize","albedo","calculateAlbedoColor","calculateFoliageAlbedo","getAlbedoTexCoord","litColor","drawContext","renderPass","type","RENDER_PASS_TYPE_LIGHT","normalInfo","calculateNormalAndTBN","viewVec","calculateViewVector","PBRLight","TBN","outputFragmentColor","a","apply","alphaToCoverage","device","getFrameBufferSampleCount","alphaCutoff","updateRenderStates","stateSet","useRasterizerState","setCullMode"],"mappings":"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"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { applyMixins, DRef, randomUUID, Vector3, Vector4 } from '@zephyr3d/base';
|
|
2
2
|
import { GraphNode } from '../graph_node.js';
|
|
3
3
|
import { mixinDrawable } from '../../render/drawable_mixin.js';
|
|
4
|
-
import { getDevice } from '../../app/api.js';
|
|
5
4
|
import { MAX_TERRAIN_MIPMAP_LEVELS, QUEUE_OPAQUE, RENDER_PASS_TYPE_OBJECT_COLOR, RENDER_PASS_TYPE_SHADOWMAP } from '../../values.js';
|
|
6
5
|
import '../../render/render_queue.js';
|
|
6
|
+
import { getDevice } from '../../app/api.js';
|
|
7
7
|
import '../../render/primitive.js';
|
|
8
8
|
import '@zephyr3d/device';
|
|
9
9
|
import { CopyBlitter } from '../../blitter/copy.js';
|
|
@@ -12,18 +12,20 @@ import '../../material/lambert.js';
|
|
|
12
12
|
import '../../material/blinn.js';
|
|
13
13
|
import '../../material/unlit.js';
|
|
14
14
|
import '../../material/particle.js';
|
|
15
|
+
import '../../material/subsurfaceprofile.js';
|
|
15
16
|
import '../../material/meshmaterial.js';
|
|
16
17
|
import '../../material/grassmaterial.js';
|
|
17
18
|
import { ClipmapTerrainMaterial } from '../../material/terrain-cm.js';
|
|
18
19
|
import '../../material/pbrmr.js';
|
|
19
20
|
import '../../material/pbrsg.js';
|
|
21
|
+
import '../../material/mtoon.js';
|
|
20
22
|
import '../../material/pbrblueprint.js';
|
|
21
23
|
import '../../material/sprite.js';
|
|
22
24
|
import '../../material/sprite_std.js';
|
|
23
|
-
import '../../material/msdf_text.js';
|
|
24
25
|
import '../../utility/blueprint/material/texture.js';
|
|
25
26
|
import { fetchSampler } from '../../utility/misc.js';
|
|
26
27
|
import '../../render/rendergraph/forward_plus_builder.js';
|
|
28
|
+
import '../../render/lightpass.js';
|
|
27
29
|
import '../../render/sky.js';
|
|
28
30
|
import { Clipmap } from '../../render/clipmap.js';
|
|
29
31
|
import '../../shaders/atmosphere.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"terrain-cm.js","sources":["../../../src/scene/terrain-cm/terrain-cm.ts"],"sourcesContent":["import type { Immutable, Matrix4x4, Nullable } from '@zephyr3d/base';\r\nimport { Vector4, applyMixins, Vector3, DRef, randomUUID } from '@zephyr3d/base';\r\nimport type { PBInsideFunctionScope, PBShaderExp, Texture2D } from '@zephyr3d/device';\r\nimport type { Scene } from '../scene';\r\nimport { GraphNode } from '../graph_node';\r\nimport { mixinDrawable } from '../../render/drawable_mixin';\r\nimport type { Drawable, DrawContext, PickTarget, PrimitiveInstanceInfo, RenderQueue } from '../../render';\r\nimport { Clipmap } from '../../render';\r\nimport { ClipmapTerrainMaterial } from '../../material/terrain-cm';\r\nimport { BoundingBox } from '../../utility/bounding_volume';\r\nimport {\r\n MAX_TERRAIN_MIPMAP_LEVELS,\r\n QUEUE_OPAQUE,\r\n RENDER_PASS_TYPE_OBJECT_COLOR,\r\n RENDER_PASS_TYPE_SHADOWMAP\r\n} from '../../values';\r\nimport type { BlitType } from '../../blitter';\r\nimport { CopyBlitter } from '../../blitter';\r\nimport { fetchSampler } from '../../utility/misc';\r\nimport { RenderMipmap } from '../../utility/rendermipmap';\r\nimport { GrassRenderer } from './grass';\r\nimport type { Camera } from '../../camera';\r\nimport { getDevice } from '../../app/api';\r\n\r\nclass HeightMinMaxBlitter extends CopyBlitter {\r\n filter(\r\n scope: PBInsideFunctionScope,\r\n type: BlitType,\r\n srcTex: PBShaderExp,\r\n srcUV: PBShaderExp,\r\n srcLayer: PBShaderExp,\r\n sampleType: 'float' | 'int' | 'uint'\r\n ) {\r\n return this.readTexel(scope, type, srcTex, srcUV, srcLayer, sampleType).xxxx as PBShaderExp;\r\n }\r\n}\r\n\r\nclass HeightBoundingGenerator extends RenderMipmap {\r\n renderPixel(\r\n scope: PBInsideFunctionScope,\r\n leftTop: PBShaderExp,\r\n rightTop: PBShaderExp,\r\n leftBottom: PBShaderExp,\r\n rightBottom: PBShaderExp\r\n ) {\r\n const pb = scope.$builder;\r\n scope.$l.maxHeight = pb.max(pb.max(leftTop.r, rightTop.r), pb.max(leftBottom.r, rightBottom.r));\r\n scope.$l.minHeight = pb.min(pb.min(leftTop.g, rightTop.g), pb.min(leftBottom.g, rightBottom.g));\r\n return pb.vec4(scope.maxHeight, scope.minHeight, leftTop.r, 1);\r\n }\r\n}\r\n\r\n/**\r\n * ClipmapTerrain implements an efficient terrain rendering system using clipmaps.\r\n *\r\n * Clipmaps provide level-of-detail (LOD) rendering for large terrains by using\r\n * multiple nested grids at different resolutions. The terrain automatically\r\n * adjusts detail levels based on camera distance, providing high detail near\r\n * the camera and lower detail in the distance.\r\n *\r\n * Key features:\r\n * - Automatic LOD management based on camera position\r\n * - Support for height maps, splat maps, and detail textures\r\n * - Integrated grass rendering system\r\n *\r\n * @public\r\n */\r\nexport class ClipmapTerrain extends applyMixins(GraphNode, mixinDrawable) implements Drawable {\r\n private static readonly _heightBoundingGenerator = new HeightBoundingGenerator();\r\n private static readonly _copyBlitter = new HeightMinMaxBlitter();\r\n private static readonly _tmpBuffer = new Float32Array(MAX_TERRAIN_MIPMAP_LEVELS * 2 * 4);\r\n private readonly _pickTarget: PickTarget;\r\n private _clipmap: Clipmap;\r\n private _renderData: Nullable<PrimitiveInstanceInfo[]>;\r\n private _gridScale: number;\r\n private _material: DRef<ClipmapTerrainMaterial>;\r\n private _grassRenderer: DRef<GrassRenderer>;\r\n private _castShadow: boolean;\r\n private _sizeX: number;\r\n private _sizeZ: number;\r\n private _heightMapAssetId: string;\r\n private _splatMapAssetId: string;\r\n private _grassAssetId: string;\r\n private _minHeight: number;\r\n private _maxHeight: number;\r\n private _tmpTexture: DRef<Texture2D>;\r\n /**\r\n * Creates a new clipmap terrain instance.\r\n *\r\n * @param scene - Scene to add the terrain to\r\n * @param sizeX - Terrain width in world units (default: 256)\r\n * @param sizeZ - Terrain depth in world units (default: 256)\r\n * @param clipMapTileSize - Size of each clipmap tile in vertices (default: 64)\r\n * Larger values use more memory but reduce draw calls\r\n *\r\n */\r\n constructor(scene: Scene, sizeX = 256, sizeZ = 256, clipMapTileSize = 64) {\r\n super(scene);\r\n this._pickTarget = { node: this };\r\n this._clipmap = new Clipmap(clipMapTileSize, ['tex1_f32'], MAX_TERRAIN_MIPMAP_LEVELS);\r\n this._renderData = null;\r\n this._grassRenderer = new DRef(new GrassRenderer(this));\r\n this._gridScale = 1;\r\n this._castShadow = true;\r\n this._sizeX = sizeX;\r\n this._sizeZ = sizeZ;\r\n this._heightMapAssetId = `assets/.embedded.dir/${this.persistentId}-heightmap.bin`;\r\n this._grassAssetId = `assets/.embedded.dir/${this.persistentId}-grass.bin`;\r\n this._splatMapAssetId = `assets/.embedded.dir/${this.persistentId}-splatmap.bin`;\r\n this._minHeight = 0;\r\n this._maxHeight = 0;\r\n this._material = new DRef(\r\n new ClipmapTerrainMaterial(this.createHeightMapTexture(this._sizeX, this._sizeZ))\r\n );\r\n this._tmpTexture = new DRef();\r\n this.updateRegion();\r\n scene.queuePerCameraUpdateNode(this);\r\n }\r\n /**\r\n * Gets the integrated grass renderer for this terrain.\r\n * The grass renderer handles vegetation rendering on the terrain surface.\r\n *\r\n * @returns The grass renderer instance\r\n */\r\n get grassRenderer() {\r\n return this._grassRenderer.get()!;\r\n }\r\n /**\r\n * Gets the maximum number of detail maps supported by the terrain material.\r\n * Detail maps provide surface texturing (grass, rock, sand, etc.).\r\n *\r\n * @returns Maximum number of detail maps\r\n */\r\n get MAX_DETAIL_MAP_COUNT() {\r\n return ClipmapTerrainMaterial.MAX_DETAIL_MAP_COUNT;\r\n }\r\n /**\r\n * Gets the asset ID for the height map texture.\r\n * Generates a random UUID if not previously set.\r\n *\r\n * @returns Height map asset ID\r\n * @internal\r\n */\r\n get heightMapAssetId() {\r\n if (!this._heightMapAssetId) {\r\n this._heightMapAssetId = randomUUID();\r\n }\r\n return this._heightMapAssetId;\r\n }\r\n /** @internal */\r\n set heightMapAssetId(val: string) {\r\n this._heightMapAssetId = val;\r\n }\r\n /**\r\n * Gets the asset ID for the splat map texture.\r\n * Generates a random UUID if not previously set.\r\n *\r\n * @returns Splat map asset ID\r\n * @internal\r\n */\r\n get splatMapAssetId() {\r\n if (!this._splatMapAssetId) {\r\n this._splatMapAssetId = randomUUID();\r\n }\r\n return this._splatMapAssetId;\r\n }\r\n /** @internal */\r\n set splatMapAssetId(val: string) {\r\n this._splatMapAssetId = val;\r\n }\r\n /**\r\n * Gets the asset ID for grass configuration.\r\n * Generates a random UUID if not previously set.\r\n *\r\n * @returns Grass asset ID\r\n * @internal\r\n */\r\n get grassAssetId() {\r\n if (!this._grassAssetId) {\r\n this._grassAssetId = randomUUID();\r\n }\r\n return this._grassAssetId;\r\n }\r\n /** @internal */\r\n set grassAssetId(val: string) {\r\n this._grassAssetId = val;\r\n }\r\n /**\r\n * The current number of active detail maps.\r\n * Detail maps define different surface materials (grass, rock, etc.).\r\n *\r\n * @returns Number of active detail maps\r\n */\r\n get numDetailMaps() {\r\n return this.material?.numDetailMaps ?? 0;\r\n }\r\n set numDetailMaps(val) {\r\n if (this.material) {\r\n this.material.numDetailMaps = val;\r\n }\r\n }\r\n /** {@inheritDoc SceneNode.clone} */\r\n async clone(): Promise<this> {\r\n throw new Error('Cloning clipmap terrain not implemented');\r\n }\r\n /**\r\n * Sets the terrain size.\r\n * Triggers height map resize if dimensions change.\r\n *\r\n * @param sizeX - New width\r\n * @param sizeZ - New depth\r\n */\r\n setSize(sizeX: number, sizeZ: number) {\r\n if (sizeX !== this._sizeX || sizeZ !== this._sizeZ) {\r\n this._sizeX = sizeX;\r\n this._sizeZ = sizeZ;\r\n this.resizeHeightMap(this._sizeX, this._sizeZ);\r\n }\r\n }\r\n /** Wether the mesh node casts shadows */\r\n get castShadow() {\r\n return this._castShadow;\r\n }\r\n set castShadow(val) {\r\n this._castShadow = !!val;\r\n }\r\n /** The terrain width. */\r\n get sizeX() {\r\n return this._sizeX;\r\n }\r\n set sizeX(val) {\r\n if (val !== this._sizeX) {\r\n this._sizeX = val;\r\n this.resizeHeightMap(this._sizeX, this._sizeZ);\r\n }\r\n }\r\n /** The terrain depth. */\r\n get sizeZ() {\r\n return this._sizeZ;\r\n }\r\n set sizeZ(val) {\r\n if (val !== this._sizeZ) {\r\n this._sizeZ = val;\r\n this.resizeHeightMap(this._sizeX, this._sizeZ);\r\n }\r\n }\r\n /** The current height map texture. */\r\n get heightMap() {\r\n return this.material?.heightMap ?? null;\r\n }\r\n set heightMap(val) {\r\n if (this.material && val) {\r\n this.material.heightMap = val;\r\n this.updateRegion();\r\n }\r\n }\r\n /** The splat map texture */\r\n get splatMap() {\r\n return this.material?.getSplatMap() ?? null;\r\n }\r\n /** Material instance of the terrain */\r\n get material() {\r\n return this._material?.get() ?? null;\r\n }\r\n /** whether wireframe rendering is enabled */\r\n get wireframe() {\r\n return this._clipmap.wireframe;\r\n }\r\n set wireframe(val) {\r\n this._clipmap.wireframe = val;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getPickTarget }\r\n */\r\n getPickTarget() {\r\n return this._pickTarget;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getMorphData}\r\n */\r\n getMorphData() {\r\n return null;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getMorphInfo}\r\n */\r\n getMorphInfo() {\r\n return null;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getQueueType}\r\n */\r\n getQueueType() {\r\n return this.material?.getQueueType() ?? QUEUE_OPAQUE;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.isUnlit}\r\n */\r\n isUnlit() {\r\n return this.material ? !this.material.supportLighting() : false;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.needSceneColor}\r\n */\r\n needSceneColor() {\r\n return this.material?.needSceneColor() ?? false;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.needSceneDepth}\r\n */\r\n needSceneDepth() {\r\n return this.material?.needSceneDepth() ?? false;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getMaterial}\r\n */\r\n getMaterial() {\r\n return this._material.get();\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getPrimitive}\r\n */\r\n getPrimitive() {\r\n return null;\r\n }\r\n /**\r\n * {@inheritDoc SceneNode.isClipmapTerrain}\r\n */\r\n isClipmapTerrain(): this is ClipmapTerrain {\r\n return true;\r\n }\r\n /**\r\n * {@inheritDoc SceneNode.computeBoundingVolume}\r\n */\r\n computeBoundingVolume() {\r\n return null;\r\n }\r\n /**\r\n * {@inheritDoc SceneNode.computeWorldBoundingVolume}\r\n */\r\n computeWorldBoundingVolume() {\r\n if (this.material) {\r\n const p = this.worldMatrix.transformPointAffine(Vector3.zero());\r\n const minHeight = this._minHeight * this.scale.y;\r\n const maxHeight = this._maxHeight * this.scale.y;\r\n return new BoundingBox(\r\n new Vector3(this.material.region.x, p.y + Math.min(minHeight, maxHeight), this.material.region.y),\r\n new Vector3(this.material.region.z, p.y + Math.max(minHeight, maxHeight), this.material.region.w)\r\n );\r\n } else {\r\n return null;\r\n }\r\n }\r\n /**\r\n * the actual world-space region covered by this terrain (After applying world transform).\r\n */\r\n get worldRegion(): Immutable<Vector4> {\r\n return this.material?.region ?? Vector4.zero();\r\n }\r\n /**\r\n * Calculates the local transformation matrix.\r\n * For terrains, this only includes translation.\r\n *\r\n * @param outMatrix - Output matrix to store the result\r\n */\r\n calculateLocalTransform(outMatrix: Matrix4x4) {\r\n outMatrix.translation(this._position);\r\n }\r\n /**\r\n * Calculates the world transformation matrix.\r\n * Terrains inherit only translation from parent nodes.\r\n *\r\n * @param outMatrix - Output matrix to store the result\r\n */\r\n calculateWorldTransform(outMatrix: Matrix4x4) {\r\n outMatrix.set(this.localMatrix);\r\n if (this.parent) {\r\n outMatrix.m03 += this.parent.worldMatrix.m03;\r\n outMatrix.m13 += this.parent.worldMatrix.m13;\r\n outMatrix.m23 += this.parent.worldMatrix.m23;\r\n }\r\n }\r\n /**\r\n * Updates the terrain's bounding box by analyzing the height map.\r\n * This is an asynchronous operation that reads back GPU data.\r\n *\r\n * @param tmpTexture - Optional temporary texture to reuse (optimization)\r\n *\r\n * @example\r\n * ```typescript\r\n * // Update bounding box after changing height map\r\n * terrain.heightMap = newHeightMap;\r\n * terrain.updateBoundingBox();\r\n * ```\r\n */\r\n updateBoundingBox() {\r\n const heightMap = this.heightMap;\r\n if (!heightMap) {\r\n return;\r\n }\r\n const device = getDevice();\r\n let tmp = this._tmpTexture.get();\r\n if (tmp && (tmp.width !== heightMap.width || tmp.height !== heightMap.height)) {\r\n this._tmpTexture.dispose();\r\n }\r\n if (!this._tmpTexture.get()) {\r\n tmp = getDevice().createTexture2D(\r\n device.type === 'webgl' ? 'rgba32f' : 'rg32f',\r\n heightMap.width,\r\n heightMap.height\r\n )!;\r\n tmp.name = 'TerrainBoundingBoxTexture';\r\n this._tmpTexture.set(tmp);\r\n }\r\n const tmpFB = device.createFrameBuffer([tmp!], null);\r\n ClipmapTerrain._copyBlitter.blit(heightMap, tmpFB, fetchSampler('clamp_nearest_nomip'));\r\n tmpFB.dispose();\r\n ClipmapTerrain._heightBoundingGenerator.render(tmp!);\r\n const data = new Float32Array(4);\r\n tmp!\r\n .readPixels(0, 0, 1, 1, 0, tmp!.mipLevelCount - 1, data)\r\n .then(() => {\r\n this._minHeight = data[0];\r\n this._maxHeight = data[1];\r\n this.invalidateWorldBoundingVolume(false);\r\n })\r\n .catch((_err) => {\r\n console.error('Read pixels failed');\r\n });\r\n }\r\n /** @internal */\r\n createHeightMapTexture(width: number, height: number) {\r\n return getDevice().createTexture2D(getDevice().type === 'webgl' ? 'rgba16f' : 'r16f', width, height)!;\r\n }\r\n /** @internal */\r\n protected _onTransformChanged(invalidateLocal: boolean) {\r\n super._onTransformChanged(invalidateLocal);\r\n this.updateRegion();\r\n }\r\n /** {@inheritDoc SceneNode.updatePerCamera} */\r\n updatePerCamera(camera: Camera, _elapsedInSeconds: number, _deltaInSeconds: number) {\r\n const mat = this._material.get();\r\n if (!mat) {\r\n return;\r\n }\r\n const that = this;\r\n const bv = this.getWorldBoundingVolume()!.toAABB();\r\n this._renderData = this._clipmap.gather({\r\n camera: camera,\r\n minMaxWorldPos: mat.region,\r\n gridScale: this._gridScale,\r\n userData: this,\r\n frustumCulling: !this.castShadow,\r\n calcAABB(userData: unknown, minX, maxX, minZ, maxZ, outAABB) {\r\n const p = that.worldMatrix.transformPointAffine(Vector3.zero());\r\n outAABB.minPoint.setXYZ(minX, bv ? bv.minPoint.y : p.y - 9999, minZ);\r\n outAABB.maxPoint.setXYZ(maxX, bv ? bv.maxPoint.y : p.y + 9999, maxZ);\r\n }\r\n });\r\n let maxMipLevel = 0;\r\n for (const info of this._renderData) {\r\n const buffer = info.primitive.getVertexBuffer('texCoord1')!;\r\n buffer.bufferSubData(0, info.mipLevels, 0, info.numInstances);\r\n if (info.maxMiplevel > maxMipLevel) {\r\n maxMipLevel = info.maxMiplevel;\r\n }\r\n }\r\n const levelAABB = this._clipmap.calcLevelAABB(camera, mat.region, this._gridScale);\r\n const cameraPos = camera.getWorldPosition();\r\n const tmpBuffer = ClipmapTerrain._tmpBuffer;\r\n\r\n for (let i = 0; i <= maxMipLevel; i++) {\r\n if (i === 0) {\r\n tmpBuffer[i * 8 + 0] = cameraPos.x;\r\n tmpBuffer[i * 8 + 1] = cameraPos.z;\r\n tmpBuffer[i * 8 + 2] = cameraPos.x;\r\n tmpBuffer[i * 8 + 3] = cameraPos.z;\r\n } else {\r\n const prevAABB = levelAABB[i - 1];\r\n tmpBuffer[i * 8 + 0] = prevAABB.minPoint.x;\r\n tmpBuffer[i * 8 + 1] = prevAABB.minPoint.z;\r\n tmpBuffer[i * 8 + 2] = prevAABB.maxPoint.x;\r\n tmpBuffer[i * 8 + 3] = prevAABB.maxPoint.z;\r\n }\r\n const currentAABB = levelAABB[i];\r\n tmpBuffer[i * 8 + 4] = 1 / (currentAABB.minPoint.x - tmpBuffer[i * 8 + 0]);\r\n tmpBuffer[i * 8 + 5] = 1 / (currentAABB.minPoint.z - tmpBuffer[i * 8 + 1]);\r\n tmpBuffer[i * 8 + 6] = 1 / (currentAABB.maxPoint.x - tmpBuffer[i * 8 + 2]);\r\n tmpBuffer[i * 8 + 7] = 1 / (currentAABB.maxPoint.z - tmpBuffer[i * 8 + 3]);\r\n }\r\n mat.setLevelData(tmpBuffer, 8 * (maxMipLevel + 1));\r\n\r\n this.scene?.queuePerCameraUpdateNode(this);\r\n }\r\n /**\r\n * Updates the terrain material region based on current position and scale.\r\n * Should be called after changing position, scale, or height map.\r\n */\r\n updateRegion() {\r\n if (this.material) {\r\n const x = Math.abs(this.scale.x);\r\n const z = Math.abs(this.scale.z);\r\n const px = this.position.x + (this.parent?.worldMatrix.m03 ?? 0);\r\n const pz = this.position.z + (this.parent?.worldMatrix.m23 ?? 0);\r\n this._gridScale = Math.max(\r\n (x * this._sizeX) / this.material.heightMap.width,\r\n (z * this._sizeZ) / this.material.heightMap.height\r\n );\r\n this.material.update(new Vector4(px, pz, px + x * this._sizeX, pz + z * this._sizeZ), this.scale);\r\n this.grassRenderer.updateMaterial();\r\n }\r\n }\r\n /** {@inheritDoc Drawable.draw} */\r\n draw(ctx: DrawContext, renderQueue: Nullable<RenderQueue>) {\r\n const mat = this._material?.get();\r\n if (mat) {\r\n this.bind(ctx, renderQueue);\r\n mat.setClipmapGridInfo(this._gridScale, this.worldMatrix.m03, this.worldMatrix.m23);\r\n mat.apply(ctx);\r\n for (const info of this._renderData!) {\r\n mat.draw(info.primitive, ctx, info.numInstances);\r\n }\r\n if (\r\n ctx.renderPass!.type !== RENDER_PASS_TYPE_OBJECT_COLOR &&\r\n ctx.renderPass!.type !== RENDER_PASS_TYPE_SHADOWMAP\r\n ) {\r\n this.grassRenderer.draw(ctx);\r\n }\r\n }\r\n }\r\n /** @internal */\r\n private resizeHeightMap(sizeX: number, sizeZ: number) {\r\n if (this.material) {\r\n const oldHeightMap = this.material.heightMap;\r\n const device = getDevice();\r\n const maxTextureSize = device.getDeviceCaps().textureCaps.maxTextureSize;\r\n sizeX = Math.min(Math.max(sizeX, 1), maxTextureSize) >> 0;\r\n sizeZ = Math.min(Math.max(sizeZ, 1), maxTextureSize) >> 0;\r\n if (sizeX !== oldHeightMap.width || sizeZ !== oldHeightMap.height) {\r\n const newHeightMap = device.createTexture2D(\r\n device.type === 'webgl' ? 'rgba16f' : 'r16f',\r\n sizeX,\r\n sizeZ\r\n )!;\r\n const fb = device.createFrameBuffer([newHeightMap], null);\r\n ClipmapTerrain._copyBlitter.blit(oldHeightMap, fb, fetchSampler('clamp_linear_nomip'));\r\n fb.dispose();\r\n this.heightMap = newHeightMap;\r\n this.updateBoundingBox();\r\n }\r\n }\r\n }\r\n /*\r\n private calcNormalHeightMap(): Texture2D {\r\n const device = getDevice();\r\n if (!ClipmapTerrain._normalHeightMapProgram) {\r\n ClipmapTerrain._normalHeightMapProgram = device.buildRenderProgram({\r\n vertex(pb) {\r\n this.$inputs.pos = pb.vec2().attrib('position');\r\n this.$outputs.uv = pb.vec2();\r\n pb.main(function () {\r\n this.$builtins.position = pb.vec4(this.$inputs.pos, 0, 1);\r\n this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));\r\n if (device.type === 'webgpu') {\r\n this.$builtins.position.y = pb.neg(this.$builtins.position.y);\r\n }\r\n });\r\n },\r\n fragment(pb) {\r\n this.heightMap = pb.tex2D().uniform(0);\r\n this.texelSize = pb.vec2().uniform(0);\r\n this.terrainScale = pb.vec3().uniform(0);\r\n this.$outputs.outColor = pb.vec4();\r\n pb.func('calcNormal', [pb.vec2('texCoord')], function () {\r\n this.$l.t = pb.textureSample(\r\n this.heightMap,\r\n pb.sub(this.texCoord, pb.vec2(0, this.texelSize.y))\r\n ).r;\r\n this.$l.l = pb.textureSample(\r\n this.heightMap,\r\n pb.sub(this.texCoord, pb.vec2(this.texelSize.x, 0))\r\n ).r;\r\n this.$l.r = pb.textureSample(\r\n this.heightMap,\r\n pb.add(this.texCoord, pb.vec2(this.texelSize.x, 0))\r\n ).r;\r\n this.$l.b = pb.textureSample(\r\n this.heightMap,\r\n pb.add(this.texCoord, pb.vec2(0, this.texelSize.y))\r\n ).r;\r\n this.$l.tx = pb.vec3(this.terrainScale.x, pb.mul(pb.sub(this.r, this.l), this.terrainScale.y), 0);\r\n this.$l.tz = pb.vec3(0, pb.mul(pb.sub(this.b, this.t), this.terrainScale.y), this.terrainScale.z);\r\n this.$l.normal = pb.normalize(pb.cross(this.tz, this.tx));\r\n this.$return(this.normal);\r\n });\r\n pb.main(function () {\r\n this.$l.normal = this.calcNormal(this.$inputs.uv);\r\n this.$outputs.outColor = pb.vec4(pb.add(pb.mul(this.normal, 0.5), pb.vec3(0.5)), 1);\r\n });\r\n }\r\n });\r\n }\r\n }\r\n */\r\n /**\r\n * Disposes of all resources used by this terrain.\r\n * Should be called when the terrain is no longer needed.\r\n */\r\n protected onDispose() {\r\n super.onDispose();\r\n this._clipmap?.dispose();\r\n this._material?.dispose();\r\n this._grassRenderer?.dispose();\r\n }\r\n}\r\n"],"names":["HeightMinMaxBlitter","CopyBlitter","filter","scope","type","srcTex","srcUV","srcLayer","sampleType","readTexel","xxxx","HeightBoundingGenerator","RenderMipmap","renderPixel","leftTop","rightTop","leftBottom","rightBottom","pb","$builder","$l","maxHeight","max","r","minHeight","min","g","vec4","ClipmapTerrain","applyMixins","GraphNode","mixinDrawable","_heightBoundingGenerator","_copyBlitter","_tmpBuffer","Float32Array","MAX_TERRAIN_MIPMAP_LEVELS","_pickTarget","_clipmap","_renderData","_gridScale","_material","_grassRenderer","_castShadow","_sizeX","_sizeZ","_heightMapAssetId","_splatMapAssetId","_grassAssetId","_minHeight","_maxHeight","_tmpTexture","scene","sizeX","sizeZ","clipMapTileSize","node","Clipmap","DRef","GrassRenderer","persistentId","ClipmapTerrainMaterial","createHeightMapTexture","updateRegion","queuePerCameraUpdateNode","grassRenderer","get","MAX_DETAIL_MAP_COUNT","heightMapAssetId","randomUUID","val","splatMapAssetId","grassAssetId","numDetailMaps","material","clone","Error","setSize","resizeHeightMap","castShadow","heightMap","splatMap","getSplatMap","wireframe","getPickTarget","getMorphData","getMorphInfo","getQueueType","QUEUE_OPAQUE","isUnlit","supportLighting","needSceneColor","needSceneDepth","getMaterial","getPrimitive","isClipmapTerrain","computeBoundingVolume","computeWorldBoundingVolume","p","worldMatrix","transformPointAffine","Vector3","zero","scale","y","BoundingBox","region","x","Math","z","w","worldRegion","Vector4","calculateLocalTransform","outMatrix","translation","_position","calculateWorldTransform","set","localMatrix","parent","m03","m13","m23","updateBoundingBox","device","getDevice","tmp","width","height","dispose","createTexture2D","name","tmpFB","createFrameBuffer","blit","fetchSampler","render","data","readPixels","mipLevelCount","then","invalidateWorldBoundingVolume","catch","_err","console","error","_onTransformChanged","invalidateLocal","updatePerCamera","camera","_elapsedInSeconds","_deltaInSeconds","mat","that","bv","getWorldBoundingVolume","toAABB","gather","minMaxWorldPos","gridScale","userData","frustumCulling","calcAABB","minX","maxX","minZ","maxZ","outAABB","minPoint","setXYZ","maxPoint","maxMipLevel","info","buffer","primitive","getVertexBuffer","bufferSubData","mipLevels","numInstances","maxMiplevel","levelAABB","calcLevelAABB","cameraPos","getWorldPosition","tmpBuffer","i","prevAABB","currentAABB","setLevelData","abs","px","position","pz","update","updateMaterial","draw","ctx","renderQueue","bind","setClipmapGridInfo","apply","renderPass","RENDER_PASS_TYPE_OBJECT_COLOR","RENDER_PASS_TYPE_SHADOWMAP","oldHeightMap","maxTextureSize","getDeviceCaps","textureCaps","newHeightMap","fb","onDispose"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwBA,MAAMA,mBAA4BC,SAAAA,WAAAA,CAAAA;IAChCC,MACEC,CAAAA,KAA4B,EAC5BC,IAAc,EACdC,MAAmB,EACnBC,KAAkB,EAClBC,QAAqB,EACrBC,UAAoC,EACpC;QACA,OAAO,IAAI,CAACC,SAAS,CAACN,KAAAA,EAAOC,MAAMC,MAAQC,EAAAA,KAAAA,EAAOC,QAAUC,EAAAA,UAAAA,CAAAA,CAAYE,IAAI;AAC9E;AACF;AAEA,MAAMC,uBAAgCC,SAAAA,YAAAA,CAAAA;IACpCC,WACEV,CAAAA,KAA4B,EAC5BW,OAAoB,EACpBC,QAAqB,EACrBC,UAAuB,EACvBC,WAAwB,EACxB;QACA,MAAMC,EAAAA,GAAKf,MAAMgB,QAAQ;QACzBhB,KAAMiB,CAAAA,EAAE,CAACC,SAAS,GAAGH,GAAGI,GAAG,CAACJ,EAAGI,CAAAA,GAAG,CAACR,OAAAA,CAAQS,CAAC,EAAER,QAAAA,CAASQ,CAAC,CAAA,EAAGL,EAAGI,CAAAA,GAAG,CAACN,UAAWO,CAAAA,CAAC,EAAEN,WAAAA,CAAYM,CAAC,CAAA,CAAA;QAC7FpB,KAAMiB,CAAAA,EAAE,CAACI,SAAS,GAAGN,GAAGO,GAAG,CAACP,EAAGO,CAAAA,GAAG,CAACX,OAAAA,CAAQY,CAAC,EAAEX,QAAAA,CAASW,CAAC,CAAA,EAAGR,EAAGO,CAAAA,GAAG,CAACT,UAAWU,CAAAA,CAAC,EAAET,WAAAA,CAAYS,CAAC,CAAA,CAAA;QAC7F,OAAOR,EAAAA,CAAGS,IAAI,CAACxB,KAAMkB,CAAAA,SAAS,EAAElB,KAAAA,CAAMqB,SAAS,EAAEV,OAAQS,CAAAA,CAAC,EAAE,CAAA,CAAA;AAC9D;AACF;AAEA;;;;;;;;;;;;;;AAcC,IACM,MAAMK,cAAuBC,SAAAA,WAAAA,CAAYC,SAAWC,EAAAA,aAAAA,CAAAA,CAAAA;IACzD,OAAwBC,wBAAAA,GAA2B,IAAIrB,uBAA0B,EAAA;IACjF,OAAwBsB,YAAAA,GAAe,IAAIjC,mBAAsB,EAAA;AACjE,IAAA,OAAwBkC,UAAa,GAAA,IAAIC,YAAaC,CAAAA,yBAAAA,GAA4B,IAAI,CAAG,CAAA;IACxEC,WAAwB;IACjCC,QAAkB;IAClBC,WAA+C;IAC/CC,UAAmB;IACnBC,SAAwC;IACxCC,cAAoC;IACpCC,WAAqB;IACrBC,MAAe;IACfC,MAAe;IACfC,iBAA0B;IAC1BC,gBAAyB;IACzBC,aAAsB;IACtBC,UAAmB;IACnBC,UAAmB;IACnBC,WAA6B;AACrC;;;;;;;;;MAUA,WAAA,CAAYC,KAAY,EAAEC,KAAQ,GAAA,GAAG,EAAEC,KAAAA,GAAQ,GAAG,EAAEC,eAAkB,GAAA,EAAE,CAAE;AACxE,QAAA,KAAK,CAACH,KAAAA,CAAAA;QACN,IAAI,CAACf,WAAW,GAAG;AAAEmB,YAAAA,IAAAA,EAAM;AAAK,SAAA;AAChC,QAAA,IAAI,CAAClB,QAAQ,GAAG,IAAImB,QAAQF,eAAiB,EAAA;AAAC,YAAA;SAAW,EAAEnB,yBAAAA,CAAAA;QAC3D,IAAI,CAACG,WAAW,GAAG,IAAA;AACnB,QAAA,IAAI,CAACG,cAAc,GAAG,IAAIgB,IAAK,CAAA,IAAIC,cAAc,IAAI,CAAA,CAAA;QACrD,IAAI,CAACnB,UAAU,GAAG,CAAA;QAClB,IAAI,CAACG,WAAW,GAAG,IAAA;QACnB,IAAI,CAACC,MAAM,GAAGS,KAAAA;QACd,IAAI,CAACR,MAAM,GAAGS,KAAAA;QACd,IAAI,CAACR,iBAAiB,GAAG,CAAC,qBAAqB,EAAE,IAAI,CAACc,YAAY,CAAC,cAAc,CAAC;QAClF,IAAI,CAACZ,aAAa,GAAG,CAAC,qBAAqB,EAAE,IAAI,CAACY,YAAY,CAAC,UAAU,CAAC;QAC1E,IAAI,CAACb,gBAAgB,GAAG,CAAC,qBAAqB,EAAE,IAAI,CAACa,YAAY,CAAC,aAAa,CAAC;QAChF,IAAI,CAACX,UAAU,GAAG,CAAA;QAClB,IAAI,CAACC,UAAU,GAAG,CAAA;AAClB,QAAA,IAAI,CAACT,SAAS,GAAG,IAAIiB,IAAAA,CACnB,IAAIG,sBAAuB,CAAA,IAAI,CAACC,sBAAsB,CAAC,IAAI,CAAClB,MAAM,EAAE,IAAI,CAACC,MAAM,CAAA,CAAA,CAAA;QAEjF,IAAI,CAACM,WAAW,GAAG,IAAIO,IAAAA,EAAAA;AACvB,QAAA,IAAI,CAACK,YAAY,EAAA;QACjBX,KAAMY,CAAAA,wBAAwB,CAAC,IAAI,CAAA;AACrC;AACA;;;;;AAKC,MACD,IAAIC,aAAgB,GAAA;AAClB,QAAA,OAAO,IAAI,CAACvB,cAAc,CAACwB,GAAG,EAAA;AAChC;AACA;;;;;AAKC,MACD,IAAIC,oBAAuB,GAAA;AACzB,QAAA,OAAON,uBAAuBM,oBAAoB;AACpD;AACA;;;;;;AAMC,MACD,IAAIC,gBAAmB,GAAA;AACrB,QAAA,IAAI,CAAC,IAAI,CAACtB,iBAAiB,EAAE;YAC3B,IAAI,CAACA,iBAAiB,GAAGuB,UAAAA,EAAAA;AAC3B;QACA,OAAO,IAAI,CAACvB,iBAAiB;AAC/B;AACA,qBACA,IAAIsB,gBAAiBE,CAAAA,GAAW,EAAE;QAChC,IAAI,CAACxB,iBAAiB,GAAGwB,GAAAA;AAC3B;AACA;;;;;;AAMC,MACD,IAAIC,eAAkB,GAAA;AACpB,QAAA,IAAI,CAAC,IAAI,CAACxB,gBAAgB,EAAE;YAC1B,IAAI,CAACA,gBAAgB,GAAGsB,UAAAA,EAAAA;AAC1B;QACA,OAAO,IAAI,CAACtB,gBAAgB;AAC9B;AACA,qBACA,IAAIwB,eAAgBD,CAAAA,GAAW,EAAE;QAC/B,IAAI,CAACvB,gBAAgB,GAAGuB,GAAAA;AAC1B;AACA;;;;;;AAMC,MACD,IAAIE,YAAe,GAAA;AACjB,QAAA,IAAI,CAAC,IAAI,CAACxB,aAAa,EAAE;YACvB,IAAI,CAACA,aAAa,GAAGqB,UAAAA,EAAAA;AACvB;QACA,OAAO,IAAI,CAACrB,aAAa;AAC3B;AACA,qBACA,IAAIwB,YAAaF,CAAAA,GAAW,EAAE;QAC5B,IAAI,CAACtB,aAAa,GAAGsB,GAAAA;AACvB;AACA;;;;;AAKC,MACD,IAAIG,aAAgB,GAAA;AAClB,QAAA,OAAO,IAAI,CAACC,QAAQ,EAAED,aAAiB,IAAA,CAAA;AACzC;IACA,IAAIA,aAAAA,CAAcH,GAAG,EAAE;QACrB,IAAI,IAAI,CAACI,QAAQ,EAAE;AACjB,YAAA,IAAI,CAACA,QAAQ,CAACD,aAAa,GAAGH,GAAAA;AAChC;AACF;yCAEA,MAAMK,KAAuB,GAAA;AAC3B,QAAA,MAAM,IAAIC,KAAM,CAAA,yCAAA,CAAA;AAClB;AACA;;;;;;AAMC,MACDC,OAAQxB,CAAAA,KAAa,EAAEC,KAAa,EAAE;QACpC,IAAID,KAAAA,KAAU,IAAI,CAACT,MAAM,IAAIU,KAAU,KAAA,IAAI,CAACT,MAAM,EAAE;YAClD,IAAI,CAACD,MAAM,GAAGS,KAAAA;YACd,IAAI,CAACR,MAAM,GAAGS,KAAAA;YACd,IAAI,CAACwB,eAAe,CAAC,IAAI,CAAClC,MAAM,EAAE,IAAI,CAACC,MAAM,CAAA;AAC/C;AACF;8CAEA,IAAIkC,UAAa,GAAA;QACf,OAAO,IAAI,CAACpC,WAAW;AACzB;IACA,IAAIoC,UAAAA,CAAWT,GAAG,EAAE;AAClB,QAAA,IAAI,CAAC3B,WAAW,GAAG,CAAC,CAAC2B,GAAAA;AACvB;8BAEA,IAAIjB,KAAQ,GAAA;QACV,OAAO,IAAI,CAACT,MAAM;AACpB;IACA,IAAIS,KAAAA,CAAMiB,GAAG,EAAE;AACb,QAAA,IAAIA,GAAQ,KAAA,IAAI,CAAC1B,MAAM,EAAE;YACvB,IAAI,CAACA,MAAM,GAAG0B,GAAAA;YACd,IAAI,CAACQ,eAAe,CAAC,IAAI,CAAClC,MAAM,EAAE,IAAI,CAACC,MAAM,CAAA;AAC/C;AACF;8BAEA,IAAIS,KAAQ,GAAA;QACV,OAAO,IAAI,CAACT,MAAM;AACpB;IACA,IAAIS,KAAAA,CAAMgB,GAAG,EAAE;AACb,QAAA,IAAIA,GAAQ,KAAA,IAAI,CAACzB,MAAM,EAAE;YACvB,IAAI,CAACA,MAAM,GAAGyB,GAAAA;YACd,IAAI,CAACQ,eAAe,CAAC,IAAI,CAAClC,MAAM,EAAE,IAAI,CAACC,MAAM,CAAA;AAC/C;AACF;2CAEA,IAAImC,SAAY,GAAA;AACd,QAAA,OAAO,IAAI,CAACN,QAAQ,EAAEM,SAAa,IAAA,IAAA;AACrC;IACA,IAAIA,SAAAA,CAAUV,GAAG,EAAE;AACjB,QAAA,IAAI,IAAI,CAACI,QAAQ,IAAIJ,GAAK,EAAA;AACxB,YAAA,IAAI,CAACI,QAAQ,CAACM,SAAS,GAAGV,GAAAA;AAC1B,YAAA,IAAI,CAACP,YAAY,EAAA;AACnB;AACF;iCAEA,IAAIkB,QAAW,GAAA;AACb,QAAA,OAAO,IAAI,CAACP,QAAQ,EAAEQ,WAAiB,EAAA,IAAA,IAAA;AACzC;4CAEA,IAAIR,QAAW,GAAA;AACb,QAAA,OAAO,IAAI,CAACjC,SAAS,EAAEyB,GAAS,EAAA,IAAA,IAAA;AAClC;kDAEA,IAAIiB,SAAY,GAAA;AACd,QAAA,OAAO,IAAI,CAAC7C,QAAQ,CAAC6C,SAAS;AAChC;IACA,IAAIA,SAAAA,CAAUb,GAAG,EAAE;AACjB,QAAA,IAAI,CAAChC,QAAQ,CAAC6C,SAAS,GAAGb,GAAAA;AAC5B;AACA;;AAEC,MACDc,aAAgB,GAAA;QACd,OAAO,IAAI,CAAC/C,WAAW;AACzB;AACA;;AAEC,MACDgD,YAAe,GAAA;QACb,OAAO,IAAA;AACT;AACA;;AAEC,MACDC,YAAe,GAAA;QACb,OAAO,IAAA;AACT;AACA;;AAEC,MACDC,YAAe,GAAA;AACb,QAAA,OAAO,IAAI,CAACb,QAAQ,EAAEa,YAAkBC,EAAAA,IAAAA,YAAAA;AAC1C;AACA;;AAEC,MACDC,OAAU,GAAA;QACR,OAAO,IAAI,CAACf,QAAQ,GAAG,CAAC,IAAI,CAACA,QAAQ,CAACgB,eAAe,EAAK,GAAA,KAAA;AAC5D;AACA;;AAEC,MACDC,cAAiB,GAAA;AACf,QAAA,OAAO,IAAI,CAACjB,QAAQ,EAAEiB,cAAoB,EAAA,IAAA,KAAA;AAC5C;AACA;;AAEC,MACDC,cAAiB,GAAA;AACf,QAAA,OAAO,IAAI,CAAClB,QAAQ,EAAEkB,cAAoB,EAAA,IAAA,KAAA;AAC5C;AACA;;AAEC,MACDC,WAAc,GAAA;AACZ,QAAA,OAAO,IAAI,CAACpD,SAAS,CAACyB,GAAG,EAAA;AAC3B;AACA;;AAEC,MACD4B,YAAe,GAAA;QACb,OAAO,IAAA;AACT;AACA;;AAEC,MACDC,gBAA2C,GAAA;QACzC,OAAO,IAAA;AACT;AACA;;AAEC,MACDC,qBAAwB,GAAA;QACtB,OAAO,IAAA;AACT;AACA;;AAEC,MACDC,0BAA6B,GAAA;QAC3B,IAAI,IAAI,CAACvB,QAAQ,EAAE;YACjB,MAAMwB,CAAAA,GAAI,IAAI,CAACC,WAAW,CAACC,oBAAoB,CAACC,QAAQC,IAAI,EAAA,CAAA;YAC5D,MAAM9E,SAAAA,GAAY,IAAI,CAACyB,UAAU,GAAG,IAAI,CAACsD,KAAK,CAACC,CAAC;YAChD,MAAMnF,SAAAA,GAAY,IAAI,CAAC6B,UAAU,GAAG,IAAI,CAACqD,KAAK,CAACC,CAAC;YAChD,OAAO,IAAIC,WACT,CAAA,IAAIJ,OAAQ,CAAA,IAAI,CAAC3B,QAAQ,CAACgC,MAAM,CAACC,CAAC,EAAET,EAAEM,CAAC,GAAGI,IAAKnF,CAAAA,GAAG,CAACD,SAAAA,EAAWH,YAAY,IAAI,CAACqD,QAAQ,CAACgC,MAAM,CAACF,CAAC,CAChG,EAAA,IAAIH,OAAQ,CAAA,IAAI,CAAC3B,QAAQ,CAACgC,MAAM,CAACG,CAAC,EAAEX,CAAEM,CAAAA,CAAC,GAAGI,IAAKtF,CAAAA,GAAG,CAACE,SAAAA,EAAWH,SAAY,CAAA,EAAA,IAAI,CAACqD,QAAQ,CAACgC,MAAM,CAACI,CAAC,CAAA,CAAA;SAE7F,MAAA;YACL,OAAO,IAAA;AACT;AACF;AACA;;AAEC,MACD,IAAIC,WAAkC,GAAA;AACpC,QAAA,OAAO,IAAI,CAACrC,QAAQ,EAAEgC,MAAAA,IAAUM,QAAQV,IAAI,EAAA;AAC9C;AACA;;;;;MAMAW,uBAAAA,CAAwBC,SAAoB,EAAE;AAC5CA,QAAAA,SAAAA,CAAUC,WAAW,CAAC,IAAI,CAACC,SAAS,CAAA;AACtC;AACA;;;;;MAMAC,uBAAAA,CAAwBH,SAAoB,EAAE;AAC5CA,QAAAA,SAAAA,CAAUI,GAAG,CAAC,IAAI,CAACC,WAAW,CAAA;QAC9B,IAAI,IAAI,CAACC,MAAM,EAAE;YACfN,SAAUO,CAAAA,GAAG,IAAI,IAAI,CAACD,MAAM,CAACrB,WAAW,CAACsB,GAAG;YAC5CP,SAAUQ,CAAAA,GAAG,IAAI,IAAI,CAACF,MAAM,CAACrB,WAAW,CAACuB,GAAG;YAC5CR,SAAUS,CAAAA,GAAG,IAAI,IAAI,CAACH,MAAM,CAACrB,WAAW,CAACwB,GAAG;AAC9C;AACF;AACA;;;;;;;;;;;;AAYC,MACDC,iBAAoB,GAAA;QAClB,MAAM5C,SAAAA,GAAY,IAAI,CAACA,SAAS;AAChC,QAAA,IAAI,CAACA,SAAW,EAAA;AACd,YAAA;AACF;AACA,QAAA,MAAM6C,MAASC,GAAAA,SAAAA,EAAAA;AACf,QAAA,IAAIC,GAAM,GAAA,IAAI,CAAC5E,WAAW,CAACe,GAAG,EAAA;AAC9B,QAAA,IAAI6D,GAAQA,KAAAA,GAAIC,CAAAA,KAAK,KAAKhD,SAAUgD,CAAAA,KAAK,IAAID,GAAAA,CAAIE,MAAM,KAAKjD,SAAUiD,CAAAA,MAAM,CAAG,EAAA;YAC7E,IAAI,CAAC9E,WAAW,CAAC+E,OAAO,EAAA;AAC1B;AACA,QAAA,IAAI,CAAC,IAAI,CAAC/E,WAAW,CAACe,GAAG,EAAI,EAAA;AAC3B6D,YAAAA,GAAAA,GAAMD,SAAYK,EAAAA,CAAAA,eAAe,CAC/BN,MAAAA,CAAOzH,IAAI,KAAK,OAAU,GAAA,SAAA,GAAY,OACtC4E,EAAAA,SAAAA,CAAUgD,KAAK,EACfhD,UAAUiD,MAAM,CAAA;AAElBF,YAAAA,GAAAA,CAAIK,IAAI,GAAG,2BAAA;AACX,YAAA,IAAI,CAACjF,WAAW,CAACmE,GAAG,CAACS,GAAAA,CAAAA;AACvB;QACA,MAAMM,KAAAA,GAAQR,MAAOS,CAAAA,iBAAiB,CAAC;AAACP,YAAAA;SAAK,EAAE,IAAA,CAAA;AAC/CnG,QAAAA,cAAAA,CAAeK,YAAY,CAACsG,IAAI,CAACvD,SAAAA,EAAWqD,OAAOG,YAAa,CAAA,qBAAA,CAAA,CAAA;AAChEH,QAAAA,KAAAA,CAAMH,OAAO,EAAA;QACbtG,cAAeI,CAAAA,wBAAwB,CAACyG,MAAM,CAACV,GAAAA,CAAAA;QAC/C,MAAMW,IAAAA,GAAO,IAAIvG,YAAa,CAAA,CAAA,CAAA;AAC9B4F,QAAAA,GAAAA,CACGY,UAAU,CAAC,CAAG,EAAA,CAAA,EAAG,CAAG,EAAA,CAAA,EAAG,CAAGZ,EAAAA,GAAAA,CAAKa,aAAa,GAAG,CAAGF,EAAAA,IAAAA,CAAAA,CAClDG,IAAI,CAAC,IAAA;AACJ,YAAA,IAAI,CAAC5F,UAAU,GAAGyF,IAAI,CAAC,CAAE,CAAA;AACzB,YAAA,IAAI,CAACxF,UAAU,GAAGwF,IAAI,CAAC,CAAE,CAAA;YACzB,IAAI,CAACI,6BAA6B,CAAC,KAAA,CAAA;SAEpCC,CAAAA,CAAAA,KAAK,CAAC,CAACC,IAAAA,GAAAA;AACNC,YAAAA,OAAAA,CAAQC,KAAK,CAAC,oBAAA,CAAA;AAChB,SAAA,CAAA;AACJ;AACA,qBACApF,sBAAAA,CAAuBkE,KAAa,EAAEC,MAAc,EAAE;QACpD,OAAOH,SAAAA,EAAAA,CAAYK,eAAe,CAACL,SAAAA,EAAAA,CAAY1H,IAAI,KAAK,OAAA,GAAU,SAAY,GAAA,MAAA,EAAQ4H,KAAOC,EAAAA,MAAAA,CAAAA;AAC/F;AACA,qBACUkB,mBAAoBC,CAAAA,eAAwB,EAAE;AACtD,QAAA,KAAK,CAACD,mBAAoBC,CAAAA,eAAAA,CAAAA;AAC1B,QAAA,IAAI,CAACrF,YAAY,EAAA;AACnB;AACA,mDACAsF,eAAgBC,CAAAA,MAAc,EAAEC,iBAAyB,EAAEC,eAAuB,EAAE;AAClF,QAAA,MAAMC,GAAM,GAAA,IAAI,CAAChH,SAAS,CAACyB,GAAG,EAAA;AAC9B,QAAA,IAAI,CAACuF,GAAK,EAAA;AACR,YAAA;AACF;AACA,QAAA,MAAMC,OAAO,IAAI;AACjB,QAAA,MAAMC,EAAK,GAAA,IAAI,CAACC,sBAAsB,GAAIC,MAAM,EAAA;QAChD,IAAI,CAACtH,WAAW,GAAG,IAAI,CAACD,QAAQ,CAACwH,MAAM,CAAC;YACtCR,MAAQA,EAAAA,MAAAA;AACRS,YAAAA,cAAAA,EAAgBN,IAAI/C,MAAM;YAC1BsD,SAAW,EAAA,IAAI,CAACxH,UAAU;AAC1ByH,YAAAA,QAAAA,EAAU,IAAI;YACdC,cAAgB,EAAA,CAAC,IAAI,CAACnF,UAAU;YAChCoF,QAASF,CAAAA,CAAAA,QAAiB,EAAEG,IAAI,EAAEC,IAAI,EAAEC,IAAI,EAAEC,IAAI,EAAEC,OAAO,EAAA;AACzD,gBAAA,MAAMtE,IAAIwD,IAAKvD,CAAAA,WAAW,CAACC,oBAAoB,CAACC,QAAQC,IAAI,EAAA,CAAA;AAC5DkE,gBAAAA,OAAAA,CAAQC,QAAQ,CAACC,MAAM,CAACN,MAAMT,EAAKA,GAAAA,EAAAA,CAAGc,QAAQ,CAACjE,CAAC,GAAGN,CAAEM,CAAAA,CAAC,GAAG,IAAM8D,EAAAA,IAAAA,CAAAA;AAC/DE,gBAAAA,OAAAA,CAAQG,QAAQ,CAACD,MAAM,CAACL,MAAMV,EAAKA,GAAAA,EAAAA,CAAGgB,QAAQ,CAACnE,CAAC,GAAGN,CAAEM,CAAAA,CAAC,GAAG,IAAM+D,EAAAA,IAAAA,CAAAA;AACjE;AACF,SAAA,CAAA;AACA,QAAA,IAAIK,WAAc,GAAA,CAAA;AAClB,QAAA,KAAK,MAAMC,IAAAA,IAAQ,IAAI,CAACtI,WAAW,CAAE;AACnC,YAAA,MAAMuI,MAASD,GAAAA,IAAAA,CAAKE,SAAS,CAACC,eAAe,CAAC,WAAA,CAAA;YAC9CF,MAAOG,CAAAA,aAAa,CAAC,CAAGJ,EAAAA,IAAAA,CAAKK,SAAS,EAAE,CAAA,EAAGL,KAAKM,YAAY,CAAA;YAC5D,IAAIN,IAAAA,CAAKO,WAAW,GAAGR,WAAa,EAAA;AAClCA,gBAAAA,WAAAA,GAAcC,KAAKO,WAAW;AAChC;AACF;AACA,QAAA,MAAMC,SAAY,GAAA,IAAI,CAAC/I,QAAQ,CAACgJ,aAAa,CAAChC,MAAAA,EAAQG,GAAI/C,CAAAA,MAAM,EAAE,IAAI,CAAClE,UAAU,CAAA;QACjF,MAAM+I,SAAAA,GAAYjC,OAAOkC,gBAAgB,EAAA;QACzC,MAAMC,SAAAA,GAAY7J,eAAeM,UAAU;AAE3C,QAAA,IAAK,IAAIwJ,CAAAA,GAAI,CAAGA,EAAAA,CAAAA,IAAKd,aAAac,CAAK,EAAA,CAAA;AACrC,YAAA,IAAIA,MAAM,CAAG,EAAA;AACXD,gBAAAA,SAAS,CAACC,CAAI,GAAA,CAAA,GAAI,CAAE,CAAA,GAAGH,UAAU5E,CAAC;AAClC8E,gBAAAA,SAAS,CAACC,CAAI,GAAA,CAAA,GAAI,CAAE,CAAA,GAAGH,UAAU1E,CAAC;AAClC4E,gBAAAA,SAAS,CAACC,CAAI,GAAA,CAAA,GAAI,CAAE,CAAA,GAAGH,UAAU5E,CAAC;AAClC8E,gBAAAA,SAAS,CAACC,CAAI,GAAA,CAAA,GAAI,CAAE,CAAA,GAAGH,UAAU1E,CAAC;aAC7B,MAAA;AACL,gBAAA,MAAM8E,QAAWN,GAAAA,SAAS,CAACK,CAAAA,GAAI,CAAE,CAAA;gBACjCD,SAAS,CAACC,IAAI,CAAI,GAAA,CAAA,CAAE,GAAGC,QAASlB,CAAAA,QAAQ,CAAC9D,CAAC;gBAC1C8E,SAAS,CAACC,IAAI,CAAI,GAAA,CAAA,CAAE,GAAGC,QAASlB,CAAAA,QAAQ,CAAC5D,CAAC;gBAC1C4E,SAAS,CAACC,IAAI,CAAI,GAAA,CAAA,CAAE,GAAGC,QAAShB,CAAAA,QAAQ,CAAChE,CAAC;gBAC1C8E,SAAS,CAACC,IAAI,CAAI,GAAA,CAAA,CAAE,GAAGC,QAAShB,CAAAA,QAAQ,CAAC9D,CAAC;AAC5C;YACA,MAAM+E,WAAAA,GAAcP,SAAS,CAACK,CAAE,CAAA;AAChCD,YAAAA,SAAS,CAACC,CAAI,GAAA,CAAA,GAAI,CAAE,CAAA,GAAG,KAAKE,WAAAA,CAAYnB,QAAQ,CAAC9D,CAAC,GAAG8E,SAAS,CAACC,CAAI,GAAA,CAAA,GAAI,EAAE,CAAD;AACxED,YAAAA,SAAS,CAACC,CAAI,GAAA,CAAA,GAAI,CAAE,CAAA,GAAG,KAAKE,WAAAA,CAAYnB,QAAQ,CAAC5D,CAAC,GAAG4E,SAAS,CAACC,CAAI,GAAA,CAAA,GAAI,EAAE,CAAD;AACxED,YAAAA,SAAS,CAACC,CAAI,GAAA,CAAA,GAAI,CAAE,CAAA,GAAG,KAAKE,WAAAA,CAAYjB,QAAQ,CAAChE,CAAC,GAAG8E,SAAS,CAACC,CAAI,GAAA,CAAA,GAAI,EAAE,CAAD;AACxED,YAAAA,SAAS,CAACC,CAAI,GAAA,CAAA,GAAI,CAAE,CAAA,GAAG,KAAKE,WAAAA,CAAYjB,QAAQ,CAAC9D,CAAC,GAAG4E,SAAS,CAACC,CAAI,GAAA,CAAA,GAAI,EAAE,CAAD;AAC1E;AACAjC,QAAAA,GAAAA,CAAIoC,YAAY,CAACJ,SAAAA,EAAW,CAAKb,IAAAA,cAAc,CAAA,CAAA,CAAA;AAE/C,QAAA,IAAI,CAACxH,KAAK,EAAEY,wBAAAA,CAAyB,IAAI,CAAA;AAC3C;AACA;;;AAGC,MACDD,YAAe,GAAA;QACb,IAAI,IAAI,CAACW,QAAQ,EAAE;YACjB,MAAMiC,CAAAA,GAAIC,KAAKkF,GAAG,CAAC,IAAI,CAACvF,KAAK,CAACI,CAAC,CAAA;YAC/B,MAAME,CAAAA,GAAID,KAAKkF,GAAG,CAAC,IAAI,CAACvF,KAAK,CAACM,CAAC,CAAA;AAC/B,YAAA,MAAMkF,EAAK,GAAA,IAAI,CAACC,QAAQ,CAACrF,CAAC,IAAI,IAAI,CAACa,MAAM,EAAErB,WAAAA,CAAYsB,OAAO,CAAA,CAAA;AAC9D,YAAA,MAAMwE,EAAK,GAAA,IAAI,CAACD,QAAQ,CAACnF,CAAC,IAAI,IAAI,CAACW,MAAM,EAAErB,WAAAA,CAAYwB,OAAO,CAAA,CAAA;AAC9D,YAAA,IAAI,CAACnF,UAAU,GAAGoE,IAAAA,CAAKtF,GAAG,CACvBqF,CAAI,GAAA,IAAI,CAAC/D,MAAM,GAAI,IAAI,CAAC8B,QAAQ,CAACM,SAAS,CAACgD,KAAK,EACjD,CAACnB,GAAI,IAAI,CAAChE,MAAM,GAAI,IAAI,CAAC6B,QAAQ,CAACM,SAAS,CAACiD,MAAM,CAAA;YAEpD,IAAI,CAACvD,QAAQ,CAACwH,MAAM,CAAC,IAAIlF,OAAAA,CAAQ+E,EAAIE,EAAAA,EAAAA,EAAIF,EAAKpF,GAAAA,CAAAA,GAAI,IAAI,CAAC/D,MAAM,EAAEqJ,EAAAA,GAAKpF,CAAI,GAAA,IAAI,CAAChE,MAAM,CAAA,EAAG,IAAI,CAAC0D,KAAK,CAAA;YAChG,IAAI,CAACtC,aAAa,CAACkI,cAAc,EAAA;AACnC;AACF;AACA,uCACAC,IAAAA,CAAKC,GAAgB,EAAEC,WAAkC,EAAE;AACzD,QAAA,MAAM7C,GAAM,GAAA,IAAI,CAAChH,SAAS,EAAEyB,GAAAA,EAAAA;AAC5B,QAAA,IAAIuF,GAAK,EAAA;YACP,IAAI,CAAC8C,IAAI,CAACF,GAAKC,EAAAA,WAAAA,CAAAA;AACf7C,YAAAA,GAAAA,CAAI+C,kBAAkB,CAAC,IAAI,CAAChK,UAAU,EAAE,IAAI,CAAC2D,WAAW,CAACsB,GAAG,EAAE,IAAI,CAACtB,WAAW,CAACwB,GAAG,CAAA;AAClF8B,YAAAA,GAAAA,CAAIgD,KAAK,CAACJ,GAAAA,CAAAA;AACV,YAAA,KAAK,MAAMxB,IAAAA,IAAQ,IAAI,CAACtI,WAAW,CAAG;AACpCkH,gBAAAA,GAAAA,CAAI2C,IAAI,CAACvB,IAAAA,CAAKE,SAAS,EAAEsB,GAAAA,EAAKxB,KAAKM,YAAY,CAAA;AACjD;YACA,IACEkB,GAAAA,CAAIK,UAAU,CAAEtM,IAAI,KAAKuM,6BACzBN,IAAAA,GAAAA,CAAIK,UAAU,CAAEtM,IAAI,KAAKwM,0BACzB,EAAA;AACA,gBAAA,IAAI,CAAC3I,aAAa,CAACmI,IAAI,CAACC,GAAAA,CAAAA;AAC1B;AACF;AACF;AACA,qBACA,eAAQvH,CAAgBzB,KAAa,EAAEC,KAAa,EAAE;QACpD,IAAI,IAAI,CAACoB,QAAQ,EAAE;AACjB,YAAA,MAAMmI,YAAe,GAAA,IAAI,CAACnI,QAAQ,CAACM,SAAS;AAC5C,YAAA,MAAM6C,MAASC,GAAAA,SAAAA,EAAAA;AACf,YAAA,MAAMgF,iBAAiBjF,MAAOkF,CAAAA,aAAa,EAAGC,CAAAA,WAAW,CAACF,cAAc;YACxEzJ,KAAQuD,GAAAA,IAAAA,CAAKnF,GAAG,CAACmF,IAAAA,CAAKtF,GAAG,CAAC+B,KAAAA,EAAO,IAAIyJ,cAAmB,CAAA,IAAA,CAAA;YACxDxJ,KAAQsD,GAAAA,IAAAA,CAAKnF,GAAG,CAACmF,IAAAA,CAAKtF,GAAG,CAACgC,KAAAA,EAAO,IAAIwJ,cAAmB,CAAA,IAAA,CAAA;AACxD,YAAA,IAAIzJ,UAAUwJ,YAAa7E,CAAAA,KAAK,IAAI1E,KAAUuJ,KAAAA,YAAAA,CAAa5E,MAAM,EAAE;gBACjE,MAAMgF,YAAAA,GAAepF,MAAOM,CAAAA,eAAe,CACzCN,MAAAA,CAAOzH,IAAI,KAAK,OAAA,GAAU,SAAY,GAAA,MAAA,EACtCiD,KACAC,EAAAA,KAAAA,CAAAA;gBAEF,MAAM4J,EAAAA,GAAKrF,MAAOS,CAAAA,iBAAiB,CAAC;AAAC2E,oBAAAA;iBAAa,EAAE,IAAA,CAAA;AACpDrL,gBAAAA,cAAAA,CAAeK,YAAY,CAACsG,IAAI,CAACsE,YAAAA,EAAcK,IAAI1E,YAAa,CAAA,oBAAA,CAAA,CAAA;AAChE0E,gBAAAA,EAAAA,CAAGhF,OAAO,EAAA;gBACV,IAAI,CAAClD,SAAS,GAAGiI,YAAAA;AACjB,gBAAA,IAAI,CAACrF,iBAAiB,EAAA;AACxB;AACF;AACF;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuDC,MACD,SAAsB,GAAA;AACpB,QAAA,KAAK,CAACuF,SAAAA,EAAAA;QACN,IAAI,CAAC7K,QAAQ,EAAE4F,OAAAA,EAAAA;QACf,IAAI,CAACzF,SAAS,EAAEyF,OAAAA,EAAAA;QAChB,IAAI,CAACxF,cAAc,EAAEwF,OAAAA,EAAAA;AACvB;AACF;;;;"}
|
|
1
|
+
{"version":3,"file":"terrain-cm.js","sources":["../../../src/scene/terrain-cm/terrain-cm.ts"],"sourcesContent":["import type { Immutable, Matrix4x4, Nullable } from '@zephyr3d/base';\r\nimport { Vector4, applyMixins, Vector3, DRef, randomUUID } from '@zephyr3d/base';\r\nimport type { PBInsideFunctionScope, PBShaderExp, Texture2D } from '@zephyr3d/device';\r\nimport type { Scene } from '../scene';\r\nimport { GraphNode } from '../graph_node';\r\nimport { mixinDrawable } from '../../render/drawable_mixin';\r\nimport type { Drawable, DrawContext, PickTarget, PrimitiveInstanceInfo, RenderQueue } from '../../render';\r\nimport { Clipmap } from '../../render';\r\nimport { ClipmapTerrainMaterial } from '../../material/terrain-cm';\r\nimport { BoundingBox } from '../../utility/bounding_volume';\r\nimport {\r\n MAX_TERRAIN_MIPMAP_LEVELS,\r\n QUEUE_OPAQUE,\r\n RENDER_PASS_TYPE_OBJECT_COLOR,\r\n RENDER_PASS_TYPE_SHADOWMAP\r\n} from '../../values';\r\nimport type { BlitType } from '../../blitter';\r\nimport { CopyBlitter } from '../../blitter';\r\nimport { fetchSampler } from '../../utility/misc';\r\nimport { RenderMipmap } from '../../utility/rendermipmap';\r\nimport { GrassRenderer } from './grass';\r\nimport type { Camera } from '../../camera';\r\nimport { getDevice } from '../../app/api';\r\n\r\nclass HeightMinMaxBlitter extends CopyBlitter {\r\n filter(\r\n scope: PBInsideFunctionScope,\r\n type: BlitType,\r\n srcTex: PBShaderExp,\r\n srcUV: PBShaderExp,\r\n srcLayer: PBShaderExp,\r\n sampleType: 'float' | 'int' | 'uint'\r\n ) {\r\n return this.readTexel(scope, type, srcTex, srcUV, srcLayer, sampleType).xxxx as PBShaderExp;\r\n }\r\n}\r\n\r\nclass HeightBoundingGenerator extends RenderMipmap {\r\n renderPixel(\r\n scope: PBInsideFunctionScope,\r\n leftTop: PBShaderExp,\r\n rightTop: PBShaderExp,\r\n leftBottom: PBShaderExp,\r\n rightBottom: PBShaderExp\r\n ) {\r\n const pb = scope.$builder;\r\n scope.$l.maxHeight = pb.max(pb.max(leftTop.r, rightTop.r), pb.max(leftBottom.r, rightBottom.r));\r\n scope.$l.minHeight = pb.min(pb.min(leftTop.g, rightTop.g), pb.min(leftBottom.g, rightBottom.g));\r\n return pb.vec4(scope.maxHeight, scope.minHeight, leftTop.r, 1);\r\n }\r\n}\r\n\r\n/**\r\n * ClipmapTerrain implements an efficient terrain rendering system using clipmaps.\r\n *\r\n * Clipmaps provide level-of-detail (LOD) rendering for large terrains by using\r\n * multiple nested grids at different resolutions. The terrain automatically\r\n * adjusts detail levels based on camera distance, providing high detail near\r\n * the camera and lower detail in the distance.\r\n *\r\n * Key features:\r\n * - Automatic LOD management based on camera position\r\n * - Support for height maps, splat maps, and detail textures\r\n * - Integrated grass rendering system\r\n *\r\n * @public\r\n */\r\nexport class ClipmapTerrain extends applyMixins(GraphNode, mixinDrawable) implements Drawable {\r\n private static readonly _heightBoundingGenerator = new HeightBoundingGenerator();\r\n private static readonly _copyBlitter = new HeightMinMaxBlitter();\r\n private static readonly _tmpBuffer = new Float32Array(MAX_TERRAIN_MIPMAP_LEVELS * 2 * 4);\r\n private readonly _pickTarget: PickTarget;\r\n private _clipmap: Clipmap;\r\n private _renderData: Nullable<PrimitiveInstanceInfo[]>;\r\n private _gridScale: number;\r\n private _material: DRef<ClipmapTerrainMaterial>;\r\n private _grassRenderer: DRef<GrassRenderer>;\r\n private _castShadow: boolean;\r\n private _sizeX: number;\r\n private _sizeZ: number;\r\n private _heightMapAssetId: string;\r\n private _splatMapAssetId: string;\r\n private _grassAssetId: string;\r\n private _minHeight: number;\r\n private _maxHeight: number;\r\n private _tmpTexture: DRef<Texture2D>;\r\n /**\r\n * Creates a new clipmap terrain instance.\r\n *\r\n * @param scene - Scene to add the terrain to\r\n * @param sizeX - Terrain width in world units (default: 256)\r\n * @param sizeZ - Terrain depth in world units (default: 256)\r\n * @param clipMapTileSize - Size of each clipmap tile in vertices (default: 64)\r\n * Larger values use more memory but reduce draw calls\r\n *\r\n */\r\n constructor(scene: Scene, sizeX = 256, sizeZ = 256, clipMapTileSize = 64) {\r\n super(scene);\r\n this._pickTarget = { node: this };\r\n this._clipmap = new Clipmap(clipMapTileSize, ['tex1_f32'], MAX_TERRAIN_MIPMAP_LEVELS);\r\n this._renderData = null;\r\n this._grassRenderer = new DRef(new GrassRenderer(this));\r\n this._gridScale = 1;\r\n this._castShadow = true;\r\n this._sizeX = sizeX;\r\n this._sizeZ = sizeZ;\r\n this._heightMapAssetId = `assets/.embedded.dir/${this.persistentId}-heightmap.bin`;\r\n this._grassAssetId = `assets/.embedded.dir/${this.persistentId}-grass.bin`;\r\n this._splatMapAssetId = `assets/.embedded.dir/${this.persistentId}-splatmap.bin`;\r\n this._minHeight = 0;\r\n this._maxHeight = 0;\r\n this._material = new DRef(\r\n new ClipmapTerrainMaterial(this.createHeightMapTexture(this._sizeX, this._sizeZ))\r\n );\r\n this._tmpTexture = new DRef();\r\n this.updateRegion();\r\n scene.queuePerCameraUpdateNode(this);\r\n }\r\n /**\r\n * Gets the integrated grass renderer for this terrain.\r\n * The grass renderer handles vegetation rendering on the terrain surface.\r\n *\r\n * @returns The grass renderer instance\r\n */\r\n get grassRenderer() {\r\n return this._grassRenderer.get()!;\r\n }\r\n /**\r\n * Gets the maximum number of detail maps supported by the terrain material.\r\n * Detail maps provide surface texturing (grass, rock, sand, etc.).\r\n *\r\n * @returns Maximum number of detail maps\r\n */\r\n get MAX_DETAIL_MAP_COUNT() {\r\n return ClipmapTerrainMaterial.MAX_DETAIL_MAP_COUNT;\r\n }\r\n /**\r\n * Gets the asset ID for the height map texture.\r\n * Generates a random UUID if not previously set.\r\n *\r\n * @returns Height map asset ID\r\n * @internal\r\n */\r\n get heightMapAssetId() {\r\n if (!this._heightMapAssetId) {\r\n this._heightMapAssetId = randomUUID();\r\n }\r\n return this._heightMapAssetId;\r\n }\r\n /** @internal */\r\n set heightMapAssetId(val: string) {\r\n this._heightMapAssetId = val;\r\n }\r\n /**\r\n * Gets the asset ID for the splat map texture.\r\n * Generates a random UUID if not previously set.\r\n *\r\n * @returns Splat map asset ID\r\n * @internal\r\n */\r\n get splatMapAssetId() {\r\n if (!this._splatMapAssetId) {\r\n this._splatMapAssetId = randomUUID();\r\n }\r\n return this._splatMapAssetId;\r\n }\r\n /** @internal */\r\n set splatMapAssetId(val: string) {\r\n this._splatMapAssetId = val;\r\n }\r\n /**\r\n * Gets the asset ID for grass configuration.\r\n * Generates a random UUID if not previously set.\r\n *\r\n * @returns Grass asset ID\r\n * @internal\r\n */\r\n get grassAssetId() {\r\n if (!this._grassAssetId) {\r\n this._grassAssetId = randomUUID();\r\n }\r\n return this._grassAssetId;\r\n }\r\n /** @internal */\r\n set grassAssetId(val: string) {\r\n this._grassAssetId = val;\r\n }\r\n /**\r\n * The current number of active detail maps.\r\n * Detail maps define different surface materials (grass, rock, etc.).\r\n *\r\n * @returns Number of active detail maps\r\n */\r\n get numDetailMaps() {\r\n return this.material?.numDetailMaps ?? 0;\r\n }\r\n set numDetailMaps(val) {\r\n if (this.material) {\r\n this.material.numDetailMaps = val;\r\n }\r\n }\r\n /** {@inheritDoc SceneNode.clone} */\r\n async clone(): Promise<this> {\r\n throw new Error('Cloning clipmap terrain not implemented');\r\n }\r\n /**\r\n * Sets the terrain size.\r\n * Triggers height map resize if dimensions change.\r\n *\r\n * @param sizeX - New width\r\n * @param sizeZ - New depth\r\n */\r\n setSize(sizeX: number, sizeZ: number) {\r\n if (sizeX !== this._sizeX || sizeZ !== this._sizeZ) {\r\n this._sizeX = sizeX;\r\n this._sizeZ = sizeZ;\r\n this.resizeHeightMap(this._sizeX, this._sizeZ);\r\n }\r\n }\r\n /** Wether the mesh node casts shadows */\r\n get castShadow() {\r\n return this._castShadow;\r\n }\r\n set castShadow(val) {\r\n this._castShadow = !!val;\r\n }\r\n /** The terrain width. */\r\n get sizeX() {\r\n return this._sizeX;\r\n }\r\n set sizeX(val) {\r\n if (val !== this._sizeX) {\r\n this._sizeX = val;\r\n this.resizeHeightMap(this._sizeX, this._sizeZ);\r\n }\r\n }\r\n /** The terrain depth. */\r\n get sizeZ() {\r\n return this._sizeZ;\r\n }\r\n set sizeZ(val) {\r\n if (val !== this._sizeZ) {\r\n this._sizeZ = val;\r\n this.resizeHeightMap(this._sizeX, this._sizeZ);\r\n }\r\n }\r\n /** The current height map texture. */\r\n get heightMap() {\r\n return this.material?.heightMap ?? null;\r\n }\r\n set heightMap(val) {\r\n if (this.material && val) {\r\n this.material.heightMap = val;\r\n this.updateRegion();\r\n }\r\n }\r\n /** The splat map texture */\r\n get splatMap() {\r\n return this.material?.getSplatMap() ?? null;\r\n }\r\n /** Material instance of the terrain */\r\n get material() {\r\n return this._material?.get() ?? null;\r\n }\r\n /** whether wireframe rendering is enabled */\r\n get wireframe() {\r\n return this._clipmap.wireframe;\r\n }\r\n set wireframe(val) {\r\n this._clipmap.wireframe = val;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getPickTarget }\r\n */\r\n getPickTarget() {\r\n return this._pickTarget;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getMorphData}\r\n */\r\n getMorphData() {\r\n return null;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getMorphInfo}\r\n */\r\n getMorphInfo() {\r\n return null;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getQueueType}\r\n */\r\n getQueueType() {\r\n return this.material?.getQueueType() ?? QUEUE_OPAQUE;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.isUnlit}\r\n */\r\n isUnlit() {\r\n return this.material ? !this.material.supportLighting() : false;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.needSceneColor}\r\n */\r\n needSceneColor() {\r\n return this.material?.needSceneColor() ?? false;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.needSceneDepth}\r\n */\r\n needSceneDepth() {\r\n return this.material?.needSceneDepth() ?? false;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getMaterial}\r\n */\r\n getMaterial() {\r\n return this._material.get();\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getPrimitive}\r\n */\r\n getPrimitive() {\r\n return null;\r\n }\r\n /**\r\n * {@inheritDoc SceneNode.isClipmapTerrain}\r\n */\r\n isClipmapTerrain(): this is ClipmapTerrain {\r\n return true;\r\n }\r\n /**\r\n * {@inheritDoc SceneNode.computeBoundingVolume}\r\n */\r\n computeBoundingVolume() {\r\n return null;\r\n }\r\n /**\r\n * {@inheritDoc SceneNode.computeWorldBoundingVolume}\r\n */\r\n computeWorldBoundingVolume() {\r\n if (this.material) {\r\n const p = this.worldMatrix.transformPointAffine(Vector3.zero());\r\n const minHeight = this._minHeight * this.scale.y;\r\n const maxHeight = this._maxHeight * this.scale.y;\r\n return new BoundingBox(\r\n new Vector3(this.material.region.x, p.y + Math.min(minHeight, maxHeight), this.material.region.y),\r\n new Vector3(this.material.region.z, p.y + Math.max(minHeight, maxHeight), this.material.region.w)\r\n );\r\n } else {\r\n return null;\r\n }\r\n }\r\n /**\r\n * the actual world-space region covered by this terrain (After applying world transform).\r\n */\r\n get worldRegion(): Immutable<Vector4> {\r\n return this.material?.region ?? Vector4.zero();\r\n }\r\n /**\r\n * Calculates the local transformation matrix.\r\n * For terrains, this only includes translation.\r\n *\r\n * @param outMatrix - Output matrix to store the result\r\n */\r\n calculateLocalTransform(outMatrix: Matrix4x4) {\r\n outMatrix.translation(this._position);\r\n }\r\n /**\r\n * Calculates the world transformation matrix.\r\n * Terrains inherit only translation from parent nodes.\r\n *\r\n * @param outMatrix - Output matrix to store the result\r\n */\r\n calculateWorldTransform(outMatrix: Matrix4x4) {\r\n outMatrix.set(this.localMatrix);\r\n if (this.parent) {\r\n outMatrix.m03 += this.parent.worldMatrix.m03;\r\n outMatrix.m13 += this.parent.worldMatrix.m13;\r\n outMatrix.m23 += this.parent.worldMatrix.m23;\r\n }\r\n }\r\n /**\r\n * Updates the terrain's bounding box by analyzing the height map.\r\n * This is an asynchronous operation that reads back GPU data.\r\n *\r\n * @param tmpTexture - Optional temporary texture to reuse (optimization)\r\n *\r\n * @example\r\n * ```typescript\r\n * // Update bounding box after changing height map\r\n * terrain.heightMap = newHeightMap;\r\n * terrain.updateBoundingBox();\r\n * ```\r\n */\r\n updateBoundingBox() {\r\n const heightMap = this.heightMap;\r\n if (!heightMap) {\r\n return;\r\n }\r\n const device = getDevice();\r\n let tmp = this._tmpTexture.get();\r\n if (tmp && (tmp.width !== heightMap.width || tmp.height !== heightMap.height)) {\r\n this._tmpTexture.dispose();\r\n }\r\n if (!this._tmpTexture.get()) {\r\n tmp = getDevice().createTexture2D(\r\n device.type === 'webgl' ? 'rgba32f' : 'rg32f',\r\n heightMap.width,\r\n heightMap.height\r\n )!;\r\n tmp.name = 'TerrainBoundingBoxTexture';\r\n this._tmpTexture.set(tmp);\r\n }\r\n const tmpFB = device.createFrameBuffer([tmp!], null);\r\n ClipmapTerrain._copyBlitter.blit(heightMap, tmpFB, fetchSampler('clamp_nearest_nomip'));\r\n tmpFB.dispose();\r\n ClipmapTerrain._heightBoundingGenerator.render(tmp!);\r\n const data = new Float32Array(4);\r\n tmp!\r\n .readPixels(0, 0, 1, 1, 0, tmp!.mipLevelCount - 1, data)\r\n .then(() => {\r\n this._minHeight = data[0];\r\n this._maxHeight = data[1];\r\n this.invalidateWorldBoundingVolume(false);\r\n })\r\n .catch((_err) => {\r\n console.error('Read pixels failed');\r\n });\r\n }\r\n /** @internal */\r\n createHeightMapTexture(width: number, height: number) {\r\n return getDevice().createTexture2D(getDevice().type === 'webgl' ? 'rgba16f' : 'r16f', width, height)!;\r\n }\r\n /** @internal */\r\n protected _onTransformChanged(invalidateLocal: boolean) {\r\n super._onTransformChanged(invalidateLocal);\r\n this.updateRegion();\r\n }\r\n /** {@inheritDoc SceneNode.updatePerCamera} */\r\n updatePerCamera(camera: Camera, _elapsedInSeconds: number, _deltaInSeconds: number) {\r\n const mat = this._material.get();\r\n if (!mat) {\r\n return;\r\n }\r\n const that = this;\r\n const bv = this.getWorldBoundingVolume()!.toAABB();\r\n this._renderData = this._clipmap.gather({\r\n camera: camera,\r\n minMaxWorldPos: mat.region,\r\n gridScale: this._gridScale,\r\n userData: this,\r\n frustumCulling: !this.castShadow,\r\n calcAABB(userData: unknown, minX, maxX, minZ, maxZ, outAABB) {\r\n const p = that.worldMatrix.transformPointAffine(Vector3.zero());\r\n outAABB.minPoint.setXYZ(minX, bv ? bv.minPoint.y : p.y - 9999, minZ);\r\n outAABB.maxPoint.setXYZ(maxX, bv ? bv.maxPoint.y : p.y + 9999, maxZ);\r\n }\r\n });\r\n let maxMipLevel = 0;\r\n for (const info of this._renderData) {\r\n const buffer = info.primitive.getVertexBuffer('texCoord1')!;\r\n buffer.bufferSubData(0, info.mipLevels, 0, info.numInstances);\r\n if (info.maxMiplevel > maxMipLevel) {\r\n maxMipLevel = info.maxMiplevel;\r\n }\r\n }\r\n const levelAABB = this._clipmap.calcLevelAABB(camera, mat.region, this._gridScale);\r\n const cameraPos = camera.getWorldPosition();\r\n const tmpBuffer = ClipmapTerrain._tmpBuffer;\r\n\r\n for (let i = 0; i <= maxMipLevel; i++) {\r\n if (i === 0) {\r\n tmpBuffer[i * 8 + 0] = cameraPos.x;\r\n tmpBuffer[i * 8 + 1] = cameraPos.z;\r\n tmpBuffer[i * 8 + 2] = cameraPos.x;\r\n tmpBuffer[i * 8 + 3] = cameraPos.z;\r\n } else {\r\n const prevAABB = levelAABB[i - 1];\r\n tmpBuffer[i * 8 + 0] = prevAABB.minPoint.x;\r\n tmpBuffer[i * 8 + 1] = prevAABB.minPoint.z;\r\n tmpBuffer[i * 8 + 2] = prevAABB.maxPoint.x;\r\n tmpBuffer[i * 8 + 3] = prevAABB.maxPoint.z;\r\n }\r\n const currentAABB = levelAABB[i];\r\n tmpBuffer[i * 8 + 4] = 1 / (currentAABB.minPoint.x - tmpBuffer[i * 8 + 0]);\r\n tmpBuffer[i * 8 + 5] = 1 / (currentAABB.minPoint.z - tmpBuffer[i * 8 + 1]);\r\n tmpBuffer[i * 8 + 6] = 1 / (currentAABB.maxPoint.x - tmpBuffer[i * 8 + 2]);\r\n tmpBuffer[i * 8 + 7] = 1 / (currentAABB.maxPoint.z - tmpBuffer[i * 8 + 3]);\r\n }\r\n mat.setLevelData(tmpBuffer, 8 * (maxMipLevel + 1));\r\n\r\n this.scene?.queuePerCameraUpdateNode(this);\r\n }\r\n /**\r\n * Updates the terrain material region based on current position and scale.\r\n * Should be called after changing position, scale, or height map.\r\n */\r\n updateRegion() {\r\n if (this.material) {\r\n const x = Math.abs(this.scale.x);\r\n const z = Math.abs(this.scale.z);\r\n const px = this.position.x + (this.parent?.worldMatrix.m03 ?? 0);\r\n const pz = this.position.z + (this.parent?.worldMatrix.m23 ?? 0);\r\n this._gridScale = Math.max(\r\n (x * this._sizeX) / this.material.heightMap.width,\r\n (z * this._sizeZ) / this.material.heightMap.height\r\n );\r\n this.material.update(new Vector4(px, pz, px + x * this._sizeX, pz + z * this._sizeZ), this.scale);\r\n this.grassRenderer.updateMaterial();\r\n }\r\n }\r\n /** {@inheritDoc Drawable.draw} */\r\n draw(ctx: DrawContext, renderQueue: Nullable<RenderQueue>) {\r\n const mat = this._material?.get();\r\n if (mat) {\r\n this.bind(ctx, renderQueue);\r\n mat.setClipmapGridInfo(this._gridScale, this.worldMatrix.m03, this.worldMatrix.m23);\r\n mat.apply(ctx);\r\n for (const info of this._renderData!) {\r\n mat.draw(info.primitive, ctx, info.numInstances);\r\n }\r\n if (\r\n ctx.renderPass!.type !== RENDER_PASS_TYPE_OBJECT_COLOR &&\r\n ctx.renderPass!.type !== RENDER_PASS_TYPE_SHADOWMAP\r\n ) {\r\n this.grassRenderer.draw(ctx);\r\n }\r\n }\r\n }\r\n /** @internal */\r\n private resizeHeightMap(sizeX: number, sizeZ: number) {\r\n if (this.material) {\r\n const oldHeightMap = this.material.heightMap;\r\n const device = getDevice();\r\n const maxTextureSize = device.getDeviceCaps().textureCaps.maxTextureSize;\r\n sizeX = Math.min(Math.max(sizeX, 1), maxTextureSize) >> 0;\r\n sizeZ = Math.min(Math.max(sizeZ, 1), maxTextureSize) >> 0;\r\n if (sizeX !== oldHeightMap.width || sizeZ !== oldHeightMap.height) {\r\n const newHeightMap = device.createTexture2D(\r\n device.type === 'webgl' ? 'rgba16f' : 'r16f',\r\n sizeX,\r\n sizeZ\r\n )!;\r\n const fb = device.createFrameBuffer([newHeightMap], null);\r\n ClipmapTerrain._copyBlitter.blit(oldHeightMap, fb, fetchSampler('clamp_linear_nomip'));\r\n fb.dispose();\r\n this.heightMap = newHeightMap;\r\n this.updateBoundingBox();\r\n }\r\n }\r\n }\r\n /*\r\n private calcNormalHeightMap(): Texture2D {\r\n const device = getDevice();\r\n if (!ClipmapTerrain._normalHeightMapProgram) {\r\n ClipmapTerrain._normalHeightMapProgram = device.buildRenderProgram({\r\n vertex(pb) {\r\n this.$inputs.pos = pb.vec2().attrib('position');\r\n this.$outputs.uv = pb.vec2();\r\n pb.main(function () {\r\n this.$builtins.position = pb.vec4(this.$inputs.pos, 0, 1);\r\n this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));\r\n if (device.type === 'webgpu') {\r\n this.$builtins.position.y = pb.neg(this.$builtins.position.y);\r\n }\r\n });\r\n },\r\n fragment(pb) {\r\n this.heightMap = pb.tex2D().uniform(0);\r\n this.texelSize = pb.vec2().uniform(0);\r\n this.terrainScale = pb.vec3().uniform(0);\r\n this.$outputs.outColor = pb.vec4();\r\n pb.func('calcNormal', [pb.vec2('texCoord')], function () {\r\n this.$l.t = pb.textureSample(\r\n this.heightMap,\r\n pb.sub(this.texCoord, pb.vec2(0, this.texelSize.y))\r\n ).r;\r\n this.$l.l = pb.textureSample(\r\n this.heightMap,\r\n pb.sub(this.texCoord, pb.vec2(this.texelSize.x, 0))\r\n ).r;\r\n this.$l.r = pb.textureSample(\r\n this.heightMap,\r\n pb.add(this.texCoord, pb.vec2(this.texelSize.x, 0))\r\n ).r;\r\n this.$l.b = pb.textureSample(\r\n this.heightMap,\r\n pb.add(this.texCoord, pb.vec2(0, this.texelSize.y))\r\n ).r;\r\n this.$l.tx = pb.vec3(this.terrainScale.x, pb.mul(pb.sub(this.r, this.l), this.terrainScale.y), 0);\r\n this.$l.tz = pb.vec3(0, pb.mul(pb.sub(this.b, this.t), this.terrainScale.y), this.terrainScale.z);\r\n this.$l.normal = pb.normalize(pb.cross(this.tz, this.tx));\r\n this.$return(this.normal);\r\n });\r\n pb.main(function () {\r\n this.$l.normal = this.calcNormal(this.$inputs.uv);\r\n this.$outputs.outColor = pb.vec4(pb.add(pb.mul(this.normal, 0.5), pb.vec3(0.5)), 1);\r\n });\r\n }\r\n });\r\n }\r\n }\r\n */\r\n /**\r\n * Disposes of all resources used by this terrain.\r\n * Should be called when the terrain is no longer needed.\r\n */\r\n protected onDispose() {\r\n super.onDispose();\r\n this._clipmap?.dispose();\r\n this._material?.dispose();\r\n this._grassRenderer?.dispose();\r\n }\r\n}\r\n"],"names":["HeightMinMaxBlitter","CopyBlitter","filter","scope","type","srcTex","srcUV","srcLayer","sampleType","readTexel","xxxx","HeightBoundingGenerator","RenderMipmap","renderPixel","leftTop","rightTop","leftBottom","rightBottom","pb","$builder","$l","maxHeight","max","r","minHeight","min","g","vec4","ClipmapTerrain","applyMixins","GraphNode","mixinDrawable","_heightBoundingGenerator","_copyBlitter","_tmpBuffer","Float32Array","MAX_TERRAIN_MIPMAP_LEVELS","_pickTarget","_clipmap","_renderData","_gridScale","_material","_grassRenderer","_castShadow","_sizeX","_sizeZ","_heightMapAssetId","_splatMapAssetId","_grassAssetId","_minHeight","_maxHeight","_tmpTexture","scene","sizeX","sizeZ","clipMapTileSize","node","Clipmap","DRef","GrassRenderer","persistentId","ClipmapTerrainMaterial","createHeightMapTexture","updateRegion","queuePerCameraUpdateNode","grassRenderer","get","MAX_DETAIL_MAP_COUNT","heightMapAssetId","randomUUID","val","splatMapAssetId","grassAssetId","numDetailMaps","material","clone","Error","setSize","resizeHeightMap","castShadow","heightMap","splatMap","getSplatMap","wireframe","getPickTarget","getMorphData","getMorphInfo","getQueueType","QUEUE_OPAQUE","isUnlit","supportLighting","needSceneColor","needSceneDepth","getMaterial","getPrimitive","isClipmapTerrain","computeBoundingVolume","computeWorldBoundingVolume","p","worldMatrix","transformPointAffine","Vector3","zero","scale","y","BoundingBox","region","x","Math","z","w","worldRegion","Vector4","calculateLocalTransform","outMatrix","translation","_position","calculateWorldTransform","set","localMatrix","parent","m03","m13","m23","updateBoundingBox","device","getDevice","tmp","width","height","dispose","createTexture2D","name","tmpFB","createFrameBuffer","blit","fetchSampler","render","data","readPixels","mipLevelCount","then","invalidateWorldBoundingVolume","catch","_err","console","error","_onTransformChanged","invalidateLocal","updatePerCamera","camera","_elapsedInSeconds","_deltaInSeconds","mat","that","bv","getWorldBoundingVolume","toAABB","gather","minMaxWorldPos","gridScale","userData","frustumCulling","calcAABB","minX","maxX","minZ","maxZ","outAABB","minPoint","setXYZ","maxPoint","maxMipLevel","info","buffer","primitive","getVertexBuffer","bufferSubData","mipLevels","numInstances","maxMiplevel","levelAABB","calcLevelAABB","cameraPos","getWorldPosition","tmpBuffer","i","prevAABB","currentAABB","setLevelData","abs","px","position","pz","update","updateMaterial","draw","ctx","renderQueue","bind","setClipmapGridInfo","apply","renderPass","RENDER_PASS_TYPE_OBJECT_COLOR","RENDER_PASS_TYPE_SHADOWMAP","oldHeightMap","maxTextureSize","getDeviceCaps","textureCaps","newHeightMap","fb","onDispose"],"mappings":"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"}
|