@drawcall/lod 0.4.0 → 0.5.1

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.
Files changed (119) hide show
  1. package/dist/at.js.map +1 -1
  2. package/dist/bake.js.map +1 -1
  3. package/dist/baked/codec.js.map +1 -1
  4. package/dist/baked/coverage.js.map +1 -1
  5. package/dist/baked/fields.js.map +1 -1
  6. package/dist/baked/index.js.map +1 -1
  7. package/dist/baked/interior/faces.js.map +1 -1
  8. package/dist/baked/interior/material.js.map +1 -1
  9. package/dist/baked/interior/rooms.js.map +1 -1
  10. package/dist/baked/low.js.map +1 -1
  11. package/dist/baked/raster.js.map +1 -1
  12. package/dist/baked/textures.js.map +1 -1
  13. package/dist/baked/transfer.js.map +1 -1
  14. package/dist/baked/unwrap.js.map +1 -1
  15. package/dist/baked/xatlas.js.map +1 -1
  16. package/dist/codec/container.js.map +1 -1
  17. package/dist/codec/mesh.js.map +1 -1
  18. package/dist/dispose.js.map +1 -1
  19. package/dist/foliage.js.map +1 -1
  20. package/dist/impostor/bake/atlas.js.map +1 -1
  21. package/dist/impostor/bake/fit.js.map +1 -1
  22. package/dist/impostor/bake/index.js.map +1 -1
  23. package/dist/impostor/bake/materials.js.map +1 -1
  24. package/dist/impostor/bake/sheet.js.map +1 -1
  25. package/dist/impostor/bake/source.js.map +1 -1
  26. package/dist/impostor/codec.js.map +1 -1
  27. package/dist/impostor/impostor.js.map +1 -1
  28. package/dist/impostor/ktx2/encode.js.map +1 -1
  29. package/dist/impostor/ktx2/transcode.js.map +1 -1
  30. package/dist/impostor/ktx2/uastc.js.map +1 -1
  31. package/dist/impostor/ktx2/wasm/encoder.js.map +1 -1
  32. package/dist/impostor/ktx2/wasm/transcoder.js.map +1 -1
  33. package/dist/impostor/ktx2/worker.js.map +1 -1
  34. package/dist/impostor/mesh/card.js.map +1 -1
  35. package/dist/impostor/mesh/index.js.map +1 -1
  36. package/dist/impostor/mesh/material.js.map +1 -1
  37. package/dist/impostor/mesh/surface.js.map +1 -1
  38. package/dist/impostor/mesh/textures.js.map +1 -1
  39. package/dist/impostor/octahedral.js.map +1 -1
  40. package/dist/index.d.ts +1 -1
  41. package/dist/index.js.map +1 -1
  42. package/dist/instanced/camera.js.map +1 -1
  43. package/dist/instanced/clusters.d.ts +18 -4
  44. package/dist/instanced/clusters.js +32 -11
  45. package/dist/instanced/clusters.js.map +1 -1
  46. package/dist/instanced/cull.js.map +1 -1
  47. package/dist/instanced/instances.js.map +1 -1
  48. package/dist/instanced/key.js.map +1 -1
  49. package/dist/instanced/levels.js.map +1 -1
  50. package/dist/instanced/lists.d.ts +4 -1
  51. package/dist/instanced/lists.js +4 -2
  52. package/dist/instanced/lists.js.map +1 -1
  53. package/dist/instanced/measure.js.map +1 -1
  54. package/dist/instanced/meshes.js.map +1 -1
  55. package/dist/instanced/mirror.js.map +1 -1
  56. package/dist/instanced/raycast.js.map +1 -1
  57. package/dist/instanced/rows.d.ts +8 -1
  58. package/dist/instanced/rows.js +10 -2
  59. package/dist/instanced/rows.js.map +1 -1
  60. package/dist/instanced/shape.js.map +1 -1
  61. package/dist/instanced/sort.d.ts +8 -4
  62. package/dist/instanced/sort.js +27 -21
  63. package/dist/instanced/sort.js.map +1 -1
  64. package/dist/instanced/update.d.ts +4 -3
  65. package/dist/instanced/update.js +20 -14
  66. package/dist/instanced/update.js.map +1 -1
  67. package/dist/levels/bounds.js.map +1 -1
  68. package/dist/levels/cameras.js.map +1 -1
  69. package/dist/levels/compile/contexts.js.map +1 -1
  70. package/dist/levels/compile/index.js.map +1 -1
  71. package/dist/levels/compile/pipelines.js.map +1 -1
  72. package/dist/levels/compiles.js.map +1 -1
  73. package/dist/levels/draw.js.map +1 -1
  74. package/dist/levels/fade.js.map +1 -1
  75. package/dist/levels/index.js.map +1 -1
  76. package/dist/levels/item.js.map +1 -1
  77. package/dist/levels/load.js.map +1 -1
  78. package/dist/levels/manager.js.map +1 -1
  79. package/dist/levels/material.js.map +1 -1
  80. package/dist/levels/renderer.js.map +1 -1
  81. package/dist/levels/requests.js.map +1 -1
  82. package/dist/levels/screen.js.map +1 -1
  83. package/dist/loader/build.js.map +1 -1
  84. package/dist/loader/context.js.map +1 -1
  85. package/dist/loader/entry.js.map +1 -1
  86. package/dist/loader/index.js.map +1 -1
  87. package/dist/loader/level.js.map +1 -1
  88. package/dist/loader/node.js.map +1 -1
  89. package/dist/loader/request.js.map +1 -1
  90. package/dist/loader/url.js.map +1 -1
  91. package/dist/lod.js +1 -0
  92. package/dist/lod.js.map +1 -1
  93. package/dist/meshopt.js.map +1 -1
  94. package/dist/node-process.js.map +1 -1
  95. package/dist/node.js.map +1 -1
  96. package/dist/simplify/cards.js.map +1 -1
  97. package/dist/simplify/index.js.map +1 -1
  98. package/dist/source/detail.d.ts +1 -1
  99. package/dist/source/detail.js +3 -1
  100. package/dist/source/detail.js.map +1 -1
  101. package/dist/source/deviation.js.map +1 -1
  102. package/dist/source/evaluator.js.map +1 -1
  103. package/dist/source/frame.js.map +1 -1
  104. package/dist/source/raycaster.js.map +1 -1
  105. package/dist/source/sampler.js.map +1 -1
  106. package/dist/source/source.js.map +1 -1
  107. package/dist/source/surface.js.map +1 -1
  108. package/dist/task.js.map +1 -1
  109. package/dist/three.d.ts +2 -1
  110. package/dist/three.js +1 -0
  111. package/dist/three.js.map +1 -1
  112. package/dist/tsl.js.map +1 -1
  113. package/dist/typegpu.js.map +1 -1
  114. package/dist/wind/bounds.js.map +1 -1
  115. package/dist/wind/hooks.js.map +1 -1
  116. package/dist/wind/index.js.map +1 -1
  117. package/dist/wind/sway.js.map +1 -1
  118. package/package.json +1 -1
  119. package/skills/lod/SKILL.md +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"cull.js","sourceRoot":"","sources":["../../src/instanced/cull.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,OAAO,EAAe,MAAM,cAAc,CAAC;AAwB7D,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B;;;GAGG;AACH,MAAM,UAAU,MAAM,CAAC,YAAiC,EAAE,KAAc,EAAE,MAAY;IACpF,IAAI,CAAC,YAAY;QAAE,OAAO,IAAI,CAAC;IAC/B,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,cAAc,GAAG,KAAK,EAAE,GAAG,YAAY,CAAC;IACnE,IAAI,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,GAAG,GAAG,IAAI,CAAC;QAC7E,MAAM,IAAI,UAAU,CAAC,6DAA6D,IAAI,QAAQ,GAAG,EAAE,CAAC,CAAC;IACvG,MAAM,KAAK,GAAG,KAAK,CAAC,iBAAiB,EAAE,CAAC;IACxC,MAAM,CAAC,GAAG,CAAC,qBAAqB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;IAChG,MAAM,CAAC,IAAI,GAAG,IAAI,GAAG,KAAK,CAAC;IAC3B,MAAM,CAAC,GAAG,GAAG,GAAG,GAAG,KAAK,CAAC;IACzB,MAAM,CAAC,SAAS,GAAG,cAAc,CAAC;IAClC,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,2CAA2C;AAC3C,MAAM,CAAC,MAAM,SAAS,GAAG,GAAS,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC"}
