@zephyr3d/scene 0.9.3 → 0.9.4
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/spring/spring_particle.js +4 -4
- package/dist/animation/spring/spring_particle.js.map +1 -1
- package/dist/app/engine.js +119 -71
- package/dist/app/engine.js.map +1 -1
- package/dist/asset/assetmanager.js +296 -244
- package/dist/asset/assetmanager.js.map +1 -1
- package/dist/asset/loaders/gltf/gltf_loader.js +1 -0
- package/dist/asset/loaders/gltf/gltf_loader.js.map +1 -1
- package/dist/asset/model.js +57 -57
- package/dist/asset/model.js.map +1 -1
- package/dist/index.d.ts +684 -33
- package/dist/index.js +10 -1
- package/dist/index.js.map +1 -1
- package/dist/material/material.js +1 -1
- package/dist/material/material.js.map +1 -1
- package/dist/material/msdf_text.js +180 -0
- package/dist/material/msdf_text.js.map +1 -0
- package/dist/material/msdf_text_sprite.js +64 -0
- package/dist/material/msdf_text_sprite.js.map +1 -0
- package/dist/material/pbrblueprint.js +123 -108
- package/dist/material/pbrblueprint.js.map +1 -1
- package/dist/material/shader/helper.js +277 -277
- package/dist/material/shader/helper.js.map +1 -1
- package/dist/material/sprite_sdf.js +106 -0
- package/dist/material/sprite_sdf.js.map +1 -0
- package/dist/posteffect/ssr.js +1 -0
- package/dist/posteffect/ssr.js.map +1 -1
- package/dist/render/abuffer_oit.js +1 -0
- package/dist/render/abuffer_oit.js.map +1 -1
- package/dist/render/cluster_light.js.map +1 -1
- package/dist/render/cull_visitor.js +28 -0
- package/dist/render/cull_visitor.js.map +1 -1
- package/dist/render/drawable.js.map +1 -1
- package/dist/render/drawable_mixin.js +1 -0
- package/dist/render/drawable_mixin.js.map +1 -1
- package/dist/render/fbm_wavegenerator.js +1 -0
- package/dist/render/fbm_wavegenerator.js.map +1 -1
- package/dist/render/gerstner_wavegenerator.js +1 -0
- package/dist/render/gerstner_wavegenerator.js.map +1 -1
- package/dist/render/globalbindgroup_allocator.js +1 -0
- package/dist/render/globalbindgroup_allocator.js.map +1 -1
- package/dist/render/render_queue.js +1 -0
- package/dist/render/render_queue.js.map +1 -1
- package/dist/scene/basesprite.js +1 -5
- package/dist/scene/basesprite.js.map +1 -1
- package/dist/scene/batchgroup.js +29 -17
- package/dist/scene/batchgroup.js.map +1 -1
- package/dist/scene/environment.js +1 -0
- package/dist/scene/environment.js.map +1 -1
- package/dist/scene/mesh.js +86 -87
- package/dist/scene/mesh.js.map +1 -1
- package/dist/scene/meshdrawable.js +96 -0
- package/dist/scene/meshdrawable.js.map +1 -0
- package/dist/scene/msdftext.js +341 -0
- package/dist/scene/msdftext.js.map +1 -0
- package/dist/scene/msdftextsprite.js +349 -0
- package/dist/scene/msdftextsprite.js.map +1 -0
- package/dist/scene/particlesys.js +1 -0
- package/dist/scene/particlesys.js.map +1 -1
- package/dist/scene/scene.js +1 -0
- package/dist/scene/scene.js.map +1 -1
- package/dist/scene/scene_node.js +234 -228
- package/dist/scene/scene_node.js.map +1 -1
- package/dist/scene/sdftextsprite.js +322 -0
- package/dist/scene/sdftextsprite.js.map +1 -0
- package/dist/scene/terrain-cm/grass.js +1 -0
- package/dist/scene/terrain-cm/grass.js.map +1 -1
- package/dist/scene/terrain-cm/grassmaterial.js +1 -0
- package/dist/scene/terrain-cm/grassmaterial.js.map +1 -1
- package/dist/scene/terrain-cm/terrain-cm.js +1 -0
- package/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
- package/dist/scene/textsprite.js +120 -0
- package/dist/scene/textsprite.js.map +1 -0
- package/dist/scene/water.js +1 -0
- package/dist/scene/water.js.map +1 -1
- package/dist/shadow/shader.js +1 -0
- package/dist/shadow/shader.js.map +1 -1
- package/dist/text/font/font_asset.js +884 -0
- package/dist/text/font/font_asset.js.map +1 -0
- package/dist/text/font/sfnt_reader.js +43 -0
- package/dist/text/font/sfnt_reader.js.map +1 -0
- package/dist/text/msdf/generator.js +417 -0
- package/dist/text/msdf/generator.js.map +1 -0
- package/dist/text/msdf/shape.js +143 -0
- package/dist/text/msdf/shape.js.map +1 -0
- package/dist/text/runtime/msdf_glyph_atlas.js +146 -0
- package/dist/text/runtime/msdf_glyph_atlas.js.map +1 -0
- package/dist/text/runtime/msdf_text_atlas_manager.js +47 -0
- package/dist/text/runtime/msdf_text_atlas_manager.js.map +1 -0
- package/dist/text/runtime/text_layout.js +96 -0
- package/dist/text/runtime/text_layout.js.map +1 -0
- package/dist/utility/blueprint/material/inputs.js +1275 -1091
- package/dist/utility/blueprint/material/inputs.js.map +1 -1
- package/dist/utility/blueprint/material/ir.js +16 -1
- package/dist/utility/blueprint/material/ir.js.map +1 -1
- package/dist/utility/blueprint/material/pbr.js +32 -0
- package/dist/utility/blueprint/material/pbr.js.map +1 -1
- package/dist/utility/serialization/manager.js +321 -277
- package/dist/utility/serialization/manager.js.map +1 -1
- package/dist/utility/serialization/scene/animation.js +2 -0
- package/dist/utility/serialization/scene/animation.js.map +1 -1
- package/dist/utility/serialization/scene/batch.js +2 -0
- package/dist/utility/serialization/scene/batch.js.map +1 -1
- package/dist/utility/serialization/scene/camera.js +2 -0
- package/dist/utility/serialization/scene/camera.js.map +1 -1
- package/dist/utility/serialization/scene/light.js +2 -0
- package/dist/utility/serialization/scene/light.js.map +1 -1
- package/dist/utility/serialization/scene/material.js +1 -0
- package/dist/utility/serialization/scene/material.js.map +1 -1
- package/dist/utility/serialization/scene/mesh.js +2 -0
- package/dist/utility/serialization/scene/mesh.js.map +1 -1
- package/dist/utility/serialization/scene/node.js +2 -0
- package/dist/utility/serialization/scene/node.js.map +1 -1
- package/dist/utility/serialization/scene/particle.js +2 -0
- package/dist/utility/serialization/scene/particle.js.map +1 -1
- package/dist/utility/serialization/scene/primitive.js +1 -0
- package/dist/utility/serialization/scene/primitive.js.map +1 -1
- package/dist/utility/serialization/scene/sprite.js +2 -0
- package/dist/utility/serialization/scene/sprite.js.map +1 -1
- package/dist/utility/serialization/scene/terrain.js +2 -0
- package/dist/utility/serialization/scene/terrain.js.map +1 -1
- package/dist/utility/serialization/scene/text.js +516 -0
- package/dist/utility/serialization/scene/text.js.map +1 -0
- package/dist/utility/serialization/scene/water.js +2 -0
- package/dist/utility/serialization/scene/water.js.map +1 -1
- package/dist/utility/serialization/types.js.map +1 -1
- package/dist/values.js +48 -48
- package/dist/values.js.map +1 -1
- package/package.json +3 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sdftextsprite.js","sources":["../../src/scene/sdftextsprite.ts"],"sourcesContent":["import type { Scene } from './scene';\r\nimport { BaseSprite } from './basesprite';\r\nimport type { Immutable, Nullable } from '@zephyr3d/base';\r\nimport { splitStringByGraphemes, Vector3 } from '@zephyr3d/base';\r\nimport { Font } from '@zephyr3d/device';\r\nimport { getDevice } from '../app/api';\r\nimport { SDFSpriteMaterial } from '../material/sprite_sdf';\r\nimport type { Sprite } from './sprite';\r\n\r\nconst SDF_SOURCE_SCALE = 4;\r\nconst SDF_RADIUS = 8;\r\nconst INF = 1e20;\r\n\r\ntype TextLayoutLine = {\r\n text: string;\r\n width: number;\r\n};\r\n\r\nclass SDFTextCanvas {\r\n private static _context: Nullable<CanvasRenderingContext2D> = null;\r\n static get context() {\r\n if (!this._context) {\r\n const canvas = document.createElement('canvas');\r\n this._context = canvas.getContext('2d', {\r\n willReadFrequently: true\r\n })!;\r\n this._context.textBaseline = 'top';\r\n this._context.textAlign = 'left';\r\n this._context.imageSmoothingEnabled = true;\r\n this._context.imageSmoothingQuality = 'high';\r\n }\r\n return this._context!;\r\n }\r\n static resize(width: number, height: number) {\r\n const canvas = this.context.canvas;\r\n if (canvas.width !== width) {\r\n canvas.width = width;\r\n }\r\n if (canvas.height !== height) {\r\n canvas.height = height;\r\n }\r\n const ctx = this.context;\r\n ctx.textBaseline = 'top';\r\n ctx.textAlign = 'left';\r\n ctx.imageSmoothingEnabled = true;\r\n ctx.imageSmoothingQuality = 'high';\r\n return ctx;\r\n }\r\n}\r\n\r\n/**\r\n * 3D SDF text sprite node.\r\n *\r\n * @public\r\n */\r\nexport class SDFTextSprite extends BaseSprite<SDFSpriteMaterial> {\r\n private _resolutionX: number;\r\n private _resolutionY: number;\r\n private _text: string;\r\n private _font: string;\r\n private _color: Vector3;\r\n constructor(scene: Scene) {\r\n super(scene);\r\n this.material = new SDFSpriteMaterial();\r\n this._resolutionX = 128;\r\n this._resolutionY = 128;\r\n this._text = '';\r\n this._font = '12px arial';\r\n this._color = new Vector3(1, 1, 1);\r\n this.material.textColor = this._color;\r\n this.scene!.queueUpdateNode(this);\r\n }\r\n isSprite(): this is Sprite {\r\n return true;\r\n }\r\n get resolutionX() {\r\n return this._resolutionX;\r\n }\r\n set resolutionX(value) {\r\n if (this._resolutionX !== value) {\r\n this._resolutionX = value;\r\n this.scene!.queueUpdateNode(this);\r\n }\r\n }\r\n get resolutionY() {\r\n return this._resolutionY;\r\n }\r\n set resolutionY(value) {\r\n if (this._resolutionY !== value) {\r\n this._resolutionY = value;\r\n this.scene!.queueUpdateNode(this);\r\n }\r\n }\r\n get text() {\r\n return this._text;\r\n }\r\n set text(value) {\r\n if (this._text !== value) {\r\n this._text = value;\r\n this.scene!.queueUpdateNode(this);\r\n }\r\n }\r\n get textColor(): Immutable<Vector3> {\r\n return this._color;\r\n }\r\n set textColor(value: Immutable<Vector3>) {\r\n if (!this._color.equalsTo(value)) {\r\n this._color.set(value);\r\n this.material.textColor = value;\r\n }\r\n }\r\n get font() {\r\n return this._font;\r\n }\r\n set font(value) {\r\n if (this._font !== value) {\r\n this._font = value;\r\n this.scene!.queueUpdateNode(this);\r\n }\r\n }\r\n update(): void {\r\n const tex = this.ensureTexture();\r\n const mask = this.renderSDFTexture();\r\n tex.update(mask, 0, 0, this._resolutionX, this._resolutionY);\r\n this.material.spriteTexture = tex;\r\n this.material.textColor = this._color;\r\n this.material.setSDFTextureInfo(SDF_RADIUS, this._resolutionX, this._resolutionY);\r\n }\r\n private ensureTexture() {\r\n let tex = this.material.spriteTexture;\r\n if (\r\n !tex ||\r\n tex.width !== this._resolutionX ||\r\n tex.height !== this._resolutionY ||\r\n tex.format !== 'r8unorm'\r\n ) {\r\n tex = getDevice().createTexture2D('r8unorm', this._resolutionX, this._resolutionY, {\r\n mipmapping: false,\r\n samplerOptions: { minFilter: 'linear', magFilter: 'linear' }\r\n })!;\r\n }\r\n return tex;\r\n }\r\n private renderSDFTexture() {\r\n const sourcePadding = (SDF_RADIUS + 2) * SDF_SOURCE_SCALE;\r\n const sourceWidth = this._resolutionX * SDF_SOURCE_SCALE + sourcePadding * 2;\r\n const sourceHeight = this._resolutionY * SDF_SOURCE_SCALE + sourcePadding * 2;\r\n const ctx = SDFTextCanvas.resize(sourceWidth, sourceHeight);\r\n ctx.clearRect(0, 0, sourceWidth, sourceHeight);\r\n const font = Font.fetchFont(this._font, SDF_SOURCE_SCALE);\r\n ctx.font = font.fontNameScaled;\r\n ctx.fillStyle = '#ffffff';\r\n const lines = this.layoutText(ctx, font, this._text, this._resolutionX * SDF_SOURCE_SCALE);\r\n const lineHeight = font.maxHeightScaled;\r\n for (let i = 0; i < lines.length; i++) {\r\n const lineY = sourcePadding + i * lineHeight;\r\n if (lineY >= sourcePadding + this._resolutionY * SDF_SOURCE_SCALE) {\r\n break;\r\n }\r\n ctx.fillText(lines[i].text, sourcePadding, lineY - font.topScaled);\r\n }\r\n const alpha = ctx.getImageData(0, 0, sourceWidth, sourceHeight).data;\r\n const distToOutside = new Float32Array(sourceWidth * sourceHeight);\r\n const distToInside = new Float32Array(sourceWidth * sourceHeight);\r\n initializeDistanceGrids(alpha, distToOutside, distToInside);\r\n distanceTransform(distToOutside, sourceWidth, sourceHeight);\r\n distanceTransform(distToInside, sourceWidth, sourceHeight);\r\n const out = new Uint8Array(this._resolutionX * this._resolutionY);\r\n for (let y = 0; y < this._resolutionY; y++) {\r\n const sourceY = clampInt(\r\n Math.round(sourcePadding + (y + 0.5) * SDF_SOURCE_SCALE - 0.5),\r\n 0,\r\n sourceHeight - 1\r\n );\r\n for (let x = 0; x < this._resolutionX; x++) {\r\n const sourceX = clampInt(\r\n Math.round(sourcePadding + (x + 0.5) * SDF_SOURCE_SCALE - 0.5),\r\n 0,\r\n sourceWidth - 1\r\n );\r\n const sourceIndex = sourceY * sourceWidth + sourceX;\r\n const signedDistance =\r\n (Math.sqrt(distToOutside[sourceIndex]) - Math.sqrt(distToInside[sourceIndex])) / SDF_SOURCE_SCALE;\r\n const value = clamp01(0.5 + signedDistance / (2 * SDF_RADIUS));\r\n out[y * this._resolutionX + x] = Math.round(value * 255);\r\n }\r\n }\r\n return out;\r\n }\r\n private layoutText(\r\n ctx: CanvasRenderingContext2D,\r\n font: Font,\r\n text: string,\r\n maxWidth: number\r\n ): TextLayoutLine[] {\r\n const result: TextLayoutLine[] = [];\r\n const paragraphs = text.split(/\\r\\n|\\r|\\n/);\r\n for (const paragraph of paragraphs) {\r\n if (paragraph.length === 0) {\r\n result.push({ text: '', width: 0 });\r\n continue;\r\n }\r\n const chars = splitStringByGraphemes(paragraph);\r\n let start = 0;\r\n while (start < chars.length) {\r\n let width = 0;\r\n let breakPos = start;\r\n let lastWhitespaceBreak = -1;\r\n while (breakPos < chars.length) {\r\n const ch = chars[breakPos];\r\n const charWidth = measureGlyphWidth(ctx, ch);\r\n if (breakPos > start && width + charWidth > maxWidth) {\r\n break;\r\n }\r\n width += charWidth;\r\n breakPos++;\r\n if (/^\\s$/u.test(ch)) {\r\n lastWhitespaceBreak = breakPos;\r\n }\r\n }\r\n if (breakPos < chars.length && lastWhitespaceBreak > start) {\r\n const lineText = chars.slice(start, lastWhitespaceBreak).join('').replace(/\\s+$/u, '');\r\n result.push({\r\n text: lineText,\r\n width: this.measureLineWidth(ctx, lineText)\r\n });\r\n start = lastWhitespaceBreak;\r\n while (start < chars.length && /^\\s$/u.test(chars[start])) {\r\n start++;\r\n }\r\n } else {\r\n const lineText = chars.slice(start, breakPos).join('');\r\n result.push({ text: lineText, width });\r\n start = Math.max(breakPos, start + 1);\r\n }\r\n }\r\n }\r\n return result;\r\n }\r\n private measureLineWidth(ctx: CanvasRenderingContext2D, text: string) {\r\n let width = 0;\r\n for (const ch of splitStringByGraphemes(text)) {\r\n width += measureGlyphWidth(ctx, ch);\r\n }\r\n return width;\r\n }\r\n}\r\n\r\nfunction clamp01(value: number) {\r\n return Math.min(Math.max(value, 0), 1);\r\n}\r\n\r\nfunction clampInt(value: number, minValue: number, maxValue: number) {\r\n return Math.min(Math.max(value, minValue), maxValue);\r\n}\r\n\r\nfunction square(value: number) {\r\n return value * value;\r\n}\r\n\r\nfunction measureGlyphWidth(ctx: CanvasRenderingContext2D, char: string) {\r\n const metric = ctx.measureText(char);\r\n let width = metric.width;\r\n if (width === 0) {\r\n return 0;\r\n }\r\n if (typeof metric.actualBoundingBoxRight === 'number') {\r\n width = Math.floor(Math.max(width, metric.actualBoundingBoxRight) + 0.8);\r\n }\r\n return Math.round(width);\r\n}\r\n\r\nfunction initializeDistanceGrids(alpha: Uint8ClampedArray, outside: Float32Array, inside: Float32Array) {\r\n for (let i = 0; i < outside.length; i++) {\r\n const a = alpha[i * 4 + 3] / 255;\r\n if (a <= 0) {\r\n outside[i] = INF;\r\n inside[i] = 0;\r\n } else if (a >= 1) {\r\n outside[i] = 0;\r\n inside[i] = INF;\r\n } else {\r\n outside[i] = square(Math.max(0, 0.5 - a));\r\n inside[i] = square(Math.max(0, a - 0.5));\r\n }\r\n }\r\n}\r\n\r\nfunction distanceTransform(grid: Float32Array, width: number, height: number) {\r\n const temp = new Float32Array(grid.length);\r\n const f = new Float32Array(Math.max(width, height));\r\n const d = new Float32Array(Math.max(width, height));\r\n const v = new Int32Array(Math.max(width, height));\r\n const z = new Float32Array(Math.max(width, height) + 1);\r\n for (let x = 0; x < width; x++) {\r\n for (let y = 0; y < height; y++) {\r\n f[y] = grid[y * width + x];\r\n }\r\n edt1d(f, height, d, v, z);\r\n for (let y = 0; y < height; y++) {\r\n temp[y * width + x] = d[y];\r\n }\r\n }\r\n for (let y = 0; y < height; y++) {\r\n const rowOffset = y * width;\r\n for (let x = 0; x < width; x++) {\r\n f[x] = temp[rowOffset + x];\r\n }\r\n edt1d(f, width, d, v, z);\r\n for (let x = 0; x < width; x++) {\r\n temp[rowOffset + x] = d[x];\r\n }\r\n }\r\n grid.set(temp);\r\n}\r\n\r\nfunction edt1d(f: Float32Array, count: number, out: Float32Array, v: Int32Array, z: Float32Array) {\r\n let k = 0;\r\n v[0] = 0;\r\n z[0] = -INF;\r\n z[1] = INF;\r\n for (let q = 1; q < count; q++) {\r\n let s = 0;\r\n do {\r\n const r = v[k];\r\n s = (f[q] + q * q - (f[r] + r * r)) / (q - r) / 2;\r\n if (s <= z[k]) {\r\n k--;\r\n } else {\r\n break;\r\n }\r\n } while (k >= 0);\r\n k++;\r\n v[k] = q;\r\n z[k] = s;\r\n z[k + 1] = INF;\r\n }\r\n k = 0;\r\n for (let q = 0; q < count; q++) {\r\n while (z[k + 1] < q) {\r\n k++;\r\n }\r\n const r = v[k];\r\n const delta = q - r;\r\n out[q] = delta * delta + f[r];\r\n }\r\n}\r\n"],"names":["SDF_SOURCE_SCALE","SDF_RADIUS","INF","SDFTextCanvas","_context","context","canvas","document","createElement","getContext","willReadFrequently","textBaseline","textAlign","imageSmoothingEnabled","imageSmoothingQuality","resize","width","height","ctx","SDFTextSprite","BaseSprite","_resolutionX","_resolutionY","_text","_font","_color","scene","material","SDFSpriteMaterial","Vector3","textColor","queueUpdateNode","isSprite","resolutionX","value","resolutionY","text","equalsTo","set","font","update","tex","ensureTexture","mask","renderSDFTexture","spriteTexture","setSDFTextureInfo","format","getDevice","createTexture2D","mipmapping","samplerOptions","minFilter","magFilter","sourcePadding","sourceWidth","sourceHeight","clearRect","Font","fetchFont","fontNameScaled","fillStyle","lines","layoutText","lineHeight","maxHeightScaled","i","length","lineY","fillText","topScaled","alpha","getImageData","data","distToOutside","Float32Array","distToInside","initializeDistanceGrids","distanceTransform","out","Uint8Array","y","sourceY","clampInt","Math","round","x","sourceX","sourceIndex","signedDistance","sqrt","clamp01","maxWidth","result","paragraphs","split","paragraph","push","chars","splitStringByGraphemes","start","breakPos","lastWhitespaceBreak","ch","charWidth","measureGlyphWidth","test","lineText","slice","join","replace","measureLineWidth","max","min","minValue","maxValue","square","char","metric","measureText","actualBoundingBoxRight","floor","outside","inside","a","grid","temp","f","d","v","Int32Array","z","edt1d","rowOffset","count","k","q","s","r","delta"],"mappings":"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"}
|
|
@@ -17,6 +17,7 @@ import '../../material/pbrsg.js';
|
|
|
17
17
|
import '../../material/pbrblueprint.js';
|
|
18
18
|
import '../../material/sprite.js';
|
|
19
19
|
import '../../material/sprite_std.js';
|
|
20
|
+
import '../../material/msdf_text.js';
|
|
20
21
|
import '../../utility/blueprint/material/texture.js';
|
|
21
22
|
import '../../render/rendergraph/forward_plus_builder.js';
|
|
22
23
|
import '../../render/sky.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grass.js","sources":["../../../src/scene/terrain-cm/grass.ts"],"sourcesContent":["import type { IndexBuffer, StructuredBuffer, Texture2D } from '@zephyr3d/device';\r\nimport type { Nullable, Vector4 } from '@zephyr3d/base';\r\nimport { AABB, ClipState, nextPowerOf2, DRef, DWeakRef, Disposable } from '@zephyr3d/base';\r\nimport type { DrawContext } from '../../render';\r\nimport { Primitive } from '../../render';\r\nimport { ClipmapGrassMaterial } from './grassmaterial';\r\nimport type { ClipmapTerrain } from './terrain-cm';\r\nimport type { Camera } from '../../camera';\r\nimport { getDevice } from '../../app/api';\r\n\r\nconst MAX_INSTANCES_PER_NODE = 2048;\r\n\r\n/**\r\n * Grass blade instance information\r\n * @public\r\n */\r\nexport type GrassInstanceInfo = {\r\n /** x position of the blade */\r\n x: number;\r\n /** y position of the blade */\r\n y: number;\r\n /** Rotation angle of the blade */\r\n angle: number;\r\n};\r\n// Two floats\r\nconst INSTANCE_BYTES = 4 * 4;\r\n\r\n/**\r\n * Grass glade instance manager class\r\n * @internal\r\n */\r\nexport class GrassInstances extends Disposable {\r\n private readonly _instances: GrassInstanceInfo[];\r\n private readonly _baseVertexBuffer: DRef<StructuredBuffer>;\r\n private readonly _indexBuffer: DRef<IndexBuffer>;\r\n private readonly _instanceBuffer: DRef<StructuredBuffer>;\r\n private readonly _primitive: DRef<Primitive>;\r\n constructor(baseVertexBuffer: StructuredBuffer, indexBuffer: IndexBuffer) {\r\n super();\r\n this._instances = [];\r\n this._baseVertexBuffer = new DRef(baseVertexBuffer);\r\n this._indexBuffer = new DRef(indexBuffer);\r\n this._instanceBuffer = new DRef();\r\n this._primitive = new DRef();\r\n }\r\n get numInstances() {\r\n return this._instances.length;\r\n }\r\n get instanceBuffer() {\r\n return this._instanceBuffer.get()!;\r\n }\r\n setBaseVertexBuffer(baseVertexBuffer: StructuredBuffer) {\r\n if (baseVertexBuffer !== this._baseVertexBuffer.get()) {\r\n this._baseVertexBuffer.set(baseVertexBuffer);\r\n this._primitive.dispose();\r\n }\r\n }\r\n draw() {\r\n if (this._instances.length > 0) {\r\n if (!this._primitive.get()) {\r\n const primitive = new Primitive();\r\n primitive.setVertexBuffer(this._baseVertexBuffer.get()!);\r\n primitive.setVertexBuffer(this._instanceBuffer.get()!, 'instance');\r\n primitive.setIndexBuffer(this._indexBuffer.get());\r\n primitive.primitiveType = 'triangle-list';\r\n primitive.indexStart = 0;\r\n primitive.indexCount = this._indexBuffer.get()!.length;\r\n this._primitive.set(primitive);\r\n }\r\n this._primitive.get()!.drawInstanced(this._instances.length);\r\n }\r\n }\r\n updateBuffers() {\r\n const device = getDevice();\r\n if (this._instances.length === 0) {\r\n this._instanceBuffer.set(null);\r\n return;\r\n }\r\n if (this._instances.length > 0 && !this._instanceBuffer.get()) {\r\n this._instanceBuffer.set(\r\n device.createVertexBuffer('tex1_f32x4', new Uint8Array(this._instances.length * INSTANCE_BYTES))\r\n );\r\n }\r\n let buffer = this._instanceBuffer.get()!;\r\n const currentBytes = buffer.byteLength;\r\n const bytesRequired = this._instances.length * INSTANCE_BYTES;\r\n if (currentBytes < bytesRequired) {\r\n buffer = device.createVertexBuffer('tex1_f32x4', new Uint8Array(nextPowerOf2(bytesRequired)))!;\r\n this._instanceBuffer.set(buffer);\r\n this._primitive.dispose();\r\n }\r\n const data = new Float32Array(4 * this._instances.length);\r\n for (let i = 0; i < this._instances.length; i++) {\r\n data[i * 4 + 0] = this._instances[i].x;\r\n data[i * 4 + 1] = this._instances[i].y;\r\n data[i * 4 + 2] = Math.sin(this._instances[i].angle);\r\n data[i * 4 + 3] = Math.cos(this._instances[i].angle);\r\n }\r\n buffer.bufferSubData(0, data);\r\n }\r\n removeInstances(minX: number, minZ: number, maxX: number, maxZ: number, num: number) {\r\n if (num <= 0) {\r\n return 0;\r\n }\r\n let removed = 0;\r\n for (let i = this._instances.length - 1; i >= 0; i--) {\r\n const instance = this._instances[i];\r\n if (instance.x >= minX && instance.x <= maxX && instance.y >= minZ && instance.y <= maxZ) {\r\n this._instances.splice(i, 1);\r\n removed++;\r\n if (removed === num) {\r\n break;\r\n }\r\n }\r\n }\r\n if (removed > 0) {\r\n this.updateBuffers();\r\n }\r\n return removed;\r\n }\r\n addInstances(instances: GrassInstanceInfo[]) {\r\n this._instances.push(...instances);\r\n this.updateBuffers();\r\n }\r\n protected onDispose() {\r\n super.onDispose();\r\n this._baseVertexBuffer.dispose();\r\n this._indexBuffer.dispose();\r\n this._instanceBuffer.dispose();\r\n this._primitive.dispose();\r\n }\r\n}\r\n\r\n/**\r\n * Grass layer class\r\n * @public\r\n */\r\nexport class GrassLayer extends Disposable {\r\n private static readonly _indexBuffer: DRef<IndexBuffer> = new DRef();\r\n private readonly _material: DRef<ClipmapGrassMaterial>;\r\n private readonly _quadtree: DRef<GrassQuadtreeNode>;\r\n private _bladeWidth: number;\r\n private _bladeHeight: number;\r\n private readonly _baseVertexBuffer: DRef<StructuredBuffer>;\r\n /**\r\n * Creates an instance of GrassLayer\r\n * @param terrain - Clipmap terrain object\r\n * @param bladeWidth - Grass blade width\r\n * @param bladeHeight - Grass blade height\r\n * @param albedoMap - Albedo texture for the blade\r\n */\r\n constructor(terrain: ClipmapTerrain, bladeWidth: number, bladeHeight: number, albedoMap?: Texture2D) {\r\n super();\r\n this._material = new DRef(new ClipmapGrassMaterial(terrain));\r\n this._material.get()!.albedoTexture = albedoMap ?? null;\r\n if (albedoMap) {\r\n this._material.get()!.setTextureSize(albedoMap.width, albedoMap.height);\r\n }\r\n this._bladeWidth = bladeWidth;\r\n this._bladeHeight = bladeHeight;\r\n this._baseVertexBuffer = new DRef(this.createBaseVertexBuffer(this._bladeWidth, this._bladeHeight));\r\n this._quadtree = new DRef(\r\n new GrassQuadtreeNode(this._baseVertexBuffer.get()!, GrassLayer._getIndexBuffer()!)\r\n );\r\n }\r\n /** @internal */\r\n get quadtree() {\r\n return this._quadtree.get();\r\n }\r\n /** @internal */\r\n updateMaterial() {\r\n this._material.get()!.uniformChanged();\r\n }\r\n /**\r\n * Sets the albedo texture of grass blades in this layer\r\n * @param albedoMap - Albedo texture to set\r\n */\r\n setAlbedoMap(albedoMap: Texture2D) {\r\n this._material.get()!.albedoTexture = albedoMap;\r\n if (albedoMap) {\r\n this._material.get()!.setTextureSize(albedoMap.width, albedoMap.height);\r\n }\r\n }\r\n /**\r\n * Gets the albedo texture of grass blades in this layer\r\n * @returns - Albedo texture of grass blades in this layer\r\n */\r\n getAlbedoMap() {\r\n return this._material.get()!.albedoTexture;\r\n }\r\n /**\r\n * Add grass blades to this layer in a region\r\n * @param instances - Grass blade instances to add\r\n */\r\n addInstances(instances: GrassInstanceInfo[]) {\r\n return this._quadtree.get()!.addInstances(instances);\r\n }\r\n /**\r\n * Remove grass blades to this layer in a region\r\n * @param minX - Minimum x position of the region\r\n * @param minZ - Minimum z position of the region\r\n * @param maxX - Maximum x position of the region\r\n * @param maxZ - Maximum z position of the region\r\n * @param numInstances - How many grass blades to add\r\n */\r\n removeInstances(minX: number, minZ: number, maxX: number, maxZ: number, numInstances: number) {\r\n this._quadtree.get()!.removeInstances(minX, minZ, maxX, maxZ, numInstances);\r\n }\r\n /** Grass blade width in this layer */\r\n get bladeWidth() {\r\n return this._bladeWidth;\r\n }\r\n set bladeWidth(val: number) {\r\n this.setBladeSize(val, this._bladeHeight);\r\n }\r\n /** Grass blade height in this layer */\r\n get bladeHeight() {\r\n return this._bladeHeight;\r\n }\r\n set bladeHeight(val: number) {\r\n this.setBladeSize(this._bladeWidth, val);\r\n }\r\n /**\r\n * Sets the size of grass blades in this layer\r\n * @param width - Grass blade width\r\n * @param height - Grass blade height\r\n */\r\n setBladeSize(width: number, height: number) {\r\n if (width !== this._bladeWidth || height !== this._bladeHeight) {\r\n this._bladeWidth = width;\r\n this._bladeHeight = height;\r\n this._baseVertexBuffer.set(this.createBaseVertexBuffer(this._bladeWidth, this._bladeHeight));\r\n this._quadtree.get()!.setBaseVertexBuffer(this._baseVertexBuffer.get()!);\r\n }\r\n }\r\n /** @internal */\r\n private static _getIndexBuffer() {\r\n if (!this._indexBuffer.get()) {\r\n this._indexBuffer.set(\r\n getDevice().createIndexBuffer(\r\n new Uint16Array([0, 1, 2, 0, 2, 3, 4, 5, 6, 4, 6, 7, 8, 9, 10, 8, 10, 11])\r\n )\r\n );\r\n }\r\n return this._indexBuffer.get();\r\n }\r\n /** @internal */\r\n private createBaseVertexBuffer(bladeWidth: number, bladeHeight: number) {\r\n const device = getDevice();\r\n const r = bladeWidth * 0.5;\r\n const t = bladeHeight;\r\n const c = r * Math.cos(Math.PI / 3);\r\n const s = r * Math.sin(Math.PI / 3);\r\n const vertices = new Float32Array([\r\n r,\r\n 0,\r\n 0,\r\n 0,\r\n 1,\r\n r,\r\n t,\r\n 0,\r\n 0,\r\n 0,\r\n -r,\r\n t,\r\n 0,\r\n 1,\r\n 0,\r\n -r,\r\n 0,\r\n 0,\r\n 1,\r\n 1,\r\n\r\n c,\r\n 0,\r\n s,\r\n 0,\r\n 1,\r\n -c,\r\n 0,\r\n -s,\r\n 1,\r\n 1,\r\n -c,\r\n t,\r\n -s,\r\n 1,\r\n 0,\r\n c,\r\n t,\r\n s,\r\n 0,\r\n 0,\r\n\r\n -c,\r\n 0,\r\n s,\r\n 0,\r\n 1,\r\n c,\r\n 0,\r\n -s,\r\n 1,\r\n 1,\r\n c,\r\n t,\r\n -s,\r\n 1,\r\n 0,\r\n -c,\r\n t,\r\n s,\r\n 0,\r\n 0\r\n ]);\r\n return device.createInterleavedVertexBuffer(['position_f32x3', 'tex0_f32x2'], vertices);\r\n }\r\n /** @internal */\r\n draw(ctx: DrawContext, region: Vector4, minY: number, maxY: number) {\r\n this._material.get()!.apply(ctx);\r\n for (let pass = 0; pass < this._material.get()!.numPasses; pass++) {\r\n this._material.get()!.bind(ctx.device, pass);\r\n this._quadtree.get()!.draw(ctx.camera, region, minY, maxY, false);\r\n }\r\n }\r\n /** @internal */\r\n protected onDispose() {\r\n super.onDispose();\r\n this._material.dispose();\r\n this._quadtree.dispose();\r\n this._baseVertexBuffer.dispose();\r\n }\r\n}\r\n/**\r\n * Grass renderer for clipmap terrain\r\n * @public\r\n */\r\nexport class GrassRenderer extends Disposable {\r\n private readonly _terrain: DWeakRef<ClipmapTerrain>;\r\n private _numGrassBlades: number;\r\n private _layers: GrassLayer[];\r\n /**\r\n * Creates an instance of GrassRenderer\r\n * @param terrain - Clipmap terrain object\r\n */\r\n constructor(terrain: ClipmapTerrain) {\r\n super();\r\n this._terrain = new DWeakRef(terrain);\r\n this._numGrassBlades = 0;\r\n this._layers = [];\r\n }\r\n /** @internal */\r\n updateMaterial() {\r\n for (const layer of this._layers) {\r\n layer.updateMaterial();\r\n }\r\n }\r\n /** How many grass blades */\r\n get numGrassBlades() {\r\n return this._numGrassBlades;\r\n }\r\n /** How many grass layers */\r\n get numLayers() {\r\n return this._layers.length;\r\n }\r\n /**\r\n * Gets the grass layer at given index\r\n * @param index - Index of the grass layer\r\n * @returns The grass layer at the index\r\n */\r\n getLayer(index: number) {\r\n return this._layers[index];\r\n }\r\n /**\r\n * Adds a grass layer\r\n * @param bladeWidth - Width of grass blades in this layer\r\n * @param bladeHeight - Height of grass blades in this layer\r\n * @param albedoMap - Albedo texture of grass blades in this layer\r\n * @returns Index of the added grass layer\r\n */\r\n addLayer(bladeWidth: number, bladeHeight: number, albedoMap?: Texture2D) {\r\n const layer = new GrassLayer(this._terrain.get()!, bladeWidth, bladeHeight, albedoMap);\r\n this._layers.push(layer);\r\n return this._layers.length - 1;\r\n }\r\n /**\r\n * Gets the albedo texture of grass blades in the grass layer at given index\r\n * @param layer - Index of the grass layer to get\r\n * @returns Albedo texture of grass blades in the grass layer\r\n */\r\n getGrassTexture(layer: number) {\r\n return this._layers[layer]?.getAlbedoMap() ?? null;\r\n }\r\n /**\r\n * Sets the albedo texture of grass blades in the grass layer at given index\r\n * @param layer - Index of the grass layer to set\r\n * @param texture - Albedo texture to set\r\n */\r\n setGrassTexture(layer: number, texture: Texture2D) {\r\n const grassLayer = this._layers[layer];\r\n if (grassLayer) {\r\n grassLayer.setAlbedoMap(texture);\r\n } else {\r\n console.error(`Invalid grass layer: ${layer}`);\r\n }\r\n }\r\n /**\r\n * Gets width of the grass blades in the grass layer at given index\r\n * @param layer - Index of the grass layer\r\n * @returns Width of the grass blades in the layer\r\n */\r\n getBladeWidth(layer: number) {\r\n return this._layers[layer]?.bladeWidth ?? 0;\r\n }\r\n /**\r\n * Gets height of the grass blades in the grass layer at given index\r\n * @param layer - Index of the grass layer\r\n * @returns Height of the grass blades in the layer\r\n */\r\n getBladeHeight(layer: number) {\r\n return this._layers[layer]?.bladeHeight ?? 0;\r\n }\r\n /**\r\n * Sets size of the grass blades in the grass layer at given index\r\n * @param layer - Index of the grass layer\r\n * @param width - Width to set\r\n * @param height - Height to set\r\n */\r\n setBladeSize(layer: number, width: number, height: number) {\r\n const grassLayer = this._layers[layer];\r\n if (grassLayer) {\r\n grassLayer.setBladeSize(width, height);\r\n } else {\r\n console.error(`Invalid grass layer: ${layer}`);\r\n }\r\n }\r\n /**\r\n * Add grass instances to the grass layer at given index\r\n * @param layer - Index of the grass layer\r\n * @param instances - Grass blade instances to add\r\n */\r\n addInstances(layer: number, instances: GrassInstanceInfo[]) {\r\n const grassLayer = this._layers[layer];\r\n if (!grassLayer) {\r\n console.error(`Invalid grass layer: ${layer}`);\r\n } else {\r\n this._numGrassBlades += grassLayer.addInstances(instances);\r\n }\r\n }\r\n /**\r\n * Remove grass instances from the grass layer at given index within a region\r\n * @param layer - Index of the grass layer\r\n * @param minX - Minimum x of the region\r\n * @param minZ - Minimum z of the region\r\n * @param maxX - Maximum x of the region\r\n * @param maxZ - Maximum z of the region\r\n * @param num - How many grass blades to remove\r\n */\r\n removeInstances(layer: number, minX: number, minZ: number, maxX: number, maxZ: number, num: number) {\r\n const grassLayer = this._layers[layer];\r\n if (!grassLayer) {\r\n console.error(`Invalid grass layer: ${layer}`);\r\n } else {\r\n grassLayer.removeInstances(minX, minZ, maxX, maxZ, num);\r\n }\r\n }\r\n /** @internal */\r\n draw(ctx: DrawContext) {\r\n const bv = this._terrain.get()!.getWorldBoundingVolume()!.toAABB();\r\n const minY = bv.minPoint.y;\r\n const maxY = bv.maxPoint.y;\r\n for (const layer of this._layers) {\r\n layer.draw(ctx, this._terrain.get()!.worldRegion, minY - layer.bladeHeight, maxY + layer.bladeHeight);\r\n }\r\n }\r\n protected onDispose() {\r\n super.onDispose();\r\n this._terrain.dispose();\r\n for (const layer of this._layers) {\r\n layer.dispose();\r\n }\r\n }\r\n}\r\n\r\n/** @internal */\r\nexport class GrassQuadtreeNode extends Disposable {\r\n private static readonly _cullAABB = new AABB();\r\n private readonly _grassInstances: DRef<GrassInstances>;\r\n private _children: Nullable<GrassQuadtreeNode[]>;\r\n private readonly _baseVertexBuffer: DRef<StructuredBuffer>;\r\n private readonly _indexBuffer: DRef<IndexBuffer>;\r\n private _minX: number;\r\n private _minZ: number;\r\n private _maxX: number;\r\n private _maxZ: number;\r\n constructor(baseVertexBuffer: StructuredBuffer, indexBuffer: IndexBuffer) {\r\n super();\r\n this._baseVertexBuffer = new DRef(baseVertexBuffer);\r\n this._indexBuffer = new DRef(indexBuffer);\r\n this._grassInstances = new DRef(new GrassInstances(baseVertexBuffer, indexBuffer));\r\n this._children = null;\r\n this._minX = 0;\r\n this._minZ = 0;\r\n this._maxX = 1;\r\n this._maxZ = 1;\r\n }\r\n get grassInstances() {\r\n return this._grassInstances.get();\r\n }\r\n get children() {\r\n return this._children;\r\n }\r\n draw(camera: Camera, region: Vector4, minY: number, maxY: number, skipClipTest: boolean) {\r\n if (!skipClipTest) {\r\n const cullAABB = GrassQuadtreeNode._cullAABB;\r\n const x = region.x;\r\n const z = region.y;\r\n const dx = region.z - x;\r\n const dz = region.w - z;\r\n cullAABB.minPoint.setXYZ(x + this._minX * dx, minY, z + this._minZ * dz);\r\n cullAABB.maxPoint.setXYZ(x + this._maxX * dx, maxY, z + this._maxZ * dz);\r\n const clipState = camera.clipMask\r\n ? cullAABB.getClipStateWithFrustumMask(camera.frustum, camera.clipMask)\r\n : cullAABB.getClipStateWithFrustum(camera.frustum);\r\n if (clipState === ClipState.NOT_CLIPPED) {\r\n return;\r\n }\r\n skipClipTest = clipState === ClipState.A_INSIDE_B;\r\n }\r\n if (this._grassInstances.get()!.numInstances > 0) {\r\n this._grassInstances.get()!.draw();\r\n }\r\n if (this._children) {\r\n for (const child of this._children) {\r\n child.draw(camera, region, minY, maxY, skipClipTest);\r\n }\r\n }\r\n }\r\n setBaseVertexBuffer(baseVertexBuffer: StructuredBuffer) {\r\n if (baseVertexBuffer !== this._baseVertexBuffer.get()) {\r\n this._baseVertexBuffer.set(baseVertexBuffer);\r\n this._grassInstances.get()!.setBaseVertexBuffer(baseVertexBuffer);\r\n if (this._children) {\r\n for (const child of this._children) {\r\n child.setBaseVertexBuffer(baseVertexBuffer);\r\n }\r\n }\r\n }\r\n }\r\n removeInstances(minX: number, minZ: number, maxX: number, maxZ: number, numInstances: number) {\r\n let n = Math.min(this._grassInstances.get()!.numInstances, numInstances);\r\n if (n <= 0) {\r\n return 0;\r\n }\r\n let removed = 0;\r\n if (this._children) {\r\n for (const child of this._children) {\r\n if (child._minX < maxX && child._minZ < maxZ && child._maxX > minX && child._maxZ > minZ) {\r\n removed += child.removeInstances(minX, minZ, maxX, maxZ, n);\r\n n -= removed;\r\n }\r\n }\r\n }\r\n if (n > 0) {\r\n removed += this._grassInstances.get()!.removeInstances(minX, minZ, maxX, maxZ, n);\r\n }\r\n return removed;\r\n }\r\n addInstances(instances: GrassInstanceInfo[]) {\r\n if (instances.length === 0) {\r\n return 0;\r\n }\r\n let n = Math.min(instances.length, MAX_INSTANCES_PER_NODE - this._grassInstances.get()!.numInstances);\r\n this._grassInstances.get()!.addInstances(instances.slice(0, n));\r\n if (n < instances.length) {\r\n if (!this._children) {\r\n this._children = [\r\n new GrassQuadtreeNode(this._baseVertexBuffer.get()!, this._indexBuffer.get()!),\r\n new GrassQuadtreeNode(this._baseVertexBuffer.get()!, this._indexBuffer.get()!),\r\n new GrassQuadtreeNode(this._baseVertexBuffer.get()!, this._indexBuffer.get()!),\r\n new GrassQuadtreeNode(this._baseVertexBuffer.get()!, this._indexBuffer.get()!)\r\n ];\r\n this._children[0]._minX = this._minX;\r\n this._children[0]._minZ = this._minZ;\r\n this._children[0]._maxX = (this._minX + this._maxX) * 0.5;\r\n this._children[0]._maxZ = (this._minZ + this._maxZ) * 0.5;\r\n this._children[1]._minX = this._children[0]._maxX;\r\n this._children[1]._minZ = this._minZ;\r\n this._children[1]._maxX = this._maxX;\r\n this._children[1]._maxZ = this._children[0]._maxZ;\r\n this._children[2]._minX = this._minX;\r\n this._children[2]._minZ = this._children[0]._maxZ;\r\n this._children[2]._maxX = this._children[0]._maxX;\r\n this._children[2]._maxZ = this._maxZ;\r\n this._children[3]._minX = this._children[0]._maxX;\r\n this._children[3]._minZ = this._children[0]._maxZ;\r\n this._children[3]._maxX = this._maxX;\r\n this._children[3]._maxZ = this._maxZ;\r\n }\r\n instances = instances.slice(n);\r\n for (const child of this._children) {\r\n if (instances.length > 0) {\r\n const childInstances = instances.filter(\r\n (val) =>\r\n val.x >= child._minX && val.y >= child._minZ && val.x < child._maxX && val.y < child._maxZ\r\n );\r\n n += child.addInstances(childInstances);\r\n instances = instances.filter(\r\n (val) =>\r\n !(val.x >= child._minX && val.y >= child._minZ && val.x < child._maxX && val.y < child._maxZ)\r\n );\r\n }\r\n }\r\n }\r\n return n;\r\n }\r\n protected onDispose() {\r\n super.onDispose();\r\n this._baseVertexBuffer.dispose();\r\n this._indexBuffer.dispose();\r\n this._grassInstances.dispose();\r\n if (this._children) {\r\n for (const child of this._children) {\r\n child.dispose();\r\n }\r\n }\r\n }\r\n}\r\n"],"names":["MAX_INSTANCES_PER_NODE","INSTANCE_BYTES","GrassInstances","Disposable","_instances","_baseVertexBuffer","_indexBuffer","_instanceBuffer","_primitive","baseVertexBuffer","indexBuffer","DRef","numInstances","length","instanceBuffer","get","setBaseVertexBuffer","set","dispose","draw","primitive","Primitive","setVertexBuffer","setIndexBuffer","primitiveType","indexStart","indexCount","drawInstanced","updateBuffers","device","getDevice","createVertexBuffer","Uint8Array","buffer","currentBytes","byteLength","bytesRequired","nextPowerOf2","data","Float32Array","i","x","y","Math","sin","angle","cos","bufferSubData","removeInstances","minX","minZ","maxX","maxZ","num","removed","instance","splice","addInstances","instances","push","onDispose","GrassLayer","_material","_quadtree","_bladeWidth","_bladeHeight","terrain","bladeWidth","bladeHeight","albedoMap","ClipmapGrassMaterial","albedoTexture","setTextureSize","width","height","createBaseVertexBuffer","GrassQuadtreeNode","_getIndexBuffer","quadtree","updateMaterial","uniformChanged","setAlbedoMap","getAlbedoMap","val","setBladeSize","createIndexBuffer","Uint16Array","r","t","c","PI","s","vertices","createInterleavedVertexBuffer","ctx","region","minY","maxY","apply","pass","numPasses","bind","camera","GrassRenderer","_terrain","_numGrassBlades","_layers","DWeakRef","layer","numGrassBlades","numLayers","getLayer","index","addLayer","getGrassTexture","setGrassTexture","texture","grassLayer","console","error","getBladeWidth","getBladeHeight","bv","getWorldBoundingVolume","toAABB","minPoint","maxPoint","worldRegion","_cullAABB","AABB","_grassInstances","_children","_minX","_minZ","_maxX","_maxZ","grassInstances","children","skipClipTest","cullAABB","z","dx","dz","w","setXYZ","clipState","clipMask","getClipStateWithFrustumMask","frustum","getClipStateWithFrustum","ClipState","NOT_CLIPPED","A_INSIDE_B","child","n","min","slice","childInstances","filter"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"grass.js","sources":["../../../src/scene/terrain-cm/grass.ts"],"sourcesContent":["import type { IndexBuffer, StructuredBuffer, Texture2D } from '@zephyr3d/device';\r\nimport type { Nullable, Vector4 } from '@zephyr3d/base';\r\nimport { AABB, ClipState, nextPowerOf2, DRef, DWeakRef, Disposable } from '@zephyr3d/base';\r\nimport type { DrawContext } from '../../render';\r\nimport { Primitive } from '../../render';\r\nimport { ClipmapGrassMaterial } from './grassmaterial';\r\nimport type { ClipmapTerrain } from './terrain-cm';\r\nimport type { Camera } from '../../camera';\r\nimport { getDevice } from '../../app/api';\r\n\r\nconst MAX_INSTANCES_PER_NODE = 2048;\r\n\r\n/**\r\n * Grass blade instance information\r\n * @public\r\n */\r\nexport type GrassInstanceInfo = {\r\n /** x position of the blade */\r\n x: number;\r\n /** y position of the blade */\r\n y: number;\r\n /** Rotation angle of the blade */\r\n angle: number;\r\n};\r\n// Two floats\r\nconst INSTANCE_BYTES = 4 * 4;\r\n\r\n/**\r\n * Grass glade instance manager class\r\n * @internal\r\n */\r\nexport class GrassInstances extends Disposable {\r\n private readonly _instances: GrassInstanceInfo[];\r\n private readonly _baseVertexBuffer: DRef<StructuredBuffer>;\r\n private readonly _indexBuffer: DRef<IndexBuffer>;\r\n private readonly _instanceBuffer: DRef<StructuredBuffer>;\r\n private readonly _primitive: DRef<Primitive>;\r\n constructor(baseVertexBuffer: StructuredBuffer, indexBuffer: IndexBuffer) {\r\n super();\r\n this._instances = [];\r\n this._baseVertexBuffer = new DRef(baseVertexBuffer);\r\n this._indexBuffer = new DRef(indexBuffer);\r\n this._instanceBuffer = new DRef();\r\n this._primitive = new DRef();\r\n }\r\n get numInstances() {\r\n return this._instances.length;\r\n }\r\n get instanceBuffer() {\r\n return this._instanceBuffer.get()!;\r\n }\r\n setBaseVertexBuffer(baseVertexBuffer: StructuredBuffer) {\r\n if (baseVertexBuffer !== this._baseVertexBuffer.get()) {\r\n this._baseVertexBuffer.set(baseVertexBuffer);\r\n this._primitive.dispose();\r\n }\r\n }\r\n draw() {\r\n if (this._instances.length > 0) {\r\n if (!this._primitive.get()) {\r\n const primitive = new Primitive();\r\n primitive.setVertexBuffer(this._baseVertexBuffer.get()!);\r\n primitive.setVertexBuffer(this._instanceBuffer.get()!, 'instance');\r\n primitive.setIndexBuffer(this._indexBuffer.get());\r\n primitive.primitiveType = 'triangle-list';\r\n primitive.indexStart = 0;\r\n primitive.indexCount = this._indexBuffer.get()!.length;\r\n this._primitive.set(primitive);\r\n }\r\n this._primitive.get()!.drawInstanced(this._instances.length);\r\n }\r\n }\r\n updateBuffers() {\r\n const device = getDevice();\r\n if (this._instances.length === 0) {\r\n this._instanceBuffer.set(null);\r\n return;\r\n }\r\n if (this._instances.length > 0 && !this._instanceBuffer.get()) {\r\n this._instanceBuffer.set(\r\n device.createVertexBuffer('tex1_f32x4', new Uint8Array(this._instances.length * INSTANCE_BYTES))\r\n );\r\n }\r\n let buffer = this._instanceBuffer.get()!;\r\n const currentBytes = buffer.byteLength;\r\n const bytesRequired = this._instances.length * INSTANCE_BYTES;\r\n if (currentBytes < bytesRequired) {\r\n buffer = device.createVertexBuffer('tex1_f32x4', new Uint8Array(nextPowerOf2(bytesRequired)))!;\r\n this._instanceBuffer.set(buffer);\r\n this._primitive.dispose();\r\n }\r\n const data = new Float32Array(4 * this._instances.length);\r\n for (let i = 0; i < this._instances.length; i++) {\r\n data[i * 4 + 0] = this._instances[i].x;\r\n data[i * 4 + 1] = this._instances[i].y;\r\n data[i * 4 + 2] = Math.sin(this._instances[i].angle);\r\n data[i * 4 + 3] = Math.cos(this._instances[i].angle);\r\n }\r\n buffer.bufferSubData(0, data);\r\n }\r\n removeInstances(minX: number, minZ: number, maxX: number, maxZ: number, num: number) {\r\n if (num <= 0) {\r\n return 0;\r\n }\r\n let removed = 0;\r\n for (let i = this._instances.length - 1; i >= 0; i--) {\r\n const instance = this._instances[i];\r\n if (instance.x >= minX && instance.x <= maxX && instance.y >= minZ && instance.y <= maxZ) {\r\n this._instances.splice(i, 1);\r\n removed++;\r\n if (removed === num) {\r\n break;\r\n }\r\n }\r\n }\r\n if (removed > 0) {\r\n this.updateBuffers();\r\n }\r\n return removed;\r\n }\r\n addInstances(instances: GrassInstanceInfo[]) {\r\n this._instances.push(...instances);\r\n this.updateBuffers();\r\n }\r\n protected onDispose() {\r\n super.onDispose();\r\n this._baseVertexBuffer.dispose();\r\n this._indexBuffer.dispose();\r\n this._instanceBuffer.dispose();\r\n this._primitive.dispose();\r\n }\r\n}\r\n\r\n/**\r\n * Grass layer class\r\n * @public\r\n */\r\nexport class GrassLayer extends Disposable {\r\n private static readonly _indexBuffer: DRef<IndexBuffer> = new DRef();\r\n private readonly _material: DRef<ClipmapGrassMaterial>;\r\n private readonly _quadtree: DRef<GrassQuadtreeNode>;\r\n private _bladeWidth: number;\r\n private _bladeHeight: number;\r\n private readonly _baseVertexBuffer: DRef<StructuredBuffer>;\r\n /**\r\n * Creates an instance of GrassLayer\r\n * @param terrain - Clipmap terrain object\r\n * @param bladeWidth - Grass blade width\r\n * @param bladeHeight - Grass blade height\r\n * @param albedoMap - Albedo texture for the blade\r\n */\r\n constructor(terrain: ClipmapTerrain, bladeWidth: number, bladeHeight: number, albedoMap?: Texture2D) {\r\n super();\r\n this._material = new DRef(new ClipmapGrassMaterial(terrain));\r\n this._material.get()!.albedoTexture = albedoMap ?? null;\r\n if (albedoMap) {\r\n this._material.get()!.setTextureSize(albedoMap.width, albedoMap.height);\r\n }\r\n this._bladeWidth = bladeWidth;\r\n this._bladeHeight = bladeHeight;\r\n this._baseVertexBuffer = new DRef(this.createBaseVertexBuffer(this._bladeWidth, this._bladeHeight));\r\n this._quadtree = new DRef(\r\n new GrassQuadtreeNode(this._baseVertexBuffer.get()!, GrassLayer._getIndexBuffer()!)\r\n );\r\n }\r\n /** @internal */\r\n get quadtree() {\r\n return this._quadtree.get();\r\n }\r\n /** @internal */\r\n updateMaterial() {\r\n this._material.get()!.uniformChanged();\r\n }\r\n /**\r\n * Sets the albedo texture of grass blades in this layer\r\n * @param albedoMap - Albedo texture to set\r\n */\r\n setAlbedoMap(albedoMap: Texture2D) {\r\n this._material.get()!.albedoTexture = albedoMap;\r\n if (albedoMap) {\r\n this._material.get()!.setTextureSize(albedoMap.width, albedoMap.height);\r\n }\r\n }\r\n /**\r\n * Gets the albedo texture of grass blades in this layer\r\n * @returns - Albedo texture of grass blades in this layer\r\n */\r\n getAlbedoMap() {\r\n return this._material.get()!.albedoTexture;\r\n }\r\n /**\r\n * Add grass blades to this layer in a region\r\n * @param instances - Grass blade instances to add\r\n */\r\n addInstances(instances: GrassInstanceInfo[]) {\r\n return this._quadtree.get()!.addInstances(instances);\r\n }\r\n /**\r\n * Remove grass blades to this layer in a region\r\n * @param minX - Minimum x position of the region\r\n * @param minZ - Minimum z position of the region\r\n * @param maxX - Maximum x position of the region\r\n * @param maxZ - Maximum z position of the region\r\n * @param numInstances - How many grass blades to add\r\n */\r\n removeInstances(minX: number, minZ: number, maxX: number, maxZ: number, numInstances: number) {\r\n this._quadtree.get()!.removeInstances(minX, minZ, maxX, maxZ, numInstances);\r\n }\r\n /** Grass blade width in this layer */\r\n get bladeWidth() {\r\n return this._bladeWidth;\r\n }\r\n set bladeWidth(val: number) {\r\n this.setBladeSize(val, this._bladeHeight);\r\n }\r\n /** Grass blade height in this layer */\r\n get bladeHeight() {\r\n return this._bladeHeight;\r\n }\r\n set bladeHeight(val: number) {\r\n this.setBladeSize(this._bladeWidth, val);\r\n }\r\n /**\r\n * Sets the size of grass blades in this layer\r\n * @param width - Grass blade width\r\n * @param height - Grass blade height\r\n */\r\n setBladeSize(width: number, height: number) {\r\n if (width !== this._bladeWidth || height !== this._bladeHeight) {\r\n this._bladeWidth = width;\r\n this._bladeHeight = height;\r\n this._baseVertexBuffer.set(this.createBaseVertexBuffer(this._bladeWidth, this._bladeHeight));\r\n this._quadtree.get()!.setBaseVertexBuffer(this._baseVertexBuffer.get()!);\r\n }\r\n }\r\n /** @internal */\r\n private static _getIndexBuffer() {\r\n if (!this._indexBuffer.get()) {\r\n this._indexBuffer.set(\r\n getDevice().createIndexBuffer(\r\n new Uint16Array([0, 1, 2, 0, 2, 3, 4, 5, 6, 4, 6, 7, 8, 9, 10, 8, 10, 11])\r\n )\r\n );\r\n }\r\n return this._indexBuffer.get();\r\n }\r\n /** @internal */\r\n private createBaseVertexBuffer(bladeWidth: number, bladeHeight: number) {\r\n const device = getDevice();\r\n const r = bladeWidth * 0.5;\r\n const t = bladeHeight;\r\n const c = r * Math.cos(Math.PI / 3);\r\n const s = r * Math.sin(Math.PI / 3);\r\n const vertices = new Float32Array([\r\n r,\r\n 0,\r\n 0,\r\n 0,\r\n 1,\r\n r,\r\n t,\r\n 0,\r\n 0,\r\n 0,\r\n -r,\r\n t,\r\n 0,\r\n 1,\r\n 0,\r\n -r,\r\n 0,\r\n 0,\r\n 1,\r\n 1,\r\n\r\n c,\r\n 0,\r\n s,\r\n 0,\r\n 1,\r\n -c,\r\n 0,\r\n -s,\r\n 1,\r\n 1,\r\n -c,\r\n t,\r\n -s,\r\n 1,\r\n 0,\r\n c,\r\n t,\r\n s,\r\n 0,\r\n 0,\r\n\r\n -c,\r\n 0,\r\n s,\r\n 0,\r\n 1,\r\n c,\r\n 0,\r\n -s,\r\n 1,\r\n 1,\r\n c,\r\n t,\r\n -s,\r\n 1,\r\n 0,\r\n -c,\r\n t,\r\n s,\r\n 0,\r\n 0\r\n ]);\r\n return device.createInterleavedVertexBuffer(['position_f32x3', 'tex0_f32x2'], vertices);\r\n }\r\n /** @internal */\r\n draw(ctx: DrawContext, region: Vector4, minY: number, maxY: number) {\r\n this._material.get()!.apply(ctx);\r\n for (let pass = 0; pass < this._material.get()!.numPasses; pass++) {\r\n this._material.get()!.bind(ctx.device, pass);\r\n this._quadtree.get()!.draw(ctx.camera, region, minY, maxY, false);\r\n }\r\n }\r\n /** @internal */\r\n protected onDispose() {\r\n super.onDispose();\r\n this._material.dispose();\r\n this._quadtree.dispose();\r\n this._baseVertexBuffer.dispose();\r\n }\r\n}\r\n/**\r\n * Grass renderer for clipmap terrain\r\n * @public\r\n */\r\nexport class GrassRenderer extends Disposable {\r\n private readonly _terrain: DWeakRef<ClipmapTerrain>;\r\n private _numGrassBlades: number;\r\n private _layers: GrassLayer[];\r\n /**\r\n * Creates an instance of GrassRenderer\r\n * @param terrain - Clipmap terrain object\r\n */\r\n constructor(terrain: ClipmapTerrain) {\r\n super();\r\n this._terrain = new DWeakRef(terrain);\r\n this._numGrassBlades = 0;\r\n this._layers = [];\r\n }\r\n /** @internal */\r\n updateMaterial() {\r\n for (const layer of this._layers) {\r\n layer.updateMaterial();\r\n }\r\n }\r\n /** How many grass blades */\r\n get numGrassBlades() {\r\n return this._numGrassBlades;\r\n }\r\n /** How many grass layers */\r\n get numLayers() {\r\n return this._layers.length;\r\n }\r\n /**\r\n * Gets the grass layer at given index\r\n * @param index - Index of the grass layer\r\n * @returns The grass layer at the index\r\n */\r\n getLayer(index: number) {\r\n return this._layers[index];\r\n }\r\n /**\r\n * Adds a grass layer\r\n * @param bladeWidth - Width of grass blades in this layer\r\n * @param bladeHeight - Height of grass blades in this layer\r\n * @param albedoMap - Albedo texture of grass blades in this layer\r\n * @returns Index of the added grass layer\r\n */\r\n addLayer(bladeWidth: number, bladeHeight: number, albedoMap?: Texture2D) {\r\n const layer = new GrassLayer(this._terrain.get()!, bladeWidth, bladeHeight, albedoMap);\r\n this._layers.push(layer);\r\n return this._layers.length - 1;\r\n }\r\n /**\r\n * Gets the albedo texture of grass blades in the grass layer at given index\r\n * @param layer - Index of the grass layer to get\r\n * @returns Albedo texture of grass blades in the grass layer\r\n */\r\n getGrassTexture(layer: number) {\r\n return this._layers[layer]?.getAlbedoMap() ?? null;\r\n }\r\n /**\r\n * Sets the albedo texture of grass blades in the grass layer at given index\r\n * @param layer - Index of the grass layer to set\r\n * @param texture - Albedo texture to set\r\n */\r\n setGrassTexture(layer: number, texture: Texture2D) {\r\n const grassLayer = this._layers[layer];\r\n if (grassLayer) {\r\n grassLayer.setAlbedoMap(texture);\r\n } else {\r\n console.error(`Invalid grass layer: ${layer}`);\r\n }\r\n }\r\n /**\r\n * Gets width of the grass blades in the grass layer at given index\r\n * @param layer - Index of the grass layer\r\n * @returns Width of the grass blades in the layer\r\n */\r\n getBladeWidth(layer: number) {\r\n return this._layers[layer]?.bladeWidth ?? 0;\r\n }\r\n /**\r\n * Gets height of the grass blades in the grass layer at given index\r\n * @param layer - Index of the grass layer\r\n * @returns Height of the grass blades in the layer\r\n */\r\n getBladeHeight(layer: number) {\r\n return this._layers[layer]?.bladeHeight ?? 0;\r\n }\r\n /**\r\n * Sets size of the grass blades in the grass layer at given index\r\n * @param layer - Index of the grass layer\r\n * @param width - Width to set\r\n * @param height - Height to set\r\n */\r\n setBladeSize(layer: number, width: number, height: number) {\r\n const grassLayer = this._layers[layer];\r\n if (grassLayer) {\r\n grassLayer.setBladeSize(width, height);\r\n } else {\r\n console.error(`Invalid grass layer: ${layer}`);\r\n }\r\n }\r\n /**\r\n * Add grass instances to the grass layer at given index\r\n * @param layer - Index of the grass layer\r\n * @param instances - Grass blade instances to add\r\n */\r\n addInstances(layer: number, instances: GrassInstanceInfo[]) {\r\n const grassLayer = this._layers[layer];\r\n if (!grassLayer) {\r\n console.error(`Invalid grass layer: ${layer}`);\r\n } else {\r\n this._numGrassBlades += grassLayer.addInstances(instances);\r\n }\r\n }\r\n /**\r\n * Remove grass instances from the grass layer at given index within a region\r\n * @param layer - Index of the grass layer\r\n * @param minX - Minimum x of the region\r\n * @param minZ - Minimum z of the region\r\n * @param maxX - Maximum x of the region\r\n * @param maxZ - Maximum z of the region\r\n * @param num - How many grass blades to remove\r\n */\r\n removeInstances(layer: number, minX: number, minZ: number, maxX: number, maxZ: number, num: number) {\r\n const grassLayer = this._layers[layer];\r\n if (!grassLayer) {\r\n console.error(`Invalid grass layer: ${layer}`);\r\n } else {\r\n grassLayer.removeInstances(minX, minZ, maxX, maxZ, num);\r\n }\r\n }\r\n /** @internal */\r\n draw(ctx: DrawContext) {\r\n const bv = this._terrain.get()!.getWorldBoundingVolume()!.toAABB();\r\n const minY = bv.minPoint.y;\r\n const maxY = bv.maxPoint.y;\r\n for (const layer of this._layers) {\r\n layer.draw(ctx, this._terrain.get()!.worldRegion, minY - layer.bladeHeight, maxY + layer.bladeHeight);\r\n }\r\n }\r\n protected onDispose() {\r\n super.onDispose();\r\n this._terrain.dispose();\r\n for (const layer of this._layers) {\r\n layer.dispose();\r\n }\r\n }\r\n}\r\n\r\n/** @internal */\r\nexport class GrassQuadtreeNode extends Disposable {\r\n private static readonly _cullAABB = new AABB();\r\n private readonly _grassInstances: DRef<GrassInstances>;\r\n private _children: Nullable<GrassQuadtreeNode[]>;\r\n private readonly _baseVertexBuffer: DRef<StructuredBuffer>;\r\n private readonly _indexBuffer: DRef<IndexBuffer>;\r\n private _minX: number;\r\n private _minZ: number;\r\n private _maxX: number;\r\n private _maxZ: number;\r\n constructor(baseVertexBuffer: StructuredBuffer, indexBuffer: IndexBuffer) {\r\n super();\r\n this._baseVertexBuffer = new DRef(baseVertexBuffer);\r\n this._indexBuffer = new DRef(indexBuffer);\r\n this._grassInstances = new DRef(new GrassInstances(baseVertexBuffer, indexBuffer));\r\n this._children = null;\r\n this._minX = 0;\r\n this._minZ = 0;\r\n this._maxX = 1;\r\n this._maxZ = 1;\r\n }\r\n get grassInstances() {\r\n return this._grassInstances.get();\r\n }\r\n get children() {\r\n return this._children;\r\n }\r\n draw(camera: Camera, region: Vector4, minY: number, maxY: number, skipClipTest: boolean) {\r\n if (!skipClipTest) {\r\n const cullAABB = GrassQuadtreeNode._cullAABB;\r\n const x = region.x;\r\n const z = region.y;\r\n const dx = region.z - x;\r\n const dz = region.w - z;\r\n cullAABB.minPoint.setXYZ(x + this._minX * dx, minY, z + this._minZ * dz);\r\n cullAABB.maxPoint.setXYZ(x + this._maxX * dx, maxY, z + this._maxZ * dz);\r\n const clipState = camera.clipMask\r\n ? cullAABB.getClipStateWithFrustumMask(camera.frustum, camera.clipMask)\r\n : cullAABB.getClipStateWithFrustum(camera.frustum);\r\n if (clipState === ClipState.NOT_CLIPPED) {\r\n return;\r\n }\r\n skipClipTest = clipState === ClipState.A_INSIDE_B;\r\n }\r\n if (this._grassInstances.get()!.numInstances > 0) {\r\n this._grassInstances.get()!.draw();\r\n }\r\n if (this._children) {\r\n for (const child of this._children) {\r\n child.draw(camera, region, minY, maxY, skipClipTest);\r\n }\r\n }\r\n }\r\n setBaseVertexBuffer(baseVertexBuffer: StructuredBuffer) {\r\n if (baseVertexBuffer !== this._baseVertexBuffer.get()) {\r\n this._baseVertexBuffer.set(baseVertexBuffer);\r\n this._grassInstances.get()!.setBaseVertexBuffer(baseVertexBuffer);\r\n if (this._children) {\r\n for (const child of this._children) {\r\n child.setBaseVertexBuffer(baseVertexBuffer);\r\n }\r\n }\r\n }\r\n }\r\n removeInstances(minX: number, minZ: number, maxX: number, maxZ: number, numInstances: number) {\r\n let n = Math.min(this._grassInstances.get()!.numInstances, numInstances);\r\n if (n <= 0) {\r\n return 0;\r\n }\r\n let removed = 0;\r\n if (this._children) {\r\n for (const child of this._children) {\r\n if (child._minX < maxX && child._minZ < maxZ && child._maxX > minX && child._maxZ > minZ) {\r\n removed += child.removeInstances(minX, minZ, maxX, maxZ, n);\r\n n -= removed;\r\n }\r\n }\r\n }\r\n if (n > 0) {\r\n removed += this._grassInstances.get()!.removeInstances(minX, minZ, maxX, maxZ, n);\r\n }\r\n return removed;\r\n }\r\n addInstances(instances: GrassInstanceInfo[]) {\r\n if (instances.length === 0) {\r\n return 0;\r\n }\r\n let n = Math.min(instances.length, MAX_INSTANCES_PER_NODE - this._grassInstances.get()!.numInstances);\r\n this._grassInstances.get()!.addInstances(instances.slice(0, n));\r\n if (n < instances.length) {\r\n if (!this._children) {\r\n this._children = [\r\n new GrassQuadtreeNode(this._baseVertexBuffer.get()!, this._indexBuffer.get()!),\r\n new GrassQuadtreeNode(this._baseVertexBuffer.get()!, this._indexBuffer.get()!),\r\n new GrassQuadtreeNode(this._baseVertexBuffer.get()!, this._indexBuffer.get()!),\r\n new GrassQuadtreeNode(this._baseVertexBuffer.get()!, this._indexBuffer.get()!)\r\n ];\r\n this._children[0]._minX = this._minX;\r\n this._children[0]._minZ = this._minZ;\r\n this._children[0]._maxX = (this._minX + this._maxX) * 0.5;\r\n this._children[0]._maxZ = (this._minZ + this._maxZ) * 0.5;\r\n this._children[1]._minX = this._children[0]._maxX;\r\n this._children[1]._minZ = this._minZ;\r\n this._children[1]._maxX = this._maxX;\r\n this._children[1]._maxZ = this._children[0]._maxZ;\r\n this._children[2]._minX = this._minX;\r\n this._children[2]._minZ = this._children[0]._maxZ;\r\n this._children[2]._maxX = this._children[0]._maxX;\r\n this._children[2]._maxZ = this._maxZ;\r\n this._children[3]._minX = this._children[0]._maxX;\r\n this._children[3]._minZ = this._children[0]._maxZ;\r\n this._children[3]._maxX = this._maxX;\r\n this._children[3]._maxZ = this._maxZ;\r\n }\r\n instances = instances.slice(n);\r\n for (const child of this._children) {\r\n if (instances.length > 0) {\r\n const childInstances = instances.filter(\r\n (val) =>\r\n val.x >= child._minX && val.y >= child._minZ && val.x < child._maxX && val.y < child._maxZ\r\n );\r\n n += child.addInstances(childInstances);\r\n instances = instances.filter(\r\n (val) =>\r\n !(val.x >= child._minX && val.y >= child._minZ && val.x < child._maxX && val.y < child._maxZ)\r\n );\r\n }\r\n }\r\n }\r\n return n;\r\n }\r\n protected onDispose() {\r\n super.onDispose();\r\n this._baseVertexBuffer.dispose();\r\n this._indexBuffer.dispose();\r\n this._grassInstances.dispose();\r\n if (this._children) {\r\n for (const child of this._children) {\r\n child.dispose();\r\n }\r\n }\r\n }\r\n}\r\n"],"names":["MAX_INSTANCES_PER_NODE","INSTANCE_BYTES","GrassInstances","Disposable","_instances","_baseVertexBuffer","_indexBuffer","_instanceBuffer","_primitive","baseVertexBuffer","indexBuffer","DRef","numInstances","length","instanceBuffer","get","setBaseVertexBuffer","set","dispose","draw","primitive","Primitive","setVertexBuffer","setIndexBuffer","primitiveType","indexStart","indexCount","drawInstanced","updateBuffers","device","getDevice","createVertexBuffer","Uint8Array","buffer","currentBytes","byteLength","bytesRequired","nextPowerOf2","data","Float32Array","i","x","y","Math","sin","angle","cos","bufferSubData","removeInstances","minX","minZ","maxX","maxZ","num","removed","instance","splice","addInstances","instances","push","onDispose","GrassLayer","_material","_quadtree","_bladeWidth","_bladeHeight","terrain","bladeWidth","bladeHeight","albedoMap","ClipmapGrassMaterial","albedoTexture","setTextureSize","width","height","createBaseVertexBuffer","GrassQuadtreeNode","_getIndexBuffer","quadtree","updateMaterial","uniformChanged","setAlbedoMap","getAlbedoMap","val","setBladeSize","createIndexBuffer","Uint16Array","r","t","c","PI","s","vertices","createInterleavedVertexBuffer","ctx","region","minY","maxY","apply","pass","numPasses","bind","camera","GrassRenderer","_terrain","_numGrassBlades","_layers","DWeakRef","layer","numGrassBlades","numLayers","getLayer","index","addLayer","getGrassTexture","setGrassTexture","texture","grassLayer","console","error","getBladeWidth","getBladeHeight","bv","getWorldBoundingVolume","toAABB","minPoint","maxPoint","worldRegion","_cullAABB","AABB","_grassInstances","_children","_minX","_minZ","_maxX","_maxZ","grassInstances","children","skipClipTest","cullAABB","z","dx","dz","w","setXYZ","clipState","clipMask","getClipStateWithFrustumMask","frustum","getClipStateWithFrustum","ClipState","NOT_CLIPPED","A_INSIDE_B","child","n","min","slice","childInstances","filter"],"mappings":"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"}
|
|
@@ -14,6 +14,7 @@ import '../../material/pbrsg.js';
|
|
|
14
14
|
import '../../material/pbrblueprint.js';
|
|
15
15
|
import '../../material/sprite.js';
|
|
16
16
|
import '../../material/sprite_std.js';
|
|
17
|
+
import '../../material/msdf_text.js';
|
|
17
18
|
import '../../utility/blueprint/material/texture.js';
|
|
18
19
|
import { mixinPBRMetallicRoughness } from '../../material/mixins/lightmodel/pbrmetallicroughness.js';
|
|
19
20
|
import { mixinFoliage } from '../../material/mixins/foliage.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grassmaterial.js","sources":["../../../src/scene/terrain-cm/grassmaterial.ts"],"sourcesContent":["import type { Clonable } from '@zephyr3d/base';\r\nimport { Vector2, Vector4, DWeakRef } from '@zephyr3d/base';\r\nimport type { BindGroup, PBFunctionScope, RenderStateSet } from '@zephyr3d/device';\r\nimport {\r\n applyMaterialMixins,\r\n MeshMaterial,\r\n mixinFoliage,\r\n mixinPBRMetallicRoughness,\r\n ShaderHelper\r\n} from '../../material';\r\nimport type { DrawContext } from '../../render';\r\nimport { RENDER_PASS_TYPE_LIGHT } from '../../values';\r\nimport type { ClipmapTerrain } from './terrain-cm';\r\nimport { fetchSampler } from '../../utility/misc';\r\n\r\n/**\r\n * Terrain grass material\r\n * @public\r\n */\r\nexport class ClipmapGrassMaterial\r\n extends applyMaterialMixins(MeshMaterial, mixinPBRMetallicRoughness, mixinFoliage)\r\n implements Clonable<ClipmapGrassMaterial>\r\n{\r\n /** @internal */\r\n private readonly _terrain: DWeakRef<ClipmapTerrain>;\r\n /** @internal */\r\n private readonly _terrainPosScale: Vector4;\r\n /** @internal */\r\n private readonly _heightMapSize: Vector2;\r\n /** @internal */\r\n private readonly _textureSize: Vector2;\r\n /**\r\n * Creates an instance of GrassMaterial class\r\n * @param terrain - Clipmap terrain object\r\n * @param heightMap - height map\r\n * @param grassTexture - grass texture\r\n */\r\n constructor(terrain: ClipmapTerrain) {\r\n super();\r\n this.metallic = 0;\r\n this.roughness = 1;\r\n this.doubleSidedLighting = false;\r\n this.specularFactor = new Vector4(1, 1, 1, 0.2);\r\n this._terrain = new DWeakRef(terrain);\r\n this._terrainPosScale = new Vector4();\r\n this._heightMapSize = new Vector2(1 / terrain.heightMap!.width, 1 / terrain.heightMap!.height);\r\n this._textureSize = Vector2.one();\r\n }\r\n clone() {\r\n const other = new ClipmapGrassMaterial(this._terrain.get()!);\r\n other.copyFrom(this);\r\n return other;\r\n }\r\n copyFrom(other: this) {\r\n super.copyFrom(other);\r\n this._terrainPosScale.set(other._terrainPosScale);\r\n this._heightMapSize.set(other._heightMapSize);\r\n this._textureSize.set(other._textureSize);\r\n }\r\n setTextureSize(w: number, h: number) {\r\n this._textureSize.setXY(w, h);\r\n this.uniformChanged();\r\n }\r\n /**\r\n * {@inheritDoc MeshMaterial.isTransparentPass}\r\n * @override\r\n */\r\n isTransparentPass(_pass: number) {\r\n return false;\r\n }\r\n /**\r\n * {@inheritDoc Material.supportLighting}\r\n * @override\r\n */\r\n supportLighting() {\r\n return true;\r\n }\r\n /**\r\n * {@inheritDoc Material.supportInstancing}\r\n * @override\r\n */\r\n supportInstancing() {\r\n return false;\r\n }\r\n applyUniformValues(bindGroup: BindGroup, ctx: DrawContext, pass: number) {\r\n super.applyUniformValues(bindGroup, ctx, pass);\r\n const terrain = this._terrain.get()!;\r\n this._terrainPosScale.setXYZW(terrain.scale.x, terrain.scale.y, terrain.scale.z, terrain.worldMatrix.m13);\r\n bindGroup.setTexture('terrainHeightMap', terrain.heightMap!, fetchSampler('clamp_linear_nomip'));\r\n bindGroup.setValue('heightMapSize', this._heightMapSize);\r\n bindGroup.setValue('terrainRegion', terrain.worldRegion);\r\n bindGroup.setValue('terrainPosScale', this._terrainPosScale);\r\n if (this.needFragmentColor(ctx)) {\r\n bindGroup.setValue('albedoTextureSize', this._textureSize);\r\n }\r\n }\r\n vertexShader(scope: PBFunctionScope) {\r\n super.vertexShader(scope);\r\n const pb = scope.$builder;\r\n scope.$inputs.pos = pb.vec3().attrib('position');\r\n scope.$inputs.albedoUV = pb.vec2().attrib('texCoord0');\r\n scope.$inputs.placement = pb.vec4().attrib('texCoord1');\r\n scope.terrainHeightMap = pb.tex2D().uniform(2);\r\n scope.heightMapSize = pb.vec2().uniform(2);\r\n scope.terrainRegion = pb.vec4().uniform(2);\r\n scope.terrainPosScale = pb.vec4().uniform(2);\r\n\r\n pb.func('calcHeightMapNormal', [pb.vec2('uv'), pb.vec2('texelSize'), pb.vec3('scale')], function () {\r\n this.$l.hL = pb.textureSampleLevel(\r\n this.terrainHeightMap,\r\n pb.sub(this.uv, pb.vec2(this.texelSize.x, 0)),\r\n 0\r\n ).r;\r\n this.$l.hR = pb.textureSampleLevel(\r\n this.terrainHeightMap,\r\n pb.add(this.uv, pb.vec2(this.texelSize.x, 0)),\r\n 0\r\n ).r;\r\n this.$l.hD = pb.textureSampleLevel(\r\n this.terrainHeightMap,\r\n pb.add(this.uv, pb.vec2(0, this.texelSize.y)),\r\n 0\r\n ).r;\r\n this.$l.hU = pb.textureSampleLevel(\r\n this.terrainHeightMap,\r\n pb.sub(this.uv, pb.vec2(0, this.texelSize.y)),\r\n 0\r\n ).r;\r\n this.$l.dHdU = pb.div(pb.mul(pb.sub(this.hR, this.hL), this.scale.y), pb.mul(this.scale.x, 2));\r\n this.$l.dHdV = pb.div(pb.mul(pb.sub(this.hD, this.hU), this.scale.y), pb.mul(this.scale.z, 2));\r\n this.t = pb.normalize(pb.vec3(1, this.dHdU, 0));\r\n this.b = pb.normalize(pb.vec3(0, this.dHdV, 1));\r\n this.$return(pb.normalize(pb.cross(this.b, this.t)));\r\n });\r\n\r\n scope.$l.uv = scope.$inputs.placement.xy;\r\n scope.$l.heightSample = pb.textureSampleLevel(scope.terrainHeightMap, scope.uv, 0);\r\n scope.$l.height = pb.add(pb.mul(scope.heightSample.r, scope.terrainPosScale.y), scope.terrainPosScale.w);\r\n scope.$l.normal = scope.calcHeightMapNormal(scope.uv, scope.heightMapSize, scope.terrainPosScale.xyz);\r\n scope.$l.axisX = pb.vec3(scope.$inputs.placement.z, 0, scope.$inputs.placement.w);\r\n scope.$l.axisZ = pb.cross(scope.axisX, scope.normal);\r\n scope.$l.axisX = pb.cross(scope.normal, scope.axisZ);\r\n scope.$l.rotPos = pb.mul(pb.mat3(scope.axisX, scope.normal, scope.axisZ), scope.$inputs.pos);\r\n scope.$l.posXZ = pb.add(\r\n pb.mul(scope.$inputs.placement.xy, pb.sub(scope.terrainRegion.zw, scope.terrainRegion.xy)),\r\n scope.terrainRegion.xy\r\n );\r\n scope.$outputs.zAlbedoTexCoord = scope.$inputs.albedoUV;\r\n scope.$outputs.worldPos = pb.add(scope.rotPos, pb.vec3(scope.posXZ.x, scope.height, scope.posXZ.y));\r\n ShaderHelper.setClipSpacePosition(\r\n scope,\r\n pb.mul(ShaderHelper.getViewProjectionMatrix(scope), pb.vec4(scope.$outputs.worldPos, 1))\r\n );\r\n scope.$outputs.worldNorm = scope.normal;\r\n ShaderHelper.resolveMotionVector(scope, scope.$outputs.worldPos, scope.$outputs.worldPos);\r\n }\r\n fragmentShader(scope: PBFunctionScope) {\r\n super.fragmentShader(scope);\r\n const pb = scope.$builder;\r\n const that = this;\r\n if (this.needFragmentColor()) {\r\n scope.albedoTextureSize = pb.vec2().uniform(2);\r\n scope.$l.albedo = this.calculateAlbedoColor(scope);\r\n scope.albedo = that.calculateFoliageAlbedo(\r\n scope,\r\n scope.albedo,\r\n pb.mul(that.getAlbedoTexCoord(scope), scope.albedoTextureSize)\r\n );\r\n scope.$l.litColor = pb.vec3(0);\r\n if (this.drawContext.renderPass!.type === RENDER_PASS_TYPE_LIGHT) {\r\n scope.$l.normalInfo = this.calculateNormalAndTBN(\r\n scope,\r\n scope.$inputs.worldPos,\r\n scope.$inputs.worldNorm\r\n );\r\n scope.$l.viewVec = this.calculateViewVector(scope, scope.$inputs.worldPos);\r\n scope.$l.litColor = this.PBRLight(\r\n scope,\r\n scope.$inputs.worldPos,\r\n scope.normalInfo.normal,\r\n scope.viewVec,\r\n scope.albedo,\r\n scope.normalInfo.TBN\r\n );\r\n }\r\n this.outputFragmentColor(scope, scope.$inputs.worldPos, pb.vec4(scope.litColor, scope.albedo.a));\r\n } else {\r\n this.outputFragmentColor(scope, scope.$inputs.worldPos, null);\r\n }\r\n }\r\n apply(ctx: DrawContext) {\r\n this.alphaToCoverage = ctx.device.getFrameBufferSampleCount() > 1;\r\n this.alphaCutoff = this.alphaToCoverage ? 1 : 0.8;\r\n return super.apply(ctx);\r\n }\r\n protected updateRenderStates(pass: number, stateSet: RenderStateSet, ctx: DrawContext) {\r\n super.updateRenderStates(pass, stateSet, ctx);\r\n stateSet.useRasterizerState().setCullMode('none');\r\n }\r\n}\r\n"],"names":["ClipmapGrassMaterial","applyMaterialMixins","MeshMaterial","mixinPBRMetallicRoughness","mixinFoliage","terrain","metallic","roughness","doubleSidedLighting","specularFactor","Vector4","_terrain","DWeakRef","_terrainPosScale","_heightMapSize","Vector2","heightMap","width","height","_textureSize","one","clone","other","get","copyFrom","set","setTextureSize","w","h","setXY","uniformChanged","isTransparentPass","_pass","supportLighting","supportInstancing","applyUniformValues","bindGroup","ctx","pass","setXYZW","scale","x","y","z","worldMatrix","m13","setTexture","fetchSampler","setValue","worldRegion","needFragmentColor","vertexShader","scope","pb","$builder","$inputs","pos","vec3","attrib","albedoUV","vec2","placement","vec4","terrainHeightMap","tex2D","uniform","heightMapSize","terrainRegion","terrainPosScale","func","$l","hL","textureSampleLevel","sub","uv","texelSize","r","hR","add","hD","hU","dHdU","div","mul","dHdV","t","normalize","b","$return","cross","xy","heightSample","normal","calcHeightMapNormal","xyz","axisX","axisZ","rotPos","mat3","posXZ","zw","$outputs","zAlbedoTexCoord","worldPos","ShaderHelper","setClipSpacePosition","getViewProjectionMatrix","worldNorm","resolveMotionVector","fragmentShader","that","albedoTextureSize","albedo","calculateAlbedoColor","calculateFoliageAlbedo","getAlbedoTexCoord","litColor","drawContext","renderPass","type","RENDER_PASS_TYPE_LIGHT","normalInfo","calculateNormalAndTBN","viewVec","calculateViewVector","PBRLight","TBN","outputFragmentColor","a","apply","alphaToCoverage","device","getFrameBufferSampleCount","alphaCutoff","updateRenderStates","stateSet","useRasterizerState","setCullMode"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"grassmaterial.js","sources":["../../../src/scene/terrain-cm/grassmaterial.ts"],"sourcesContent":["import type { Clonable } from '@zephyr3d/base';\r\nimport { Vector2, Vector4, DWeakRef } from '@zephyr3d/base';\r\nimport type { BindGroup, PBFunctionScope, RenderStateSet } from '@zephyr3d/device';\r\nimport {\r\n applyMaterialMixins,\r\n MeshMaterial,\r\n mixinFoliage,\r\n mixinPBRMetallicRoughness,\r\n ShaderHelper\r\n} from '../../material';\r\nimport type { DrawContext } from '../../render';\r\nimport { RENDER_PASS_TYPE_LIGHT } from '../../values';\r\nimport type { ClipmapTerrain } from './terrain-cm';\r\nimport { fetchSampler } from '../../utility/misc';\r\n\r\n/**\r\n * Terrain grass material\r\n * @public\r\n */\r\nexport class ClipmapGrassMaterial\r\n extends applyMaterialMixins(MeshMaterial, mixinPBRMetallicRoughness, mixinFoliage)\r\n implements Clonable<ClipmapGrassMaterial>\r\n{\r\n /** @internal */\r\n private readonly _terrain: DWeakRef<ClipmapTerrain>;\r\n /** @internal */\r\n private readonly _terrainPosScale: Vector4;\r\n /** @internal */\r\n private readonly _heightMapSize: Vector2;\r\n /** @internal */\r\n private readonly _textureSize: Vector2;\r\n /**\r\n * Creates an instance of GrassMaterial class\r\n * @param terrain - Clipmap terrain object\r\n * @param heightMap - height map\r\n * @param grassTexture - grass texture\r\n */\r\n constructor(terrain: ClipmapTerrain) {\r\n super();\r\n this.metallic = 0;\r\n this.roughness = 1;\r\n this.doubleSidedLighting = false;\r\n this.specularFactor = new Vector4(1, 1, 1, 0.2);\r\n this._terrain = new DWeakRef(terrain);\r\n this._terrainPosScale = new Vector4();\r\n this._heightMapSize = new Vector2(1 / terrain.heightMap!.width, 1 / terrain.heightMap!.height);\r\n this._textureSize = Vector2.one();\r\n }\r\n clone() {\r\n const other = new ClipmapGrassMaterial(this._terrain.get()!);\r\n other.copyFrom(this);\r\n return other;\r\n }\r\n copyFrom(other: this) {\r\n super.copyFrom(other);\r\n this._terrainPosScale.set(other._terrainPosScale);\r\n this._heightMapSize.set(other._heightMapSize);\r\n this._textureSize.set(other._textureSize);\r\n }\r\n setTextureSize(w: number, h: number) {\r\n this._textureSize.setXY(w, h);\r\n this.uniformChanged();\r\n }\r\n /**\r\n * {@inheritDoc MeshMaterial.isTransparentPass}\r\n * @override\r\n */\r\n isTransparentPass(_pass: number) {\r\n return false;\r\n }\r\n /**\r\n * {@inheritDoc Material.supportLighting}\r\n * @override\r\n */\r\n supportLighting() {\r\n return true;\r\n }\r\n /**\r\n * {@inheritDoc Material.supportInstancing}\r\n * @override\r\n */\r\n supportInstancing() {\r\n return false;\r\n }\r\n applyUniformValues(bindGroup: BindGroup, ctx: DrawContext, pass: number) {\r\n super.applyUniformValues(bindGroup, ctx, pass);\r\n const terrain = this._terrain.get()!;\r\n this._terrainPosScale.setXYZW(terrain.scale.x, terrain.scale.y, terrain.scale.z, terrain.worldMatrix.m13);\r\n bindGroup.setTexture('terrainHeightMap', terrain.heightMap!, fetchSampler('clamp_linear_nomip'));\r\n bindGroup.setValue('heightMapSize', this._heightMapSize);\r\n bindGroup.setValue('terrainRegion', terrain.worldRegion);\r\n bindGroup.setValue('terrainPosScale', this._terrainPosScale);\r\n if (this.needFragmentColor(ctx)) {\r\n bindGroup.setValue('albedoTextureSize', this._textureSize);\r\n }\r\n }\r\n vertexShader(scope: PBFunctionScope) {\r\n super.vertexShader(scope);\r\n const pb = scope.$builder;\r\n scope.$inputs.pos = pb.vec3().attrib('position');\r\n scope.$inputs.albedoUV = pb.vec2().attrib('texCoord0');\r\n scope.$inputs.placement = pb.vec4().attrib('texCoord1');\r\n scope.terrainHeightMap = pb.tex2D().uniform(2);\r\n scope.heightMapSize = pb.vec2().uniform(2);\r\n scope.terrainRegion = pb.vec4().uniform(2);\r\n scope.terrainPosScale = pb.vec4().uniform(2);\r\n\r\n pb.func('calcHeightMapNormal', [pb.vec2('uv'), pb.vec2('texelSize'), pb.vec3('scale')], function () {\r\n this.$l.hL = pb.textureSampleLevel(\r\n this.terrainHeightMap,\r\n pb.sub(this.uv, pb.vec2(this.texelSize.x, 0)),\r\n 0\r\n ).r;\r\n this.$l.hR = pb.textureSampleLevel(\r\n this.terrainHeightMap,\r\n pb.add(this.uv, pb.vec2(this.texelSize.x, 0)),\r\n 0\r\n ).r;\r\n this.$l.hD = pb.textureSampleLevel(\r\n this.terrainHeightMap,\r\n pb.add(this.uv, pb.vec2(0, this.texelSize.y)),\r\n 0\r\n ).r;\r\n this.$l.hU = pb.textureSampleLevel(\r\n this.terrainHeightMap,\r\n pb.sub(this.uv, pb.vec2(0, this.texelSize.y)),\r\n 0\r\n ).r;\r\n this.$l.dHdU = pb.div(pb.mul(pb.sub(this.hR, this.hL), this.scale.y), pb.mul(this.scale.x, 2));\r\n this.$l.dHdV = pb.div(pb.mul(pb.sub(this.hD, this.hU), this.scale.y), pb.mul(this.scale.z, 2));\r\n this.t = pb.normalize(pb.vec3(1, this.dHdU, 0));\r\n this.b = pb.normalize(pb.vec3(0, this.dHdV, 1));\r\n this.$return(pb.normalize(pb.cross(this.b, this.t)));\r\n });\r\n\r\n scope.$l.uv = scope.$inputs.placement.xy;\r\n scope.$l.heightSample = pb.textureSampleLevel(scope.terrainHeightMap, scope.uv, 0);\r\n scope.$l.height = pb.add(pb.mul(scope.heightSample.r, scope.terrainPosScale.y), scope.terrainPosScale.w);\r\n scope.$l.normal = scope.calcHeightMapNormal(scope.uv, scope.heightMapSize, scope.terrainPosScale.xyz);\r\n scope.$l.axisX = pb.vec3(scope.$inputs.placement.z, 0, scope.$inputs.placement.w);\r\n scope.$l.axisZ = pb.cross(scope.axisX, scope.normal);\r\n scope.$l.axisX = pb.cross(scope.normal, scope.axisZ);\r\n scope.$l.rotPos = pb.mul(pb.mat3(scope.axisX, scope.normal, scope.axisZ), scope.$inputs.pos);\r\n scope.$l.posXZ = pb.add(\r\n pb.mul(scope.$inputs.placement.xy, pb.sub(scope.terrainRegion.zw, scope.terrainRegion.xy)),\r\n scope.terrainRegion.xy\r\n );\r\n scope.$outputs.zAlbedoTexCoord = scope.$inputs.albedoUV;\r\n scope.$outputs.worldPos = pb.add(scope.rotPos, pb.vec3(scope.posXZ.x, scope.height, scope.posXZ.y));\r\n ShaderHelper.setClipSpacePosition(\r\n scope,\r\n pb.mul(ShaderHelper.getViewProjectionMatrix(scope), pb.vec4(scope.$outputs.worldPos, 1))\r\n );\r\n scope.$outputs.worldNorm = scope.normal;\r\n ShaderHelper.resolveMotionVector(scope, scope.$outputs.worldPos, scope.$outputs.worldPos);\r\n }\r\n fragmentShader(scope: PBFunctionScope) {\r\n super.fragmentShader(scope);\r\n const pb = scope.$builder;\r\n const that = this;\r\n if (this.needFragmentColor()) {\r\n scope.albedoTextureSize = pb.vec2().uniform(2);\r\n scope.$l.albedo = this.calculateAlbedoColor(scope);\r\n scope.albedo = that.calculateFoliageAlbedo(\r\n scope,\r\n scope.albedo,\r\n pb.mul(that.getAlbedoTexCoord(scope), scope.albedoTextureSize)\r\n );\r\n scope.$l.litColor = pb.vec3(0);\r\n if (this.drawContext.renderPass!.type === RENDER_PASS_TYPE_LIGHT) {\r\n scope.$l.normalInfo = this.calculateNormalAndTBN(\r\n scope,\r\n scope.$inputs.worldPos,\r\n scope.$inputs.worldNorm\r\n );\r\n scope.$l.viewVec = this.calculateViewVector(scope, scope.$inputs.worldPos);\r\n scope.$l.litColor = this.PBRLight(\r\n scope,\r\n scope.$inputs.worldPos,\r\n scope.normalInfo.normal,\r\n scope.viewVec,\r\n scope.albedo,\r\n scope.normalInfo.TBN\r\n );\r\n }\r\n this.outputFragmentColor(scope, scope.$inputs.worldPos, pb.vec4(scope.litColor, scope.albedo.a));\r\n } else {\r\n this.outputFragmentColor(scope, scope.$inputs.worldPos, null);\r\n }\r\n }\r\n apply(ctx: DrawContext) {\r\n this.alphaToCoverage = ctx.device.getFrameBufferSampleCount() > 1;\r\n this.alphaCutoff = this.alphaToCoverage ? 1 : 0.8;\r\n return super.apply(ctx);\r\n }\r\n protected updateRenderStates(pass: number, stateSet: RenderStateSet, ctx: DrawContext) {\r\n super.updateRenderStates(pass, stateSet, ctx);\r\n stateSet.useRasterizerState().setCullMode('none');\r\n }\r\n}\r\n"],"names":["ClipmapGrassMaterial","applyMaterialMixins","MeshMaterial","mixinPBRMetallicRoughness","mixinFoliage","terrain","metallic","roughness","doubleSidedLighting","specularFactor","Vector4","_terrain","DWeakRef","_terrainPosScale","_heightMapSize","Vector2","heightMap","width","height","_textureSize","one","clone","other","get","copyFrom","set","setTextureSize","w","h","setXY","uniformChanged","isTransparentPass","_pass","supportLighting","supportInstancing","applyUniformValues","bindGroup","ctx","pass","setXYZW","scale","x","y","z","worldMatrix","m13","setTexture","fetchSampler","setValue","worldRegion","needFragmentColor","vertexShader","scope","pb","$builder","$inputs","pos","vec3","attrib","albedoUV","vec2","placement","vec4","terrainHeightMap","tex2D","uniform","heightMapSize","terrainRegion","terrainPosScale","func","$l","hL","textureSampleLevel","sub","uv","texelSize","r","hR","add","hD","hU","dHdU","div","mul","dHdV","t","normalize","b","$return","cross","xy","heightSample","normal","calcHeightMapNormal","xyz","axisX","axisZ","rotPos","mat3","posXZ","zw","$outputs","zAlbedoTexCoord","worldPos","ShaderHelper","setClipSpacePosition","getViewProjectionMatrix","worldNorm","resolveMotionVector","fragmentShader","that","albedoTextureSize","albedo","calculateAlbedoColor","calculateFoliageAlbedo","getAlbedoTexCoord","litColor","drawContext","renderPass","type","RENDER_PASS_TYPE_LIGHT","normalInfo","calculateNormalAndTBN","viewVec","calculateViewVector","PBRLight","TBN","outputFragmentColor","a","apply","alphaToCoverage","device","getFrameBufferSampleCount","alphaCutoff","updateRenderStates","stateSet","useRasterizerState","setCullMode"],"mappings":"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"}
|
|
@@ -20,6 +20,7 @@ import '../../material/pbrsg.js';
|
|
|
20
20
|
import '../../material/pbrblueprint.js';
|
|
21
21
|
import '../../material/sprite.js';
|
|
22
22
|
import '../../material/sprite_std.js';
|
|
23
|
+
import '../../material/msdf_text.js';
|
|
23
24
|
import '../../utility/blueprint/material/texture.js';
|
|
24
25
|
import { fetchSampler } from '../../utility/misc.js';
|
|
25
26
|
import '../../render/rendergraph/forward_plus_builder.js';
|