@woosh/meep-engine 2.33.23 → 2.33.27

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 (302) hide show
  1. package/core/binary/BitSet.js +151 -167
  2. package/core/binary/BitSet.spec.js +99 -1
  3. package/core/binary/ValidatingBitSetWrapper.js +81 -0
  4. package/core/bvh2/BinaryNode.js +1 -1
  5. package/core/bvh2/aabb3/AABB3.js +21 -10
  6. package/core/bvh2/aabb3/AABB3Math.js +1 -1
  7. package/core/bvh2/binary/2/BinaryUint32BVH.js +498 -0
  8. package/core/bvh2/binary/2/BinaryUint32BVH.spec.js +54 -0
  9. package/core/bvh2/binary/IndexedBinaryBVH.js +22 -26
  10. package/core/bvh2/traversal/ThreeClippingPlaneComputingBVHVisitor.js +5 -1
  11. package/core/bvh2/traversal/__detailed_box_volume_intersection.js +22 -5
  12. package/core/cache/Cache.d.ts +4 -2
  13. package/core/cache/Cache.js +5 -2
  14. package/core/collection/ArrayUtils.js +1 -1
  15. package/core/collection/HashMap.d.ts +9 -2
  16. package/core/collection/HashSet.d.ts +7 -2
  17. package/core/collection/HashSet.js +7 -2
  18. package/core/collection/array/arrayQuickSort.js +9 -6
  19. package/core/collection/array/array_swap.js +22 -0
  20. package/core/collection/array/binarySearchHighIndex.js +1 -1
  21. package/core/collection/array/computeHashArray.js +22 -0
  22. package/core/collection/array/computeHashIntegerArray.js +15 -0
  23. package/core/collection/array/copyArray.js +2 -2
  24. package/core/collection/array/typed/typed_array_copy.js +1 -1
  25. package/core/collection/table/DataType2TypedArrayConstructorMapping.js +15 -0
  26. package/core/color/Color.js +2 -1
  27. package/core/function/FunctionCompiler.js +2 -1
  28. package/core/geom/3d/aabb/aabb3_computeDistanceAbovePlane.js +9 -33
  29. package/core/geom/3d/frustum/array_setFromProjectionMatrix.js +3 -3
  30. package/core/geom/3d/frustum/frustum3_computeNearestPointToPoint.js +1 -1
  31. package/core/geom/3d/line/line3_computeSegmentPointDistance_sqr.js +41 -0
  32. package/core/geom/3d/morton/mortonEncode_magicbits.js +2 -1
  33. package/core/geom/3d/morton/reinterpret_float32_as_int32.js +13 -0
  34. package/core/geom/3d/morton/v3_morton_encode_transformed.js +33 -0
  35. package/core/geom/3d/normal/hemioct/unit_hemioct.spec.js +1 -1
  36. package/core/geom/3d/ray/ray_computeNearestPointToPoint.js +37 -0
  37. package/core/geom/3d/shape/AbstractShape3D.js +65 -0
  38. package/core/geom/3d/shape/TransformedShape3D.js +181 -0
  39. package/core/geom/3d/shape/TransformedShape3D.spec.js +33 -0
  40. package/core/geom/3d/shape/UnionShape3D.js +255 -0
  41. package/core/geom/3d/shape/UnitCubeShape3D.js +101 -0
  42. package/core/geom/3d/shape/UnitCubeShape3D.spec.js +42 -0
  43. package/core/geom/3d/shape/UnitSphereShape3D.js +55 -0
  44. package/core/geom/3d/shape/util/compute_signed_distance_gradient_by_sampling.js +48 -0
  45. package/core/geom/3d/shape/util/shape_to_visual_entity.js +159 -0
  46. package/core/geom/AABB2.js +1 -1
  47. package/core/geom/ConicRay.js +3 -1
  48. package/core/geom/LineSegment.js +0 -78
  49. package/core/geom/Matrix4.js +7 -8
  50. package/core/geom/Rectangle.js +2 -1
  51. package/core/geom/Vector1.js +1 -1
  52. package/core/geom/Vector3.js +2 -1
  53. package/core/geom/Vector4.js +2 -1
  54. package/core/geom/random/randomPointInBox.js +7 -3
  55. package/core/geom/random/randomPointInPoint.js +6 -3
  56. package/core/geom/random/randomPointInSphere.js +9 -5
  57. package/core/geom/random/randomPointOnBox.js +7 -3
  58. package/core/geom/random/randomPointOnSphere.js +6 -3
  59. package/core/geom/v3_length.js +8 -3
  60. package/core/graph/graph_k_means_cluster.js +1 -1
  61. package/core/json/resolvePathByArray.js +2 -2
  62. package/core/math/MathUtils.js +0 -354
  63. package/core/math/MathUtils.spec.js +7 -1
  64. package/core/math/gaussian.js +9 -0
  65. package/core/math/hash/computeHashFloat.js +17 -0
  66. package/core/math/hash/computeHashFloatArray.js +34 -0
  67. package/core/math/hash/computeObjectHash.js +54 -0
  68. package/core/math/intersects1D.js +19 -0
  69. package/core/math/interval/NumericInterval.js +2 -2
  70. package/core/math/isValueBetween.js +10 -0
  71. package/core/math/isValueBetweenInclusive.js +10 -0
  72. package/core/math/noise/curl_noise_3dt.js +1 -1
  73. package/core/math/noise/sdnoise.js +10 -10
  74. package/core/math/overlap1D.js +19 -0
  75. package/core/math/pingpong.js +17 -0
  76. package/core/math/random/makeRangedRandom.js +19 -0
  77. package/core/math/random/randomFloatBetween.js +14 -0
  78. package/core/math/random/randomFromArray.js +19 -0
  79. package/core/math/random/randomGaussian.js +15 -0
  80. package/core/math/random/randomIntegerBetween.js +14 -0
  81. package/core/math/random/roundFair.js +15 -0
  82. package/core/math/separation1D.js +21 -0
  83. package/core/math/solveQuadratic.js +25 -0
  84. package/core/model/BoundedValue.js +1 -1
  85. package/core/model/node-graph/node/NodeInstancePortReference.js +1 -1
  86. package/core/model/node-graph/node/Port.js +1 -1
  87. package/core/model/reactive/evaluation/MultiPredicateEvaluator.spec.js +3 -1
  88. package/core/model/reactive/model/ReactiveBinaryExpression.js +1 -1
  89. package/core/model/reactive/model/terminal/ReactiveLiteralNumber.js +1 -1
  90. package/core/model/reactive/model/terminal/ReactiveReference.js +1 -1
  91. package/core/model/reactive/model/util/createRandomReactiveExpression.js +1 -1
  92. package/core/model/stat/LinearModifier.js +1 -1
  93. package/core/parser/simple/Token.d.ts +13 -0
  94. package/core/parser/simple/Token.js +61 -27
  95. package/{engine/graphics/render/forward_plus/materials → core/primitives/strings}/insert_after.js +3 -0
  96. package/core/primitives/strings/insert_after_or_replace.js +27 -0
  97. package/editor/process/symbolic/makeHelperBoxGeometry.js +44 -0
  98. package/editor/tools/FoliagePaintTool.js +4 -4
  99. package/editor/view/ecs/EntityEditor.js +2 -2
  100. package/editor/view/ecs/components/particles/ParticleEmitterController.js +2 -2
  101. package/engine/EngineHarness.js +1 -0
  102. package/engine/animation/AnimationUtils.js +5 -5
  103. package/engine/animation/curve/AnimationCurve.js +72 -0
  104. package/engine/animation/curve/Keyframe.js +27 -0
  105. package/engine/animation/keyed2/AnimationTrack.js +27 -3
  106. package/engine/asset/Asset.js +1 -1
  107. package/engine/asset/loaders/GLTFAssetLoader.d.ts +1 -1
  108. package/engine/asset/loaders/GLTFAssetLoader.js +62 -1
  109. package/engine/asset/loaders/image/ImageDecoderWorker.js +4 -3
  110. package/engine/asset/loaders/image/ImageRGBADataAsset.js +10 -2
  111. package/engine/asset/loaders/image/ImageRGBADataLoader.js +3 -3
  112. package/engine/asset/loaders/image/codec/NativeImageDecoder.js +2 -1
  113. package/engine/asset/loaders/image/png/PNG.js +113 -6
  114. package/engine/asset/loaders/image/png/PNGReader.js +5 -0
  115. package/engine/asset/loaders/material/bitmap2sampler_gl.js +1 -1
  116. package/engine/asset/loaders/material/computeImageBitmapEquality.js +6 -1
  117. package/engine/asset/loaders/material/computeMaterialHash.js +3 -1
  118. package/engine/asset/loaders/material/computeTextureEquality.js +40 -49
  119. package/engine/asset/loaders/material/computeTextureHash.js +2 -1
  120. package/engine/ecs/EntityBuilder.js +25 -5
  121. package/engine/ecs/EntityComponentDataset.js +1 -1
  122. package/engine/ecs/animation/Animation.js +2 -1
  123. package/engine/ecs/animation/InverseKinematics.js +2 -1
  124. package/engine/ecs/attachment/AttachmentBinding.js +8 -0
  125. package/engine/ecs/attachment/AttachmentSystem.js +4 -0
  126. package/engine/ecs/attachment/TransformAttachmentBinding.js +14 -44
  127. package/engine/ecs/components/Tag.js +27 -6
  128. package/engine/ecs/dynamic_actions/DynamicActorSystem.js +2 -1
  129. package/engine/ecs/dynamic_actions/DynamicRuleDescriptionTable.spec.js +3 -5
  130. package/engine/ecs/dynamic_actions/actions/definition/WeightedRandomActionDescription.js +1 -1
  131. package/engine/ecs/evaluation/complex/PointFitnessGaussianBlur.js +1 -1
  132. package/engine/ecs/foliage/InstancedFoliage.js +277 -266
  133. package/engine/ecs/foliage/ecs/Foliage2System.js +7 -7
  134. package/engine/ecs/foliage/ecs/InstancedMeshComponent.js +37 -0
  135. package/engine/ecs/foliage/ecs/{Foliage2.js → InstancedMeshLayer.js} +3 -45
  136. package/engine/ecs/foliage/ecs/InstancedMeshSerializationAdapter.js +6 -5
  137. package/engine/ecs/foliage/ecs/InstancedMeshUtils.js +7 -6
  138. package/engine/ecs/fow/FogOfWar.js +4 -0
  139. package/engine/ecs/fow/FogOfWarSystem.js +2 -0
  140. package/engine/ecs/fow/shader/FogOfWarRenderer.js +1 -1
  141. package/engine/ecs/gui/GUIElement.js +1 -1
  142. package/engine/ecs/gui/hud/HeadsUpDisplay.js +1 -1
  143. package/engine/ecs/gui/hud/HeadsUpDisplaySystem.js +2 -0
  144. package/engine/ecs/gui/position/ViewportPosition.js +2 -1
  145. package/engine/ecs/storage/binary/BinarySerializationRegistry.js +1 -1
  146. package/engine/ecs/system/AbstractContextSystem.js +1 -1
  147. package/engine/ecs/systems/RangedAttackSystem.js +1 -1
  148. package/engine/ecs/systems/SteeringSystem.js +1 -1
  149. package/engine/ecs/systems/TagSystem.js +17 -0
  150. package/engine/ecs/terrain/ecs/layers/TerrainLayer.js +12 -16
  151. package/engine/ecs/terrain/tiles/TerrainTileManager.js +1 -1
  152. package/engine/ecs/tooltip/TooltipComponent.js +15 -0
  153. package/engine/ecs/transform/Transform.js +19 -6
  154. package/engine/graphics/GraphicsEngine.js +11 -6
  155. package/engine/graphics/composit/CompositLayer.js +17 -4
  156. package/engine/graphics/composit/CompositingStages.js +8 -0
  157. package/engine/graphics/composit/LayerCompositer.js +35 -6
  158. package/engine/graphics/ecs/animation/animator/AnimationClip.js +2 -1
  159. package/engine/graphics/ecs/animation/animator/AnimationClipDefinition.js +2 -1
  160. package/engine/graphics/ecs/animation/animator/AnimationNotification.js +2 -1
  161. package/engine/graphics/ecs/animation/animator/AnimationNotificationDefinition.js +2 -1
  162. package/engine/graphics/ecs/animation/animator/graph/AnimationGraph.js +2 -1
  163. package/engine/graphics/ecs/animation/animator/graph/definition/AnimationGraphDefinition.js +2 -1
  164. package/engine/graphics/ecs/animation/animator/graph/definition/AnimationStateDefinition.js +1 -1
  165. package/engine/graphics/ecs/animation/animator/graph/definition/AnimationTransitionDefinition.js +2 -1
  166. package/engine/graphics/ecs/camera/CameraClippingPlaneComputer.js +1 -1
  167. package/engine/graphics/ecs/highlight/HighlightDefinition.js +2 -1
  168. package/engine/graphics/ecs/highlight/plugin/OutlineRenderPlugin.js +11 -7
  169. package/engine/graphics/ecs/light/Light.d.ts +1 -1
  170. package/engine/graphics/ecs/light/Light.js +5 -0
  171. package/engine/graphics/ecs/light/binding/three/ThreeLightBinding.js +5 -1
  172. package/engine/graphics/ecs/mesh/Mesh.js +2 -1
  173. package/engine/graphics/ecs/mesh-v2/DrawMode.js +5 -0
  174. package/engine/graphics/ecs/mesh-v2/ShadedGeometry.d.ts +13 -0
  175. package/engine/graphics/ecs/mesh-v2/ShadedGeometry.js +32 -18
  176. package/engine/graphics/ecs/mesh-v2/ShadedGeometrySystem.d.ts +6 -0
  177. package/engine/graphics/geometry/AttributeSpec.js +105 -0
  178. package/engine/graphics/{micron/format/MicronVertexDataSpec.js → geometry/VertexDataSpec.js} +56 -25
  179. package/engine/graphics/geometry/instancing/InstancedMeshGroup.js +14 -72
  180. package/engine/graphics/geometry/instancing/rewriteMaterial.js +70 -0
  181. package/engine/graphics/material/manager/MaterialManager.js +2 -1
  182. package/engine/graphics/micron/build/buildMicronGeometryFromBufferGeometry.js +7 -7
  183. package/engine/graphics/micron/build/fill_patch_geometry_data.js +1 -1
  184. package/engine/graphics/micron/buildPatchwork.js +1 -1
  185. package/engine/graphics/micron/format/MicronGeometry.js +3 -3
  186. package/engine/graphics/micron/format/serialization/MicronGeometryBinarySerializationAdapter.js +2 -2
  187. package/engine/graphics/micron/format/serialization/deserialize_attribute_spec.js +1 -1
  188. package/engine/graphics/micron/format/serialization/serialize_attribute_spec.js +1 -1
  189. package/engine/graphics/micron/render/PatchCacheKey.js +1 -1
  190. package/engine/graphics/micron/render/instanced/AttributeDataTexture.js +11 -9
  191. package/engine/graphics/micron/render/instanced/ThreeInstancedAdapter.js +0 -2
  192. package/engine/graphics/micron/render/v1/ThreeVirtualGeometryAdapter.js +1 -1
  193. package/engine/graphics/particles/ParticleEmitterLibrary.js +3 -0
  194. package/engine/graphics/particles/ecs/{ParticleEmitterSystem2.js → ParticleEmitterSystem.js} +17 -9
  195. package/engine/graphics/particles/particular/engine/ParticularEngine.js +8 -2
  196. package/engine/graphics/particles/particular/engine/emitter/PARTICULAR_PARTICLE_SPECIFICATION.js +80 -16
  197. package/engine/graphics/particles/particular/engine/emitter/ParticleEmitter.js +71 -77
  198. package/engine/graphics/particles/particular/engine/emitter/ParticleEmitterFlag.js +5 -0
  199. package/engine/graphics/particles/particular/engine/emitter/ParticleLayer.js +2 -1
  200. package/engine/graphics/particles/particular/engine/emitter/ParticlePool.js +141 -14
  201. package/engine/graphics/particles/particular/engine/emitter/ParticlePool.spec.js +8 -7
  202. package/engine/graphics/particles/particular/engine/emitter/computeEmissionFunction.js +1 -1
  203. package/engine/graphics/particles/particular/engine/emitter/serde/ParameterLookupTableSerializationAdapter.js +8 -2
  204. package/engine/graphics/particles/particular/engine/parameter/ParameterLookupTable.js +2 -1
  205. package/engine/graphics/particles/particular/engine/parameter/ParameterTrack.js +1 -1
  206. package/engine/graphics/particles/particular/engine/parameter/ParticleParameter.js +1 -1
  207. package/engine/graphics/particles/particular/engine/renderers/billboard/BILLBOARD_PARTICLE_SPECIFICATION.js +24 -0
  208. package/engine/graphics/particles/particular/engine/renderers/billboard/ParticleBillboardMaterial.js +262 -71
  209. package/engine/graphics/particles/particular/engine/renderers/billboard/prototypeBillboardRenderer.js +9 -9
  210. package/engine/graphics/particles/particular/engine/shader/ShaderManager.js +81 -48
  211. package/engine/graphics/particles/particular/engine/shader/debugAtlas.js +14 -0
  212. package/engine/graphics/particles/particular/engine/simulator/SimulationStepApplyForce.js +2 -5
  213. package/engine/graphics/particles/particular/engine/simulator/SimulationStepCurlNoiseAcceleration.js +2 -6
  214. package/engine/graphics/particles/particular/engine/simulator/SimulationStepCurlNoiseVelocity.js +2 -7
  215. package/engine/graphics/particles/particular/engine/simulator/SimulationStepFixedPhysics.js +2 -5
  216. package/engine/graphics/particles/particular/engine/simulator/update_parameters.js +1 -1
  217. package/engine/graphics/particles/particular/engine/utils/distributeParticlesOnObject3D.js +1 -1
  218. package/engine/graphics/particles/particular/engine/utils/distrubuteParticlesOnMesh.js +1 -1
  219. package/engine/graphics/particles/particular/engine/utils/volume/AttributeValue.js +141 -0
  220. package/engine/graphics/particles/particular/engine/utils/volume/ParticleVolume.js +478 -0
  221. package/engine/graphics/particles/particular/engine/utils/volume/lut_to_sampler.js +27 -0
  222. package/engine/graphics/particles/particular/engine/utils/volume/prototypeParticleVolume.js +938 -0
  223. package/engine/graphics/particles/particular/group/Operation.js +18 -0
  224. package/engine/graphics/particles/particular/group/OperationType.js +9 -0
  225. package/engine/graphics/particles/particular/group/ParticleAttribute.js +2 -1
  226. package/engine/graphics/particles/particular/group/ParticleAttributeType.js +11 -0
  227. package/engine/graphics/particles/particular/group/ParticleDataType.js +10 -0
  228. package/engine/graphics/particles/particular/group/ParticleGroup.js +7 -245
  229. package/engine/graphics/particles/particular/group/ParticleGroup.spec.js +3 -1
  230. package/engine/graphics/particles/particular/group/ParticleSpecification.js +21 -14
  231. package/engine/graphics/particles/particular/group/itemSizeFromAttributeType.js +20 -0
  232. package/engine/graphics/particles/particular/group/optimizeCommandQueue.js +162 -0
  233. package/engine/graphics/particles/particular/group/typedArrayConstructorFromDataType.js +19 -0
  234. package/engine/graphics/render/buffer/simple-fx/ao/AmbientOcclusionPostProcessEffect.js +16 -11
  235. package/engine/graphics/render/buffer/slot/parameter/ProgramValueSlotParameter.js +2 -1
  236. package/engine/graphics/render/buffer/slot/parameter/ProgramValueSlotParameterSet.js +1 -1
  237. package/engine/graphics/render/forward_plus/LightManager.js +117 -94
  238. package/engine/graphics/render/forward_plus/PointLight.js +9 -0
  239. package/engine/graphics/render/forward_plus/PointLightData.js +1 -1
  240. package/engine/graphics/render/forward_plus/SpotLight.js +9 -0
  241. package/engine/graphics/render/forward_plus/cluster/compute_light_data_hash_0.js +2 -2
  242. package/engine/graphics/render/forward_plus/materials/FP_INJECTION_POINT_ACCUMULATION.js +1 -0
  243. package/engine/graphics/render/forward_plus/materials/FP_SHADER_CHUNK_ACCUMULATION.js +32 -0
  244. package/engine/graphics/render/forward_plus/materials/FP_SHADER_CHUNK_DECODE_PARS.js +51 -0
  245. package/engine/graphics/render/forward_plus/materials/FP_SHADER_CHUNK_PREAMBLE.js +25 -0
  246. package/engine/graphics/render/forward_plus/materials/FPlusDebugMaterial.js +3 -3
  247. package/engine/graphics/render/forward_plus/materials/ForwardPlusThreeMaterial.js +1 -1
  248. package/engine/graphics/render/forward_plus/materials/fp_build_fragment_shader.js +31 -120
  249. package/engine/graphics/render/forward_plus/materials/fp_build_vertex_lighting_shared.js +35 -0
  250. package/engine/graphics/render/forward_plus/materials/fp_build_vertex_shader.js +4 -5
  251. package/engine/graphics/render/forward_plus/plugin/ForwardPlusRenderingPlugin.js +1 -1
  252. package/engine/graphics/render/forward_plus/plugin/MaterialTransformer.js +10 -3
  253. package/engine/graphics/render/forward_plus/plugin/ptototypeFPPlugin.js +594 -59
  254. package/engine/graphics/render/forward_plus/prototypeLightManager.js +208 -89
  255. package/engine/graphics/render/forward_plus/query/analytical_triplanar_corner_mapping.js +8 -0
  256. package/engine/graphics/render/forward_plus/query/cube_mapping.js +38 -0
  257. package/engine/graphics/render/forward_plus/query/detailed_sphere_frustum_intersection_test.js +86 -0
  258. package/engine/graphics/render/forward_plus/query/point_light_inside_volume.js +74 -0
  259. package/engine/graphics/render/forward_plus/query/query_bvh_frustum_from_objects.js +131 -0
  260. package/engine/graphics/render/forward_plus/query/query_bvh_frustum_from_texture.js +129 -0
  261. package/engine/graphics/render/forward_plus/query/spot_light_inside_volume.js +33 -0
  262. package/engine/graphics/render/forward_plus/read_frustum_corner.js +14 -0
  263. package/engine/graphics/render/forward_plus/testClusterEquality.js +22 -0
  264. package/engine/graphics/render/visibility/IncrementalDeltaSet.js +11 -0
  265. package/engine/graphics/render/visibility/hiz/prototypeHiZ.js +1 -1
  266. package/engine/graphics/shaders/TerrainShader.js +4 -5
  267. package/engine/graphics/shadows/ShadowMapRenderer.js +8 -2
  268. package/engine/graphics/texture/atlas/ManagedTextureAtlas.js +12 -1
  269. package/engine/graphics/texture/sampler/HarmonicDiffusionGrid.spec.js +1 -1
  270. package/engine/graphics/texture/sampler/SampleTraverser.js +1 -1
  271. package/engine/graphics/texture/sampler/Sampler2D.js +3 -1
  272. package/engine/graphics/texture/sampler/convertTexture2Sampler2D.js +1 -1
  273. package/engine/graphics/texture/sampler/copy_Sampler2D_channel_data.js +66 -0
  274. package/engine/graphics/texture/sampler/distanceField.spec.js +1 -1
  275. package/engine/graphics/util/composeMatrix4.js +33 -23
  276. package/engine/graphics/util/decompose_matrix_4_array.js +61 -0
  277. package/engine/grid/components/GridObstacle.js +1 -1
  278. package/engine/intelligence/behavior/ecs/BehaviorComponent.js +30 -14
  279. package/engine/intelligence/behavior/selector/WeightedElement.js +2 -1
  280. package/engine/intelligence/optimization/RandomOptimizer.js +1 -1
  281. package/engine/knowledge/database/StaticKnowledgeDataTable.js +6 -1
  282. package/engine/navigation/ecs/components/Path.js +1 -6
  283. package/engine/navigation/grid/FastBinaryHeap.spec.js +1 -1
  284. package/engine/sound/ecs/emitter/SoundEmitter.js +2 -1
  285. package/engine/sound/ecs/emitter/SoundTrack.js +2 -1
  286. package/engine/sound/material/concrete/RandomSoundMaterial.js +1 -1
  287. package/engine/ui/notification/notificationGenerator.js +1 -1
  288. package/generation/filtering/numeric/complex/CellFilterGaussianBlur.js +1 -1
  289. package/generation/grid/generation/GridTaskExecuteRuleTimes.js +2 -1
  290. package/generation/markers/actions/MarkerNodeActionSelectRandom.js +1 -1
  291. package/generation/markers/transform/MarkerNodeTransformerRecordUniqueRandomEnum.js +1 -1
  292. package/generation/placement/action/random/CellActionSelectRandom.js +1 -1
  293. package/generation/theme/ThemeEngine.js +1 -1
  294. package/misc/makeMaterialIconCached.js +2 -2
  295. package/package.json +1 -1
  296. package/view/elements/image/HTMLElementCacheKey.js +2 -1
  297. package/view/elements/radial/RadialText.js +2 -1
  298. package/view/minimap/gl/MinimapMarkersGL.js +6 -100
  299. package/view/minimap/gl/MinimapWorldGL.js +12 -5
  300. package/view/minimap/gl/buildMaterial.js +94 -0
  301. package/engine/graphics/micron/format/MicronGeometryBufferAttributeSpec.js +0 -71
  302. package/engine/graphics/render/forward_plus/queryBVH_Frustum.js +0 -357
