@zephyr3d/scene 0.9.23 → 0.9.25
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/index.d.ts +53 -50
- package/dist/index.js +2 -2
- package/dist/material/shader/helper.js +5 -2
- package/dist/material/shader/helper.js.map +1 -1
- package/dist/render/cluster_light.js +6 -6
- package/dist/render/cluster_light.js.map +1 -1
- package/dist/render/sky.js +123 -123
- package/dist/render/sky.js.map +1 -1
- package/dist/scene/terrain-cm/grass.js +270 -249
- package/dist/scene/terrain-cm/grass.js.map +1 -1
- package/dist/shaders/atmosphere.js.map +1 -1
- package/dist/shaders/shadow.js +54 -12
- package/dist/shaders/shadow.js.map +1 -1
- package/dist/shadow/esm.js +5 -5
- package/dist/shadow/esm.js.map +1 -1
- package/dist/shadow/pcss.js +6 -5
- package/dist/shadow/pcss.js.map +1 -1
- package/dist/shadow/shadow_impl.js +12 -4
- package/dist/shadow/shadow_impl.js.map +1 -1
- package/dist/utility/serialization/scene/terrain.js +88 -69
- package/dist/utility/serialization/scene/terrain.js.map +1 -1
- package/dist/values.js +2 -7
- package/dist/values.js.map +1 -1
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grass.js","sources":["../../../src/scene/terrain-cm/grass.ts"],"sourcesContent":["import type { IndexBuffer, StructuredBuffer, Texture2D } from '@zephyr3d/device';\r\nimport type { Nullable, Vector4 } from '@zephyr3d/base';\r\nimport { AABB, ClipState, nextPowerOf2, DRef, DWeakRef, Disposable } from '@zephyr3d/base';\r\nimport type { DrawContext } from '../../render';\r\nimport { Primitive } from '../../render';\r\nimport { ClipmapGrassMaterial } from './grassmaterial';\r\nimport type { ClipmapTerrain } from './terrain-cm';\r\nimport type { Camera } from '../../camera';\r\nimport { getDevice } from '../../app/api';\r\n\r\nconst MAX_INSTANCES_PER_NODE = 2048;\r\n\r\n/**\r\n * Grass blade instance information\r\n * @public\r\n */\r\nexport type GrassInstanceInfo = {\r\n /** x position of the blade */\r\n x: number;\r\n /** y position of the blade */\r\n y: number;\r\n /** Rotation angle of the blade */\r\n angle: number;\r\n};\r\nconst INSTANCE_BYTES = 4 * 4;\r\n\r\n/**\r\n * Grass glade instance manager class\r\n * @internal\r\n */\r\nexport class GrassInstances extends Disposable {\r\n private readonly _instances: GrassInstanceInfo[];\r\n private readonly _baseVertexBuffer: DRef<StructuredBuffer>;\r\n private readonly _indexBuffer: DRef<IndexBuffer>;\r\n private readonly _instanceBuffer: DRef<StructuredBuffer>;\r\n private readonly _primitive: DRef<Primitive>;\r\n constructor(baseVertexBuffer: StructuredBuffer, indexBuffer: IndexBuffer) {\r\n super();\r\n this._instances = [];\r\n this._baseVertexBuffer = new DRef(baseVertexBuffer);\r\n this._indexBuffer = new DRef(indexBuffer);\r\n this._instanceBuffer = new DRef();\r\n this._primitive = new DRef();\r\n }\r\n get numInstances() {\r\n return this._instances.length;\r\n }\r\n get instanceBuffer() {\r\n return this._instanceBuffer.get()!;\r\n }\r\n setBaseVertexBuffer(baseVertexBuffer: StructuredBuffer) {\r\n if (baseVertexBuffer !== this._baseVertexBuffer.get()) {\r\n this._baseVertexBuffer.set(baseVertexBuffer);\r\n this._primitive.dispose();\r\n }\r\n }\r\n draw() {\r\n if (this._instances.length > 0) {\r\n if (!this._primitive.get()) {\r\n const primitive = new Primitive();\r\n primitive.setVertexBuffer(this._baseVertexBuffer.get()!);\r\n primitive.setVertexBuffer(this._instanceBuffer.get()!, 'instance');\r\n primitive.setIndexBuffer(this._indexBuffer.get());\r\n primitive.primitiveType = 'triangle-list';\r\n primitive.indexStart = 0;\r\n primitive.indexCount = this._indexBuffer.get()!.length;\r\n this._primitive.set(primitive);\r\n }\r\n this._primitive.get()!.drawInstanced(this._instances.length);\r\n }\r\n }\r\n updateBuffers() {\r\n const device = getDevice();\r\n if (this._instances.length === 0) {\r\n this._instanceBuffer.set(null);\r\n return;\r\n }\r\n if (this._instances.length > 0 && !this._instanceBuffer.get()) {\r\n this._instanceBuffer.set(\r\n device.createVertexBuffer('tex1_f32x4', new Uint8Array(this._instances.length * INSTANCE_BYTES))\r\n );\r\n }\r\n let buffer = this._instanceBuffer.get()!;\r\n const currentBytes = buffer.byteLength;\r\n const bytesRequired = this._instances.length * INSTANCE_BYTES;\r\n if (currentBytes < bytesRequired) {\r\n buffer = device.createVertexBuffer('tex1_f32x4', new Uint8Array(nextPowerOf2(bytesRequired)))!;\r\n this._instanceBuffer.set(buffer);\r\n this._primitive.dispose();\r\n }\r\n const data = new Float32Array(4 * this._instances.length);\r\n for (let i = 0; i < this._instances.length; i++) {\r\n data[i * 4 + 0] = this._instances[i].x;\r\n data[i * 4 + 1] = this._instances[i].y;\r\n data[i * 4 + 2] = Math.sin(this._instances[i].angle);\r\n data[i * 4 + 3] = Math.cos(this._instances[i].angle);\r\n }\r\n buffer.bufferSubData(0, data);\r\n }\r\n removeInstances(minX: number, minZ: number, maxX: number, maxZ: number, num: number) {\r\n if (num <= 0) {\r\n return 0;\r\n }\r\n let removed = 0;\r\n for (let i = this._instances.length - 1; i >= 0; i--) {\r\n const instance = this._instances[i];\r\n if (instance.x >= minX && instance.x <= maxX && instance.y >= minZ && instance.y <= maxZ) {\r\n this._instances.splice(i, 1);\r\n removed++;\r\n if (removed === num) {\r\n break;\r\n }\r\n }\r\n }\r\n if (removed > 0) {\r\n this.updateBuffers();\r\n }\r\n return removed;\r\n }\r\n addInstances(instances: GrassInstanceInfo[]) {\r\n this._instances.push(...instances);\r\n this.updateBuffers();\r\n }\r\n protected onDispose() {\r\n super.onDispose();\r\n this._baseVertexBuffer.dispose();\r\n this._indexBuffer.dispose();\r\n this._instanceBuffer.dispose();\r\n this._primitive.dispose();\r\n }\r\n}\r\n\r\n/**\r\n * Grass layer class\r\n * @public\r\n */\r\nexport class GrassLayer extends Disposable {\r\n private static readonly _indexBuffer: DRef<IndexBuffer> = new DRef();\r\n private readonly _material: DRef<ClipmapGrassMaterial>;\r\n private readonly _quadtree: DRef<GrassQuadtreeNode>;\r\n private _bladeWidth: number;\r\n private _bladeHeight: number;\r\n private readonly _baseVertexBuffer: DRef<StructuredBuffer>;\r\n /**\r\n * Creates an instance of GrassLayer\r\n * @param terrain - Clipmap terrain object\r\n * @param bladeWidth - Grass blade width\r\n * @param bladeHeight - Grass blade height\r\n * @param albedoMap - Albedo texture for the blade\r\n */\r\n constructor(terrain: ClipmapTerrain, bladeWidth: number, bladeHeight: number, albedoMap?: Texture2D) {\r\n super();\r\n this._material = new DRef(new ClipmapGrassMaterial(terrain));\r\n this._material.get()!.albedoTexture = albedoMap ?? null;\r\n if (albedoMap) {\r\n this._material.get()!.setTextureSize(albedoMap.width, albedoMap.height);\r\n }\r\n this._bladeWidth = bladeWidth;\r\n this._bladeHeight = bladeHeight;\r\n this._baseVertexBuffer = new DRef(this.createBaseVertexBuffer(this._bladeWidth, this._bladeHeight));\r\n this._quadtree = new DRef(\r\n new GrassQuadtreeNode(this._baseVertexBuffer.get()!, GrassLayer._getIndexBuffer()!)\r\n );\r\n }\r\n /** @internal */\r\n get quadtree() {\r\n return this._quadtree.get();\r\n }\r\n /** @internal */\r\n updateMaterial() {\r\n this._material.get()!.uniformChanged();\r\n }\r\n /**\r\n * Sets the albedo texture of grass blades in this layer\r\n * @param albedoMap - Albedo texture to set\r\n */\r\n setAlbedoMap(albedoMap: Texture2D) {\r\n this._material.get()!.albedoTexture = albedoMap;\r\n if (albedoMap) {\r\n this._material.get()!.setTextureSize(albedoMap.width, albedoMap.height);\r\n }\r\n }\r\n /**\r\n * Gets the albedo texture of grass blades in this layer\r\n * @returns - Albedo texture of grass blades in this layer\r\n */\r\n getAlbedoMap() {\r\n return this._material.get()!.albedoTexture;\r\n }\r\n /**\r\n * Add grass blades to this layer in a region\r\n * @param instances - Grass blade instances to add\r\n */\r\n addInstances(instances: GrassInstanceInfo[]) {\r\n return this._quadtree.get()!.addInstances(instances);\r\n }\r\n /**\r\n * Remove grass blades to this layer in a region\r\n * @param minX - Minimum x position of the region\r\n * @param minZ - Minimum z position of the region\r\n * @param maxX - Maximum x position of the region\r\n * @param maxZ - Maximum z position of the region\r\n * @param numInstances - How many grass blades to add\r\n */\r\n removeInstances(minX: number, minZ: number, maxX: number, maxZ: number, numInstances: number) {\r\n this._quadtree.get()!.removeInstances(minX, minZ, maxX, maxZ, numInstances);\r\n }\r\n /** Grass blade width in this layer */\r\n get bladeWidth() {\r\n return this._bladeWidth;\r\n }\r\n set bladeWidth(val: number) {\r\n this.setBladeSize(val, this._bladeHeight);\r\n }\r\n /** Grass blade height in this layer */\r\n get bladeHeight() {\r\n return this._bladeHeight;\r\n }\r\n set bladeHeight(val: number) {\r\n this.setBladeSize(this._bladeWidth, val);\r\n }\r\n /**\r\n * Sets the size of grass blades in this layer\r\n * @param width - Grass blade width\r\n * @param height - Grass blade height\r\n */\r\n setBladeSize(width: number, height: number) {\r\n if (width !== this._bladeWidth || height !== this._bladeHeight) {\r\n this._bladeWidth = width;\r\n this._bladeHeight = height;\r\n this._baseVertexBuffer.set(this.createBaseVertexBuffer(this._bladeWidth, this._bladeHeight));\r\n this._quadtree.get()!.setBaseVertexBuffer(this._baseVertexBuffer.get()!);\r\n }\r\n }\r\n /** @internal */\r\n private static _getIndexBuffer() {\r\n if (!this._indexBuffer.get()) {\r\n this._indexBuffer.set(\r\n getDevice().createIndexBuffer(\r\n new Uint16Array([0, 1, 2, 0, 2, 3, 4, 5, 6, 4, 6, 7, 8, 9, 10, 8, 10, 11])\r\n )\r\n );\r\n }\r\n return this._indexBuffer.get();\r\n }\r\n /** @internal */\r\n private createBaseVertexBuffer(bladeWidth: number, bladeHeight: number) {\r\n const device = getDevice();\r\n const r = bladeWidth * 0.5;\r\n const t = bladeHeight;\r\n const c = r * Math.cos(Math.PI / 3);\r\n const s = r * Math.sin(Math.PI / 3);\r\n const vertices = new Float32Array([\r\n r,\r\n 0,\r\n 0,\r\n 0,\r\n 1,\r\n r,\r\n t,\r\n 0,\r\n 0,\r\n 0,\r\n -r,\r\n t,\r\n 0,\r\n 1,\r\n 0,\r\n -r,\r\n 0,\r\n 0,\r\n 1,\r\n 1,\r\n\r\n c,\r\n 0,\r\n s,\r\n 0,\r\n 1,\r\n -c,\r\n 0,\r\n -s,\r\n 1,\r\n 1,\r\n -c,\r\n t,\r\n -s,\r\n 1,\r\n 0,\r\n c,\r\n t,\r\n s,\r\n 0,\r\n 0,\r\n\r\n -c,\r\n 0,\r\n s,\r\n 0,\r\n 1,\r\n c,\r\n 0,\r\n -s,\r\n 1,\r\n 1,\r\n c,\r\n t,\r\n -s,\r\n 1,\r\n 0,\r\n -c,\r\n t,\r\n s,\r\n 0,\r\n 0\r\n ]);\r\n return device.createInterleavedVertexBuffer(['position_f32x3', 'tex0_f32x2'], vertices);\r\n }\r\n /** @internal */\r\n draw(ctx: DrawContext, region: Vector4, minY: number, maxY: number) {\r\n this._material.get()!.apply(ctx);\r\n for (let pass = 0; pass < this._material.get()!.numPasses; pass++) {\r\n this._material.get()!.bind(ctx.device, pass);\r\n this._quadtree.get()!.draw(ctx.camera, region, minY, maxY, false);\r\n }\r\n }\r\n /** @internal */\r\n protected onDispose() {\r\n super.onDispose();\r\n this._material.dispose();\r\n this._quadtree.dispose();\r\n this._baseVertexBuffer.dispose();\r\n }\r\n}\r\n/**\r\n * Grass renderer for clipmap terrain\r\n * @public\r\n */\r\nexport class GrassRenderer extends Disposable {\r\n private readonly _terrain: DWeakRef<ClipmapTerrain>;\r\n private _numGrassBlades: number;\r\n private _layers: GrassLayer[];\r\n /**\r\n * Creates an instance of GrassRenderer\r\n * @param terrain - Clipmap terrain object\r\n */\r\n constructor(terrain: ClipmapTerrain) {\r\n super();\r\n this._terrain = new DWeakRef(terrain);\r\n this._numGrassBlades = 0;\r\n this._layers = [];\r\n }\r\n /** @internal */\r\n updateMaterial() {\r\n for (const layer of this._layers) {\r\n layer.updateMaterial();\r\n }\r\n }\r\n /** How many grass blades */\r\n get numGrassBlades() {\r\n return this._numGrassBlades;\r\n }\r\n /** How many grass layers */\r\n get numLayers() {\r\n return this._layers.length;\r\n }\r\n /**\r\n * Gets the grass layer at given index\r\n * @param index - Index of the grass layer\r\n * @returns The grass layer at the index\r\n */\r\n getLayer(index: number) {\r\n return this._layers[index];\r\n }\r\n /**\r\n * Adds a grass layer\r\n * @param bladeWidth - Width of grass blades in this layer\r\n * @param bladeHeight - Height of grass blades in this layer\r\n * @param albedoMap - Albedo texture of grass blades in this layer\r\n * @returns Index of the added grass layer\r\n */\r\n addLayer(bladeWidth: number, bladeHeight: number, albedoMap?: Texture2D) {\r\n const layer = new GrassLayer(this._terrain.get()!, bladeWidth, bladeHeight, albedoMap);\r\n this._layers.push(layer);\r\n return this._layers.length - 1;\r\n }\r\n /**\r\n * Gets the albedo texture of grass blades in the grass layer at given index\r\n * @param layer - Index of the grass layer to get\r\n * @returns Albedo texture of grass blades in the grass layer\r\n */\r\n getGrassTexture(layer: number) {\r\n return this._layers[layer]?.getAlbedoMap() ?? null;\r\n }\r\n /**\r\n * Sets the albedo texture of grass blades in the grass layer at given index\r\n * @param layer - Index of the grass layer to set\r\n * @param texture - Albedo texture to set\r\n */\r\n setGrassTexture(layer: number, texture: Texture2D) {\r\n const grassLayer = this._layers[layer];\r\n if (grassLayer) {\r\n grassLayer.setAlbedoMap(texture);\r\n } else {\r\n console.error(`Invalid grass layer: ${layer}`);\r\n }\r\n }\r\n /**\r\n * Gets width of the grass blades in the grass layer at given index\r\n * @param layer - Index of the grass layer\r\n * @returns Width of the grass blades in the layer\r\n */\r\n getBladeWidth(layer: number) {\r\n return this._layers[layer]?.bladeWidth ?? 0;\r\n }\r\n /**\r\n * Gets height of the grass blades in the grass layer at given index\r\n * @param layer - Index of the grass layer\r\n * @returns Height of the grass blades in the layer\r\n */\r\n getBladeHeight(layer: number) {\r\n return this._layers[layer]?.bladeHeight ?? 0;\r\n }\r\n /**\r\n * Sets size of the grass blades in the grass layer at given index\r\n * @param layer - Index of the grass layer\r\n * @param width - Width to set\r\n * @param height - Height to set\r\n */\r\n setBladeSize(layer: number, width: number, height: number) {\r\n const grassLayer = this._layers[layer];\r\n if (grassLayer) {\r\n grassLayer.setBladeSize(width, height);\r\n } else {\r\n console.error(`Invalid grass layer: ${layer}`);\r\n }\r\n }\r\n /**\r\n * Add grass instances to the grass layer at given index\r\n * @param layer - Index of the grass layer\r\n * @param instances - Grass blade instances to add\r\n */\r\n addInstances(layer: number, instances: GrassInstanceInfo[]) {\r\n const grassLayer = this._layers[layer];\r\n if (!grassLayer) {\r\n console.error(`Invalid grass layer: ${layer}`);\r\n } else {\r\n this._numGrassBlades += grassLayer.addInstances(instances);\r\n }\r\n }\r\n /**\r\n * Remove grass instances from the grass layer at given index within a region\r\n * @param layer - Index of the grass layer\r\n * @param minX - Minimum x of the region\r\n * @param minZ - Minimum z of the region\r\n * @param maxX - Maximum x of the region\r\n * @param maxZ - Maximum z of the region\r\n * @param num - How many grass blades to remove\r\n */\r\n removeInstances(layer: number, minX: number, minZ: number, maxX: number, maxZ: number, num: number) {\r\n const grassLayer = this._layers[layer];\r\n if (!grassLayer) {\r\n console.error(`Invalid grass layer: ${layer}`);\r\n } else {\r\n grassLayer.removeInstances(minX, minZ, maxX, maxZ, num);\r\n }\r\n }\r\n /** @internal */\r\n draw(ctx: DrawContext) {\r\n const bv = this._terrain.get()!.getWorldBoundingVolume()!.toAABB();\r\n const minY = bv.minPoint.y;\r\n const maxY = bv.maxPoint.y;\r\n for (const layer of this._layers) {\r\n layer.draw(ctx, this._terrain.get()!.worldRegion, minY - layer.bladeHeight, maxY + layer.bladeHeight);\r\n }\r\n }\r\n protected onDispose() {\r\n super.onDispose();\r\n this._terrain.dispose();\r\n for (const layer of this._layers) {\r\n layer.dispose();\r\n }\r\n }\r\n}\r\n\r\n/** @internal */\r\nexport class GrassQuadtreeNode extends Disposable {\r\n private static readonly _cullAABB = new AABB();\r\n private readonly _grassInstances: DRef<GrassInstances>;\r\n private _children: Nullable<GrassQuadtreeNode[]>;\r\n private readonly _baseVertexBuffer: DRef<StructuredBuffer>;\r\n private readonly _indexBuffer: DRef<IndexBuffer>;\r\n private _minX: number;\r\n private _minZ: number;\r\n private _maxX: number;\r\n private _maxZ: number;\r\n constructor(baseVertexBuffer: StructuredBuffer, indexBuffer: IndexBuffer) {\r\n super();\r\n this._baseVertexBuffer = new DRef(baseVertexBuffer);\r\n this._indexBuffer = new DRef(indexBuffer);\r\n this._grassInstances = new DRef(new GrassInstances(baseVertexBuffer, indexBuffer));\r\n this._children = null;\r\n this._minX = 0;\r\n this._minZ = 0;\r\n this._maxX = 1;\r\n this._maxZ = 1;\r\n }\r\n get grassInstances() {\r\n return this._grassInstances.get();\r\n }\r\n get children() {\r\n return this._children;\r\n }\r\n draw(camera: Camera, region: Vector4, minY: number, maxY: number, skipClipTest: boolean) {\r\n if (!skipClipTest) {\r\n const cullAABB = GrassQuadtreeNode._cullAABB;\r\n const x = region.x;\r\n const z = region.y;\r\n const dx = region.z - x;\r\n const dz = region.w - z;\r\n cullAABB.minPoint.setXYZ(x + this._minX * dx, minY, z + this._minZ * dz);\r\n cullAABB.maxPoint.setXYZ(x + this._maxX * dx, maxY, z + this._maxZ * dz);\r\n const clipState = camera.clipMask\r\n ? cullAABB.getClipStateWithFrustumMask(camera.frustum, camera.clipMask)\r\n : cullAABB.getClipStateWithFrustum(camera.frustum);\r\n if (clipState === ClipState.NOT_CLIPPED) {\r\n return;\r\n }\r\n skipClipTest = clipState === ClipState.A_INSIDE_B;\r\n }\r\n if (this._grassInstances.get()!.numInstances > 0) {\r\n this._grassInstances.get()!.draw();\r\n }\r\n if (this._children) {\r\n for (const child of this._children) {\r\n child.draw(camera, region, minY, maxY, skipClipTest);\r\n }\r\n }\r\n }\r\n setBaseVertexBuffer(baseVertexBuffer: StructuredBuffer) {\r\n if (baseVertexBuffer !== this._baseVertexBuffer.get()) {\r\n this._baseVertexBuffer.set(baseVertexBuffer);\r\n this._grassInstances.get()!.setBaseVertexBuffer(baseVertexBuffer);\r\n if (this._children) {\r\n for (const child of this._children) {\r\n child.setBaseVertexBuffer(baseVertexBuffer);\r\n }\r\n }\r\n }\r\n }\r\n removeInstances(minX: number, minZ: number, maxX: number, maxZ: number, numInstances: number) {\r\n let n = Math.min(this._grassInstances.get()!.numInstances, numInstances);\r\n if (n <= 0) {\r\n return 0;\r\n }\r\n let removed = 0;\r\n if (this._children) {\r\n for (const child of this._children) {\r\n if (child._minX < maxX && child._minZ < maxZ && child._maxX > minX && child._maxZ > minZ) {\r\n removed += child.removeInstances(minX, minZ, maxX, maxZ, n);\r\n n -= removed;\r\n }\r\n }\r\n }\r\n if (n > 0) {\r\n removed += this._grassInstances.get()!.removeInstances(minX, minZ, maxX, maxZ, n);\r\n }\r\n return removed;\r\n }\r\n addInstances(instances: GrassInstanceInfo[]) {\r\n if (instances.length === 0) {\r\n return 0;\r\n }\r\n let n = Math.min(instances.length, MAX_INSTANCES_PER_NODE - this._grassInstances.get()!.numInstances);\r\n this._grassInstances.get()!.addInstances(instances.slice(0, n));\r\n if (n < instances.length) {\r\n if (!this._children) {\r\n this._children = [\r\n new GrassQuadtreeNode(this._baseVertexBuffer.get()!, this._indexBuffer.get()!),\r\n new GrassQuadtreeNode(this._baseVertexBuffer.get()!, this._indexBuffer.get()!),\r\n new GrassQuadtreeNode(this._baseVertexBuffer.get()!, this._indexBuffer.get()!),\r\n new GrassQuadtreeNode(this._baseVertexBuffer.get()!, this._indexBuffer.get()!)\r\n ];\r\n this._children[0]._minX = this._minX;\r\n this._children[0]._minZ = this._minZ;\r\n this._children[0]._maxX = (this._minX + this._maxX) * 0.5;\r\n this._children[0]._maxZ = (this._minZ + this._maxZ) * 0.5;\r\n this._children[1]._minX = this._children[0]._maxX;\r\n this._children[1]._minZ = this._minZ;\r\n this._children[1]._maxX = this._maxX;\r\n this._children[1]._maxZ = this._children[0]._maxZ;\r\n this._children[2]._minX = this._minX;\r\n this._children[2]._minZ = this._children[0]._maxZ;\r\n this._children[2]._maxX = this._children[0]._maxX;\r\n this._children[2]._maxZ = this._maxZ;\r\n this._children[3]._minX = this._children[0]._maxX;\r\n this._children[3]._minZ = this._children[0]._maxZ;\r\n this._children[3]._maxX = this._maxX;\r\n this._children[3]._maxZ = this._maxZ;\r\n }\r\n instances = instances.slice(n);\r\n for (const child of this._children) {\r\n if (instances.length > 0) {\r\n const childInstances = instances.filter(\r\n (val) =>\r\n val.x >= child._minX && val.y >= child._minZ && val.x < child._maxX && val.y < child._maxZ\r\n );\r\n n += child.addInstances(childInstances);\r\n instances = instances.filter(\r\n (val) =>\r\n !(val.x >= child._minX && val.y >= child._minZ && val.x < child._maxX && val.y < child._maxZ)\r\n );\r\n }\r\n }\r\n }\r\n return n;\r\n }\r\n protected onDispose() {\r\n super.onDispose();\r\n this._baseVertexBuffer.dispose();\r\n this._indexBuffer.dispose();\r\n this._grassInstances.dispose();\r\n if (this._children) {\r\n for (const child of this._children) {\r\n child.dispose();\r\n }\r\n }\r\n }\r\n}\r\n"],"names":["MAX_INSTANCES_PER_NODE","INSTANCE_BYTES","GrassInstances","Disposable","_instances","_baseVertexBuffer","_indexBuffer","_instanceBuffer","_primitive","baseVertexBuffer","indexBuffer","DRef","numInstances","length","instanceBuffer","get","setBaseVertexBuffer","set","dispose","draw","primitive","Primitive","setVertexBuffer","setIndexBuffer","primitiveType","indexStart","indexCount","drawInstanced","updateBuffers","device","getDevice","createVertexBuffer","Uint8Array","buffer","currentBytes","byteLength","bytesRequired","nextPowerOf2","data","Float32Array","i","x","y","Math","sin","angle","cos","bufferSubData","removeInstances","minX","minZ","maxX","maxZ","num","removed","instance","splice","addInstances","instances","push","onDispose","GrassLayer","_material","_quadtree","_bladeWidth","_bladeHeight","terrain","bladeWidth","bladeHeight","albedoMap","ClipmapGrassMaterial","albedoTexture","setTextureSize","width","height","createBaseVertexBuffer","GrassQuadtreeNode","_getIndexBuffer","quadtree","updateMaterial","uniformChanged","setAlbedoMap","getAlbedoMap","val","setBladeSize","createIndexBuffer","Uint16Array","r","t","c","PI","s","vertices","createInterleavedVertexBuffer","ctx","region","minY","maxY","apply","pass","numPasses","bind","camera","GrassRenderer","_terrain","_numGrassBlades","_layers","DWeakRef","layer","numGrassBlades","numLayers","getLayer","index","addLayer","getGrassTexture","setGrassTexture","texture","grassLayer","console","error","getBladeWidth","getBladeHeight","bv","getWorldBoundingVolume","toAABB","minPoint","maxPoint","worldRegion","_cullAABB","AABB","_grassInstances","_children","_minX","_minZ","_maxX","_maxZ","grassInstances","children","skipClipTest","cullAABB","z","dx","dz","w","setXYZ","clipState","clipMask","getClipStateWithFrustumMask","frustum","getClipStateWithFrustum","ClipState","NOT_CLIPPED","A_INSIDE_B","child","n","min","slice","childInstances","filter"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"grass.js","sources":["../../../src/scene/terrain-cm/grass.ts"],"sourcesContent":["import type { IndexBuffer, StructuredBuffer, Texture2D } from '@zephyr3d/device';\r\nimport type { Vector4 } from '@zephyr3d/base';\r\nimport { AABB, ClipState, nextPowerOf2, DRef, DWeakRef, Disposable } from '@zephyr3d/base';\r\nimport type { DrawContext } from '../../render';\r\nimport { Primitive } from '../../render';\r\nimport { ClipmapGrassMaterial } from './grassmaterial';\r\nimport type { ClipmapTerrain } from './terrain-cm';\r\nimport { getDevice } from '../../app/api';\r\n\r\nconst INSTANCE_BYTES = 4 * 4;\r\n/** Number of placement cells along each axis of a grass tile */\r\nconst TILE_CELLS = 64;\r\n/** Default number of placement cells per density map texel along each axis */\r\nconst DEFAULT_CELLS_PER_TEXEL = 2;\r\nconst MAX_CELLS_PER_TEXEL = 8;\r\n\r\n/**\r\n * Deterministic 2D integer hash, returns a value in [0, 1).\r\n * Grass placement derives everything (jitter, survival threshold, rotation)\r\n * from this hash so that blade positions are stable across edits and reloads.\r\n */\r\nfunction hashCell(x: number, z: number, seed: number): number {\r\n let h = (Math.imul(x, 0x27d4eb2d) ^ Math.imul(z, 0x165667b1) ^ Math.imul(seed, 0x9e3779b9)) | 0;\r\n h = Math.imul(h ^ (h >>> 15), 0x85ebca6b);\r\n h = Math.imul(h ^ (h >>> 13), 0xc2b2ae35);\r\n h ^= h >>> 16;\r\n return (h >>> 0) / 4294967296;\r\n}\r\n\r\n/**\r\n * Grass blade instance buffer for a single tile\r\n * @internal\r\n */\r\nexport class GrassInstances extends Disposable {\r\n private _numInstances: number;\r\n private readonly _baseVertexBuffer: DRef<StructuredBuffer>;\r\n private readonly _indexBuffer: DRef<IndexBuffer>;\r\n private readonly _instanceBuffer: DRef<StructuredBuffer>;\r\n private readonly _primitive: DRef<Primitive>;\r\n constructor(baseVertexBuffer: StructuredBuffer, indexBuffer: IndexBuffer) {\r\n super();\r\n this._numInstances = 0;\r\n this._baseVertexBuffer = new DRef(baseVertexBuffer);\r\n this._indexBuffer = new DRef(indexBuffer);\r\n this._instanceBuffer = new DRef();\r\n this._primitive = new DRef();\r\n }\r\n get numInstances() {\r\n return this._numInstances;\r\n }\r\n setBaseVertexBuffer(baseVertexBuffer: StructuredBuffer) {\r\n if (baseVertexBuffer !== this._baseVertexBuffer.get()) {\r\n this._baseVertexBuffer.set(baseVertexBuffer);\r\n this._primitive.dispose();\r\n }\r\n }\r\n /**\r\n * Sets the packed instance data (x, y, sin, cos per instance)\r\n */\r\n setData(data: Float32Array<ArrayBuffer>, count: number) {\r\n this._numInstances = count;\r\n if (count === 0) {\r\n return;\r\n }\r\n const device = getDevice();\r\n const bytesRequired = count * INSTANCE_BYTES;\r\n let buffer = this._instanceBuffer.get();\r\n if (!buffer || buffer.byteLength < bytesRequired) {\r\n buffer = device.createVertexBuffer('tex1_f32x4', new Uint8Array(nextPowerOf2(bytesRequired)))!;\r\n this._instanceBuffer.set(buffer);\r\n this._primitive.dispose();\r\n }\r\n buffer.bufferSubData(0, data.subarray(0, count * 4));\r\n }\r\n draw() {\r\n if (this._numInstances > 0) {\r\n if (!this._primitive.get()) {\r\n const primitive = new Primitive();\r\n primitive.setVertexBuffer(this._baseVertexBuffer.get()!);\r\n primitive.setVertexBuffer(this._instanceBuffer.get()!, 'instance');\r\n primitive.setIndexBuffer(this._indexBuffer.get());\r\n primitive.primitiveType = 'triangle-list';\r\n primitive.indexStart = 0;\r\n primitive.indexCount = this._indexBuffer.get()!.length;\r\n this._primitive.set(primitive);\r\n }\r\n this._primitive.get()!.drawInstanced(this._numInstances);\r\n }\r\n }\r\n protected onDispose() {\r\n super.onDispose();\r\n this._baseVertexBuffer.dispose();\r\n this._indexBuffer.dispose();\r\n this._instanceBuffer.dispose();\r\n this._primitive.dispose();\r\n }\r\n}\r\n\r\n/**\r\n * Grass layer class\r\n *\r\n * @public\r\n */\r\nexport class GrassLayer extends Disposable {\r\n private static readonly _indexBuffer: DRef<IndexBuffer> = new DRef();\r\n private static readonly _cullAABB = new AABB();\r\n private static readonly _visibleTiles: GrassInstances[] = [];\r\n private static readonly _instanceData = new Float32Array(TILE_CELLS * TILE_CELLS * 4);\r\n private readonly _material: DRef<ClipmapGrassMaterial>;\r\n private readonly _seed: number;\r\n private _bladeWidth: number;\r\n private _bladeHeight: number;\r\n private readonly _baseVertexBuffer: DRef<StructuredBuffer>;\r\n private _densityWidth: number;\r\n private _densityHeight: number;\r\n private _cellsPerTexel: number;\r\n private _densityMap: Uint8Array;\r\n private readonly _tiles: Map<number, GrassInstances>;\r\n private _tilesX: number;\r\n private _tilesZ: number;\r\n private _numBlades: number;\r\n /**\r\n * Creates an instance of GrassLayer\r\n * @param terrain - Clipmap terrain object\r\n * @param seed - Seed for deterministic blade placement, usually the layer index\r\n * @param bladeWidth - Grass blade width\r\n * @param bladeHeight - Grass blade height\r\n * @param albedoMap - Albedo texture for the blade\r\n */\r\n constructor(\r\n terrain: ClipmapTerrain,\r\n seed: number,\r\n bladeWidth: number,\r\n bladeHeight: number,\r\n albedoMap?: Texture2D\r\n ) {\r\n super();\r\n this._material = new DRef(new ClipmapGrassMaterial(terrain));\r\n this._material.get()!.albedoTexture = albedoMap ?? null;\r\n if (albedoMap) {\r\n this._material.get()!.setTextureSize(albedoMap.width, albedoMap.height);\r\n }\r\n this._seed = seed;\r\n this._bladeWidth = bladeWidth;\r\n this._bladeHeight = bladeHeight;\r\n this._baseVertexBuffer = new DRef(this.createBaseVertexBuffer(this._bladeWidth, this._bladeHeight));\r\n this._densityWidth = Math.max(1, terrain.sizeX);\r\n this._densityHeight = Math.max(1, terrain.sizeZ);\r\n this._cellsPerTexel = DEFAULT_CELLS_PER_TEXEL;\r\n this._densityMap = new Uint8Array(this._densityWidth * this._densityHeight);\r\n this._tiles = new Map();\r\n this._tilesX = 0;\r\n this._tilesZ = 0;\r\n this._numBlades = 0;\r\n this.updateTileGrid();\r\n }\r\n /** @internal */\r\n updateMaterial() {\r\n this._material.get()!.uniformChanged();\r\n }\r\n /**\r\n * Sets the albedo texture of grass blades in this layer\r\n * @param albedoMap - Albedo texture to set\r\n */\r\n setAlbedoMap(albedoMap: Texture2D) {\r\n this._material.get()!.albedoTexture = albedoMap;\r\n if (albedoMap) {\r\n this._material.get()!.setTextureSize(albedoMap.width, albedoMap.height);\r\n }\r\n }\r\n /**\r\n * Gets the albedo texture of grass blades in this layer\r\n * @returns - Albedo texture of grass blades in this layer\r\n */\r\n getAlbedoMap() {\r\n return this._material.get()!.albedoTexture;\r\n }\r\n /** How many grass blades are currently generated in this layer */\r\n get numBlades() {\r\n return this._numBlades;\r\n }\r\n /**\r\n * Density map of this layer, one byte per texel (0 = no grass, 255 = full density).\r\n * Texel (x, z) covers the normalized terrain region [x/w..(x+1)/w, z/h..(z+1)/h].\r\n * After modifying the data, call {@link GrassLayer.updateDensityRegion} to\r\n * regenerate the affected blade instances.\r\n */\r\n get densityMap() {\r\n return this._densityMap;\r\n }\r\n /** Width of the density map in texels */\r\n get densityMapWidth() {\r\n return this._densityWidth;\r\n }\r\n /** Height of the density map in texels */\r\n get densityMapHeight() {\r\n return this._densityHeight;\r\n }\r\n /**\r\n * Number of placement cells per density map texel along each axis.\r\n * The maximum blade count per texel is the square of this value.\r\n */\r\n get cellsPerTexel() {\r\n return this._cellsPerTexel;\r\n }\r\n set cellsPerTexel(val: number) {\r\n val = Math.max(1, Math.min(MAX_CELLS_PER_TEXEL, val | 0));\r\n if (val !== this._cellsPerTexel) {\r\n this._cellsPerTexel = val;\r\n this.rebuild();\r\n }\r\n }\r\n /**\r\n * Replaces the density map and regenerates all blade instances\r\n * @param width - Density map width in texels\r\n * @param height - Density map height in texels\r\n * @param cellsPerTexel - Placement cells per texel along each axis\r\n * @param data - Density data, one byte per texel\r\n */\r\n setDensityData(width: number, height: number, cellsPerTexel: number, data: Uint8Array) {\r\n if (width < 1 || height < 1 || width * height !== data.length) {\r\n console.error('Invalid grass density data');\r\n return;\r\n }\r\n this._densityWidth = width;\r\n this._densityHeight = height;\r\n this._cellsPerTexel = Math.max(1, Math.min(MAX_CELLS_PER_TEXEL, cellsPerTexel | 0));\r\n this._densityMap = data;\r\n this.rebuild();\r\n }\r\n /**\r\n * Regenerates blade instances for all tiles overlapping a density map region\r\n * @param minTexelX - Minimum x texel of the region (inclusive)\r\n * @param minTexelZ - Minimum z texel of the region (inclusive)\r\n * @param maxTexelX - Maximum x texel of the region (exclusive)\r\n * @param maxTexelZ - Maximum z texel of the region (exclusive)\r\n */\r\n updateDensityRegion(minTexelX: number, minTexelZ: number, maxTexelX: number, maxTexelZ: number) {\r\n const k = this._cellsPerTexel;\r\n // expand by one texel to cover the bilinear sampling footprint\r\n const cx0 = Math.max(0, (minTexelX - 1) * k);\r\n const cz0 = Math.max(0, (minTexelZ - 1) * k);\r\n const cx1 = Math.min(this._densityWidth * k, (maxTexelX + 1) * k);\r\n const cz1 = Math.min(this._densityHeight * k, (maxTexelZ + 1) * k);\r\n if (cx1 <= cx0 || cz1 <= cz0) {\r\n return;\r\n }\r\n const tx0 = Math.floor(cx0 / TILE_CELLS);\r\n const tz0 = Math.floor(cz0 / TILE_CELLS);\r\n const tx1 = Math.min(this._tilesX, Math.ceil(cx1 / TILE_CELLS));\r\n const tz1 = Math.min(this._tilesZ, Math.ceil(cz1 / TILE_CELLS));\r\n for (let tz = tz0; tz < tz1; tz++) {\r\n for (let tx = tx0; tx < tx1; tx++) {\r\n this.generateTile(tx, tz);\r\n }\r\n }\r\n }\r\n /**\r\n * Regenerates blade instances for the entire layer\r\n */\r\n rebuild() {\r\n for (const tile of this._tiles.values()) {\r\n tile.dispose();\r\n }\r\n this._tiles.clear();\r\n this._numBlades = 0;\r\n this.updateTileGrid();\r\n for (let tz = 0; tz < this._tilesZ; tz++) {\r\n for (let tx = 0; tx < this._tilesX; tx++) {\r\n this.generateTile(tx, tz);\r\n }\r\n }\r\n }\r\n /** Grass blade width in this layer */\r\n get bladeWidth() {\r\n return this._bladeWidth;\r\n }\r\n set bladeWidth(val: number) {\r\n this.setBladeSize(val, this._bladeHeight);\r\n }\r\n /** Grass blade height in this layer */\r\n get bladeHeight() {\r\n return this._bladeHeight;\r\n }\r\n set bladeHeight(val: number) {\r\n this.setBladeSize(this._bladeWidth, val);\r\n }\r\n /**\r\n * Sets the size of grass blades in this layer\r\n * @param width - Grass blade width\r\n * @param height - Grass blade height\r\n */\r\n setBladeSize(width: number, height: number) {\r\n if (width !== this._bladeWidth || height !== this._bladeHeight) {\r\n this._bladeWidth = width;\r\n this._bladeHeight = height;\r\n this._baseVertexBuffer.set(this.createBaseVertexBuffer(this._bladeWidth, this._bladeHeight));\r\n for (const tile of this._tiles.values()) {\r\n tile.setBaseVertexBuffer(this._baseVertexBuffer.get()!);\r\n }\r\n }\r\n }\r\n /** @internal */\r\n private updateTileGrid() {\r\n this._tilesX = Math.ceil((this._densityWidth * this._cellsPerTexel) / TILE_CELLS);\r\n this._tilesZ = Math.ceil((this._densityHeight * this._cellsPerTexel) / TILE_CELLS);\r\n }\r\n /** @internal */\r\n private sampleDensity(u: number, v: number): number {\r\n const w = this._densityWidth;\r\n const h = this._densityHeight;\r\n const x = u * w - 0.5;\r\n const z = v * h - 0.5;\r\n const ix = Math.floor(x);\r\n const iz = Math.floor(z);\r\n const fx = x - ix;\r\n const fz = z - iz;\r\n const x0 = Math.min(Math.max(ix, 0), w - 1);\r\n const x1 = Math.min(Math.max(ix + 1, 0), w - 1);\r\n const z0 = Math.min(Math.max(iz, 0), h - 1);\r\n const z1 = Math.min(Math.max(iz + 1, 0), h - 1);\r\n const d = this._densityMap;\r\n const a = d[z0 * w + x0] + (d[z0 * w + x1] - d[z0 * w + x0]) * fx;\r\n const b = d[z1 * w + x0] + (d[z1 * w + x1] - d[z1 * w + x0]) * fx;\r\n return (a + (b - a) * fz) * (1 / 255);\r\n }\r\n /** @internal */\r\n private regionIsEmpty(cx0: number, cz0: number, cx1: number, cz1: number): boolean {\r\n const k = this._cellsPerTexel;\r\n const x0 = Math.max(0, Math.floor(cx0 / k) - 1);\r\n const z0 = Math.max(0, Math.floor(cz0 / k) - 1);\r\n const x1 = Math.min(this._densityWidth, Math.ceil(cx1 / k) + 1);\r\n const z1 = Math.min(this._densityHeight, Math.ceil(cz1 / k) + 1);\r\n for (let z = z0; z < z1; z++) {\r\n const rowBase = z * this._densityWidth;\r\n for (let x = x0; x < x1; x++) {\r\n if (this._densityMap[rowBase + x] !== 0) {\r\n return false;\r\n }\r\n }\r\n }\r\n return true;\r\n }\r\n /** @internal */\r\n private generateTile(tx: number, tz: number) {\r\n const k = this._cellsPerTexel;\r\n const cw = this._densityWidth * k;\r\n const ch = this._densityHeight * k;\r\n const cx0 = tx * TILE_CELLS;\r\n const cz0 = tz * TILE_CELLS;\r\n const cx1 = Math.min(cx0 + TILE_CELLS, cw);\r\n const cz1 = Math.min(cz0 + TILE_CELLS, ch);\r\n const key = tz * this._tilesX + tx;\r\n let tile = this._tiles.get(key);\r\n // fast path: nothing to generate if there is no tile yet and no density\r\n if (!tile && this.regionIsEmpty(cx0, cz0, cx1, cz1)) {\r\n return;\r\n }\r\n const data = GrassLayer._instanceData;\r\n const seed = this._seed * 4;\r\n let count = 0;\r\n for (let cz = cz0; cz < cz1; cz++) {\r\n for (let cx = cx0; cx < cx1; cx++) {\r\n const u = (cx + hashCell(cx, cz, seed)) / cw;\r\n const v = (cz + hashCell(cx, cz, seed + 1)) / ch;\r\n if (this.sampleDensity(u, v) > hashCell(cx, cz, seed + 2)) {\r\n const angle = hashCell(cx, cz, seed + 3) * Math.PI * 2;\r\n data[count * 4 + 0] = u;\r\n data[count * 4 + 1] = v;\r\n data[count * 4 + 2] = Math.sin(angle);\r\n data[count * 4 + 3] = Math.cos(angle);\r\n count++;\r\n }\r\n }\r\n }\r\n this._numBlades += count - (tile?.numInstances ?? 0);\r\n if (count === 0) {\r\n if (tile) {\r\n tile.dispose();\r\n this._tiles.delete(key);\r\n }\r\n } else {\r\n if (!tile) {\r\n tile = new GrassInstances(this._baseVertexBuffer.get()!, GrassLayer._getIndexBuffer()!);\r\n this._tiles.set(key, tile);\r\n }\r\n tile.setData(data, count);\r\n }\r\n }\r\n /** @internal */\r\n private static _getIndexBuffer() {\r\n if (!this._indexBuffer.get()) {\r\n this._indexBuffer.set(\r\n getDevice().createIndexBuffer(\r\n new Uint16Array([0, 1, 2, 0, 2, 3, 4, 5, 6, 4, 6, 7, 8, 9, 10, 8, 10, 11])\r\n )\r\n );\r\n }\r\n return this._indexBuffer.get();\r\n }\r\n /** @internal */\r\n private createBaseVertexBuffer(bladeWidth: number, bladeHeight: number) {\r\n const device = getDevice();\r\n const r = bladeWidth * 0.5;\r\n const t = bladeHeight;\r\n const c = r * Math.cos(Math.PI / 3);\r\n const s = r * Math.sin(Math.PI / 3);\r\n const vertices = new Float32Array([\r\n r,\r\n 0,\r\n 0,\r\n 0,\r\n 1,\r\n r,\r\n t,\r\n 0,\r\n 0,\r\n 0,\r\n -r,\r\n t,\r\n 0,\r\n 1,\r\n 0,\r\n -r,\r\n 0,\r\n 0,\r\n 1,\r\n 1,\r\n\r\n c,\r\n 0,\r\n s,\r\n 0,\r\n 1,\r\n -c,\r\n 0,\r\n -s,\r\n 1,\r\n 1,\r\n -c,\r\n t,\r\n -s,\r\n 1,\r\n 0,\r\n c,\r\n t,\r\n s,\r\n 0,\r\n 0,\r\n\r\n -c,\r\n 0,\r\n s,\r\n 0,\r\n 1,\r\n c,\r\n 0,\r\n -s,\r\n 1,\r\n 1,\r\n c,\r\n t,\r\n -s,\r\n 1,\r\n 0,\r\n -c,\r\n t,\r\n s,\r\n 0,\r\n 0\r\n ]);\r\n return device.createInterleavedVertexBuffer(['position_f32x3', 'tex0_f32x2'], vertices);\r\n }\r\n /** @internal */\r\n draw(ctx: DrawContext, region: Vector4, minY: number, maxY: number) {\r\n const visible = GrassLayer._visibleTiles;\r\n visible.length = 0;\r\n const camera = ctx.camera;\r\n const cullAABB = GrassLayer._cullAABB;\r\n const cellsW = this._densityWidth * this._cellsPerTexel;\r\n const cellsH = this._densityHeight * this._cellsPerTexel;\r\n const rx = region.x;\r\n const rz = region.y;\r\n const rw = region.z - region.x;\r\n const rh = region.w - region.y;\r\n for (const [key, tile] of this._tiles) {\r\n const tx = key % this._tilesX;\r\n const tz = (key - tx) / this._tilesX;\r\n const u0 = (tx * TILE_CELLS) / cellsW;\r\n const v0 = (tz * TILE_CELLS) / cellsH;\r\n const u1 = Math.min(1, ((tx + 1) * TILE_CELLS) / cellsW);\r\n const v1 = Math.min(1, ((tz + 1) * TILE_CELLS) / cellsH);\r\n cullAABB.minPoint.setXYZ(rx + u0 * rw, minY, rz + v0 * rh);\r\n cullAABB.maxPoint.setXYZ(rx + u1 * rw, maxY, rz + v1 * rh);\r\n const clipState = camera.clipMask\r\n ? cullAABB.getClipStateWithFrustumMask(camera.frustum, camera.clipMask)\r\n : cullAABB.getClipStateWithFrustum(camera.frustum);\r\n if (clipState !== ClipState.NOT_CLIPPED) {\r\n visible.push(tile);\r\n }\r\n }\r\n if (visible.length === 0) {\r\n return;\r\n }\r\n this._material.get()!.apply(ctx);\r\n for (let pass = 0; pass < this._material.get()!.numPasses; pass++) {\r\n this._material.get()!.bind(ctx.device, pass);\r\n for (const tile of visible) {\r\n tile.draw();\r\n }\r\n }\r\n visible.length = 0;\r\n }\r\n /** @internal */\r\n protected onDispose() {\r\n super.onDispose();\r\n this._material.dispose();\r\n for (const tile of this._tiles.values()) {\r\n tile.dispose();\r\n }\r\n this._tiles.clear();\r\n this._baseVertexBuffer.dispose();\r\n }\r\n}\r\n/**\r\n * Grass renderer for clipmap terrain\r\n * @public\r\n */\r\nexport class GrassRenderer extends Disposable {\r\n private readonly _terrain: DWeakRef<ClipmapTerrain>;\r\n private _layers: GrassLayer[];\r\n /**\r\n * Creates an instance of GrassRenderer\r\n * @param terrain - Clipmap terrain object\r\n */\r\n constructor(terrain: ClipmapTerrain) {\r\n super();\r\n this._terrain = new DWeakRef(terrain);\r\n this._layers = [];\r\n }\r\n /** @internal */\r\n updateMaterial() {\r\n for (const layer of this._layers) {\r\n layer.updateMaterial();\r\n }\r\n }\r\n /** How many grass blades */\r\n get numGrassBlades() {\r\n return this._layers.reduce((sum, layer) => sum + layer.numBlades, 0);\r\n }\r\n /** How many grass layers */\r\n get numLayers() {\r\n return this._layers.length;\r\n }\r\n /**\r\n * Gets the grass layer at given index\r\n * @param index - Index of the grass layer\r\n * @returns The grass layer at the index\r\n */\r\n getLayer(index: number) {\r\n return this._layers[index];\r\n }\r\n /**\r\n * Adds a grass layer\r\n * @param bladeWidth - Width of grass blades in this layer\r\n * @param bladeHeight - Height of grass blades in this layer\r\n * @param albedoMap - Albedo texture of grass blades in this layer\r\n * @returns Index of the added grass layer\r\n */\r\n addLayer(bladeWidth: number, bladeHeight: number, albedoMap?: Texture2D) {\r\n const layer = new GrassLayer(\r\n this._terrain.get()!,\r\n this._layers.length,\r\n bladeWidth,\r\n bladeHeight,\r\n albedoMap\r\n );\r\n this._layers.push(layer);\r\n return this._layers.length - 1;\r\n }\r\n /**\r\n * Gets the albedo texture of grass blades in the grass layer at given index\r\n * @param layer - Index of the grass layer to get\r\n * @returns Albedo texture of grass blades in the grass layer\r\n */\r\n getGrassTexture(layer: number) {\r\n return this._layers[layer]?.getAlbedoMap() ?? null;\r\n }\r\n /**\r\n * Sets the albedo texture of grass blades in the grass layer at given index\r\n * @param layer - Index of the grass layer to set\r\n * @param texture - Albedo texture to set\r\n */\r\n setGrassTexture(layer: number, texture: Texture2D) {\r\n const grassLayer = this._layers[layer];\r\n if (grassLayer) {\r\n grassLayer.setAlbedoMap(texture);\r\n } else {\r\n console.error(`Invalid grass layer: ${layer}`);\r\n }\r\n }\r\n /**\r\n * Gets width of the grass blades in the grass layer at given index\r\n * @param layer - Index of the grass layer\r\n * @returns Width of the grass blades in the layer\r\n */\r\n getBladeWidth(layer: number) {\r\n return this._layers[layer]?.bladeWidth ?? 0;\r\n }\r\n /**\r\n * Gets height of the grass blades in the grass layer at given index\r\n * @param layer - Index of the grass layer\r\n * @returns Height of the grass blades in the layer\r\n */\r\n getBladeHeight(layer: number) {\r\n return this._layers[layer]?.bladeHeight ?? 0;\r\n }\r\n /**\r\n * Sets size of the grass blades in the grass layer at given index\r\n * @param layer - Index of the grass layer\r\n * @param width - Width to set\r\n * @param height - Height to set\r\n */\r\n setBladeSize(layer: number, width: number, height: number) {\r\n const grassLayer = this._layers[layer];\r\n if (grassLayer) {\r\n grassLayer.setBladeSize(width, height);\r\n } else {\r\n console.error(`Invalid grass layer: ${layer}`);\r\n }\r\n }\r\n /** @internal */\r\n draw(ctx: DrawContext) {\r\n const bv = this._terrain.get()!.getWorldBoundingVolume()!.toAABB();\r\n const minY = bv.minPoint.y;\r\n const maxY = bv.maxPoint.y;\r\n for (const layer of this._layers) {\r\n layer.draw(ctx, this._terrain.get()!.worldRegion, minY - layer.bladeHeight, maxY + layer.bladeHeight);\r\n }\r\n }\r\n protected onDispose() {\r\n super.onDispose();\r\n this._terrain.dispose();\r\n for (const layer of this._layers) {\r\n layer.dispose();\r\n }\r\n }\r\n}\r\n"],"names":["INSTANCE_BYTES","TILE_CELLS","DEFAULT_CELLS_PER_TEXEL","MAX_CELLS_PER_TEXEL","hashCell","x","z","seed","h","Math","imul","GrassInstances","Disposable","_numInstances","_baseVertexBuffer","_indexBuffer","_instanceBuffer","_primitive","baseVertexBuffer","indexBuffer","DRef","numInstances","setBaseVertexBuffer","get","set","dispose","setData","data","count","device","getDevice","bytesRequired","buffer","byteLength","createVertexBuffer","Uint8Array","nextPowerOf2","bufferSubData","subarray","draw","primitive","Primitive","setVertexBuffer","setIndexBuffer","primitiveType","indexStart","indexCount","length","drawInstanced","onDispose","GrassLayer","_cullAABB","AABB","_visibleTiles","_instanceData","Float32Array","_material","_seed","_bladeWidth","_bladeHeight","_densityWidth","_densityHeight","_cellsPerTexel","_densityMap","_tiles","_tilesX","_tilesZ","_numBlades","terrain","bladeWidth","bladeHeight","albedoMap","ClipmapGrassMaterial","albedoTexture","setTextureSize","width","height","createBaseVertexBuffer","max","sizeX","sizeZ","Map","updateTileGrid","updateMaterial","uniformChanged","setAlbedoMap","getAlbedoMap","numBlades","densityMap","densityMapWidth","densityMapHeight","cellsPerTexel","val","min","rebuild","setDensityData","console","error","updateDensityRegion","minTexelX","minTexelZ","maxTexelX","maxTexelZ","k","cx0","cz0","cx1","cz1","tx0","floor","tz0","tx1","ceil","tz1","tz","tx","generateTile","tile","values","clear","setBladeSize","sampleDensity","u","v","w","ix","iz","fx","fz","x0","x1","z0","z1","d","a","b","regionIsEmpty","rowBase","cw","ch","key","cz","cx","angle","PI","sin","cos","delete","_getIndexBuffer","createIndexBuffer","Uint16Array","r","t","c","s","vertices","createInterleavedVertexBuffer","ctx","region","minY","maxY","visible","camera","cullAABB","cellsW","cellsH","rx","rz","y","rw","rh","u0","v0","u1","v1","minPoint","setXYZ","maxPoint","clipState","clipMask","getClipStateWithFrustumMask","frustum","getClipStateWithFrustum","ClipState","NOT_CLIPPED","push","apply","pass","numPasses","bind","GrassRenderer","_terrain","_layers","DWeakRef","layer","numGrassBlades","reduce","sum","numLayers","getLayer","index","addLayer","getGrassTexture","setGrassTexture","texture","grassLayer","getBladeWidth","getBladeHeight","bv","getWorldBoundingVolume","toAABB","worldRegion"],"mappings":"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"}
|