@woosh/meep-engine 2.33.20 → 2.33.24

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 (285) hide show
  1. package/core/assert.js +3 -1
  2. package/core/bvh2/BinaryNode.js +1 -1
  3. package/core/bvh2/aabb3/AABB3.js +18 -0
  4. package/core/bvh2/aabb3/AABB3Math.js +1 -1
  5. package/core/bvh2/binary/2/BinaryUint32BVH.js +498 -0
  6. package/core/bvh2/binary/2/BinaryUint32BVH.spec.js +54 -0
  7. package/core/bvh2/binary/IndexedBinaryBVH.js +22 -26
  8. package/core/bvh2/traversal/__detailed_box_volume_intersection.js +11 -8
  9. package/core/collection/ArrayUtils.js +1 -1
  10. package/core/collection/HashMap.js +66 -22
  11. package/core/collection/array/arrayQuickSort.js +9 -6
  12. package/core/collection/array/array_swap.js +22 -0
  13. package/core/collection/array/computeHashArray.js +22 -0
  14. package/core/collection/array/computeHashIntegerArray.js +15 -0
  15. package/core/collection/table/DataType2TypedArrayConstructorMapping.js +15 -0
  16. package/core/color/Color.js +2 -1
  17. package/core/function/FunctionCompiler.js +2 -1
  18. package/core/geom/3d/CircleMath.js +4 -4
  19. package/core/geom/3d/aabb/aabb3_computeDistanceAbovePlane.js +9 -33
  20. package/core/geom/3d/cone/computeConeBoundingBox.js +4 -4
  21. package/core/geom/3d/{compute_bounding_cone_of_2_cones.js → cone/compute_bounding_cone_of_2_cones.js} +3 -3
  22. package/core/geom/3d/{compute_bounding_cone_of_2_cones.spec.js → cone/compute_bounding_cone_of_2_cones.spec.js} +1 -1
  23. package/core/geom/3d/frustum/array_setFromProjectionMatrix.js +1 -1
  24. package/core/geom/3d/frustum/frustum3_computeNearestPointToPoint.js +11 -3
  25. package/core/geom/3d/line/line3_computeSegmentPointDistance_sqr.js +41 -0
  26. package/core/geom/3d/morton/mortonEncode_magicbits.js +2 -1
  27. package/core/geom/3d/morton/reinterpret_float32_as_int32.js +13 -0
  28. package/core/geom/3d/morton/v3_morton_encode_transformed.js +33 -0
  29. package/core/geom/3d/{encode_unit3_hemioct.js → normal/hemioct/encode_unit3_hemioct.js} +0 -0
  30. package/core/geom/3d/{unit_hemioct.spec.js → normal/hemioct/unit_hemioct.spec.js} +1 -1
  31. package/core/geom/3d/normal/lamber_azimuth/transform.js +61 -0
  32. package/core/geom/3d/normal/spherical/sphere_map_transform.js +77 -0
  33. package/core/geom/3d/{lerp_planes_to_array.js → plane/lerp_planes_to_array.js} +1 -3
  34. package/core/geom/3d/plane/plane3_lerp.js +3 -1
  35. package/core/geom/3d/plane/plane3_slerp.js +4 -1
  36. package/core/geom/3d/{plane_computeConvex3PlaneIntersection.js → plane/plane_computeConvex3PlaneIntersection.js} +14 -16
  37. package/core/geom/3d/ray/ray_computeNearestPointToPoint.js +37 -0
  38. package/core/geom/3d/shape/AbstractShape3D.js +29 -0
  39. package/core/geom/3d/shape/CompositeShape.js +60 -0
  40. package/core/geom/3d/shape/TransformedShape3D.js +70 -0
  41. package/core/geom/3d/shape/UnitCubeShape3D.js +13 -0
  42. package/core/geom/3d/shape/UnitSphereShape3D.js +16 -0
  43. package/core/geom/3d/topology/TopoTriangle.js +1 -1
  44. package/core/geom/3d/topology/TopoVertex.js +1 -1
  45. package/core/geom/3d/topology/bounds/computeTraingleClusterNormalBoundingCone.js +2 -2
  46. package/core/geom/3d/topology/simplify/compute_face_normal_change_dot_product.js +1 -1
  47. package/core/geom/3d/topology/simplify/quadratic/Quadratic3.js +1 -1
  48. package/core/geom/3d/triangle/computeTrianglePlaneSide.js +1 -1
  49. package/core/geom/3d/triangle/computeTriangleRayIntersection.js +1 -1
  50. package/core/geom/3d/voxel/DenseBitVolume3D.js +87 -0
  51. package/core/geom/3d/voxel/buildVolumeFromProjectedGeometry.js +23 -0
  52. package/core/geom/AABB2.js +1 -1
  53. package/core/geom/ConicRay.js +3 -1
  54. package/core/geom/LineSegment.js +1 -77
  55. package/core/geom/Matrix4.js +8 -8
  56. package/core/geom/Plane.js +15 -10
  57. package/core/geom/Quaternion.js +2 -1
  58. package/core/geom/Rectangle.js +2 -1
  59. package/core/geom/Vector1.js +1 -1
  60. package/core/geom/Vector3.d.ts +2 -0
  61. package/core/geom/Vector3.js +35 -159
  62. package/core/geom/Vector3.spec.js +2 -1
  63. package/core/geom/Vector4.js +2 -1
  64. package/core/geom/random/randomPointInBox.js +7 -3
  65. package/core/geom/random/randomPointInPoint.js +6 -3
  66. package/core/geom/random/randomPointInSphere.js +6 -3
  67. package/core/geom/random/randomPointOnBox.js +7 -3
  68. package/core/geom/random/randomPointOnSphere.js +6 -3
  69. package/core/geom/v3_angle_between.js +31 -0
  70. package/core/geom/v3_distance.js +16 -0
  71. package/core/geom/v3_distance_sqr.js +17 -0
  72. package/core/geom/v3_dot.js +13 -0
  73. package/core/geom/v3_length.js +10 -0
  74. package/core/geom/v3_length_sqr.js +10 -0
  75. package/core/geom/v3_lerp.js +21 -0
  76. package/core/geom/v3_slerp.js +48 -0
  77. package/core/graph/graph_k_means_cluster.js +1 -1
  78. package/core/math/MathUtils.js +0 -354
  79. package/core/math/MathUtils.spec.js +7 -1
  80. package/core/math/gaussian.js +9 -0
  81. package/core/math/hash/computeHashFloat.js +17 -0
  82. package/core/math/hash/computeHashFloatArray.js +34 -0
  83. package/core/math/hash/computeObjectHash.js +54 -0
  84. package/core/math/intersects1D.js +19 -0
  85. package/core/math/interval/NumericInterval.js +2 -2
  86. package/core/math/isValueBetween.js +10 -0
  87. package/core/math/isValueBetweenInclusive.js +10 -0
  88. package/core/math/noise/curl_noise_3dt.js +1 -1
  89. package/core/math/noise/sdnoise.js +10 -10
  90. package/core/math/overlap1D.js +19 -0
  91. package/core/math/pingpong.js +17 -0
  92. package/core/math/random/makeRangedRandom.js +19 -0
  93. package/core/math/random/randomFloatBetween.js +14 -0
  94. package/core/math/random/randomFromArray.js +19 -0
  95. package/core/math/random/randomGaussian.js +15 -0
  96. package/core/math/random/randomIntegerBetween.js +14 -0
  97. package/core/math/random/roundFair.js +15 -0
  98. package/core/math/separation1D.js +21 -0
  99. package/core/math/solveQuadratic.js +25 -0
  100. package/core/model/BoundedValue.js +1 -1
  101. package/core/model/node-graph/node/NodeInstancePortReference.js +1 -1
  102. package/core/model/node-graph/node/Port.js +1 -1
  103. package/core/model/reactive/evaluation/MultiPredicateEvaluator.spec.js +3 -1
  104. package/core/model/reactive/model/ReactiveBinaryExpression.js +1 -1
  105. package/core/model/reactive/model/terminal/ReactiveLiteralNumber.js +1 -1
  106. package/core/model/reactive/model/terminal/ReactiveReference.js +1 -1
  107. package/core/model/reactive/model/util/createRandomReactiveExpression.js +1 -1
  108. package/core/model/stat/LinearModifier.js +1 -1
  109. package/core/primitives/array/computeIntegerArrayHash.js +6 -1
  110. package/engine/animation/curve/AnimationCurve.js +72 -0
  111. package/engine/animation/curve/Keyframe.js +27 -0
  112. package/engine/animation/keyed2/AnimationTrack.js +27 -3
  113. package/engine/asset/Asset.js +1 -1
  114. package/engine/asset/loaders/GLTFAssetLoader.d.ts +1 -1
  115. package/engine/asset/loaders/GLTFAssetLoader.js +10 -0
  116. package/engine/asset/loaders/image/ImageRGBADataAsset.js +8 -1
  117. package/engine/asset/loaders/material/computeImageBitmapEquality.js +11 -0
  118. package/engine/asset/loaders/material/computeImageBitmapHash.js +22 -28
  119. package/engine/asset/loaders/material/computeMaterialHash.js +4 -3
  120. package/engine/asset/loaders/material/computeTextureEquality.js +13 -5
  121. package/engine/asset/loaders/material/computeTextureHash.js +2 -1
  122. package/engine/ecs/animation/Animation.js +2 -1
  123. package/engine/ecs/animation/InverseKinematics.js +2 -1
  124. package/engine/ecs/animation/OneBoneSurfaceAlignmentSolver.js +3 -1
  125. package/engine/ecs/animation/TwoBoneInverseKinematicsSolver.js +3 -1
  126. package/engine/ecs/dynamic_actions/DynamicActorSystem.js +2 -1
  127. package/engine/ecs/dynamic_actions/DynamicRuleDescriptionTable.spec.js +3 -5
  128. package/engine/ecs/dynamic_actions/actions/definition/WeightedRandomActionDescription.js +1 -1
  129. package/engine/ecs/evaluation/complex/PointFitnessGaussianBlur.js +1 -1
  130. package/engine/ecs/foliage/ecs/Foliage2.js +1 -1
  131. package/engine/ecs/fow/FogOfWar.js +2 -3
  132. package/engine/ecs/fow/shader/FogOfWarRenderer.js +1 -1
  133. package/engine/ecs/gui/GUIElement.js +1 -1
  134. package/engine/ecs/gui/hud/HeadsUpDisplay.js +1 -1
  135. package/engine/ecs/gui/hud/HeadsUpDisplaySystem.js +1 -1
  136. package/engine/ecs/gui/position/ViewportPosition.js +2 -1
  137. package/engine/ecs/systems/RangedAttackSystem.js +1 -1
  138. package/engine/ecs/systems/SteeringSystem.js +3 -2
  139. package/engine/ecs/terrain/ecs/Terrain.js +6 -0
  140. package/engine/ecs/terrain/ecs/layers/TerrainLayers.js +5 -0
  141. package/engine/ecs/terrain/ecs/splat/SplatMapping.js +5 -0
  142. package/engine/ecs/terrain/tiles/TerrainTileManager.js +1 -1
  143. package/engine/ecs/tooltip/TooltipComponent.js +15 -0
  144. package/engine/ecs/util/hideEntityGracefully.js +18 -0
  145. package/engine/graphics/GraphicsEngine.js +1 -0
  146. package/engine/graphics/camera/testClippingPlaneComputation.js +2 -2
  147. package/engine/graphics/ecs/animation/animator/AnimationClip.js +2 -1
  148. package/engine/graphics/ecs/animation/animator/AnimationClipDefinition.js +2 -1
  149. package/engine/graphics/ecs/animation/animator/AnimationNotification.js +2 -1
  150. package/engine/graphics/ecs/animation/animator/AnimationNotificationDefinition.js +2 -1
  151. package/engine/graphics/ecs/animation/animator/graph/AnimationGraph.js +2 -1
  152. package/engine/graphics/ecs/animation/animator/graph/definition/AnimationGraphDefinition.js +2 -1
  153. package/engine/graphics/ecs/animation/animator/graph/definition/AnimationStateDefinition.js +1 -1
  154. package/engine/graphics/ecs/animation/animator/graph/definition/AnimationTransitionDefinition.js +2 -1
  155. package/engine/graphics/ecs/camera/CameraClippingPlaneComputer.js +2 -2
  156. package/engine/graphics/ecs/highlight/HighlightDefinition.js +2 -1
  157. package/engine/graphics/ecs/highlight/renderer/OutlineRenderer.js +0 -53
  158. package/engine/graphics/ecs/light/Light.d.ts +1 -1
  159. package/engine/graphics/ecs/light/Light.js +3 -0
  160. package/engine/graphics/ecs/mesh/Mesh.js +2 -1
  161. package/engine/graphics/ecs/mesh-v2/ShadedGeometry.d.ts +13 -0
  162. package/engine/graphics/ecs/mesh-v2/ShadedGeometrySystem.d.ts +6 -0
  163. package/engine/graphics/ecs/path/testPathDisplaySystem.js +98 -98
  164. package/engine/graphics/ecs/trail2d/Trail2D.js +17 -4
  165. package/engine/graphics/ecs/trail2d/Trail2DSystem.d.ts +2 -3
  166. package/engine/graphics/ecs/trail2d/Trail2DSystem.js +34 -118
  167. package/engine/graphics/geometry/AttributeSpec.js +105 -0
  168. package/engine/graphics/{micron/format/MicronVertexDataSpec.js → geometry/VertexDataSpec.js} +56 -25
  169. package/engine/graphics/geometry/bvh/buffered/BVHGeometryRaycaster.js +2 -1
  170. package/engine/graphics/micron/build/buildMicronGeometryFromBufferGeometry.js +7 -7
  171. package/engine/graphics/micron/build/clustering/computeFaceCurvatureScore.js +1 -1
  172. package/engine/graphics/micron/build/clustering/compute_face_connection_weight.js +1 -1
  173. package/engine/graphics/micron/build/fill_patch_geometry_data.js +1 -1
  174. package/engine/graphics/micron/build/hierarchy/computePatchMergeScore.js +1 -1
  175. package/engine/graphics/micron/build/hierarchy/patch_combine.js +1 -1
  176. package/engine/graphics/micron/buildPatchwork.js +1 -1
  177. package/engine/graphics/micron/format/MicronGeometry.js +3 -3
  178. package/engine/graphics/micron/format/serialization/MicronGeometryBinarySerializationAdapter.js +2 -2
  179. package/engine/graphics/micron/format/serialization/deserialize_attribute_spec.js +1 -1
  180. package/engine/graphics/micron/format/serialization/serialize_attribute_spec.js +1 -1
  181. package/engine/graphics/micron/render/PatchCacheKey.js +1 -1
  182. package/engine/graphics/micron/render/instanced/AttributeDataTexture.js +5 -5
  183. package/engine/graphics/micron/render/refinement/is_patch_facing_back.js +2 -2
  184. package/engine/graphics/micron/render/v1/ThreeVirtualGeometryAdapter.js +1 -1
  185. package/engine/graphics/particles/particular/engine/ParticularEngine.js +4 -2
  186. package/engine/graphics/particles/particular/engine/emitter/PARTICULAR_PARTICLE_SPECIFICATION.js +84 -0
  187. package/engine/graphics/particles/particular/engine/emitter/ParticleEmitter.js +92 -144
  188. package/engine/graphics/particles/particular/engine/emitter/ParticleLayer.js +14 -3
  189. package/engine/graphics/particles/particular/engine/emitter/ParticlePool.js +51 -12
  190. package/engine/graphics/particles/particular/engine/emitter/ParticlePool.spec.js +3 -2
  191. package/engine/graphics/particles/particular/engine/emitter/computeEmissionFunction.js +37 -0
  192. package/engine/graphics/particles/particular/engine/emitter/distance_to_camera.js +25 -0
  193. package/engine/graphics/particles/particular/engine/emitter/serde/ParameterLookupTableSerializationAdapter.js +8 -2
  194. package/engine/graphics/particles/particular/engine/parameter/ParameterLookupTable.js +2 -1
  195. package/engine/graphics/particles/particular/engine/parameter/ParameterTrack.js +1 -1
  196. package/engine/graphics/particles/particular/engine/parameter/ParticleParameter.js +1 -1
  197. package/engine/graphics/particles/particular/engine/renderers/billboard/BILLBOARD_PARTICLE_SPECIFICATION.js +21 -0
  198. package/engine/graphics/particles/particular/engine/renderers/billboard/ParticleBillboardMaterial.js +0 -20
  199. package/engine/graphics/particles/particular/engine/renderers/billboard/prototypeBillboardRenderer.js +9 -9
  200. package/engine/graphics/particles/particular/engine/shader/ShaderManager.js +7 -25
  201. package/engine/graphics/particles/particular/engine/simulator/SimulationStepApplyForce.js +2 -5
  202. package/engine/graphics/particles/particular/engine/simulator/SimulationStepCurlNoiseAcceleration.js +2 -6
  203. package/engine/graphics/particles/particular/engine/simulator/SimulationStepCurlNoiseVelocity.js +2 -7
  204. package/engine/graphics/particles/particular/engine/simulator/SimulationStepFixedPhysics.js +2 -5
  205. package/engine/graphics/particles/particular/engine/simulator/update_parameters.js +1 -1
  206. package/engine/graphics/particles/particular/engine/utils/distributeParticlesOnObject3D.js +1 -1
  207. package/engine/graphics/particles/particular/engine/utils/distrubuteParticlesOnMesh.js +1 -1
  208. package/engine/graphics/particles/particular/engine/utils/volume/ParticleVolume.js +384 -0
  209. package/engine/graphics/particles/particular/engine/utils/volume/prototypeParticleVolume.js +558 -0
  210. package/engine/graphics/particles/particular/group/Operation.js +18 -0
  211. package/engine/graphics/particles/particular/group/OperationType.js +9 -0
  212. package/engine/graphics/particles/particular/group/ParticleAttribute.js +2 -1
  213. package/engine/graphics/particles/particular/group/ParticleAttributeType.js +11 -0
  214. package/engine/graphics/particles/particular/group/ParticleDataType.js +10 -0
  215. package/engine/graphics/particles/particular/group/ParticleGroup.js +7 -245
  216. package/engine/graphics/particles/particular/group/ParticleGroup.spec.js +3 -1
  217. package/engine/graphics/particles/particular/group/ParticleSpecification.js +21 -14
  218. package/engine/graphics/particles/particular/group/itemSizeFromAttributeType.js +20 -0
  219. package/engine/graphics/particles/particular/group/optimizeCommandQueue.js +162 -0
  220. package/engine/graphics/particles/particular/group/typedArrayConstructorFromDataType.js +19 -0
  221. package/engine/graphics/render/buffer/buffers/prototypeNormalFrameBuffer.js +2 -2
  222. package/engine/graphics/render/buffer/simple-fx/ao/AmbientOcclusionPostProcessEffect.js +1 -1
  223. package/engine/graphics/render/buffer/slot/parameter/ProgramValueSlotParameter.js +2 -1
  224. package/engine/graphics/render/buffer/slot/parameter/ProgramValueSlotParameterSet.js +1 -1
  225. package/engine/graphics/render/forward_plus/LightManager.js +126 -95
  226. package/engine/graphics/render/forward_plus/PointLight.js +9 -0
  227. package/engine/graphics/render/forward_plus/PointLightData.js +1 -1
  228. package/engine/graphics/render/forward_plus/SpotLight.js +9 -0
  229. package/engine/graphics/render/forward_plus/cluster/compute_light_data_hash_0.js +2 -2
  230. package/engine/graphics/render/forward_plus/computeFrustumCorners.js +15 -33
  231. package/engine/graphics/render/forward_plus/plugin/ForwardPlusRenderingPlugin.js +1 -1
  232. package/engine/graphics/render/forward_plus/plugin/MaterialTransformer.js +12 -2
  233. package/engine/graphics/render/forward_plus/plugin/ptototypeFPPlugin.js +6 -6
  234. package/engine/graphics/render/forward_plus/prototypeLightManager.js +231 -136
  235. package/engine/graphics/render/forward_plus/query/analytical_triplanar_corner_mapping.js +8 -0
  236. package/engine/graphics/render/forward_plus/query/cube_mapping.js +38 -0
  237. package/engine/graphics/render/forward_plus/query/detailed_sphere_frustum_intersection_test.js +86 -0
  238. package/engine/graphics/render/forward_plus/query/point_light_inside_volume.js +73 -0
  239. package/engine/graphics/render/forward_plus/query/query_bvh_frustum_from_objects.js +131 -0
  240. package/engine/graphics/render/forward_plus/query/query_bvh_frustum_from_texture.js +129 -0
  241. package/engine/graphics/render/forward_plus/query/spot_light_inside_volume.js +33 -0
  242. package/engine/graphics/render/forward_plus/read_frustum_corner.js +14 -0
  243. package/engine/graphics/render/forward_plus/testClusterEquality.js +22 -0
  244. package/engine/graphics/render/layers/RenderLayerUtils.js +8 -5
  245. package/engine/graphics/render/visibility/IncrementalDeltaSet.js +11 -0
  246. package/engine/graphics/render/visibility/hiz/prototypeHiZ.js +2 -2
  247. package/engine/graphics/texture/atlas/AtlasPatch.js +7 -2
  248. package/engine/graphics/texture/atlas/TextureAtlas.js +18 -14
  249. package/engine/graphics/texture/sampler/HarmonicDiffusionGrid.spec.js +1 -1
  250. package/engine/graphics/texture/sampler/SampleTraverser.js +1 -1
  251. package/engine/graphics/texture/sampler/Sampler2D.js +8 -7
  252. package/engine/graphics/texture/sampler/distanceField.spec.js +1 -1
  253. package/engine/graphics/texture/sampler/scaleSampler2D.js +7 -10
  254. package/engine/graphics/trail/x/RibbonMaterialX.js +3 -3
  255. package/engine/graphics/trail/x/RibbonX.js +17 -2
  256. package/engine/graphics/trail/x/RibbonXPlugin.js +51 -1
  257. package/engine/graphics/util/projectSphere.js +1 -1
  258. package/engine/grid/components/GridObstacle.js +3 -10
  259. package/engine/intelligence/behavior/selector/WeightedElement.js +2 -1
  260. package/engine/intelligence/optimization/RandomOptimizer.js +1 -1
  261. package/engine/navigation/ecs/components/Path.js +3 -2
  262. package/engine/navigation/grid/FastBinaryHeap.spec.js +1 -1
  263. package/engine/reference/v2/Reference.js +6 -0
  264. package/engine/sound/ecs/emitter/SoundEmitter.js +2 -1
  265. package/engine/sound/ecs/emitter/SoundTrack.js +2 -1
  266. package/engine/sound/material/concrete/RandomSoundMaterial.js +1 -1
  267. package/engine/ui/notification/notificationGenerator.js +1 -1
  268. package/generation/filtering/numeric/complex/CellFilterAngleToNormal.js +3 -2
  269. package/generation/filtering/numeric/complex/CellFilterGaussianBlur.js +1 -1
  270. package/generation/grid/generation/GridTaskExecuteRuleTimes.js +2 -1
  271. package/generation/markers/GridCellActionPlaceMarker.js +13 -1
  272. package/generation/markers/MarkerNode.js +6 -0
  273. package/generation/markers/actions/MarkerNodeActionSelectRandom.js +1 -1
  274. package/generation/markers/transform/MarkerNodeTransformerRecordUniqueRandomEnum.js +1 -1
  275. package/generation/placement/action/random/CellActionSelectRandom.js +1 -1
  276. package/generation/theme/ThemeEngine.js +5 -2
  277. package/misc/makeMaterialIconCached.js +2 -2
  278. package/package.json +3 -3
  279. package/view/View.js +4 -2
  280. package/view/elements/image/HTMLElementCacheKey.js +2 -1
  281. package/view/elements/radial/RadialText.js +2 -1
  282. package/view/minimap/gl/MinimapMarkersGL.js +19 -101
  283. package/view/minimap/gl/buildMaterial.js +94 -0
  284. package/engine/graphics/micron/format/MicronGeometryBufferAttributeSpec.js +0 -71
  285. package/engine/graphics/render/forward_plus/queryBVH_Frustum.js +0 -345