@@ -0,0 +1,81 @@
1
+ //
2
+
3
+ /**
4
+ * Debug tool to verify correct behavior of a BitSet
5
+ */
6
+ export class ValidatingBitSetWrapper {
7
+ /**
8
+ *
9
+ * @param {BitSet} source
10
+ */
11
+ constructor(source) {
12
+ this.__source = source;
13
+ }
14
+
15
+ preventShrink() {
16
+ this.__source.preventShrink();
17
+ }
18
+
19
+ setShrinkFactor(x) {
20
+ this.__source.setShrinkFactor(x);
21
+ }
22
+
23
+ setCapacity(x) {
24
+ this.__source.setCapacity(x);
25
+ }
26
+
27
+ size() {
28
+ return this.__source.size();
29
+ }
30
+
31
+ capacity() {
32
+ return this.__source.capacity();
33
+ }
34
+
35
+ previousSetBit(i) {
36
+ const bit = this.__source.previousSetBit(i);
37
+
38
+ if (bit !== -1 && (this.__source.get(bit) !== true || bit > i)) {
39
+ debugger;
40
+ }
41
+
42
+ return bit;
43
+ }
44
+
45
+ nextSetBit(i) {
46
+ const bit = this.__source.nextSetBit(i);
47
+
48
+ if (bit !== -1 && (this.__source.get(bit) !== true || bit < i)) {
49
+ debugger;
50
+ }
51
+
52
+ return bit;
53
+ }
54
+
55
+ nextClearBit(i) {
56
+ const bit = this.__source.nextClearBit(i);
57
+
58
+ if (bit !== -1 && (this.__source.get(bit) !== false || bit < i)) {
59
+ debugger;
60
+ }
61
+
62
+ return bit;
63
+ }
64
+
65
+ set(x, y) {
66
+ this.__source.set(x, y);
67
+ }
68
+
69
+ clear(i) {
70
+ this.__source.clear(i);
71
+ }
72
+
73
+ get(i) {
74
+ return this.__source.get(i);
75
+ }
76
+
77
+
78
+ reset() {
79
+ this.__source.reset();
80
+ }
81
+ }
@@ -657,7 +657,7 @@ BinaryNode.prototype.insertManyBoxes2 = function (leafFactory, numNodes) {
657
657
  }
