@woosh/meep-engine 3.45.0 → 3.47.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 (435) hide show
  1. package/build/bundle-worker-terrain.js +1 -1
  2. package/editor/actions/concrete/TransformModifyAction.d.ts.map +1 -1
  3. package/editor/actions/concrete/TransformModifyAction.js +10 -2
  4. package/editor/ecs/component/FieldDescriptor.js +15 -0
  5. package/editor/ecs/component/createObjectEditor.js +41 -12
  6. package/editor/ecs/component/editors/ecs/Transform64Editor.d.ts.map +1 -1
  7. package/editor/ecs/component/editors/ecs/Transform64Editor.js +77 -70
  8. package/editor/tools/TransformToolV2.d.ts.map +1 -1
  9. package/editor/tools/TransformToolV2.js +4 -0
  10. package/editor/tools/v2/TransformControls.d.ts.map +1 -1
  11. package/editor/tools/v2/TransformControls.js +7 -0
  12. package/editor/view/ecs/EntityEditor.d.ts.map +1 -1
  13. package/editor/view/ecs/EntityEditor.js +4 -2
  14. package/package.json +1 -1
  15. package/src/core/assert.d.ts.map +1 -1
  16. package/src/core/assert.js +5 -1
  17. package/src/core/binary/hash/XXH128Hash.d.ts +1 -37
  18. package/src/core/binary/hash/XXH128Hash.d.ts.map +1 -1
  19. package/src/core/binary/hash/XXH128Hash.js +4 -55
  20. package/src/core/binary/hash/XXH3_SECRET.d.ts +1 -12
  21. package/src/core/binary/hash/XXH3_SECRET.d.ts.map +1 -1
  22. package/src/core/binary/hash/XXH3_SECRET.js +4 -25
  23. package/src/core/binary/hash/crc32.d.ts +1 -15
  24. package/src/core/binary/hash/crc32.d.ts.map +1 -1
  25. package/src/core/binary/hash/crc32.js +4 -96
  26. package/src/core/binary/hash/xxh3_128.d.ts +1 -9
  27. package/src/core/binary/hash/xxh3_128.d.ts.map +1 -1
  28. package/src/core/binary/hash/xxh3_128.js +4 -341
  29. package/src/core/binary/hash/xxh3_64.d.ts +1 -8
  30. package/src/core/binary/hash/xxh3_64.d.ts.map +1 -1
  31. package/src/core/binary/hash/xxh3_64.js +4 -241
  32. package/src/core/binary/hash/xxh3_common.d.ts +1 -223
  33. package/src/core/binary/hash/xxh3_common.d.ts.map +1 -1
  34. package/src/core/binary/hash/xxh3_common.js +90 -476
  35. package/src/core/collection/array/array_insert_at.d.ts +16 -0
  36. package/src/core/collection/array/array_insert_at.d.ts.map +1 -0
  37. package/src/core/collection/array/array_insert_at.js +32 -0
  38. package/src/core/collection/array/array_remove_at.d.ts +15 -0
  39. package/src/core/collection/array/array_remove_at.d.ts.map +1 -0
  40. package/src/core/collection/array/array_remove_at.js +30 -0
  41. package/src/core/collection/array/combine_hash.d.ts +6 -0
  42. package/src/core/collection/array/combine_hash.d.ts.map +1 -1
  43. package/src/core/collection/array/combine_hash.js +6 -0
  44. package/src/core/function/FunctionCompiler.js +2 -2
  45. package/src/core/geom/3d/mat4/m4_multiply.d.ts +3 -0
  46. package/src/core/geom/3d/mat4/m4_multiply.d.ts.map +1 -1
  47. package/src/core/geom/3d/mat4/m4_multiply.js +3 -0
  48. package/src/core/geom/3d/mat4/m4_multiply_f64.d.ts +30 -0
  49. package/src/core/geom/3d/mat4/m4_multiply_f64.d.ts.map +1 -0
  50. package/src/core/geom/3d/mat4/m4_multiply_f64.js +106 -0
  51. package/src/core/geom/3d/quaternion/quat3_look_rotation.d.ts +37 -0
  52. package/src/core/geom/3d/quaternion/quat3_look_rotation.d.ts.map +1 -0
  53. package/src/core/geom/3d/quaternion/quat3_look_rotation.js +172 -0
  54. package/src/core/geom/ConicRay.js +2 -2
  55. package/src/core/geom/Quaternion.d.ts +1 -0
  56. package/src/core/geom/Quaternion.d.ts.map +1 -1
  57. package/src/core/geom/Quaternion.js +12 -48
  58. package/src/core/geom/Vector4.d.ts.map +1 -1
  59. package/src/core/geom/Vector4.js +8 -5
  60. package/src/core/math/hash/XXH128Hash.d.ts +38 -0
  61. package/src/core/math/hash/XXH128Hash.d.ts.map +1 -0
  62. package/src/core/math/hash/XXH128Hash.js +55 -0
  63. package/src/core/math/hash/XXH3_SECRET.d.ts +13 -0
  64. package/src/core/math/hash/XXH3_SECRET.d.ts.map +1 -0
  65. package/src/core/math/hash/XXH3_SECRET.js +25 -0
  66. package/src/core/math/hash/crc32.d.ts +16 -0
  67. package/src/core/math/hash/crc32.d.ts.map +1 -0
  68. package/src/core/math/hash/crc32.js +96 -0
  69. package/src/core/math/hash/xxh3_128.d.ts +10 -0
  70. package/src/core/math/hash/xxh3_128.d.ts.map +1 -0
  71. package/src/core/math/hash/xxh3_128.js +341 -0
  72. package/src/core/math/hash/xxh3_64.d.ts +9 -0
  73. package/src/core/math/hash/xxh3_64.d.ts.map +1 -0
  74. package/src/core/math/hash/xxh3_64.js +241 -0
  75. package/src/core/math/hash/xxh3_common.d.ts +224 -0
  76. package/src/core/math/hash/xxh3_common.d.ts.map +1 -0
  77. package/src/core/math/hash/xxh3_common.js +476 -0
  78. package/src/core/math/lookup/ParameterLookupTable.js +2 -2
  79. package/src/core/model/node-graph/node/NodeInstancePortReference.js +2 -2
  80. package/src/core/model/reactive/model/ReactiveBinaryExpression.js +2 -2
  81. package/src/core/model/reactive/model/terminal/ReactiveReference.js +2 -2
  82. package/src/engine/Engine.d.ts.map +1 -1
  83. package/src/engine/Engine.js +9 -4
  84. package/src/engine/asset/AssetDescription.js +2 -2
  85. package/src/engine/ecs/animation/Animation.js +2 -2
  86. package/src/engine/ecs/animation/AnimationClip.d.ts.map +1 -1
  87. package/src/engine/ecs/animation/AnimationClip.js +7 -5
  88. package/src/engine/ecs/gui/GUIElement.d.ts.map +1 -1
  89. package/src/engine/ecs/gui/GUIElement.js +7 -5
  90. package/src/engine/ecs/gui/hud/HeadsUpDisplay.js +2 -2
  91. package/src/engine/ecs/gui/position/ViewportPosition.d.ts.map +1 -1
  92. package/src/engine/ecs/gui/position/ViewportPosition.js +11 -7
  93. package/src/engine/ecs/storage/populateEngineSerializationRegistry.d.ts.map +1 -1
  94. package/src/engine/ecs/storage/populateEngineSerializationRegistry.js +10 -0
  95. package/src/engine/ecs/transform/Transform64.d.ts +1 -1
  96. package/src/engine/ecs/transform/Transform64.d.ts.map +1 -1
  97. package/src/engine/ecs/transform/Transform64.js +5 -4
  98. package/src/engine/ecs/transform/t64_look_rotation.d.ts +4 -4
  99. package/src/engine/ecs/transform/t64_look_rotation.d.ts.map +1 -1
  100. package/src/engine/ecs/transform/t64_look_rotation.js +7 -18
  101. package/src/engine/graphics/ecs/animation/animator/AnimationClip.d.ts.map +1 -1
  102. package/src/engine/graphics/ecs/animation/animator/AnimationClip.js +8 -5
  103. package/src/engine/graphics/ecs/animation/animator/AnimationClipDefinition.js +2 -2
  104. package/src/engine/graphics/ecs/animation/animator/AnimationNotification.js +2 -2
  105. package/src/engine/graphics/ecs/animation/animator/AnimationNotificationDefinition.js +2 -2
  106. package/src/engine/graphics/ecs/animation/animator/graph/definition/AnimationGraphDefinition.js +2 -2
  107. package/src/engine/graphics/ecs/animation/animator/graph/definition/AnimationStateDefinition.js +2 -2
  108. package/src/engine/graphics/ecs/animation/animator/graph/definition/AnimationTransitionDefinition.d.ts.map +1 -1
  109. package/src/engine/graphics/ecs/animation/animator/graph/definition/AnimationTransitionDefinition.js +8 -5
  110. package/src/engine/graphics/ecs/camera/topdown/TopDownCameraControllerSystem.d.ts.map +1 -1
  111. package/src/engine/graphics/ecs/camera/topdown/TopDownCameraControllerSystem.js +30 -1
  112. package/src/engine/graphics/ecs/decal/v2/Decal.d.ts.map +1 -1
  113. package/src/engine/graphics/ecs/decal/v2/Decal.js +9 -8
  114. package/src/engine/graphics/render/frame_graph/resource/TextureResourceDescriptor.d.ts.map +1 -1
  115. package/src/engine/graphics/render/frame_graph/resource/TextureResourceDescriptor.js +9 -6
  116. package/src/engine/graphics3/GPUParticleEmitterSystem.d.ts +6 -0
  117. package/src/engine/graphics3/GPUParticleEmitterSystem.d.ts.map +1 -1
  118. package/src/engine/graphics3/GPUParticleEmitterSystem.js +72 -29
  119. package/src/engine/graphics3/ParticipatingMedia.js +204 -204
  120. package/src/engine/graphics3/animation/AnimationClips.d.ts +5 -0
  121. package/src/engine/graphics3/animation/AnimationClips.d.ts.map +1 -1
  122. package/src/engine/graphics3/animation/AnimationClips.js +5 -0
  123. package/src/engine/grid/obstacle/GridObstacle.js +2 -2
  124. package/src/engine/input/devices/KeyboardDevice.d.ts +1 -0
  125. package/src/engine/input/devices/KeyboardDevice.d.ts.map +1 -1
  126. package/src/engine/input/devices/KeyboardDevice.js +7 -6
  127. package/src/engine/intelligence/behavior/selector/WeightedElement.js +2 -2
  128. package/src/engine/interpolation/Interpolated.js +2 -2
  129. package/src/engine/navigation/ecs/path_following/PathFollowingSystem.d.ts.map +1 -1
  130. package/src/engine/navigation/ecs/path_following/PathFollowingSystem.js +15 -2
  131. package/src/engine/network/CONGESTION_CONTROL.md +9 -9
  132. package/src/engine/network/MESSAGE_TRANSPORT.md +364 -0
  133. package/src/engine/network/NetworkSession.d.ts +31 -11
  134. package/src/engine/network/NetworkSession.d.ts.map +1 -1
  135. package/src/engine/network/NetworkSession.js +453 -286
  136. package/src/engine/network/README.md +77 -27
  137. package/src/engine/network/SMOOTHNESS_DESIGN.md +13 -5
  138. package/src/engine/network/diagnostics/BandwidthMeter.d.ts +1 -1
  139. package/src/engine/network/diagnostics/BandwidthMeter.js +1 -1
  140. package/src/engine/network/orchestrator/HostJoin.d.ts +111 -0
  141. package/src/engine/network/orchestrator/HostJoin.d.ts.map +1 -0
  142. package/src/engine/network/orchestrator/HostJoin.js +271 -0
  143. package/src/engine/network/orchestrator/NetworkPeer.d.ts +151 -112
  144. package/src/engine/network/orchestrator/NetworkPeer.d.ts.map +1 -1
  145. package/src/engine/network/orchestrator/NetworkPeer.js +450 -499
  146. package/src/engine/network/orchestrator/PendingSlices.d.ts +30 -0
  147. package/src/engine/network/orchestrator/PendingSlices.d.ts.map +1 -0
  148. package/src/engine/network/orchestrator/PendingSlices.js +83 -0
  149. package/src/engine/network/orchestrator/ReliableFrames.d.ts +34 -0
  150. package/src/engine/network/orchestrator/ReliableFrames.d.ts.map +1 -0
  151. package/src/engine/network/orchestrator/ReliableFrames.js +96 -0
  152. package/src/engine/network/orchestrator/ServerAuthoritativeClient.d.ts +77 -10
  153. package/src/engine/network/orchestrator/ServerAuthoritativeClient.d.ts.map +1 -1
  154. package/src/engine/network/orchestrator/ServerAuthoritativeClient.js +236 -61
  155. package/src/engine/network/orchestrator/ServerAuthoritativeServer.d.ts +20 -6
  156. package/src/engine/network/orchestrator/ServerAuthoritativeServer.d.ts.map +1 -1
  157. package/src/engine/network/orchestrator/ServerAuthoritativeServer.js +33 -8
  158. package/src/engine/network/replication/Replicator.d.ts.map +1 -1
  159. package/src/engine/network/replication/Replicator.js +7 -1
  160. package/src/engine/network/sim/ActionLog.d.ts +32 -5
  161. package/src/engine/network/sim/ActionLog.d.ts.map +1 -1
  162. package/src/engine/network/sim/ActionLog.js +47 -5
  163. package/src/engine/network/sim/SimActionExecutor.d.ts +42 -2
  164. package/src/engine/network/sim/SimActionExecutor.d.ts.map +1 -1
  165. package/src/engine/network/sim/SimActionExecutor.js +100 -4
  166. package/src/engine/network/sim/Snapshotter.d.ts +12 -0
  167. package/src/engine/network/sim/Snapshotter.d.ts.map +1 -1
  168. package/src/engine/network/sim/Snapshotter.js +43 -0
  169. package/src/engine/network/state/Baseline.d.ts +1 -1
  170. package/src/engine/network/state/Baseline.js +1 -1
  171. package/src/engine/network/state/FrameBufferRing.d.ts +25 -6
  172. package/src/engine/network/state/FrameBufferRing.d.ts.map +1 -1
  173. package/src/engine/network/state/FrameBufferRing.js +51 -6
  174. package/src/engine/network/state/InputRing.d.ts +4 -0
  175. package/src/engine/network/state/InputRing.d.ts.map +1 -1
  176. package/src/engine/network/state/InputRing.js +7 -0
  177. package/src/engine/network/transport/DeferredTransport.d.ts.map +1 -1
  178. package/src/engine/network/transport/DeferredTransport.js +1 -0
  179. package/src/engine/network/transport/LoopbackTransport.d.ts.map +1 -1
  180. package/src/engine/network/transport/LoopbackTransport.js +4 -2
  181. package/src/engine/network/transport/Transport.d.ts +7 -0
  182. package/src/engine/network/transport/Transport.d.ts.map +1 -1
  183. package/src/engine/network/transport/Transport.js +8 -0
  184. package/src/engine/network/transport/adapters/NodeUDPTransport.d.ts.map +1 -1
  185. package/src/engine/network/transport/adapters/NodeUDPTransport.js +20 -5
  186. package/src/engine/network/transport/adapters/WebRTCDataChannelTransport.d.ts.map +1 -1
  187. package/src/engine/network/transport/adapters/WebRTCDataChannelTransport.js +8 -0
  188. package/src/engine/network/transport/adapters/WebTransportTransport.d.ts.map +1 -1
  189. package/src/engine/network/transport/adapters/WebTransportTransport.js +6 -0
  190. package/src/engine/network/transport/connection/Connection.d.ts +191 -0
  191. package/src/engine/network/transport/connection/Connection.d.ts.map +1 -0
  192. package/src/engine/network/transport/connection/Connection.js +1262 -0
  193. package/src/engine/network/transport/connection/RangeSet.d.ts +94 -0
  194. package/src/engine/network/transport/connection/RangeSet.d.ts.map +1 -0
  195. package/src/engine/network/transport/connection/RangeSet.js +260 -0
  196. package/src/engine/network/transport/connection/RxStream.d.ts +48 -0
  197. package/src/engine/network/transport/connection/RxStream.d.ts.map +1 -0
  198. package/src/engine/network/transport/connection/RxStream.js +211 -0
  199. package/src/engine/network/transport/connection/TxStream.d.ts +90 -0
  200. package/src/engine/network/transport/connection/TxStream.d.ts.map +1 -0
  201. package/src/engine/network/transport/connection/TxStream.js +243 -0
  202. package/src/engine/network/transport/connection/bytes_copy.d.ts +17 -0
  203. package/src/engine/network/transport/connection/bytes_copy.d.ts.map +1 -0
  204. package/src/engine/network/transport/connection/bytes_copy.js +34 -0
  205. package/src/engine/network/transport/connection/varint.d.ts +46 -0
  206. package/src/engine/network/transport/connection/varint.d.ts.map +1 -0
  207. package/src/engine/network/transport/connection/varint.js +107 -0
  208. package/src/engine/physics/cloth/ecs/Cloth.d.ts.map +1 -1
  209. package/src/engine/physics/cloth/ecs/Cloth.js +7 -5
  210. package/src/engine/physics/cloth/ecs/ClothCollider.d.ts.map +1 -1
  211. package/src/engine/physics/cloth/ecs/ClothCollider.js +7 -5
  212. package/src/engine/physics/cloth/ecs/ClothDynamics.d.ts.map +1 -1
  213. package/src/engine/physics/cloth/ecs/ClothDynamics.js +20 -11
  214. package/src/engine/physics/fluid/FluidField.d.ts.map +1 -1
  215. package/src/engine/physics/fluid/FluidField.js +7 -5
  216. package/src/engine/physics/fluid/ecs/FluidComponent.d.ts.map +1 -1
  217. package/src/engine/physics/fluid/ecs/FluidComponent.js +19 -11
  218. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
  219. package/src/engine/physics/fluid/effector/AbstractFluidEffector.d.ts +2 -2
  220. package/src/engine/physics/fluid/effector/AbstractFluidEffector.js +2 -2
  221. package/src/engine/physics/fluid/effector/GlobalFluidEffector.d.ts.map +1 -1
  222. package/src/engine/physics/fluid/effector/GlobalFluidEffector.js +11 -7
  223. package/src/engine/physics/fluid/effector/ImpulseFluidEffector.d.ts.map +1 -1
  224. package/src/engine/physics/fluid/effector/ImpulseFluidEffector.js +11 -7
  225. package/src/engine/physics/fluid/effector/WakeFluidEffector.d.ts.map +1 -1
  226. package/src/engine/physics/fluid/effector/WakeFluidEffector.js +16 -9
  227. package/src/engine/sound/ecs/audio/AudioEmitter.d.ts +38 -7
  228. package/src/engine/sound/ecs/audio/AudioEmitter.d.ts.map +1 -1
  229. package/src/engine/sound/ecs/audio/AudioEmitter.js +47 -14
  230. package/src/engine/sound/ecs/audio/AudioEmitterSerializationAdapter.d.ts.map +1 -1
  231. package/src/engine/sound/ecs/audio/AudioEmitterSerializationAdapter.js +5 -1
  232. package/src/engine/sound/ecs/audio/AudioEmitterSerializationUpgrader_0_1.d.ts +18 -0
  233. package/src/engine/sound/ecs/audio/AudioEmitterSerializationUpgrader_0_1.d.ts.map +1 -0
  234. package/src/engine/sound/ecs/audio/AudioEmitterSerializationUpgrader_0_1.js +48 -0
  235. package/src/engine/sound/ecs/audio/AudioEmitterSystem.d.ts +12 -2
  236. package/src/engine/sound/ecs/audio/AudioEmitterSystem.d.ts.map +1 -1
  237. package/src/engine/sound/ecs/audio/AudioEmitterSystem.js +173 -9
  238. package/src/engine/sound/ecs/audio/LiveEmitterSet.d.ts +9 -3
  239. package/src/engine/sound/ecs/audio/LiveEmitterSet.d.ts.map +1 -1
  240. package/src/engine/sound/ecs/audio/LiveEmitterSet.js +28 -8
  241. package/src/engine/sound/ecs/trigger/AudioEventTrigger.d.ts +8 -0
  242. package/src/engine/sound/ecs/trigger/AudioEventTrigger.d.ts.map +1 -1
  243. package/src/engine/sound/ecs/trigger/AudioEventTrigger.js +192 -191
  244. package/src/engine/sound/ecs/trigger/AudioEventTriggerSerializationAdapter.d.ts.map +1 -1
  245. package/src/engine/sound/ecs/trigger/AudioEventTriggerSerializationAdapter.js +5 -1
  246. package/src/engine/sound/ecs/trigger/AudioEventTriggerSerializationUpgrader_0_1.d.ts +18 -0
  247. package/src/engine/sound/ecs/trigger/AudioEventTriggerSerializationUpgrader_0_1.d.ts.map +1 -0
  248. package/src/engine/sound/ecs/trigger/AudioEventTriggerSerializationUpgrader_0_1.js +51 -0
  249. package/src/engine/sound/ecs/trigger/AudioEventTriggerSystem.d.ts.map +1 -1
  250. package/src/engine/sound/ecs/trigger/AudioEventTriggerSystem.js +15 -1
  251. package/src/engine/sound/simulation/core/AcousticMedium.js +2 -2
  252. package/src/engine/sound/simulation/definition/AcousticDirectivity.js +2 -2
  253. package/src/engine/sound/simulation/definition/AcousticMaterial.d.ts.map +1 -1
  254. package/src/engine/sound/simulation/definition/AcousticMaterial.js +11 -7
  255. package/src/engine/sound/sopra/README.md +768 -644
  256. package/src/engine/sound/sopra/SopraEngine.d.ts +104 -8
  257. package/src/engine/sound/sopra/SopraEngine.d.ts.map +1 -1
  258. package/src/engine/sound/sopra/SopraEngine.js +327 -12
  259. package/src/engine/sound/sopra/definition/BusDefinition.d.ts.map +1 -1
  260. package/src/engine/sound/sopra/definition/BusDefinition.js +5 -4
  261. package/src/engine/sound/sopra/definition/DuckingRule.d.ts.map +1 -1
  262. package/src/engine/sound/sopra/definition/DuckingRule.js +7 -5
  263. package/src/engine/sound/sopra/definition/EventDescription.d.ts +28 -2
  264. package/src/engine/sound/sopra/definition/EventDescription.d.ts.map +1 -1
  265. package/src/engine/sound/sopra/definition/EventDescription.js +77 -17
  266. package/src/engine/sound/sopra/definition/EventDescriptionSerializationAdapter.d.ts +10 -0
  267. package/src/engine/sound/sopra/definition/EventDescriptionSerializationAdapter.d.ts.map +1 -1
  268. package/src/engine/sound/sopra/definition/EventDescriptionSerializationAdapter.js +77 -55
  269. package/src/engine/sound/sopra/definition/EventDescriptionSerializationUpgrader_0_1.d.ts +31 -0
  270. package/src/engine/sound/sopra/definition/EventDescriptionSerializationUpgrader_0_1.d.ts.map +1 -0
  271. package/src/engine/sound/sopra/definition/EventDescriptionSerializationUpgrader_0_1.js +75 -0
  272. package/src/engine/sound/sopra/definition/MixerSnapshot.js +2 -2
  273. package/src/engine/sound/sopra/definition/ParameterDefinition.d.ts.map +1 -1
  274. package/src/engine/sound/sopra/definition/ParameterDefinition.js +7 -5
  275. package/src/engine/sound/sopra/definition/clip/AbstractAudioClip.js +2 -2
  276. package/src/engine/sound/sopra/definition/clip/BlendContainerAudioClip.d.ts.map +1 -1
  277. package/src/engine/sound/sopra/definition/clip/BlendContainerAudioClip.js +4 -3
  278. package/src/engine/sound/sopra/definition/clip/ContainerAudioClip.js +2 -2
  279. package/src/engine/sound/sopra/definition/clip/RandomContainerAudioClip.js +3 -3
  280. package/src/engine/sound/sopra/definition/clip/SampleAudioClip.d.ts.map +1 -1
  281. package/src/engine/sound/sopra/definition/clip/SampleAudioClip.js +16 -9
  282. package/src/engine/sound/sopra/definition/clip/SilenceAudioClip.js +2 -2
  283. package/src/engine/sound/sopra/definition/clip/SwitchContainerAudioClip.d.ts +1 -1
  284. package/src/engine/sound/sopra/definition/clip/SwitchContainerAudioClip.d.ts.map +1 -1
  285. package/src/engine/sound/sopra/definition/clip/SwitchContainerAudioClip.js +2 -2
  286. package/src/engine/sound/sopra/definition/effect/AbstractAudioEffect.d.ts +38 -9
  287. package/src/engine/sound/sopra/definition/effect/AbstractAudioEffect.d.ts.map +1 -1
  288. package/src/engine/sound/sopra/definition/effect/AbstractAudioEffect.js +34 -5
  289. package/src/engine/sound/sopra/definition/effect/CompressorEffect.d.ts +7 -2
  290. package/src/engine/sound/sopra/definition/effect/CompressorEffect.d.ts.map +1 -1
  291. package/src/engine/sound/sopra/definition/effect/CompressorEffect.js +137 -120
  292. package/src/engine/sound/sopra/definition/effect/EqEffect.d.ts +3 -1
  293. package/src/engine/sound/sopra/definition/effect/EqEffect.d.ts.map +1 -1
  294. package/src/engine/sound/sopra/definition/effect/EqEffect.js +146 -128
  295. package/src/engine/sound/sopra/definition/effect/ReverbEffect.d.ts +1 -0
  296. package/src/engine/sound/sopra/definition/effect/ReverbEffect.d.ts.map +1 -1
  297. package/src/engine/sound/sopra/definition/effect/ReverbEffect.js +8 -3
  298. package/src/engine/sound/sopra/legacy/SoundEmitter.d.ts.map +1 -1
  299. package/src/engine/sound/sopra/legacy/SoundEmitter.js +357 -352
  300. package/src/engine/sound/sopra/legacy/SoundTrack.d.ts.map +1 -1
  301. package/src/engine/sound/sopra/legacy/SoundTrack.js +281 -278
  302. package/src/engine/sound/sopra/runtime/BusGraph.d.ts +44 -2
  303. package/src/engine/sound/sopra/runtime/BusGraph.d.ts.map +1 -1
  304. package/src/engine/sound/sopra/runtime/BusGraph.js +83 -43
  305. package/src/engine/sound/sopra/runtime/EffectChain.d.ts +96 -0
  306. package/src/engine/sound/sopra/runtime/EffectChain.d.ts.map +1 -0
  307. package/src/engine/sound/sopra/runtime/EffectChain.js +286 -0
  308. package/src/engine/sound/sopra/runtime/EffectParamOverrides.d.ts +123 -0
  309. package/src/engine/sound/sopra/runtime/EffectParamOverrides.d.ts.map +1 -0
  310. package/src/engine/sound/sopra/runtime/EffectParamOverrides.js +320 -0
  311. package/src/engine/sound/sopra/runtime/EventInstance.d.ts +55 -5
  312. package/src/engine/sound/sopra/runtime/EventInstance.d.ts.map +1 -1
  313. package/src/engine/sound/sopra/runtime/EventInstance.js +201 -26
  314. package/src/engine/sound/sopra/serialization/populateSopraSerializationRegistry.d.ts +2 -1
  315. package/src/engine/sound/sopra/serialization/populateSopraSerializationRegistry.d.ts.map +1 -1
  316. package/src/engine/sound/sopra/serialization/populateSopraSerializationRegistry.js +6 -1
  317. package/src/engine/sound/sopra/serialization/sopraSerializationHarness.d.ts +15 -0
  318. package/src/engine/sound/sopra/serialization/sopraSerializationHarness.d.ts.map +1 -1
  319. package/src/engine/sound/sopra/serialization/sopraSerializationHarness.js +32 -0
  320. package/src/engine/sound/sopra/util/MockAudioContext.d.ts.map +1 -1
  321. package/src/engine/sound/sopra/util/MockAudioContext.js +3 -0
  322. package/src/engine/sound/sopra/util/fadeOutAndStop.d.ts +13 -3
  323. package/src/engine/sound/sopra/util/fadeOutAndStop.d.ts.map +1 -1
  324. package/src/engine/sound/sopra/util/fadeOutAndStop.js +25 -13
  325. package/src/format/image/png/PNGReader.js +644 -644
  326. package/src/format/image/png/crc32.d.ts +1 -1
  327. package/src/format/image/png/crc32.js +7 -8
  328. package/src/shade/RENDERER_CONTRACT.md +6 -3
  329. package/src/shade/descriptor/binding/BindGroupLayoutDescriptor.js +2 -2
  330. package/src/shade/descriptor/binding/BindGroupLayoutEntry.d.ts.map +1 -1
  331. package/src/shade/descriptor/binding/BindGroupLayoutEntry.js +12 -8
  332. package/src/shade/descriptor/binding/StorageTextureBindingLayout.js +2 -2
  333. package/src/shade/descriptor/binding/TextureBindingLayout.js +2 -2
  334. package/src/shade/descriptor/blend/BlendComponent.js +2 -2
  335. package/src/shade/descriptor/pipeline/PipelineDescriptorBase.js +2 -2
  336. package/src/shade/descriptor/pipeline/PipelineLayoutDescriptor.js +2 -2
  337. package/src/shade/descriptor/pipeline/ProgrammableStage.js +2 -2
  338. package/src/shade/descriptor/pipeline/compute/ComputePipelineDescriptor.js +2 -2
  339. package/src/shade/descriptor/pipeline/render/ColorTargetState.js +2 -2
  340. package/src/shade/descriptor/pipeline/render/FragmentState.js +2 -2
  341. package/src/shade/descriptor/pipeline/render/PrimitiveState.js +2 -2
  342. package/src/shade/descriptor/pipeline/render/RenderPipelineDescriptor.d.ts.map +1 -1
  343. package/src/shade/descriptor/pipeline/render/RenderPipelineDescriptor.js +8 -5
  344. package/src/shade/descriptor/pipeline/render/VertexAttribute.js +2 -2
  345. package/src/shade/descriptor/texture/SamplerDescriptor.d.ts.map +1 -1
  346. package/src/shade/descriptor/texture/SamplerDescriptor.js +20 -12
  347. package/src/shade/descriptor/texture/TextureDescriptor.d.ts.map +1 -1
  348. package/src/shade/descriptor/texture/TextureDescriptor.js +11 -7
  349. package/src/shade/device/SHADE_DEVICE_FLOOR.d.ts +24 -0
  350. package/src/shade/device/SHADE_DEVICE_FLOOR.d.ts.map +1 -0
  351. package/src/shade/device/SHADE_DEVICE_FLOOR.js +34 -0
  352. package/src/shade/device/ShadeDeviceFailure.d.ts +12 -5
  353. package/src/shade/device/ShadeDeviceFailure.d.ts.map +1 -1
  354. package/src/shade/device/ShadeDeviceFailure.js +17 -8
  355. package/src/shade/device/ShadeDeviceFailureReason.d.ts +1 -1
  356. package/src/shade/device/ShadeDeviceFailureReason.js +2 -2
  357. package/src/shade/device/graph/BufferResourceDescriptor.d.ts.map +1 -1
  358. package/src/shade/device/graph/BufferResourceDescriptor.js +196 -193
  359. package/src/shade/device/graph/TextureResourceDescriptor.d.ts.map +1 -1
  360. package/src/shade/device/graph/TextureResourceDescriptor.js +178 -173
  361. package/src/shade/device/shade_device_floor_unmet.d.ts +13 -0
  362. package/src/shade/device/shade_device_floor_unmet.d.ts.map +1 -0
  363. package/src/shade/device/shade_device_floor_unmet.js +32 -0
  364. package/src/shade/device/timing/profile/sgpt_read_header.js +1 -1
  365. package/src/shade/device/timing/profile/sgpt_read_records.js +1 -1
  366. package/src/shade/device/timing/profile/sgpt_write_header.js +1 -1
  367. package/src/shade/device/timing/profile/sgpt_write_record.js +1 -1
  368. package/src/shade/renderer/Renderer.d.ts +2 -0
  369. package/src/shade/renderer/Renderer.d.ts.map +1 -1
  370. package/src/shade/renderer/Renderer.js +29 -55
  371. package/src/shade/renderer/binding/BufferBinding.js +2 -2
  372. package/src/shade/renderer/buffer/GPUBufferAllocator.d.ts.map +1 -1
  373. package/src/shade/renderer/buffer/GPUBufferAllocator.js +9 -0
  374. package/src/shade/renderer/buffer/buffer_pool_ops.d.ts +21 -12
  375. package/src/shade/renderer/buffer/buffer_pool_ops.d.ts.map +1 -1
  376. package/src/shade/renderer/buffer/buffer_pool_ops.js +18 -19
  377. package/src/shade/renderer/camera/Camera.js +2 -2
  378. package/src/shade/renderer/geometry/Attribute.js +2 -2
  379. package/src/shade/renderer/geometry/Geometry.js +2 -2
  380. package/src/shade/renderer/geometry/geometry_deduplicate_vertices.js +2 -2
  381. package/src/shade/renderer/geometry/meshlet/MeshletBatch.js +2 -2
  382. package/src/shade/renderer/geometry/virtual/format/checksum/vgeo_compute_asset_id.js +13 -13
  383. package/src/shade/renderer/geometry/virtual/format/checksum/vgeo_compute_directory_block_checksum.js +41 -41
  384. package/src/shade/renderer/geometry/virtual/format/checksum/vgeo_compute_frame_checksum.js +41 -41
  385. package/src/shade/renderer/geometry/virtual/format/checksum/vgeo_compute_header_checksum.js +25 -25
  386. package/src/shade/renderer/gpu_primitive/test/gpu_test.d.ts.map +1 -1
  387. package/src/shade/renderer/gpu_primitive/test/gpu_test.js +8 -11
  388. package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts +1 -1
  389. package/src/shade/renderer/material/StandardShadeMaterial.d.ts.map +1 -1
  390. package/src/shade/renderer/material/StandardShadeMaterial.js +13 -8
  391. package/src/shade/renderer/pool/TransientResourcePool.d.ts +24 -0
  392. package/src/shade/renderer/pool/TransientResourcePool.d.ts.map +1 -1
  393. package/src/shade/renderer/pool/TransientResourcePool.js +41 -10
  394. package/src/shade/renderer/scene/optimization/geometry/internal/triangle_fingerprint_stream.d.ts.map +1 -1
  395. package/src/shade/renderer/scene/optimization/geometry/internal/triangle_fingerprint_stream.js +14 -5
  396. package/src/shade/renderer/scene/optimization/sampler2d_from_image_bitmap.js +1 -1
  397. package/src/shade/renderer/shader/ComputeShader.d.ts.map +1 -1
  398. package/src/shade/renderer/shader/ComputeShader.js +18 -2
  399. package/src/shade/renderer/shader/ImageShader.d.ts.map +1 -1
  400. package/src/shade/renderer/shader/ImageShader.js +230 -218
  401. package/src/shade/renderer/shader/type/WGSLStructField.js +2 -2
  402. package/src/shade/renderer/shader/type/WebGPUArray.js +2 -2
  403. package/src/shade/renderer/shader/type/WebGPUStruct.d.ts.map +1 -1
  404. package/src/shade/renderer/shader/type/WebGPUStruct.js +9 -6
  405. package/src/shade/renderer/texture/ShadeTexture.d.ts.map +1 -1
  406. package/src/shade/renderer/texture/ShadeTexture.js +17 -10
  407. package/src/shade/renderer/texture/mipmaps/WebGPUMipmapGenerator.js +2 -2
  408. package/src/shade/renderer/water/surface/chunk_water_surface_sample.d.ts +4 -4
  409. package/src/shade/renderer/water/surface/chunk_water_surface_sample.js +6 -6
  410. package/src/shade/renderer/water/surface/particles/GPUWaterParticles.d.ts.map +1 -1
  411. package/src/shade/renderer/water/surface/particles/GPUWaterParticles.js +46 -55
  412. package/src/shade/renderer/water/surface/particles/WATER_PARTICLE_STRUCT.d.ts +3 -3
  413. package/src/shade/renderer/water/surface/particles/WATER_PARTICLE_STRUCT.d.ts.map +1 -1
  414. package/src/shade/renderer/water/surface/particles/WATER_PARTICLE_STRUCT.js +14 -4
  415. package/src/shade/renderer/water/surface/particles/chunk_water_particle.d.ts +10 -1
  416. package/src/shade/renderer/water/surface/particles/chunk_water_particle.d.ts.map +1 -1
  417. package/src/shade/renderer/water/surface/particles/chunk_water_particle.js +82 -40
  418. package/src/shade/renderer/water/surface/particles/chunk_water_particle_step.d.ts +4 -1
  419. package/src/shade/renderer/water/surface/particles/chunk_water_particle_step.d.ts.map +1 -1
  420. package/src/shade/renderer/water/surface/particles/chunk_water_particle_step.js +8 -4
  421. package/src/shade/renderer/water/surface/particles/shader_water_particles.d.ts +98 -86
  422. package/src/shade/renderer/water/surface/particles/shader_water_particles.d.ts.map +1 -1
  423. package/src/shade/renderer/water/surface/particles/shader_water_particles.js +440 -298
  424. package/src/view/common/HTMLElementCacheKey.d.ts.map +1 -1
  425. package/src/view/common/HTMLElementCacheKey.js +4 -3
  426. package/src/view/graphics/GraphicsContextFailureView.d.ts +1 -2
  427. package/src/view/graphics/GraphicsContextFailureView.d.ts.map +1 -1
  428. package/src/view/graphics/GraphicsContextFailureView.js +1 -2
  429. package/src/view/minimap/MinimapMarker.js +2 -2
  430. package/src/engine/network/transport/Channel.js +0 -336
  431. package/src/engine/network/transport/ReliableCommandPipeline.js +0 -335
  432. package/src/engine/network/transport/fragments/FragmentAssembler.js +0 -350
  433. package/src/engine/network/transport/fragments/FragmentRetention.js +0 -191
  434. package/src/engine/network/transport/fragments/fragment_send.js +0 -157
  435. package/src/engine/network/transport/fragments/packet_size.js +0 -107