@@ -4,9 +4,10 @@ import { PI2 } from "../../math/MathUtils.js";
4
4
  *
5
5
  * @see based on python code suggested here: https://stackoverflow.com/questions/5408276/sampling-uniformly-distributed-random-points-inside-a-spherical-volume
6
6
  * @param {function} random
7
- * @param {Vector3} result
7
+ * @param {number[]} result
8
+ * @param {number} result_offset
8
9
  */
9
- export function randomPointInSphere(random, result) {
10
+ export function randomPointInSphere(random, result, result_offset) {
10
11
  const phi = PI2 * random();
11
12
 
12
13
  const cosTheta = random() * 2 - 1;
@@ -27,5 +28,7 @@ export function randomPointInSphere(random, result) {
27
28
  const z = r * cosTheta;
28
29
 
29
30
  //write the result
30
- result.set(x, y, z);
31
+ result[result_offset] = x;
32
+ result[result_offset + 1] = y;
33
+ result[result_offset + 2] = z;
31
34
  }
@@ -1,9 +1,10 @@
1
1
  /**
2
2
  *
3
3
  * @param {function} random
4
- * @param {Vector3} result
4
+ * @param {number[]} result
5
+ * @param {number} result_offset
5
6
  */
6
- export function randomPointOnBox(random, result) {
7
+ export function randomPointOnBox(random, result, result_offset) {
7
8
  //pick a side
8
9
  const side = random();
9
10
 
@@ -29,5 +30,8 @@ export function randomPointOnBox(random, result) {
29
30
  z = fixedAxis;
30
31
  }
31
32
 
32
- result.set(x, y, z);
33
+ //write the result
34
+ result[result_offset] = x;
35
+ result[result_offset + 1] = y;
36
+ result[result_offset + 2] = z;
33
37
  }
@@ -2,9 +2,10 @@
2
2
  *
3
3
  * @see based on python code suggested here: https://stackoverflow.com/questions/5408276/sampling-uniformly-distributed-random-points-inside-a-spherical-volume
4
4
  * @param {function} random
5
- * @param {Vector3} result
5
+ * @param {number[]} result
6
+ * @param {number} result_offset
6
7
  */
7
- export function randomPointOnSphere(random, result) {
8
+ export function randomPointOnSphere(random, result, result_offset) {
8
9
  const phi = Math.PI * 2 * random();
9
10
 
10
11
  const cosTheta = random() * 2 - 1;
@@ -23,5 +24,7 @@ export function randomPointOnSphere(random, result) {
23
24
  const z = r * cosTheta;
24
25
 
25
26
  //write the result
26
- result.set(x, y, z);
27
+ result[result_offset] = x;
28
+ result[result_offset + 1] = y;
29
+ result[result_offset + 2] = z;
27
30
  }
@@ -0,0 +1,31 @@
1
+ import { v3_dot } from "./v3_dot.js";
2
+ import { v3_length } from "./v3_length.js";
3
+ import { clamp } from "../math/clamp.js";
4
+
5
+ /**
6
+ *
7
+ * @param {number} x0
8
+ * @param {number} y0
9
+ * @param {number} z0
10
+ * @param {number} x1
11
+ * @param {number} y1
12
+ * @param {number} z1
13
+ * @returns {number}
14
+ */
15
+ export function v3_angle_between(x0, y0, z0, x1, y1, z1) {
16
+ const d = v3_dot(x0, y0, z0, x1, y1, z1);
17
+
18
+ const magnitude_0 = v3_length(x0, y0, z0);
19
+ const magnitude_1 = v3_length(x1, y1, z1);
20
+
21
+ const l = magnitude_0 * magnitude_1;
22
+
23
+ if (l === 0) {
24
+ // collective magnitude is 0, provide arbitrary angle
25
+ return 0;
26
+ }
27
+
28
+ const theta = clamp(d / l, -1, 1);
29
+
30
+ return Math.acos(theta);
31
+ }
@@ -0,0 +1,16 @@
1
+ import { v3_distance_sqr } from "./v3_distance_sqr.js";
2
+
3
+ /**
4
+ *
5
+ * @param {number} x0
6
+ * @param {number} y0
7
+ * @param {number} z0
8
+ * @param {number} x1
9
+ * @param {number} y1
10
+ * @param {number} z1
11
+ * @returns {number}
12
+ */
13
+ export function v3_distance(x0, y0, z0, x1, y1, z1) {
14
+
15
+ return Math.sqrt(v3_distance_sqr(x0, y0, z0, x1, y1, z1));
16
+ }
@@ -0,0 +1,17 @@
1
+ /**
2
+ *
3
+ * @param {number} x0
4
+ * @param {number} y0
5
+ * @param {number} z0
6
+ * @param {number} x1
7
+ * @param {number} y1
8
+ * @param {number} z1
9
+ * @returns {number}
10
+ */
11
+ export function v3_distance_sqr(x0, y0, z0, x1, y1, z1) {
12
+ const x = x0 - x1;
13
+ const y = y0 - y1;
14
+ const z = z0 - z1;
15
+
16
+ return x * x + y * y + z * z;
17
+ }
@@ -0,0 +1,13 @@
1
+ /**
2
+ *
3
+ * @param {number} x0
4
+ * @param {number} y0
5
+ * @param {number} z0
6
+ * @param {number} x1
7
+ * @param {number} y1
8
+ * @param {number} z1
9
+ * @returns {number}
10
+ */
11
+ export function v3_dot(x0, y0, z0, x1, y1, z1) {
12
+ return (x0 * x1 + y0 * y1 + z0 * z1);
13
+ }
@@ -0,0 +1,10 @@
1
+ /**
2
+ *
3
+ * @param {number} x
4
+ * @param {number} y
5
+ * @param {number} z
6
+ * @returns {number}
7
+ */
8
+ export function v3_length(x, y, z) {
9
+ return Math.hypot(x, y, z);
10
+ }
@@ -0,0 +1,10 @@
1
+ /**
2
+ *
3
+ * @param {number} x
4
+ * @param {number} y
5
+ * @param {number} z
6
+ * @return {number}
7
+ */
8
+ export function v3_length_sqr(x, y, z) {
9
+ return x * x + y * y + z * z;
10
+ }
@@ -0,0 +1,21 @@
1
+ import { lerp } from "../math/lerp.js";
2
+
3
+ /**
4
+ *
5
+ * @param {Vector3} result
6
+ * @param {number} a_x
7
+ * @param {number} a_y
8
+ * @param {number} a_z
9
+ * @param {number} b_x
10
+ * @param {number} b_y
11
+ * @param {number} b_z
12
+ * @param {number} fraction
13
+ */
14
+ export function v3_lerp(result, a_x, a_y, a_z, b_x, b_y, b_z, fraction) {
15
+
16
+ const x = lerp(a_x, b_x, fraction);
17
+ const y = lerp(a_y, b_y, fraction);
18
+ const z = lerp(a_z, b_z, fraction);
19
+
20
+ result.set(x, y, z);
21
+ }
@@ -0,0 +1,48 @@
1
+ import { v3_dot } from "./v3_dot.js";
2
+ import { v3_lerp } from "./v3_lerp.js";
3
+
4
+ /**
5
+ * Spherical linear interpolation
6
+ * @see https://en.wikipedia.org/wiki/Slerp
7
+ * @param {Vector3} result
8
+ * @param {number} a_x
9
+ * @param {number} a_y
10
+ * @param {number} a_z
11
+ * @param {number} b_x
12
+ * @param {number} b_y
13
+ * @param {number} b_z
14
+ * @param {number} fraction
15
+ */
16
+ export function v3_slerp(
17
+ result,
18
+ a_x, a_y, a_z,
19
+ b_x, b_y, b_z,
20
+ fraction
21
+ ) {
22
+ const dot = v3_dot(
23
+ a_x, a_y, a_z,
24
+ b_x, b_y, b_z
25
+ );
26
+
27
+ if (dot >= 1 || dot <= -1) {
28
+ // avoid division by 0, both vectors are pointing in the same direction, use lerp instead
29
+ v3_lerp(result, a_x, a_y, a_z, b_x, b_y, b_z, fraction);
30
+ return;
31
+ }
32
+
33
+ // compute angle between two vectors
34
+ const theta = Math.acos(dot);
35
+
36
+ const sin_theta = Math.sin(theta);
37
+
38
+ const inv_sin_theta = 1 / sin_theta;
39
+
40
+ const scale_0 = Math.sin((1 - fraction) * theta) * inv_sin_theta;
41
+ const scale_1 = Math.sin((fraction) * theta) * inv_sin_theta;
42
+
43
+ const x = a_x * scale_0 + b_x * scale_1;
44
+ const y = a_y * scale_0 + b_y * scale_1;
45
+ const z = a_z * scale_0 + b_z * scale_1;
46
+
47
+ result.set(x, y, z);
48
+ }
@@ -1,10 +1,10 @@
1
1
  //
2
2
  import { seededRandom } from "../math/random/seededRandom.js";
3
- import { randomIntegerBetween } from "../math/MathUtils.js";
4
3
  import { SquareMatrix } from "./SquareMatrix.js";
5
4
  import { DataType } from "../collection/table/DataType.js";
6
5
  import { BitSet } from "../binary/BitSet.js";
7
6
  import FastBinaryHeap from "../../engine/navigation/grid/FastBinaryHeap.js";
7
+ import { randomIntegerBetween } from "../math/random/randomIntegerBetween.js";
8
8
 
9
9
  /**
10
10
  * @template N
@@ -4,8 +4,6 @@
4
4
  */
5
5
 
6
6
  import { assert } from "../assert.js";
7
- import { computeStringHash } from "../primitives/strings/computeStringHash.js";
8
- import { max2 } from "./max2.js";
9
7
  import { min2 } from "./min2.js";
10
8
 
11
9
  /**
@@ -29,105 +27,6 @@ export function makeSequenceLoop(sequence) {
29
27
  }
30
28
  }
31
29
 
32
- /**
33
- * Performs a probabilistic rounding where a fraction is rounded up or down with probability equal to the fraction
34
- * @param {number} number
35
- * @param {function} random
36
- * @returns {int}
37
- */
38
- export function roundFair(number, random) {
39
- const mantissa = number % 1;
40
- const roll = random();
41
- if (roll < mantissa) {
42
- return Math.ceil(number);
43
- } else {
44
- return Math.floor(number);
45
- }
46
- }
47
-
48
- /**
49
- * Returns a random number within a normal distribution (Bell/Gaussian curve)
50
- * @param {int} [quality=6] controls number of "die rolls" used to approximate curve, more rolls - better approximation but higher cost of computation
51
- * @param {function():number} random
52
- * @returns {number} value between 0 and 1 with normal weight at 0.5
53
- */
54
- export function randomGaussian(random, quality = 6) {
55
- let s = 0;
56
-
57
- for (let i = 0; i < quality; i++) {
58
- s += random();
59
- }
60
-
61
- return s / quality;
62
- }
63
-
64
- /**
65
- * @template T
66
- * @param {function} random
67
- * @param {T[]} array
68
- * @returns {T}
69
- */
70
- export function randomFromArray(random, array) {
71
- assert.isArray(array, 'array');
72
- assert.typeOf(random, 'function', 'random');
73
-
74
- const length = array.length;
75
-
76
- const i = min2(length - 1, Math.floor(random() * length));
77
-
78
- return array[i];
79
- }
80
-
81
- /**
82
- *
83
- * @param {function} random
84
- * @param {number} min
85
- * @param {number} max
86
- * @returns {number}
87
- */
88
- export function randomFloatBetween(random, min, max) {
89
- const span = max - min;
90
-
91
- const roll = random();
92
-
93
- return roll * span + min;
94
- }
95
-
96
- /**
97
- * Inclusive random between two boundaries, result is integer
98
- * @param {function} random
99
- * @param {number} min lower boundary, must be an integer
100
- * @param {number} max upper boundary, must be an integer
101
- * @returns {number}
102
- */
103
- export function randomIntegerBetween(random, min, max) {
104
- const span = max - min;
105
-
106
- const roll = random();
107
-
108
- return Math.round(roll * span) + min;
109
- }
110
-
111
- /**
112
- *
113
- * @param {function():number} random returns a number between 0 and 1
114
- * @param {number} min
115
- * @param {number} max
116
- * @returns {function():number} returns number between min and max
117
- */
118
- export function makeRangedRandom(random, min, max) {
119
-
120
- if (min === 0 && max === 1) {
121
- //input already returns values in correct range
122
- return random;
123
- }
124
-
125
- const scale = max - min;
126
- return function () {
127
- return random() * scale + min;
128
- };
129
- }
130
-
131
30
  /**
132
31
  * Compute lowest positive integer divisor of a given "product" value
133
32
  * @param {number} product
@@ -243,148 +142,6 @@ function bezierCurve(t, p0, p1, p2, p3) {
243
142
  }
244
143
 
245
144
 
246
- /**
247
- *
248
- * @param {number} v
249
- * @returns {number}
250
- */
251
- export function computeHashFloat(v) {
252
- //we break the number up into fractional and whole parts
253
- const fraction = v % 1;
254
-
255
- const whole = v | 0;
256
-
257
- //fractional part is scaled up into int32 range, this inexact method, as it will produce 0 hash for values below a certain threshold
258
- const fractionHash = fraction * 1367130550;
259
-
260
- //take XOR of both parts
261
- return fractionHash ^ whole;
262
- }
263
-
264
- /**
265
- *
266
- * @param {number[]|Float32Array|Float64Array} values
267
- * @param {number} min
268
- * @param {number} max
269
- */
270
- export function computeHashFloatArray(values, min, max) {
271
- const dataLength = values.length;
272
-
273
- const dataRange = max - min;
274
-
275
- /*
276
- hash min and max
277
- */
278
- const minHash = computeHashFloat(min);
279
- const maxHash = computeHashFloat(min);
280
-
281
- let hash = ((minHash << 5) - minHash) + maxHash;
282
-
283
- for (let i = 0; i < dataLength; i++) {
284
- const singleValue = values[i];
285
- //normalize value
286
- const valueNormalized = (singleValue - min) / dataRange;
287
- //scale value to integer range
288
- const integerValue = valueNormalized * 4294967295;
289
-
290
- hash = ((hash << 5) - hash) + integerValue;
291
- hash |= 0; // Convert to 32bit integer
292
- }
293
-
294
- return hash;
295
- }
296
-
297
- /**
298
- * @template T
299
- * @param {T[]} array
300
- * @param {function(T):number} elementHashFunction
301
- */
302
- export function computeHashArray(array, elementHashFunction) {
303
-
304
- const numArguments = array.length;
305
- let hash = numArguments;
306
-
307
- for (let i = 0; i < numArguments; i++) {
308
-
309
- const singleValue = array[i];
310
-
311
- const elementHash = elementHashFunction(singleValue);
312
-
313
- hash = ((hash << 5) - hash) + elementHash;
314
- hash |= 0; // Convert to 32bit integer
315
- }
316
-
317
- return hash;
318
- }
319
-
320
- /**
321
- * Computes hash on integer values
322
- * @param {...number} value
323
- * @returns {number}
324
- */
325
- export function computeHashIntegerArray(value) {
326
- let hash = 0;
327
- const numArguments = arguments.length;
328
- for (let i = 0; i < numArguments; i++) {
329
- const singleValue = arguments[i];
330
- hash = ((hash << 5) - hash) + singleValue;
331
- hash |= 0; // Convert to 32bit integer
332
- }
333
- return hash;
334
- }
335
-
336
- /**
337
- * Recursively computes object hash
338
- * @param {Object} value
339
- * @param {number} [depth=3] Maximum recursion depth
340
- * @returns {number}
341
- */
342
- export function computeObjectHash(value, depth = 3) {
343
- if (value === undefined) {
344
- return 1;
345
- }
346
-
347
- if (value === null) {
348
- return 2;
349
- }
350
-
351
- let hash = 0;
352
-
353
- for (let p in value) {
354
-
355
- hash = ((hash << 5) - hash) + computeStringHash(p);
356
-
357
- const pValue = value[p];
358
-
359
- const pType = typeof pValue;
360
-
361
- let pHash;
362
- if (pType === "string") {
363
- pHash = computeStringHash(pValue);
364
- } else if (pType === "number") {
365
- pHash = computeHashFloat(pValue);
366
- } else if (pType === "boolean") {
367
- pHash = pValue ? 1 : 0;
368
- } else if (pType === "object") {
369
-
370
- if (depth <= 0) {
371
- pHash = 3;
372
- } else {
373
- pHash = computeObjectHash(pValue, depth - 1);
374
- }
375
-
376
- } else {
377
- pHash = 0;
378
- }
379
-
380
- hash = ((hash << 5) - hash) + pHash;
381
-
382
- hash |= 0; // Convert to 32bit integer
383
- }
384
-
385
- return hash;
386
- }
387
-
388
145
  /**
389
146
  *
390
147
  * @param {number} a
@@ -410,54 +167,6 @@ export function computeGreatestCommonDivisor(a, b) {
410
167
  return result;
411
168
  }
412
169
 
413
- /**
414
- * Exclusive test, boundaries are not included in positive test
415
- * @param {Number} value
416
- * @param {Number} v0
417
- * @param {Number} v1
418
- * @returns {boolean}
419
- */
420
- export function isValueBetween(value, v0, v1) {
421
- return (v0 > value && value > v1) || (v1 > value && value > v0);
422
- }
423
-
424
- /**
425
- * Inclusive test, boundaries are included in positive test
426
- * @param {Number} value
427
- * @param {Number} v0
428
- * @param {Number} v1
429
- * @returns {boolean}
430
- */
431
- export function isValueBetweenInclusive(value, v0, v1) {
432
- return (v0 >= value && value >= v1) || (v1 >= value && value >= v0);
433
- }
434
-
435
-
436
- /**
437
- * Return solutions for quadratic
438
- * @param {number} a
439
- * @param {number} b
440
- * @param {number} c
441
- * @returns {number[]|null}
442
- */
443
- export function solveQuadratic(a, b, c) {
444
- let sol = null;
445
- if (Math.abs(a) < 1e-6) {
446
- if (Math.abs(b) < 1e-6) {
447
- sol = Math.abs(c) < 1e-6 ? [0, 0] : null;
448
- } else {
449
- sol = [-c / b, -c / b];
450
- }
451
- } else {
452
- let disc = b * b - 4 * a * c;
453
- if (disc >= 0) {
454
- disc = Math.sqrt(disc);
455
- a = 2 * a;
456
- sol = [(-b - disc) / a, (-b + disc) / a];
457
- }
458
- }
459
- return sol;
460
- }
461
170
 
462
171
  /**
463
172
  *
@@ -492,60 +201,6 @@ export function epsilonEquals(a, b, tolerance) {
492
201
  return Math.abs(a - b) <= tolerance;
493
202
  }
494
203
 
495
- /**
496
- * Returns true if two 1D lines intersect, touch is treated as intersection
497
- * Parameters are assumed to be ordered, a1 >= a0, b1 >= b0
498
- * @param {Number} a0
499
- * @param {Number} a1
500
- * @param {Number} b0
501
- * @param {Number} b1
502
- * @returns {boolean}
503
- */
504
- export function intersects1D(a0, a1, b0, b1) {
505
- assert.equal(typeof a0, "number");
506
- assert.equal(typeof a1, "number");
507
- assert.equal(typeof b0, "number");
508
- assert.equal(typeof b1, "number");
509
-
510
- return a1 >= b0 && b1 >= a0;
511
- }
512
-
513
- /**
514
- * Returns true if two 1D lines overlap, touch is not considered overlap
515
- * Parameters are assumed to be ordered, a1 > a0, b1 > b0
516
- * @param {Number} a0
517
- * @param {Number} a1
518
- * @param {Number} b0
519
- * @param {Number} b1
520
- * @returns {boolean}
521
- */
522
- export function overlap1D(a0, a1, b0, b1) {
523
- assert.equal(typeof a0, "number");
524
- assert.equal(typeof a1, "number");
525
- assert.equal(typeof b0, "number");
526
- assert.equal(typeof b1, "number");
527
-
528
- return a1 > b0 && b1 > a0;
529
- }
530
-
531
- /**
532
- * Returns a number representing overlap distance between two 1D line segments.
533
- * Positive number indicates overlap, negative number indicates that segments do not overlap; 0 indicates that segments are touching.
534
- * @param {Number} a0
535
- * @param {Number} a1
536
- * @param {Number} b0
537
- * @param {Number} b1
538
- * @returns {number}
539
- */
540
- export function separation1D(a0, a1, b0, b1) {
541
- assert.equal(typeof a0, "number");
542
- assert.equal(typeof a1, "number");
543
- assert.equal(typeof b0, "number");
544
- assert.equal(typeof b1, "number");
545
-
546
- return min2(a1, b1) - max2(a0, b0);
547
- }
548
-
549
204
  /**
550
205
  * Assuming the input is an N-dimension vector, normalizes the vector to magnitude of 1
551
206
  * @param {number[]|Float32Array} result
@@ -590,12 +245,3 @@ export const PI_HALF = Math.PI / 2;
590
245
  */
591
246
  export const EPSILON = 0.000001;
592
247
 
593
- /**
594
- *
595
- * @param {number} sigma
596
- * @param {number} v
597
- * @returns {number}
598
- */
599
- export function gaussian(sigma, v) {
600
- return Math.exp(-(v * v) / (2 * sigma * sigma));
601
- }
@@ -2,12 +2,18 @@ import { clamp } from "./clamp.js";
2
2
  import { copysign } from "./copysign.js";
3
3
  import { inverseLerp } from "./inverseLerp.js";
4
4
  import { lerp } from "./lerp.js";
5
- import { computeHashFloat, computeHashFloatArray, computeWholeDivisorLow, cubicCurve, isValueBetween, isValueBetweenInclusive, makeCubicCurve, overlap1D, quadraticCurve, solveQuadratic } from "./MathUtils.js";
5
+ import { computeWholeDivisorLow, cubicCurve, makeCubicCurve, quadraticCurve } from "./MathUtils.js";
6
6
  import { max2 } from "./max2.js";
7
7
  import { max3 } from "./max3.js";
8
8
  import { min2 } from "./min2.js";
9
9
  import { min3 } from "./min3.js";
10
10
  import { sign } from "./sign.js";
11
+ import { isValueBetween } from "./isValueBetween.js";
12
+ import { isValueBetweenInclusive } from "./isValueBetweenInclusive.js";
13
+ import { solveQuadratic } from "./solveQuadratic.js";
14
+ import { overlap1D } from "./overlap1D.js";
15
+ import { computeHashFloat } from "./hash/computeHashFloat.js";
16
+ import { computeHashFloatArray } from "./hash/computeHashFloatArray.js";
11
17
 
12
18
  test('min2', () => {
13
19
  expect(min2(0, 0)).toBe(0);
@@ -0,0 +1,9 @@
1
+ /**
2
+ *
3
+ * @param {number} sigma
4
+ * @param {number} v
5
+ * @returns {number}
6
+ */
7
+ export function gaussian(sigma, v) {
8
+ return Math.exp(-(v * v) / (2 * sigma * sigma));
9
+ }
@@ -0,0 +1,17 @@
1
+ /**
2
+ *
3
+ * @param {number} v
4
+ * @returns {number}
5
+ */
6
+ export function computeHashFloat(v) {
7
+ //we break the number up into fractional and whole parts
8
+ const fraction = v % 1;
9
+
10
+ const whole = v | 0;
11
+
12
+ //fractional part is scaled up into int32 range, this inexact method, as it will produce 0 hash for values below a certain threshold
13
+ const fractionHash = fraction * 1367130550;
14
+
15
+ //take XOR of both parts
16
+ return fractionHash ^ whole;
17
+ }