1
+ {"version":3,"file":"cull.js","sourceRoot":"","sources":["../../src/instanced/cull.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,OAAO,EAAe,MAAM,cAAc,CAAC;AAwB7D,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B;;;GAGG;AACH,MAAM,UAAU,MAAM,CAAC,YAAiC,EAAE,KAAc,EAAE,MAAY;IACpF,IAAI,CAAC,YAAY;QAAE,OAAO,IAAI,CAAC;IAC/B,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,cAAc,GAAG,KAAK,EAAE,GAAG,YAAY,CAAC;IACnE,IAAI,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,GAAG,GAAG,IAAI,CAAC;QAC7E,MAAM,IAAI,UAAU,CAAC,6DAA6D,IAAI,QAAQ,GAAG,EAAE,CAAC,CAAC;IACvG,MAAM,KAAK,GAAG,KAAK,CAAC,iBAAiB,EAAE,CAAC;IACxC,MAAM,CAAC,GAAG,CAAC,qBAAqB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;IAChG,MAAM,CAAC,IAAI,GAAG,IAAI,GAAG,KAAK,CAAC;IAC3B,MAAM,CAAC,GAAG,GAAG,GAAG,GAAG,KAAK,CAAC;IACzB,MAAM,CAAC,SAAS,GAAG,cAAc,CAAC;IAClC,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,2CAA2C;AAC3C,MAAM,CAAC,MAAM,SAAS,GAAG,GAAS,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC","sourcesContent":["import { Matrix4, Vector3, type Camera } from \"three/webgpu\";\n\n/**\n * How a Lod thins its instances out with distance from `camera`, in every camera, as Fog does: every instance\n * draws up to `near` from it, none from `far` on, and in between a share falling linearly, chosen by a hash of each\n * instance's origin (its matrix's translation), the same on the CPU and the GPU. An instance whose translation changes\n * rolls a new value: it may appear or vanish as it moves. With `scaleSurvivors`, the instances drawn grow by 1/√share,\n * up to `MAX_SURVIVOR_SCALE` (8), so a thinned field stays about as covered.\n */\nexport interface CullDistance {\n camera: Camera;\n near: number;\n far: number;\n scaleSurvivors?: boolean;\n}\n\n/** cullDistance in the Lod's space. */\nexport interface Cull {\n eye: Vector3;\n near: number;\n far: number;\n survivors: boolean;\n}\n\nconst inverse = new Matrix4();\n\n/**\n * `cullDistance`, checked, in the space of `space`, a Lod's world matrix, written into `target`; null for\n * none. Nothing holds on to what it answers past a sort: the sort and its keys copy its values.\n */\nexport function cullIn(cullDistance: CullDistance | null, space: Matrix4, target: Cull): Cull | null {\n if (!cullDistance) return null;\n const { camera, near, far, scaleSurvivors = false } = cullDistance;\n if (!(Number.isFinite(near) && Number.isFinite(far) && near >= 0 && far > near))\n throw new RangeError(`Lod: cullDistance needs 0 <= near < far, both finite, got ${near} and ${far}`);\n const scale = space.getMaxScaleOnAxis();\n target.eye.setFromMatrixPosition(camera.matrixWorld).applyMatrix4(inverse.copy(space).invert());\n target.near = near / scale;\n target.far = far / scale;\n target.survivors = scaleSurvivors;\n return target;\n}\n\n/** A Cull to write into (see `cullIn`). */\nexport const emptyCull = (): Cull => ({ eye: new Vector3(), near: 0, far: 0, survivors: false });\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"instances.js","sourceRoot":"","sources":["../../src/instanced/instances.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"instances.js","sourceRoot":"","sources":["../../src/instanced/instances.ts"],"names":[],"mappings":"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","sourcesContent":["import { Box3, Matrix4, Vector3, type InstancedBufferAttribute, type StorageInstancedBufferAttribute } from \"three/webgpu\";\nimport { white } from \"../levels/fade.js\";\nimport { isStorageInstanced, stretch } from \"../three.js\";\nimport { ColorMirror, Mirror } from \"./mirror.js\";\n\n// What the GPU reads of a Lod's instances: its attributes as storage, read in place or mirrored from the CPU, taken in\n// as they are at each update, and what the CPU measures of a CPU instanceMatrix.\n\n/** A Lod's instancing data, as an InstancedMesh holds it. */\nexport interface InstanceAttributes {\n readonly instanceMatrix: InstancedBufferAttribute;\n readonly instanceColor: InstancedBufferAttribute | null;\n readonly count: number;\n}\n\n/** Of a CPU instanceMatrix's first `count` instances at a scale above 0: their origins' box and scales. */\nexport interface Measured {\n readonly originBox: Box3;\n /** No matrix scales its longest axis less. */\n minScale: number;\n /** No matrix stretches any direction more. */\n maxScale: number;\n}\n\nconst matrix = new Matrix4();\nconst origin = new Vector3();\n\n/** A Lod's instances as storage. */\nexport class Instances {\n /** Bumped whenever what the storage holds, or how many instances there are, may have changed. */\n version = 0;\n /** Measured from a CPU instanceMatrix as it changes; null for a storage one, which the CPU cannot read. */\n measured: Measured | null = null;\n private matrices: { readonly source: InstancedBufferAttribute; readonly mirror: Mirror | null } | null = null;\n private colors: { readonly source: InstancedBufferAttribute; readonly mirror: ColorMirror | null } | null = null;\n private count = -1;\n\n /** The matrices as the GPU reads them, once taken in. */\n get matrixStorage(): StorageInstancedBufferAttribute {\n const found = this.matrices;\n if (!found) throw new Error(\"Lod: its instances are read before they were taken in\");\n return found.mirror?.attribute ?? storageOf(found.source);\n }\n\n /** The colours as the GPU reads them, RGB and a pad: white without. */\n get colorStorage(): StorageInstancedBufferAttribute {\n const found = this.colors;\n return found ? (found.mirror?.attribute ?? storageOf(found.source)) : white;\n }\n\n /**\n * Take in `attributes` as they are: an attribute assigned anew, edits marked by `needsUpdate` (within their update\n * ranges), a new count. A storage instanceMatrix, which the app's GPU passes may write any time, counts as changed\n * at every update. Throws unless they can be drawn.\n */\n refresh({ instanceMatrix, instanceColor, count }: InstanceAttributes): void {\n check(instanceMatrix, instanceColor, count);\n let replaced = false;\n if (this.matrices?.source !== instanceMatrix) {\n this.matrices?.mirror?.dispose();\n this.matrices = { source: instanceMatrix, mirror: isStorageInstanced(instanceMatrix) ? null : new Mirror(instanceMatrix) };\n this.measured = null;\n replaced = true;\n }\n if (this.colors?.source !== (instanceColor ?? undefined)) {\n this.colors?.mirror?.dispose();\n this.colors = instanceColor && { source: instanceColor, mirror: isStorageInstanced(instanceColor) ? null : new ColorMirror(instanceColor) };\n replaced = true;\n }\n const { mirror } = this.matrices;\n const moved = mirror ? mirror.refresh() : true;\n const recoloured = this.colors?.mirror?.refresh() ?? false;\n if (mirror && (moved || replaced || count !== this.count || !this.measured)) this.measured = measure(instanceMatrix, count, this.measured);\n if (replaced || moved || recoloured || count !== this.count) this.version++;\n this.count = count;\n }\n\n /** Release the mirrors; the attributes are the app's. */\n dispose(): void {\n this.matrices?.mirror?.dispose();\n this.colors?.mirror?.dispose();\n this.matrices = null;\n this.colors = null;\n }\n}\n\n/** `attribute`, which `refresh` found a storage attribute. */\nfunction storageOf(attribute: InstancedBufferAttribute): StorageInstancedBufferAttribute {\n if (!isStorageInstanced(attribute)) throw new TypeError(\"Lod: an attribute read in place is not a storage attribute\");\n return attribute;\n}\n\n/** Throws unless the attributes hold `count` instances as an InstancedMesh's do; a storage colour pads RGB to four floats. */\nfunction check(instanceMatrix: InstancedBufferAttribute, instanceColor: InstancedBufferAttribute | null, count: number): void {\n if (instanceMatrix.itemSize !== 16 || !(instanceMatrix.array instanceof Float32Array) || instanceMatrix.normalized)\n throw new TypeError(`Lod: instanceMatrix holds 16 floats per instance, not ${instanceMatrix.itemSize}${instanceMatrix.normalized ? \" normalized\" : \"\"}`);\n if (!Number.isInteger(count) || count < 0 || count > instanceMatrix.count)\n throw new RangeError(`Lod: count must be an integer from 0 to instanceMatrix.count, ${instanceMatrix.count}, not ${count}`);\n if (!instanceColor) return;\n const size = isStorageInstanced(instanceColor) ? 4 : 3;\n if (instanceColor.itemSize !== size || !(instanceColor.array instanceof Float32Array) || instanceColor.normalized)\n throw new TypeError(`Lod: instanceColor holds ${size} floats per instance${size === 4 ? \" in storage\" : \"\"}, not ${instanceColor.itemSize}`);\n if (instanceColor.count < count) throw new RangeError(`Lod: instanceColor holds ${instanceColor.count} instances, fewer than count, ${count}`);\n}\n\n/** Measure the first `count` instances of `instanceMatrix` at a scale above 0 into `into`, or a new Measured. */\nexport function measure(instanceMatrix: InstancedBufferAttribute, count: number, into: Measured | null): Measured {\n const measured = into ?? { originBox: new Box3(), minScale: 0, maxScale: 0 };\n const { array } = instanceMatrix;\n measured.originBox.makeEmpty();\n measured.minScale = Infinity;\n measured.maxScale = 0;\n for (let i = 0; i < count; i++) {\n matrix.fromArray(array, i * 16);\n const scale = matrix.getMaxScaleOnAxis();\n if (scale === 0) continue;\n measured.originBox.expandByPoint(origin.setFromMatrixPosition(matrix));\n measured.minScale = Math.min(measured.minScale, scale);\n measured.maxScale = Math.max(measured.maxScale, stretch(matrix));\n }\n if (measured.originBox.isEmpty()) measured.minScale = measured.maxScale = 0;\n return measured;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"key.js","sourceRoot":"","sources":["../../src/instanced/key.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"key.js","sourceRoot":"","sources":["../../src/instanced/key.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Sphere, Vector3 } from \"three/webgpu\";\nimport type { d } from \"typegpu\";\nimport type { DrawLevels } from \"../levels/draw.js\";\nimport type { Cull } from \"./cull.js\";\n\n// What a camera's sort or loading last ran with, so that it is skipped while nothing it reads changed.\n\n/** The values something last ran with, written again in place each time it may run, telling whether any differs. */\nexport class Key {\n private readonly values: number[] = [];\n private length = 0;\n private changed = false;\n\n /** Starts writing the values anew. */\n start(): this {\n this.length = 0;\n this.changed = false;\n return this;\n }\n\n put(value: number): this {\n if (this.values[this.length] !== value) {\n this.values[this.length] = value;\n this.changed = true;\n }\n this.length++;\n return this;\n }\n\n /** Whether the values written since start differ from the last ones. */\n end(): boolean {\n if (this.values.length !== this.length) {\n this.values.length = this.length;\n this.changed = true;\n }\n return this.changed;\n }\n\n /** A camera's inputs, everything in the Lod's space: what sorting for it reads. */\n camera(eye: Vector3, scale: number, ortho: boolean, levels: d.Infer<typeof DrawLevels>, cull: Cull | null, source: Sphere): this {\n return this.put(eye.x).put(eye.y).put(eye.z).screen(scale, ortho, levels, cull, source);\n }\n\n /** A camera's inputs but where it looks from: all an orthographic camera measures heights by. */\n screen(scale: number, ortho: boolean, levels: d.Infer<typeof DrawLevels>, cull: Cull | null, source: Sphere): this {\n this.put(scale).put(Number(ortho));\n this.put(levels.count).put(levels.empty).put(levels.coarsest).put(levels.forced).put(levels.fades);\n for (const pixels of levels.maxPixels) this.put(pixels);\n this.put(Number(cull !== null));\n if (cull) this.put(cull.eye.x).put(cull.eye.y).put(cull.eye.z).put(cull.near).put(cull.far).put(Number(cull.survivors));\n return this.put(source.center.x).put(source.center.y).put(source.center.z).put(source.radius);\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"levels.js","sourceRoot":"","sources":["../../src/instanced/levels.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"levels.js","sourceRoot":"","sources":["../../src/instanced/levels.ts"],"names":[],"mappings":"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","sourcesContent":["import { Color, Object3D, type Box3, type Camera, type Mesh, type Sphere } from \"three/webgpu\";\nimport { at } from \"../at.js\";\nimport { prepareBounds } from \"../levels/bounds.js\";\nimport { disposeCopies } from \"../dispose.js\";\nimport { tintOf, type ThresholdedLevel } from \"../levels/index.js\";\nimport { has } from \"../levels/draw.js\";\nimport type { DrawnInstances } from \"../levels/fade.js\";\nimport type { PreparedLevel } from \"../levels/manager.js\";\nimport { refreshWind } from \"../wind/index.js\";\nimport type { InstanceLists } from \"./lists.js\";\nimport { freeMesh, levelMeshes, partsOf, type LevelMeshes, type Part } from \"./meshes.js\";\nimport type { InstanceShape } from \"./shape.js\";\n\n/** What a Lod's level meshes draw with: its shape, lists and the instances they draw. */\nexport interface Drawing {\n readonly shape: InstanceShape;\n readonly lists: InstanceLists;\n /** What the level meshes draw: the Lod's instances, or while survivors scale, their scaled matrices. */\n readonly drawn: DrawnInstances;\n}\n\n/**\n * A Lod's level meshes: per level, the meshes drawing it with its debug tint, made from the level's object once there\n * is one and added to the Lod, and the source level's parts, which a raycast hits.\n */\nexport class MeshesByLevel {\n private readonly tints: Color[];\n private readonly byLevel: Mesh[][] = [];\n private sourceParts: readonly Part[] = [];\n\n constructor(\n /** The Lod, which holds the meshes. */\n private readonly parent: Object3D,\n /** Its levels: a level that joins gets its object. */\n private readonly levels: readonly ThresholdedLevel[],\n private readonly drawing: Drawing,\n /** Around every instance, survivors grown: what every level mesh is culled and boxed by. */\n private readonly bounds: { readonly sphere: Sphere; readonly box: Box3 },\n /** Sorts `camera`'s lists as `renderer` draws a mesh for it. */\n private readonly drawFor: (renderer: unknown, camera: Camera) => void,\n ) {\n this.tints = levels.map(() => new Color(1, 1, 1));\n levels.forEach(({ object }, i) => {\n const parts = object ? partsOf(object, i) : [];\n if (i === 0) this.sourceParts = parts;\n const made = this.meshesOf(parts, i);\n drawInto(drawing.lists, made);\n this.byLevel.push(made.meshes);\n for (const mesh of made.meshes) parent.add(mesh);\n });\n }\n\n /** The source level's parts, which a raycast hits. */\n get source(): readonly Part[] {\n return this.sourceParts;\n }\n\n /** The meshes drawing level `level`. */\n of(level: number): readonly Mesh[] {\n return at(this.byLevel, level);\n }\n\n /** Every level's meshes. */\n all(): Mesh[] {\n return this.byLevel.flat();\n }\n\n /** Tint each level as Lod.debug, `debug`, has it. */\n tint(debug: boolean): void {\n this.levels.forEach((_, i) => at(this.tints, i).copy(tintOf(i, debug)));\n }\n\n /** Show the meshes of the levels of the bits `levels`, and hide the others. */\n show(levels: number): void {\n this.byLevel.forEach((meshes, level) => {\n for (const mesh of meshes) mesh.visible = has(levels, level);\n });\n }\n\n /** The meshes drawing `parts` of level `level` for the cameras of the lists. */\n private meshesOf(parts: readonly Part[], level: number): LevelMeshes {\n const { lists, drawn, shape } = this.drawing;\n return levelMeshes(parts, at(this.tints, level), {\n instances: drawn,\n bounds: this.bounds.sphere,\n box: this.bounds.box,\n slots: (camera) => lists.slots(camera),\n radius: shape.fadeRadius,\n layers: this.parent.layers,\n drawFor: (renderer, camera) => {\n this.drawFor(renderer, camera);\n return lists.slots(camera)?.args ?? null;\n },\n });\n }\n\n /** Level meshes of `loaded`, level `index`'s object, staged for wind and compiling. */\n prepare(index: number, loaded: Object3D): PreparedLevel {\n const level = at(this.levels, index);\n const object = loaded.clone();\n if (level.box) prepareBounds(object, level.box);\n const parts = partsOf(object, index);\n const made = this.meshesOf(parts, index);\n const staged = new Object3D();\n for (const mesh of made.meshes) staged.add(mesh);\n refreshWind(this.parent, staged);\n return {\n object: staged,\n join: () => {\n level.object = object;\n drawInto(this.drawing.lists, made);\n this.byLevel[index] = made.meshes;\n if (index === 0) this.sourceParts = parts;\n for (const mesh of made.meshes) this.parent.add(mesh);\n },\n discard: () => {\n for (const mesh of made.meshes) freeMesh(mesh);\n disposeCopies(object);\n },\n };\n }\n\n /** Take every mesh out of the Lod and free it. */\n dispose(): void {\n for (const mesh of this.byLevel.flat()) {\n mesh.removeFromParent();\n freeMesh(mesh);\n }\n this.byLevel.length = 0;\n }\n}\n\n/** Let `made` draw for the cameras of `lists`, its draws appended to theirs. */\nfunction drawInto(lists: InstanceLists, made: LevelMeshes): void {\n if (made.draws.length > 0) made.drawFrom(lists.appendDraws(made.draws));\n}\n"]}
@@ -1,14 +1,17 @@
1
1
  import { Frustum, Matrix4, type Camera, type Renderer, type StorageInstancedBufferAttribute } from "three/webgpu";
2
2
  import type { InstanceSlots } from "../levels/fade.js";
3
3
  import { type LodLevel } from "../levels/index.js";
4
+ import type { LodLiveCount } from "./clusters.js";
4
5
  import { Key } from "./key.js";
5
6
  import { type RowValues } from "./sort.js";
6
7
  import type { IndirectDraw } from "./rows.js";
7
8
  /** What one camera's sort reads besides its lists, everything in the Lod's space. */
8
9
  export interface SortInputs extends Omit<RowValues, "frustum"> {
9
- /** The instances the camera sees, as start and count, flat (see clusters.ts), and how many in all. */
10
+ /** The instances the camera sees, as start, count and item of `liveCounts`, flat (see clusters.ts), and how many in all. */
10
11
  ranges: readonly number[];
11
12
  instances: number;
13
+ /** The live counts of the ranges, which only the GPU knows; null while none has one. */
14
+ liveCounts: LodLiveCount["attribute"] | null;
12
15
  /** Whether every range it sees lies wholly inside its frustum. */
13
16
  inside: boolean;
14
17
  /**
@@ -65,9 +65,11 @@ export class InstanceLists {
65
65
  key.put(normal.x).put(normal.y).put(normal.z).put(constant);
66
66
  key.camera(eye, scale, ortho, levels, cull, source).put(loaded).put(before).put(progress).put(reach);
67
67
  }
68
- if (!key.end())
68
+ // Live counts may change at any time: their ranges sort at every update.
69
+ if (!key.end() && !sort.liveCounts)
69
70
  return;
70
- this.sorter.write(camera, { levels, eye, scale, ortho, cull, loaded, before, progress, source, reach, frustum: lists.frustum }, ranges, sort.instances, limit);
71
+ const values = { levels, eye, scale, ortho, cull, loaded, before, progress, source, reach, frustum: lists.frustum };
72
+ this.sorter.write(camera, values, ranges, sort.liveCounts, sort.instances, limit);
71
73
  lists.written = true;
72
74
  }
73
75
  /** Sort for `camera` on `renderer`, reading `matrices`, if due: before a level mesh draws for it. */
@@ -1 +1 @@
1
- {"version":3,"file":"lists.js","sourceRoot":"","sources":["../../src/instanced/lists.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,OAAO,EAAoE,MAAM,cAAc,CAAC;AAClH,OAAO,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AAExC,OAAO,EAAE,WAAW,EAAiB,MAAM,oBAAoB,CAAC;AAChE,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,MAAM,EAAkB,MAAM,WAAW,CAAC;AAiCnD,MAAM,UAAU,GAAG,IAAI,OAAO,EAAE,CAAC;AAEjC,sHAAsH;AACtH,MAAM,IAAI,GAAG;IACX,qDAAqD;IACrD,MAAM,EAAE,CAAC;IACT,+CAA+C;IAC/C,IAAI,EAAE,CAAC;IACP,sIAAsI;IACtI,QAAQ,EAAE,CAAC;IACX,2HAA2H;IAC3H,WAAW,EAAE,CAAC;CACN,CAAC;AAEX,6EAA6E;AAC7E,MAAM,OAAO,aAAa;IACP,OAAO,GAAG,IAAI,GAAG,EAAuB,CAAC;IACzC,MAAM,CAAS;IAEhC,4FAA4F;IAC5F,YAAY,MAA0B;QACpC,IAAI,CAAC,MAAM,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC7F,CAAC;IAED,qDAAqD;IACrD,EAAE,CAAC,MAAc;QACf,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACvC,IAAI,KAAK;YAAE,OAAO,KAAK,CAAC;QACxB,MAAM,KAAK,GAAgB,EAAE,OAAO,EAAE,IAAI,OAAO,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,GAAG,EAAE,EAAE,CAAC;QAC1F,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAChC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,4FAA4F;IAC5F,KAAK,CAAC,MAAc;QAClB,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACrC,CAAC;IAED,gFAAgF;IAChF,WAAW,CAAC,KAA8B;QACxC,OAAO,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IACxC,CAAC;IAED,2DAA2D;IAC3D,cAAc,CAAC,QAAgB;QAC7B,OAAO,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;IAC9C,CAAC;IAED,8HAA8H;IAC9H,IAAI,CAAC,MAAc,EAAE,IAAgB,EAAE,KAAa;QAClD,MAAM,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;QAC9B,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;QAClG,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;QAC1B,+GAA+G;QAC/G,8GAA8G;QAC9G,IAAI,IAAI,KAAK,IAAI,CAAC,MAAM;YAAE,OAAO;QACjC,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC9D,KAAK,MAAM,KAAK,IAAI,MAAM;YAAE,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC3C,IAAI,IAAI,KAAK,IAAI,CAAC,QAAQ;YAAE,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;aAC/C,IAAI,IAAI,KAAK,IAAI,CAAC,WAAW;YAAE,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;aAC/H,IAAI,IAAI,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;YAC5B,KAAK,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM;gBAAE,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACrH,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACvG,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE;YAAE,OAAO;QACvB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QAC/J,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC;IACvB,CAAC;IAED,qGAAqG;IACrG,OAAO,CAAC,QAAkB,EAAE,MAAc,EAAE,QAAyC;QACnF,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC9C,CAAC;IAED,yIAAyI;IACzI,KAAK,CAAC,MAAc,EAAE,SAAsC;QAC1D,KAAK,MAAM,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YAAE,IAAI,KAAK,KAAK,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;gBAAE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC9G,CAAC;IAED,OAAO;QACL,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACrB,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;IACxB,CAAC;IAEO,MAAM,CAAC,MAAc;QAC3B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC5B,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC9B,CAAC;CACF;AAED,iGAAiG;AACjG,MAAM,UAAU,SAAS,CAAC,KAAkB,EAAE,MAAc,EAAE,KAAc;IAC1E,UAAU,CAAC,gBAAgB,CAAC,MAAM,CAAC,gBAAgB,EAAE,MAAM,CAAC,kBAAkB,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAChG,OAAO,KAAK,CAAC,OAAO,CAAC,uBAAuB,CAAC,UAAU,EAAE,MAAM,CAAC,gBAAgB,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC;AAC1G,CAAC;AAED;;;;GAIG;AACH,SAAS,MAAM,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAc;IACpE,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC,MAAM,CAAC;IAC5C,IAAI,IAAI,KAAK,IAAI,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC,IAAI,CAAC;IAC/C,OAAO,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;AAChF,CAAC;AAED,0FAA0F;AAC1F,MAAM,UAAU,QAAQ,CAAC,MAA2B;IAClD,MAAM,KAAK,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;IAClC,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;AAC9C,CAAC"}
1
+ {"version":3,"file":"lists.js","sourceRoot":"","sources":["../../src/instanced/lists.ts"],"names":[],"mappings":"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","sourcesContent":["import { Frustum, Matrix4, type Camera, type Renderer, type StorageInstancedBufferAttribute } from \"three/webgpu\";\nimport { has } from \"../levels/draw.js\";\nimport type { InstanceSlots } from \"../levels/fade.js\";\nimport { emptyLevels, type LodLevel } from \"../levels/index.js\";\nimport type { LodLiveCount } from \"./clusters.js\";\nimport { Key } from \"./key.js\";\nimport { Sorter, type RowValues } from \"./sort.js\";\nimport type { IndirectDraw } from \"./rows.js\";\n\n// Each camera that draws a Lod has lists of its own: per level the instances it draws and their fades, and the indirect\n// draws of every level mesh. updateInstance fills them on the GPU (see update.ts), and is skipped for a camera while\n// nothing it reads changed since its last run.\n\n/** What one camera's sort reads besides its lists, everything in the Lod's space. */\nexport interface SortInputs extends Omit<RowValues, \"frustum\"> {\n /** The instances the camera sees, as start, count and item of `liveCounts`, flat (see clusters.ts), and how many in all. */\n ranges: readonly number[];\n instances: number;\n /** The live counts of the ranges, which only the GPU knows; null while none has one. */\n liveCounts: LodLiveCount[\"attribute\"] | null;\n /** Whether every range it sees lies wholly inside its frustum. */\n inside: boolean;\n /**\n * The bit of the one level each instance draws, without a fade, at any height its range's instances can have, with\n * no cullDistance and no arrival under way; else 0. Inside the camera's frustum, its lists then hold every instance\n * at that level however the camera moves.\n */\n onlyLevel: number;\n /** Bumped whenever what the instances' storage holds changed. */\n version: number;\n}\n\n/** One camera's lists: what it last sorted with, which a sort is skipped for. */\nexport interface CameraLists {\n /** The camera's frustum in the Lod's space, as its last update found it (see `frustumIn`). */\n readonly frustum: Frustum;\n /** Whether a sort was written for the camera: until then the level meshes draw nothing for it. */\n written: boolean;\n readonly sortKey: Key;\n}\n\nconst projection = new Matrix4();\n\n/** What a camera's sort key starts with: how it lies to the instances it sees, which says what else the key holds. */\nconst MODE = {\n /** It sees none: nothing draws, and no sort runs. */\n hidden: 0,\n /** The key holds everything the sort reads. */\n seen: 1,\n /** Every range wholly inside its frustum, each instance drawing one level without a fade and none culled: the key holds the level. */\n oneLevel: 2,\n /** Every range wholly inside an orthographic camera's frustum, none culled: heights are alike from anywhere, so no eye. */\n orthoInside: 3,\n} as const;\n\n/** The lists of every camera drawing one Lod, and the sorts filling them. */\nexport class InstanceLists {\n private readonly cameras = new Map<Camera, CameraLists>();\n private readonly sorter: Sorter;\n\n /** `listed` tells per level whether it has an instance list: whether it draws something. */\n constructor(listed: readonly boolean[]) {\n this.sorter = new Sorter(listed.reduce((mask, on, i) => (on ? mask | (1 << i) : mask), 0));\n }\n\n /** `camera`'s lists, made the first time it asks. */\n of(camera: Camera): CameraLists {\n const found = this.cameras.get(camera);\n if (found) return found;\n const lists: CameraLists = { frustum: new Frustum(), written: false, sortKey: new Key() };\n this.cameras.set(camera, lists);\n return lists;\n }\n\n /** Where `camera`'s lists and indirect draws lie; null before a sort was written for it. */\n slots(camera: Camera): InstanceSlots | null {\n return this.sorter.slotsOf(camera);\n }\n\n /** Every camera draws `draws` too, after the draws it has; where they start. */\n appendDraws(draws: readonly IndirectDraw[]): number {\n return this.sorter.appendDraws(draws);\n }\n\n /** Survivors' scaled matrices for `capacity` instances. */\n scaledMatrices(capacity: number): StorageInstancedBufferAttribute {\n return this.sorter.scaledMatrices(capacity);\n }\n\n /** Sort for `camera` at its next draw, unless nothing it sorts by changed since its last sort; `limit` bounds its buffers. */\n sort(camera: Camera, sort: SortInputs, limit: number): void {\n const lists = this.of(camera);\n const { levels, eye, scale, ortho, cull, loaded, before, progress, source, reach, ranges } = sort;\n const mode = modeOf(sort);\n // No level mesh draws for the camera (see Lod.sort): its lists are not read. The key still holds what the last\n // sort read, which a camera that looks back at the instances as it was matches: that sort's lists still hold.\n if (mode === MODE.hidden) return;\n const key = lists.sortKey.start().put(mode).put(sort.version);\n for (const value of ranges) key.put(value);\n if (mode === MODE.oneLevel) key.put(sort.onlyLevel);\n else if (mode === MODE.orthoInside) key.screen(scale, ortho, levels, cull, source).put(loaded).put(before).put(progress).put(reach);\n else if (mode === MODE.seen) {\n for (const { normal, constant } of lists.frustum.planes) key.put(normal.x).put(normal.y).put(normal.z).put(constant);\n key.camera(eye, scale, ortho, levels, cull, source).put(loaded).put(before).put(progress).put(reach);\n }\n // Live counts may change at any time: their ranges sort at every update.\n if (!key.end() && !sort.liveCounts) return;\n const values = { levels, eye, scale, ortho, cull, loaded, before, progress, source, reach, frustum: lists.frustum };\n this.sorter.write(camera, values, ranges, sort.liveCounts, sort.instances, limit);\n lists.written = true;\n }\n\n /** Sort for `camera` on `renderer`, reading `matrices`, if due: before a level mesh draws for it. */\n drawFor(renderer: Renderer, camera: Camera, matrices: StorageInstancedBufferAttribute): void {\n this.sorter.run(renderer, camera, matrices);\n }\n\n /** Give back the lists of every camera other than `camera` that `rendering` says stopped drawing, as a clone made for one frame does. */\n prune(camera: Camera, rendering: (camera: Camera) => boolean): void {\n for (const other of [...this.cameras.keys()]) if (other !== camera && !rendering(other)) this.forget(other);\n }\n\n dispose(): void {\n this.cameras.clear();\n this.sorter.dispose();\n }\n\n private forget(camera: Camera): void {\n this.cameras.delete(camera);\n this.sorter.release(camera);\n }\n}\n\n/** Set `lists`' frustum to `camera`'s in the space of `space`, a world matrix, and return it. */\nexport function frustumIn(lists: CameraLists, camera: Camera, space: Matrix4): Frustum {\n projection.multiplyMatrices(camera.projectionMatrix, camera.matrixWorldInverse).multiply(space);\n return lists.frustum.setFromProjectionMatrix(projection, camera.coordinateSystem, camera.reversedDepth);\n}\n\n/**\n * How the camera lies to `sort`'s instances (see MODE). Wholly inside its frustum, with no cullDistance, no instance is\n * culled wherever the camera is: instances that all draw one level fill its list alike, and an orthographic camera\n * measures their heights alike from anywhere.\n */\nfunction modeOf({ ranges, inside, cull, onlyLevel, ortho }: SortInputs): number {\n if (ranges.length === 0) return MODE.hidden;\n if (cull !== null || !inside) return MODE.seen;\n return onlyLevel !== 0 ? MODE.oneLevel : ortho ? MODE.orthoInside : MODE.seen;\n}\n\n/** Per level of `inputs`, whether it has an instance list: whether it draws something. */\nexport function listedOf(inputs: readonly LodLevel[]): boolean[] {\n const empty = emptyLevels(inputs);\n return inputs.map((_, i) => !has(empty, i));\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"names":["Matrix4","Vector3","d","std","tgpu","drawnLevel","levelsToDraw","MAX_SURVIVOR_SCALE","xorshift","globalThis","__TYPEGPU_AUTONAME__","a","fn","u32","$","__TYPEGPU_META__","WeakMap","set","f","value","h","v","name","undefined","ast","params","type","body","externals","d.u32","originHash","vec3f","f32","origin","bits","bitcastF32toU32","x","y","z","__tsover_div","std.bitcastF32toU32","d.f32","cullScale","distance","near","far","survivors","share","clamp","__tsover_sub","min","sqrt","std.clamp","std.min","std.sqrt","longestAxis","mat4x4f","matrix","length","mul","vec4f","xyz","max","std.length","std.mul","d.vec4f","std.max","instanceOnScreen","source","grow","eye","scale","ortho","centre","size","__tsover_mul","w","std.distance","instance","toVec3f","instanceLevel","matrices","offset","cull","camera","loaded","fromArray","getMaxScaleOnAxis","setFromMatrixPosition","distanceTo","Number","levels","center","radius","height","elements"],"sources":["../../src/instanced/measure.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["Matrix4","Vector3","d","std","tgpu","drawnLevel","levelsToDraw","MAX_SURVIVOR_SCALE","xorshift","globalThis","__TYPEGPU_AUTONAME__","a","fn","u32","$","__TYPEGPU_META__","WeakMap","set","f","value","h","v","name","undefined","ast","params","type","body","externals","d.u32","originHash","vec3f","f32","origin","bits","bitcastF32toU32","x","y","z","__tsover_div","std.bitcastF32toU32","d.f32","cullScale","distance","near","far","survivors","share","clamp","__tsover_sub","min","sqrt","std.clamp","std.min","std.sqrt","longestAxis","mat4x4f","matrix","length","mul","vec4f","xyz","max","std.length","std.mul","d.vec4f","std.max","instanceOnScreen","source","grow","eye","scale","ortho","centre","size","__tsover_mul","w","std.distance","instance","toVec3f","instanceLevel","matrices","offset","cull","camera","loaded","fromArray","getMaxScaleOnAxis","setFromMatrixPosition","distanceTo","Number","levels","center","radius","height","elements"],"sources":["../../src/instanced/measure.ts"],"sourcesContent":["import { Matrix4, Vector3, type Sphere } from \"three/webgpu\";\nimport { d, std, tgpu } from \"typegpu\";\nimport { drawnLevel, levelsToDraw } from \"../levels/draw.js\";\nimport type { LocalCamera } from \"./camera.js\";\nimport type { Cull } from \"./cull.js\";\n\n// How one instance draws, the same on the CPU and in the sort (see update.ts): whether cullDistance thins it out and\n// how much its survivors grow, and its height on screen.\n\n/** The largest a survivor of `cullDistance` grows: what it reaches where 1/64 of the instances draw. */\nexport const MAX_SURVIVOR_SCALE = 8;\n\n/** Three xorshift steps: shifts and xors only, exact in JavaScript's 32-bit integer operators as on the GPU. */\nconst xorshift = tgpu.fn(\n [d.u32],\n d.u32,\n)((value) => {\n \"use gpu\";\n let h = d.u32(value);\n h = d.u32(h ^ (h << 13));\n h = d.u32(h ^ (h >>> 17));\n h = d.u32(h ^ (h << 5));\n return h;\n});\n\n/**\n * The bits of `origin`, an instance's translation, hashed into [0, 1): what thins it out (see `CullDistance`), the\n * same on the CPU and the GPU.\n */\nexport const originHash = tgpu.fn(\n [d.vec3f],\n d.f32,\n)((origin) => {\n \"use gpu\";\n const bits = std.bitcastF32toU32(origin);\n let h = xorshift(bits.x ^ d.u32(0x9e3779b9));\n h = xorshift(h ^ bits.y);\n h = xorshift(h ^ bits.z);\n h = xorshift(h);\n return d.f32(h >>> 8) / 16777216;\n});\n\n/**\n * How an instance at `origin`, `distance` from the cullDistance camera, draws (see `CullDistance`): 0 thinned out,\n * else the scale it draws at: 1, or with `survivors` 1/√share, share the share of instances drawn at its distance.\n */\nexport const cullScale = tgpu.fn(\n [d.vec3f, d.f32, d.f32, d.f32, d.u32],\n d.f32,\n)((origin, distance, near, far, survivors) => {\n \"use gpu\";\n const share = std.clamp((far - distance) / (far - near), 0, 1);\n if (originHash(origin) >= share) return 0;\n if (survivors === 0) return 1;\n return std.min(1 / std.sqrt(share), MAX_SURVIVOR_SCALE);\n});\n\n/** The longest `matrix` scales an axis. */\nconst longestAxis = tgpu.fn(\n [d.mat4x4f],\n d.f32,\n)((matrix) => {\n \"use gpu\";\n const x = std.length(std.mul(matrix, d.vec4f(1, 0, 0, 0)).xyz);\n const y = std.length(std.mul(matrix, d.vec4f(0, 1, 0, 0)).xyz);\n const z = std.length(std.mul(matrix, d.vec4f(0, 0, 1, 0)).xyz);\n return std.max(x, std.max(y, z));\n});\n\n/**\n * Where an instance at `matrix` stands for a camera, `source` the source's sphere (centre, radius) grown by `grow`:\n * the source's centre (xyz), and its height on screen (w) seen from `eye` with `scale` pixels per unit of subtense, or\n * of size with `ortho` 1, as a Lod measures its own on the CPU (see screen.ts: 2 r q / d).\n */\nexport const instanceOnScreen = tgpu.fn(\n [d.mat4x4f, d.vec4f, d.f32, d.vec3f, d.f32, d.u32],\n d.vec4f,\n)((matrix, source, grow, eye, scale, ortho) => {\n \"use gpu\";\n const centre = std.mul(matrix, d.vec4f(std.mul(source.xyz, grow), 1)).xyz;\n const size = source.w * longestAxis(matrix) * grow * 2 * scale;\n if (ortho === 1) return d.vec4f(centre, size);\n return d.vec4f(centre, size / std.max(std.distance(centre, eye), 1e-6));\n});\n\nconst instance = new Matrix4();\nconst origin = new Vector3();\n\nconst toVec3f = ({ x, y, z }: Vector3) => d.vec3f(x, y, z);\n\n/**\n * The level the instance at `offset` of `matrices` draws most of its pixels with (see `Lod.getLevelAt`), thinned out\n * by `cull` and seen by `camera`, both in the Lod's space, of the levels of `loaded`, `source` the\n * source's sphere; null if it draws nothing.\n */\nexport function instanceLevel(\n matrices: ArrayLike<number>,\n offset: number,\n cull: Cull | null,\n camera: LocalCamera,\n source: Sphere,\n loaded: number,\n): number | null {\n instance.fromArray(matrices, offset);\n if (instance.getMaxScaleOnAxis() === 0) return null;\n origin.setFromMatrixPosition(instance);\n const grow = cull ? cullScale(toVec3f(origin), origin.distanceTo(cull.eye), cull.near, cull.far, Number(cull.survivors)) : 1;\n if (grow === 0) return null;\n const { levels, eye, scale, ortho } = camera;\n const { center, radius } = source;\n const height = instanceOnScreen(d.mat4x4f(...instance.elements), d.vec4f(center.x, center.y, center.z, radius), grow, toVec3f(eye), scale, Number(ortho)).w;\n return drawnLevel(levelsToDraw(height, levels, loaded, loaded, 1));\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"meshes.js","sourceRoot":"","sources":["../../src/instanced/meshes.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"meshes.js","sourceRoot":"","sources":["../../src/instanced/meshes.ts"],"names":[],"mappings":"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","sourcesContent":["import { type Box3, BufferGeometry, type Camera, type Color, IndirectStorageBufferAttribute, type Layers, Matrix4, Mesh, type Object3D, type Sphere } from \"three/webgpu\";\nimport { setFadeSource, type DrawnInstances, type InstanceSlots } from \"../levels/fade.js\";\nimport { levelMaterial } from \"../levels/material.js\";\nimport { impostorInstances, type ImpostorMesh } from \"../impostor/mesh/index.js\";\nimport { isImpostorMesh, isInstancedMesh, isLOD, isLine, isMesh, isPoints, isSprite, rejectSkinned } from \"../three.js\";\nimport { DRAW_BYTES, type IndirectDraw } from \"./rows.js\";\n\n// The meshes that draw a Lod's level: one plain three Mesh per mesh and material group of its object, or an\n// ImpostorMesh for an impostor, each drawing every instance in its level's list for a camera with one indirect draw.\n\nconst IDENTITY = new Matrix4();\n/** One indirect draw of nothing: what a level mesh draws before its Lod's first sort for a camera. */\nconst NOTHING = new IndirectStorageBufferAttribute(new Uint32Array(DRAW_BYTES / 4), 1);\n\n/** A mesh of a level's object and one of its material groups, placed in the instance's space. */\nexport interface Part {\n template: Mesh;\n placement: Matrix4;\n group: number;\n draw: IndirectDraw;\n}\n\n/** What every level mesh of one Lod draws from. */\nexport interface MeshInputs {\n /** The instances, which a mesh made later draws too. */\n readonly instances: DrawnInstances;\n /**\n * Around every instance, in the Lod's space: what its meshes are culled by, and their box, which three's\n * Box3.setFromObject reads.\n */\n readonly bounds: Sphere;\n readonly box: Box3;\n /** Per camera, the instances in each level's list and where its indirect draws lie. */\n readonly slots: (camera: Camera) => InstanceSlots | null;\n /** One instance's bounding radius in its own space, which shadow casters are cut off at. */\n readonly radius: number;\n /** The Lod's layers, which its meshes are on. */\n readonly layers: Layers;\n /**\n * Where `camera`'s indirect draws lie as `renderer` draws a mesh for it, its lists sorted: the camera's due sort runs\n * now; null before the Lod's first sort for it. Never throws: three is rendering.\n */\n readonly drawFor: (renderer: unknown, camera: Camera) => InstanceSlots[\"args\"] | null;\n}\n\n/** `object`'s meshes and material groups, placed once in the instance's space, for level `level`. */\nexport function partsOf(object: Object3D, level: number): Part[] {\n rejectSkinned(object, \"Lod\");\n object.updateWorldMatrix(true, true);\n const outside = object.parent ? object.parent.matrixWorld.clone().invert() : new Matrix4();\n const found: Part[] = [];\n object.traverse((node) => {\n if (isLOD(node)) throw new Error(`Lod: levels cannot contain a LOD (\"${node.name}\")`);\n if (isInstancedMesh(node) && !isImpostorMesh(node)) throw new Error(`Lod: levels cannot contain an InstancedMesh (\"${node.name}\")`);\n if (isLine(node) || isPoints(node) || isSprite(node)) throw new Error(`Lod: levels draw meshes, not the line, points or sprite \"${node.name}\"`);\n if (!isMesh(node)) return;\n const placement = outside.clone().multiply(node.matrixWorld);\n ranges(node).forEach((range, group) => found.push({ template: node, placement, group, draw: { level, ...range } }));\n });\n return found;\n}\n\n/** The index (or vertex) ranges `mesh` draws, clipped to its draw range, in group order, empty draws included. */\nfunction ranges(mesh: Mesh): Array<{ count: number; start: number; indexed: boolean }> {\n const { geometry } = mesh;\n const indexed = geometry.index !== null;\n const total = geometry.index?.count ?? geometry.getAttribute(\"position\").count;\n const groups = Array.isArray(mesh.material) ? geometry.groups : [{ start: 0, count: total }];\n return groups.map(({ start, count }) => {\n const first = Math.min(total, Math.max(0, start, geometry.drawRange.start));\n const end = Math.min(total, start + count, geometry.drawRange.start + geometry.drawRange.count);\n return { count: Math.max(0, end - first), start: first, indexed };\n });\n}\n\n/** A level's meshes, which draw once their indirect draws lie among a camera's (see `drawFrom`). */\nexport interface LevelMeshes {\n readonly meshes: Mesh[];\n /** The meshes' indirect draws, in order. */\n readonly draws: IndirectDraw[];\n /** Draw from the camera's draw `first` on, where `draws` were appended (see `InstanceSlots.args`). */\n drawFrom(first: number): void;\n}\n\n/** The meshes drawing `parts`, tinted by `tint`. */\nexport function levelMeshes(parts: readonly Part[], tint: Color, inputs: MeshInputs): LevelMeshes {\n let first: number | null = null;\n const offset = (i: number) => (first === null ? null : (first + i) * DRAW_BYTES);\n return {\n meshes: parts.map((part, i) => levelMesh(part, () => offset(i), tint, inputs)),\n draws: parts.map((part) => part.draw),\n drawFrom: (start) => void (first = start),\n };\n}\n\n/** Release `mesh`, which may never have been added. */\nexport function freeMesh(mesh: Mesh): void {\n // ImpostorMesh.dispose also destroys its instance buffers, which are the Lod's.\n if (isImpostorMesh(mesh)) mesh.material.release();\n mesh.geometry.dispose();\n}\n\n/** Point every mesh of `meshes` at `instances`, which changed: survivors scale or no longer do, or the attributes were replaced. */\nexport function drawInstances(meshes: readonly Mesh[], instances: DrawnInstances): void {\n for (const mesh of meshes) {\n if (isImpostorMesh(mesh)) mesh.instanceMatrix = instances.matrices;\n Object.assign(mesh, { instanceColor: instances.colors });\n }\n}\n\n/**\n * Material group `group` of `template` drawn for every instance in level `level`'s list, from byte `offset()` of a\n * camera's draws, once there is one, on the Lod's layers. Only the Lod's raycast hits its instances.\n */\nfunction levelMesh({ template, placement, group }: Part, offset: () => number | null, tint: Color, inputs: MeshInputs): Mesh {\n const { instances, bounds, box, slots, radius, layers, drawFor } = inputs;\n // An impostor card is placed in the shader; any other mesh draws its geometry moved into the instance's space, so\n // the instance matrix is all it needs.\n const mesh = isImpostorMesh(template) ? card(template, placement, inputs) : plain(template, placement, group, instances);\n setFadeSource(mesh, {\n slots,\n radius,\n tint,\n level: isImpostorMesh(template) ? undefined : { instances, space: placement.clone().invert() },\n });\n mesh.name = template.name;\n mesh.castShadow = template.castShadow;\n mesh.receiveShadow = template.receiveShadow;\n mesh.layers = layers;\n mesh.raycast = () => {};\n if (!isImpostorMesh(mesh)) mesh.geometry.boundingSphere = bounds;\n mesh.geometry.boundingBox = box;\n const previous = mesh.onBeforeRender;\n // Each camera draws the instances in its own lists. A level compiling to join draws nothing yet: its pipelines do not\n // depend on the indirect draw.\n mesh.onBeforeRender = (renderer, scene, camera, geometry, material, drawn) => {\n previous.call(mesh, renderer, scene, camera, geometry, material, drawn);\n const start = offset();\n if (start === null) return;\n const args = drawFor(renderer, camera);\n if (args) mesh.geometry.setIndirect(args.attribute, args.offset + start);\n else mesh.geometry.setIndirect(NOTHING, 0);\n };\n return mesh;\n}\n\n/**\n * A plain mesh drawing `template`'s geometry moved by `placement`, with a geometry of its own, which its draws point\n * at their camera's indirect draws, over the moved one's buffers.\n */\nfunction plain(template: Mesh, placement: Matrix4, group: number, instances: DrawnInstances): Mesh {\n const moved = placed(template.geometry, placement);\n const geometry = new BufferGeometry();\n geometry.index = moved.index;\n for (const [name, attribute] of Object.entries(moved.attributes)) geometry.setAttribute(name, attribute);\n geometry.morphAttributes = moved.morphAttributes;\n // three's NodeMaterial multiplies a draw's colour by the varying vInstanceColor wherever its object has an\n // instanceColor; placeInstances (see fade.ts) writes it.\n return Object.assign(new Mesh(geometry, groupMaterial(template, group)), { instanceColor: instances.colors });\n}\n\n/** An impostor's cards for the instances in a level's list. */\nfunction card(template: ImpostorMesh, placement: Matrix4, { instances, bounds }: MeshInputs): ImpostorMesh {\n const mesh = impostorInstances(template, 0, placement);\n // Indirect draws give the count. Three otherwise keys a card's shader by its count, one per object.\n mesh.count = 1;\n mesh.instanceMatrix = instances.matrices;\n mesh.instanceColor = instances.colors;\n mesh.boundingSphere = bounds;\n return mesh;\n}\n\n/** The level material of `mesh`'s material group `group`. */\nfunction groupMaterial(mesh: Mesh, group: number) {\n if (!Array.isArray(mesh.material)) return levelMaterial(mesh.material);\n const index = mesh.geometry.groups[group]?.materialIndex ?? 0;\n const material = mesh.material[index];\n if (!material) throw new Error(`Lod: \"${mesh.name}\" has no material ${index}`);\n return levelMaterial(material);\n}\n\n/**\n * Placed copies of geometries, shared by every Lod drawing the same mesh the same way: a side table, as three's\n * BufferGeometry has no room for a package's state.\n */\nconst copies = new WeakMap<BufferGeometry, Array<{ placement: Matrix4; geometry: BufferGeometry }>>();\n\n/** `geometry` moved by `placement`: itself for the identity, else a copy made once. */\nfunction placed(geometry: BufferGeometry, placement: Matrix4): BufferGeometry {\n if (placement.equals(IDENTITY)) return geometry;\n const known = copies.get(geometry) ?? [];\n copies.set(geometry, known);\n const hit = known.find((entry) => entry.placement.equals(placement));\n if (hit) return hit.geometry;\n const copy = geometry.clone();\n const box = copy.boundingBox;\n const sphere = copy.boundingSphere;\n // applyMatrix4 otherwise recomputes both bounds by walking the transformed vertices.\n copy.boundingBox = null;\n copy.boundingSphere = null;\n // Translations leave normals and tangents unchanged; scanning them stalls large source arrivals.\n if (placement.clone().setPosition(0, 0, 0).equals(IDENTITY)) {\n const position = copy.getAttribute(\"position\");\n if (position) {\n position.applyMatrix4(placement);\n position.needsUpdate = true;\n }\n } else copy.applyMatrix4(placement);\n copy.boundingBox = box?.applyMatrix4(placement) ?? null;\n copy.boundingSphere = sphere?.applyMatrix4(placement) ?? null;\n geometry.addEventListener(\"dispose\", () => copy.dispose());\n known.push({ placement: placement.clone(), geometry: copy });\n return copy;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"mirror.js","sourceRoot":"","sources":["../../src/instanced/mirror.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mirror.js","sourceRoot":"","sources":["../../src/instanced/mirror.ts"],"names":[],"mappings":"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","sourcesContent":["import { StorageInstancedBufferAttribute, type InstancedBufferAttribute } from \"three/webgpu\";\n\n// Storage attributes the GPU reads a Lod's CPU attributes through, uploading what the app marks changed in them, as\n// three uploads an InstancedMesh's: binding the app's own attribute through storage() would flag it as a storage\n// attribute, which three then pads (an RGB colour to four floats) and treats as one wherever else the app draws it. Each\n// takes and clears the source's update ranges, so an InstancedMesh also drawing the source uploads it whole.\n\n/** A CPU instanceMatrix's mirror, over the source's own array. */\nexport class Mirror {\n readonly attribute: StorageInstancedBufferAttribute;\n /** The source's version it last took in. */\n private version: number;\n\n constructor(readonly source: InstancedBufferAttribute) {\n this.attribute = new StorageInstancedBufferAttribute(source.array, 16);\n this.version = source.version;\n }\n\n /** Take in the source's edits: the ranges the app marked changed, all of it without any. Whether it changed. */\n refresh(): boolean {\n const { source, attribute } = this;\n if (source.version === this.version) return false;\n this.version = source.version;\n for (const { start, count } of source.updateRanges) attribute.addUpdateRange(start, count);\n source.clearUpdateRanges();\n attribute.needsUpdate = true;\n return true;\n }\n\n dispose(): void {\n this.attribute.dispose();\n }\n}\n\n/** A CPU instanceColor's mirror: its RGB padded to the four floats a storage colour holds, in an array of its own. */\nexport class ColorMirror {\n readonly attribute: StorageInstancedBufferAttribute;\n private version: number;\n\n constructor(readonly source: InstancedBufferAttribute) {\n this.attribute = new StorageInstancedBufferAttribute(new Float32Array(source.count * 4), 4);\n this.copy(0, source.count);\n this.version = source.version;\n }\n\n /** Take in the source's edits: the instances of the ranges the app marked changed, all without any. Whether it changed. */\n refresh(): boolean {\n const { source, attribute } = this;\n if (source.version === this.version) return false;\n this.version = source.version;\n const ranges = source.updateRanges.length > 0 ? source.updateRanges : [{ start: 0, count: source.array.length }];\n for (const { start, count } of ranges) {\n const first = Math.floor(start / 3);\n const end = Math.min(Math.ceil((start + count) / 3), source.count);\n this.copy(first, end);\n attribute.addUpdateRange(first * 4, (end - first) * 4);\n }\n source.clearUpdateRanges();\n attribute.needsUpdate = true;\n return true;\n }\n\n dispose(): void {\n this.attribute.dispose();\n }\n\n /** Copy instances `first` to `end` (exclusive) of the source, white's alpha padding them. */\n private copy(first: number, end: number): void {\n const from = this.source.array;\n const to = this.attribute.array;\n for (let i = first; i < end; i++) {\n to[i * 4] = from[i * 3] ?? 0;\n to[i * 4 + 1] = from[i * 3 + 1] ?? 0;\n to[i * 4 + 2] = from[i * 3 + 2] ?? 0;\n to[i * 4 + 3] = 1;\n }\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"raycast.js","sourceRoot":"","sources":["../../src/instanced/raycast.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAA+D,MAAM,cAAc,CAAC;AACjH,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAStC,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAC9B,MAAM,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC;AACtB,MAAM,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;AAC5B,MAAM,QAAQ,GAAG,IAAI,OAAO,EAAE,CAAC;AAC/B,MAAM,KAAK,GAAG,IAAI,OAAO,EAAE,CAAC;AAC5B,MAAM,IAAI,GAAmB,EAAE,CAAC;AAEhC;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,GAAa,EAAE,MAAqB,EAAE,QAA2B,EAAE,KAAa,EAAE,SAAoB,EAAE,UAA0B;IACjK,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;IAC7E,6GAA6G;IAC7G,MAAM,MAAM,GAAG,IAAI,GAAG,EAAiB,CAAC;IACxC,KAAK,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,MAAM,CAAC,KAAK;QAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IACpF,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC;QAC3C,QAAQ,CAAC,SAAS,CAAC,QAAQ,EAAE,KAAK,GAAG,EAAE,CAAC,CAAC;QACzC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QAC9D,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;QACvD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAC,MAAM,CAAC;YAAE,SAAS;QACnE,KAAK,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,MAAM;YACpC,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,gBAAgB,CAAC,GAAG,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,CAAC;gBAAE,UAAU,CAAC,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC;IAClL,CAAC;AACH,CAAC;AAED,6DAA6D;AAC7D,SAAS,MAAM,CAAC,IAAU,EAAE,WAAoB,EAAE,SAAoB;IACpE,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC;IAC7B,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;IAChB,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;IAC/B,IAAI,CAAC;QACH,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IAChC,CAAC;YAAS,CAAC;QACT,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC;IACzB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
1
+ {"version":3,"file":"raycast.js","sourceRoot":"","sources":["../../src/instanced/raycast.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAA+D,MAAM,cAAc,CAAC;AACjH,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAStC,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAC9B,MAAM,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC;AACtB,MAAM,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;AAC5B,MAAM,QAAQ,GAAG,IAAI,OAAO,EAAE,CAAC;AAC/B,MAAM,KAAK,GAAG,IAAI,OAAO,EAAE,CAAC;AAC5B,MAAM,IAAI,GAAmB,EAAE,CAAC;AAEhC;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,GAAa,EAAE,MAAqB,EAAE,QAA2B,EAAE,KAAa,EAAE,SAAoB,EAAE,UAA0B;IACjK,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;IAC7E,6GAA6G;IAC7G,MAAM,MAAM,GAAG,IAAI,GAAG,EAAiB,CAAC;IACxC,KAAK,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,MAAM,CAAC,KAAK;QAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IACpF,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC;QAC3C,QAAQ,CAAC,SAAS,CAAC,QAAQ,EAAE,KAAK,GAAG,EAAE,CAAC,CAAC;QACzC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QAC9D,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;QACvD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAC,MAAM,CAAC;YAAE,SAAS;QACnE,KAAK,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,MAAM;YACpC,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,gBAAgB,CAAC,GAAG,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,CAAC;gBAAE,UAAU,CAAC,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC;IAClL,CAAC;AACH,CAAC;AAED,6DAA6D;AAC7D,SAAS,MAAM,CAAC,IAAU,EAAE,WAAoB,EAAE,SAAoB;IACpE,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC;IAC7B,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;IAChB,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;IAC/B,IAAI,CAAC;QACH,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IAChC,CAAC;YAAS,CAAC;QACT,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC;IACzB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC","sourcesContent":["import { Matrix4, Ray, Sphere, type Intersection, type Mesh, type Object3D, type Raycaster } from \"three/webgpu\";\nimport { stretch } from \"../three.js\";\nimport type { Part } from \"./meshes.js\";\n\n/** A Lod's source level as a raycast meets it: its parts, and the sphere around every level in an instance's space. */\nexport interface RaycastSource {\n readonly parts: readonly Part[];\n readonly rest: Sphere;\n}\n\nconst inverse = new Matrix4();\nconst ray = new Ray();\nconst sphere = new Sphere();\nconst instance = new Matrix4();\nconst world = new Matrix4();\nconst hits: Intersection[] = [];\n\n/**\n * Hits on the first `count` instances of `matrices`, `lod`'s, of `source`'s meshes, each raycast where an instance\n * stands, with `instanceId` set as on an InstancedMesh's hits.\n */\nexport function raycastInstances(lod: Object3D, source: RaycastSource, matrices: ArrayLike<number>, count: number, raycaster: Raycaster, intersects: Intersection[]): void {\n ray.copy(raycaster.ray).applyMatrix4(inverse.copy(lod.matrixWorld).invert());\n // A mesh of several material groups is a part per group: it is hit once. A mesh's parts share its placement.\n const meshes = new Map<Mesh, Matrix4>();\n for (const { template, placement } of source.parts) meshes.set(template, placement);\n for (let index = 0; index < count; index++) {\n instance.fromArray(matrices, index * 16);\n sphere.center.copy(source.rest.center).applyMatrix4(instance);\n sphere.radius = source.rest.radius * stretch(instance);\n if (sphere.radius === 0 || !ray.intersectsSphere(sphere)) continue;\n for (const [mesh, placement] of meshes)\n for (const hit of hitsAt(mesh, world.multiplyMatrices(lod.matrixWorld, instance).multiply(placement), raycaster)) intersects.push({ ...hit, object: lod, instanceId: index });\n }\n}\n\n/** `mesh`'s own raycast, as if it stood at `matrixWorld`. */\nfunction hitsAt(mesh: Mesh, matrixWorld: Matrix4, raycaster: Raycaster): Intersection[] {\n const own = mesh.matrixWorld;\n hits.length = 0;\n mesh.matrixWorld = matrixWorld;\n try {\n mesh.raycast(raycaster, hits);\n } finally {\n mesh.matrixWorld = own;\n }\n return hits;\n}\n"]}
@@ -42,7 +42,14 @@ export interface IndirectDraw {
42
42
  }
43
43
  /** The words of `draws` as the indirect pass reads them: level, count, start and whether indexed, per draw. */
44
44
  export declare function drawWords(draws: readonly IndirectDraw[]): StorageBufferAttribute;
45
- export declare const wordsBuffer: () => StorageBufferAttribute;
45
+ /**
46
+ * Where the blocks start among the u32s: four per block, its first instance, its range's end and start, and its range's
47
+ * item of live counts, NO_LIVE_COUNT for none (see `LodCluster.liveCount`).
48
+ */
49
+ export declare const BLOCKS_AT: number;
50
+ export declare const NO_LIVE_COUNT = 4294967295;
51
+ /** The row's u32s and room for `blocks` blocks, one at least. */
52
+ export declare const wordsBuffer: (blocks: number) => StorageBufferAttribute;
46
53
  export declare const floatsBuffer: () => StorageBufferAttribute;
47
54
  /** Per level, how many instances its list holds for the camera sorting: the indirect pass clears them. */
48
55
  export declare const countsBuffer: () => StorageBufferAttribute;
@@ -1,6 +1,7 @@
1
1
  import { IndirectStorageBufferAttribute, StorageBufferAttribute } from "three/webgpu";
2
2
  import { MAX_LEVELS } from "../levels/draw.js";
3
- // What a Lod sorts by for one camera, as the sort passes read it (see update.ts): its row, of u32s and of f32s.
3
+ // What a Lod sorts by for one camera, as the sort passes read it (see update.ts): its row, of u32s and of f32s, and
4
+ // after the row's u32s, in their buffer, the blocks of instances it sorts.
4
5
  /** vec4s of the row's u32s and of its f32s. */
5
6
  export const INT_ROW = 6;
6
7
  export const FLOAT_ROW = 12;
@@ -27,7 +28,14 @@ export function drawWords(draws) {
27
28
  draws.forEach((draw, i) => values.set([draw.level, draw.count, draw.start, Number(draw.indexed)], i * 4));
28
29
  return new StorageBufferAttribute(values, 4);
29
30
  }
30
- export const wordsBuffer = () => new StorageBufferAttribute(new Uint32Array(INT_ROW * 4), 4);
31
+ /**
32
+ * Where the blocks start among the u32s: four per block, its first instance, its range's end and start, and its range's
33
+ * item of live counts, NO_LIVE_COUNT for none (see `LodCluster.liveCount`).
34
+ */
35
+ export const BLOCKS_AT = INT_ROW * 4;
36
+ export const NO_LIVE_COUNT = 0xffffffff;
37
+ /** The row's u32s and room for `blocks` blocks, one at least. */
38
+ export const wordsBuffer = (blocks) => new StorageBufferAttribute(new Uint32Array(BLOCKS_AT + Math.max(blocks, 1) * 4), 4);
31
39
  export const floatsBuffer = () => new StorageBufferAttribute(new Float32Array(FLOAT_ROW * 4), 4);
32
40
  /** Per level, how many instances its list holds for the camera sorting: the indirect pass clears them. */
33
41
  export const countsBuffer = () => new StorageBufferAttribute(new Uint32Array(MAX_LEVELS), 1);
@@ -1 +1 @@
1
- {"version":3,"file":"rows.js","sourceRoot":"","sources":["../../src/instanced/rows.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,8BAA8B,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AACtF,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/C,gHAAgH;AAEhH,+CAA+C;AAC/C,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,CAAC;AACzB,MAAM,CAAC,MAAM,SAAS,GAAG,EAAE,CAAC;AAE5B;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAW,CAAC;AACxF,MAAM,CAAC,MAAM,SAAS,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAW,CAAC;AAE3G,8EAA8E;AAC9E,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,MAAc,EAAE,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;AAEzD,2CAA2C;AAC3C,MAAM,CAAC,MAAM,QAAQ,GAAG,UAAU,CAAC;AAEnC,sFAAsF;AACtF,MAAM,CAAC,MAAM,UAAU,GAAG,EAAE,CAAC;AAU7B,+GAA+G;AAC/G,MAAM,UAAU,SAAS,CAAC,KAA8B;IACtD,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9D,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAC1G,OAAO,IAAI,sBAAsB,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,CAAC,MAAM,WAAW,GAAG,GAAG,EAAE,CAAC,IAAI,sBAAsB,CAAC,IAAI,WAAW,CAAC,OAAO,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC7F,MAAM,CAAC,MAAM,YAAY,GAAG,GAAG,EAAE,CAAC,IAAI,sBAAsB,CAAC,IAAI,YAAY,CAAC,SAAS,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACjG,0GAA0G;AAC1G,MAAM,CAAC,MAAM,YAAY,GAAG,GAAG,EAAE,CAAC,IAAI,sBAAsB,CAAC,IAAI,WAAW,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;AAC7F,sGAAsG;AACtG,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,KAAa,EAAE,EAAE,CAAC,IAAI,8BAA8B,CAAC,IAAI,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,GAAG,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"rows.js","sourceRoot":"","sources":["../../src/instanced/rows.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,8BAA8B,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AACtF,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/C,oHAAoH;AACpH,2EAA2E;AAE3E,+CAA+C;AAC/C,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,CAAC;AACzB,MAAM,CAAC,MAAM,SAAS,GAAG,EAAE,CAAC;AAE5B;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAW,CAAC;AACxF,MAAM,CAAC,MAAM,SAAS,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAW,CAAC;AAE3G,8EAA8E;AAC9E,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,MAAc,EAAE,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;AAEzD,2CAA2C;AAC3C,MAAM,CAAC,MAAM,QAAQ,GAAG,UAAU,CAAC;AAEnC,sFAAsF;AACtF,MAAM,CAAC,MAAM,UAAU,GAAG,EAAE,CAAC;AAU7B,+GAA+G;AAC/G,MAAM,UAAU,SAAS,CAAC,KAA8B;IACtD,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9D,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAC1G,OAAO,IAAI,sBAAsB,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;AAC/C,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,OAAO,GAAG,CAAC,CAAC;AACrC,MAAM,CAAC,MAAM,aAAa,GAAG,UAAU,CAAC;AAExC,iEAAiE;AACjE,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,MAAc,EAAE,EAAE,CAAC,IAAI,sBAAsB,CAAC,IAAI,WAAW,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACnI,MAAM,CAAC,MAAM,YAAY,GAAG,GAAG,EAAE,CAAC,IAAI,sBAAsB,CAAC,IAAI,YAAY,CAAC,SAAS,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACjG,0GAA0G;AAC1G,MAAM,CAAC,MAAM,YAAY,GAAG,GAAG,EAAE,CAAC,IAAI,sBAAsB,CAAC,IAAI,WAAW,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;AAC7F,sGAAsG;AACtG,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,KAAa,EAAE,EAAE,CAAC,IAAI,8BAA8B,CAAC,IAAI,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,GAAG,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC","sourcesContent":["import { IndirectStorageBufferAttribute, StorageBufferAttribute } from \"three/webgpu\";\nimport { MAX_LEVELS } from \"../levels/draw.js\";\n\n// What a Lod sorts by for one camera, as the sort passes read it (see update.ts): its row, of u32s and of f32s, and\n// after the row's u32s, in their buffer, the blocks of instances it sorts.\n\n/** vec4s of the row's u32s and of its f32s. */\nexport const INT_ROW = 6;\nexport const FLOAT_ROW = 12;\n\n/**\n * Where each vec4 of the row lies. Of its u32s (`INTS_AT`): `levels`, the level count, the coarsest level and the forced\n * level as `forcedWord` writes it; `masks`, the levels that draw nothing, whether they fade (1 or 0), those loaded and\n * those loaded before; `flags`, whether the camera is orthographic, cullDistance is set and its survivors scale (1 or\n * 0), and the draw count; `layout`, slots per list; `starts`, per level the first slot of its list, `UNLISTED` for none.\n * Of its f32s (`FLOATS_AT`): maxPixels of levels 0 to 3 and 4 to 7, the camera in the Lod's space (eye and pixels per\n * unit of subtense, or of size, ortho), one instance's source sphere, the arrival's progress, the reach of every level\n * and its sway, cullDistance's near and far, cullDistance's camera, and the frustum's six planes.\n */\nexport const INTS_AT = { levels: 0, masks: 1, flags: 2, layout: 3, starts: 4 } as const;\nexport const FLOATS_AT = { low: 0, high: 1, eye: 2, source: 3, values: 4, cullEye: 5, planes: 6 } as const;\n\n/** The forced level as the row holds it: one more, so that 0 is none (-1). */\nexport const forcedWord = (forced: number) => forced + 1;\n\n/** The start of a level without a list. */\nexport const UNLISTED = 0xffffffff;\n\n/** Bytes per indirect draw, including the unused final word of a non-indexed draw. */\nexport const DRAW_BYTES = 20;\n\n/** One indirect draw: a level's mesh, drawing `count` indices (or vertices) from `start`. */\nexport interface IndirectDraw {\n level: number;\n count: number;\n start: number;\n indexed: boolean;\n}\n\n/** The words of `draws` as the indirect pass reads them: level, count, start and whether indexed, per draw. */\nexport function drawWords(draws: readonly IndirectDraw[]): StorageBufferAttribute {\n const values = new Uint32Array(Math.max(draws.length, 1) * 4);\n draws.forEach((draw, i) => values.set([draw.level, draw.count, draw.start, Number(draw.indexed)], i * 4));\n return new StorageBufferAttribute(values, 4);\n}\n\n/**\n * Where the blocks start among the u32s: four per block, its first instance, its range's end and start, and its range's\n * item of live counts, NO_LIVE_COUNT for none (see `LodCluster.liveCount`).\n */\nexport const BLOCKS_AT = INT_ROW * 4;\nexport const NO_LIVE_COUNT = 0xffffffff;\n\n/** The row's u32s and room for `blocks` blocks, one at least. */\nexport const wordsBuffer = (blocks: number) => new StorageBufferAttribute(new Uint32Array(BLOCKS_AT + Math.max(blocks, 1) * 4), 4);\nexport const floatsBuffer = () => new StorageBufferAttribute(new Float32Array(FLOAT_ROW * 4), 4);\n/** Per level, how many instances its list holds for the camera sorting: the indirect pass clears them. */\nexport const countsBuffer = () => new StorageBufferAttribute(new Uint32Array(MAX_LEVELS), 1);\n/** Indirect draws only the GPU writes, zero until a sort writes them: nothing draws before a sort. */\nexport const argsBuffer = (draws: number) => new IndirectStorageBufferAttribute(new Uint32Array(Math.max(draws, 1) * (DRAW_BYTES / 4)), 1);\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"shape.js","sourceRoot":"","sources":["../../src/instanced/shape.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"shape.js","sourceRoot":"","sources":["../../src/instanced/shape.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAG9D,wHAAwH;AACxH,MAAM,OAAO,aAAa;IACxB,0DAA0D;IACjD,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;IAC/B,kDAAkD;IACzC,IAAI,GAAG,IAAI,MAAM,EAAE,CAAC;IAC7B,wFAAwF;IAC/E,SAAS,GAAW,CAAC,CAAC;IAC/B,oGAAoG;IACpG,UAAU,GAAG,CAAC,CAAC;IACf,iGAAiG;IACxF,MAAM,GAAW,CAAC,CAAC;IAC5B,yBAAyB;IACR,QAAQ,GAAG,IAAI,IAAI,EAAE,CAAC;IACvC,yDAAyD;IACjD,IAAI,GAAG,CAAC,CAAC;IAEjB,oEAAoE;IACpE,YAAY,MAA2B;QACrC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAChC,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,aAAa,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACrD,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC,MAAM,CAAC;QAC5B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACzB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACvB,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC;QAChC,KAAK,MAAM,KAAK,IAAI,MAAM;YAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;QACjE,iFAAiF;QACjF,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE;YAAE,OAAO;QACpC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC;QAC5D,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC;QAC7B,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC;QACnC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CACzB,IAAI,CAAC,IAAI,CAAC,MAAM,EAChB,IAAI,CAAC,KAAK,CACR,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,EAChE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,EAChE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CACjE,CACF,CAAC;IACJ,CAAC;IAED,uFAAuF;IACvF,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5C,CAAC;IAED,yEAAyE;IACzE,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;IAChD,CAAC;IAED,oGAAoG;IACpG,IAAI,CAAC,OAAe,EAAE,KAAa,EAAE,KAAa;QAChD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,OAAO,CAAC;QAC/C,oFAAoF;QACpF,MAAM,KAAK,GAAG,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;QAC7G,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAClE,CAAC;CACF","sourcesContent":["import { Box3, Sphere, Vector3 } from \"three/webgpu\";\nimport { levelBox, measureLevels } from \"../levels/bounds.js\";\nimport type { LodLevel } from \"../levels/index.js\";\n\n/** One instance of a Lod as its levels measure it, in its own space: what heights, bounds and fades are measured by. */\nexport class InstanceShape {\n /** The source's sphere, which heights are measured by. */\n readonly source = new Sphere();\n /** Around every level, unloaded ones included. */\n readonly rest = new Sphere();\n /** The source's radius in its own space, which default thresholds are measured from. */\n readonly ownRadius: number = 0;\n /** The source's radius padded for sway, where fades and shadow casters are cut off (see `wind`). */\n fadeRadius = 0;\n /** The diagonal of every level's box: how much a cluster's box shows of its instances' scale. */\n readonly extent: number = 0;\n /** Every level's box. */\n private readonly envelope = new Box3();\n /** How far levels sway beyond `rest`, relative to it. */\n private sway = 0;\n\n /** The shape of `inputs`, the levels given; none without levels. */\n constructor(inputs: readonly LodLevel[]) {\n if (inputs.length === 0) return;\n const { own, placed } = measureLevels(inputs, \"Lod\");\n this.ownRadius = own.radius;\n this.source.copy(placed);\n this.rest.copy(placed);\n this.fadeRadius = placed.radius;\n for (const input of inputs) this.envelope.union(levelBox(input));\n // Metadata includes unloaded levels, so later arrivals cannot pass the envelope.\n if (this.envelope.isEmpty()) return;\n this.extent = this.envelope.getSize(new Vector3()).length();\n const { center } = this.rest;\n const { min, max } = this.envelope;\n this.rest.radius = Math.max(\n this.rest.radius,\n Math.hypot(\n Math.max(Math.abs(min.x - center.x), Math.abs(max.x - center.x)),\n Math.max(Math.abs(min.y - center.y), Math.abs(max.y - center.y)),\n Math.max(Math.abs(min.z - center.z), Math.abs(max.z - center.z)),\n ),\n );\n }\n\n /** The radius around the source's centre that every level and its sway stay within. */\n get reach(): number {\n return this.rest.radius * (1 + this.sway);\n }\n\n /** How far from the instance's origin every level and its sway reach. */\n get originReach(): number {\n return this.rest.center.length() + this.reach;\n }\n\n /** Sway as wind of `slope` above `baseY` moves it, the source's fade radius padded by `padding`. */\n wind(padding: number, slope: number, baseY: number): void {\n this.fadeRadius = this.source.radius + padding;\n // The wind's shape comes from the source, but taller or offset levels sway farther.\n const reach = slope * Math.max(Math.abs(this.envelope.min.y - baseY), Math.abs(this.envelope.max.y - baseY));\n this.sway = this.rest.radius > 0 ? reach / this.rest.radius : 0;\n }\n}\n"]}
@@ -2,6 +2,7 @@ import { StorageInstancedBufferAttribute, type Camera, type Frustum, type Render
2
2
  import type { d } from "typegpu";
3
3
  import { type DrawLevels } from "../levels/draw.js";
4
4
  import type { InstanceSlots } from "../levels/fade.js";
5
+ import type { LodLiveCount } from "./clusters.js";
5
6
  import type { Cull } from "./cull.js";
6
7
  import { type IndirectDraw } from "./rows.js";
7
8
  /** What a Lod sorts by for a camera, everything in its space. */
@@ -32,6 +33,8 @@ export declare class Sorter {
32
33
  private scaled;
33
34
  /** Where survivors' scaled matrices go while none scale: never written, as no survivor scales. */
34
35
  private readonly unscaled;
36
+ /** What the sort reads as live counts while no range has one: never read. */
37
+ private readonly noLiveCounts;
35
38
  private passes;
36
39
  /** `listed` tells, as a mask, which levels have an instance list: those that draw something. */
37
40
  constructor(listed: number);
@@ -42,10 +45,11 @@ export declare class Sorter {
42
45
  /** Where `camera`'s lists and indirect draws lie; null before a sort was written for it. */
43
46
  slotsOf(camera: Camera): InstanceSlots | null;
44
47
  /**
45
- * Write `values` as what `camera` sorts by, over the instances of `ranges` (start and count, flat), `instances` in
46
- * all, sorted at the camera's next draw. Its lists grow to hold them, within `limit` bytes per buffer.
48
+ * Write `values` as what `camera` sorts by, over the instances of `ranges` (start, count and item of `liveCounts`,
49
+ * flat), `instances` in all, sorted at the camera's next draw. Its lists grow to hold them, within `limit` bytes per
50
+ * buffer.
47
51
  */
48
- write(camera: Camera, values: RowValues, ranges: readonly number[], instances: number, limit: number): void;
52
+ write(camera: Camera, values: RowValues, ranges: readonly number[], liveCounts: LodLiveCount["attribute"] | null, instances: number, limit: number): void;
49
53
  /** Sort for `camera` on `renderer`, in one compute call, if due: before a level mesh draws for it. */
50
54
  run(renderer: Renderer, camera: Camera, matrices: StorageInstancedBufferAttribute): void;
51
55
  /** `camera` no longer draws the Lod: its buffers are freed. */
@@ -54,7 +58,7 @@ export declare class Sorter {
54
58
  private makeBuffers;
55
59
  /** Grow `buffers`' lists to hold `instances` per level, by doubling, each buffer within `limit` bytes. */
56
60
  private grow;
57
- /** Write the blocks of `ranges` into `buffers`: one empty block for none, as a dispatch visits one at least. */
61
+ /** Write the blocks of `ranges` into `buffers`, growing its words: one empty block for none, as a dispatch visits one at least. */
58
62
  private writeBlocks;
59
63
  /** Write the layout of `buffers`' lists and the draw count into its row. */
60
64
  private place;