@@ -42,6 +42,15 @@ export class GPUBufferAllocator extends TransientResourcePool {
42
42
  return buffer_compare(a, b);
43
43
  }
44
44
 
45
+ /**
46
+ * The usage the buffer was made with, kept on its record beside the size the pool keeps: the order
47
+ * and the match read both, and a `GPUBuffer`'s are native reads.
48
+ * @param {import("../pool/TransientResourcePool.js").PoolRecord} record
49
+ */
50
+ describeRecord(record) {
51
+ record.usage = record.resource.usage;
52
+ }
53
+
45
54
  sizeOf(buffer) {
46
55
  return buffer.size;
47
56
  }
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Total order over `{usage, size}`-bearing specs (a request descriptor or a live GPUBuffer).
2
+ * Total order over `{usage, size}`-bearing specs: a request descriptor, or a pool record.
3
3
  *
4
4
  * Sorted by size first (so the binary search lands on the smallest fitting buffer), then by usage
5
5
  * *bit-count* (so the narrowest-usage buffer is preferred — wide-usage buffers map to slower driver
@@ -16,29 +16,30 @@ export function compare_memory_spec(a: {
16
16
  usage: number;
17
17
  size: number;
18
18
  }): number;
19
+ /**
20
+ * A pool record as {@link GPUBufferAllocator} keeps one: the buffer, and its `size` and `usage` as they
21
+ * were when it entered the pool. Ordering and matching read those, never the buffer, whose `size` and
22
+ * `usage` are native reads and are visited by the binary search and the scan many times a frame.
23
+ *
24
+ * @typedef {import("../pool/TransientResourcePool.js").PoolRecord & {usage: number}} BufferPoolRecord
25
+ */
19
26
  /**
20
27
  * Record ordering for the pool's sorted insert.
21
28
  *
22
- * @param {{resource:GPUBuffer}} a
23
- * @param {{resource:GPUBuffer}} b
29
+ * @param {BufferPoolRecord} a
30
+ * @param {BufferPoolRecord} b
24
31
  * @returns {number}
25
32
  */
26
- export function buffer_compare(a: {
27
- resource: GPUBuffer;
28
- }, b: {
29
- resource: GPUBuffer;
30
- }): number;
33
+ export function buffer_compare(a: BufferPoolRecord, b: BufferPoolRecord): number;
31
34
  /**
32
35
  * Approximate first-fit: the smallest pooled buffer with `size >= request` and a usage *superset* of
33
36
  * the request, bounded against handing out a much-larger buffer.
34
37
  *
35
- * @param {{resource:GPUBuffer}[]} records sorted under {@link buffer_compare}
38
+ * @param {BufferPoolRecord[]} records sorted under {@link buffer_compare}
36
39
  * @param {{size:number, usage:number}} descriptor
37
40
  * @returns {number} index of a satisfying record, or -1
38
41
  */
39
- export function buffer_find(records: {
40
- resource: GPUBuffer;
41
- }[], descriptor: {
42
+ export function buffer_find(records: BufferPoolRecord[], descriptor: {
42
43
  size: number;
43
44
  usage: number;
44
45
  }): number;
@@ -63,4 +64,12 @@ export const ALLOW_LARGER_LIMIT_SCALE: number;
63
64
  * @type {number}
64
65
  */
65
66
  export const ALLOW_LARGER_LIMIT_FIXED: number;
67
+ /**
68
+ * A pool record as {@link GPUBufferAllocator } keeps one: the buffer, and its `size` and `usage` as they
69
+ * were when it entered the pool. Ordering and matching read those, never the buffer, whose `size` and
70
+ * `usage` are native reads and are visited by the binary search and the scan many times a frame.
71
+ */
72
+ export type BufferPoolRecord = import("../pool/TransientResourcePool.js").PoolRecord & {
73
+ usage: number;
74
+ };
66
75
  //# sourceMappingURL=buffer_pool_ops.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"buffer_pool_ops.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/buffer/buffer_pool_ops.js"],"names":[],"mappings":"AAqBA;;;;;;;;;;GAUG;AACH,uCAJW;IAAC,KAAK,EAAC,MAAM,CAAC;IAAC,IAAI,EAAC,MAAM,CAAA;CAAC,KAC3B;IAAC,KAAK,EAAC,MAAM,CAAC;IAAC,IAAI,EAAC,MAAM,CAAA;CAAC,GACzB,MAAM,CAqBlB;AAED;;;;;;GAMG;AACH,kCAJW;IAAC,QAAQ,YAAU;CAAC,KACpB;IAAC,QAAQ,YAAU;CAAC,GAClB,MAAM,CAIlB;AAWD;;;;;;;GAOG;AACH,qCAJW;IAAC,QAAQ,YAAU;CAAC,EAAE,cACtB;IAAC,IAAI,EAAC,MAAM,CAAC;IAAC,KAAK,EAAC,MAAM,CAAA;CAAC,GACzB,MAAM,CAmClB;AAED;;;GAGG;AACH,mDAFa,MAAM,CAIlB;AAvHD;;;GAGG;AAEH;;;;GAIG;AACH,uCAFU,MAAM,CAE0B;AAC1C;;;;GAIG;AACH,uCAFU,MAAM,CAE6B"}
1
+ {"version":3,"file":"buffer_pool_ops.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/buffer/buffer_pool_ops.js"],"names":[],"mappings":"AAqBA;;;;;;;;;;GAUG;AACH,uCAJW;IAAC,KAAK,EAAC,MAAM,CAAC;IAAC,IAAI,EAAC,MAAM,CAAA;CAAC,KAC3B;IAAC,KAAK,EAAC,MAAM,CAAC;IAAC,IAAI,EAAC,MAAM,CAAA;CAAC,GACzB,MAAM,CAqBlB;AAED;;;;;;GAMG;AAEH;;;;;;GAMG;AACH,kCAJW,gBAAgB,KAChB,gBAAgB,GACd,MAAM,CAIlB;AAED;;;;;;;GAOG;AACH,qCAJW,gBAAgB,EAAE,cAClB;IAAC,IAAI,EAAC,MAAM,CAAC;IAAC,KAAK,EAAC,MAAM,CAAA;CAAC,GACzB,MAAM,CAmClB;AAED;;;GAGG;AACH,mDAFa,MAAM,CAIlB;AAtHD;;;GAGG;AAEH;;;;GAIG;AACH,uCAFU,MAAM,CAE0B;AAC1C;;;;GAIG;AACH,uCAFU,MAAM,CAE6B;;;;;;+BAuChC,OAAO,kCAAkC,EAAE,UAAU,GAAG;IAAC,KAAK,EAAE,MAAM,CAAA;CAAC"}
@@ -20,7 +20,7 @@ export const ALLOW_LARGER_LIMIT_SCALE = 2;
20
20
  export const ALLOW_LARGER_LIMIT_FIXED = 1024;
21
21
 
22
22
  /**
23
- * Total order over `{usage, size}`-bearing specs (a request descriptor or a live GPUBuffer).
23
+ * Total order over `{usage, size}`-bearing specs: a request descriptor, or a pool record.
24
24
  *
25
25
  * Sorted by size first (so the binary search lands on the smallest fitting buffer), then by usage
26
26
  * *bit-count* (so the narrowest-usage buffer is preferred — wide-usage buffers map to slower driver
@@ -52,37 +52,36 @@ export function compare_memory_spec(a, b) {
52
52
  }
53
53
 
54
54
  /**
55
- * Record ordering for the pool's sorted insert.
55
+ * A pool record as {@link GPUBufferAllocator} keeps one: the buffer, and its `size` and `usage` as they
56
+ * were when it entered the pool. Ordering and matching read those, never the buffer, whose `size` and
57
+ * `usage` are native reads and are visited by the binary search and the scan many times a frame.
56
58
  *
57
- * @param {{resource:GPUBuffer}} a
58
- * @param {{resource:GPUBuffer}} b
59
- * @returns {number}
59
+ * @typedef {import("../pool/TransientResourcePool.js").PoolRecord & {usage: number}} BufferPoolRecord
60
60
  */
61
- export function buffer_compare(a, b) {
62
- return compare_memory_spec(a.resource, b.resource);
63
- }
64
61
 
65
62
  /**
66
- * @param {{resource:GPUBuffer}} record
67
- * @param {{size:number}} descriptor
63
+ * Record ordering for the pool's sorted insert.
64
+ *
65
+ * @param {BufferPoolRecord} a
66
+ * @param {BufferPoolRecord} b
68
67
  * @returns {number}
69
68
  */
70
- function compare_descriptor_to_record(descriptor, record) {
71
- return compare_memory_spec(descriptor, record.resource);
69
+ export function buffer_compare(a, b) {
70
+ return compare_memory_spec(a, b);
72
71
  }
73
72
 
74
73
  /**
75
74
  * Approximate first-fit: the smallest pooled buffer with `size >= request` and a usage *superset* of
76
75
  * the request, bounded against handing out a much-larger buffer.
77
76
  *
78
- * @param {{resource:GPUBuffer}[]} records sorted under {@link buffer_compare}
77
+ * @param {BufferPoolRecord[]} records sorted under {@link buffer_compare}
79
78
  * @param {{size:number, usage:number}} descriptor
80
79
  * @returns {number} index of a satisfying record, or -1
81
80
  */
82
81
  export function buffer_find(records, descriptor) {
83
82
  const count = records.length;
84
83
 
85
- let index = binarySearchHighIndex(records, descriptor, compare_descriptor_to_record);
84
+ let index = binarySearchHighIndex(records, descriptor, compare_memory_spec);
86
85
 
87
86
  if (index >= count) {
88
87
  return -1;
@@ -93,19 +92,19 @@ export function buffer_find(records, descriptor) {
93
92
  }
94
93
 
95
94
  for (; index < count; index++) {
96
- const buffer = records[index].resource;
95
+ const record = records[index];
97
96
 
98
97
  if (
99
- buffer.size > descriptor.size * ALLOW_LARGER_LIMIT_SCALE
100
- && (buffer.size - descriptor.size) > ALLOW_LARGER_LIMIT_FIXED
98
+ record.size > descriptor.size * ALLOW_LARGER_LIMIT_SCALE
99
+ && (record.size - descriptor.size) > ALLOW_LARGER_LIMIT_FIXED
101
100
  ) {
102
101
  // records are sorted by size: everything from here on is too large
103
102
  break;
104
103
  }
105
104
 
106
105
  if (
107
- (buffer.usage & descriptor.usage) === descriptor.usage
108
- && buffer.size >= descriptor.size
106
+ (record.usage & descriptor.usage) === descriptor.usage
107
+ && record.size >= descriptor.size
109
108
  ) {
110
109
  return index;
111
110
  }
@@ -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
+ }
@@ -1,41 +1,41 @@
1
- import { xxh3_64 } from "../../../../../../core/binary/hash/xxh3_64.js";
2
- import { VGEO_FRAME_HEADER_SIZE } from "../frame/VGEO_FRAME_HEADER_SIZE.js";
3
- import { VGEO_FRAME_OFFSET } from "../frame/VGEO_FRAME_OFFSET.js";
4
-
5
- /**
6
- * The identity-seeded checksum of one frame: xxh3-64 over the frame's bytes with its own `checksum`
7
- * field cut out, seeded so that a well-formed frame of the wrong page or the wrong asset fails to
8
- * verify rather than installing silently.
9
- *
10
- * The seed is taken from `asset_id`, which is why {@link vgeo_asset_id_preimage} zeroes this field
11
- * before hashing: the two would otherwise be defined in terms of each other.
12
- *
13
- * @param {BinaryBuffer} buffer whole file
14
- * @param {VGeoFrameExtent} frame
15
- * @param {bigint} asset_id_low64
16
- * @returns {bigint}
17
- *
18
- * @author Alex Goldring
19
- * @copyright Company Named Limited (c) 2026
20
- */
21
- export function vgeo_compute_frame_checksum(buffer, frame, asset_id_low64) {
22
- const seed = asset_id_low64 ^ BigInt(frame.page_index);
23
-
24
- const bytes = buffer.raw_bytes;
25
-
26
- const covered = new Uint8Array(frame.extent - 8);
27
-
28
- // frame bytes [0, 16)
29
- covered.set(
30
- bytes.subarray(frame.frame_offset, frame.frame_offset + VGEO_FRAME_OFFSET.CHECKSUM),
31
- 0
32
- );
33
-
34
- // frame bytes [24, extent)
35
- covered.set(
36
- bytes.subarray(frame.frame_offset + VGEO_FRAME_HEADER_SIZE, frame.frame_offset + frame.extent),
37
- VGEO_FRAME_OFFSET.CHECKSUM
38
- );
39
-
40
- return xxh3_64(covered, seed);
41
- }
1
+ import { xxh3_64 } from "../../../../../../core/math/hash/xxh3_64.js";
2
+ import { VGEO_FRAME_HEADER_SIZE } from "../frame/VGEO_FRAME_HEADER_SIZE.js";
3
+ import { VGEO_FRAME_OFFSET } from "../frame/VGEO_FRAME_OFFSET.js";
4
+
5
+ /**
6
+ * The identity-seeded checksum of one frame: xxh3-64 over the frame's bytes with its own `checksum`
7
+ * field cut out, seeded so that a well-formed frame of the wrong page or the wrong asset fails to
8
+ * verify rather than installing silently.
9
+ *
10
+ * The seed is taken from `asset_id`, which is why {@link vgeo_asset_id_preimage} zeroes this field
11
+ * before hashing: the two would otherwise be defined in terms of each other.
12
+ *
13
+ * @param {BinaryBuffer} buffer whole file
14
+ * @param {VGeoFrameExtent} frame
15
+ * @param {bigint} asset_id_low64
16
+ * @returns {bigint}
17
+ *
18
+ * @author Alex Goldring
19
+ * @copyright Company Named Limited (c) 2026
20
+ */
21
+ export function vgeo_compute_frame_checksum(buffer, frame, asset_id_low64) {
22
+ const seed = asset_id_low64 ^ BigInt(frame.page_index);
23
+
24
+ const bytes = buffer.raw_bytes;
25
+
26
+ const covered = new Uint8Array(frame.extent - 8);
27
+
28
+ // frame bytes [0, 16)
29
+ covered.set(
30
+ bytes.subarray(frame.frame_offset, frame.frame_offset + VGEO_FRAME_OFFSET.CHECKSUM),
31
+ 0
32
+ );
33
+
34
+ // frame bytes [24, extent)
35
+ covered.set(
36
+ bytes.subarray(frame.frame_offset + VGEO_FRAME_HEADER_SIZE, frame.frame_offset + frame.extent),
37
+ VGEO_FRAME_OFFSET.CHECKSUM
38
+ );
39
+
40
+ return xxh3_64(covered, seed);
41
+ }
@@ -1,25 +1,25 @@
1
- import { BinaryBuffer } from "../../../../../../core/binary/BinaryBuffer.js";
2
- import { xxh3_64 } from "../../../../../../core/binary/hash/xxh3_64.js";
3
- import { VGEO_HEADER_OFFSET } from "../header/VGEO_HEADER_OFFSET.js";
4
- import { VGEO_HEADER_SIZE } from "../header/VGEO_HEADER_SIZE.js";
5
-
6
- /**
7
- * xxh3-64 of the header with `header_checksum` zeroed. `asset_id` must already be final: the
8
- * ordering is what keeps the two non-circular.
9
- *
10
- * @param {BinaryBuffer} buffer whole file
11
- * @returns {bigint}
12
- *
13
- * @author Alex Goldring
14
- * @copyright Company Named Limited (c) 2026
15
- */
16
- export function vgeo_compute_header_checksum(buffer) {
17
- const header = new BinaryBuffer();
18
-
19
- header.fromArrayBuffer(buffer.raw_bytes.slice(0, VGEO_HEADER_SIZE).buffer);
20
-
21
- header.position = VGEO_HEADER_OFFSET.HEADER_CHECKSUM;
22
- header.writeUint64(0n);
23
-
24
- return xxh3_64(header.raw_bytes);
25
- }
1
+ import { BinaryBuffer } from "../../../../../../core/binary/BinaryBuffer.js";
2
+ import { xxh3_64 } from "../../../../../../core/math/hash/xxh3_64.js";
3
+ import { VGEO_HEADER_OFFSET } from "../header/VGEO_HEADER_OFFSET.js";
4
+ import { VGEO_HEADER_SIZE } from "../header/VGEO_HEADER_SIZE.js";
5
+
6
+ /**
7
+ * xxh3-64 of the header with `header_checksum` zeroed. `asset_id` must already be final: the
8
+ * ordering is what keeps the two non-circular.
9
+ *
10
+ * @param {BinaryBuffer} buffer whole file
11
+ * @returns {bigint}
12
+ *
13
+ * @author Alex Goldring
14
+ * @copyright Company Named Limited (c) 2026
15
+ */
16
+ export function vgeo_compute_header_checksum(buffer) {
17
+ const header = new BinaryBuffer();
18
+
19
+ header.fromArrayBuffer(buffer.raw_bytes.slice(0, VGEO_HEADER_SIZE).buffer);
20
+
21
+ header.position = VGEO_HEADER_OFFSET.HEADER_CHECKSUM;
22
+ header.writeUint64(0n);
23
+
24
+ return xxh3_64(header.raw_bytes);
25
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"gpu_test.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/gpu_primitive/test/gpu_test.js"],"names":[],"mappings":"AAGA;;;;;GAKG;AACH,sCAJW,MAAM,cAEL,QAAQ,IAAI,CAAC,CA+DxB"}
1
+ {"version":3,"file":"gpu_test.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/gpu_primitive/test/gpu_test.js"],"names":[],"mappings":"AAMA;;;;;GAKG;AACH,sCAJW,MAAM,cAEL,QAAQ,IAAI,CAAC,CAyDxB"}
@@ -1,4 +1,7 @@
1
1
  import { WebGPUExtensionType } from "../../../descriptor/WebGPUExtensionType.js";
2
+ import { SHADE_DEVICE_FLOOR } from "../../../device/SHADE_DEVICE_FLOOR.js";
3
+ import { shade_device_floor_unmet } from "../../../device/shade_device_floor_unmet.js";
4
+ import { ShadeDeviceFailure } from "../../../device/ShadeDeviceFailure.js";
2
5
  import { GraphicsContext } from "../../GraphicsContext.js";
3
6
 
4
7
  /**
@@ -36,32 +39,26 @@ export async function gpu_test(description, body) {
36
39
  //
37
40
  // console.warn('adapter limits:', adapter.limits);
38
41
 
39
- const maxStorageBuffersPerShaderStage = adapter.limits.maxStorageBuffersPerShaderStage;
42
+ const unmet = shade_device_floor_unmet(adapter);
40
43
 
41
- if (maxStorageBuffersPerShaderStage < 10) {
42
- throw new Error(`Engine requires at least 10 storage buffers per shader stage, actual is ${maxStorageBuffersPerShaderStage}`);
44
+ if (unmet.length > 0) {
45
+ throw ShadeDeviceFailure.below_floor(unmet);
43
46
  }
44
47
 
45
48
  const device = await adapter.requestDevice({
46
49
  requiredLimits: {
47
- // required for large G-buffers
48
- maxColorAttachmentBytesPerSample: 32,
50
+ ...SHADE_DEVICE_FLOOR.limits,
49
51
 
50
52
  /*
51
53
  grab the largest buffer limit we can get, default limits are super-low
52
54
  */
53
55
  maxBufferSize: adapter.limits.maxBufferSize,
54
56
  maxStorageBufferBindingSize: adapter.limits.maxStorageBufferBindingSize,
55
-
56
- maxStorageBuffersPerShaderStage: 10,
57
57
  },
58
58
  requiredFeatures: [
59
+ ...SHADE_DEVICE_FLOOR.features,
59
60
  // required for timers
60
61
  WebGPUExtensionType.TimestampQuery,
61
- // required for indirect draw that's used extensively in Shade
62
- WebGPUExtensionType.IndirectFirstInstance,
63
- // required for OIT
64
- WebGPUExtensionType.Float32Blendable,
65
62
  ]
66
63
  });
