@woosh/meep-engine 3.45.0 → 3.46.0

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 (216) hide show
  1. package/build/bundle-worker-terrain.js +1 -1
  2. package/package.json +1 -1
  3. package/src/core/assert.d.ts.map +1 -1
  4. package/src/core/assert.js +5 -1
  5. package/src/core/binary/hash/XXH128Hash.d.ts +1 -37
  6. package/src/core/binary/hash/XXH128Hash.d.ts.map +1 -1
  7. package/src/core/binary/hash/XXH128Hash.js +4 -55
  8. package/src/core/binary/hash/XXH3_SECRET.d.ts +1 -12
  9. package/src/core/binary/hash/XXH3_SECRET.d.ts.map +1 -1
  10. package/src/core/binary/hash/XXH3_SECRET.js +4 -25
  11. package/src/core/binary/hash/crc32.d.ts +1 -15
  12. package/src/core/binary/hash/crc32.d.ts.map +1 -1
  13. package/src/core/binary/hash/crc32.js +4 -96
  14. package/src/core/binary/hash/xxh3_128.d.ts +1 -9
  15. package/src/core/binary/hash/xxh3_128.d.ts.map +1 -1
  16. package/src/core/binary/hash/xxh3_128.js +4 -341
  17. package/src/core/binary/hash/xxh3_64.d.ts +1 -8
  18. package/src/core/binary/hash/xxh3_64.d.ts.map +1 -1
  19. package/src/core/binary/hash/xxh3_64.js +4 -241
  20. package/src/core/binary/hash/xxh3_common.d.ts +1 -223
  21. package/src/core/binary/hash/xxh3_common.d.ts.map +1 -1
  22. package/src/core/binary/hash/xxh3_common.js +90 -476
  23. package/src/core/collection/array/combine_hash.d.ts +6 -0
  24. package/src/core/collection/array/combine_hash.d.ts.map +1 -1
  25. package/src/core/collection/array/combine_hash.js +6 -0
  26. package/src/core/function/FunctionCompiler.js +2 -2
  27. package/src/core/geom/3d/mat4/m4_multiply.d.ts +3 -0
  28. package/src/core/geom/3d/mat4/m4_multiply.d.ts.map +1 -1
  29. package/src/core/geom/3d/mat4/m4_multiply.js +3 -0
  30. package/src/core/geom/3d/mat4/m4_multiply_f64.d.ts +30 -0
  31. package/src/core/geom/3d/mat4/m4_multiply_f64.d.ts.map +1 -0
  32. package/src/core/geom/3d/mat4/m4_multiply_f64.js +106 -0
  33. package/src/core/geom/ConicRay.js +2 -2
  34. package/src/core/geom/Vector4.d.ts.map +1 -1
  35. package/src/core/geom/Vector4.js +8 -5
  36. package/src/core/math/hash/XXH128Hash.d.ts +38 -0
  37. package/src/core/math/hash/XXH128Hash.d.ts.map +1 -0
  38. package/src/core/math/hash/XXH128Hash.js +55 -0
  39. package/src/core/math/hash/XXH3_SECRET.d.ts +13 -0
  40. package/src/core/math/hash/XXH3_SECRET.d.ts.map +1 -0
  41. package/src/core/math/hash/XXH3_SECRET.js +25 -0
  42. package/src/core/math/hash/crc32.d.ts +16 -0
  43. package/src/core/math/hash/crc32.d.ts.map +1 -0
  44. package/src/core/math/hash/crc32.js +96 -0
  45. package/src/core/math/hash/xxh3_128.d.ts +10 -0
  46. package/src/core/math/hash/xxh3_128.d.ts.map +1 -0
  47. package/src/core/math/hash/xxh3_128.js +341 -0
  48. package/src/core/math/hash/xxh3_64.d.ts +9 -0
  49. package/src/core/math/hash/xxh3_64.d.ts.map +1 -0
  50. package/src/core/math/hash/xxh3_64.js +241 -0
  51. package/src/core/math/hash/xxh3_common.d.ts +224 -0
  52. package/src/core/math/hash/xxh3_common.d.ts.map +1 -0
  53. package/src/core/math/hash/xxh3_common.js +476 -0
  54. package/src/core/math/lookup/ParameterLookupTable.js +2 -2
  55. package/src/core/model/node-graph/node/NodeInstancePortReference.js +2 -2
  56. package/src/core/model/reactive/model/ReactiveBinaryExpression.js +2 -2
  57. package/src/core/model/reactive/model/terminal/ReactiveReference.js +2 -2
  58. package/src/engine/asset/AssetDescription.js +2 -2
  59. package/src/engine/ecs/animation/Animation.js +2 -2
  60. package/src/engine/ecs/animation/AnimationClip.d.ts.map +1 -1
  61. package/src/engine/ecs/animation/AnimationClip.js +7 -5
  62. package/src/engine/ecs/gui/GUIElement.d.ts.map +1 -1
  63. package/src/engine/ecs/gui/GUIElement.js +7 -5
  64. package/src/engine/ecs/gui/hud/HeadsUpDisplay.js +2 -2
  65. package/src/engine/ecs/gui/position/ViewportPosition.d.ts.map +1 -1
  66. package/src/engine/ecs/gui/position/ViewportPosition.js +11 -7
  67. package/src/engine/ecs/transform/Transform64.d.ts +1 -1
  68. package/src/engine/ecs/transform/Transform64.d.ts.map +1 -1
  69. package/src/engine/ecs/transform/Transform64.js +5 -4
  70. package/src/engine/graphics/ecs/animation/animator/AnimationClip.d.ts.map +1 -1
  71. package/src/engine/graphics/ecs/animation/animator/AnimationClip.js +8 -5
  72. package/src/engine/graphics/ecs/animation/animator/AnimationClipDefinition.js +2 -2
  73. package/src/engine/graphics/ecs/animation/animator/AnimationNotification.js +2 -2
  74. package/src/engine/graphics/ecs/animation/animator/AnimationNotificationDefinition.js +2 -2
  75. package/src/engine/graphics/ecs/animation/animator/graph/definition/AnimationGraphDefinition.js +2 -2
  76. package/src/engine/graphics/ecs/animation/animator/graph/definition/AnimationStateDefinition.js +2 -2
  77. package/src/engine/graphics/ecs/animation/animator/graph/definition/AnimationTransitionDefinition.d.ts.map +1 -1
  78. package/src/engine/graphics/ecs/animation/animator/graph/definition/AnimationTransitionDefinition.js +8 -5
  79. package/src/engine/graphics/ecs/decal/v2/Decal.d.ts.map +1 -1
  80. package/src/engine/graphics/ecs/decal/v2/Decal.js +9 -8
  81. package/src/engine/graphics/render/frame_graph/resource/TextureResourceDescriptor.d.ts.map +1 -1
  82. package/src/engine/graphics/render/frame_graph/resource/TextureResourceDescriptor.js +9 -6
  83. package/src/engine/graphics3/ParticipatingMedia.js +204 -204
  84. package/src/engine/graphics3/animation/AnimationClips.d.ts +5 -0
  85. package/src/engine/graphics3/animation/AnimationClips.d.ts.map +1 -1
  86. package/src/engine/graphics3/animation/AnimationClips.js +5 -0
  87. package/src/engine/grid/obstacle/GridObstacle.js +2 -2
  88. package/src/engine/intelligence/behavior/selector/WeightedElement.js +2 -2
  89. package/src/engine/interpolation/Interpolated.js +2 -2
  90. package/src/engine/physics/cloth/ecs/Cloth.d.ts.map +1 -1
  91. package/src/engine/physics/cloth/ecs/Cloth.js +7 -5
  92. package/src/engine/physics/cloth/ecs/ClothCollider.d.ts.map +1 -1
  93. package/src/engine/physics/cloth/ecs/ClothCollider.js +7 -5
  94. package/src/engine/physics/cloth/ecs/ClothDynamics.d.ts.map +1 -1
  95. package/src/engine/physics/cloth/ecs/ClothDynamics.js +20 -11
  96. package/src/engine/physics/fluid/FluidField.d.ts.map +1 -1
  97. package/src/engine/physics/fluid/FluidField.js +7 -5
  98. package/src/engine/physics/fluid/ecs/FluidComponent.d.ts.map +1 -1
  99. package/src/engine/physics/fluid/ecs/FluidComponent.js +19 -11
  100. package/src/engine/physics/fluid/effector/AbstractFluidEffector.d.ts +2 -2
  101. package/src/engine/physics/fluid/effector/AbstractFluidEffector.js +2 -2
  102. package/src/engine/physics/fluid/effector/GlobalFluidEffector.d.ts.map +1 -1
  103. package/src/engine/physics/fluid/effector/GlobalFluidEffector.js +11 -7
  104. package/src/engine/physics/fluid/effector/ImpulseFluidEffector.d.ts.map +1 -1
  105. package/src/engine/physics/fluid/effector/ImpulseFluidEffector.js +11 -7
  106. package/src/engine/physics/fluid/effector/WakeFluidEffector.d.ts.map +1 -1
  107. package/src/engine/physics/fluid/effector/WakeFluidEffector.js +16 -9
  108. package/src/engine/sound/ecs/audio/AudioEmitter.d.ts.map +1 -1
  109. package/src/engine/sound/ecs/audio/AudioEmitter.js +12 -7
  110. package/src/engine/sound/ecs/trigger/AudioEventTrigger.d.ts.map +1 -1
  111. package/src/engine/sound/ecs/trigger/AudioEventTrigger.js +192 -191
  112. package/src/engine/sound/simulation/core/AcousticMedium.js +2 -2
  113. package/src/engine/sound/simulation/definition/AcousticDirectivity.js +2 -2
  114. package/src/engine/sound/simulation/definition/AcousticMaterial.d.ts.map +1 -1
  115. package/src/engine/sound/simulation/definition/AcousticMaterial.js +11 -7
  116. package/src/engine/sound/sopra/definition/BusDefinition.d.ts.map +1 -1
  117. package/src/engine/sound/sopra/definition/BusDefinition.js +5 -4
  118. package/src/engine/sound/sopra/definition/DuckingRule.d.ts.map +1 -1
  119. package/src/engine/sound/sopra/definition/DuckingRule.js +7 -5
  120. package/src/engine/sound/sopra/definition/EventDescription.d.ts.map +1 -1
  121. package/src/engine/sound/sopra/definition/EventDescription.js +23 -13
  122. package/src/engine/sound/sopra/definition/MixerSnapshot.js +2 -2
  123. package/src/engine/sound/sopra/definition/ParameterDefinition.d.ts.map +1 -1
  124. package/src/engine/sound/sopra/definition/ParameterDefinition.js +7 -5
  125. package/src/engine/sound/sopra/definition/clip/AbstractAudioClip.js +2 -2
  126. package/src/engine/sound/sopra/definition/clip/BlendContainerAudioClip.d.ts.map +1 -1
  127. package/src/engine/sound/sopra/definition/clip/BlendContainerAudioClip.js +4 -3
  128. package/src/engine/sound/sopra/definition/clip/ContainerAudioClip.js +2 -2
  129. package/src/engine/sound/sopra/definition/clip/RandomContainerAudioClip.js +3 -3
  130. package/src/engine/sound/sopra/definition/clip/SampleAudioClip.d.ts.map +1 -1
  131. package/src/engine/sound/sopra/definition/clip/SampleAudioClip.js +16 -9
  132. package/src/engine/sound/sopra/definition/clip/SilenceAudioClip.js +2 -2
  133. package/src/engine/sound/sopra/definition/clip/SwitchContainerAudioClip.d.ts +1 -1
  134. package/src/engine/sound/sopra/definition/clip/SwitchContainerAudioClip.d.ts.map +1 -1
  135. package/src/engine/sound/sopra/definition/clip/SwitchContainerAudioClip.js +2 -2
  136. package/src/engine/sound/sopra/definition/effect/CompressorEffect.d.ts.map +1 -1
  137. package/src/engine/sound/sopra/definition/effect/CompressorEffect.js +7 -5
  138. package/src/engine/sound/sopra/definition/effect/EqEffect.d.ts.map +1 -1
  139. package/src/engine/sound/sopra/definition/effect/EqEffect.js +8 -5
  140. package/src/engine/sound/sopra/definition/effect/ReverbEffect.js +2 -2
  141. package/src/engine/sound/sopra/legacy/SoundEmitter.d.ts.map +1 -1
  142. package/src/engine/sound/sopra/legacy/SoundEmitter.js +357 -352
  143. package/src/engine/sound/sopra/legacy/SoundTrack.d.ts.map +1 -1
  144. package/src/engine/sound/sopra/legacy/SoundTrack.js +281 -278
  145. package/src/format/image/png/PNGReader.js +644 -644
  146. package/src/format/image/png/crc32.d.ts +1 -1
  147. package/src/format/image/png/crc32.js +7 -8
  148. package/src/shade/descriptor/binding/BindGroupLayoutDescriptor.js +2 -2
  149. package/src/shade/descriptor/binding/BindGroupLayoutEntry.d.ts.map +1 -1
  150. package/src/shade/descriptor/binding/BindGroupLayoutEntry.js +12 -8
  151. package/src/shade/descriptor/binding/StorageTextureBindingLayout.js +2 -2
  152. package/src/shade/descriptor/binding/TextureBindingLayout.js +2 -2
  153. package/src/shade/descriptor/blend/BlendComponent.js +2 -2
  154. package/src/shade/descriptor/pipeline/PipelineDescriptorBase.js +2 -2
  155. package/src/shade/descriptor/pipeline/PipelineLayoutDescriptor.js +2 -2
  156. package/src/shade/descriptor/pipeline/ProgrammableStage.js +2 -2
  157. package/src/shade/descriptor/pipeline/compute/ComputePipelineDescriptor.js +2 -2
  158. package/src/shade/descriptor/pipeline/render/ColorTargetState.js +2 -2
  159. package/src/shade/descriptor/pipeline/render/FragmentState.js +2 -2
  160. package/src/shade/descriptor/pipeline/render/PrimitiveState.js +2 -2
  161. package/src/shade/descriptor/pipeline/render/RenderPipelineDescriptor.d.ts.map +1 -1
  162. package/src/shade/descriptor/pipeline/render/RenderPipelineDescriptor.js +8 -5
  163. package/src/shade/descriptor/pipeline/render/VertexAttribute.js +2 -2
  164. package/src/shade/descriptor/texture/SamplerDescriptor.d.ts.map +1 -1
  165. package/src/shade/descriptor/texture/SamplerDescriptor.js +20 -12
  166. package/src/shade/descriptor/texture/TextureDescriptor.d.ts.map +1 -1
  167. package/src/shade/descriptor/texture/TextureDescriptor.js +11 -7
  168. package/src/shade/device/graph/BufferResourceDescriptor.d.ts.map +1 -1
  169. package/src/shade/device/graph/BufferResourceDescriptor.js +196 -193
  170. package/src/shade/device/graph/TextureResourceDescriptor.d.ts.map +1 -1
  171. package/src/shade/device/graph/TextureResourceDescriptor.js +178 -173
  172. package/src/shade/device/timing/profile/sgpt_read_header.js +1 -1
  173. package/src/shade/device/timing/profile/sgpt_read_records.js +1 -1
  174. package/src/shade/device/timing/profile/sgpt_write_header.js +1 -1
  175. package/src/shade/device/timing/profile/sgpt_write_record.js +1 -1
  176. package/src/shade/renderer/binding/BufferBinding.js +2 -2
  177. package/src/shade/renderer/camera/Camera.js +2 -2
  178. package/src/shade/renderer/geometry/Attribute.js +2 -2
  179. package/src/shade/renderer/geometry/Geometry.js +2 -2
  180. package/src/shade/renderer/geometry/geometry_deduplicate_vertices.js +2 -2
  181. package/src/shade/renderer/geometry/meshlet/MeshletBatch.js +2 -2
  182. package/src/shade/renderer/geometry/virtual/format/checksum/vgeo_compute_asset_id.js +13 -13
  183. package/src/shade/renderer/geometry/virtual/format/checksum/vgeo_compute_directory_block_checksum.js +41 -41
  184. package/src/shade/renderer/geometry/virtual/format/checksum/vgeo_compute_frame_checksum.js +41 -41
  185. package/src/shade/renderer/geometry/virtual/format/checksum/vgeo_compute_header_checksum.js +25 -25
  186. package/src/shade/renderer/material/StandardShadeMaterial.d.ts.map +1 -1
  187. package/src/shade/renderer/material/StandardShadeMaterial.js +13 -8
  188. package/src/shade/renderer/scene/optimization/geometry/internal/triangle_fingerprint_stream.d.ts.map +1 -1
  189. package/src/shade/renderer/scene/optimization/geometry/internal/triangle_fingerprint_stream.js +14 -5
  190. package/src/shade/renderer/scene/optimization/sampler2d_from_image_bitmap.js +1 -1
  191. package/src/shade/renderer/shader/type/WGSLStructField.js +2 -2
  192. package/src/shade/renderer/shader/type/WebGPUArray.js +2 -2
  193. package/src/shade/renderer/shader/type/WebGPUStruct.d.ts.map +1 -1
  194. package/src/shade/renderer/shader/type/WebGPUStruct.js +9 -6
  195. package/src/shade/renderer/texture/ShadeTexture.d.ts.map +1 -1
  196. package/src/shade/renderer/texture/ShadeTexture.js +17 -10
  197. package/src/shade/renderer/texture/mipmaps/WebGPUMipmapGenerator.js +2 -2
  198. package/src/shade/renderer/water/surface/chunk_water_surface_sample.d.ts +4 -4
  199. package/src/shade/renderer/water/surface/chunk_water_surface_sample.js +6 -6
  200. package/src/shade/renderer/water/surface/particles/GPUWaterParticles.d.ts.map +1 -1
  201. package/src/shade/renderer/water/surface/particles/GPUWaterParticles.js +46 -55
  202. package/src/shade/renderer/water/surface/particles/WATER_PARTICLE_STRUCT.d.ts +3 -3
  203. package/src/shade/renderer/water/surface/particles/WATER_PARTICLE_STRUCT.d.ts.map +1 -1
  204. package/src/shade/renderer/water/surface/particles/WATER_PARTICLE_STRUCT.js +14 -4
  205. package/src/shade/renderer/water/surface/particles/chunk_water_particle.d.ts +10 -1
  206. package/src/shade/renderer/water/surface/particles/chunk_water_particle.d.ts.map +1 -1
  207. package/src/shade/renderer/water/surface/particles/chunk_water_particle.js +82 -40
  208. package/src/shade/renderer/water/surface/particles/chunk_water_particle_step.d.ts +4 -1
  209. package/src/shade/renderer/water/surface/particles/chunk_water_particle_step.d.ts.map +1 -1
  210. package/src/shade/renderer/water/surface/particles/chunk_water_particle_step.js +8 -4
  211. package/src/shade/renderer/water/surface/particles/shader_water_particles.d.ts +98 -86
  212. package/src/shade/renderer/water/surface/particles/shader_water_particles.d.ts.map +1 -1
  213. package/src/shade/renderer/water/surface/particles/shader_water_particles.js +440 -298
  214. package/src/view/common/HTMLElementCacheKey.d.ts.map +1 -1
  215. package/src/view/common/HTMLElementCacheKey.js +4 -3
  216. package/src/view/minimap/MinimapMarker.js +2 -2
