@woosh/meep-engine 2.56.1 → 2.58.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 (322) hide show
  1. package/editor/Editor.js +4 -4
  2. package/editor/ecs/component/editors/ColorEditor.js +1 -1
  3. package/editor/ecs/component/editors/ImagePathEditor.js +2 -2
  4. package/editor/ecs/component/editors/{LargeStrongEditor.js → LargeStringEditor.js} +1 -1
  5. package/editor/process/symbolic/buildThreeJSHelperEntity.js +3 -3
  6. package/editor/process/symbolic/makeGridPositionSymbolDisplay.js +3 -3
  7. package/editor/process/symbolic/makePositionedIconDisplaySymbol.js +3 -3
  8. package/editor/tools/GridPaintTool.js +3 -3
  9. package/editor/tools/TopDownCameraControlTool.js +1 -1
  10. package/editor/tools/TransformTool.js +1 -1
  11. package/editor/tools/engine/Tool.js +9 -23
  12. package/editor/tools/engine/ToolEngine.js +5 -7
  13. package/editor/tools/paint/TerrainHeightPaintTool.js +2 -2
  14. package/editor/tools/paint/TerrainPaintTool.js +2 -2
  15. package/editor/tools/paint/TerrainTexturePaintTool.js +2 -2
  16. package/editor/tools/v2/prototypeTransformControls.js +3 -3
  17. package/editor/view/ecs/ComponentControlView.js +2 -1
  18. package/package.json +1 -1
  19. package/samples/generation/main.js +2 -2
  20. package/samples/terrain/from_image.js +2 -2
  21. package/samples/terrain/from_image_2.js +4 -4
  22. package/src/core/binary/byteArrayToString.js +28 -0
  23. package/src/core/binary/downloadAsFile.js +28 -0
  24. package/src/core/binary/downloadUrlAsFile.js +14 -0
  25. package/src/core/binary/jsonToStringToByteArray.js +27 -0
  26. package/src/core/binary/stringToByteArray.js +24 -0
  27. package/src/core/bvh2/BinaryNode.spec.js +2 -1
  28. package/src/core/bvh2/bvh3/query/compute_tight_near_far_clipping_planes.js +1 -1
  29. package/src/core/bvh2/traversal/ThreeClippingPlaneComputingBVHVisitor.js +1 -1
  30. package/src/core/bvh2/traversal/__process_point_if_within_planes.js +1 -1
  31. package/src/core/cache/LoadingCache.js +3 -2
  32. package/src/core/collection/array/arraySetSortingDiff.spec.js +12 -12
  33. package/src/core/collection/array/weightedRandomFromArray.js +2 -2
  34. package/src/core/color/Color.js +6 -6
  35. package/src/core/color/Color.spec.js +27 -1
  36. package/src/core/color/YCbCr/YCbCr.spec.js +16 -0
  37. package/src/core/color/{YCbCr_to_rgb_uint24.js → YCbCr/YCbCr_to_rgb_uint24.js} +6 -6
  38. package/src/core/color/YCbCr/rgb_to_YCbCr_uint24.js +16 -0
  39. package/src/core/color/{hex2rgb.js → hex/hex2rgb.js} +1 -1
  40. package/src/core/color/{rgb2hex.js → hex/rgb2hex.js} +1 -1
  41. package/src/core/color/{hsv2rgb.js → hsv/hsv2rgb.js} +3 -3
  42. package/src/core/color/hsv/rgb2hsv.js +49 -0
  43. package/src/core/color/{kelvin_to_rgb.js → kelvin/kelvin_to_rgb.js} +1 -1
  44. package/src/core/color/{kelvin_to_rgb.spec.js → kelvin/kelvin_to_rgb.spec.js} +2 -2
  45. package/src/core/color/{prototype_kelvin_to_rgb.js → kelvin/prototype_kelvin_to_rgb.js} +5 -5
  46. package/src/core/color/{rgb_to_kelvin.spec.js → kelvin/rgb_to_kelvin.spec.js} +1 -1
  47. package/src/core/color/{parseColor.js → parse_color.js} +5 -5
  48. package/src/core/color/parse_color.spec.js +18 -0
  49. package/src/core/color/rgb2uint24.js +3 -3
  50. package/src/core/color/sRGB/sRGB.spec.js +16 -0
  51. package/src/core/color/xyz/XYZ.spec.js +16 -0
  52. package/src/core/color/xyz/rgb_to_xyz.js +15 -0
  53. package/src/core/color/xyz/xyz_to_rgb.js +14 -0
  54. package/src/core/events/signal/Signal.js +5 -0
  55. package/src/core/events/signal/{signalAggregateByTimeWindow.js → signal_aggregate_by_time_window.js} +1 -1
  56. package/src/core/events/signal/{SignalUtils.js → signal_filter.js} +1 -2
  57. package/src/core/fsm/simple/SimpleStateMachine.spec.js +34 -2
  58. package/src/core/geom/2d/spline_bezier2_2d.js +26 -0
  59. package/src/core/geom/2d/spline_bezier2_2d.spec.js +16 -0
  60. package/src/core/geom/3d/SurfacePoint3.js +1 -1
  61. package/src/core/geom/3d/aabb/aabb3_compute_plane_side.js +1 -1
  62. package/src/core/geom/3d/aabb/aabb3_detailed_volume_intersection.js +1 -1
  63. package/src/core/geom/3d/aabb/aabb3_transformed_compute_plane_side.js +1 -1
  64. package/src/core/geom/3d/compute_circle_bounding_box.js +1 -1
  65. package/src/core/geom/3d/cone/computeConeBoundingBox.js +1 -1
  66. package/src/core/geom/3d/frustum/frustum3_computeNearestPointToPoint.js +1 -1
  67. package/src/core/geom/3d/line/line3_computeSegmentPointDistance_sqr.js +1 -1
  68. package/src/core/geom/3d/line/line3_compute_nearest_point_to_point.js +1 -1
  69. package/src/core/geom/3d/matrix/m4_multiply.js +2 -2
  70. package/src/core/geom/3d/matrix/m4_multiply.spec.js +11 -0
  71. package/src/core/geom/3d/matrix/m4_multiply_alphatensor.spec.js +11 -0
  72. package/src/core/geom/3d/morton/split_by_2.js +1 -1
  73. package/src/core/geom/3d/normal/hemioct/unit_hemioct.spec.js +1 -1
  74. package/src/core/geom/3d/normal/spherical/sphere_map_transform.js +1 -1
  75. package/src/core/geom/3d/plane/is_point_within_planes.js +1 -1
  76. package/src/core/geom/3d/plane/lerp_planes_to_array.js +1 -1
  77. package/src/core/geom/3d/plane/plane3_compute_convex_3_plane_intersection.js +1 -1
  78. package/src/core/geom/3d/plane/plane3_compute_line_segment_intersection.js +1 -1
  79. package/src/core/geom/3d/plane/plane3_compute_ray_intersection.js +1 -1
  80. package/src/core/geom/3d/plane/plane3_lerp.js +2 -2
  81. package/src/core/geom/3d/plane/plane3_projectPoint.js +1 -1
  82. package/src/core/geom/3d/plane/plane3_slerp.js +3 -3
  83. package/src/core/geom/3d/ray/ray_computeNearestPointToPoint.js +1 -1
  84. package/src/core/geom/3d/ray/ray_distance_to_point.js +1 -1
  85. package/src/core/geom/3d/shape/UnionShape3D.js +3 -3
  86. package/src/core/geom/3d/shape/UnitCubeShape3D.js +1 -1
  87. package/src/core/geom/3d/shape/UnitSphereShape3D.js +1 -1
  88. package/src/core/geom/3d/shape/util/shape_to_visual_entity.js +10 -10
  89. package/src/core/geom/3d/sphere/sphere_intersects_ray.js +1 -1
  90. package/src/core/geom/3d/tetrahedra/TetrahedralMesh.js +6 -0
  91. package/src/core/geom/3d/tetrahedra/compute_bounding_simplex_3d.js +1 -1
  92. package/src/core/geom/3d/tetrahedra/compute_bounding_simplex_3d.spec.js +1 -1
  93. package/src/core/geom/3d/tetrahedra/compute_circumsphere.js +1 -1
  94. package/src/core/geom/3d/tetrahedra/delaunay/compute_delaunay_tetrahedral_mesh.js +1 -0
  95. package/src/core/geom/3d/tetrahedra/delaunay/compute_delaunay_tetrahedral_mesh.spec.js +10 -2
  96. package/src/core/geom/3d/tetrahedra/prototypeTetrahedraBuilder.js +2 -2
  97. package/src/core/geom/3d/topology/bounds/computeTriangleClusterNormalBoundingCone.js +1 -1
  98. package/src/core/geom/3d/topology/samples/sampleFloodFill.js +4 -4
  99. package/src/core/geom/3d/topology/simplify/compute_face_normal_change_dot_product.js +1 -1
  100. package/src/core/geom/3d/topology/simplify/quadratic/Quadratic3.js +1 -1
  101. package/src/core/geom/3d/topology/simplify/tm_edge_collapse_is_degenerate_flip.js +2 -2
  102. package/src/core/geom/3d/topology/struct/TopoVertex.js +1 -1
  103. package/src/core/geom/3d/topology/util/compute_face_connection_weight.js +2 -2
  104. package/src/core/geom/3d/triangle/computeTrianglePlaneSide.js +1 -1
  105. package/src/core/geom/3d/triangle/computeTriangleRayIntersection.js +1 -1
  106. package/src/core/geom/3d/triangle/computeTriangleRayIntersectionBarycentricEdge.js +1 -1
  107. package/src/core/geom/3d/v3_compute_triangle_normal.js +1 -1
  108. package/src/core/geom/Quaternion.js +1 -1
  109. package/src/core/geom/Vector3.js +7 -7
  110. package/src/core/geom/Vector3.spec.js +68 -1
  111. package/src/core/geom/mat2/m2_add.js +17 -0
  112. package/src/core/geom/mat2/m2_determinant.js +8 -0
  113. package/src/core/geom/mat2/m2_multiply.js +17 -0
  114. package/src/core/geom/mat2/m2_multiply_scalar.js +18 -0
  115. package/src/core/geom/mat2/m2_multiply_transposed.js +18 -0
  116. package/src/core/geom/mat2/m2_sub_transposed.js +17 -0
  117. package/src/{view → core/geom/mat3}/m3_cm_compose_transform.js +0 -29
  118. package/src/core/geom/mat3/m3_cm_extract_rotation.js +8 -0
  119. package/src/core/geom/mat3/m3_cm_from_translation.js +19 -0
  120. package/src/{view/multiplyMatrices3.js → core/geom/mat3/m3_multiply.js} +2 -2
  121. package/src/{view → core/geom/mat3}/m3_rm_compose_transform.js +0 -9
  122. package/src/core/geom/mat3/m3_rm_extract_scale.js +7 -0
  123. package/src/core/geom/{3d/vector/allocate_v3.js → vec3/v3_allocate.js} +1 -1
  124. package/src/core/geom/{v3_angle_between.js → vec3/v3_angle_between.js} +1 -1
  125. package/src/core/geom/vec3/v3_dot_array_array.js +20 -0
  126. package/src/core/geom/{v3_lerp.js → vec3/v3_lerp.js} +1 -1
  127. package/src/core/graph/SquareMatrix.js +26 -3
  128. package/src/core/graph/SquareMatrix.spec.js +52 -2
  129. package/src/core/math/clamp01.js +1 -0
  130. package/src/core/math/fract.js +3 -1
  131. package/src/core/math/inverseLerp.js +7 -5
  132. package/src/core/math/lerp.js +5 -5
  133. package/src/core/math/physics/spring/computeHookeForce.js +9 -0
  134. package/src/core/math/remap.js +19 -0
  135. package/src/core/math/remap.spec.js +15 -0
  136. package/src/core/math/smoothStep.spec.js +16 -0
  137. package/src/core/math/spline/spline_bezier2.js +13 -0
  138. package/src/core/math/spline/spline_bezier2.spec.js +13 -0
  139. package/src/core/model/object/compareValues.js +2 -2
  140. package/src/core/model/object/read_property.js +10 -2
  141. package/src/core/model/object/write_property.js +3 -23
  142. package/src/core/model/object/write_property.spec.js +26 -0
  143. package/src/core/primitives/numbers/number_pretty_print.spec.js +19 -0
  144. package/src/core/process/action/AsynchronousDelayAction.js +2 -2
  145. package/src/core/process/executor/profile/ConcurrentExecutorProfiler.js +1 -1
  146. package/src/engine/EngineHarness.js +7 -7
  147. package/src/engine/EntityCreator.js +5 -5
  148. package/src/engine/__module.js +1 -1
  149. package/src/engine/achievements/AchievementManager.js +2 -2
  150. package/src/engine/animation/AnimationUtils.js +4 -4
  151. package/src/engine/animation/behavior/animateProperty.js +2 -2
  152. package/src/engine/animation/curve/draw/build_plot_entity_from_array.js +3 -3
  153. package/src/engine/animation/playAnimationTrack.js +3 -3
  154. package/src/engine/animation/playTrackRealTime.js +3 -3
  155. package/src/engine/animation/removeEntityWithMeshParticlesEffect.js +2 -2
  156. package/src/engine/control/ControlContext.js +7 -7
  157. package/src/engine/ecs/{EntityBuilder.d.ts → Entity.d.ts} +5 -5
  158. package/src/engine/ecs/{EntityBuilder.js → Entity.js} +29 -29
  159. package/src/engine/ecs/{EntityBuilder.spec.js → Entity.spec.js} +17 -17
  160. package/src/engine/ecs/EntityBlueprint.d.ts +2 -2
  161. package/src/engine/ecs/EntityBlueprint.js +3 -3
  162. package/src/engine/ecs/EntityBlueprint.spec.js +2 -2
  163. package/src/engine/ecs/{EntityBuilderFlags.js → EntityFlags.js} +1 -1
  164. package/src/engine/ecs/EntityObserver.spec.js +8 -8
  165. package/src/engine/ecs/dynamic_actions/DynamicActorSystem.js +5 -5
  166. package/src/engine/ecs/foliage/ecs/InstancedMeshUtils.js +3 -3
  167. package/src/engine/ecs/gui/menu/radial/RadialContextMenu.d.ts +2 -2
  168. package/src/engine/ecs/gui/menu/radial/RadialContextMenu.js +5 -5
  169. package/src/engine/ecs/ik/OneBoneSurfaceAlignmentSolver.js +2 -2
  170. package/src/engine/ecs/ik/TwoBoneInverseKinematicsSolver.js +2 -2
  171. package/src/engine/ecs/parent/EntityNode.d.ts +3 -3
  172. package/src/engine/ecs/parent/EntityNode.js +5 -5
  173. package/src/engine/ecs/parent/testHuDPerf.js +2 -2
  174. package/src/engine/ecs/speaker/VoiceSystem.js +5 -5
  175. package/src/engine/ecs/systems/SteeringSystem.js +1 -1
  176. package/src/engine/ecs/terrain/ecs/splat/SplatMapOptimizerDebugger.js +1 -1
  177. package/src/engine/ecs/tooltip/testTooltipComponentSystem.js +3 -3
  178. package/src/engine/graphics/camera/makeOrbitalCameraController.js +3 -3
  179. package/src/engine/graphics/camera/testClippingPlaneComputation.js +3 -3
  180. package/src/engine/graphics/debug/createDebugLabel.js +3 -3
  181. package/src/engine/graphics/ecs/camera/Camera.js +1 -1
  182. package/src/engine/graphics/ecs/camera/CameraClippingPlaneComputer.js +1 -1
  183. package/src/engine/graphics/ecs/camera/filter/setup_filtered_camera_controller.js +3 -3
  184. package/src/engine/graphics/ecs/decal/v2/FPDecalSystem.js +3 -11
  185. package/src/engine/graphics/ecs/decal/v2/prototypeDecalEditor.js +3 -3
  186. package/src/engine/graphics/ecs/decal/v2/prototypeDecalSystem.js +14 -14
  187. package/src/engine/graphics/ecs/highlight/Highlight.js +20 -102
  188. package/src/engine/graphics/ecs/mesh/Mesh.js +12 -18
  189. package/src/engine/graphics/ecs/mesh/MeshSystem.js +41 -26
  190. package/src/engine/graphics/ecs/mesh-v2/ShadedGeometrySystem.js +1 -1
  191. package/src/engine/graphics/ecs/mesh-v2/aggregate/prototypeSGMesh.js +3 -3
  192. package/src/engine/graphics/ecs/mesh-v2/sample/prototypeShadedGeometry.js +5 -5
  193. package/src/engine/graphics/ecs/mesh-v2/sample/prototype_sg_raycast.js +6 -6
  194. package/src/engine/graphics/ecs/path/ribbon/RibbonPathBuilder.js +3 -3
  195. package/src/engine/graphics/ecs/path/testPathDisplaySystem.js +3 -3
  196. package/src/engine/graphics/ecs/path/tube/build/TubePathBuilder.js +4 -4
  197. package/src/engine/graphics/ecs/path/tube/build/makeTubeGeometry.js +1 -1
  198. package/src/engine/graphics/ecs/path/tube/build/make_cap.js +3 -3
  199. package/src/engine/graphics/ecs/path/tube/build/make_ring_vertices.js +1 -1
  200. package/src/engine/graphics/ecs/path/tube/prototypeAnimatedPathMask.js +3 -3
  201. package/src/engine/graphics/ecs/sprite/SpriteSystemPE.js +2 -2
  202. package/src/engine/graphics/ecs/sprite/prototypeSpriteSystem.js +2 -2
  203. package/src/engine/graphics/geometry/MikkT/InitTriInfo.js +5 -6
  204. package/src/engine/graphics/geometry/MikkT/MikkTSpace.js +3 -3
  205. package/src/engine/graphics/geometry/MikkT/NormalizeSafe.js +1 -2
  206. package/src/engine/graphics/geometry/MikkT/STSpace.js +3 -3
  207. package/src/engine/graphics/geometry/MikkT/v3_scale_dot_sub_normalize.js +2 -2
  208. package/src/engine/graphics/geometry/bvh/buffered/BVHGeometryRaycaster.js +1 -1
  209. package/src/engine/graphics/geometry/clipping/ClippedGeometry.js +1 -1
  210. package/src/engine/graphics/geometry/optimization/merge/prototypeGeometryMerge.js +4 -4
  211. package/src/engine/graphics/impostors/octahedral/prototypeBaker.js +7 -7
  212. package/src/engine/graphics/particles/node-based/editor/ParticleSpecificationEditorView.js +1 -1
  213. package/src/engine/graphics/particles/particular/engine/emitter/ParticleEmitter.js +102 -95
  214. package/src/engine/graphics/particles/particular/engine/emitter/ParticleLayer.spec.js +25 -0
  215. package/src/engine/graphics/particles/particular/engine/emitter/ParticlePool.js +0 -35
  216. package/src/engine/graphics/particles/particular/engine/emitter/ParticlePool.spec.js +39 -2
  217. package/src/engine/graphics/particles/particular/engine/renderers/billboard/prototypeBillboardRenderer.js +2 -2
  218. package/src/engine/graphics/particles/particular/engine/shader/ShaderManager.js +22 -6
  219. package/src/engine/graphics/particles/particular/engine/utils/volume/ParticleVolume.d.ts +2 -2
  220. package/src/engine/graphics/particles/particular/engine/utils/volume/ParticleVolume.js +3 -3
  221. package/src/engine/graphics/particles/particular/engine/utils/volume/prototypeParticleVolume.js +10 -10
  222. package/src/engine/graphics/render/buffer/buffers/prototypeNormalFrameBuffer.js +2 -2
  223. package/src/engine/graphics/render/buffer/simple-fx/taa/prototypeTAA.js +2 -2
  224. package/src/engine/graphics/render/forward_plus/LightManager.js +1 -1
  225. package/src/engine/graphics/render/forward_plus/plugin/ptototypeFPPlugin.js +13 -13
  226. package/src/engine/graphics/render/forward_plus/prototype/prototypeLightManager.js +3 -3
  227. package/src/engine/graphics/render/forward_plus/query/detailed_sphere_frustum_intersection_test.js +1 -1
  228. package/src/engine/graphics/render/layers/RenderLayerUtils.js +1 -1
  229. package/src/engine/graphics/render/visibility/hiz/prototypeHiZ.js +8 -7
  230. package/src/engine/graphics/sh3/LightProbeVolume.js +3 -3
  231. package/src/engine/graphics/sh3/path_tracer/PathTracer.js +2 -2
  232. package/src/engine/graphics/sh3/path_tracer/prototypePathTracer.js +2 -2
  233. package/src/engine/graphics/sh3/path_tracer/random_in_hemisphere.js +1 -1
  234. package/src/engine/graphics/sh3/path_tracer/ray_hit_apply_transform.js +1 -1
  235. package/src/engine/graphics/sh3/path_tracer/ray_reflect.js +1 -1
  236. package/src/engine/graphics/sh3/prototypeSH3Probe.js +3 -3
  237. package/src/engine/graphics/sh3/sky/hosek/data.js +3744 -0
  238. package/src/engine/graphics/sh3/sky/hosek/sky_hosek_compute_irradiance_by_direction.js +10 -3786
  239. package/src/engine/graphics/sh3/visualise_probe.js +3 -3
  240. package/src/engine/graphics/shadows/testShadowMapRendering.js +3 -3
  241. package/src/engine/graphics/texture/atlas/AbstractTextureAtlas.js +1 -1
  242. package/src/engine/graphics/texture/atlas/AtlasPatch.js +0 -1
  243. package/src/engine/graphics/texture/atlas/AtlasPatchFlag.js +8 -1
  244. package/src/engine/graphics/texture/atlas/CachingTextureAtlas.js +25 -0
  245. package/src/engine/graphics/texture/atlas/CachingTextureAtlas.spec.js +54 -0
  246. package/src/engine/graphics/texture/atlas/ManagedTextureAtlas.js +101 -160
  247. package/src/engine/graphics/texture/atlas/TextureAtlas.js +18 -1
  248. package/src/engine/graphics/texture/sampler/downloadSamplerAsPNG.js +1 -1
  249. package/src/engine/graphics/texture/sampler/sampler2d_ensure_uint8_RGBA.js +22 -0
  250. package/src/engine/graphics/texture/sprite/prototypeSpriteCutoutGeometry.js +2 -2
  251. package/src/engine/graphics/util/projectSphere.js +1 -1
  252. package/src/engine/input/ecs/controllers/KeyboardCameraController.js +2 -2
  253. package/src/engine/input/ecs/util/TopDownCameraControllerHelper.js +2 -2
  254. package/src/engine/intelligence/behavior/composite/ParallelBehavior.spec.js +13 -12
  255. package/src/engine/navigation/ecs/components/Path.js +1 -1
  256. package/src/engine/physics/fluid/prototype.js +3 -3
  257. package/src/engine/physics/mls-mpm/MLS_MPM.js +11 -106
  258. package/src/engine/reference/v2/Reference.js +6 -2
  259. package/src/engine/save/storage/JsonStringCodec.js +1 -1
  260. package/src/engine/save/storage/LocalStorage.js +2 -1
  261. package/src/engine/sound/ecs/emitter/SoundEmitter.js +7 -7
  262. package/src/engine/sound/ecs/emitter/SoundTrack.js +6 -6
  263. package/src/engine/ui/GUIEngine.js +4 -4
  264. package/src/engine/ui/notification/NotificationManager.js +3 -3
  265. package/src/generation/filtering/numeric/complex/CellFilterAngleToNormal.js +1 -1
  266. package/src/generation/grid/generation/road/GridTaskGenerateRoads.js +2 -4
  267. package/src/generation/markers/debug/visualizeMarkers.js +2 -2
  268. package/src/generation/markers/prototypeGridCellActionPlaceMarker.js +2 -2
  269. package/src/generation/placement/action/random/weighted/CellActionSelectWeightedRandom.js +2 -2
  270. package/src/generation/theme/ThemeEngine.js +2 -2
  271. package/src/generation/theme/ThemeEngine.spec.js +7 -0
  272. package/src/view/View.js +21 -13
  273. package/src/view/elements/ColorPickerView.js +2 -2
  274. package/src/view/minimap/gl/MarkerGL.js +20 -18
  275. package/src/view/minimap/gl/MinimapMarkersGL.js +2 -1
  276. package/editor/tools/FoliagePaintTool.js +0 -168
  277. package/editor/tools/engine/ToolStateMachine.js +0 -53
  278. package/src/core/NumberFormat.js +0 -4
  279. package/src/core/binary/ByteArrayTools.js +0 -137
  280. package/src/core/binary/NaiveBitSet.js +0 -69
  281. package/src/core/binary/objects/StandardTypeBuilder.js +0 -126
  282. package/src/core/binary/serde/JsonSerializer.js +0 -113
  283. package/src/core/color/rgb2hsv.js +0 -47
  284. package/src/core/color/rgb_to_YCbCr_uint24.js +0 -16
  285. package/src/core/fsm/StateMachine.js +0 -440
  286. package/src/core/fsm/Transition.js +0 -65
  287. package/src/core/geom/Bezier.js +0 -24
  288. package/src/core/geom/Bezier.spec.js +0 -16
  289. package/src/core/math/spline/quadraticCurve.js +0 -11
  290. package/src/core/math/spline/quadraticCurve.spec.js +0 -13
  291. package/src/core/primitives/numbers/compareNumbers.js +0 -9
  292. package/src/engine/graphics/ecs/decal/Decal.js +0 -10
  293. package/src/engine/graphics/ecs/decal/DecalSystem.js +0 -99
  294. package/src/engine/graphics/ecs/decal/threejs/DecalGeometry.js +0 -298
  295. package/src/engine/graphics/ecs/trail/Trail.js +0 -83
  296. package/src/engine/graphics/ecs/trail/TrailMaterial.js +0 -67
  297. package/src/engine/graphics/ecs/trail/TrailMaterial2.js +0 -73
  298. package/src/engine/graphics/ecs/trail/TrailSystem.js +0 -162
  299. package/src/engine/graphics/ecs/water2/NodeWaterShader1.js +0 -213
  300. package/src/engine/graphics/ecs/water2/shader/JBWaterShader.js +0 -315
  301. package/src/engine/graphics/geometry/MikkT/Length.js +0 -10
  302. package/src/engine/graphics/texture/ImageLoader.js +0 -33
  303. package/src/engine/graphics/three/DDSLoader.js +0 -286
  304. package/src/engine/graphics/three/Water2.js +0 -343
  305. package/src/engine/physics/spring/computeHookeForce.js +0 -9
  306. package/src/engine/reference/v1/ReferenceManager.js +0 -124
  307. /package/src/core/color/{hex2rgb.spec.js → hex/hex2rgb.spec.js} +0 -0
  308. /package/src/core/color/{rgb2hex.spec.js → hex/rgb2hex.spec.js} +0 -0
  309. /package/src/core/color/{hsv2rgb.spec.js → hsv/hsv2rgb.spec.js} +0 -0
  310. /package/src/core/color/{rgb_to_kelvin.js → kelvin/rgb_to_kelvin.js} +0 -0
  311. /package/src/core/color/{linear_to_sRGB.js → sRGB/linear_to_sRGB.js} +0 -0
  312. /package/src/core/color/{sRGB_to_linear.js → sRGB/sRGB_to_linear.js} +0 -0
  313. /package/src/core/geom/{m3_determinant.js → mat3/m3_determinant.js} +0 -0
  314. /package/src/core/geom/{v3_distance.js → vec3/v3_distance.js} +0 -0
  315. /package/src/core/geom/{v3_distance_above_plane.js → vec3/v3_distance_above_plane.js} +0 -0
  316. /package/src/core/geom/{v3_distance_above_plane.spec.js → vec3/v3_distance_above_plane.spec.js} +0 -0
  317. /package/src/core/geom/{v3_distance_sqr.d.ts → vec3/v3_distance_sqr.d.ts} +0 -0
  318. /package/src/core/geom/{v3_distance_sqr.js → vec3/v3_distance_sqr.js} +0 -0
  319. /package/src/core/geom/{v3_dot.js → vec3/v3_dot.js} +0 -0
  320. /package/src/core/geom/{v3_length.js → vec3/v3_length.js} +0 -0
  321. /package/src/core/geom/{v3_length_sqr.js → vec3/v3_length_sqr.js} +0 -0
  322. /package/src/core/geom/{v3_slerp.js → vec3/v3_slerp.js} +0 -0