658
658
 
659
659
  //sort leaves
660
- arrayQuickSort(nodes, n => n.computeMortonCode(), 0, max2(0, numNodes - 1));
660
+ arrayQuickSort(nodes, n => n.computeMortonCode(), null, 0, max2(0, numNodes - 1));
661
661
 
662
662
  let remaining_nodes = numNodes;
663
663
 
@@ -761,16 +761,9 @@ AABB3.prototype.computePlaneSide = function computePlaneSide(plane) {
761
761
  const normal = plane.normal;
762
762
 
763
763
  return computeAABB3PlaneSide(
764
- normal.x,
765
- normal.y,
766
- normal.z,
767
- plane.constant,
768
- this.x0,
769
- this.y0,
770
- this.z0,
771
- this.x1,
772
- this.y1,
773
- this.z1
764
+ normal.x, normal.y, normal.z, plane.constant,
765
+ this.x0, this.y0, this.z0,
766
+ this.x1, this.y1, this.z1
774
767
  );
775
768
  };
776
769
 
@@ -870,6 +863,20 @@ AABB3.prototype.intersectFrustum = function intersectFrustum(frustum) {
870
863
  return true;
871
864
  };
872
865
 
866
+ /**
867
+ *
868
+ * @param {number} v
869
+ */
870
+ AABB3.prototype.grow = function (v) {
871
+ this.x0 -= v;
872
+ this.y0 -= v;
873
+ this.z0 -= v;
874
+
875
+ this.x1 += v;
876
+ this.y1 += v;
877
+ this.z1 += v;
878
+ };
879
+
873
880
  /**
874
881
  *
875
882
  * @returns {AABB3}
@@ -882,6 +889,10 @@ AABB3.prototype.clone = function () {
882
889
  return clone;
883
890
  };
884
891
 
892
+ AABB3.prototype.fromJSON = function ({ x0, y0, z0, x1, y1, z1 }) {
893
+ this.setBounds(x0, y0, z0, x1, y1, z1);
894
+ };
895
+
885
896
  /**
886
897
  *
887
898
  * @param {BinaryBuffer} buffer
@@ -3,9 +3,9 @@
3
3
  */