@@ -1,174 +1,179 @@
1
- import { assert } from "../../../core/assert.js";
2
- import { array_copy } from "../../../core/collection/array/array_copy.js";
3
- import { combine_hash } from "../../../core/collection/array/combine_hash.js";
4
- import { isArrayEqualStrict } from "../../../core/collection/array/isArrayEqualStrict.js";
5
- import { computeHashFloatArray } from "../../../core/math/hash/computeHashFloatArray.js";
6
- import { computeStringHash } from "../../../core/primitives/strings/computeStringHash.js";
7
- import {
8
- ResourceDescriptor
9
- } from "../../../engine/graphics/render/frame_graph/resource/ResourceDescriptor.js";
10
- import { texture_mip_level_count } from "../../util/texture_mip_extent.js";
11
- import { decode_bitmask_enum } from "../decode_bitmask_enum.js";
12
- import { GPUTextureUsage } from "../../descriptor/GPUTextureUsage.js";
13
-
14
- /**
15
- * **Vestigial.** Nothing branches on it — see {@link TextureResourceDescriptor.resolution_domain}.
16
- *
17
- * @enum {number}
18
- */
19
- export const TextureResolutionDomain = {
20
- Absolute: 0,
21
- PresentationRelative: 1
22
- }
23
-
24
- export class TextureResourceDescriptor extends ResourceDescriptor {
25
- /**
26
- * **Vestigial. Do not read this to decide how to interpret {@link resolution}.**
27
- *
28
- * No code branches on it; only {@link hash} folds it in. {@link from} stores whatever
29
- * resolution it is given without touching this field, and every caller gives it pixels — so a
30
- * descriptor's resolution is absolute pixels whatever this says, including on the default
31
- * `PresentationRelative` that {@link from} leaves in place.
32
- *
33
- * @type {TextureResolutionDomain|number}
34
- */
35
- resolution_domain = TextureResolutionDomain.PresentationRelative;
36
-
37
- // TODO use Uint32 instead
38
- resolution = new Float64Array([1, 1, 1]);
39
- sampleCount = 1;
40
-
41
- mipLevelCount = 1;
42
-
43
- /**
44
- *
45
- * @type {GPUTextureDimension|string}
46
- */
47
- dimension = "2d"
48
-
49
- /**
50
- * @type {string|GPUTextureFormat}
51
- */
52
- format = "rgba8unorm";
53
-
54
- /**
55
- * @type {number|GPUTextureUsageFlags}
56
- */
57
- usage = GPUTextureUsage.TEXTURE_BINDING;
58
-
59
- /**
60
- *
61
- * @param {Object} options
62
- * @param {number[]} options.resolution
63
- * @param {GPUTextureDimension|string} [options.dimension]
64
- * @param {GPUTextureFormat|string} options.format
65
- * @param {GPUTextureUsageFlags|number} [options.usage]
66
- * @param {boolean} [options.enableMips]
67
- * @returns {TextureResourceDescriptor}
68
- */
69
- static from({
70
- resolution,
71
- dimension = "2d",
72
- format,
73
- usage = GPUTextureUsage.TEXTURE_BINDING,
74
- enableMips = false
75
- }) {
76
-
77
- assert.isString(format, 'format');
78
- assert.defined(resolution, 'resolution');
79
- assert.isArrayLike(resolution, 'resolution');
80
- assert.isBoolean(enableMips, 'enableMips');
81
-
82
- const r = new TextureResourceDescriptor();
83
-
84
- array_copy(resolution, 0, r.resolution, 0, Math.min(r.resolution.length, resolution.length));
85
- r.dimension = dimension;
86
- r.format = format;
87
- r.usage = usage;
88
-
89
- if (enableMips === true) {
90
-
91
- // `r.resolution` rather than the argument: it has already been padded to three, so a
92
- // caller that gave two axes reads as depth 1 instead of `undefined`
93
- r.mipLevelCount = texture_mip_level_count(
94
- r.resolution[0], r.resolution[1], r.resolution[2], r.dimension
95
- );
96
-
97
- }
98
-
99
- return r;
100
-
101
- }
102
-
103
- /**
104
- *
105
- * @param {GPUTexture} texture
106
- * @returns {TextureResourceDescriptor}
107
- */
108
- static fromTexture(texture) {
109
- const r = new TextureResourceDescriptor();
110
-
111
- r.format = texture.format;
112
- r.dimension = texture.dimension;
113
-
114
- r.usage = texture.usage;
115
- r.sampleCount = texture.sampleCount;
116
- r.resolution_domain = TextureResolutionDomain.Absolute;
117
-
118
- r.resolution[0] = texture.width;
119
- r.resolution[1] = texture.height;
120
- r.resolution[2] = texture.depthOrArrayLayers;
121
-
122
-
123
- r.mipLevelCount = texture.mipLevelCount;
124
-
125
- return r;
126
- }
127
-
128
- get type() {
129
- return "texture";
130
- }
131
-
132
- hash() {
133
- return combine_hash(
134
- this.resolution_domain,
135
- this.mipLevelCount,
136
- computeHashFloatArray(this.resolution),
137
- this.sampleCount,
138
- this.usage,
139
- computeStringHash(this.format)
140
- );
141
- }
142
-
143
- /**
144
- *
145
- * @param {TextureResourceDescriptor} other
146
- * @returns {boolean}
147
- */
148
- equals(other) {
149
- if (this === other) {
150
- return true;
151
- }
152
-
153
- // A texture and a buffer descriptor share one `ImmutableObjectPool` in
154
- // `RenderResourceManager`, so a hash collision puts a buffer in front of this method. The
155
- // type check has to come first: without it the very next line reads `other.resolution.length`
156
- // on undefined and the probe throws instead of missing the cache.
157
- if (!super.equals(other)) {
158
- return false;
159
- }
160
-
161
- return isArrayEqualStrict(this.resolution, other.resolution)
162
- && this.mipLevelCount === other.mipLevelCount
163
- && this.resolution_domain === other.resolution_domain
164
- && this.sampleCount === other.sampleCount
165
- && this.dimension === other.dimension
166
- && this.format === other.format
167
- && this.usage === other.usage
168
- ;
169
- }
170
-
171
- toString() {
172
- return `Texture{ resolution = [${this.resolution.join(",")}], mipLevelCount = ${this.mipLevelCount}, dimension = ${this.dimension}, format = ${this.format}, usage = ${decode_bitmask_enum(this.usage, GPUTextureUsage).join(' | ')}, sampleCount = ${this.sampleCount} }`;
173
- }
1
+ import { assert } from "../../../core/assert.js";
2
+ import { array_copy } from "../../../core/collection/array/array_copy.js";
3
+ import { hash_mix2 } from "../../../core/math/hash/hash_mix2.js";
4
+ import { hash_mix3 } from "../../../core/math/hash/hash_mix3.js";
5
+ import { isArrayEqualStrict } from "../../../core/collection/array/isArrayEqualStrict.js";
6
+ import { computeHashFloatArray } from "../../../core/math/hash/computeHashFloatArray.js";
7
+ import { computeStringHash } from "../../../core/primitives/strings/computeStringHash.js";
8
+ import {
9
+ ResourceDescriptor
10
+ } from "../../../engine/graphics/render/frame_graph/resource/ResourceDescriptor.js";
11
+ import { texture_mip_level_count } from "../../util/texture_mip_extent.js";
12
+ import { decode_bitmask_enum } from "../decode_bitmask_enum.js";
13
+ import { GPUTextureUsage } from "../../descriptor/GPUTextureUsage.js";
14
+
15
+ /**
16
+ * **Vestigial.** Nothing branches on it — see {@link TextureResourceDescriptor.resolution_domain}.
17
+ *
18
+ * @enum {number}
19
+ */
20
+ export const TextureResolutionDomain = {
21
+ Absolute: 0,
22
+ PresentationRelative: 1
23
+ }
24
+
25
+ export class TextureResourceDescriptor extends ResourceDescriptor {
26
+ /**
27
+ * **Vestigial. Do not read this to decide how to interpret {@link resolution}.**
28
+ *
29
+ * No code branches on it; only {@link hash} folds it in. {@link from} stores whatever
30
+ * resolution it is given without touching this field, and every caller gives it pixels — so a
31
+ * descriptor's resolution is absolute pixels whatever this says, including on the default
32
+ * `PresentationRelative` that {@link from} leaves in place.
33
+ *
34
+ * @type {TextureResolutionDomain|number}
35
+ */
36
+ resolution_domain = TextureResolutionDomain.PresentationRelative;
37
+
38
+ // TODO use Uint32 instead
39
+ resolution = new Float64Array([1, 1, 1]);
40
+ sampleCount = 1;
41
+
42
+ mipLevelCount = 1;
43
+
44
+ /**
45
+ *
46
+ * @type {GPUTextureDimension|string}
47
+ */
48
+ dimension = "2d"
49
+
50
+ /**
51
+ * @type {string|GPUTextureFormat}
52
+ */
53
+ format = "rgba8unorm";
54
+
55
+ /**
56
+ * @type {number|GPUTextureUsageFlags}
57
+ */
58
+ usage = GPUTextureUsage.TEXTURE_BINDING;
59
+
60
+ /**
61
+ *
62
+ * @param {Object} options
63
+ * @param {number[]} options.resolution
64
+ * @param {GPUTextureDimension|string} [options.dimension]
65
+ * @param {GPUTextureFormat|string} options.format
66
+ * @param {GPUTextureUsageFlags|number} [options.usage]
67
+ * @param {boolean} [options.enableMips]
68
+ * @returns {TextureResourceDescriptor}
69
+ */
70
+ static from({
71
+ resolution,
72
+ dimension = "2d",
73
+ format,
74
+ usage = GPUTextureUsage.TEXTURE_BINDING,
75
+ enableMips = false
76
+ }) {
77
+
78
+ assert.isString(format, 'format');
79
+ assert.defined(resolution, 'resolution');
80
+ assert.isArrayLike(resolution, 'resolution');
81
+ assert.isBoolean(enableMips, 'enableMips');
82
+
83
+ const r = new TextureResourceDescriptor();
84
+
85
+ array_copy(resolution, 0, r.resolution, 0, Math.min(r.resolution.length, resolution.length));
86
+ r.dimension = dimension;
87
+ r.format = format;
88
+ r.usage = usage;
89
+
90
+ if (enableMips === true) {
91
+
92
+ // `r.resolution` rather than the argument: it has already been padded to three, so a
93
+ // caller that gave two axes reads as depth 1 instead of `undefined`
94
+ r.mipLevelCount = texture_mip_level_count(
95
+ r.resolution[0], r.resolution[1], r.resolution[2], r.dimension
96
+ );
97
+
98
+ }
99
+
100
+ return r;
101
+
102
+ }
103
+
104
+ /**
105
+ *
106
+ * @param {GPUTexture} texture
107
+ * @returns {TextureResourceDescriptor}
108
+ */
109
+ static fromTexture(texture) {
110
+ const r = new TextureResourceDescriptor();
111
+
112
+ r.format = texture.format;
113
+ r.dimension = texture.dimension;
114
+
115
+ r.usage = texture.usage;
116
+ r.sampleCount = texture.sampleCount;
117
+ r.resolution_domain = TextureResolutionDomain.Absolute;
118
+
119
+ r.resolution[0] = texture.width;
120
+ r.resolution[1] = texture.height;
121
+ r.resolution[2] = texture.depthOrArrayLayers;
122
+
123
+
124
+ r.mipLevelCount = texture.mipLevelCount;
125
+
126
+ return r;
127
+ }
128
+
129
+ get type() {
130
+ return "texture";
131
+ }
132
+
133
+ hash() {
134
+ return hash_mix2(
135
+ hash_mix3(
136
+ hash_mix3(
137
+ this.resolution_domain,
138
+ this.mipLevelCount,
139
+ computeHashFloatArray(this.resolution)
140
+ ),
141
+ this.sampleCount,
142
+ this.usage
143
+ ),
144
+ computeStringHash(this.format)
145
+ );
146
+ }
147
+
148
+ /**
149
+ *
150
+ * @param {TextureResourceDescriptor} other
151
+ * @returns {boolean}
152
+ */
153
+ equals(other) {
154
+ if (this === other) {
155
+ return true;
156
+ }
157
+
158
+ // A texture and a buffer descriptor share one `ImmutableObjectPool` in
159
+ // `RenderResourceManager`, so a hash collision puts a buffer in front of this method. The
160
+ // type check has to come first: without it the very next line reads `other.resolution.length`
161
+ // on undefined and the probe throws instead of missing the cache.
162
+ if (!super.equals(other)) {
163
+ return false;
164
+ }
165
+
166
+ return isArrayEqualStrict(this.resolution, other.resolution)
167
+ && this.mipLevelCount === other.mipLevelCount
168
+ && this.resolution_domain === other.resolution_domain
169
+ && this.sampleCount === other.sampleCount
170
+ && this.dimension === other.dimension
171
+ && this.format === other.format
172
+ && this.usage === other.usage
173
+ ;
174
+ }
175
+
176
+ toString() {
177
+ return `Texture{ resolution = [${this.resolution.join(",")}], mipLevelCount = ${this.mipLevelCount}, dimension = ${this.dimension}, format = ${this.format}, usage = ${decode_bitmask_enum(this.usage, GPUTextureUsage).join(' | ')}, sampleCount = ${this.sampleCount} }`;
178
+ }
174
179
  }
@@ -1,5 +1,5 @@
1
1
  import { assert } from "../../../../core/assert.js";
2
- import { crc32 } from "../../../../core/binary/hash/crc32.js";
2
+ import { crc32 } from "../../../../core/math/hash/crc32.js";
3
3
  import { SGPT_DEFECT } from "./SGPT_DEFECT.js";
4
4
  import { SGPTDefect } from "./SGPTDefect.js";
5
5
  import { SGPT_FORMAT_VERSION } from "./SGPT_FORMAT_VERSION.js";
@@ -1,5 +1,5 @@
1
1
  import { assert } from "../../../../core/assert.js";
2
- import { crc32 } from "../../../../core/binary/hash/crc32.js";
2
+ import { crc32 } from "../../../../core/math/hash/crc32.js";
3
3
  import { SGPT_DEFECT } from "./SGPT_DEFECT.js";
4
4
  import { SGPTDefect } from "./SGPTDefect.js";
5
5
  import { SGPT_HEADER_SIZE } from "./SGPT_HEADER_SIZE.js";
@@ -1,5 +1,5 @@
1
1
  import { assert } from "../../../../core/assert.js";
2
- import { crc32 } from "../../../../core/binary/hash/crc32.js";
2
+ import { crc32 } from "../../../../core/math/hash/crc32.js";
3
3
  import { SGPT_FORMAT_VERSION } from "./SGPT_FORMAT_VERSION.js";
4
4
  import { SGPT_HEADER_CHECKSUM_COVERAGE } from "./SGPT_HEADER_CHECKSUM_COVERAGE.js";
5
5
  import { SGPT_HEADER_OFFSET } from "./SGPT_HEADER_OFFSET.js";
@@ -1,5 +1,5 @@
1
1
  import { assert } from "../../../../core/assert.js";
2
- import { crc32 } from "../../../../core/binary/hash/crc32.js";
2
+ import { crc32 } from "../../../../core/math/hash/crc32.js";
3
3
  import { SGPT_RECORD_HEADER_SIZE } from "./SGPT_RECORD_HEADER_SIZE.js";
4
4
  import { SGPT_RECORD_SYNC } from "./SGPT_RECORD_SYNC.js";
5
5
 
@@ -1,4 +1,4 @@
1
- import { combine_hash } from "../../../core/collection/array/combine_hash.js";
1
+ import { hash_mix3 } from "../../../core/math/hash/hash_mix3.js";
2
2
  import { BindingResource } from "./BindingResource.js";
3
3
 
4
4
  /**
@@ -35,7 +35,7 @@ export class BufferBinding extends BindingResource {
35
35
  * @returns {number}
36
36
  */
37
37
  hash() {
38
- return combine_hash(
38
+ return hash_mix3(
39
39
  this.offset,
40
40
  this.actual_size,
41
41
  this.buffer.id
@@ -1,5 +1,5 @@
1
1
  import { assert } from "../../../core/assert.js";
2
- import { combine_hash } from "../../../core/collection/array/combine_hash.js";
2
+ import { hash_mix3 } from "../../../core/math/hash/hash_mix3.js";
3
3
  import { m4_allocate } from "../../../core/geom/3d/mat4/m4_allocate.js";
4
4
  import { m4_multiply } from "../../../core/geom/3d/mat4/m4_multiply.js";
5
5
  import { plane3_normalize } from "../../../core/geom/3d/plane/plane3_normalize.js";
@@ -189,7 +189,7 @@ export class Camera {
189
189
  }
190
190
 
191
191
  hash() {
192
- return combine_hash(
192
+ return hash_mix3(
193
193
  computeHashFloat(this.#near),
194
194
  computeHashFloat(this.#far),
195
195
  computeHashFloat(this.#aspect),
@@ -1,5 +1,5 @@
1
1
  import { assert } from "../../../core/assert.js";
2
- import { combine_hash } from "../../../core/collection/array/combine_hash.js";
2
+ import { hash_mix3 } from "../../../core/math/hash/hash_mix3.js";
3
3
  import {
4
4
  compute_binary_data_type_from_typed_array
5
5
  } from "../../../core/collection/array/typed/compute_binary_data_type_from_typed_array.js";
@@ -89,7 +89,7 @@ export class Attribute {
89
89
  }
90
90
 
91
91
  hash() {
92
- return combine_hash(
92
+ return hash_mix3(
93
93
  this.spec.hash(),
94
94
  this.count,
95
95
  sparse_typed_array_hash(this.data, 0, this.data.length)
@@ -1,5 +1,5 @@
1
1
  import { assert } from "../../../core/assert.js";
2
- import { combine_hash } from "../../../core/collection/array/combine_hash.js";
2
+ import { hash_mix3 } from "../../../core/math/hash/hash_mix3.js";
3
3
  import { computeHashArray } from "../../../core/collection/array/computeHashArray.js";
4
4
  import { isArrayEqual } from "../../../core/collection/array/isArrayEqual.js";
5
5
  import { aabb3_from_v3_array } from "../../../core/geom/3d/aabb/aabb3_from_v3_array.js";
@@ -178,7 +178,7 @@ export class Geometry {
178
178
 
179
179
  hash() {
180
180
 
181
- return combine_hash(
181
+ return hash_mix3(
182
182
  computeStringHash(this.name),
183
183
  optional_hash(this.index),
184
184
  computeHashArray(this.attributes, invokeObjectHash)
@@ -1,5 +1,5 @@
1
1
  import { reinterpret_float32_as_int32 } from "../../../core/binary/reinterpret_float32_as_int32.js";
2
- import { combine_hash } from "../../../core/collection/array/combine_hash.js";
2
+ import { hash_mix2 } from "../../../core/math/hash/hash_mix2.js";
3
3
  import { Attribute } from "./Attribute.js";
4
4
  import { Geometry } from "./Geometry.js";
5
5
  import { StandardAttributes } from "./StandardAttributes.js";
@@ -125,7 +125,7 @@ function vertex_hash(datas, strides, num_attrs, vertex_index) {
125
125
  // canonicalize -0 to +0: they compare `===` in vertices_equal but have
126
126
  // different bit patterns, which would scatter equal vertices across buckets
127
127
  const value = data[base + s];
128
- h = combine_hash(h, reinterpret_float32_as_int32(value === 0 ? 0 : value));
128
+ h = hash_mix2(h, reinterpret_float32_as_int32(value === 0 ? 0 : value));
129
129
  }
130
130
  }
131
131
  return h | 0;
@@ -2,7 +2,7 @@ import { assert } from "../../../../core/assert.js";
2
2
  import { BinaryBuffer } from "../../../../core/binary/BinaryBuffer.js";
3
3
  import { platform_compute_endianness } from "../../../../core/binary/platform_compute_endianness.js";
4
4
  import { BinaryDataType } from "../../../../core/binary/type/BinaryDataType.js";
5
- import { combine_hash } from "../../../../core/collection/array/combine_hash.js";
5
+ import { hash_mix2 } from "../../../../core/math/hash/hash_mix2.js";
6
6
  import { array_buffer_hash } from "../../../../core/collection/array/typed/array_buffer_hash.js";
7
7
  import { is_array_buffer_equals } from "../../../../core/collection/array/typed/is_array_buffer_equals.js";
8
8
  import { RowFirstTable } from "../../../../core/collection/table/RowFirstTable.js";
@@ -119,7 +119,7 @@ export class MeshletBatch {
119
119
  hash() {
120
120
  const meta = this.#metadata;
121
121
 
122
- return combine_hash(
122
+ return hash_mix2(
123
123
  this.#count,
124
124
  array_buffer_hash(meta, 0, meta.byteLength)
125
125
  );
@@ -1,13 +1,13 @@
1
- import { xxh3_128 } from "../../../../../../core/binary/hash/xxh3_128.js";
2
- import { vgeo_asset_id_preimage } from "./vgeo_asset_id_preimage.js";
3
-
4
- /**
5
- * @param {BinaryBuffer} buffer whole file
6
- * @returns {XXH128Hash} the asset's identity
7
- *
8
- * @author Alex Goldring
9
- * @copyright Company Named Limited (c) 2026
10
- */
11
- export function vgeo_compute_asset_id(buffer) {
12
- return xxh3_128(vgeo_asset_id_preimage(buffer).raw_bytes);
13
- }
1
+ import { xxh3_128 } from "../../../../../../core/math/hash/xxh3_128.js";
2
+ import { vgeo_asset_id_preimage } from "./vgeo_asset_id_preimage.js";
3
+
4
+ /**
5
+ * @param {BinaryBuffer} buffer whole file
6
+ * @returns {XXH128Hash} the asset's identity
7
+ *
8
+ * @author Alex Goldring
9
+ * @copyright Company Named Limited (c) 2026
10
+ */
11
+ export function vgeo_compute_asset_id(buffer) {
12
+ return xxh3_128(vgeo_asset_id_preimage(buffer).raw_bytes);
13
+ }
@@ -1,41 +1,41 @@
1
- import { xxh3_64 } from "../../../../../../core/binary/hash/xxh3_64.js";
2
- import { VGEO_DIRECTORY_BLOCK_RECORDS } from "../directory/VGEO_DIRECTORY_BLOCK_RECORDS.js";
3
- import { VGEO_DIRECTORY_RECORD_SIZE } from "../directory/VGEO_DIRECTORY_RECORD_SIZE.js";
4
-
5
- /**
6
- * The checksum of one 4 KB directory block. The final block is short whenever the record count is
7
- * not a multiple of {@link VGEO_DIRECTORY_BLOCK_RECORDS}, and covers only the records that exist.
8
- *
9
- * The seed is taken from `asset_id`, which is why {@link vgeo_asset_id_preimage} zeroes this region
10
- * before hashing: the two would otherwise be defined in terms of each other.
11
- *
12
- * @param {BinaryBuffer} buffer whole file
13
- * @param {number} directory_offset
14
- * @param {number} total_pages
15
- * @param {number} block_index
16
- * @param {bigint} asset_id_high64
17
- * @returns {bigint}
18
- *
19
- * @author Alex Goldring
20
- * @copyright Company Named Limited (c) 2026
21
- */
22
- export function vgeo_compute_directory_block_checksum(
23
- buffer,
24
- directory_offset,
25
- total_pages,
26
- block_index,
27
- asset_id_high64
28
- ) {
29
- const first_record = block_index * VGEO_DIRECTORY_BLOCK_RECORDS;
30
-
31
- const record_count = Math.min(VGEO_DIRECTORY_BLOCK_RECORDS, total_pages - first_record);
32
-
33
- const start = directory_offset + first_record * VGEO_DIRECTORY_RECORD_SIZE;
34
-
35
- const seed = asset_id_high64 ^ BigInt(block_index);
36
-
37
- return xxh3_64(
38
- buffer.raw_bytes.subarray(start, start + record_count * VGEO_DIRECTORY_RECORD_SIZE),
39
- seed
40
- );
41
- }
1
+ import { xxh3_64 } from "../../../../../../core/math/hash/xxh3_64.js";
2
+ import { VGEO_DIRECTORY_BLOCK_RECORDS } from "../directory/VGEO_DIRECTORY_BLOCK_RECORDS.js";
3
+ import { VGEO_DIRECTORY_RECORD_SIZE } from "../directory/VGEO_DIRECTORY_RECORD_SIZE.js";
4
+
5
+ /**
6
+ * The checksum of one 4 KB directory block. The final block is short whenever the record count is
7
+ * not a multiple of {@link VGEO_DIRECTORY_BLOCK_RECORDS}, and covers only the records that exist.
8
+ *
9
+ * The seed is taken from `asset_id`, which is why {@link vgeo_asset_id_preimage} zeroes this region
10
+ * before hashing: the two would otherwise be defined in terms of each other.
11
+ *
12
+ * @param {BinaryBuffer} buffer whole file
13
+ * @param {number} directory_offset
14
+ * @param {number} total_pages
15
+ * @param {number} block_index
16
+ * @param {bigint} asset_id_high64
17
+ * @returns {bigint}
18
+ *
19
+ * @author Alex Goldring
20
+ * @copyright Company Named Limited (c) 2026
21
+ */
22
+ export function vgeo_compute_directory_block_checksum(
23
+ buffer,
24
+ directory_offset,
25
+ total_pages,
26
+ block_index,
27
+ asset_id_high64
28
+ ) {
29
+ const first_record = block_index * VGEO_DIRECTORY_BLOCK_RECORDS;
30
+
31
+ const record_count = Math.min(VGEO_DIRECTORY_BLOCK_RECORDS, total_pages - first_record);
32
+
33
+ const start = directory_offset + first_record * VGEO_DIRECTORY_RECORD_SIZE;
34
+
35
+ const seed = asset_id_high64 ^ BigInt(block_index);
36
+
37
+ return xxh3_64(
38
+ buffer.raw_bytes.subarray(start, start + record_count * VGEO_DIRECTORY_RECORD_SIZE),
39
+ seed
40
+ );
41
+ }