67
64
 
@@ -13,7 +13,7 @@ export class TinyGltf {
13
13
  * @readonly
14
14
  * @type {TextureFormat}
15
15
  */
16
- static readonly "__#265@#UNCOMPRESSED_TARGET": TextureFormat;
16
+ static readonly "__#267@#UNCOMPRESSED_TARGET": TextureFormat;
17
17
  /**
18
18
  * @param {AssetManager} assetManager
19
19
  * @param {AssetRequestScope} [scope]
@@ -1 +1 @@
1
- {"version":3,"file":"StandardShadeMaterial.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/material/StandardShadeMaterial.js"],"names":[],"mappings":"AAOA;;;;GAIG;AAEH;IACI;;;OAGG;IACH,gBAFU,YAAY,CAEP;IAEf;;;OAGG;IACH,eAFU,KAAK,CAEsB;IAErC;;OAEG;IACH,gBAFU,YAAY,CAEP;IAEf;;;;;;OAMG;IACH,aAFU,YAAY,CAEV;IAEZ;;OAEG;IACH,kBAFU,YAAY,CAEL;IAEjB;;;;;;;;OAQG;IACH,UAFU,mBAAmB,GAAC,SAAS,CAE9B;IAET;;;OAGG;IACH,kBAFU,MAAM,CAEK;IAErB;;;OAGG;IACH,iBAFU,MAAM,CAEI;IAEpB;;;;;;;;OAQG;IACH,qBAFU,MAAM,CAEQ;IAExB;;;;;;OAMG;IACH,YAFU,MAAM,CAEC;IAEjB;;;;;;;;;;;OAWG;IACH,QAFU,mBAAmB,GAAC,IAAI,CAEpB;IAEd;;;OAGG;IACH,iBAFU,KAAK,CAE4B;IAE3C;;;OAGG;IACH,iBAFU,cAAc,CAEmB;IAW3C;;;;;OAKG;IACH,YAFW,qBAAqB,QAoB/B;IAED;;;OAGG;IACH,SAFa,qBAAqB,CAQjC;IAaD;;;;OAIG;IACH,cAHW,qBAAqB,GACnB,OAAO,CA+BnB;IAGL;;;OAGG;IACH,kCAFU,OAAO,CAEsC;CANtD;2BAvMY,OAAO,4BAA4B,EAAE,YAAY;kCACjD,OAAO,2CAA2C,EAAE,mBAAmB;kCACvE,OAAO,kCAAkC,EAAE,mBAAmB;8BAL7C,oBAAoB;sBAJ5B,8BAA8B;2BACzB,4CAA4C"}
1
+ {"version":3,"file":"StandardShadeMaterial.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/material/StandardShadeMaterial.js"],"names":[],"mappings":"AAQA;;;;GAIG;AAEH;IACI;;;OAGG;IACH,gBAFU,YAAY,CAEP;IAEf;;;OAGG;IACH,eAFU,KAAK,CAEsB;IAErC;;OAEG;IACH,gBAFU,YAAY,CAEP;IAEf;;;;;;OAMG;IACH,aAFU,YAAY,CAEV;IAEZ;;OAEG;IACH,kBAFU,YAAY,CAEL;IAEjB;;;;;;;;OAQG;IACH,UAFU,mBAAmB,GAAC,SAAS,CAE9B;IAET;;;OAGG;IACH,kBAFU,MAAM,CAEK;IAErB;;;OAGG;IACH,iBAFU,MAAM,CAEI;IAEpB;;;;;;;;OAQG;IACH,qBAFU,MAAM,CAEQ;IAExB;;;;;;OAMG;IACH,YAFU,MAAM,CAEC;IAEjB;;;;;;;;;;;OAWG;IACH,QAFU,mBAAmB,GAAC,IAAI,CAEpB;IAEd;;;OAGG;IACH,iBAFU,KAAK,CAE4B;IAE3C;;;OAGG;IACH,iBAFU,cAAc,CAEmB;IAW3C;;;;;OAKG;IACH,YAFW,qBAAqB,QAoB/B;IAED;;;OAGG;IACH,SAFa,qBAAqB,CAQjC;IAiBD;;;;OAIG;IACH,cAHW,qBAAqB,GACnB,OAAO,CA+BnB;IAGL;;;OAGG;IACH,kCAFU,OAAO,CAEsC;CANtD;2BA3MY,OAAO,4BAA4B,EAAE,YAAY;kCACjD,OAAO,2CAA2C,EAAE,mBAAmB;kCACvE,OAAO,kCAAkC,EAAE,mBAAmB;8BAL7C,oBAAoB;sBAJ5B,8BAA8B;2BACzB,4CAA4C"}
@@ -1,4 +1,5 @@
1
- import { combine_hash } from "../../../core/collection/array/combine_hash.js";
1
+ import { hash_mix2 } from "../../../core/math/hash/hash_mix2.js";
2
+ import { hash_mix3 } from "../../../core/math/hash/hash_mix3.js";
2
3
  import { Color } from "../../../core/color/Color.js";
3
4
  import LinearModifier from "../../../core/model/stat/LinearModifier.js";
4
5
  import { optional_equality } from "../../../core/model/object/optional_equality.js";
@@ -160,13 +161,17 @@ export class StandardShadeMaterial extends ShadeMaterial {
160
161
  }
161
162
 
162
163
  hash() {
163
- return combine_hash(
164
- super.hash(),
165
- this.diffuse_color.hash(),
166
- optional_hash(this.texture_albedo),
167
- optional_hash(this.texture_normal),
168
- optional_hash(this.texture_orm),
169
- optional_hash(this.texture_emissive),
164
+ return hash_mix2(
165
+ hash_mix3(
166
+ hash_mix3(
167
+ super.hash(),
168
+ this.diffuse_color.hash(),
169
+ optional_hash(this.texture_albedo)
170
+ ),
171
+ optional_hash(this.texture_normal),
172
+ optional_hash(this.texture_orm)
173
+ ),
174
+ optional_hash(this.texture_emissive)
170
175
  );
171
176
  }
172
177