4
4
 
5
5
 
6
- import { intersects1D } from "../../math/MathUtils.js";
7
6
  import { max2 } from "../../math/max2.js";
8
7
  import { min2 } from "../../math/min2.js";
8
+ import { intersects1D } from "../../math/intersects1D.js";
9
9
 
10
10
  /**
11
11
  * Float ABS, from standard C lib
@@ -0,0 +1,498 @@
1
+ import { array_copy } from "../../../collection/array/copyArray.js";
2
+ import { min2 } from "../../../math/min2.js";
3
+ import { max2 } from "../../../math/max2.js";
4
+ import { ceilPowerOfTwo } from "../../../binary/operations/ceilPowerOfTwo.js";
5
+ import { array_swap } from "../../../collection/array/array_swap.js";
6
+ import { _boxSurfaceArea2 } from "../../aabb3/AABB3Math.js";
7
+ import { mortonEncode_magicbits } from "../../../geom/3d/morton/mortonEncode_magicbits.js";
8
+ import { min3 } from "../../../math/min3.js";
9
+ import { max3 } from "../../../math/max3.js";
10
+
11
+ /**
12
+ * @readonly
13
+ * @type {number}
14
+ */
15
+ export const BVH_BOX_BYTE_SIZE = 24;
16
+
17
+ /**
18
+ * In bytes
19
+ * @readonly
20
+ * @type {number}
21
+ */
22
+ export const BVH_BINARY_NODE_SIZE = 24;
23
+ /**
24
+ * @readonly
25
+ * @type {number}
26
+ */
27
+ export const BVH_LEAF_NODE_SIZE = 28;
28
+
29
+ /**
30
+ *
31
+ * @param {DataView} data
32
+ * @param {number} destination
33
+ * @param {number} source_a
34
+ * @param {number} source_b
35
+ */
36
+ function refit_binary(data, destination, source_a, source_b) {
37
+ const ax0 = data.getFloat32(source_a);
38
+ const ay0 = data.getFloat32(source_a + 4);
39
+ const az0 = data.getFloat32(source_a + 8);
40
+ const ax1 = data.getFloat32(source_a + 12);
41
+ const ay1 = data.getFloat32(source_a + 16);
42
+ const az1 = data.getFloat32(source_a + 20);
43
+
44
+ const bx0 = data.getFloat32(source_b);
45
+ const by0 = data.getFloat32(source_b + 4);
46
+ const bz0 = data.getFloat32(source_b + 8);
47
+ const bx1 = data.getFloat32(source_b + 12);
48
+ const by1 = data.getFloat32(source_b + 16);
49
+ const bz1 = data.getFloat32(source_b + 20);
50
+
51
+ const x0 = min2(ax0, bx0);
52
+ const y0 = min2(ay0, by0);
53
+ const z0 = min2(az0, bz0);
54
+
55
+ const x1 = max2(ax1, bx1);
56
+ const y1 = max2(ay1, by1);
57
+ const z1 = max2(az1, bz1);
58
+
59
+ data.setFloat32(destination, x0);
60
+ data.setFloat32(destination + 4, y0);
61
+ data.setFloat32(destination + 8, z0);
62
+ data.setFloat32(destination + 12, x1);
63
+ data.setFloat32(destination + 16, y1);
64
+ data.setFloat32(destination + 20, z1);
65
+ }
66
+
67
+ /**
68
+ *
69
+ * @param {Uint8Array} data
70
+ * @param {number} destination
71
+ * @param {number} source
72
+ */
73
+ function copy_box(data, destination, source) {
74
+ array_copy(data, source, data, destination, 24);
75
+ }
76
+
77
+ /**
78
+ *
79
+ * @param {DataView} data
80
+ * @param {number} destination
81
+ * @param {number} source
82
+ */
83
+ function copy_box_zero_size(data, destination, source) {
84
+ const x = data.getFloat32(source);
85
+ const y = data.getFloat32(source + 4);
86
+ const z = data.getFloat32(source + 8);
87
+
88
+ data.setFloat32(destination, x);
89
+ data.setFloat32(destination + 4, y);
90
+ data.setFloat32(destination + 8, z);
91
+
92
+ data.setFloat32(destination + 12, x);
93
+ data.setFloat32(destination + 16, y);
94
+ data.setFloat32(destination + 20, z);
95
+ }
96
+
97
+ /**
98
+ * Assumes data will be normalized to 0...1 value range
99
+ * @param {DataView} data
100
+ * @param {number} address
101
+ * @param {number[]} matrix
102
+ * @returns {number}
103
+ */
104
+ function build_morton(data, address, matrix) {
105
+
106
+ const x0 = data.getFloat32(address);
107
+ const y0 = data.getFloat32(address + 4);
108
+ const z0 = data.getFloat32(address + 8);
109
+ const x1 = data.getFloat32(address + 12);
110
+ const y1 = data.getFloat32(address + 16);
111
+ const z1 = data.getFloat32(address + 20);
112
+
113
+ const cx = (x0 + x1) / 2;
114
+ const cy = (y0 + y1) / 2;
115
+ const cz = (z0 + z1) / 2;
116
+
117
+ return mortonEncode_magicbits(cx, cy, cz);
118
+ // return v3_morton_encode_transformed(cx, cy, cz, matrix);
119
+
120
+ }
121
+
122
+ const scratch_box_0 = [];
123
+ const scratch_box_1 = [];
124
+ const scratch_box_2 = [];
125
+
126
+ const stack = [];
127
+
128
+ export class BinaryUint32BVH {
129
+ constructor() {
130
+ this.__data_buffer = new ArrayBuffer(320);
131
+ this.__data_uint8 = new Uint8Array(this.__data_buffer);
132
+
133
+ /**
134
+ * @readonly
135
+ * @type {DataView}
136
+ * @private
137
+ */
138
+ this.__data_view = new DataView(this.__data_buffer);
139
+
140
+ /**
141
+ *
142
+ * @type {number}
143
+ * @private
144
+ */
145
+ this.__node_count_binary = 0;
146
+
147
+ /**
148
+ *
149
+ * @type {number}
150
+ * @private
151
+ */
152
+ this.__node_count_leaf = 0;
153
+ }
154
+
155
+ getTotalBoxCount() {
156
+ return this.__node_count_binary + this.__node_count_leaf;
157
+ }
158
+
159
+ getBinaryNodeCount() {
160
+ return this.__node_count_binary;
161
+ }
162
+
163
+ getLeafNodeCount() {
164
+ return this.__node_count_leaf;
165
+ }
166
+
167
+ /**
168
+ *
169
+ * @returns {number}
170
+ */
171
+ getLeafBlockAddress() {
172
+ return this.__node_count_binary * BVH_BINARY_NODE_SIZE;
173
+ }
174
+
175
+ /**
176
+ *
177
+ * @returns {DataView}
178
+ */
179
+ getDataView() {
180
+ return this.__data_view;
181
+ }
182
+
183
+ initialize_structure() {
184
+ // compute memory requirements
185
+ const storage_size = this.__node_count_binary * BVH_BINARY_NODE_SIZE + this.__node_count_leaf * BVH_LEAF_NODE_SIZE;
186
+
187
+ // possibly resize the storage
188
+ if (this.__data_buffer.byteLength < storage_size) {
189
+ this.__data_buffer = new ArrayBuffer(storage_size);
190
+ this.__data_uint8 = new Uint8Array(this.__data_buffer);
191
+ this.__data_view = new DataView(this.__data_buffer);
192
+ }
193
+ }
194
+
195
+ /**
196
+ *
197
+ * @param {number} count
198
+ */
199
+ setLeafCount(count) {
200
+ this.__node_count_leaf = count;
201
+
202
+ const twoLeafLimit = ceilPowerOfTwo(count);
203
+
204
+ this.__node_count_binary = twoLeafLimit - 1;
205
+ }
206
+
207
+ /**
208
+ *
209
+ * @param {number} index
210
+ * @param {number} payload
211
+ * @param {number} x0
212
+ * @param {number} y0
213
+ * @param {number} z0
214
+ * @param {number} x1
215
+ * @param {number} y1
216
+ * @param {number} z1
217
+ */
218
+ setLeafData(index, payload, x0, y0, z0, x1, y1, z1) {
219
+ const address = index * BVH_LEAF_NODE_SIZE + this.__node_count_binary * BVH_BINARY_NODE_SIZE;
220
+
221
+ const view = this.__data_view;
222
+
223
+ view.setFloat32(address, x0);
224
+ view.setFloat32(address + 4, y0);
225
+ view.setFloat32(address + 8, z0);
226
+ view.setFloat32(address + 12, x1);
227
+ view.setFloat32(address + 16, y1);
228
+ view.setFloat32(address + 20, z1);
229
+
230
+ view.setUint32(address + 24, payload);
231
+ }
232
+
233
+ /**
234
+ * Read bounds of a box at the given address
235
+ * @param {number} address where the box is found
236
+ * @param {number[]|Float32Array} destination where to write the box coordinates (x0,y0,z0,x1,y1,z1)
237
+ * @param {number} destination_offset offset within the destination array where to start writing results
238
+ */
239
+ readBounds(address, destination, destination_offset) {
240
+ const v = this.__data_view;
241
+ for (let i = 0; i < 6; i++) {
242
+ destination[destination_offset + i] = v.getFloat32(address + i * 4);
243
+ }
244
+ }
245
+
246
+ /**
247
+ *
248
+ * @param {number} leaf_index
249
+ * @returns {number}
250
+ */
251
+ readLeafPayload(leaf_index) {
252
+ const block_address = this.getLeafBlockAddress();
253
+
254
+ const address = block_address + leaf_index * BVH_LEAF_NODE_SIZE + BVH_BOX_BYTE_SIZE;
255
+
256
+ return this.__data_view.getUint32(address);
257
+ }
258
+
259
+ compute_total_surface_area() {
260
+ let result = 0;
261
+
262
+ const box = new Float32Array(6);
263
+
264
+ for (let i = 0; i < this.getTotalBoxCount(); i++) {
265
+ let address;
266
+
267
+ if (i < this.__node_count_binary) {
268
+ address = i * BVH_BINARY_NODE_SIZE;
269
+ } else {
270
+ const li = i - this.__node_count_binary;
271
+ address = li * BVH_LEAF_NODE_SIZE + this.getLeafBlockAddress();
272
+ }
273
+
274
+ this.readBounds(address, box, 0);
275
+ result += _boxSurfaceArea2(box[0], box[1], box[2], box[3], box[4], box[5]);
276
+ }
277
+
278
+ return result;
279
+ }
280
+
281
+ /**
282
+ *
283
+ * @param {number} a address
284
+ * @param {number} b address
285
+ * @param {number} c address
286
+ * @returns {number}
287
+ * @private
288
+ */
289
+ __compute_bounds_area_of_3_boxes(a, b, c) {
290
+ this.readBounds(a, scratch_box_0, 0);
291
+ this.readBounds(b, scratch_box_1, 0);
292
+ this.readBounds(c, scratch_box_2, 0);
293
+
294
+ const x0 = min3(scratch_box_0[0], scratch_box_1[0], scratch_box_2[0]);
295
+ const y0 = min3(scratch_box_0[1], scratch_box_1[1], scratch_box_2[1]);
296
+ const z0 = min3(scratch_box_0[2], scratch_box_1[2], scratch_box_2[2]);
297
+
298
+ const x1 = max3(scratch_box_0[3], scratch_box_1[3], scratch_box_2[3]);
299
+ const y1 = max3(scratch_box_0[4], scratch_box_1[4], scratch_box_2[4]);
300
+ const z1 = max3(scratch_box_0[5], scratch_box_1[5], scratch_box_2[5]);
301
+
302
+ return _boxSurfaceArea2(x0, y0, z0, x1, y1, z1);
303
+ }
304
+
305
+ /**
306
+ *
307
+ * @param {number} a
308
+ * @param {number} b
309
+ * @returns {number}
310
+ * @private
311
+ */
312
+ __fitness_function_should_swap_leaves_sah(a, b) {
313
+ const a_0 = max2(a - 1, 0);
314
+ const a_1 = min2(a + 1, this.__node_count_leaf - 1);
315
+
316
+ const leaf_block_offset = this.getLeafBlockAddress();
317
+
318
+ const a_c_address = a * BVH_LEAF_NODE_SIZE + leaf_block_offset;
319
+ const a_0_address = a_0 * BVH_LEAF_NODE_SIZE + leaf_block_offset;
320
+ const a_1_address = a_1 * BVH_LEAF_NODE_SIZE + leaf_block_offset;
321
+
322
+
323
+ const b_0 = max2(b - 1, 0);
324
+ const b_1 = min2(b + 1, this.__node_count_leaf - 1);
325
+
326
+ const b_c_address = b * BVH_LEAF_NODE_SIZE + leaf_block_offset;
327
+ const b_0_address = b_0 * BVH_LEAF_NODE_SIZE + leaf_block_offset;
328
+ const b_1_address = b_1 * BVH_LEAF_NODE_SIZE + leaf_block_offset;
329
+
330
+
331
+ const current_area = this.__compute_bounds_area_of_3_boxes(a_0_address, a_c_address, a_1_address) + this.__compute_bounds_area_of_3_boxes(b_0_address, b_c_address, b_1_address);
332
+ const swap_area = this.__compute_bounds_area_of_3_boxes(a_0_address, b_c_address, a_1_address) + this.__compute_bounds_area_of_3_boxes(b_0_address, a_c_address, b_1_address);
333
+
334
+ return current_area - swap_area;
335
+ }
336
+
337
+ sort_bubble_sah() {
338
+ const n = this.__node_count_leaf;
339
+
340
+ for (let i = 0; i < n; i++) {
341
+ for (let j = i + 1; j < n; j++) {
342
+ if (this.__fitness_function_should_swap_leaves_sah(i, j) > 0) {
343
+ this.__swap_leaves(i, j);
344
+ }
345
+ }
346
+ }
347
+ }
348
+
349
+
350
+ /**
351
+ * Sort leaf nodes according to their morton codes
352
+ * @param {number[]} projection
353
+ */
354
+ sort_morton(projection) {
355
+
356
+ const leaf_block_address = this.__node_count_binary * BVH_BINARY_NODE_SIZE;
357
+
358
+ if (this.__node_count_leaf < 2) {
359
+ // no swaps available
360
+ return;
361
+ }
362
+
363
+ let stackPointer = 2;
364
+ let i, j;
365
+
366
+ stack[0] = 0; // first node
367
+ stack[1] = this.__node_count_leaf - 1; // last node
368
+
369
+ const data = this.__data_view;
370
+
371
+ while (stackPointer > 0) {
372
+ stackPointer -= 2;
373
+
374
+ const right = stack[stackPointer + 1];
375
+ const left = stack[stackPointer];
376
+
377
+ i = left;
378
+ j = right;
379
+
380
+ const pivotIndex = (left + right) >> 1;
381
+
382
+ const pivot = build_morton(data, pivotIndex * BVH_LEAF_NODE_SIZE + leaf_block_address, projection);
383
+
384
+ /* partition */
385
+ while (i <= j) {
386
+ while (build_morton(data, i * BVH_LEAF_NODE_SIZE + leaf_block_address, projection) < pivot) {
387
+ i++;
388
+ }
389
+
390
+ while (build_morton(data, j * BVH_LEAF_NODE_SIZE + leaf_block_address, projection) > pivot) {
391
+ j--;
392
+ }
393
+
394
+ if (i <= j) {
395
+
396
+ if (i !== j) {
397
+ //do swap
398
+ this.__swap_leaves(i, j);
399
+ }
400
+
401
+ i++;
402
+ j--;
403
+ }
404
+ }
405
+
406
+ /* recursion */
407
+ if (left < j) {
408
+ stack[stackPointer++] = left;
409
+ stack[stackPointer++] = j;
410
+ }
411
+ if (i < right) {
412
+ stack[stackPointer++] = i;
413
+ stack[stackPointer++] = right;
414
+ }
415
+ }
416
+ }
417
+
418
+ /**
419
+ *
420
+ * @param {number} i
421
+ * @param {number} j
422
+ * @private
423
+ */
424
+ __swap_leaves(i, j) {
425
+ const leaf_block_address = this.getLeafBlockAddress();
426
+ array_swap(
427
+ this.__data_uint8, i * BVH_LEAF_NODE_SIZE + leaf_block_address,
428
+ this.__data_uint8, j * BVH_LEAF_NODE_SIZE + leaf_block_address,
429
+ BVH_LEAF_NODE_SIZE
430
+ );
431
+ }
432
+
433
+ /**
434
+ * Assemble leaf nodes into hierarchy, set binary node bounds iteratively bottom up
435
+ */
436
+ build() {
437
+ const nodeCount = this.__node_count_binary;
438
+
439
+ const leaf_node_block_address = this.__node_count_binary * BVH_BINARY_NODE_SIZE;
440
+
441
+ let level = Math.floor(Math.log(nodeCount) / Math.log(2));
442
+
443
+ let i, offset, level_node_count;
444
+ //NOTE: building first level separately allows to avoid some switching logic needed to determine what is the type of lower level node
445
+ //build one level above leaf nodes
446
+ level_node_count = Math.pow(2, level);
447
+ offset = (level_node_count - 1) * BVH_BINARY_NODE_SIZE;
448
+
449
+ let parentIndex;
450
+
451
+ const node_count_leaf = this.__node_count_leaf;
452
+
453
+ // build bottom-most level, just above the leaves
454
+ for (i = 0; i < level_node_count; i++) {
455
+ const leafIndex0 = i * 2;
456
+ const leafIndex1 = leafIndex0 + 1;
457
+
458
+ const leafOffset0 = leaf_node_block_address + leafIndex0 * BVH_LEAF_NODE_SIZE;
459
+ const leafOffset1 = leaf_node_block_address + leafIndex1 * BVH_LEAF_NODE_SIZE;
460
+
461
+ if (leafIndex1 < node_count_leaf) {
462
+ // both children nodes are valid
463
+ refit_binary(this.__data_view, offset, leafOffset0, leafOffset1);
464
+ } else if (leafIndex0 < node_count_leaf) {
465
+ // only left child node is valid
466
+ copy_box(this.__data_uint8, offset, leafOffset0);
467
+ } else {
468
+ //initialize to 0-size box same position as previous node
469
+ copy_box_zero_size(this.__data_view, offset, offset - BVH_BINARY_NODE_SIZE);
470
+ }
471
+
472
+ offset += BVH_BINARY_NODE_SIZE;
473
+ }
474
+
475
+ level--;
476
+
477
+ //build intermediate nodes
478
+ for (; level >= 0; level--) {
479
+ level_node_count = Math.pow(2, level);
480
+ parentIndex = (level_node_count - 1);
481
+
482
+ for (i = 0; i < level_node_count; i++) {
483
+
484
+ const childIndex0 = (parentIndex << 1) + 1;
485
+ const childIndex1 = childIndex0 + 1;
486
+
487
+ const address_parent = parentIndex * BVH_BINARY_NODE_SIZE;
488
+
489
+ const address_child_0 = childIndex0 * BVH_BINARY_NODE_SIZE;
490
+ const address_child_1 = childIndex1 * BVH_BINARY_NODE_SIZE;
491
+
492
+ refit_binary(this.__data_view, address_parent, address_child_0, address_child_1);
493
+
494
+ parentIndex++;
495
+ }
496
+ }
497
+ }
498
+ }
@@ -0,0 +1,54 @@
1
+ import { BinaryUint32BVH } from "./BinaryUint32BVH.js";
2
+
3
+ test('constructor does not throw', () => {
4
+ new BinaryUint32BVH();
5
+ });
6
+
7
+ test('1 leaf build does not throw', () => {
8
+ const bvh = new BinaryUint32BVH();
9
+
10
+ bvh.setLeafCount(1);
11
+ bvh.initialize_structure();
12
+ bvh.build();
13
+ });
14
+
15
+ test('read/write 1 leaf', () => {
16
+ const bvh = new BinaryUint32BVH();
17
+
18
+ bvh.setLeafCount(1);
19
+ bvh.initialize_structure();
20
+
21
+ bvh.setLeafData(0, 7, -3, -7, -11, 13, 17, 23);
22
+
23
+ expect(bvh.readLeafPayload(0)).toBe(7);
24
+
25
+ const bounds = [];
26
+ bvh.readBounds(0, bounds, 0);
27
+
28
+ expect(bounds[0]).toBeCloseTo(-3);
29
+ expect(bounds[1]).toBeCloseTo(-7);
30
+ expect(bounds[2]).toBeCloseTo(-11);
31
+ expect(bounds[3]).toBeCloseTo(13);
32
+ expect(bounds[4]).toBeCloseTo(17);
33
+ expect(bounds[5]).toBeCloseTo(23);
34
+ });
35
+
36
+ test('4 node sorted build', () => {
37
+ const bvh = new BinaryUint32BVH();
38
+
39
+ bvh.setLeafCount(4);
40
+ bvh.initialize_structure();
41
+
42
+ bvh.setLeafData(0, 3, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6);
43
+ bvh.setLeafData(1, 7, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6);
44
+ bvh.setLeafData(2, 11, 2.1, 2.2, 2.3, 2.4, 2.5, 2.6);
45
+ bvh.setLeafData(3, 13, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6);
46
+
47
+ bvh.sort_morton([
48
+ 1, 0, 0, 0,
49
+ 0, 1, 0, 0,
50
+ 0, 0, 1, 0,
51
+ 0, 0, 0, 1
52
+ ]);
53
+ bvh.build();
54
+ });