@@ -1,5 +1,6 @@
1
1
  import Vector3 from "./Vector3.js";
2
- import { v3_slerp } from "./v3_slerp.js";
2
+ import { v3_slerp } from "./vec3/v3_slerp.js";
3
+ import { MATRIX_4_IDENTITY } from "./3d/matrix/MATRIX_4_IDENTITY.js";
3
4
 
4
5
  test('slerp', () => {
5
6
 
@@ -105,3 +106,69 @@ test("roughlyEquals", () => {
105
106
  expect(new Vector3(1, -2, 3).roughlyEquals(new Vector3(1, -2, 3.11), 0.1))
106
107
  .toBe(false);
107
108
  });
109
+
110
+
111
+ test("asArray", () => {
112
+ const v = new Vector3(2, 5, 7);
113
+
114
+ expect(v.asArray()).toEqual([2, 5, 7])
115
+ });
116
+
117
+ test("fromScalar", () => {
118
+ expect(Vector3.fromScalar(7).asArray()).toEqual([7, 7, 7])
119
+ });
120
+
121
+ test("iterator symbol", () => {
122
+ const v = new Vector3(5, 7, 11);
123
+
124
+ const iterator = v[Symbol.iterator]();
125
+
126
+ expect(iterator.next()).toEqual({ value: 5, done: false })
127
+ expect(iterator.next()).toEqual({ value: 7, done: false })
128
+ expect(iterator.next()).toEqual({ value: 11, done: false })
129
+ expect(iterator.next()).toEqual({ done: true })
130
+
131
+ });
132
+
133
+ test("array-style getters", () => {
134
+
135
+ const v = new Vector3(5, 7, 11);
136
+
137
+ expect(v[0]).toEqual(5);
138
+ expect(v[1]).toEqual(7);
139
+ expect(v[2]).toEqual(11);
140
+ });
141
+ test("array-style setters", () => {
142
+
143
+ const v = new Vector3();
144
+
145
+ v[0] = 5;
146
+ v[1] = 7;
147
+ v[2] = 11;
148
+
149
+ expect(v.x).toEqual(5);
150
+ expect(v.y).toEqual(7);
151
+ expect(v.z).toEqual(11);
152
+ });
153
+
154
+ test("fromJSON as scalar", () => {
155
+
156
+ const v = new Vector3();
157
+
158
+ v.fromJSON(7);
159
+
160
+ expect(v.asArray()).toEqual([7, 7, 7])
161
+
162
+ });
163
+
164
+ test("applyMatrix with identity", () => {
165
+
166
+ const v = new Vector3(3, 7, 11);
167
+
168
+ v.applyMatrix4(MATRIX_4_IDENTITY);
169
+
170
+ expect(v.x).toEqual(3);
171
+ expect(v.y).toEqual(7);
172
+ expect(v.z).toEqual(11);
173
+
174
+ });
@@ -0,0 +1,17 @@
1
+ /**
2
+ *
3
+ * @param {number[]} result
4
+ * @param {number[]} a
5
+ * @param {number[]} b
6
+ */
7
+ export function m2_add(result, a, b) {
8
+ const v0 = a[0] + b[0];
9
+ const v1 = a[1] + b[1];
10
+ const v2 = a[2] + b[2];
11
+ const v3 = a[3] + b[3];
12
+
13
+ result[0] = v0;
14
+ result[1] = v1;
15
+ result[2] = v2;
16
+ result[3] = v3;
17
+ }
@@ -0,0 +1,8 @@
1
+ /**
2
+ *
3
+ * @param {number[]} a 2d matrix
4
+ * @returns {number}
5
+ */
6
+ export function m2_determinant(a) {
7
+ return a[0] * a[3] - a[1] * a[2]
8
+ }
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Multiplication of 2x2 matrices
3
+ * @param {number[]} result
4
+ * @param {number[]} a
5
+ * @param {number[]} b
6
+ */
7
+ export function m2_multiply(result, a, b) {
8
+ const v0 = a[0] * b[0] + a[1] * b[2];
9
+ const v1 = a[0] * b[1] + a[1] * b[3];
10
+ const v2 = a[2] * b[0] + a[3] * b[2];
11
+ const v3 = a[2] * b[1] + a[3] * b[3];
12
+
13
+ result[0] = v0;
14
+ result[1] = v1;
15
+ result[2] = v2;
16
+ result[3] = v3;
17
+ }
@@ -0,0 +1,18 @@
1
+ /**
2
+ *
3
+ * @param {number[]} result
4
+ * @param {number[]} a
5
+ * @param {number} scalar
6
+ */
7
+ export function m2_multiply_scalar(result, a, scalar) {
8
+
9
+ const v0 = a[0] * scalar;
10
+ const v1 = a[1] * scalar;
11
+ const v2 = a[2] * scalar;
12
+ const v3 = a[3] * scalar;
13
+
14
+ result[0] = v0;
15
+ result[1] = v1;
16
+ result[2] = v2;
17
+ result[3] = v3;
18
+ }
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Transposed multiplication of 2x2 matrices
3
+ * Second argument will be transposed before multiplication
4
+ * @param {number[]} result
5
+ * @param {number[]} a
6
+ * @param {number[]} b
7
+ */
8
+ export function m2_multiply_transposed(result, a, b) {
9
+ const v0 = a[0] * b[0] + a[1] * b[1];
10
+ const v1 = a[0] * b[2] + a[1] * b[3];
11
+ const v2 = a[2] * b[0] + a[3] * b[1];
12
+ const v3 = a[2] * b[2] + a[3] * b[3];
13
+
14
+ result[0] = v0;
15
+ result[1] = v1;
16
+ result[2] = v2;
17
+ result[3] = v3;
18
+ }
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Transposes second matrix before subtraction
3
+ * @param {number[]} result
4
+ * @param {number[]} a
5
+ * @param {number[]} b
6
+ */
7
+ export function m2_sub_transposed(result, a, b) {
8
+ const v0 = a[0] - b[0];
9
+ const v1 = a[2] - b[1];
10
+ const v2 = a[1] - b[2];
11
+ const v3 = a[3] - b[3];
12
+
13
+ result[0] = v0;
14
+ result[1] = v1;
15
+ result[2] = v2;
16
+ result[3] = v3;
17
+ }
@@ -35,32 +35,3 @@ export function m3_cm_compose_transform(
35
35
  result[7] = 0;
36
36
  result[8] = 1;
37
37
  }
38
-
39
- /**
40
- *
41
- * @param {number[]|Float32Array} result
42
- * @param {number} tX
43
- * @param {number} tY
44
- */
45
- export function m3_cm_from_translation(result, tX, tY) {
46
- result[0] = 1;
47
- result[1] = 0;
48
- result[2] = tX;
49
-
50
- result[3] = 0;
51
- result[4] = 1;
52
- result[5] = tY;
53
-
54
- result[6] = 0;
55
- result[7] = 0;
56
- result[8] = 1;
57
- }
58
-
59
- /**
60
- * @see https://stackoverflow.com/questions/45159314/decompose-2d-transformation-matrix
61
- * @param {mat3|number[]|Float32Array} m3
62
- * @returns {number}
63
- */
64
- export function m3_cm_extract_rotation(m3) {
65
- return Math.atan2(m3[3], m3[0]);
66
- }
@@ -0,0 +1,8 @@
1
+ /**
2
+ * @see https://stackoverflow.com/questions/45159314/decompose-2d-transformation-matrix
3
+ * @param {mat3|number[]|Float32Array} m3
4
+ * @returns {number}
5
+ */
6
+ export function m3_cm_extract_rotation(m3) {
7
+ return Math.atan2(m3[3], m3[0]);
8
+ }
@@ -0,0 +1,19 @@
1
+ /**
2
+ *
3
+ * @param {number[]|Float32Array} result
4
+ * @param {number} tX
5
+ * @param {number} tY
6
+ */
7
+ export function m3_cm_from_translation(result, tX, tY) {
8
+ result[0] = 1;
9
+ result[1] = 0;
10
+ result[2] = tX;
11
+
12
+ result[3] = 0;
13
+ result[4] = 1;
14
+ result[5] = tY;
15
+
16
+ result[6] = 0;
17
+ result[7] = 0;
18
+ result[8] = 1;
19
+ }
@@ -1,11 +1,11 @@
1
1
  /**
2
2
  * Performs matrix multiplication of 3x3 matrices
3
3
  * r = a * b
4
+ * @param {number[]|Float32Array} r result matrix
4
5
  * @param {number[]|Float32Array} a first matrix
5
6
  * @param {number[]|Float32Array} b second matrix
6
- * @param {number[]|Float32Array} r result matrix
7
7
  */
8
- export function m3_multiply(a, b, r) {
8
+ export function m3_multiply(r, a, b) {
9
9
  //read out values of input matrices to support the case where result is written back into one of the inputs
10
10
  const a0 = a[0];
11
11
  const a1 = a[1];
@@ -34,12 +34,3 @@ export function m3_rm_compose_transform(
34
34
  result[5] = 0;
35
35
  result[8] = 1;
36
36
  }
37
-
38
-
39
- export function m3_rm_extract_scale(result, m3) {
40
- const scale_x = Math.hypot(m3[0], m3[3]);
41
- const scale_y = Math.hypot(m3[1], m3[4]);
42
-
43
- result[0] = scale_x;
44
- result[1] = scale_y;
45
- }
@@ -0,0 +1,7 @@
1
+ export function m3_rm_extract_scale(result, m3) {
2
+ const scale_x = Math.hypot(m3[0], m3[3]);
3
+ const scale_y = Math.hypot(m3[1], m3[4]);
4
+
5
+ result[0] = scale_x;
6
+ result[1] = scale_y;
7
+ }
@@ -23,7 +23,7 @@ const ELEMENT_BYTE_SIZE = 4 * 3;
23
23
  * custom Float32Array allocator, allocated memory in continuous chunks
24
24
  * @returns {Float32Array}
25
25
  */
26
- export function allocate_v3() {
26
+ export function v3_allocate() {
27
27
  if (bucket_cursor >= ALLOCATOR_BUCKET_CAPACITY) {
28
28
  bucket = new ArrayBuffer(ALLOCATOR_BUCKET_CAPACITY * ELEMENT_BYTE_SIZE);
29
29
  bucket_cursor = 0;
@@ -1,6 +1,6 @@
1
1
  import { v3_dot } from "./v3_dot.js";
2
2
  import { v3_length } from "./v3_length.js";
3
- import { clamp } from "../math/clamp.js";
3
+ import { clamp } from "../../math/clamp.js";
4
4
 
5
5
  /**
6
6
  *
@@ -0,0 +1,20 @@
1
+ /**
2
+ *
3
+ * @param {number[]|Float32Array} a
4
+ * @param {number} a_offset
5
+ * @param {number[]|Float32Array} b
6
+ * @param {number} b_offset
7
+ * @returns {number}
8
+ */
9
+ export function v3_dot_array_array(a, a_offset, b, b_offset) {
10
+
11
+ const a_x = a[a_offset];
12
+ const a_y = a[a_offset + 1];
13
+ const a_z = a[a_offset + 2];
14
+
15
+ const b_x = b[b_offset];
16
+ const b_y = b[b_offset + 1];
17
+ const b_z = b[b_offset + 2];
18
+
19
+ return a_x * b_x + a_y * b_y + a_z * b_z;
20
+ }
@@ -1,4 +1,4 @@
1
- import { lerp } from "../math/lerp.js";
1
+ import { lerp } from "../../math/lerp.js";
2
2
 
3
3
  /**
4
4
  *
@@ -1,5 +1,6 @@
1
1
  import { DataType2TypedArrayConstructorMapping } from "../binary/type/DataType2TypedArrayConstructorMapping.js";
2
2
  import { assert } from "../assert.js";
3
+ import { array_copy } from "../collection/array/array_copy.js";
3
4
 
4
5
  export class SquareMatrix {
5
6
  /**
@@ -44,7 +45,7 @@ export class SquareMatrix {
44
45
  return this.data;
45
46
  }
46
47
 
47
- fill(v){
48
+ fill(v) {
48
49
  this.data.fill(v);
49
50
  }
50
51
 
@@ -53,16 +54,20 @@ export class SquareMatrix {
53
54
  * @param {SquareMatrix} other
54
55
  */
55
56
  subtract(other) {
56
- this.subtractMatrices(this,other);
57
+ this.subtractMatrices(this, other);
57
58
  }
58
59
 
59
60
  /**
60
- *
61
+ * Component-size subtraction
61
62
  * @param {SquareMatrix} a
62
63
  * @param {SquareMatrix} b
63
64
  */
64
65
  subtractMatrices(a, b) {
65
66
  const size = this.size;
67
+
68
+ assert.equal(a.size, size, 'a is of wrong size');
69
+ assert.equal(b.size, size, 'b is of wrong size');
70
+
66
71
  const data_length = size * size;
67
72
 
68
73
  const a_data = a.data;
@@ -152,6 +157,17 @@ export class SquareMatrix {
152
157
  this.data.set(arr);
153
158
  }
154
159
 
160
+ /**
161
+ *
162
+ * @param {number[]} [destination]
163
+ * @param {number} [offset]
164
+ */
165
+ toArray(destination = new Array(this.length), offset=0) {
166
+ array_copy(this.data, 0, destination, offset, this.length);
167
+
168
+ return destination;
169
+ }
170
+
155
171
  /**
156
172
  *
157
173
  * @param {number} row_index
@@ -177,6 +193,13 @@ export class SquareMatrix {
177
193
  * @return {number}
178
194
  */
179
195
  getCellValue(row_index, column_index) {
196
+ assert.isNonNegativeInteger(row_index, 'row_index');
197
+ assert.isNonNegativeInteger(column_index, 'row_index');
198
+
199
+ assert.lessThan(row_index, this.size, 'row overflow');
200
+ assert.lessThan(column_index, this.size, 'column overflow');
201
+
202
+
180
203
  return this.data[this.size * column_index + row_index];
181
204
  }
182
205
 
@@ -33,7 +33,7 @@ test('transpose', () => {
33
33
  });
34
34
 
35
35
 
36
- test('copy', ()=>{
36
+ test('copy', () => {
37
37
  const m = new SquareMatrix(2, BinaryDataType.Uint8);
38
38
 
39
39
  m.setCellValue(0, 0, 7);
@@ -41,7 +41,7 @@ test('copy', ()=>{
41
41
  m.setCellValue(0, 1, 13);
42
42
  m.setCellValue(1, 1, 19);
43
43
 
44
- const b = new SquareMatrix(2,BinaryDataType.Uint8);
44
+ const b = new SquareMatrix(2, BinaryDataType.Uint8);
45
45
 
46
46
  b.copy(m);
47
47
 
@@ -50,3 +50,53 @@ test('copy', ()=>{
50
50
  expect(b.getCellValue(0, 1)).toBe(13);
51
51
  expect(b.getCellValue(1, 1)).toBe(19);
52
52
  });
53
+
54
+ test("eye", () => {
55
+ const m = new SquareMatrix(2, BinaryDataType.Uint8);
56
+
57
+ m.eye();
58
+
59
+ expect(m.getCellValue(0, 0)).toBe(1);
60
+ expect(m.getCellValue(1, 0)).toBe(0);
61
+ expect(m.getCellValue(0, 1)).toBe(0);
62
+ expect(m.getCellValue(1, 1)).toBe(1);
63
+ });
64
+
65
+ test("negate", () => {
66
+ const m = new SquareMatrix(2, BinaryDataType.Int8);
67
+
68
+ m.fromArray([
69
+ -3, 5,
70
+ 7, -11
71
+ ]);
72
+
73
+ m.negate();
74
+
75
+ expect(m.toArray()).toEqual([
76
+ 3, -5,
77
+ -7, 11
78
+ ]);
79
+ });
80
+
81
+ test("subtract", () => {
82
+ const a = new SquareMatrix(2, BinaryDataType.Int8);
83
+ const b = new SquareMatrix(2, BinaryDataType.Int8);
84
+
85
+ a.fromArray([
86
+ 1, 3,
87
+ 5, 7
88
+ ]);
89
+
90
+ b.fromArray([
91
+ -11, 13,
92
+ 17, 23
93
+ ]);
94
+
95
+
96
+ a.subtract(b);
97
+
98
+ expect(a.toArray()).toEqual([
99
+ 12, -10,
100
+ -12, -16
101
+ ]);
102
+ });
@@ -1,6 +1,7 @@
1
1
  /**
2
2
  * Clamps a value to 0..1 range
3
3
  * Same as `clamp(value, 0, 1)`
4
+ * Works the same as `saturate` function in GLSL
4
5
  * @param {number} value
5
6
  * @returns {number}
6
7
  */
@@ -6,5 +6,7 @@
6
6
  * @returns {number} returns the fractional part of x. This is calculated as x - floor(x).
7
7
  */
8
8
  export function fract(v) {
9
- return v % 1;
9
+ const whole = v >> 0; // fast way to cut off fraction
10
+
11
+ return v - whole;
10
12
  }
@@ -10,11 +10,13 @@ export function inverseLerp(a, b, value) {
10
10
  const scaledValue = value - a;
11
11
 
12
12
  if (range === 0) {
13
- //avoid division by zero error
13
+
14
+ // avoid division by zero error
15
+
16
+ // this is arbitrary output, as actual answer is undefined
17
+
14
18
  return 0;
15
19
  }
16
20
 
17
- const fraction = scaledValue / range;
18
-
19
- return fraction;
20
- }
21
+ return scaledValue / range;
22
+ }
@@ -1,10 +1,10 @@
1
1
  /**
2
2
  * Linear interpolation between two values controlled by a given fraction
3
- * @param {Number} a
4
- * @param {Number} b
5
- * @param {Number} fraction Floating point value between 0 and 1
6
- * @return {Number}
3
+ * @param {number} a
4
+ * @param {number} b
5
+ * @param {number} fraction Floating point value between 0 and 1
6
+ * @return {number}
7
7
  */
8
8
  export function lerp(a, b, fraction) {
9
9
  return (b - a) * fraction + a;
10
- }
10
+ }
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Spring force calculation
3
+ * @param {number} displacement how far the spring is being stretched from its resting state
4
+ * @param {number} stiffness how still is the spring
5
+ * @return {number} force in the direction of displacement exerted by the spring trying to pull back
6
+ */
7
+ export function computeHookeForce(displacement, stiffness) {
8
+ return -stiffness * displacement;
9
+ }
@@ -0,0 +1,19 @@
1
+ import { inverseLerp } from "./inverseLerp.js";
2
+ import { lerp } from "./lerp.js";
3
+
4
+ /**
5
+ * Returns linear remapping of {@link value} from source range [source_first, source_second] to target range [target_first, target_second]
6
+ * This method is non-clamping, meaning that if your input is outside the source range - output will be outside the target range as well
7
+ * @param {number} source_first
8
+ * @param {number} source_second
9
+ * @param {number} target_first
10
+ * @param {number} target_second
11
+ * @param {number} value
12
+ * @return {number}
13
+ */
14
+ export function remap(source_first, source_second, target_first, target_second, value) {
15
+
16
+ const relative = inverseLerp(source_first, source_second, value);
17
+
18
+ return lerp(target_first, target_second, relative);
19
+ }
@@ -0,0 +1,15 @@
1
+ import { remap } from "./remap.js";
2
+
3
+ test("basics", () => {
4
+ expect(remap(0, 0, 0, 0, 0)).toEqual(0);
5
+
6
+ expect(remap(0, 1, 0, 1, 0)).toEqual(0);
7
+
8
+ expect(remap(0, 1, 1, 5, 0)).toEqual(1);
9
+
10
+ expect(remap(0, 1, 1, 5, 1)).toEqual(5);
11
+
12
+ expect(remap(0, 1, 1, 5, 0.5)).toEqual(3);
13
+
14
+ expect(remap(1, 5, 0, 1, 3)).toEqual(0.5);
15
+ });
@@ -0,0 +1,16 @@
1
+ import { smoothStep } from "./smoothStep.js";
2
+
3
+ test("basics", () => {
4
+ expect(smoothStep(0, 1, 1)).toEqual(1);
5
+ expect(smoothStep(1, 2, 2)).toEqual(1);
6
+
7
+ expect(smoothStep(0, 1, 0)).toEqual(0);
8
+ expect(smoothStep(1, 2, 1)).toEqual(0);
9
+
10
+ expect(smoothStep(0, 1, 0.5)).toBeCloseTo(0.5);
11
+ });
12
+
13
+ test("clamping",()=>{
14
+ expect(smoothStep(1, 2, 0)).toEqual(0);
15
+ expect(smoothStep(1, 2, 3)).toEqual(1);
16
+ });
@@ -0,0 +1,13 @@
1
+ /**
2
+ * 2-nd (quadratic) degree bezier curve
3
+ * @param {number} t
4
+ * @param {number} p0
5
+ * @param {number} p1
6
+ * @param {number} p2
7
+ * @return {number}
8
+ */
9
+ export function spline_bezier2(t, p0, p1, p2) {
10
+ const inv_t = 1 - t;
11
+
12
+ return inv_t * inv_t * p0 + 2 * inv_t * t * p1 + t * t * p2;
13
+ }
@@ -0,0 +1,13 @@
1
+ import { spline_bezier2 } from "./spline_bezier2.js";
2
+
3
+ test("spline_bezier2", () => {
4
+ expect(spline_bezier2(2, 0.1, 0.2, 3)).toBe(11.3);
5
+
6
+ expect(spline_bezier2(1, -1, -2, -3)).toBe(-3);
7
+
8
+ expect(spline_bezier2(-1, -1, 0, 0)).toBe(-4);
9
+
10
+ expect(spline_bezier2(-1, -1, 1, 0)).toBe(-8);
11
+
12
+ expect(spline_bezier2(-1, 0, 0, 0)).toBe(0);
13
+ });
@@ -1,8 +1,8 @@
1
1
  import { compareStrings } from "../../primitives/strings/compareStrings.js";
2
- import { compareNumbers } from "../../primitives/numbers/compareNumbers.js";
3
2
  import { compareBooleans } from "../../primitives/boolean/compareBooleans.js";
4
3
  import { extractFunctionBody } from "../../function/extractFunctionBody.js";
5
4
  import { compareArrays } from "../../primitives/array/compareArrays.js";
5
+ import { number_compare_ascending } from "../../primitives/numbers/number_compare_ascending.js";
6
6
 
7
7
  /**
8
8
  *
@@ -25,7 +25,7 @@ export function compareValues(a, b) {
25
25
  if (aType === "string") {
26
26
  return compareStrings(a, b);
27
27
  } else if (aType === "number") {
28
- return compareNumbers(a, b);
28
+ return number_compare_ascending(a, b);
29
29
  } else if (aType === "boolean") {
30
30
  return compareBooleans(a, b);
31
31
  } else if (aType === "function") {
@@ -6,9 +6,14 @@ import { string_capitalize } from "../../primitives/strings/string_capitalize.js
6
6
  * @param {string[]} parts
7
7
  * @param {number} part_offset
8
8
  * @param {number} part_count
9
+ * @param {boolean} [throw_on_missing] will throw an exception if property is not found
9
10
  * @returns {undefined|T}
10
11
  */
11
- export function read_property(root, parts, part_offset, part_count) {
12
+ export function read_property(
13
+ root,
14
+ parts, part_offset, part_count,
15
+ throw_on_missing = false
16
+ ) {
12
17
 
13
18
  let thing = root;
14
19
 
@@ -25,7 +30,10 @@ export function read_property(root, parts, part_offset, part_count) {
25
30
  if (typeof getter === "function") {
26
31
  // resolve via getter
27
32
  thing = getter.call(thing);
28
- } else {
33
+ } else if(throw_on_missing){
34
+ // no getter
35
+ throw new Error(`No no property or getter found for '${part}' on [${i}]'${parts.slice(part_offset, part_offset + part_count).join('/')}'`);
36
+ }else{
29
37
  // no getter
30
38
  return undefined;
31
39
  }