@zephyr3d/scene 0.9.25 → 0.9.27
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/animation/animationset.js +92 -30
- package/dist/animation/animationset.js.map +1 -1
- package/dist/animation/hair/gpu_hair_simulation.js +1090 -0
- package/dist/animation/hair/gpu_hair_simulation.js.map +1 -0
- package/dist/animation/joint_dynamics/controller.js +7 -5
- package/dist/animation/joint_dynamics/controller.js.map +1 -1
- package/dist/animation/joint_dynamics/convex_collider.js +320 -0
- package/dist/animation/joint_dynamics/convex_collider.js.map +1 -0
- package/dist/animation/joint_dynamics/joint_dynamics_system.js +81 -5
- package/dist/animation/joint_dynamics/joint_dynamics_system.js.map +1 -1
- package/dist/animation/morphtrack.js +3 -4
- package/dist/animation/morphtrack.js.map +1 -1
- package/dist/animation/skeleton.js +79 -25
- package/dist/animation/skeleton.js.map +1 -1
- package/dist/animation/spring/multi_chain_spring_system.js +577 -179
- package/dist/animation/spring/multi_chain_spring_system.js.map +1 -1
- package/dist/animation/spring/spring_collider.js +4 -3
- package/dist/animation/spring/spring_collider.js.map +1 -1
- package/dist/animation/spring/spring_node_pose_tracker.js +40 -0
- package/dist/animation/spring/spring_node_pose_tracker.js.map +1 -0
- package/dist/animation/spring/spring_particle.js +2 -0
- package/dist/animation/spring/spring_particle.js.map +1 -1
- package/dist/animation/spring/spring_system.js +11 -3
- package/dist/animation/spring/spring_system.js.map +1 -1
- package/dist/animation/spring_modifier.js +10 -0
- package/dist/animation/spring_modifier.js.map +1 -1
- package/dist/app/engine.js +53 -43
- package/dist/app/engine.js.map +1 -1
- package/dist/app/scriptingsystem.js +119 -6
- package/dist/app/scriptingsystem.js.map +1 -1
- package/dist/app/scriptregistry.js +3 -2
- package/dist/app/scriptregistry.js.map +1 -1
- package/dist/asset/assetmanager.js +284 -67
- package/dist/asset/assetmanager.js.map +1 -1
- package/dist/asset/loaders/zhair/zhair_format.js +288 -0
- package/dist/asset/loaders/zhair/zhair_format.js.map +1 -0
- package/dist/asset/loaders/zhair/zhair_loader.js +221 -0
- package/dist/asset/loaders/zhair/zhair_loader.js.map +1 -0
- package/dist/asset/model.js +184 -69
- package/dist/asset/model.js.map +1 -1
- package/dist/camera/camera.js +268 -44
- package/dist/camera/camera.js.map +1 -1
- package/dist/camera/perspectivecamera.js +3 -1
- package/dist/camera/perspectivecamera.js.map +1 -1
- package/dist/index.d.ts +9044 -5139
- package/dist/index.js +17 -6
- package/dist/index.js.map +1 -1
- package/dist/material/eye.js +932 -0
- package/dist/material/eye.js.map +1 -0
- package/dist/material/hair.js +917 -0
- package/dist/material/hair.js.map +1 -0
- package/dist/material/hairstrand.js +842 -0
- package/dist/material/hairstrand.js.map +1 -0
- package/dist/material/hairstrand_data.js +162 -0
- package/dist/material/hairstrand_data.js.map +1 -0
- package/dist/material/lambert.js +5 -2
- package/dist/material/lambert.js.map +1 -1
- package/dist/material/material.js +48 -10
- package/dist/material/material.js.map +1 -1
- package/dist/material/meshmaterial.js +120 -19
- package/dist/material/meshmaterial.js.map +1 -1
- package/dist/material/mixins/albedocolor.js +1 -1
- package/dist/material/mixins/albedocolor.js.map +1 -1
- package/dist/material/mixins/lightmodel/blinnphong.js +5 -3
- package/dist/material/mixins/lightmodel/blinnphong.js.map +1 -1
- package/dist/material/mixins/lightmodel/lambert.js +5 -4
- package/dist/material/mixins/lightmodel/lambert.js.map +1 -1
- package/dist/material/mixins/lightmodel/pbrblueprintmixin.js +3 -3
- package/dist/material/mixins/lightmodel/pbrblueprintmixin.js.map +1 -1
- package/dist/material/mixins/lightmodel/pbrmetallicroughness.js +5 -5
- package/dist/material/mixins/lightmodel/pbrmetallicroughness.js.map +1 -1
- package/dist/material/mixins/lightmodel/pbrspecularglossness.js +3 -3
- package/dist/material/mixins/lightmodel/pbrspecularglossness.js.map +1 -1
- package/dist/material/mixins/lit.js +106 -19
- package/dist/material/mixins/lit.js.map +1 -1
- package/dist/material/mixins/pbr/common.js +4 -4
- package/dist/material/mixins/pbr/common.js.map +1 -1
- package/dist/material/mixins/texture.js +48 -11
- package/dist/material/mixins/texture.js.map +1 -1
- package/dist/material/mtoon.js +6 -5
- package/dist/material/mtoon.js.map +1 -1
- package/dist/material/pbrblueprint.js +146 -28
- package/dist/material/pbrblueprint.js.map +1 -1
- package/dist/material/pbrblueprint_instance.js +501 -0
- package/dist/material/pbrblueprint_instance.js.map +1 -0
- package/dist/material/pbrmr.js +15 -16
- package/dist/material/pbrmr.js.map +1 -1
- package/dist/material/shader/helper.js +734 -23
- package/dist/material/shader/helper.js.map +1 -1
- package/dist/material/shader/terrain_blend.js +55 -0
- package/dist/material/shader/terrain_blend.js.map +1 -0
- package/dist/material/skin.js +192 -32
- package/dist/material/skin.js.map +1 -1
- package/dist/material/spriteblueprint.js +16 -1
- package/dist/material/spriteblueprint.js.map +1 -1
- package/dist/material/subsurfaceprofile.js +86 -23
- package/dist/material/subsurfaceprofile.js.map +1 -1
- package/dist/material/water.js +2059 -72
- package/dist/material/water.js.map +1 -1
- package/dist/posteffect/bloom.js +167 -7
- package/dist/posteffect/bloom.js.map +1 -1
- package/dist/posteffect/coloradjust.js +2 -1
- package/dist/posteffect/coloradjust.js.map +1 -1
- package/dist/posteffect/compositor.js.map +1 -1
- package/dist/posteffect/fxaa.js +2 -1
- package/dist/posteffect/fxaa.js.map +1 -1
- package/dist/posteffect/grayscale.js +3 -1
- package/dist/posteffect/grayscale.js.map +1 -1
- package/dist/posteffect/motionblur.js +664 -56
- package/dist/posteffect/motionblur.js.map +1 -1
- package/dist/posteffect/posteffect.js +12 -1
- package/dist/posteffect/posteffect.js.map +1 -1
- package/dist/posteffect/sao.js +46 -44
- package/dist/posteffect/sao.js.map +1 -1
- package/dist/posteffect/skinsss.js +368 -69
- package/dist/posteffect/skinsss.js.map +1 -1
- package/dist/posteffect/ssgi.js +16 -9
- package/dist/posteffect/ssgi.js.map +1 -1
- package/dist/posteffect/ssr.js +3 -0
- package/dist/posteffect/ssr.js.map +1 -1
- package/dist/posteffect/sss.js +121 -36
- package/dist/posteffect/sss.js.map +1 -1
- package/dist/posteffect/taa.js.map +1 -1
- package/dist/posteffect/tonemap.js +44 -1
- package/dist/posteffect/tonemap.js.map +1 -1
- package/dist/render/abuffer_oit.js +8 -2
- package/dist/render/abuffer_oit.js.map +1 -1
- package/dist/render/clipmap.js +156 -5
- package/dist/render/clipmap.js.map +1 -1
- package/dist/render/cull_visitor.js +20 -0
- package/dist/render/cull_visitor.js.map +1 -1
- package/dist/render/depthpass.js +36 -2
- package/dist/render/depthpass.js.map +1 -1
- package/dist/render/drawable_mixin.js +26 -1
- package/dist/render/drawable_mixin.js.map +1 -1
- package/dist/render/dualdepthpeeling_oit.js +3 -2
- package/dist/render/dualdepthpeeling_oit.js.map +1 -1
- package/dist/render/envlight.js +1 -1
- package/dist/render/envlight.js.map +1 -1
- package/dist/render/fbm_wavegenerator.js +6 -3
- package/dist/render/fbm_wavegenerator.js.map +1 -1
- package/dist/render/fft_wavegenerator.js +57 -15
- package/dist/render/fft_wavegenerator.js.map +1 -1
- package/dist/render/gerstner_wavegenerator.js +130 -20
- package/dist/render/gerstner_wavegenerator.js.map +1 -1
- package/dist/render/globalbindgroup_allocator.js +3 -0
- package/dist/render/globalbindgroup_allocator.js.map +1 -1
- package/dist/render/hzb.js +80 -22
- package/dist/render/hzb.js.map +1 -1
- package/dist/render/lightpass.js +6 -3
- package/dist/render/lightpass.js.map +1 -1
- package/dist/render/oit.js +29 -0
- package/dist/render/oit.js.map +1 -0
- package/dist/render/render_queue.js +39 -0
- package/dist/render/render_queue.js.map +1 -1
- package/dist/render/renderer.js +4 -0
- package/dist/render/renderer.js.map +1 -1
- package/dist/render/rendergraph/blackboard.js +1 -0
- package/dist/render/rendergraph/blackboard.js.map +1 -1
- package/dist/render/rendergraph/device_pool_allocator.js.map +1 -1
- package/dist/render/rendergraph/executor.js +2 -0
- package/dist/render/rendergraph/executor.js.map +1 -1
- package/dist/render/rendergraph/forward_plus_builder.js +379 -10
- package/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
- package/dist/render/rendergraph/frame_resource_requirements.js +1 -0
- package/dist/render/rendergraph/frame_resource_requirements.js.map +1 -1
- package/dist/render/rendergraph/history_resources.js +8 -1
- package/dist/render/rendergraph/history_resources.js.map +1 -1
- package/dist/render/rendergraph/rendergraph.js.map +1 -1
- package/dist/render/rendergraph/texture_affinity_cache.js +1 -1
- package/dist/render/rendergraph/texture_affinity_cache.js.map +1 -1
- package/dist/render/rendergraph/types.js.map +1 -1
- package/dist/render/shadow_mask_pass.js +73 -8
- package/dist/render/shadow_mask_pass.js.map +1 -1
- package/dist/render/sky.js +166 -126
- package/dist/render/sky.js.map +1 -1
- package/dist/render/underwater.js +624 -0
- package/dist/render/underwater.js.map +1 -0
- package/dist/render/water_caustics.js +1380 -0
- package/dist/render/water_caustics.js.map +1 -0
- package/dist/render/weightedblended_oit.js +3 -2
- package/dist/render/weightedblended_oit.js.map +1 -1
- package/dist/scene/basesprite.js +8 -0
- package/dist/scene/basesprite.js.map +1 -1
- package/dist/scene/batchgroup.js +3 -0
- package/dist/scene/batchgroup.js.map +1 -1
- package/dist/scene/environment.js +4 -1
- package/dist/scene/environment.js.map +1 -1
- package/dist/scene/hair.js +963 -0
- package/dist/scene/hair.js.map +1 -0
- package/dist/scene/light.js +5 -1
- package/dist/scene/light.js.map +1 -1
- package/dist/scene/mesh.js +481 -47
- package/dist/scene/mesh.js.map +1 -1
- package/dist/scene/meshdrawable.js +6 -0
- package/dist/scene/meshdrawable.js.map +1 -1
- package/dist/scene/msdftext.js +3 -0
- package/dist/scene/msdftext.js.map +1 -1
- package/dist/scene/msdftextsprite.js +3 -0
- package/dist/scene/msdftextsprite.js.map +1 -1
- package/dist/scene/particlesys.js +6 -0
- package/dist/scene/particlesys.js.map +1 -1
- package/dist/scene/scene.js +3 -0
- package/dist/scene/scene.js.map +1 -1
- package/dist/scene/scene_node.js +6 -1
- package/dist/scene/scene_node.js.map +1 -1
- package/dist/scene/terrain-cm/grass.js +3 -0
- package/dist/scene/terrain-cm/grass.js.map +1 -1
- package/dist/scene/terrain-cm/grassmaterial.js +3 -0
- package/dist/scene/terrain-cm/grassmaterial.js.map +1 -1
- package/dist/scene/terrain-cm/terrain-cm.js +6 -0
- package/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
- package/dist/scene/terrain-cm/texture_cache.js +309 -0
- package/dist/scene/terrain-cm/texture_cache.js.map +1 -0
- package/dist/scene/water.js +546 -4
- package/dist/scene/water.js.map +1 -1
- package/dist/shaders/atmosphere.js.map +1 -1
- package/dist/shaders/diffusion.js +54 -0
- package/dist/shaders/diffusion.js.map +1 -0
- package/dist/shaders/shadow.js +33 -21
- package/dist/shaders/shadow.js.map +1 -1
- package/dist/shaders/temporal.js +71 -33
- package/dist/shaders/temporal.js.map +1 -1
- package/dist/shaders/water.js +22 -19
- package/dist/shaders/water.js.map +1 -1
- package/dist/shaders/water_medium.js +56 -0
- package/dist/shaders/water_medium.js.map +1 -0
- package/dist/shadow/dom.js +546 -0
- package/dist/shadow/dom.js.map +1 -0
- package/dist/shadow/pcf_opt.js +3 -5
- package/dist/shadow/pcf_opt.js.map +1 -1
- package/dist/shadow/pcf_pd.js +1 -1
- package/dist/shadow/pcf_pd.js.map +1 -1
- package/dist/shadow/receiver_bias.js +41 -0
- package/dist/shadow/receiver_bias.js.map +1 -0
- package/dist/shadow/shader.js +20 -60
- package/dist/shadow/shader.js.map +1 -1
- package/dist/shadow/shadow_impl.js +89 -0
- package/dist/shadow/shadow_impl.js.map +1 -1
- package/dist/shadow/shadow_region.js +1 -1
- package/dist/shadow/shadow_region.js.map +1 -1
- package/dist/shadow/shadowmapper.js +150 -37
- package/dist/shadow/shadowmapper.js.map +1 -1
- package/dist/shapes/shape.js +11 -2
- package/dist/shapes/shape.js.map +1 -1
- package/dist/shapes/sphere.js +50 -9
- package/dist/shapes/sphere.js.map +1 -1
- package/dist/utility/blueprint/common/constants.js +112 -2
- package/dist/utility/blueprint/common/constants.js.map +1 -1
- package/dist/utility/blueprint/material/func.js +142 -49
- package/dist/utility/blueprint/material/func.js.map +1 -1
- package/dist/utility/blueprint/material/ir.js +490 -25
- package/dist/utility/blueprint/material/ir.js.map +1 -1
- package/dist/utility/blueprint/material/texture.js +898 -4
- package/dist/utility/blueprint/material/texture.js.map +1 -1
- package/dist/utility/serialization/manager.js +434 -101
- package/dist/utility/serialization/manager.js.map +1 -1
- package/dist/utility/serialization/scene/animation.js +401 -5
- package/dist/utility/serialization/scene/animation.js.map +1 -1
- package/dist/utility/serialization/scene/batch.js +4 -0
- package/dist/utility/serialization/scene/batch.js.map +1 -1
- package/dist/utility/serialization/scene/camera.js +186 -26
- package/dist/utility/serialization/scene/camera.js.map +1 -1
- package/dist/utility/serialization/scene/common.js +26 -5
- package/dist/utility/serialization/scene/common.js.map +1 -1
- package/dist/utility/serialization/scene/hair.js +1141 -0
- package/dist/utility/serialization/scene/hair.js.map +1 -0
- package/dist/utility/serialization/scene/light.js +84 -4
- package/dist/utility/serialization/scene/light.js.map +1 -1
- package/dist/utility/serialization/scene/material.js +1867 -166
- package/dist/utility/serialization/scene/material.js.map +1 -1
- package/dist/utility/serialization/scene/mesh.js +231 -14
- package/dist/utility/serialization/scene/mesh.js.map +1 -1
- package/dist/utility/serialization/scene/node.js +141 -7
- package/dist/utility/serialization/scene/node.js.map +1 -1
- package/dist/utility/serialization/scene/particle.js +4 -0
- package/dist/utility/serialization/scene/particle.js.map +1 -1
- package/dist/utility/serialization/scene/primitive.js +18 -0
- package/dist/utility/serialization/scene/primitive.js.map +1 -1
- package/dist/utility/serialization/scene/sprite.js +4 -0
- package/dist/utility/serialization/scene/sprite.js.map +1 -1
- package/dist/utility/serialization/scene/terrain.js +4 -0
- package/dist/utility/serialization/scene/terrain.js.map +1 -1
- package/dist/utility/serialization/scene/text.js +4 -0
- package/dist/utility/serialization/scene/text.js.map +1 -1
- package/dist/utility/serialization/scene/water.js +1105 -21
- package/dist/utility/serialization/scene/water.js.map +1 -1
- package/dist/utility/serialization/types.js.map +1 -1
- package/dist/utility/shprojector.js +9 -8
- package/dist/utility/shprojector.js.map +1 -1
- package/dist/values.js +49 -2
- package/dist/values.js.map +1 -1
- package/package.json +3 -3
- package/dist/render/rendergraph/frame_graph_context.js +0 -41
- package/dist/render/rendergraph/frame_graph_context.js.map +0 -1
- package/dist/shaders/ssgi.js +0 -63
- package/dist/shaders/ssgi.js.map +0 -1
- package/dist/shaders/ssgi_reprojection.js +0 -118
- package/dist/shaders/ssgi_reprojection.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clipmap.js","sources":["../../src/render/clipmap.ts"],"sourcesContent":["/**\r\n * copy from http://git.mikejsavage.co.uk/medfall/file/clipmap.cc.html#l197\r\n */\r\n\r\nimport type { Nullable, Vector4 } from '@zephyr3d/base';\r\nimport { AABB, ClipState, Disposable, Matrix4x4, Vector2, Vector3 } from '@zephyr3d/base';\r\nimport type { Camera } from '../camera';\r\nimport { Primitive } from './primitive';\r\nimport {\r\n getVertexAttributeFormat,\r\n getVertexAttributeIndex,\r\n VERTEX_ATTRIB_POSITION,\r\n VERTEX_ATTRIB_TEXCOORD0,\r\n type VertexAttribFormat\r\n} from '@zephyr3d/device';\r\n\r\nconst tmpAABB = new AABB();\r\nconst tmpV3 = new Vector3();\r\nconst rotationValues = [0, Math.PI * 1.5, Math.PI * 0.5, Math.PI] as const;\r\n\r\n/** @internal */\r\nexport type PrimitiveInstanceInfo = {\r\n primitive: Primitive;\r\n numInstances: number;\r\n instanceDatas: Float32Array<ArrayBuffer>;\r\n mipLevels: Float32Array<ArrayBuffer>;\r\n maxMiplevel: number;\r\n};\r\n/** @internal */\r\nexport interface ClipmapGatherContext {\r\n camera: Camera;\r\n gridScale: number;\r\n minMaxWorldPos: Vector4;\r\n userData: unknown;\r\n frustumCulling: boolean;\r\n calcAABB(\r\n userData: unknown,\r\n minX: number,\r\n maxX: number,\r\n minZ: number,\r\n maxZ: number,\r\n outAABB: AABB,\r\n level: number\r\n ): void;\r\n}\r\n\r\n/** @internal */\r\nexport interface ClipmapDrawContext extends ClipmapGatherContext {\r\n drawPrimitive(\r\n prim: Primitive,\r\n rotation: number,\r\n offset: Vector2,\r\n scale: number,\r\n gridScale: number,\r\n level: number\r\n ): void;\r\n}\r\n\r\n/** @internal */\r\nexport class Clipmap extends Disposable {\r\n private readonly _instanceDataPool: Float32Array<ArrayBuffer>[];\r\n private _instanceDataPoolSize: number;\r\n private readonly _mipLevelDataPool: Float32Array<ArrayBuffer>[];\r\n private _mipLevelDataPoolSize: number;\r\n private readonly _nonInstanceDataPool: Float32Array<ArrayBuffer>[];\r\n private _nonInstanceDataPoolSize: number;\r\n private readonly _nonInstanceMipLevelDataPool: Float32Array<ArrayBuffer>[];\r\n private _nonInstanceMipLevelDataPoolSize: number;\r\n private readonly _extraInstanceBuffers: VertexAttribFormat[];\r\n private _tileResolution: number;\r\n private readonly _maxMipLevels: number;\r\n\r\n private _tileMesh!: Primitive;\r\n private _tileMeshLines!: Primitive;\r\n private _tileMeshBBox!: AABB;\r\n\r\n private _fillerMesh!: Primitive;\r\n private _fillerMeshLines!: Primitive;\r\n private _fillerMeshAABB!: AABB;\r\n\r\n private _trimMesh!: Primitive;\r\n private _trimMeshLines!: Primitive;\r\n private _trimMeshAABB!: AABB;\r\n\r\n private _crossMesh!: Primitive;\r\n private _crossMeshLines!: Primitive;\r\n private _crossMeshAABB!: AABB;\r\n\r\n private _seamMesh!: Primitive;\r\n private _seamMeshLines!: Primitive;\r\n private _seamMeshAABB!: AABB;\r\n\r\n private _wireframe: boolean;\r\n\r\n constructor(resolution: number, extraInstanceBuffers: VertexAttribFormat[], maxMipLevels = 64) {\r\n super();\r\n if (\r\n extraInstanceBuffers &&\r\n extraInstanceBuffers.findIndex(\r\n (val) =>\r\n getVertexAttributeIndex(val) === VERTEX_ATTRIB_POSITION ||\r\n getVertexAttributeIndex(val) === VERTEX_ATTRIB_TEXCOORD0 ||\r\n getVertexAttributeFormat(val) !== 'f32'\r\n ) >= 0\r\n ) {\r\n throw new Error(\r\n 'Extra instance buffers must be f32 format and cannot have vertex attribute of POSITOIN and TEXCOORD0'\r\n );\r\n }\r\n this._extraInstanceBuffers = extraInstanceBuffers?.slice() ?? [];\r\n this._tileResolution = resolution;\r\n this._maxMipLevels = Math.min(64, Math.max(1, maxMipLevels >>> 0));\r\n this._instanceDataPool = [];\r\n this._instanceDataPoolSize = 0;\r\n this._mipLevelDataPool = [];\r\n this._mipLevelDataPoolSize = 0;\r\n this._nonInstanceDataPool = [];\r\n this._nonInstanceDataPoolSize = 0;\r\n this._nonInstanceMipLevelDataPool = [];\r\n this._nonInstanceMipLevelDataPoolSize = 0;\r\n this._wireframe = false;\r\n this.generateCrossMesh();\r\n this.generateFillerMesh();\r\n this.generateSeamMesh();\r\n this.generateTileMesh();\r\n this.generateTrimMesh();\r\n }\r\n get wireframe() {\r\n return this._wireframe;\r\n }\r\n set wireframe(val: boolean) {\r\n this._wireframe = !!val;\r\n }\r\n get tileResolution() {\r\n return this._tileResolution;\r\n }\r\n set tileResolution(val: number) {\r\n if (val !== this._tileResolution) {\r\n this._tileResolution = val;\r\n this.generateCrossMesh();\r\n this.generateFillerMesh();\r\n this.generateSeamMesh();\r\n this.generateTileMesh();\r\n this.generateTrimMesh();\r\n }\r\n }\r\n private allocInstanceBuffer() {\r\n if (this._instanceDataPoolSize === 0) {\r\n const buffer = new Float32Array(this._maxMipLevels * 16 * 4);\r\n this._instanceDataPool.push(buffer);\r\n return buffer;\r\n } else {\r\n return this._instanceDataPool[--this._instanceDataPoolSize];\r\n }\r\n }\r\n private allocNonInstanceBuffer(x: number, y: number, z: number, w: number) {\r\n let buffer: Float32Array<ArrayBuffer>;\r\n if (this._nonInstanceDataPoolSize === 0) {\r\n buffer = new Float32Array(4);\r\n this._nonInstanceDataPool.push(buffer);\r\n } else {\r\n buffer = this._nonInstanceDataPool[--this._nonInstanceDataPoolSize];\r\n }\r\n buffer[0] = x;\r\n buffer[1] = y;\r\n buffer[2] = z;\r\n buffer[3] = w;\r\n return buffer;\r\n }\r\n private allocMipLevelBuffer() {\r\n if (this._mipLevelDataPoolSize === 0) {\r\n const buffer = new Float32Array(this._maxMipLevels * 16);\r\n this._mipLevelDataPool.push(buffer);\r\n return buffer;\r\n } else {\r\n return this._mipLevelDataPool[--this._mipLevelDataPoolSize];\r\n }\r\n }\r\n private allocNonInstanceMipLevelBuffer(val: number) {\r\n let buffer: Float32Array<ArrayBuffer>;\r\n if (this._nonInstanceMipLevelDataPoolSize === 0) {\r\n buffer = new Float32Array(1);\r\n this._nonInstanceMipLevelDataPool.push(buffer);\r\n } else {\r\n buffer = this._nonInstanceMipLevelDataPool[--this._nonInstanceMipLevelDataPoolSize];\r\n }\r\n buffer[0] = val;\r\n return buffer;\r\n }\r\n private patch2d(tileResolution: number, x: number, y: number) {\r\n return y * (tileResolution + 1) + x;\r\n }\r\n private calcAABB(vertices: Float32Array) {\r\n let maxX = -Number.MAX_VALUE;\r\n let maxY = -Number.MAX_VALUE;\r\n let minX = Number.MAX_VALUE;\r\n let minY = Number.MAX_VALUE;\r\n for (let i = 0; i < vertices.length / 3; i++) {\r\n const x = vertices[i * 3 + 0];\r\n const y = vertices[i * 3 + 1];\r\n if (x > maxX) {\r\n maxX = x;\r\n }\r\n if (x < minX) {\r\n minX = x;\r\n }\r\n if (y > maxY) {\r\n maxY = y;\r\n }\r\n if (y < minY) {\r\n minY = y;\r\n }\r\n }\r\n return new AABB(new Vector3(minX, minY, 0), new Vector3(maxX, maxY, 0));\r\n }\r\n generateTileMesh() {\r\n this._tileMesh?.dispose();\r\n this._tileMesh = new Primitive();\r\n const patchVertResolution = this._tileResolution + 1;\r\n const vertices = new Float32Array(patchVertResolution * patchVertResolution * 3);\r\n let n = 0;\r\n for (let y = 0; y < patchVertResolution; y++) {\r\n for (let x = 0; x < patchVertResolution; x++) {\r\n vertices[n++] = x;\r\n vertices[n++] = y;\r\n vertices[n++] = 0;\r\n }\r\n }\r\n n = 0;\r\n const indices = new Uint16Array(this._tileResolution * this._tileResolution * 6);\r\n for (let y = 0; y < this._tileResolution; y++) {\r\n for (let x = 0; x < this._tileResolution; x++) {\r\n indices[n++] = this.patch2d(this._tileResolution, x, y);\r\n indices[n++] = this.patch2d(this._tileResolution, x, y + 1);\r\n indices[n++] = this.patch2d(this._tileResolution, x + 1, y + 1);\r\n indices[n++] = this.patch2d(this._tileResolution, x, y);\r\n indices[n++] = this.patch2d(this._tileResolution, x + 1, y + 1);\r\n indices[n++] = this.patch2d(this._tileResolution, x + 1, y);\r\n }\r\n }\r\n this._tileMesh.createAndSetVertexBuffer('position_f32x3', vertices);\r\n this._tileMesh.createAndSetVertexBuffer('tex0_f32x4', this.allocInstanceBuffer(), 'instance');\r\n this._instanceDataPoolSize++;\r\n for (const fmt of this._extraInstanceBuffers) {\r\n this._tileMesh.createAndSetVertexBuffer(fmt, this.allocInstanceBuffer(), 'instance');\r\n this._instanceDataPoolSize++;\r\n }\r\n this._tileMesh.createAndSetIndexBuffer(indices);\r\n this._tileMesh.indexStart = 0;\r\n this._tileMesh.indexCount = indices.length;\r\n this._tileMesh.primitiveType = 'triangle-list';\r\n this._tileMeshBBox = this.calcAABB(vertices);\r\n\r\n const indicesLines = new Uint16Array(indices.length * 2);\r\n for (let i = 0; i < indices.length / 3; i++) {\r\n indicesLines[i * 6 + 0] = indices[i * 3 + 0];\r\n indicesLines[i * 6 + 1] = indices[i * 3 + 1];\r\n indicesLines[i * 6 + 2] = indices[i * 3 + 1];\r\n indicesLines[i * 6 + 3] = indices[i * 3 + 2];\r\n indicesLines[i * 6 + 4] = indices[i * 3 + 2];\r\n indicesLines[i * 6 + 5] = indices[i * 3 + 0];\r\n }\r\n this._tileMeshLines?.dispose();\r\n this._tileMeshLines = new Primitive();\r\n this._tileMeshLines.setVertexBuffer(this._tileMesh.getVertexBuffer('position')!);\r\n this._tileMeshLines.createAndSetVertexBuffer('tex0_f32x4', this.allocInstanceBuffer(), 'instance');\r\n this._instanceDataPoolSize++;\r\n for (const fmt of this._extraInstanceBuffers) {\r\n this._tileMeshLines.createAndSetVertexBuffer(fmt, this.allocInstanceBuffer(), 'instance');\r\n this._instanceDataPoolSize++;\r\n }\r\n this._tileMeshLines.createAndSetIndexBuffer(indicesLines);\r\n this._tileMeshLines.indexStart = 0;\r\n this._tileMeshLines.indexCount = indicesLines.length;\r\n this._tileMeshLines.primitiveType = 'line-list';\r\n }\r\n generateFillerMesh() {\r\n this._fillerMesh?.dispose();\r\n this._fillerMesh = new Primitive();\r\n const patchVertResolution = this._tileResolution + 1;\r\n const vertices = new Float32Array(patchVertResolution * 8 * 3);\r\n let n = 0;\r\n const offset = this._tileResolution;\r\n for (let i = 0; i < patchVertResolution; i++) {\r\n vertices[n++] = offset + i + 1;\r\n vertices[n++] = 0;\r\n vertices[n++] = 0;\r\n vertices[n++] = offset + i + 1;\r\n vertices[n++] = 1;\r\n vertices[n++] = 0;\r\n }\r\n for (let i = 0; i < patchVertResolution; i++) {\r\n vertices[n++] = 1;\r\n vertices[n++] = offset + i + 1;\r\n vertices[n++] = 0;\r\n vertices[n++] = 0;\r\n vertices[n++] = offset + i + 1;\r\n vertices[n++] = 0;\r\n }\r\n for (let i = 0; i < patchVertResolution; i++) {\r\n vertices[n++] = -offset - i;\r\n vertices[n++] = 1;\r\n vertices[n++] = 0;\r\n vertices[n++] = -offset - i;\r\n vertices[n++] = 0;\r\n vertices[n++] = 0;\r\n }\r\n for (let i = 0; i < patchVertResolution; i++) {\r\n vertices[n++] = 0;\r\n vertices[n++] = -offset - i;\r\n vertices[n++] = 0;\r\n vertices[n++] = 1;\r\n vertices[n++] = -offset - i;\r\n vertices[n++] = 0;\r\n }\r\n n = 0;\r\n const indices = new Uint16Array(this._tileResolution * 24);\r\n for (let i = 0; i < this._tileResolution * 4; i++) {\r\n const arm = (i / this._tileResolution) >> 0;\r\n const bl = (arm + i) * 2 + 0;\r\n const br = (arm + i) * 2 + 1;\r\n const tl = (arm + i) * 2 + 2;\r\n const tr = (arm + i) * 2 + 3;\r\n if (arm % 2 === 0) {\r\n indices[n++] = br;\r\n indices[n++] = tr;\r\n indices[n++] = bl;\r\n indices[n++] = bl;\r\n indices[n++] = tr;\r\n indices[n++] = tl;\r\n } else {\r\n indices[n++] = br;\r\n indices[n++] = tl;\r\n indices[n++] = bl;\r\n indices[n++] = br;\r\n indices[n++] = tr;\r\n indices[n++] = tl;\r\n }\r\n }\r\n this._fillerMesh.createAndSetVertexBuffer('position_f32x3', vertices);\r\n this._fillerMesh.createAndSetVertexBuffer('tex0_f32x4', this.allocInstanceBuffer(), 'instance');\r\n this._instanceDataPoolSize++;\r\n for (const fmt of this._extraInstanceBuffers) {\r\n this._fillerMesh.createAndSetVertexBuffer(fmt, this.allocInstanceBuffer(), 'instance');\r\n this._instanceDataPoolSize++;\r\n }\r\n this._fillerMesh.createAndSetIndexBuffer(indices);\r\n this._fillerMesh.indexStart = 0;\r\n this._fillerMesh.indexCount = indices.length;\r\n this._fillerMesh.primitiveType = 'triangle-list';\r\n this._fillerMeshAABB = this.calcAABB(vertices);\r\n\r\n const indicesLines = new Uint16Array(indices.length * 2);\r\n for (let i = 0; i < indices.length / 3; i++) {\r\n indicesLines[i * 6 + 0] = indices[i * 3 + 0];\r\n indicesLines[i * 6 + 1] = indices[i * 3 + 1];\r\n indicesLines[i * 6 + 2] = indices[i * 3 + 1];\r\n indicesLines[i * 6 + 3] = indices[i * 3 + 2];\r\n indicesLines[i * 6 + 4] = indices[i * 3 + 2];\r\n indicesLines[i * 6 + 5] = indices[i * 3 + 0];\r\n }\r\n this._fillerMeshLines?.dispose();\r\n this._fillerMeshLines = new Primitive();\r\n this._fillerMeshLines.setVertexBuffer(this._fillerMesh.getVertexBuffer('position')!);\r\n this._fillerMeshLines.createAndSetVertexBuffer('tex0_f32x4', this.allocInstanceBuffer(), 'instance');\r\n this._instanceDataPoolSize++;\r\n for (const fmt of this._extraInstanceBuffers) {\r\n this._fillerMeshLines.createAndSetVertexBuffer(fmt, this.allocInstanceBuffer(), 'instance');\r\n this._instanceDataPoolSize++;\r\n }\r\n this._fillerMeshLines.createAndSetIndexBuffer(indicesLines);\r\n this._fillerMeshLines.indexStart = 0;\r\n this._fillerMeshLines.indexCount = indicesLines.length;\r\n this._fillerMeshLines.primitiveType = 'line-list';\r\n }\r\n generateTrimMesh() {\r\n this._trimMesh?.dispose();\r\n this._trimMesh = new Primitive();\r\n const clipmapVertResolution = this._tileResolution * 4 + 2;\r\n const vertices = new Float32Array((clipmapVertResolution * 2 + 1) * 2 * 3);\r\n let n = 0;\r\n const d = 0.5 * (clipmapVertResolution + 1);\r\n for (let i = 0; i < clipmapVertResolution + 1; i++) {\r\n vertices[n++] = 0 - d;\r\n vertices[n++] = clipmapVertResolution - i - d;\r\n vertices[n++] = 0;\r\n vertices[n++] = 1 - d;\r\n vertices[n++] = clipmapVertResolution - i - d;\r\n vertices[n++] = 0;\r\n }\r\n const startOfHorizonal = n / 3;\r\n for (let i = 0; i < clipmapVertResolution; i++) {\r\n vertices[n++] = i + 1 - d;\r\n vertices[n++] = 0 - d;\r\n vertices[n++] = 0;\r\n vertices[n++] = i + 1 - d;\r\n vertices[n++] = 1 - d;\r\n vertices[n++] = 0;\r\n }\r\n n = 0;\r\n const indices = new Uint16Array((clipmapVertResolution * 2 - 1) * 6);\r\n for (let i = 0; i < clipmapVertResolution; i++) {\r\n indices[n++] = (i + 0) * 2 + 1;\r\n indices[n++] = (i + 1) * 2 + 0;\r\n indices[n++] = (i + 0) * 2 + 0;\r\n indices[n++] = (i + 1) * 2 + 1;\r\n indices[n++] = (i + 1) * 2 + 0;\r\n indices[n++] = (i + 0) * 2 + 1;\r\n }\r\n for (let i = 0; i < clipmapVertResolution - 1; i++) {\r\n indices[n++] = startOfHorizonal + (i + 0) * 2 + 1;\r\n indices[n++] = startOfHorizonal + (i + 1) * 2 + 0;\r\n indices[n++] = startOfHorizonal + (i + 0) * 2 + 0;\r\n indices[n++] = startOfHorizonal + (i + 1) * 2 + 1;\r\n indices[n++] = startOfHorizonal + (i + 1) * 2 + 0;\r\n indices[n++] = startOfHorizonal + (i + 0) * 2 + 1;\r\n }\r\n this._trimMesh.createAndSetVertexBuffer('position_f32x3', vertices);\r\n this._trimMesh.createAndSetVertexBuffer('tex0_f32x4', this.allocInstanceBuffer(), 'instance');\r\n this._instanceDataPoolSize++;\r\n for (const fmt of this._extraInstanceBuffers) {\r\n this._trimMesh.createAndSetVertexBuffer(fmt, this.allocInstanceBuffer(), 'instance');\r\n this._instanceDataPoolSize++;\r\n }\r\n this._trimMesh.createAndSetIndexBuffer(indices);\r\n this._trimMesh.indexStart = 0;\r\n this._trimMesh.indexCount = indices.length;\r\n this._trimMesh.primitiveType = 'triangle-list';\r\n this._trimMeshAABB = this.calcAABB(vertices);\r\n\r\n const indicesLines = new Uint16Array(indices.length * 2);\r\n for (let i = 0; i < indices.length / 3; i++) {\r\n indicesLines[i * 6 + 0] = indices[i * 3 + 0];\r\n indicesLines[i * 6 + 1] = indices[i * 3 + 1];\r\n indicesLines[i * 6 + 2] = indices[i * 3 + 1];\r\n indicesLines[i * 6 + 3] = indices[i * 3 + 2];\r\n indicesLines[i * 6 + 4] = indices[i * 3 + 2];\r\n indicesLines[i * 6 + 5] = indices[i * 3 + 0];\r\n }\r\n this._trimMeshLines?.dispose();\r\n this._trimMeshLines = new Primitive();\r\n this._trimMeshLines.setVertexBuffer(this._trimMesh.getVertexBuffer('position')!);\r\n this._trimMeshLines.createAndSetVertexBuffer('tex0_f32x4', this.allocInstanceBuffer(), 'instance');\r\n this._instanceDataPoolSize++;\r\n for (const fmt of this._extraInstanceBuffers) {\r\n this._trimMeshLines.createAndSetVertexBuffer(fmt, this.allocInstanceBuffer(), 'instance');\r\n this._instanceDataPoolSize++;\r\n }\r\n this._trimMeshLines.createAndSetIndexBuffer(indicesLines);\r\n this._trimMeshLines.indexStart = 0;\r\n this._trimMeshLines.indexCount = indicesLines.length;\r\n this._trimMeshLines.primitiveType = 'line-list';\r\n }\r\n generateCrossMesh() {\r\n const patchVertResolution = this._tileResolution + 1;\r\n const vertices = new Float32Array(patchVertResolution * 8 * 3);\r\n let n = 0;\r\n for (let i = 0; i < patchVertResolution * 2; i++) {\r\n vertices[n++] = i - this._tileResolution;\r\n vertices[n++] = 0;\r\n vertices[n++] = 0;\r\n vertices[n++] = i - this._tileResolution;\r\n vertices[n++] = 1;\r\n vertices[n++] = 0;\r\n }\r\n const startOfVertical = n / 3;\r\n for (let i = 0; i < patchVertResolution * 2; i++) {\r\n vertices[n++] = 0;\r\n vertices[n++] = i - this._tileResolution;\r\n vertices[n++] = 0;\r\n vertices[n++] = 1;\r\n vertices[n++] = i - this._tileResolution;\r\n vertices[n++] = 0;\r\n }\r\n n = 0;\r\n const indices = new Uint16Array(this._tileResolution * 24 + 6);\r\n for (let i = 0; i < this._tileResolution * 2 + 1; i++) {\r\n const bl = i * 2 + 0;\r\n const br = i * 2 + 1;\r\n const tl = i * 2 + 2;\r\n const tr = i * 2 + 3;\r\n indices[n++] = br;\r\n indices[n++] = tr;\r\n indices[n++] = bl;\r\n indices[n++] = bl;\r\n indices[n++] = tr;\r\n indices[n++] = tl;\r\n }\r\n for (let i = 0; i < this._tileResolution * 2 + 1; i++) {\r\n if (i === this._tileResolution) {\r\n continue;\r\n }\r\n const bl = i * 2 + 0;\r\n const br = i * 2 + 1;\r\n const tl = i * 2 + 2;\r\n const tr = i * 2 + 3;\r\n indices[n++] = startOfVertical + br;\r\n indices[n++] = startOfVertical + bl;\r\n indices[n++] = startOfVertical + tr;\r\n indices[n++] = startOfVertical + bl;\r\n indices[n++] = startOfVertical + tl;\r\n indices[n++] = startOfVertical + tr;\r\n }\r\n this._crossMesh?.dispose();\r\n this._crossMesh = new Primitive();\r\n this._crossMesh.createAndSetVertexBuffer('position_f32x3', vertices);\r\n this._crossMesh.createAndSetVertexBuffer(\r\n 'tex0_f32x4',\r\n this.allocNonInstanceBuffer(0, 0, 0, 0),\r\n 'instance'\r\n );\r\n this._nonInstanceDataPoolSize++;\r\n for (const fmt of this._extraInstanceBuffers) {\r\n this._crossMesh.createAndSetVertexBuffer(fmt, this.allocNonInstanceBuffer(0, 0, 0, 0), 'instance');\r\n this._nonInstanceDataPoolSize++;\r\n }\r\n this._crossMesh.createAndSetIndexBuffer(indices);\r\n this._crossMesh.indexStart = 0;\r\n this._crossMesh.indexCount = indices.length;\r\n this._crossMesh.primitiveType = 'triangle-list';\r\n this._crossMeshAABB = this.calcAABB(vertices);\r\n\r\n const indicesLines = new Uint16Array(indices.length * 2);\r\n for (let i = 0; i < indices.length / 3; i++) {\r\n indicesLines[i * 6 + 0] = indices[i * 3 + 0];\r\n indicesLines[i * 6 + 1] = indices[i * 3 + 1];\r\n indicesLines[i * 6 + 2] = indices[i * 3 + 1];\r\n indicesLines[i * 6 + 3] = indices[i * 3 + 2];\r\n indicesLines[i * 6 + 4] = indices[i * 3 + 2];\r\n indicesLines[i * 6 + 5] = indices[i * 3 + 0];\r\n }\r\n this._crossMeshLines?.dispose();\r\n this._crossMeshLines = new Primitive();\r\n this._crossMeshLines.setVertexBuffer(this._crossMesh.getVertexBuffer('position')!);\r\n this._crossMeshLines.createAndSetVertexBuffer(\r\n 'tex0_f32x4',\r\n this.allocNonInstanceBuffer(0, 0, 0, 0),\r\n 'instance'\r\n );\r\n this._nonInstanceDataPoolSize++;\r\n for (const fmt of this._extraInstanceBuffers) {\r\n this._crossMeshLines.createAndSetVertexBuffer(fmt, this.allocNonInstanceBuffer(0, 0, 0, 0), 'instance');\r\n this._nonInstanceDataPoolSize++;\r\n }\r\n this._crossMeshLines.createAndSetIndexBuffer(indicesLines);\r\n this._crossMeshLines.indexStart = 0;\r\n this._crossMeshLines.indexCount = indicesLines.length;\r\n this._crossMeshLines.primitiveType = 'line-list';\r\n }\r\n generateSeamMesh() {\r\n this._seamMesh?.dispose();\r\n this._seamMesh = new Primitive();\r\n const clipmapVertResolution = this._tileResolution * 4 + 2;\r\n const vertices = new Float32Array(clipmapVertResolution * 4 * 3);\r\n for (let i = 0; i < clipmapVertResolution; i++) {\r\n vertices[(clipmapVertResolution * 0 + i) * 3 + 0] = i;\r\n vertices[(clipmapVertResolution * 0 + i) * 3 + 1] = 0;\r\n vertices[(clipmapVertResolution * 0 + i) * 3 + 2] = 0;\r\n vertices[(clipmapVertResolution * 1 + i) * 3 + 0] = clipmapVertResolution;\r\n vertices[(clipmapVertResolution * 1 + i) * 3 + 1] = i;\r\n vertices[(clipmapVertResolution * 1 + i) * 3 + 2] = 0;\r\n vertices[(clipmapVertResolution * 2 + i) * 3 + 0] = clipmapVertResolution - i;\r\n vertices[(clipmapVertResolution * 2 + i) * 3 + 1] = clipmapVertResolution;\r\n vertices[(clipmapVertResolution * 2 + i) * 3 + 2] = 0;\r\n vertices[(clipmapVertResolution * 3 + i) * 3 + 0] = 0;\r\n vertices[(clipmapVertResolution * 3 + i) * 3 + 1] = clipmapVertResolution - i;\r\n vertices[(clipmapVertResolution * 3 + i) * 3 + 2] = 0;\r\n }\r\n const indices = new Uint16Array(clipmapVertResolution * 6);\r\n let n = 0;\r\n for (let i = 0; i < clipmapVertResolution * 4; i += 2) {\r\n indices[n++] = i + 1;\r\n indices[n++] = i + 2;\r\n indices[n++] = i;\r\n }\r\n indices[indices.length - 1] = 0;\r\n this._seamMesh.createAndSetVertexBuffer('position_f32x3', vertices);\r\n this._seamMesh.createAndSetVertexBuffer('tex0_f32x4', this.allocInstanceBuffer(), 'instance');\r\n this._instanceDataPoolSize++;\r\n for (const fmt of this._extraInstanceBuffers) {\r\n this._seamMesh.createAndSetVertexBuffer(fmt, this.allocInstanceBuffer(), 'instance');\r\n this._instanceDataPoolSize++;\r\n }\r\n this._seamMesh.createAndSetIndexBuffer(indices);\r\n this._seamMesh.indexStart = 0;\r\n this._seamMesh.indexCount = indices.length;\r\n this._seamMesh.primitiveType = 'triangle-list';\r\n this._seamMeshAABB = this.calcAABB(vertices);\r\n\r\n const indicesLines = new Uint16Array(indices.length * 2);\r\n for (let i = 0; i < indices.length / 3; i++) {\r\n indicesLines[i * 6 + 0] = indices[i * 3 + 0];\r\n indicesLines[i * 6 + 1] = indices[i * 3 + 1];\r\n indicesLines[i * 6 + 2] = indices[i * 3 + 1];\r\n indicesLines[i * 6 + 3] = indices[i * 3 + 2];\r\n indicesLines[i * 6 + 4] = indices[i * 3 + 2];\r\n indicesLines[i * 6 + 5] = indices[i * 3 + 0];\r\n }\r\n this._seamMeshLines?.dispose();\r\n this._seamMeshLines = new Primitive();\r\n this._seamMeshLines.setVertexBuffer(this._seamMesh.getVertexBuffer('position')!);\r\n this._seamMeshLines.createAndSetVertexBuffer('tex0_f32x4', this.allocInstanceBuffer(), 'instance');\r\n this._instanceDataPoolSize++;\r\n for (const fmt of this._extraInstanceBuffers) {\r\n this._seamMeshLines.createAndSetVertexBuffer(fmt, this.allocInstanceBuffer(), 'instance');\r\n this._instanceDataPoolSize++;\r\n }\r\n this._seamMeshLines.createAndSetIndexBuffer(indicesLines);\r\n this._seamMeshLines.indexStart = 0;\r\n this._seamMeshLines.indexCount = indicesLines.length;\r\n this._seamMeshLines.primitiveType = 'line-list';\r\n }\r\n private intervalsOverlap(a0: number, a1: number, b0: number, b1: number) {\r\n return a0 <= b1 && b0 <= a1;\r\n }\r\n private updateAABB(\r\n aabb: AABB,\r\n rotation: Nullable<number>,\r\n offset: Vector2,\r\n scale: number,\r\n gridScale: number,\r\n outAABB: AABB\r\n ) {\r\n if (!rotation) {\r\n tmpAABB.minPoint.set(aabb.minPoint);\r\n tmpAABB.maxPoint.set(aabb.maxPoint);\r\n } else {\r\n AABB.transform(aabb, Matrix4x4.rotationZ(rotation), tmpAABB);\r\n }\r\n const minX = (tmpAABB.minPoint.x * scale + offset.x) * gridScale;\r\n const maxX = (tmpAABB.maxPoint.x * scale + offset.x) * gridScale;\r\n const minZ = (tmpAABB.minPoint.y * scale + offset.y) * gridScale;\r\n const maxZ = (tmpAABB.maxPoint.y * scale + offset.y) * gridScale;\r\n if (minX < outAABB.minPoint.x) {\r\n outAABB.minPoint.x = minX;\r\n }\r\n if (maxX > outAABB.maxPoint.x) {\r\n outAABB.maxPoint.x = maxX;\r\n }\r\n if (minZ < outAABB.minPoint.z) {\r\n outAABB.minPoint.z = minZ;\r\n }\r\n if (maxZ > outAABB.maxPoint.z) {\r\n outAABB.maxPoint.z = maxZ;\r\n }\r\n }\r\n private visible(\r\n ctx: ClipmapGatherContext,\r\n aabb: AABB,\r\n camera: Camera,\r\n rotation: Nullable<number>,\r\n offset: Vector2,\r\n scale: number,\r\n gridScale: number,\r\n level: number\r\n ) {\r\n if (!rotation) {\r\n tmpAABB.minPoint.set(aabb.minPoint);\r\n tmpAABB.maxPoint.set(aabb.maxPoint);\r\n } else {\r\n AABB.transform(aabb, Matrix4x4.rotationZ(rotation), tmpAABB);\r\n }\r\n const minX = (tmpAABB.minPoint.x * scale + offset.x) * gridScale;\r\n const maxX = (tmpAABB.maxPoint.x * scale + offset.x) * gridScale;\r\n const minZ = (tmpAABB.minPoint.y * scale + offset.y) * gridScale;\r\n const maxZ = (tmpAABB.maxPoint.y * scale + offset.y) * gridScale;\r\n ctx.calcAABB(ctx.userData, minX, maxX, minZ, maxZ, tmpAABB, level);\r\n return tmpAABB.getClipStateWithFrustum(camera.frustum) !== ClipState.NOT_CLIPPED;\r\n }\r\n calcLevelAABB(camera: Camera, minMaxWorldPos: Vector4, gridScale: number) {\r\n const mipLevels = this.calcMipLevels(camera, minMaxWorldPos, gridScale);\r\n camera.getWorldPosition(tmpV3);\r\n\r\n const snappedPos = new Vector2();\r\n const tileSize = new Vector2();\r\n const base = new Vector2();\r\n const offset = new Vector2();\r\n\r\n const posX = tmpV3.x / gridScale;\r\n const posY = tmpV3.z / gridScale;\r\n\r\n const outAABB: AABB[] = [];\r\n for (let i = 0; i < mipLevels; i++) {\r\n const aabb = new AABB();\r\n aabb.beginExtend();\r\n outAABB.push(aabb);\r\n }\r\n\r\n snappedPos.setXY(Math.floor(posX), Math.floor(posY));\r\n\r\n // cross\r\n this.updateAABB(this._crossMeshAABB, null, snappedPos, 1, gridScale, outAABB[0]);\r\n\r\n for (let l = 0; l < mipLevels; l++) {\r\n const aabb = outAABB[l];\r\n const scale = 1 << l;\r\n snappedPos.setXY(Math.floor(posX / scale) * scale, Math.floor(posY / scale) * scale);\r\n // draw tiles\r\n tileSize.setXY(this._tileResolution << l, this._tileResolution << l);\r\n base.setXY(\r\n snappedPos.x - (this._tileResolution << (l + 1)),\r\n snappedPos.y - (this._tileResolution << (l + 1))\r\n );\r\n for (let x = 0; x < 4; x++) {\r\n for (let y = 0; y < 4; y++) {\r\n if (l !== 0 && (x === 1 || x === 2) && (y === 1 || y === 2)) {\r\n continue;\r\n }\r\n const fillX = x >= 2 ? scale : 0;\r\n const fillY = y >= 2 ? scale : 0;\r\n offset.setXY(base.x + x * tileSize.x + fillX, base.y + y * tileSize.y + fillY);\r\n this.updateAABB(this._tileMeshBBox, null, offset, scale, gridScale, aabb);\r\n }\r\n }\r\n // draw filler\r\n this.updateAABB(this._fillerMeshAABB, null, snappedPos, scale, gridScale, aabb);\r\n\r\n const nextScale = scale * 2;\r\n const nextSnappedPos = new Vector2(\r\n Math.floor(posX / nextScale) * nextScale,\r\n Math.floor(posY / nextScale) * nextScale\r\n );\r\n // draw trim\r\n const tileCentre = new Vector2(snappedPos.x + scale * 0.5, snappedPos.y + scale * 0.5);\r\n const d = new Vector2(posX - nextSnappedPos.x, posY - nextSnappedPos.y);\r\n let r = 0;\r\n r |= d.x >= scale ? 0 : 2;\r\n r |= d.y >= scale ? 0 : 1;\r\n this.updateAABB(this._trimMeshAABB, rotationValues[r], tileCentre, scale, gridScale, aabb);\r\n // draw seam\r\n const nextBase = new Vector2(\r\n nextSnappedPos.x - (this._tileResolution << (l + 1)),\r\n nextSnappedPos.y - (this._tileResolution << (l + 1))\r\n );\r\n this.updateAABB(this._seamMeshAABB, null, nextBase, scale, gridScale, aabb);\r\n }\r\n return outAABB;\r\n }\r\n private calcMipLevels(camera: Camera, minMaxWorldPos: Vector4, gridScale: number) {\r\n camera.getWorldPosition(tmpV3);\r\n const distX = Math.max(Math.abs(tmpV3.x - minMaxWorldPos.x), Math.abs(tmpV3.x - minMaxWorldPos.z));\r\n const distY = Math.max(Math.abs(tmpV3.z - minMaxWorldPos.y), Math.abs(tmpV3.z - minMaxWorldPos.w));\r\n const maxDist = Math.min(Math.max(distX, distY), camera.getFarPlane());\r\n return Math.min(\r\n Math.max(Math.ceil(Math.log2(maxDist / (this._tileResolution * gridScale))), 0) + 1,\r\n this._maxMipLevels\r\n );\r\n }\r\n private addInstance(\r\n info: PrimitiveInstanceInfo,\r\n rotation: number,\r\n offsetX: number,\r\n offsetY: number,\r\n scale: number,\r\n mipLevel: number\r\n ) {\r\n info.mipLevels[info.numInstances] = mipLevel;\r\n info.instanceDatas[info.numInstances * 4 + 0] = rotation;\r\n info.instanceDatas[info.numInstances * 4 + 1] = scale;\r\n info.instanceDatas[info.numInstances * 4 + 2] = offsetX;\r\n info.instanceDatas[info.numInstances * 4 + 3] = offsetY;\r\n info.maxMiplevel = mipLevel;\r\n info.numInstances++;\r\n }\r\n\r\n gather(context: ClipmapGatherContext) {\r\n this._instanceDataPoolSize = this._instanceDataPool.length;\r\n this._mipLevelDataPoolSize = this._mipLevelDataPool.length;\r\n this._nonInstanceDataPoolSize = this._nonInstanceDataPool.length;\r\n this._nonInstanceMipLevelDataPoolSize = this._nonInstanceMipLevelDataPool.length;\r\n const renderData: PrimitiveInstanceInfo[] = [];\r\n const mipLevels = this.calcMipLevels(context.camera, context.minMaxWorldPos, context.gridScale);\r\n context.camera.getWorldPosition(tmpV3);\r\n\r\n const snappedPos = new Vector2();\r\n const tileSize = new Vector2();\r\n const base = new Vector2();\r\n const offset = new Vector2();\r\n\r\n const posX = tmpV3.x / context.gridScale;\r\n const posY = tmpV3.z / context.gridScale;\r\n\r\n // draw cross\r\n snappedPos.setXY(Math.floor(posX), Math.floor(posY));\r\n if (\r\n !context.frustumCulling ||\r\n this.visible(context, this._crossMeshAABB, context.camera, null, snappedPos, 1, context.gridScale, 0)\r\n ) {\r\n const crossPrimitives: PrimitiveInstanceInfo = {\r\n primitive: this._wireframe ? this._crossMeshLines : this._crossMesh,\r\n numInstances: 1,\r\n instanceDatas: this.allocNonInstanceBuffer(rotationValues[0], 1, snappedPos.x, snappedPos.y),\r\n mipLevels: this.allocNonInstanceMipLevelBuffer(0),\r\n maxMiplevel: 0\r\n };\r\n renderData.push(crossPrimitives);\r\n }\r\n\r\n const tilePrimitives: PrimitiveInstanceInfo = {\r\n primitive: this._wireframe ? this._tileMeshLines : this._tileMesh,\r\n numInstances: 0,\r\n instanceDatas: this.allocInstanceBuffer(),\r\n mipLevels: this.allocMipLevelBuffer(),\r\n maxMiplevel: 0\r\n };\r\n const fillerPrimitives: PrimitiveInstanceInfo = {\r\n primitive: this._wireframe ? this._fillerMeshLines : this._fillerMesh,\r\n numInstances: 0,\r\n instanceDatas: this.allocInstanceBuffer(),\r\n mipLevels: this.allocMipLevelBuffer(),\r\n maxMiplevel: 0\r\n };\r\n const trimPrimitives: PrimitiveInstanceInfo = {\r\n primitive: this._wireframe ? this._trimMeshLines : this._trimMesh,\r\n numInstances: 0,\r\n instanceDatas: this.allocInstanceBuffer(),\r\n mipLevels: this.allocMipLevelBuffer(),\r\n maxMiplevel: 0\r\n };\r\n const seamPrimitives: PrimitiveInstanceInfo = {\r\n primitive: this._wireframe ? this._seamMeshLines : this._seamMesh,\r\n numInstances: 0,\r\n instanceDatas: this.allocInstanceBuffer(),\r\n mipLevels: this.allocMipLevelBuffer(),\r\n maxMiplevel: 0\r\n };\r\n\r\n for (let l = 0; l < mipLevels; l++) {\r\n const scale = 1 << l;\r\n snappedPos.setXY(Math.floor(posX / scale) * scale, Math.floor(posY / scale) * scale);\r\n // draw tiles\r\n tileSize.setXY(this._tileResolution << l, this._tileResolution << l);\r\n base.setXY(\r\n snappedPos.x - (this._tileResolution << (l + 1)),\r\n snappedPos.y - (this._tileResolution << (l + 1))\r\n );\r\n for (let x = 0; x < 4; x++) {\r\n for (let y = 0; y < 4; y++) {\r\n if (l !== 0 && (x === 1 || x === 2) && (y === 1 || y === 2)) {\r\n continue;\r\n }\r\n const fillX = x >= 2 ? scale : 0;\r\n const fillY = y >= 2 ? scale : 0;\r\n offset.setXY(base.x + x * tileSize.x + fillX, base.y + y * tileSize.y + fillY);\r\n if (\r\n this.intervalsOverlap(\r\n offset.x * context.gridScale,\r\n (offset.x + tileSize.x) * context.gridScale,\r\n context.minMaxWorldPos.x,\r\n context.minMaxWorldPos.z\r\n ) &&\r\n this.intervalsOverlap(\r\n offset.y * context.gridScale,\r\n (offset.y + tileSize.y) * context.gridScale,\r\n context.minMaxWorldPos.y,\r\n context.minMaxWorldPos.w\r\n )\r\n ) {\r\n if (\r\n !context.frustumCulling ||\r\n this.visible(\r\n context,\r\n this._tileMeshBBox,\r\n context.camera,\r\n null,\r\n offset,\r\n scale,\r\n context.gridScale,\r\n l\r\n )\r\n ) {\r\n this.addInstance(tilePrimitives, rotationValues[0], offset.x, offset.y, scale, l);\r\n }\r\n }\r\n }\r\n }\r\n // draw filler\r\n if (\r\n !context.frustumCulling ||\r\n this.visible(\r\n context,\r\n this._fillerMeshAABB,\r\n context.camera,\r\n null,\r\n snappedPos,\r\n scale,\r\n context.gridScale,\r\n l\r\n )\r\n ) {\r\n this.addInstance(fillerPrimitives, rotationValues[0], snappedPos.x, snappedPos.y, scale, l);\r\n }\r\n\r\n if (l !== mipLevels - 1) {\r\n const nextScale = scale * 2;\r\n const nextSnappedPos = new Vector2(\r\n Math.floor(posX / nextScale) * nextScale,\r\n Math.floor(posY / nextScale) * nextScale\r\n );\r\n // draw trim\r\n const tileCentre = new Vector2(snappedPos.x + scale * 0.5, snappedPos.y + scale * 0.5);\r\n const d = new Vector2(posX - nextSnappedPos.x, posY - nextSnappedPos.y);\r\n let r = 0;\r\n r |= d.x >= scale ? 0 : 2;\r\n r |= d.y >= scale ? 0 : 1;\r\n if (\r\n !context.frustumCulling ||\r\n this.visible(\r\n context,\r\n this._trimMeshAABB,\r\n context.camera,\r\n rotationValues[r],\r\n tileCentre,\r\n scale,\r\n context.gridScale,\r\n l\r\n )\r\n ) {\r\n this.addInstance(trimPrimitives, rotationValues[r], tileCentre.x, tileCentre.y, scale, l);\r\n }\r\n // draw seam\r\n const nextBase = new Vector2(\r\n nextSnappedPos.x - (this._tileResolution << (l + 1)),\r\n nextSnappedPos.y - (this._tileResolution << (l + 1))\r\n );\r\n if (\r\n !context.frustumCulling ||\r\n this.visible(\r\n context,\r\n this._seamMeshAABB,\r\n context.camera,\r\n null,\r\n nextBase,\r\n scale,\r\n context.gridScale,\r\n l\r\n )\r\n ) {\r\n this.addInstance(seamPrimitives, rotationValues[0], nextBase.x, nextBase.y, scale, l);\r\n }\r\n }\r\n }\r\n if (tilePrimitives.numInstances > 0) {\r\n renderData.push(tilePrimitives);\r\n }\r\n if (fillerPrimitives.numInstances > 0) {\r\n renderData.push(fillerPrimitives);\r\n }\r\n if (trimPrimitives.numInstances > 0) {\r\n renderData.push(trimPrimitives);\r\n }\r\n if (seamPrimitives.numInstances > 0) {\r\n renderData.push(seamPrimitives);\r\n }\r\n for (const info of renderData) {\r\n info.primitive\r\n .getVertexBuffer('texCoord0')!\r\n .bufferSubData(0, info.instanceDatas, 0, info.numInstances * 4);\r\n }\r\n return renderData;\r\n }\r\n /** Disposes the clipmap and release all meshes */\r\n protected onDispose() {\r\n super.onDispose();\r\n this._crossMesh.dispose();\r\n this._crossMeshLines.dispose();\r\n this._fillerMesh.dispose();\r\n this._fillerMeshLines.dispose();\r\n this._seamMesh.dispose();\r\n this._seamMeshLines.dispose();\r\n this._trimMesh.dispose();\r\n this._trimMeshLines.dispose();\r\n this._tileMesh.dispose();\r\n this._tileMeshLines.dispose();\r\n }\r\n}\r\n"],"names":["tmpAABB","AABB","tmpV3","Vector3","rotationValues","Math","PI","Clipmap","Disposable","_instanceDataPool","_instanceDataPoolSize","_mipLevelDataPool","_mipLevelDataPoolSize","_nonInstanceDataPool","_nonInstanceDataPoolSize","_nonInstanceMipLevelDataPool","_nonInstanceMipLevelDataPoolSize","_extraInstanceBuffers","_tileResolution","_maxMipLevels","_tileMesh","_tileMeshLines","_tileMeshBBox","_fillerMesh","_fillerMeshLines","_fillerMeshAABB","_trimMesh","_trimMeshLines","_trimMeshAABB","_crossMesh","_crossMeshLines","_crossMeshAABB","_seamMesh","_seamMeshLines","_seamMeshAABB","_wireframe","resolution","extraInstanceBuffers","maxMipLevels","findIndex","val","getVertexAttributeIndex","VERTEX_ATTRIB_POSITION","VERTEX_ATTRIB_TEXCOORD0","getVertexAttributeFormat","Error","slice","min","max","generateCrossMesh","generateFillerMesh","generateSeamMesh","generateTileMesh","generateTrimMesh","wireframe","tileResolution","allocInstanceBuffer","buffer","Float32Array","push","allocNonInstanceBuffer","x","y","z","w","allocMipLevelBuffer","allocNonInstanceMipLevelBuffer","patch2d","calcAABB","vertices","maxX","Number","MAX_VALUE","maxY","minX","minY","i","length","dispose","Primitive","patchVertResolution","n","indices","Uint16Array","createAndSetVertexBuffer","fmt","createAndSetIndexBuffer","indexStart","indexCount","primitiveType","indicesLines","setVertexBuffer","getVertexBuffer","offset","arm","bl","br","tl","tr","clipmapVertResolution","d","startOfHorizonal","startOfVertical","intervalsOverlap","a0","a1","b0","b1","updateAABB","aabb","rotation","scale","gridScale","outAABB","minPoint","set","maxPoint","transform","Matrix4x4","rotationZ","minZ","maxZ","visible","ctx","camera","level","userData","getClipStateWithFrustum","frustum","ClipState","NOT_CLIPPED","calcLevelAABB","minMaxWorldPos","mipLevels","calcMipLevels","getWorldPosition","snappedPos","Vector2","tileSize","base","posX","posY","beginExtend","setXY","floor","l","fillX","fillY","nextScale","nextSnappedPos","tileCentre","r","nextBase","distX","abs","distY","maxDist","getFarPlane","ceil","log2","addInstance","info","offsetX","offsetY","mipLevel","numInstances","instanceDatas","maxMiplevel","gather","context","renderData","frustumCulling","crossPrimitives","primitive","tilePrimitives","fillerPrimitives","trimPrimitives","seamPrimitives","bufferSubData","onDispose"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"clipmap.js","sources":["../../src/render/clipmap.ts"],"sourcesContent":["/**\r\n * copy from http://git.mikejsavage.co.uk/medfall/file/clipmap.cc.html#l197\r\n */\r\n\r\nimport type { Nullable, Vector4 } from '@zephyr3d/base';\r\nimport { AABB, BoxSide, ClipState, Disposable, Matrix4x4, Vector2, Vector3 } from '@zephyr3d/base';\r\nimport type { Camera } from '../camera';\r\nimport { Primitive } from './primitive';\r\nimport {\r\n getVertexAttributeFormat,\r\n getVertexAttributeIndex,\r\n VERTEX_ATTRIB_POSITION,\r\n VERTEX_ATTRIB_TEXCOORD0,\r\n type VertexAttribFormat\r\n} from '@zephyr3d/device';\r\n\r\nconst tmpAABB = new AABB();\r\nconst tmpV3 = new Vector3();\r\nconst rotationValues = [0, Math.PI * 1.5, Math.PI * 0.5, Math.PI] as const;\r\n/**\r\n * Frustum plane mask covering everything but the far plane, for a clipmap that\r\n * reaches past it. @internal\r\n */\r\nconst ALL_PLANES_EXCEPT_FAR = 0b111111 & ~(1 << BoxSide.BACK);\r\n\r\n/** @internal */\r\nexport type PrimitiveInstanceInfo = {\r\n primitive: Primitive;\r\n numInstances: number;\r\n instanceDatas: Float32Array<ArrayBuffer>;\r\n mipLevels: Float32Array<ArrayBuffer>;\r\n maxMiplevel: number;\r\n};\r\n/** @internal */\r\nexport interface ClipmapGatherContext {\r\n camera: Camera;\r\n gridScale: number;\r\n minMaxWorldPos: Vector4;\r\n userData: unknown;\r\n frustumCulling: boolean;\r\n /**\r\n * How far from the camera the clipmap should reach, in world units. Defaults\r\n * to the camera far plane when omitted.\r\n *\r\n * Only the level count is derived from this, not the clip: a caller that\r\n * pushes the outermost ring past the far plane in its own vertex shader needs\r\n * the levels to exist before it can do so, and the far plane would otherwise\r\n * cap them well short of the horizon.\r\n */\r\n viewDistance?: number;\r\n /**\r\n * Whether to emit the skirt ring around the outermost level. Off by default,\r\n * so the terrain clipmap is unaffected.\r\n */\r\n skirt?: boolean;\r\n calcAABB(\r\n userData: unknown,\r\n minX: number,\r\n maxX: number,\r\n minZ: number,\r\n maxZ: number,\r\n outAABB: AABB,\r\n level: number\r\n ): void;\r\n}\r\n\r\n/** @internal */\r\nexport interface ClipmapDrawContext extends ClipmapGatherContext {\r\n drawPrimitive(\r\n prim: Primitive,\r\n rotation: number,\r\n offset: Vector2,\r\n scale: number,\r\n gridScale: number,\r\n level: number\r\n ): void;\r\n}\r\n\r\n/** @internal */\r\nexport class Clipmap extends Disposable {\r\n private readonly _instanceDataPool: Float32Array<ArrayBuffer>[];\r\n private _instanceDataPoolSize: number;\r\n private readonly _mipLevelDataPool: Float32Array<ArrayBuffer>[];\r\n private _mipLevelDataPoolSize: number;\r\n private readonly _nonInstanceDataPool: Float32Array<ArrayBuffer>[];\r\n private _nonInstanceDataPoolSize: number;\r\n private readonly _nonInstanceMipLevelDataPool: Float32Array<ArrayBuffer>[];\r\n private _nonInstanceMipLevelDataPoolSize: number;\r\n private readonly _extraInstanceBuffers: VertexAttribFormat[];\r\n private _tileResolution: number;\r\n private readonly _maxMipLevels: number;\r\n\r\n private _tileMesh!: Primitive;\r\n private _tileMeshLines!: Primitive;\r\n private _tileMeshBBox!: AABB;\r\n\r\n private _fillerMesh!: Primitive;\r\n private _fillerMeshLines!: Primitive;\r\n private _fillerMeshAABB!: AABB;\r\n\r\n private _trimMesh!: Primitive;\r\n private _trimMeshLines!: Primitive;\r\n private _trimMeshAABB!: AABB;\r\n\r\n private _crossMesh!: Primitive;\r\n private _crossMeshLines!: Primitive;\r\n private _crossMeshAABB!: AABB;\r\n\r\n private _seamMesh!: Primitive;\r\n private _seamMeshLines!: Primitive;\r\n private _seamMeshAABB!: AABB;\r\n\r\n private _skirtMesh!: Primitive;\r\n private _skirtMeshLines!: Primitive;\r\n\r\n private _wireframe: boolean;\r\n\r\n constructor(resolution: number, extraInstanceBuffers: VertexAttribFormat[], maxMipLevels = 64) {\r\n super();\r\n if (\r\n extraInstanceBuffers &&\r\n extraInstanceBuffers.findIndex(\r\n (val) =>\r\n getVertexAttributeIndex(val) === VERTEX_ATTRIB_POSITION ||\r\n getVertexAttributeIndex(val) === VERTEX_ATTRIB_TEXCOORD0 ||\r\n getVertexAttributeFormat(val) !== 'f32'\r\n ) >= 0\r\n ) {\r\n throw new Error(\r\n 'Extra instance buffers must be f32 format and cannot have vertex attribute of POSITOIN and TEXCOORD0'\r\n );\r\n }\r\n this._extraInstanceBuffers = extraInstanceBuffers?.slice() ?? [];\r\n this._tileResolution = resolution;\r\n this._maxMipLevels = Math.min(64, Math.max(1, maxMipLevels >>> 0));\r\n this._instanceDataPool = [];\r\n this._instanceDataPoolSize = 0;\r\n this._mipLevelDataPool = [];\r\n this._mipLevelDataPoolSize = 0;\r\n this._nonInstanceDataPool = [];\r\n this._nonInstanceDataPoolSize = 0;\r\n this._nonInstanceMipLevelDataPool = [];\r\n this._nonInstanceMipLevelDataPoolSize = 0;\r\n this._wireframe = false;\r\n this.generateCrossMesh();\r\n this.generateFillerMesh();\r\n this.generateSeamMesh();\r\n this.generateTileMesh();\r\n this.generateTrimMesh();\r\n this.generateSkirtMesh();\r\n }\r\n get wireframe() {\r\n return this._wireframe;\r\n }\r\n set wireframe(val: boolean) {\r\n this._wireframe = !!val;\r\n }\r\n get tileResolution() {\r\n return this._tileResolution;\r\n }\r\n set tileResolution(val: number) {\r\n if (val !== this._tileResolution) {\r\n this._tileResolution = val;\r\n this.generateCrossMesh();\r\n this.generateFillerMesh();\r\n this.generateSeamMesh();\r\n this.generateTileMesh();\r\n this.generateTrimMesh();\r\n this.generateSkirtMesh();\r\n }\r\n }\r\n private allocInstanceBuffer() {\r\n if (this._instanceDataPoolSize === 0) {\r\n const buffer = new Float32Array(this._maxMipLevels * 16 * 4);\r\n this._instanceDataPool.push(buffer);\r\n return buffer;\r\n } else {\r\n return this._instanceDataPool[--this._instanceDataPoolSize];\r\n }\r\n }\r\n private allocNonInstanceBuffer(x: number, y: number, z: number, w: number) {\r\n let buffer: Float32Array<ArrayBuffer>;\r\n if (this._nonInstanceDataPoolSize === 0) {\r\n buffer = new Float32Array(4);\r\n this._nonInstanceDataPool.push(buffer);\r\n } else {\r\n buffer = this._nonInstanceDataPool[--this._nonInstanceDataPoolSize];\r\n }\r\n buffer[0] = x;\r\n buffer[1] = y;\r\n buffer[2] = z;\r\n buffer[3] = w;\r\n return buffer;\r\n }\r\n private allocMipLevelBuffer() {\r\n if (this._mipLevelDataPoolSize === 0) {\r\n const buffer = new Float32Array(this._maxMipLevels * 16);\r\n this._mipLevelDataPool.push(buffer);\r\n return buffer;\r\n } else {\r\n return this._mipLevelDataPool[--this._mipLevelDataPoolSize];\r\n }\r\n }\r\n private allocNonInstanceMipLevelBuffer(val: number) {\r\n let buffer: Float32Array<ArrayBuffer>;\r\n if (this._nonInstanceMipLevelDataPoolSize === 0) {\r\n buffer = new Float32Array(1);\r\n this._nonInstanceMipLevelDataPool.push(buffer);\r\n } else {\r\n buffer = this._nonInstanceMipLevelDataPool[--this._nonInstanceMipLevelDataPoolSize];\r\n }\r\n buffer[0] = val;\r\n return buffer;\r\n }\r\n private patch2d(tileResolution: number, x: number, y: number) {\r\n return y * (tileResolution + 1) + x;\r\n }\r\n private calcAABB(vertices: Float32Array) {\r\n let maxX = -Number.MAX_VALUE;\r\n let maxY = -Number.MAX_VALUE;\r\n let minX = Number.MAX_VALUE;\r\n let minY = Number.MAX_VALUE;\r\n for (let i = 0; i < vertices.length / 3; i++) {\r\n const x = vertices[i * 3 + 0];\r\n const y = vertices[i * 3 + 1];\r\n if (x > maxX) {\r\n maxX = x;\r\n }\r\n if (x < minX) {\r\n minX = x;\r\n }\r\n if (y > maxY) {\r\n maxY = y;\r\n }\r\n if (y < minY) {\r\n minY = y;\r\n }\r\n }\r\n return new AABB(new Vector3(minX, minY, 0), new Vector3(maxX, maxY, 0));\r\n }\r\n generateTileMesh() {\r\n this._tileMesh?.dispose();\r\n this._tileMesh = new Primitive();\r\n const patchVertResolution = this._tileResolution + 1;\r\n const vertices = new Float32Array(patchVertResolution * patchVertResolution * 3);\r\n let n = 0;\r\n for (let y = 0; y < patchVertResolution; y++) {\r\n for (let x = 0; x < patchVertResolution; x++) {\r\n vertices[n++] = x;\r\n vertices[n++] = y;\r\n vertices[n++] = 0;\r\n }\r\n }\r\n n = 0;\r\n const indices = new Uint16Array(this._tileResolution * this._tileResolution * 6);\r\n for (let y = 0; y < this._tileResolution; y++) {\r\n for (let x = 0; x < this._tileResolution; x++) {\r\n indices[n++] = this.patch2d(this._tileResolution, x, y);\r\n indices[n++] = this.patch2d(this._tileResolution, x, y + 1);\r\n indices[n++] = this.patch2d(this._tileResolution, x + 1, y + 1);\r\n indices[n++] = this.patch2d(this._tileResolution, x, y);\r\n indices[n++] = this.patch2d(this._tileResolution, x + 1, y + 1);\r\n indices[n++] = this.patch2d(this._tileResolution, x + 1, y);\r\n }\r\n }\r\n this._tileMesh.createAndSetVertexBuffer('position_f32x3', vertices);\r\n this._tileMesh.createAndSetVertexBuffer('tex0_f32x4', this.allocInstanceBuffer(), 'instance');\r\n this._instanceDataPoolSize++;\r\n for (const fmt of this._extraInstanceBuffers) {\r\n this._tileMesh.createAndSetVertexBuffer(fmt, this.allocInstanceBuffer(), 'instance');\r\n this._instanceDataPoolSize++;\r\n }\r\n this._tileMesh.createAndSetIndexBuffer(indices);\r\n this._tileMesh.indexStart = 0;\r\n this._tileMesh.indexCount = indices.length;\r\n this._tileMesh.primitiveType = 'triangle-list';\r\n this._tileMeshBBox = this.calcAABB(vertices);\r\n\r\n const indicesLines = new Uint16Array(indices.length * 2);\r\n for (let i = 0; i < indices.length / 3; i++) {\r\n indicesLines[i * 6 + 0] = indices[i * 3 + 0];\r\n indicesLines[i * 6 + 1] = indices[i * 3 + 1];\r\n indicesLines[i * 6 + 2] = indices[i * 3 + 1];\r\n indicesLines[i * 6 + 3] = indices[i * 3 + 2];\r\n indicesLines[i * 6 + 4] = indices[i * 3 + 2];\r\n indicesLines[i * 6 + 5] = indices[i * 3 + 0];\r\n }\r\n this._tileMeshLines?.dispose();\r\n this._tileMeshLines = new Primitive();\r\n this._tileMeshLines.setVertexBuffer(this._tileMesh.getVertexBuffer('position')!);\r\n this._tileMeshLines.createAndSetVertexBuffer('tex0_f32x4', this.allocInstanceBuffer(), 'instance');\r\n this._instanceDataPoolSize++;\r\n for (const fmt of this._extraInstanceBuffers) {\r\n this._tileMeshLines.createAndSetVertexBuffer(fmt, this.allocInstanceBuffer(), 'instance');\r\n this._instanceDataPoolSize++;\r\n }\r\n this._tileMeshLines.createAndSetIndexBuffer(indicesLines);\r\n this._tileMeshLines.indexStart = 0;\r\n this._tileMeshLines.indexCount = indicesLines.length;\r\n this._tileMeshLines.primitiveType = 'line-list';\r\n }\r\n generateFillerMesh() {\r\n this._fillerMesh?.dispose();\r\n this._fillerMesh = new Primitive();\r\n const patchVertResolution = this._tileResolution + 1;\r\n const vertices = new Float32Array(patchVertResolution * 8 * 3);\r\n let n = 0;\r\n const offset = this._tileResolution;\r\n for (let i = 0; i < patchVertResolution; i++) {\r\n vertices[n++] = offset + i + 1;\r\n vertices[n++] = 0;\r\n vertices[n++] = 0;\r\n vertices[n++] = offset + i + 1;\r\n vertices[n++] = 1;\r\n vertices[n++] = 0;\r\n }\r\n for (let i = 0; i < patchVertResolution; i++) {\r\n vertices[n++] = 1;\r\n vertices[n++] = offset + i + 1;\r\n vertices[n++] = 0;\r\n vertices[n++] = 0;\r\n vertices[n++] = offset + i + 1;\r\n vertices[n++] = 0;\r\n }\r\n for (let i = 0; i < patchVertResolution; i++) {\r\n vertices[n++] = -offset - i;\r\n vertices[n++] = 1;\r\n vertices[n++] = 0;\r\n vertices[n++] = -offset - i;\r\n vertices[n++] = 0;\r\n vertices[n++] = 0;\r\n }\r\n for (let i = 0; i < patchVertResolution; i++) {\r\n vertices[n++] = 0;\r\n vertices[n++] = -offset - i;\r\n vertices[n++] = 0;\r\n vertices[n++] = 1;\r\n vertices[n++] = -offset - i;\r\n vertices[n++] = 0;\r\n }\r\n n = 0;\r\n const indices = new Uint16Array(this._tileResolution * 24);\r\n for (let i = 0; i < this._tileResolution * 4; i++) {\r\n const arm = (i / this._tileResolution) >> 0;\r\n const bl = (arm + i) * 2 + 0;\r\n const br = (arm + i) * 2 + 1;\r\n const tl = (arm + i) * 2 + 2;\r\n const tr = (arm + i) * 2 + 3;\r\n if (arm % 2 === 0) {\r\n indices[n++] = br;\r\n indices[n++] = tr;\r\n indices[n++] = bl;\r\n indices[n++] = bl;\r\n indices[n++] = tr;\r\n indices[n++] = tl;\r\n } else {\r\n indices[n++] = br;\r\n indices[n++] = tl;\r\n indices[n++] = bl;\r\n indices[n++] = br;\r\n indices[n++] = tr;\r\n indices[n++] = tl;\r\n }\r\n }\r\n this._fillerMesh.createAndSetVertexBuffer('position_f32x3', vertices);\r\n this._fillerMesh.createAndSetVertexBuffer('tex0_f32x4', this.allocInstanceBuffer(), 'instance');\r\n this._instanceDataPoolSize++;\r\n for (const fmt of this._extraInstanceBuffers) {\r\n this._fillerMesh.createAndSetVertexBuffer(fmt, this.allocInstanceBuffer(), 'instance');\r\n this._instanceDataPoolSize++;\r\n }\r\n this._fillerMesh.createAndSetIndexBuffer(indices);\r\n this._fillerMesh.indexStart = 0;\r\n this._fillerMesh.indexCount = indices.length;\r\n this._fillerMesh.primitiveType = 'triangle-list';\r\n this._fillerMeshAABB = this.calcAABB(vertices);\r\n\r\n const indicesLines = new Uint16Array(indices.length * 2);\r\n for (let i = 0; i < indices.length / 3; i++) {\r\n indicesLines[i * 6 + 0] = indices[i * 3 + 0];\r\n indicesLines[i * 6 + 1] = indices[i * 3 + 1];\r\n indicesLines[i * 6 + 2] = indices[i * 3 + 1];\r\n indicesLines[i * 6 + 3] = indices[i * 3 + 2];\r\n indicesLines[i * 6 + 4] = indices[i * 3 + 2];\r\n indicesLines[i * 6 + 5] = indices[i * 3 + 0];\r\n }\r\n this._fillerMeshLines?.dispose();\r\n this._fillerMeshLines = new Primitive();\r\n this._fillerMeshLines.setVertexBuffer(this._fillerMesh.getVertexBuffer('position')!);\r\n this._fillerMeshLines.createAndSetVertexBuffer('tex0_f32x4', this.allocInstanceBuffer(), 'instance');\r\n this._instanceDataPoolSize++;\r\n for (const fmt of this._extraInstanceBuffers) {\r\n this._fillerMeshLines.createAndSetVertexBuffer(fmt, this.allocInstanceBuffer(), 'instance');\r\n this._instanceDataPoolSize++;\r\n }\r\n this._fillerMeshLines.createAndSetIndexBuffer(indicesLines);\r\n this._fillerMeshLines.indexStart = 0;\r\n this._fillerMeshLines.indexCount = indicesLines.length;\r\n this._fillerMeshLines.primitiveType = 'line-list';\r\n }\r\n generateTrimMesh() {\r\n this._trimMesh?.dispose();\r\n this._trimMesh = new Primitive();\r\n const clipmapVertResolution = this._tileResolution * 4 + 2;\r\n const vertices = new Float32Array((clipmapVertResolution * 2 + 1) * 2 * 3);\r\n let n = 0;\r\n const d = 0.5 * (clipmapVertResolution + 1);\r\n for (let i = 0; i < clipmapVertResolution + 1; i++) {\r\n vertices[n++] = 0 - d;\r\n vertices[n++] = clipmapVertResolution - i - d;\r\n vertices[n++] = 0;\r\n vertices[n++] = 1 - d;\r\n vertices[n++] = clipmapVertResolution - i - d;\r\n vertices[n++] = 0;\r\n }\r\n const startOfHorizonal = n / 3;\r\n for (let i = 0; i < clipmapVertResolution; i++) {\r\n vertices[n++] = i + 1 - d;\r\n vertices[n++] = 0 - d;\r\n vertices[n++] = 0;\r\n vertices[n++] = i + 1 - d;\r\n vertices[n++] = 1 - d;\r\n vertices[n++] = 0;\r\n }\r\n n = 0;\r\n const indices = new Uint16Array((clipmapVertResolution * 2 - 1) * 6);\r\n for (let i = 0; i < clipmapVertResolution; i++) {\r\n indices[n++] = (i + 0) * 2 + 1;\r\n indices[n++] = (i + 1) * 2 + 0;\r\n indices[n++] = (i + 0) * 2 + 0;\r\n indices[n++] = (i + 1) * 2 + 1;\r\n indices[n++] = (i + 1) * 2 + 0;\r\n indices[n++] = (i + 0) * 2 + 1;\r\n }\r\n for (let i = 0; i < clipmapVertResolution - 1; i++) {\r\n indices[n++] = startOfHorizonal + (i + 0) * 2 + 1;\r\n indices[n++] = startOfHorizonal + (i + 1) * 2 + 0;\r\n indices[n++] = startOfHorizonal + (i + 0) * 2 + 0;\r\n indices[n++] = startOfHorizonal + (i + 1) * 2 + 1;\r\n indices[n++] = startOfHorizonal + (i + 1) * 2 + 0;\r\n indices[n++] = startOfHorizonal + (i + 0) * 2 + 1;\r\n }\r\n this._trimMesh.createAndSetVertexBuffer('position_f32x3', vertices);\r\n this._trimMesh.createAndSetVertexBuffer('tex0_f32x4', this.allocInstanceBuffer(), 'instance');\r\n this._instanceDataPoolSize++;\r\n for (const fmt of this._extraInstanceBuffers) {\r\n this._trimMesh.createAndSetVertexBuffer(fmt, this.allocInstanceBuffer(), 'instance');\r\n this._instanceDataPoolSize++;\r\n }\r\n this._trimMesh.createAndSetIndexBuffer(indices);\r\n this._trimMesh.indexStart = 0;\r\n this._trimMesh.indexCount = indices.length;\r\n this._trimMesh.primitiveType = 'triangle-list';\r\n this._trimMeshAABB = this.calcAABB(vertices);\r\n\r\n const indicesLines = new Uint16Array(indices.length * 2);\r\n for (let i = 0; i < indices.length / 3; i++) {\r\n indicesLines[i * 6 + 0] = indices[i * 3 + 0];\r\n indicesLines[i * 6 + 1] = indices[i * 3 + 1];\r\n indicesLines[i * 6 + 2] = indices[i * 3 + 1];\r\n indicesLines[i * 6 + 3] = indices[i * 3 + 2];\r\n indicesLines[i * 6 + 4] = indices[i * 3 + 2];\r\n indicesLines[i * 6 + 5] = indices[i * 3 + 0];\r\n }\r\n this._trimMeshLines?.dispose();\r\n this._trimMeshLines = new Primitive();\r\n this._trimMeshLines.setVertexBuffer(this._trimMesh.getVertexBuffer('position')!);\r\n this._trimMeshLines.createAndSetVertexBuffer('tex0_f32x4', this.allocInstanceBuffer(), 'instance');\r\n this._instanceDataPoolSize++;\r\n for (const fmt of this._extraInstanceBuffers) {\r\n this._trimMeshLines.createAndSetVertexBuffer(fmt, this.allocInstanceBuffer(), 'instance');\r\n this._instanceDataPoolSize++;\r\n }\r\n this._trimMeshLines.createAndSetIndexBuffer(indicesLines);\r\n this._trimMeshLines.indexStart = 0;\r\n this._trimMeshLines.indexCount = indicesLines.length;\r\n this._trimMeshLines.primitiveType = 'line-list';\r\n }\r\n generateCrossMesh() {\r\n const patchVertResolution = this._tileResolution + 1;\r\n const vertices = new Float32Array(patchVertResolution * 8 * 3);\r\n let n = 0;\r\n for (let i = 0; i < patchVertResolution * 2; i++) {\r\n vertices[n++] = i - this._tileResolution;\r\n vertices[n++] = 0;\r\n vertices[n++] = 0;\r\n vertices[n++] = i - this._tileResolution;\r\n vertices[n++] = 1;\r\n vertices[n++] = 0;\r\n }\r\n const startOfVertical = n / 3;\r\n for (let i = 0; i < patchVertResolution * 2; i++) {\r\n vertices[n++] = 0;\r\n vertices[n++] = i - this._tileResolution;\r\n vertices[n++] = 0;\r\n vertices[n++] = 1;\r\n vertices[n++] = i - this._tileResolution;\r\n vertices[n++] = 0;\r\n }\r\n n = 0;\r\n const indices = new Uint16Array(this._tileResolution * 24 + 6);\r\n for (let i = 0; i < this._tileResolution * 2 + 1; i++) {\r\n const bl = i * 2 + 0;\r\n const br = i * 2 + 1;\r\n const tl = i * 2 + 2;\r\n const tr = i * 2 + 3;\r\n indices[n++] = br;\r\n indices[n++] = tr;\r\n indices[n++] = bl;\r\n indices[n++] = bl;\r\n indices[n++] = tr;\r\n indices[n++] = tl;\r\n }\r\n for (let i = 0; i < this._tileResolution * 2 + 1; i++) {\r\n if (i === this._tileResolution) {\r\n continue;\r\n }\r\n const bl = i * 2 + 0;\r\n const br = i * 2 + 1;\r\n const tl = i * 2 + 2;\r\n const tr = i * 2 + 3;\r\n indices[n++] = startOfVertical + br;\r\n indices[n++] = startOfVertical + bl;\r\n indices[n++] = startOfVertical + tr;\r\n indices[n++] = startOfVertical + bl;\r\n indices[n++] = startOfVertical + tl;\r\n indices[n++] = startOfVertical + tr;\r\n }\r\n this._crossMesh?.dispose();\r\n this._crossMesh = new Primitive();\r\n this._crossMesh.createAndSetVertexBuffer('position_f32x3', vertices);\r\n this._crossMesh.createAndSetVertexBuffer(\r\n 'tex0_f32x4',\r\n this.allocNonInstanceBuffer(0, 0, 0, 0),\r\n 'instance'\r\n );\r\n this._nonInstanceDataPoolSize++;\r\n for (const fmt of this._extraInstanceBuffers) {\r\n this._crossMesh.createAndSetVertexBuffer(fmt, this.allocNonInstanceBuffer(0, 0, 0, 0), 'instance');\r\n this._nonInstanceDataPoolSize++;\r\n }\r\n this._crossMesh.createAndSetIndexBuffer(indices);\r\n this._crossMesh.indexStart = 0;\r\n this._crossMesh.indexCount = indices.length;\r\n this._crossMesh.primitiveType = 'triangle-list';\r\n this._crossMeshAABB = this.calcAABB(vertices);\r\n\r\n const indicesLines = new Uint16Array(indices.length * 2);\r\n for (let i = 0; i < indices.length / 3; i++) {\r\n indicesLines[i * 6 + 0] = indices[i * 3 + 0];\r\n indicesLines[i * 6 + 1] = indices[i * 3 + 1];\r\n indicesLines[i * 6 + 2] = indices[i * 3 + 1];\r\n indicesLines[i * 6 + 3] = indices[i * 3 + 2];\r\n indicesLines[i * 6 + 4] = indices[i * 3 + 2];\r\n indicesLines[i * 6 + 5] = indices[i * 3 + 0];\r\n }\r\n this._crossMeshLines?.dispose();\r\n this._crossMeshLines = new Primitive();\r\n this._crossMeshLines.setVertexBuffer(this._crossMesh.getVertexBuffer('position')!);\r\n this._crossMeshLines.createAndSetVertexBuffer(\r\n 'tex0_f32x4',\r\n this.allocNonInstanceBuffer(0, 0, 0, 0),\r\n 'instance'\r\n );\r\n this._nonInstanceDataPoolSize++;\r\n for (const fmt of this._extraInstanceBuffers) {\r\n this._crossMeshLines.createAndSetVertexBuffer(fmt, this.allocNonInstanceBuffer(0, 0, 0, 0), 'instance');\r\n this._nonInstanceDataPoolSize++;\r\n }\r\n this._crossMeshLines.createAndSetIndexBuffer(indicesLines);\r\n this._crossMeshLines.indexStart = 0;\r\n this._crossMeshLines.indexCount = indicesLines.length;\r\n this._crossMeshLines.primitiveType = 'line-list';\r\n }\r\n generateSeamMesh() {\r\n this._seamMesh?.dispose();\r\n this._seamMesh = new Primitive();\r\n const clipmapVertResolution = this._tileResolution * 4 + 2;\r\n const vertices = new Float32Array(clipmapVertResolution * 4 * 3);\r\n for (let i = 0; i < clipmapVertResolution; i++) {\r\n vertices[(clipmapVertResolution * 0 + i) * 3 + 0] = i;\r\n vertices[(clipmapVertResolution * 0 + i) * 3 + 1] = 0;\r\n vertices[(clipmapVertResolution * 0 + i) * 3 + 2] = 0;\r\n vertices[(clipmapVertResolution * 1 + i) * 3 + 0] = clipmapVertResolution;\r\n vertices[(clipmapVertResolution * 1 + i) * 3 + 1] = i;\r\n vertices[(clipmapVertResolution * 1 + i) * 3 + 2] = 0;\r\n vertices[(clipmapVertResolution * 2 + i) * 3 + 0] = clipmapVertResolution - i;\r\n vertices[(clipmapVertResolution * 2 + i) * 3 + 1] = clipmapVertResolution;\r\n vertices[(clipmapVertResolution * 2 + i) * 3 + 2] = 0;\r\n vertices[(clipmapVertResolution * 3 + i) * 3 + 0] = 0;\r\n vertices[(clipmapVertResolution * 3 + i) * 3 + 1] = clipmapVertResolution - i;\r\n vertices[(clipmapVertResolution * 3 + i) * 3 + 2] = 0;\r\n }\r\n const indices = new Uint16Array(clipmapVertResolution * 6);\r\n let n = 0;\r\n for (let i = 0; i < clipmapVertResolution * 4; i += 2) {\r\n indices[n++] = i + 1;\r\n indices[n++] = i + 2;\r\n indices[n++] = i;\r\n }\r\n indices[indices.length - 1] = 0;\r\n this._seamMesh.createAndSetVertexBuffer('position_f32x3', vertices);\r\n this._seamMesh.createAndSetVertexBuffer('tex0_f32x4', this.allocInstanceBuffer(), 'instance');\r\n this._instanceDataPoolSize++;\r\n for (const fmt of this._extraInstanceBuffers) {\r\n this._seamMesh.createAndSetVertexBuffer(fmt, this.allocInstanceBuffer(), 'instance');\r\n this._instanceDataPoolSize++;\r\n }\r\n this._seamMesh.createAndSetIndexBuffer(indices);\r\n this._seamMesh.indexStart = 0;\r\n this._seamMesh.indexCount = indices.length;\r\n this._seamMesh.primitiveType = 'triangle-list';\r\n this._seamMeshAABB = this.calcAABB(vertices);\r\n\r\n const indicesLines = new Uint16Array(indices.length * 2);\r\n for (let i = 0; i < indices.length / 3; i++) {\r\n indicesLines[i * 6 + 0] = indices[i * 3 + 0];\r\n indicesLines[i * 6 + 1] = indices[i * 3 + 1];\r\n indicesLines[i * 6 + 2] = indices[i * 3 + 1];\r\n indicesLines[i * 6 + 3] = indices[i * 3 + 2];\r\n indicesLines[i * 6 + 4] = indices[i * 3 + 2];\r\n indicesLines[i * 6 + 5] = indices[i * 3 + 0];\r\n }\r\n this._seamMeshLines?.dispose();\r\n this._seamMeshLines = new Primitive();\r\n this._seamMeshLines.setVertexBuffer(this._seamMesh.getVertexBuffer('position')!);\r\n this._seamMeshLines.createAndSetVertexBuffer('tex0_f32x4', this.allocInstanceBuffer(), 'instance');\r\n this._instanceDataPoolSize++;\r\n for (const fmt of this._extraInstanceBuffers) {\r\n this._seamMeshLines.createAndSetVertexBuffer(fmt, this.allocInstanceBuffer(), 'instance');\r\n this._instanceDataPoolSize++;\r\n }\r\n this._seamMeshLines.createAndSetIndexBuffer(indicesLines);\r\n this._seamMeshLines.indexStart = 0;\r\n this._seamMeshLines.indexCount = indicesLines.length;\r\n this._seamMeshLines.primitiveType = 'line-list';\r\n }\r\n /**\r\n * Ring of quads welded to the outer boundary of the outermost level, whose\r\n * outer edge the vertex shader is expected to push towards the horizon.\r\n *\r\n * The inner edge has to land on exactly the vertices the outermost tiles end\r\n * on, or a displaced surface tears along the join: both sides evaluate the\r\n * same wave function, so identical world positions are what keeps them\r\n * identical. That boundary runs from `-2 * tileResolution` to\r\n * `2 * tileResolution + 1` in the level's local units - the asymmetry is the\r\n * `fillX`/`fillY` shift `gather` applies to the far tiles - which is\r\n * `clipmapVertResolution` vertices a side, the same density the seam mesh\r\n * uses.\r\n *\r\n * Outer vertices are flagged with `position.z = 1`. Every other clipmap mesh\r\n * leaves z at 0 and the shader's clipmap matrix only reads xy, so the\r\n * component is free to carry the flag without a second vertex stream.\r\n */\r\n generateSkirtMesh() {\r\n const clipmapVertResolution = this._tileResolution * 4 + 2;\r\n const lo = -2 * this._tileResolution;\r\n const hi = 2 * this._tileResolution + 1;\r\n // Unique positions around the perimeter: each side contributes all but its\r\n // last vertex, which is the next side's first, so the loop closes without\r\n // doubling the corners.\r\n const perSide = clipmapVertResolution - 1;\r\n const ringCount = perSide * 4;\r\n const vertices = new Float32Array(ringCount * 2 * 3);\r\n // Placeholder extent for the outer ring. The vertex shader relocates these\r\n // vertices, so this only has to be outside the inner ring and finite.\r\n const outerFactor = 8;\r\n const centre = (lo + hi) * 0.5;\r\n let n = 0;\r\n const putRing = (index: number, x: number, y: number, outer: boolean) => {\r\n const px = outer ? centre + (x - centre) * outerFactor : x;\r\n const py = outer ? centre + (y - centre) * outerFactor : y;\r\n const base = (index + (outer ? ringCount : 0)) * 3;\r\n vertices[base + 0] = px;\r\n vertices[base + 1] = py;\r\n vertices[base + 2] = outer ? 1 : 0;\r\n };\r\n for (let i = 0; i < perSide; i++) {\r\n putRing(n, lo + i, lo, false);\r\n putRing(n, lo + i, lo, true);\r\n n++;\r\n }\r\n for (let i = 0; i < perSide; i++) {\r\n putRing(n, hi, lo + i, false);\r\n putRing(n, hi, lo + i, true);\r\n n++;\r\n }\r\n for (let i = 0; i < perSide; i++) {\r\n putRing(n, hi - i, hi, false);\r\n putRing(n, hi - i, hi, true);\r\n n++;\r\n }\r\n for (let i = 0; i < perSide; i++) {\r\n putRing(n, lo, hi - i, false);\r\n putRing(n, lo, hi - i, true);\r\n n++;\r\n }\r\n const indices = new Uint16Array(ringCount * 6);\r\n n = 0;\r\n for (let k = 0; k < ringCount; k++) {\r\n const j = (k + 1) % ringCount;\r\n indices[n++] = k;\r\n indices[n++] = j;\r\n indices[n++] = ringCount + j;\r\n indices[n++] = k;\r\n indices[n++] = ringCount + j;\r\n indices[n++] = ringCount + k;\r\n }\r\n this._skirtMesh?.dispose();\r\n this._skirtMesh = new Primitive();\r\n this._skirtMesh.createAndSetVertexBuffer('position_f32x3', vertices);\r\n this._skirtMesh.createAndSetVertexBuffer(\r\n 'tex0_f32x4',\r\n this.allocNonInstanceBuffer(0, 0, 0, 0),\r\n 'instance'\r\n );\r\n this._nonInstanceDataPoolSize++;\r\n for (const fmt of this._extraInstanceBuffers) {\r\n this._skirtMesh.createAndSetVertexBuffer(fmt, this.allocNonInstanceBuffer(0, 0, 0, 0), 'instance');\r\n this._nonInstanceDataPoolSize++;\r\n }\r\n this._skirtMesh.createAndSetIndexBuffer(indices);\r\n this._skirtMesh.indexStart = 0;\r\n this._skirtMesh.indexCount = indices.length;\r\n this._skirtMesh.primitiveType = 'triangle-list';\r\n\r\n const indicesLines = new Uint16Array(indices.length * 2);\r\n for (let i = 0; i < indices.length / 3; i++) {\r\n indicesLines[i * 6 + 0] = indices[i * 3 + 0];\r\n indicesLines[i * 6 + 1] = indices[i * 3 + 1];\r\n indicesLines[i * 6 + 2] = indices[i * 3 + 1];\r\n indicesLines[i * 6 + 3] = indices[i * 3 + 2];\r\n indicesLines[i * 6 + 4] = indices[i * 3 + 2];\r\n indicesLines[i * 6 + 5] = indices[i * 3 + 0];\r\n }\r\n this._skirtMeshLines?.dispose();\r\n this._skirtMeshLines = new Primitive();\r\n this._skirtMeshLines.setVertexBuffer(this._skirtMesh.getVertexBuffer('position')!);\r\n this._skirtMeshLines.createAndSetVertexBuffer(\r\n 'tex0_f32x4',\r\n this.allocNonInstanceBuffer(0, 0, 0, 0),\r\n 'instance'\r\n );\r\n this._nonInstanceDataPoolSize++;\r\n for (const fmt of this._extraInstanceBuffers) {\r\n this._skirtMeshLines.createAndSetVertexBuffer(fmt, this.allocNonInstanceBuffer(0, 0, 0, 0), 'instance');\r\n this._nonInstanceDataPoolSize++;\r\n }\r\n this._skirtMeshLines.createAndSetIndexBuffer(indicesLines);\r\n this._skirtMeshLines.indexStart = 0;\r\n this._skirtMeshLines.indexCount = indicesLines.length;\r\n this._skirtMeshLines.primitiveType = 'line-list';\r\n }\r\n private intervalsOverlap(a0: number, a1: number, b0: number, b1: number) {\r\n return a0 <= b1 && b0 <= a1;\r\n }\r\n private updateAABB(\r\n aabb: AABB,\r\n rotation: Nullable<number>,\r\n offset: Vector2,\r\n scale: number,\r\n gridScale: number,\r\n outAABB: AABB\r\n ) {\r\n if (!rotation) {\r\n tmpAABB.minPoint.set(aabb.minPoint);\r\n tmpAABB.maxPoint.set(aabb.maxPoint);\r\n } else {\r\n AABB.transform(aabb, Matrix4x4.rotationZ(rotation), tmpAABB);\r\n }\r\n const minX = (tmpAABB.minPoint.x * scale + offset.x) * gridScale;\r\n const maxX = (tmpAABB.maxPoint.x * scale + offset.x) * gridScale;\r\n const minZ = (tmpAABB.minPoint.y * scale + offset.y) * gridScale;\r\n const maxZ = (tmpAABB.maxPoint.y * scale + offset.y) * gridScale;\r\n if (minX < outAABB.minPoint.x) {\r\n outAABB.minPoint.x = minX;\r\n }\r\n if (maxX > outAABB.maxPoint.x) {\r\n outAABB.maxPoint.x = maxX;\r\n }\r\n if (minZ < outAABB.minPoint.z) {\r\n outAABB.minPoint.z = minZ;\r\n }\r\n if (maxZ > outAABB.maxPoint.z) {\r\n outAABB.maxPoint.z = maxZ;\r\n }\r\n }\r\n private visible(\r\n ctx: ClipmapGatherContext,\r\n aabb: AABB,\r\n camera: Camera,\r\n rotation: Nullable<number>,\r\n offset: Vector2,\r\n scale: number,\r\n gridScale: number,\r\n level: number\r\n ) {\r\n if (!rotation) {\r\n tmpAABB.minPoint.set(aabb.minPoint);\r\n tmpAABB.maxPoint.set(aabb.maxPoint);\r\n } else {\r\n AABB.transform(aabb, Matrix4x4.rotationZ(rotation), tmpAABB);\r\n }\r\n const minX = (tmpAABB.minPoint.x * scale + offset.x) * gridScale;\r\n const maxX = (tmpAABB.maxPoint.x * scale + offset.x) * gridScale;\r\n const minZ = (tmpAABB.minPoint.y * scale + offset.y) * gridScale;\r\n const maxZ = (tmpAABB.maxPoint.y * scale + offset.y) * gridScale;\r\n ctx.calcAABB(ctx.userData, minX, maxX, minZ, maxZ, tmpAABB, level);\r\n if (ctx.skirt) {\r\n // Every plane except the far one. A skirted clipmap deliberately reaches\r\n // past the far plane and pins the depth of whatever lands beyond it, so\r\n // culling against that plane here would throw away exactly the tiles the\r\n // skirt is there to lead up to - leaving a gap between the last surviving\r\n // tile and the ring, with the sky showing through it.\r\n return (\r\n tmpAABB.getClipStateWithFrustumMask(camera.frustum, ALL_PLANES_EXCEPT_FAR) !== ClipState.NOT_CLIPPED\r\n );\r\n }\r\n return tmpAABB.getClipStateWithFrustum(camera.frustum) !== ClipState.NOT_CLIPPED;\r\n }\r\n calcLevelAABB(camera: Camera, minMaxWorldPos: Vector4, gridScale: number) {\r\n const mipLevels = this.calcMipLevels(camera, minMaxWorldPos, gridScale);\r\n camera.getWorldPosition(tmpV3);\r\n\r\n const snappedPos = new Vector2();\r\n const tileSize = new Vector2();\r\n const base = new Vector2();\r\n const offset = new Vector2();\r\n\r\n const posX = tmpV3.x / gridScale;\r\n const posY = tmpV3.z / gridScale;\r\n\r\n const outAABB: AABB[] = [];\r\n for (let i = 0; i < mipLevels; i++) {\r\n const aabb = new AABB();\r\n aabb.beginExtend();\r\n outAABB.push(aabb);\r\n }\r\n\r\n snappedPos.setXY(Math.floor(posX), Math.floor(posY));\r\n\r\n // cross\r\n this.updateAABB(this._crossMeshAABB, null, snappedPos, 1, gridScale, outAABB[0]);\r\n\r\n for (let l = 0; l < mipLevels; l++) {\r\n const aabb = outAABB[l];\r\n const scale = 1 << l;\r\n snappedPos.setXY(Math.floor(posX / scale) * scale, Math.floor(posY / scale) * scale);\r\n // draw tiles\r\n tileSize.setXY(this._tileResolution << l, this._tileResolution << l);\r\n base.setXY(\r\n snappedPos.x - (this._tileResolution << (l + 1)),\r\n snappedPos.y - (this._tileResolution << (l + 1))\r\n );\r\n for (let x = 0; x < 4; x++) {\r\n for (let y = 0; y < 4; y++) {\r\n if (l !== 0 && (x === 1 || x === 2) && (y === 1 || y === 2)) {\r\n continue;\r\n }\r\n const fillX = x >= 2 ? scale : 0;\r\n const fillY = y >= 2 ? scale : 0;\r\n offset.setXY(base.x + x * tileSize.x + fillX, base.y + y * tileSize.y + fillY);\r\n this.updateAABB(this._tileMeshBBox, null, offset, scale, gridScale, aabb);\r\n }\r\n }\r\n // draw filler\r\n this.updateAABB(this._fillerMeshAABB, null, snappedPos, scale, gridScale, aabb);\r\n\r\n const nextScale = scale * 2;\r\n const nextSnappedPos = new Vector2(\r\n Math.floor(posX / nextScale) * nextScale,\r\n Math.floor(posY / nextScale) * nextScale\r\n );\r\n // draw trim\r\n const tileCentre = new Vector2(snappedPos.x + scale * 0.5, snappedPos.y + scale * 0.5);\r\n const d = new Vector2(posX - nextSnappedPos.x, posY - nextSnappedPos.y);\r\n let r = 0;\r\n r |= d.x >= scale ? 0 : 2;\r\n r |= d.y >= scale ? 0 : 1;\r\n this.updateAABB(this._trimMeshAABB, rotationValues[r], tileCentre, scale, gridScale, aabb);\r\n // draw seam\r\n const nextBase = new Vector2(\r\n nextSnappedPos.x - (this._tileResolution << (l + 1)),\r\n nextSnappedPos.y - (this._tileResolution << (l + 1))\r\n );\r\n this.updateAABB(this._seamMeshAABB, null, nextBase, scale, gridScale, aabb);\r\n }\r\n return outAABB;\r\n }\r\n private calcMipLevels(camera: Camera, minMaxWorldPos: Vector4, gridScale: number, viewDistance?: number) {\r\n camera.getWorldPosition(tmpV3);\r\n const distX = Math.max(Math.abs(tmpV3.x - minMaxWorldPos.x), Math.abs(tmpV3.x - minMaxWorldPos.z));\r\n const distY = Math.max(Math.abs(tmpV3.z - minMaxWorldPos.y), Math.abs(tmpV3.z - minMaxWorldPos.w));\r\n // The reach is the caller's when it supplies one; the far plane is only the\r\n // default. An infinite water surface draws its horizon ring beyond the far\r\n // plane and clamps the depth in the vertex shader, so capping the levels\r\n // here would starve it of the very tiles it needs.\r\n const maxReach = viewDistance && viewDistance > 0 ? viewDistance : camera.getFarPlane();\r\n const maxDist = Math.min(Math.max(distX, distY), maxReach);\r\n return Math.min(\r\n Math.max(Math.ceil(Math.log2(maxDist / (this._tileResolution * gridScale))), 0) + 1,\r\n this._maxMipLevels\r\n );\r\n }\r\n private addInstance(\r\n info: PrimitiveInstanceInfo,\r\n rotation: number,\r\n offsetX: number,\r\n offsetY: number,\r\n scale: number,\r\n mipLevel: number\r\n ) {\r\n info.mipLevels[info.numInstances] = mipLevel;\r\n info.instanceDatas[info.numInstances * 4 + 0] = rotation;\r\n info.instanceDatas[info.numInstances * 4 + 1] = scale;\r\n info.instanceDatas[info.numInstances * 4 + 2] = offsetX;\r\n info.instanceDatas[info.numInstances * 4 + 3] = offsetY;\r\n info.maxMiplevel = mipLevel;\r\n info.numInstances++;\r\n }\r\n\r\n gather(context: ClipmapGatherContext) {\r\n this._instanceDataPoolSize = this._instanceDataPool.length;\r\n this._mipLevelDataPoolSize = this._mipLevelDataPool.length;\r\n this._nonInstanceDataPoolSize = this._nonInstanceDataPool.length;\r\n this._nonInstanceMipLevelDataPoolSize = this._nonInstanceMipLevelDataPool.length;\r\n const renderData: PrimitiveInstanceInfo[] = [];\r\n const mipLevels = this.calcMipLevels(\r\n context.camera,\r\n context.minMaxWorldPos,\r\n context.gridScale,\r\n context.viewDistance\r\n );\r\n context.camera.getWorldPosition(tmpV3);\r\n\r\n const snappedPos = new Vector2();\r\n const tileSize = new Vector2();\r\n const base = new Vector2();\r\n const offset = new Vector2();\r\n\r\n const posX = tmpV3.x / context.gridScale;\r\n const posY = tmpV3.z / context.gridScale;\r\n\r\n // draw cross\r\n snappedPos.setXY(Math.floor(posX), Math.floor(posY));\r\n if (\r\n !context.frustumCulling ||\r\n this.visible(context, this._crossMeshAABB, context.camera, null, snappedPos, 1, context.gridScale, 0)\r\n ) {\r\n const crossPrimitives: PrimitiveInstanceInfo = {\r\n primitive: this._wireframe ? this._crossMeshLines : this._crossMesh,\r\n numInstances: 1,\r\n instanceDatas: this.allocNonInstanceBuffer(rotationValues[0], 1, snappedPos.x, snappedPos.y),\r\n mipLevels: this.allocNonInstanceMipLevelBuffer(0),\r\n maxMiplevel: 0\r\n };\r\n renderData.push(crossPrimitives);\r\n }\r\n\r\n const tilePrimitives: PrimitiveInstanceInfo = {\r\n primitive: this._wireframe ? this._tileMeshLines : this._tileMesh,\r\n numInstances: 0,\r\n instanceDatas: this.allocInstanceBuffer(),\r\n mipLevels: this.allocMipLevelBuffer(),\r\n maxMiplevel: 0\r\n };\r\n const fillerPrimitives: PrimitiveInstanceInfo = {\r\n primitive: this._wireframe ? this._fillerMeshLines : this._fillerMesh,\r\n numInstances: 0,\r\n instanceDatas: this.allocInstanceBuffer(),\r\n mipLevels: this.allocMipLevelBuffer(),\r\n maxMiplevel: 0\r\n };\r\n const trimPrimitives: PrimitiveInstanceInfo = {\r\n primitive: this._wireframe ? this._trimMeshLines : this._trimMesh,\r\n numInstances: 0,\r\n instanceDatas: this.allocInstanceBuffer(),\r\n mipLevels: this.allocMipLevelBuffer(),\r\n maxMiplevel: 0\r\n };\r\n const seamPrimitives: PrimitiveInstanceInfo = {\r\n primitive: this._wireframe ? this._seamMeshLines : this._seamMesh,\r\n numInstances: 0,\r\n instanceDatas: this.allocInstanceBuffer(),\r\n mipLevels: this.allocMipLevelBuffer(),\r\n maxMiplevel: 0\r\n };\r\n\r\n for (let l = 0; l < mipLevels; l++) {\r\n const scale = 1 << l;\r\n snappedPos.setXY(Math.floor(posX / scale) * scale, Math.floor(posY / scale) * scale);\r\n // draw tiles\r\n tileSize.setXY(this._tileResolution << l, this._tileResolution << l);\r\n base.setXY(\r\n snappedPos.x - (this._tileResolution << (l + 1)),\r\n snappedPos.y - (this._tileResolution << (l + 1))\r\n );\r\n for (let x = 0; x < 4; x++) {\r\n for (let y = 0; y < 4; y++) {\r\n if (l !== 0 && (x === 1 || x === 2) && (y === 1 || y === 2)) {\r\n continue;\r\n }\r\n const fillX = x >= 2 ? scale : 0;\r\n const fillY = y >= 2 ? scale : 0;\r\n offset.setXY(base.x + x * tileSize.x + fillX, base.y + y * tileSize.y + fillY);\r\n if (\r\n // An unbounded surface has no rectangle to keep tiles inside of.\r\n // Passing a very large one instead does not work: the clipmap's\r\n // outermost level reaches 2 * tileResolution << (levels - 1), which\r\n // at a raised camera is tens of kilometres and outgrows any sentinel\r\n // rectangle - dropping the outer tiles and opening a band of sky\r\n // between the last one drawn and the horizon skirt.\r\n context.skirt ||\r\n (this.intervalsOverlap(\r\n offset.x * context.gridScale,\r\n (offset.x + tileSize.x) * context.gridScale,\r\n context.minMaxWorldPos.x,\r\n context.minMaxWorldPos.z\r\n ) &&\r\n this.intervalsOverlap(\r\n offset.y * context.gridScale,\r\n (offset.y + tileSize.y) * context.gridScale,\r\n context.minMaxWorldPos.y,\r\n context.minMaxWorldPos.w\r\n ))\r\n ) {\r\n if (\r\n !context.frustumCulling ||\r\n this.visible(\r\n context,\r\n this._tileMeshBBox,\r\n context.camera,\r\n null,\r\n offset,\r\n scale,\r\n context.gridScale,\r\n l\r\n )\r\n ) {\r\n this.addInstance(tilePrimitives, rotationValues[0], offset.x, offset.y, scale, l);\r\n }\r\n }\r\n }\r\n }\r\n // draw filler\r\n if (\r\n !context.frustumCulling ||\r\n this.visible(\r\n context,\r\n this._fillerMeshAABB,\r\n context.camera,\r\n null,\r\n snappedPos,\r\n scale,\r\n context.gridScale,\r\n l\r\n )\r\n ) {\r\n this.addInstance(fillerPrimitives, rotationValues[0], snappedPos.x, snappedPos.y, scale, l);\r\n }\r\n\r\n if (l !== mipLevels - 1) {\r\n const nextScale = scale * 2;\r\n const nextSnappedPos = new Vector2(\r\n Math.floor(posX / nextScale) * nextScale,\r\n Math.floor(posY / nextScale) * nextScale\r\n );\r\n // draw trim\r\n const tileCentre = new Vector2(snappedPos.x + scale * 0.5, snappedPos.y + scale * 0.5);\r\n const d = new Vector2(posX - nextSnappedPos.x, posY - nextSnappedPos.y);\r\n let r = 0;\r\n r |= d.x >= scale ? 0 : 2;\r\n r |= d.y >= scale ? 0 : 1;\r\n if (\r\n !context.frustumCulling ||\r\n this.visible(\r\n context,\r\n this._trimMeshAABB,\r\n context.camera,\r\n rotationValues[r],\r\n tileCentre,\r\n scale,\r\n context.gridScale,\r\n l\r\n )\r\n ) {\r\n this.addInstance(trimPrimitives, rotationValues[r], tileCentre.x, tileCentre.y, scale, l);\r\n }\r\n // draw seam\r\n const nextBase = new Vector2(\r\n nextSnappedPos.x - (this._tileResolution << (l + 1)),\r\n nextSnappedPos.y - (this._tileResolution << (l + 1))\r\n );\r\n if (\r\n !context.frustumCulling ||\r\n this.visible(\r\n context,\r\n this._seamMeshAABB,\r\n context.camera,\r\n null,\r\n nextBase,\r\n scale,\r\n context.gridScale,\r\n l\r\n )\r\n ) {\r\n this.addInstance(seamPrimitives, rotationValues[0], nextBase.x, nextBase.y, scale, l);\r\n }\r\n }\r\n }\r\n if (tilePrimitives.numInstances > 0) {\r\n renderData.push(tilePrimitives);\r\n }\r\n if (fillerPrimitives.numInstances > 0) {\r\n renderData.push(fillerPrimitives);\r\n }\r\n if (trimPrimitives.numInstances > 0) {\r\n renderData.push(trimPrimitives);\r\n }\r\n if (seamPrimitives.numInstances > 0) {\r\n renderData.push(seamPrimitives);\r\n }\r\n if (context.skirt) {\r\n // Welded to the outer boundary of the outermost level, so it carries that\r\n // level's scale and snapped origin. Never frustum-culled: the ring spans\r\n // the whole horizon, and its outer edge is relocated by the vertex shader,\r\n // so the AABB tested here would not describe where it actually lands.\r\n const outerLevel = mipLevels - 1;\r\n const outerScale = 1 << outerLevel;\r\n snappedPos.setXY(\r\n Math.floor(posX / outerScale) * outerScale,\r\n Math.floor(posY / outerScale) * outerScale\r\n );\r\n renderData.push({\r\n primitive: this._wireframe ? this._skirtMeshLines : this._skirtMesh,\r\n numInstances: 1,\r\n instanceDatas: this.allocNonInstanceBuffer(rotationValues[0], outerScale, snappedPos.x, snappedPos.y),\r\n mipLevels: this.allocNonInstanceMipLevelBuffer(outerLevel),\r\n maxMiplevel: outerLevel\r\n });\r\n }\r\n for (const info of renderData) {\r\n info.primitive\r\n .getVertexBuffer('texCoord0')!\r\n .bufferSubData(0, info.instanceDatas, 0, info.numInstances * 4);\r\n }\r\n return renderData;\r\n }\r\n /** Disposes the clipmap and release all meshes */\r\n protected onDispose() {\r\n super.onDispose();\r\n this._crossMesh.dispose();\r\n this._crossMeshLines.dispose();\r\n this._fillerMesh.dispose();\r\n this._fillerMeshLines.dispose();\r\n this._seamMesh.dispose();\r\n this._seamMeshLines.dispose();\r\n this._trimMesh.dispose();\r\n this._trimMeshLines.dispose();\r\n this._tileMesh.dispose();\r\n this._tileMeshLines.dispose();\r\n this._skirtMesh.dispose();\r\n this._skirtMeshLines.dispose();\r\n }\r\n}\r\n"],"names":["tmpAABB","AABB","tmpV3","Vector3","rotationValues","Math","PI","ALL_PLANES_EXCEPT_FAR","BoxSide","BACK","Clipmap","Disposable","_instanceDataPool","_instanceDataPoolSize","_mipLevelDataPool","_mipLevelDataPoolSize","_nonInstanceDataPool","_nonInstanceDataPoolSize","_nonInstanceMipLevelDataPool","_nonInstanceMipLevelDataPoolSize","_extraInstanceBuffers","_tileResolution","_maxMipLevels","_tileMesh","_tileMeshLines","_tileMeshBBox","_fillerMesh","_fillerMeshLines","_fillerMeshAABB","_trimMesh","_trimMeshLines","_trimMeshAABB","_crossMesh","_crossMeshLines","_crossMeshAABB","_seamMesh","_seamMeshLines","_seamMeshAABB","_skirtMesh","_skirtMeshLines","_wireframe","resolution","extraInstanceBuffers","maxMipLevels","findIndex","val","getVertexAttributeIndex","VERTEX_ATTRIB_POSITION","VERTEX_ATTRIB_TEXCOORD0","getVertexAttributeFormat","Error","slice","min","max","generateCrossMesh","generateFillerMesh","generateSeamMesh","generateTileMesh","generateTrimMesh","generateSkirtMesh","wireframe","tileResolution","allocInstanceBuffer","buffer","Float32Array","push","allocNonInstanceBuffer","x","y","z","w","allocMipLevelBuffer","allocNonInstanceMipLevelBuffer","patch2d","calcAABB","vertices","maxX","Number","MAX_VALUE","maxY","minX","minY","i","length","dispose","Primitive","patchVertResolution","n","indices","Uint16Array","createAndSetVertexBuffer","fmt","createAndSetIndexBuffer","indexStart","indexCount","primitiveType","indicesLines","setVertexBuffer","getVertexBuffer","offset","arm","bl","br","tl","tr","clipmapVertResolution","d","startOfHorizonal","startOfVertical","lo","hi","perSide","ringCount","outerFactor","centre","putRing","index","outer","px","py","base","k","j","intervalsOverlap","a0","a1","b0","b1","updateAABB","aabb","rotation","scale","gridScale","outAABB","minPoint","set","maxPoint","transform","Matrix4x4","rotationZ","minZ","maxZ","visible","ctx","camera","level","userData","skirt","getClipStateWithFrustumMask","frustum","ClipState","NOT_CLIPPED","getClipStateWithFrustum","calcLevelAABB","minMaxWorldPos","mipLevels","calcMipLevels","getWorldPosition","snappedPos","Vector2","tileSize","posX","posY","beginExtend","setXY","floor","l","fillX","fillY","nextScale","nextSnappedPos","tileCentre","r","nextBase","viewDistance","distX","abs","distY","maxReach","getFarPlane","maxDist","ceil","log2","addInstance","info","offsetX","offsetY","mipLevel","numInstances","instanceDatas","maxMiplevel","gather","context","renderData","frustumCulling","crossPrimitives","primitive","tilePrimitives","fillerPrimitives","trimPrimitives","seamPrimitives","outerLevel","outerScale","bufferSubData","onDispose"],"mappings":"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"}
|
|
@@ -68,6 +68,8 @@ import { RENDER_PASS_TYPE_OBJECT_COLOR, RENDER_PASS_TYPE_SHADOWMAP } from '../va
|
|
|
68
68
|
return this.visitSprite(target);
|
|
69
69
|
} else if (target.isWater()) {
|
|
70
70
|
return this.visitWater(target);
|
|
71
|
+
} else if (target.isHair()) {
|
|
72
|
+
return this.visitHair(target);
|
|
71
73
|
} else if (target.isParticleSystem()) {
|
|
72
74
|
return this.visitParticleSystem(target);
|
|
73
75
|
} else if (target.isClipmapTerrain()) {
|
|
@@ -168,11 +170,29 @@ import { RENDER_PASS_TYPE_OBJECT_COLOR, RENDER_PASS_TYPE_SHADOWMAP } from '../va
|
|
|
168
170
|
}
|
|
169
171
|
return false;
|
|
170
172
|
}
|
|
173
|
+
/**
|
|
174
|
+
* Visits a hair node.
|
|
175
|
+
*
|
|
176
|
+
* @remarks
|
|
177
|
+
* Treated like a mesh rather than like water: hair casts shadows, and the
|
|
178
|
+
* strand material has a transparent shadow caster path built for exactly that.
|
|
179
|
+
* @internal
|
|
180
|
+
*/ visitHair(node) {
|
|
181
|
+
if (!node.hidden && (node.castShadow || !this._isShadowMapping) && (node.gpuPickable || !this._isGPUPicking)) {
|
|
182
|
+
const clipState = this.getClipStateWithNode(node);
|
|
183
|
+
if (clipState !== ClipState.NOT_CLIPPED) {
|
|
184
|
+
this.push(this._camera, node);
|
|
185
|
+
return true;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
return false;
|
|
189
|
+
}
|
|
171
190
|
/** @internal */ visitWater(node) {
|
|
172
191
|
if (!node.hidden && !this._isShadowMapping && (node.gpuPickable || !this._isGPUPicking)) {
|
|
173
192
|
const clipState = this.getClipStateWithNode(node);
|
|
174
193
|
if (clipState !== ClipState.NOT_CLIPPED) {
|
|
175
194
|
this.push(this._camera, node);
|
|
195
|
+
this.renderQueue.pushWater(node);
|
|
176
196
|
return true;
|
|
177
197
|
}
|
|
178
198
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cull_visitor.js","sources":["../../src/render/cull_visitor.ts"],"sourcesContent":["import type { AABB } from '@zephyr3d/base';\r\nimport { ClipState } from '@zephyr3d/base';\r\nimport { OctreeNode } from '../scene/octree';\r\nimport { RENDER_PASS_TYPE_OBJECT_COLOR, RENDER_PASS_TYPE_SHADOWMAP } from '../values';\r\nimport type { GraphNode } from '../scene/graph_node';\r\nimport type { RenderQueue } from './render_queue';\r\nimport type { RenderPass, Drawable } from '.';\r\nimport type { Mesh } from '../scene/mesh';\r\nimport type { ClipmapTerrain } from '../scene/terrain-cm';\r\nimport type { PunctualLight } from '../scene/light';\r\nimport type { Visitor } from '../scene/visitor';\r\nimport type { Camera } from '../camera/camera';\r\nimport type { SceneNode } from '../scene/scene_node';\r\nimport type { BatchGroup } from '../scene/batchgroup';\r\nimport type { MSDFText, MSDFTextSprite, ParticleSystem, Sprite } from '../scene';\r\nimport type { Water } from '../scene/water';\r\n\r\n/**\r\n * Node visitor for culling\r\n * @public\r\n */\r\nexport class CullVisitor implements Visitor<SceneNode | OctreeNode> {\r\n /** @internal */\r\n private _camera: Camera;\r\n /** @internal */\r\n private _skipClipTest: boolean;\r\n /** @internal */\r\n private _renderQueue: RenderQueue;\r\n /** @internal */\r\n private readonly _renderPass: RenderPass;\r\n /** @internal */\r\n private readonly _isGPUPicking: boolean;\r\n /** @internal */\r\n private readonly _isShadowMapping: boolean;\r\n /**\r\n * Creates an instance of CullVisitor\r\n * @param renderPass - Render pass for the culling task\r\n * @param camera - Camera that will be used for culling\r\n * @param rendeQueue - RenderQueue\r\n * @param viewPoint - Camera position of the primary render pass\r\n */\r\n constructor(renderPass: RenderPass, camera: Camera, renderQueue: RenderQueue) {\r\n this._camera = camera;\r\n this._renderQueue = renderQueue;\r\n this._skipClipTest = false;\r\n this._renderPass = renderPass;\r\n this._isGPUPicking = this._renderPass.type === RENDER_PASS_TYPE_OBJECT_COLOR;\r\n this._isShadowMapping = this._renderPass.type === RENDER_PASS_TYPE_SHADOWMAP;\r\n }\r\n /** The camera that will be used for culling */\r\n get camera() {\r\n return this._camera;\r\n }\r\n set camera(camera: Camera) {\r\n this._camera = camera || null;\r\n }\r\n /** true if cull with frustum culling, otherwise false. default is true */\r\n get frustumCulling() {\r\n return !this._skipClipTest;\r\n }\r\n set frustumCulling(val) {\r\n this._skipClipTest = !val;\r\n }\r\n /** Render pass for the culling task */\r\n get renderPass() {\r\n return this._renderPass;\r\n }\r\n /** The result of culling */\r\n get renderQueue() {\r\n return this._renderQueue;\r\n }\r\n set renderQueue(renderQueue: RenderQueue) {\r\n this._renderQueue = renderQueue;\r\n }\r\n /** Frustum for culling */\r\n get frustum() {\r\n return this._camera?.frustum || null;\r\n }\r\n /** @internal */\r\n push(camera: Camera, drawable: Drawable) {\r\n this.renderQueue.push(camera, drawable);\r\n }\r\n /** @internal */\r\n pushRenderQueue(renderQueue: RenderQueue) {\r\n this.renderQueue.pushRenderQueue(renderQueue);\r\n }\r\n /**\r\n * Visits a node\r\n * @param target - The node to be visit\r\n */\r\n visit(target: SceneNode | OctreeNode) {\r\n if (target instanceof OctreeNode) {\r\n return this.visitOctreeNode(target);\r\n } else if (target.isMesh()) {\r\n return this.visitMesh(target);\r\n } else if (target.isSprite()) {\r\n return this.visitSprite(target);\r\n } else if (target.isWater()) {\r\n return this.visitWater(target);\r\n } else if (target.isParticleSystem()) {\r\n return this.visitParticleSystem(target);\r\n } else if (target.isClipmapTerrain()) {\r\n return this.visitClipmapTerrain(target);\r\n } else if (target.isPunctualLight()) {\r\n return this.visitPunctualLight(target);\r\n } else if (target.isBatchGroup()) {\r\n return this.visitBatchGroup(target);\r\n } else if (target.isMSDFTextSprite()) {\r\n return this.visitMSDFTextSprite(target);\r\n } else if (target.isMSDFText()) {\r\n return this.visitMSDFText(target);\r\n } else {\r\n return false;\r\n }\r\n }\r\n /** @internal */\r\n visitPunctualLight(node: PunctualLight) {\r\n if (!node.hidden) {\r\n const clipState = this.getClipStateWithNode(node);\r\n if (clipState !== ClipState.NOT_CLIPPED) {\r\n this.renderQueue.pushLight(node);\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n /** @internal */\r\n visitClipmapTerrain(node: ClipmapTerrain) {\r\n if (\r\n !node.hidden &&\r\n (node.castShadow || !this._isShadowMapping) &&\r\n (node.gpuPickable || !this._isGPUPicking)\r\n ) {\r\n const clipState = this.getClipStateWithNode(node);\r\n if (clipState !== ClipState.NOT_CLIPPED) {\r\n this.push(this._camera, node);\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n /** @internal */\r\n visitBatchGroup(node: BatchGroup) {\r\n if (!node.hidden) {\r\n const clipState = this.getClipStateWithNode(node);\r\n if (clipState !== ClipState.NOT_CLIPPED) {\r\n node.cull(this);\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n /** @internal */\r\n visitParticleSystem(node: ParticleSystem) {\r\n if (!node.hidden && !this._isShadowMapping && (node.gpuPickable || !this._isGPUPicking)) {\r\n const clipState = this.getClipStateWithNode(node);\r\n if (clipState !== ClipState.NOT_CLIPPED) {\r\n this.push(this._camera, node);\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n visitSprite(node: Sprite) {\r\n if (!node.hidden && !this._isShadowMapping && (node.gpuPickable || !this._isGPUPicking)) {\r\n const clipState = this.getClipStateWithNode(node);\r\n if (clipState !== ClipState.NOT_CLIPPED) {\r\n this.push(this._camera, node);\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n visitMSDFText(node: MSDFText) {\r\n if (\r\n !node.hidden &&\r\n (node.castShadow || !this._isShadowMapping) &&\r\n (node.gpuPickable || !this._isGPUPicking)\r\n ) {\r\n const clipState = this.getClipStateWithNode(node);\r\n if (clipState !== ClipState.NOT_CLIPPED) {\r\n for (const batch of node.batches) {\r\n this.push(this._camera, batch);\r\n }\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n visitMSDFTextSprite(node: MSDFTextSprite) {\r\n if (!node.hidden && !this._isShadowMapping && (node.gpuPickable || !this._isGPUPicking)) {\r\n const clipState = this.getClipStateWithNode(node);\r\n if (clipState !== ClipState.NOT_CLIPPED) {\r\n for (const batch of node.batches) {\r\n this.push(this._camera, batch);\r\n }\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n /** @internal */\r\n visitMesh(node: Mesh) {\r\n if (\r\n !node.hidden &&\r\n (node.castShadow || !this._isShadowMapping) &&\r\n (node.gpuPickable || !this._isGPUPicking)\r\n ) {\r\n const clipState = this.getClipStateWithNode(node);\r\n if (clipState !== ClipState.NOT_CLIPPED) {\r\n this.push(this._camera, node);\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n /** @internal */\r\n visitWater(node: Water) {\r\n if (!node.hidden && !this._isShadowMapping && (node.gpuPickable || !this._isGPUPicking)) {\r\n const clipState = this.getClipStateWithNode(node);\r\n if (clipState !== ClipState.NOT_CLIPPED) {\r\n this.push(this._camera, node);\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n /** @internal */\r\n visitOctreeNode(node: OctreeNode) {\r\n const clipState =\r\n node.getLevel() > 0 ? this.getClipStateWithAABB(node.getBoxLoosed()) : ClipState.CLIPPED;\r\n if (clipState !== ClipState.NOT_CLIPPED) {\r\n const saveSkipFlag = this._skipClipTest;\r\n this._skipClipTest = this._skipClipTest || clipState === ClipState.A_INSIDE_B;\r\n const nodes = node.getNodes();\r\n for (let i = 0; i < nodes.length; i++) {\r\n this.visit(nodes[i]);\r\n }\r\n this._skipClipTest = saveSkipFlag;\r\n return true;\r\n }\r\n return false;\r\n }\r\n /** @internal */\r\n protected getClipStateWithNode(node: GraphNode) {\r\n let clipState: ClipState;\r\n if (this._skipClipTest) {\r\n clipState = ClipState.A_INSIDE_B;\r\n } else if (!node.clipTestEnabled) {\r\n clipState = ClipState.CLIPPED;\r\n } else {\r\n const bv = node.getWorldBoundingVolume();\r\n clipState = bv ? this.getClipStateWithAABB(bv.toAABB()) : ClipState.CLIPPED;\r\n }\r\n return clipState;\r\n }\r\n /** @internal */\r\n protected getClipStateWithAABB(aabb: AABB) {\r\n return this.camera.clipMask\r\n ? aabb.getClipStateWithFrustumMask(this.frustum, this.camera.clipMask)\r\n : aabb.getClipStateWithFrustum(this.frustum);\r\n }\r\n}\r\n"],"names":["CullVisitor","renderPass","camera","renderQueue","_camera","_renderQueue","_skipClipTest","_renderPass","_isGPUPicking","type","RENDER_PASS_TYPE_OBJECT_COLOR","_isShadowMapping","RENDER_PASS_TYPE_SHADOWMAP","frustumCulling","val","frustum","push","drawable","pushRenderQueue","visit","target","OctreeNode","visitOctreeNode","isMesh","visitMesh","isSprite","visitSprite","isWater","visitWater","isParticleSystem","visitParticleSystem","isClipmapTerrain","visitClipmapTerrain","isPunctualLight","visitPunctualLight","isBatchGroup","visitBatchGroup","isMSDFTextSprite","visitMSDFTextSprite","isMSDFText","visitMSDFText","node","hidden","clipState","getClipStateWithNode","ClipState","NOT_CLIPPED","pushLight","castShadow","gpuPickable","cull","batch","batches","getLevel","getClipStateWithAABB","getBoxLoosed","CLIPPED","saveSkipFlag","A_INSIDE_B","nodes","getNodes","i","length","clipTestEnabled","bv","getWorldBoundingVolume","toAABB","aabb","clipMask","getClipStateWithFrustumMask","getClipStateWithFrustum"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cull_visitor.js","sources":["../../src/render/cull_visitor.ts"],"sourcesContent":["import type { AABB } from '@zephyr3d/base';\r\nimport { ClipState } from '@zephyr3d/base';\r\nimport { OctreeNode } from '../scene/octree';\r\nimport { RENDER_PASS_TYPE_OBJECT_COLOR, RENDER_PASS_TYPE_SHADOWMAP } from '../values';\r\nimport type { GraphNode } from '../scene/graph_node';\r\nimport type { RenderQueue } from './render_queue';\r\nimport type { RenderPass, Drawable } from '.';\r\nimport type { Mesh } from '../scene/mesh';\r\nimport type { ClipmapTerrain } from '../scene/terrain-cm';\r\nimport type { PunctualLight } from '../scene/light';\r\nimport type { Visitor } from '../scene/visitor';\r\nimport type { Camera } from '../camera/camera';\r\nimport type { SceneNode } from '../scene/scene_node';\r\nimport type { BatchGroup } from '../scene/batchgroup';\r\nimport type { MSDFText, MSDFTextSprite, ParticleSystem, Sprite } from '../scene';\r\nimport type { Water } from '../scene/water';\r\nimport type { HairNode } from '../scene/hair';\r\n\r\n/**\r\n * Node visitor for culling\r\n * @public\r\n */\r\nexport class CullVisitor implements Visitor<SceneNode | OctreeNode> {\r\n /** @internal */\r\n private _camera: Camera;\r\n /** @internal */\r\n private _skipClipTest: boolean;\r\n /** @internal */\r\n private _renderQueue: RenderQueue;\r\n /** @internal */\r\n private readonly _renderPass: RenderPass;\r\n /** @internal */\r\n private readonly _isGPUPicking: boolean;\r\n /** @internal */\r\n private readonly _isShadowMapping: boolean;\r\n /**\r\n * Creates an instance of CullVisitor\r\n * @param renderPass - Render pass for the culling task\r\n * @param camera - Camera that will be used for culling\r\n * @param rendeQueue - RenderQueue\r\n * @param viewPoint - Camera position of the primary render pass\r\n */\r\n constructor(renderPass: RenderPass, camera: Camera, renderQueue: RenderQueue) {\r\n this._camera = camera;\r\n this._renderQueue = renderQueue;\r\n this._skipClipTest = false;\r\n this._renderPass = renderPass;\r\n this._isGPUPicking = this._renderPass.type === RENDER_PASS_TYPE_OBJECT_COLOR;\r\n this._isShadowMapping = this._renderPass.type === RENDER_PASS_TYPE_SHADOWMAP;\r\n }\r\n /** The camera that will be used for culling */\r\n get camera() {\r\n return this._camera;\r\n }\r\n set camera(camera: Camera) {\r\n this._camera = camera || null;\r\n }\r\n /** true if cull with frustum culling, otherwise false. default is true */\r\n get frustumCulling() {\r\n return !this._skipClipTest;\r\n }\r\n set frustumCulling(val) {\r\n this._skipClipTest = !val;\r\n }\r\n /** Render pass for the culling task */\r\n get renderPass() {\r\n return this._renderPass;\r\n }\r\n /** The result of culling */\r\n get renderQueue() {\r\n return this._renderQueue;\r\n }\r\n set renderQueue(renderQueue: RenderQueue) {\r\n this._renderQueue = renderQueue;\r\n }\r\n /** Frustum for culling */\r\n get frustum() {\r\n return this._camera?.frustum || null;\r\n }\r\n /** @internal */\r\n push(camera: Camera, drawable: Drawable) {\r\n this.renderQueue.push(camera, drawable);\r\n }\r\n /** @internal */\r\n pushRenderQueue(renderQueue: RenderQueue) {\r\n this.renderQueue.pushRenderQueue(renderQueue);\r\n }\r\n /**\r\n * Visits a node\r\n * @param target - The node to be visit\r\n */\r\n visit(target: SceneNode | OctreeNode) {\r\n if (target instanceof OctreeNode) {\r\n return this.visitOctreeNode(target);\r\n } else if (target.isMesh()) {\r\n return this.visitMesh(target);\r\n } else if (target.isSprite()) {\r\n return this.visitSprite(target);\r\n } else if (target.isWater()) {\r\n return this.visitWater(target);\r\n } else if (target.isHair()) {\r\n return this.visitHair(target);\r\n } else if (target.isParticleSystem()) {\r\n return this.visitParticleSystem(target);\r\n } else if (target.isClipmapTerrain()) {\r\n return this.visitClipmapTerrain(target);\r\n } else if (target.isPunctualLight()) {\r\n return this.visitPunctualLight(target);\r\n } else if (target.isBatchGroup()) {\r\n return this.visitBatchGroup(target);\r\n } else if (target.isMSDFTextSprite()) {\r\n return this.visitMSDFTextSprite(target);\r\n } else if (target.isMSDFText()) {\r\n return this.visitMSDFText(target);\r\n } else {\r\n return false;\r\n }\r\n }\r\n /** @internal */\r\n visitPunctualLight(node: PunctualLight) {\r\n if (!node.hidden) {\r\n const clipState = this.getClipStateWithNode(node);\r\n if (clipState !== ClipState.NOT_CLIPPED) {\r\n this.renderQueue.pushLight(node);\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n /** @internal */\r\n visitClipmapTerrain(node: ClipmapTerrain) {\r\n if (\r\n !node.hidden &&\r\n (node.castShadow || !this._isShadowMapping) &&\r\n (node.gpuPickable || !this._isGPUPicking)\r\n ) {\r\n const clipState = this.getClipStateWithNode(node);\r\n if (clipState !== ClipState.NOT_CLIPPED) {\r\n this.push(this._camera, node);\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n /** @internal */\r\n visitBatchGroup(node: BatchGroup) {\r\n if (!node.hidden) {\r\n const clipState = this.getClipStateWithNode(node);\r\n if (clipState !== ClipState.NOT_CLIPPED) {\r\n node.cull(this);\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n /** @internal */\r\n visitParticleSystem(node: ParticleSystem) {\r\n if (!node.hidden && !this._isShadowMapping && (node.gpuPickable || !this._isGPUPicking)) {\r\n const clipState = this.getClipStateWithNode(node);\r\n if (clipState !== ClipState.NOT_CLIPPED) {\r\n this.push(this._camera, node);\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n visitSprite(node: Sprite) {\r\n if (!node.hidden && !this._isShadowMapping && (node.gpuPickable || !this._isGPUPicking)) {\r\n const clipState = this.getClipStateWithNode(node);\r\n if (clipState !== ClipState.NOT_CLIPPED) {\r\n this.push(this._camera, node);\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n visitMSDFText(node: MSDFText) {\r\n if (\r\n !node.hidden &&\r\n (node.castShadow || !this._isShadowMapping) &&\r\n (node.gpuPickable || !this._isGPUPicking)\r\n ) {\r\n const clipState = this.getClipStateWithNode(node);\r\n if (clipState !== ClipState.NOT_CLIPPED) {\r\n for (const batch of node.batches) {\r\n this.push(this._camera, batch);\r\n }\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n visitMSDFTextSprite(node: MSDFTextSprite) {\r\n if (!node.hidden && !this._isShadowMapping && (node.gpuPickable || !this._isGPUPicking)) {\r\n const clipState = this.getClipStateWithNode(node);\r\n if (clipState !== ClipState.NOT_CLIPPED) {\r\n for (const batch of node.batches) {\r\n this.push(this._camera, batch);\r\n }\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n /** @internal */\r\n visitMesh(node: Mesh) {\r\n if (\r\n !node.hidden &&\r\n (node.castShadow || !this._isShadowMapping) &&\r\n (node.gpuPickable || !this._isGPUPicking)\r\n ) {\r\n const clipState = this.getClipStateWithNode(node);\r\n if (clipState !== ClipState.NOT_CLIPPED) {\r\n this.push(this._camera, node);\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n /**\r\n * Visits a hair node.\r\n *\r\n * @remarks\r\n * Treated like a mesh rather than like water: hair casts shadows, and the\r\n * strand material has a transparent shadow caster path built for exactly that.\r\n * @internal\r\n */\r\n visitHair(node: HairNode) {\r\n if (\r\n !node.hidden &&\r\n (node.castShadow || !this._isShadowMapping) &&\r\n (node.gpuPickable || !this._isGPUPicking)\r\n ) {\r\n const clipState = this.getClipStateWithNode(node);\r\n if (clipState !== ClipState.NOT_CLIPPED) {\r\n this.push(this._camera, node);\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n /** @internal */\r\n visitWater(node: Water) {\r\n if (!node.hidden && !this._isShadowMapping && (node.gpuPickable || !this._isGPUPicking)) {\r\n const clipState = this.getClipStateWithNode(node);\r\n if (clipState !== ClipState.NOT_CLIPPED) {\r\n this.push(this._camera, node);\r\n this.renderQueue.pushWater(node);\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n /** @internal */\r\n visitOctreeNode(node: OctreeNode) {\r\n const clipState =\r\n node.getLevel() > 0 ? this.getClipStateWithAABB(node.getBoxLoosed()) : ClipState.CLIPPED;\r\n if (clipState !== ClipState.NOT_CLIPPED) {\r\n const saveSkipFlag = this._skipClipTest;\r\n this._skipClipTest = this._skipClipTest || clipState === ClipState.A_INSIDE_B;\r\n const nodes = node.getNodes();\r\n for (let i = 0; i < nodes.length; i++) {\r\n this.visit(nodes[i]);\r\n }\r\n this._skipClipTest = saveSkipFlag;\r\n return true;\r\n }\r\n return false;\r\n }\r\n /** @internal */\r\n protected getClipStateWithNode(node: GraphNode) {\r\n let clipState: ClipState;\r\n if (this._skipClipTest) {\r\n clipState = ClipState.A_INSIDE_B;\r\n } else if (!node.clipTestEnabled) {\r\n clipState = ClipState.CLIPPED;\r\n } else {\r\n const bv = node.getWorldBoundingVolume();\r\n clipState = bv ? this.getClipStateWithAABB(bv.toAABB()) : ClipState.CLIPPED;\r\n }\r\n return clipState;\r\n }\r\n /** @internal */\r\n protected getClipStateWithAABB(aabb: AABB) {\r\n return this.camera.clipMask\r\n ? aabb.getClipStateWithFrustumMask(this.frustum, this.camera.clipMask)\r\n : aabb.getClipStateWithFrustum(this.frustum);\r\n }\r\n}\r\n"],"names":["CullVisitor","renderPass","camera","renderQueue","_camera","_renderQueue","_skipClipTest","_renderPass","_isGPUPicking","type","RENDER_PASS_TYPE_OBJECT_COLOR","_isShadowMapping","RENDER_PASS_TYPE_SHADOWMAP","frustumCulling","val","frustum","push","drawable","pushRenderQueue","visit","target","OctreeNode","visitOctreeNode","isMesh","visitMesh","isSprite","visitSprite","isWater","visitWater","isHair","visitHair","isParticleSystem","visitParticleSystem","isClipmapTerrain","visitClipmapTerrain","isPunctualLight","visitPunctualLight","isBatchGroup","visitBatchGroup","isMSDFTextSprite","visitMSDFTextSprite","isMSDFText","visitMSDFText","node","hidden","clipState","getClipStateWithNode","ClipState","NOT_CLIPPED","pushLight","castShadow","gpuPickable","cull","batch","batches","pushWater","getLevel","getClipStateWithAABB","getBoxLoosed","CLIPPED","saveSkipFlag","A_INSIDE_B","nodes","getNodes","i","length","clipTestEnabled","bv","getWorldBoundingVolume","toAABB","aabb","clipMask","getClipStateWithFrustumMask","getClipStateWithFrustum"],"mappings":";;;;AAkBA;;;AAGC,IACM,MAAMA,WAAAA,CAAAA;qBAEX,OAAwB;qBAExB,aAA+B;qBAE/B,YAAkC;qBAElC,WAAyC;qBAEzC,aAAwC;qBAExC,gBAA2C;AAC3C;;;;;;AAMC,MACD,YAAYC,UAAsB,EAAEC,MAAc,EAAEC,WAAwB,CAAE;QAC5E,IAAI,CAACC,OAAO,GAAGF,MAAAA;QACf,IAAI,CAACG,YAAY,GAAGF,WAAAA;QACpB,IAAI,CAACG,aAAa,GAAG,KAAA;QACrB,IAAI,CAACC,WAAW,GAAGN,UAAAA;QACnB,IAAI,CAACO,aAAa,GAAG,IAAI,CAACD,WAAW,CAACE,IAAI,KAAKC,6BAAAA;QAC/C,IAAI,CAACC,gBAAgB,GAAG,IAAI,CAACJ,WAAW,CAACE,IAAI,KAAKG,0BAAAA;AACpD;oDAEA,IAAIV,MAAS,GAAA;QACX,OAAO,IAAI,CAACE,OAAO;AACrB;IACA,IAAIF,MAAAA,CAAOA,MAAc,EAAE;QACzB,IAAI,CAACE,OAAO,GAAGF,MAAU,IAAA,IAAA;AAC3B;+EAEA,IAAIW,cAAiB,GAAA;QACnB,OAAO,CAAC,IAAI,CAACP,aAAa;AAC5B;IACA,IAAIO,cAAAA,CAAeC,GAAG,EAAE;QACtB,IAAI,CAACR,aAAa,GAAG,CAACQ,GAAAA;AACxB;4CAEA,IAAIb,UAAa,GAAA;QACf,OAAO,IAAI,CAACM,WAAW;AACzB;iCAEA,IAAIJ,WAAc,GAAA;QAChB,OAAO,IAAI,CAACE,YAAY;AAC1B;IACA,IAAIF,WAAAA,CAAYA,WAAwB,EAAE;QACxC,IAAI,CAACE,YAAY,GAAGF,WAAAA;AACtB;+BAEA,IAAIY,OAAU,GAAA;AACZ,QAAA,OAAO,IAAI,CAACX,OAAO,EAAEW,OAAW,IAAA,IAAA;AAClC;AACA,qBACAC,IAAAA,CAAKd,MAAc,EAAEe,QAAkB,EAAE;AACvC,QAAA,IAAI,CAACd,WAAW,CAACa,IAAI,CAACd,MAAQe,EAAAA,QAAAA,CAAAA;AAChC;qBAEAC,eAAgBf,CAAAA,WAAwB,EAAE;AACxC,QAAA,IAAI,CAACA,WAAW,CAACe,eAAe,CAACf,WAAAA,CAAAA;AACnC;AACA;;;MAIAgB,KAAAA,CAAMC,MAA8B,EAAE;AACpC,QAAA,IAAIA,kBAAkBC,UAAY,EAAA;YAChC,OAAO,IAAI,CAACC,eAAe,CAACF,MAAAA,CAAAA;SACvB,MAAA,IAAIA,MAAOG,CAAAA,MAAM,EAAI,EAAA;YAC1B,OAAO,IAAI,CAACC,SAAS,CAACJ,MAAAA,CAAAA;SACjB,MAAA,IAAIA,MAAOK,CAAAA,QAAQ,EAAI,EAAA;YAC5B,OAAO,IAAI,CAACC,WAAW,CAACN,MAAAA,CAAAA;SACnB,MAAA,IAAIA,MAAOO,CAAAA,OAAO,EAAI,EAAA;YAC3B,OAAO,IAAI,CAACC,UAAU,CAACR,MAAAA,CAAAA;SAClB,MAAA,IAAIA,MAAOS,CAAAA,MAAM,EAAI,EAAA;YAC1B,OAAO,IAAI,CAACC,SAAS,CAACV,MAAAA,CAAAA;SACjB,MAAA,IAAIA,MAAOW,CAAAA,gBAAgB,EAAI,EAAA;YACpC,OAAO,IAAI,CAACC,mBAAmB,CAACZ,MAAAA,CAAAA;SAC3B,MAAA,IAAIA,MAAOa,CAAAA,gBAAgB,EAAI,EAAA;YACpC,OAAO,IAAI,CAACC,mBAAmB,CAACd,MAAAA,CAAAA;SAC3B,MAAA,IAAIA,MAAOe,CAAAA,eAAe,EAAI,EAAA;YACnC,OAAO,IAAI,CAACC,kBAAkB,CAAChB,MAAAA,CAAAA;SAC1B,MAAA,IAAIA,MAAOiB,CAAAA,YAAY,EAAI,EAAA;YAChC,OAAO,IAAI,CAACC,eAAe,CAAClB,MAAAA,CAAAA;SACvB,MAAA,IAAIA,MAAOmB,CAAAA,gBAAgB,EAAI,EAAA;YACpC,OAAO,IAAI,CAACC,mBAAmB,CAACpB,MAAAA,CAAAA;SAC3B,MAAA,IAAIA,MAAOqB,CAAAA,UAAU,EAAI,EAAA;YAC9B,OAAO,IAAI,CAACC,aAAa,CAACtB,MAAAA,CAAAA;SACrB,MAAA;YACL,OAAO,KAAA;AACT;AACF;qBAEAgB,kBAAmBO,CAAAA,IAAmB,EAAE;QACtC,IAAI,CAACA,IAAKC,CAAAA,MAAM,EAAE;AAChB,YAAA,MAAMC,SAAY,GAAA,IAAI,CAACC,oBAAoB,CAACH,IAAAA,CAAAA;YAC5C,IAAIE,SAAAA,KAAcE,SAAUC,CAAAA,WAAW,EAAE;AACvC,gBAAA,IAAI,CAAC7C,WAAW,CAAC8C,SAAS,CAACN,IAAAA,CAAAA;gBAC3B,OAAO,IAAA;AACT;AACF;QACA,OAAO,KAAA;AACT;qBAEAT,mBAAoBS,CAAAA,IAAoB,EAAE;QACxC,IACE,CAACA,KAAKC,MAAM,KACXD,IAAKO,CAAAA,UAAU,IAAI,CAAC,IAAI,CAACvC,gBAAgB,CAAD,KACxCgC,IAAAA,CAAKQ,WAAW,IAAI,CAAC,IAAI,CAAC3C,aAAY,CACvC,EAAA;AACA,YAAA,MAAMqC,SAAY,GAAA,IAAI,CAACC,oBAAoB,CAACH,IAAAA,CAAAA;YAC5C,IAAIE,SAAAA,KAAcE,SAAUC,CAAAA,WAAW,EAAE;AACvC,gBAAA,IAAI,CAAChC,IAAI,CAAC,IAAI,CAACZ,OAAO,EAAEuC,IAAAA,CAAAA;gBACxB,OAAO,IAAA;AACT;AACF;QACA,OAAO,KAAA;AACT;qBAEAL,eAAgBK,CAAAA,IAAgB,EAAE;QAChC,IAAI,CAACA,IAAKC,CAAAA,MAAM,EAAE;AAChB,YAAA,MAAMC,SAAY,GAAA,IAAI,CAACC,oBAAoB,CAACH,IAAAA,CAAAA;YAC5C,IAAIE,SAAAA,KAAcE,SAAUC,CAAAA,WAAW,EAAE;gBACvCL,IAAKS,CAAAA,IAAI,CAAC,IAAI,CAAA;gBACd,OAAO,IAAA;AACT;AACF;QACA,OAAO,KAAA;AACT;qBAEApB,mBAAoBW,CAAAA,IAAoB,EAAE;AACxC,QAAA,IAAI,CAACA,IAAKC,CAAAA,MAAM,IAAI,CAAC,IAAI,CAACjC,gBAAgB,KAAKgC,IAAAA,CAAKQ,WAAW,IAAI,CAAC,IAAI,CAAC3C,aAAa,CAAG,EAAA;AACvF,YAAA,MAAMqC,SAAY,GAAA,IAAI,CAACC,oBAAoB,CAACH,IAAAA,CAAAA;YAC5C,IAAIE,SAAAA,KAAcE,SAAUC,CAAAA,WAAW,EAAE;AACvC,gBAAA,IAAI,CAAChC,IAAI,CAAC,IAAI,CAACZ,OAAO,EAAEuC,IAAAA,CAAAA;gBACxB,OAAO,IAAA;AACT;AACF;QACA,OAAO,KAAA;AACT;AACAjB,IAAAA,WAAAA,CAAYiB,IAAY,EAAE;AACxB,QAAA,IAAI,CAACA,IAAKC,CAAAA,MAAM,IAAI,CAAC,IAAI,CAACjC,gBAAgB,KAAKgC,IAAAA,CAAKQ,WAAW,IAAI,CAAC,IAAI,CAAC3C,aAAa,CAAG,EAAA;AACvF,YAAA,MAAMqC,SAAY,GAAA,IAAI,CAACC,oBAAoB,CAACH,IAAAA,CAAAA;YAC5C,IAAIE,SAAAA,KAAcE,SAAUC,CAAAA,WAAW,EAAE;AACvC,gBAAA,IAAI,CAAChC,IAAI,CAAC,IAAI,CAACZ,OAAO,EAAEuC,IAAAA,CAAAA;gBACxB,OAAO,IAAA;AACT;AACF;QACA,OAAO,KAAA;AACT;AACAD,IAAAA,aAAAA,CAAcC,IAAc,EAAE;QAC5B,IACE,CAACA,KAAKC,MAAM,KACXD,IAAKO,CAAAA,UAAU,IAAI,CAAC,IAAI,CAACvC,gBAAgB,CAAD,KACxCgC,IAAAA,CAAKQ,WAAW,IAAI,CAAC,IAAI,CAAC3C,aAAY,CACvC,EAAA;AACA,YAAA,MAAMqC,SAAY,GAAA,IAAI,CAACC,oBAAoB,CAACH,IAAAA,CAAAA;YAC5C,IAAIE,SAAAA,KAAcE,SAAUC,CAAAA,WAAW,EAAE;AACvC,gBAAA,KAAK,MAAMK,KAAAA,IAASV,IAAKW,CAAAA,OAAO,CAAE;AAChC,oBAAA,IAAI,CAACtC,IAAI,CAAC,IAAI,CAACZ,OAAO,EAAEiD,KAAAA,CAAAA;AAC1B;gBACA,OAAO,IAAA;AACT;AACF;QACA,OAAO,KAAA;AACT;AACAb,IAAAA,mBAAAA,CAAoBG,IAAoB,EAAE;AACxC,QAAA,IAAI,CAACA,IAAKC,CAAAA,MAAM,IAAI,CAAC,IAAI,CAACjC,gBAAgB,KAAKgC,IAAAA,CAAKQ,WAAW,IAAI,CAAC,IAAI,CAAC3C,aAAa,CAAG,EAAA;AACvF,YAAA,MAAMqC,SAAY,GAAA,IAAI,CAACC,oBAAoB,CAACH,IAAAA,CAAAA;YAC5C,IAAIE,SAAAA,KAAcE,SAAUC,CAAAA,WAAW,EAAE;AACvC,gBAAA,KAAK,MAAMK,KAAAA,IAASV,IAAKW,CAAAA,OAAO,CAAE;AAChC,oBAAA,IAAI,CAACtC,IAAI,CAAC,IAAI,CAACZ,OAAO,EAAEiD,KAAAA,CAAAA;AAC1B;gBACA,OAAO,IAAA;AACT;AACF;QACA,OAAO,KAAA;AACT;qBAEA7B,SAAUmB,CAAAA,IAAU,EAAE;QACpB,IACE,CAACA,KAAKC,MAAM,KACXD,IAAKO,CAAAA,UAAU,IAAI,CAAC,IAAI,CAACvC,gBAAgB,CAAD,KACxCgC,IAAAA,CAAKQ,WAAW,IAAI,CAAC,IAAI,CAAC3C,aAAY,CACvC,EAAA;AACA,YAAA,MAAMqC,SAAY,GAAA,IAAI,CAACC,oBAAoB,CAACH,IAAAA,CAAAA;YAC5C,IAAIE,SAAAA,KAAcE,SAAUC,CAAAA,WAAW,EAAE;AACvC,gBAAA,IAAI,CAAChC,IAAI,CAAC,IAAI,CAACZ,OAAO,EAAEuC,IAAAA,CAAAA;gBACxB,OAAO,IAAA;AACT;AACF;QACA,OAAO,KAAA;AACT;AACA;;;;;;;MAQAb,SAAAA,CAAUa,IAAc,EAAE;QACxB,IACE,CAACA,KAAKC,MAAM,KACXD,IAAKO,CAAAA,UAAU,IAAI,CAAC,IAAI,CAACvC,gBAAgB,CAAD,KACxCgC,IAAAA,CAAKQ,WAAW,IAAI,CAAC,IAAI,CAAC3C,aAAY,CACvC,EAAA;AACA,YAAA,MAAMqC,SAAY,GAAA,IAAI,CAACC,oBAAoB,CAACH,IAAAA,CAAAA;YAC5C,IAAIE,SAAAA,KAAcE,SAAUC,CAAAA,WAAW,EAAE;AACvC,gBAAA,IAAI,CAAChC,IAAI,CAAC,IAAI,CAACZ,OAAO,EAAEuC,IAAAA,CAAAA;gBACxB,OAAO,IAAA;AACT;AACF;QACA,OAAO,KAAA;AACT;qBAEAf,UAAWe,CAAAA,IAAW,EAAE;AACtB,QAAA,IAAI,CAACA,IAAKC,CAAAA,MAAM,IAAI,CAAC,IAAI,CAACjC,gBAAgB,KAAKgC,IAAAA,CAAKQ,WAAW,IAAI,CAAC,IAAI,CAAC3C,aAAa,CAAG,EAAA;AACvF,YAAA,MAAMqC,SAAY,GAAA,IAAI,CAACC,oBAAoB,CAACH,IAAAA,CAAAA;YAC5C,IAAIE,SAAAA,KAAcE,SAAUC,CAAAA,WAAW,EAAE;AACvC,gBAAA,IAAI,CAAChC,IAAI,CAAC,IAAI,CAACZ,OAAO,EAAEuC,IAAAA,CAAAA;AACxB,gBAAA,IAAI,CAACxC,WAAW,CAACoD,SAAS,CAACZ,IAAAA,CAAAA;gBAC3B,OAAO,IAAA;AACT;AACF;QACA,OAAO,KAAA;AACT;qBAEArB,eAAgBqB,CAAAA,IAAgB,EAAE;AAChC,QAAA,MAAME,SACJF,GAAAA,IAAAA,CAAKa,QAAQ,EAAA,GAAK,CAAI,GAAA,IAAI,CAACC,oBAAoB,CAACd,IAAAA,CAAKe,YAAY,EAAA,CAAA,GAAMX,UAAUY,OAAO;QAC1F,IAAId,SAAAA,KAAcE,SAAUC,CAAAA,WAAW,EAAE;YACvC,MAAMY,YAAAA,GAAe,IAAI,CAACtD,aAAa;YACvC,IAAI,CAACA,aAAa,GAAG,IAAI,CAACA,aAAa,IAAIuC,SAAcE,KAAAA,SAAAA,CAAUc,UAAU;YAC7E,MAAMC,KAAAA,GAAQnB,KAAKoB,QAAQ,EAAA;AAC3B,YAAA,IAAK,IAAIC,CAAI,GAAA,CAAA,EAAGA,IAAIF,KAAMG,CAAAA,MAAM,EAAED,CAAK,EAAA,CAAA;AACrC,gBAAA,IAAI,CAAC7C,KAAK,CAAC2C,KAAK,CAACE,CAAE,CAAA,CAAA;AACrB;YACA,IAAI,CAAC1D,aAAa,GAAGsD,YAAAA;YACrB,OAAO,IAAA;AACT;QACA,OAAO,KAAA;AACT;AACA,qBACUd,oBAAqBH,CAAAA,IAAe,EAAE;QAC9C,IAAIE,SAAAA;QACJ,IAAI,IAAI,CAACvC,aAAa,EAAE;AACtBuC,YAAAA,SAAAA,GAAYE,UAAUc,UAAU;AAClC,SAAA,MAAO,IAAI,CAAClB,IAAKuB,CAAAA,eAAe,EAAE;AAChCrB,YAAAA,SAAAA,GAAYE,UAAUY,OAAO;SACxB,MAAA;YACL,MAAMQ,EAAAA,GAAKxB,KAAKyB,sBAAsB,EAAA;YACtCvB,SAAYsB,GAAAA,EAAAA,GAAK,IAAI,CAACV,oBAAoB,CAACU,EAAGE,CAAAA,MAAM,EAAMtB,CAAAA,GAAAA,SAAAA,CAAUY,OAAO;AAC7E;QACA,OAAOd,SAAAA;AACT;AACA,qBACUY,oBAAqBa,CAAAA,IAAU,EAAE;QACzC,OAAO,IAAI,CAACpE,MAAM,CAACqE,QAAQ,GACvBD,IAAKE,CAAAA,2BAA2B,CAAC,IAAI,CAACzD,OAAO,EAAE,IAAI,CAACb,MAAM,CAACqE,QAAQ,CAAA,GACnED,KAAKG,uBAAuB,CAAC,IAAI,CAAC1D,OAAO,CAAA;AAC/C;AACF;;;;"}
|