@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.
- package/core/assert.js +3 -1
- package/core/bvh2/BinaryNode.js +1 -1
- package/core/bvh2/aabb3/AABB3.js +18 -0
- package/core/bvh2/aabb3/AABB3Math.js +1 -1
- package/core/bvh2/binary/2/BinaryUint32BVH.js +498 -0
- package/core/bvh2/binary/2/BinaryUint32BVH.spec.js +54 -0
- package/core/bvh2/binary/IndexedBinaryBVH.js +22 -26
- package/core/bvh2/traversal/__detailed_box_volume_intersection.js +11 -8
- package/core/collection/ArrayUtils.js +1 -1
- package/core/collection/HashMap.js +66 -22
- package/core/collection/array/arrayQuickSort.js +9 -6
- package/core/collection/array/array_swap.js +22 -0
- package/core/collection/array/computeHashArray.js +22 -0
- package/core/collection/array/computeHashIntegerArray.js +15 -0
- package/core/collection/table/DataType2TypedArrayConstructorMapping.js +15 -0
- package/core/color/Color.js +2 -1
- package/core/function/FunctionCompiler.js +2 -1
- package/core/geom/3d/CircleMath.js +4 -4
- package/core/geom/3d/aabb/aabb3_computeDistanceAbovePlane.js +9 -33
- package/core/geom/3d/cone/computeConeBoundingBox.js +4 -4
- package/core/geom/3d/{compute_bounding_cone_of_2_cones.js → cone/compute_bounding_cone_of_2_cones.js} +3 -3
- package/core/geom/3d/{compute_bounding_cone_of_2_cones.spec.js → cone/compute_bounding_cone_of_2_cones.spec.js} +1 -1
- package/core/geom/3d/frustum/array_setFromProjectionMatrix.js +1 -1
- package/core/geom/3d/frustum/frustum3_computeNearestPointToPoint.js +11 -3
- package/core/geom/3d/line/line3_computeSegmentPointDistance_sqr.js +41 -0
- package/core/geom/3d/morton/mortonEncode_magicbits.js +2 -1
- package/core/geom/3d/morton/reinterpret_float32_as_int32.js +13 -0
- package/core/geom/3d/morton/v3_morton_encode_transformed.js +33 -0
- package/core/geom/3d/{encode_unit3_hemioct.js → normal/hemioct/encode_unit3_hemioct.js} +0 -0
- package/core/geom/3d/{unit_hemioct.spec.js → normal/hemioct/unit_hemioct.spec.js} +1 -1
- package/core/geom/3d/normal/lamber_azimuth/transform.js +61 -0
- package/core/geom/3d/normal/spherical/sphere_map_transform.js +77 -0
- package/core/geom/3d/{lerp_planes_to_array.js → plane/lerp_planes_to_array.js} +1 -3
- package/core/geom/3d/plane/plane3_lerp.js +3 -1
- package/core/geom/3d/plane/plane3_slerp.js +4 -1
- package/core/geom/3d/{plane_computeConvex3PlaneIntersection.js → plane/plane_computeConvex3PlaneIntersection.js} +14 -16
- package/core/geom/3d/ray/ray_computeNearestPointToPoint.js +37 -0
- package/core/geom/3d/shape/AbstractShape3D.js +29 -0
- package/core/geom/3d/shape/CompositeShape.js +60 -0
- package/core/geom/3d/shape/TransformedShape3D.js +70 -0
- package/core/geom/3d/shape/UnitCubeShape3D.js +13 -0
- package/core/geom/3d/shape/UnitSphereShape3D.js +16 -0
- package/core/geom/3d/topology/TopoTriangle.js +1 -1
- package/core/geom/3d/topology/TopoVertex.js +1 -1
- package/core/geom/3d/topology/bounds/computeTraingleClusterNormalBoundingCone.js +2 -2
- package/core/geom/3d/topology/simplify/compute_face_normal_change_dot_product.js +1 -1
- package/core/geom/3d/topology/simplify/quadratic/Quadratic3.js +1 -1
- package/core/geom/3d/triangle/computeTrianglePlaneSide.js +1 -1
- package/core/geom/3d/triangle/computeTriangleRayIntersection.js +1 -1
- package/core/geom/3d/voxel/DenseBitVolume3D.js +87 -0
- package/core/geom/3d/voxel/buildVolumeFromProjectedGeometry.js +23 -0
- package/core/geom/AABB2.js +1 -1
- package/core/geom/ConicRay.js +3 -1
- package/core/geom/LineSegment.js +1 -77
- package/core/geom/Matrix4.js +8 -8
- package/core/geom/Plane.js +15 -10
- package/core/geom/Quaternion.js +2 -1
- package/core/geom/Rectangle.js +2 -1
- package/core/geom/Vector1.js +1 -1
- package/core/geom/Vector3.d.ts +2 -0
- package/core/geom/Vector3.js +35 -159
- package/core/geom/Vector3.spec.js +2 -1
- package/core/geom/Vector4.js +2 -1
- package/core/geom/random/randomPointInBox.js +7 -3
- package/core/geom/random/randomPointInPoint.js +6 -3
- package/core/geom/random/randomPointInSphere.js +6 -3
- package/core/geom/random/randomPointOnBox.js +7 -3
- package/core/geom/random/randomPointOnSphere.js +6 -3
- package/core/geom/v3_angle_between.js +31 -0
- package/core/geom/v3_distance.js +16 -0
- package/core/geom/v3_distance_sqr.js +17 -0
- package/core/geom/v3_dot.js +13 -0
- package/core/geom/v3_length.js +10 -0
- package/core/geom/v3_length_sqr.js +10 -0
- package/core/geom/v3_lerp.js +21 -0
- package/core/geom/v3_slerp.js +48 -0
- package/core/graph/graph_k_means_cluster.js +1 -1
- package/core/math/MathUtils.js +0 -354
- package/core/math/MathUtils.spec.js +7 -1
- package/core/math/gaussian.js +9 -0
- package/core/math/hash/computeHashFloat.js +17 -0
- package/core/math/hash/computeHashFloatArray.js +34 -0
- package/core/math/hash/computeObjectHash.js +54 -0
- package/core/math/intersects1D.js +19 -0
- package/core/math/interval/NumericInterval.js +2 -2
- package/core/math/isValueBetween.js +10 -0
- package/core/math/isValueBetweenInclusive.js +10 -0
- package/core/math/noise/curl_noise_3dt.js +1 -1
- package/core/math/noise/sdnoise.js +10 -10
- package/core/math/overlap1D.js +19 -0
- package/core/math/pingpong.js +17 -0
- package/core/math/random/makeRangedRandom.js +19 -0
- package/core/math/random/randomFloatBetween.js +14 -0
- package/core/math/random/randomFromArray.js +19 -0
- package/core/math/random/randomGaussian.js +15 -0
- package/core/math/random/randomIntegerBetween.js +14 -0
- package/core/math/random/roundFair.js +15 -0
- package/core/math/separation1D.js +21 -0
- package/core/math/solveQuadratic.js +25 -0
- package/core/model/BoundedValue.js +1 -1
- package/core/model/node-graph/node/NodeInstancePortReference.js +1 -1
- package/core/model/node-graph/node/Port.js +1 -1
- package/core/model/reactive/evaluation/MultiPredicateEvaluator.spec.js +3 -1
- package/core/model/reactive/model/ReactiveBinaryExpression.js +1 -1
- package/core/model/reactive/model/terminal/ReactiveLiteralNumber.js +1 -1
- package/core/model/reactive/model/terminal/ReactiveReference.js +1 -1
- package/core/model/reactive/model/util/createRandomReactiveExpression.js +1 -1
- package/core/model/stat/LinearModifier.js +1 -1
- package/core/primitives/array/computeIntegerArrayHash.js +6 -1
- package/engine/animation/curve/AnimationCurve.js +72 -0
- package/engine/animation/curve/Keyframe.js +27 -0
- package/engine/animation/keyed2/AnimationTrack.js +27 -3
- package/engine/asset/Asset.js +1 -1
- package/engine/asset/loaders/GLTFAssetLoader.d.ts +1 -1
- package/engine/asset/loaders/GLTFAssetLoader.js +10 -0
- package/engine/asset/loaders/image/ImageRGBADataAsset.js +8 -1
- package/engine/asset/loaders/material/computeImageBitmapEquality.js +11 -0
- package/engine/asset/loaders/material/computeImageBitmapHash.js +22 -28
- package/engine/asset/loaders/material/computeMaterialHash.js +4 -3
- package/engine/asset/loaders/material/computeTextureEquality.js +13 -5
- package/engine/asset/loaders/material/computeTextureHash.js +2 -1
- package/engine/ecs/animation/Animation.js +2 -1
- package/engine/ecs/animation/InverseKinematics.js +2 -1
- package/engine/ecs/animation/OneBoneSurfaceAlignmentSolver.js +3 -1
- package/engine/ecs/animation/TwoBoneInverseKinematicsSolver.js +3 -1
- package/engine/ecs/dynamic_actions/DynamicActorSystem.js +2 -1
- package/engine/ecs/dynamic_actions/DynamicRuleDescriptionTable.spec.js +3 -5
- package/engine/ecs/dynamic_actions/actions/definition/WeightedRandomActionDescription.js +1 -1
- package/engine/ecs/evaluation/complex/PointFitnessGaussianBlur.js +1 -1
- package/engine/ecs/foliage/ecs/Foliage2.js +1 -1
- package/engine/ecs/fow/FogOfWar.js +2 -3
- package/engine/ecs/fow/shader/FogOfWarRenderer.js +1 -1
- package/engine/ecs/gui/GUIElement.js +1 -1
- package/engine/ecs/gui/hud/HeadsUpDisplay.js +1 -1
- package/engine/ecs/gui/hud/HeadsUpDisplaySystem.js +1 -1
- package/engine/ecs/gui/position/ViewportPosition.js +2 -1
- package/engine/ecs/systems/RangedAttackSystem.js +1 -1
- package/engine/ecs/systems/SteeringSystem.js +3 -2
- package/engine/ecs/terrain/ecs/Terrain.js +6 -0
- package/engine/ecs/terrain/ecs/layers/TerrainLayers.js +5 -0
- package/engine/ecs/terrain/ecs/splat/SplatMapping.js +5 -0
- package/engine/ecs/terrain/tiles/TerrainTileManager.js +1 -1
- package/engine/ecs/tooltip/TooltipComponent.js +15 -0
- package/engine/ecs/util/hideEntityGracefully.js +18 -0
- package/engine/graphics/GraphicsEngine.js +1 -0
- package/engine/graphics/camera/testClippingPlaneComputation.js +2 -2
- package/engine/graphics/ecs/animation/animator/AnimationClip.js +2 -1
- package/engine/graphics/ecs/animation/animator/AnimationClipDefinition.js +2 -1
- package/engine/graphics/ecs/animation/animator/AnimationNotification.js +2 -1
- package/engine/graphics/ecs/animation/animator/AnimationNotificationDefinition.js +2 -1
- package/engine/graphics/ecs/animation/animator/graph/AnimationGraph.js +2 -1
- package/engine/graphics/ecs/animation/animator/graph/definition/AnimationGraphDefinition.js +2 -1
- package/engine/graphics/ecs/animation/animator/graph/definition/AnimationStateDefinition.js +1 -1
- package/engine/graphics/ecs/animation/animator/graph/definition/AnimationTransitionDefinition.js +2 -1
- package/engine/graphics/ecs/camera/CameraClippingPlaneComputer.js +2 -2
- package/engine/graphics/ecs/highlight/HighlightDefinition.js +2 -1
- package/engine/graphics/ecs/highlight/renderer/OutlineRenderer.js +0 -53
- package/engine/graphics/ecs/light/Light.d.ts +1 -1
- package/engine/graphics/ecs/light/Light.js +3 -0
- package/engine/graphics/ecs/mesh/Mesh.js +2 -1
- package/engine/graphics/ecs/mesh-v2/ShadedGeometry.d.ts +13 -0
- package/engine/graphics/ecs/mesh-v2/ShadedGeometrySystem.d.ts +6 -0
- package/engine/graphics/ecs/path/testPathDisplaySystem.js +98 -98
- package/engine/graphics/ecs/trail2d/Trail2D.js +17 -4
- package/engine/graphics/ecs/trail2d/Trail2DSystem.d.ts +2 -3
- package/engine/graphics/ecs/trail2d/Trail2DSystem.js +34 -118
- package/engine/graphics/geometry/AttributeSpec.js +105 -0
- package/engine/graphics/{micron/format/MicronVertexDataSpec.js → geometry/VertexDataSpec.js} +56 -25
- package/engine/graphics/geometry/bvh/buffered/BVHGeometryRaycaster.js +2 -1
- package/engine/graphics/micron/build/buildMicronGeometryFromBufferGeometry.js +7 -7
- package/engine/graphics/micron/build/clustering/computeFaceCurvatureScore.js +1 -1
- package/engine/graphics/micron/build/clustering/compute_face_connection_weight.js +1 -1
- package/engine/graphics/micron/build/fill_patch_geometry_data.js +1 -1
- package/engine/graphics/micron/build/hierarchy/computePatchMergeScore.js +1 -1
- package/engine/graphics/micron/build/hierarchy/patch_combine.js +1 -1
- package/engine/graphics/micron/buildPatchwork.js +1 -1
- package/engine/graphics/micron/format/MicronGeometry.js +3 -3
- package/engine/graphics/micron/format/serialization/MicronGeometryBinarySerializationAdapter.js +2 -2
- package/engine/graphics/micron/format/serialization/deserialize_attribute_spec.js +1 -1
- package/engine/graphics/micron/format/serialization/serialize_attribute_spec.js +1 -1
- package/engine/graphics/micron/render/PatchCacheKey.js +1 -1
- package/engine/graphics/micron/render/instanced/AttributeDataTexture.js +5 -5
- package/engine/graphics/micron/render/refinement/is_patch_facing_back.js +2 -2
- package/engine/graphics/micron/render/v1/ThreeVirtualGeometryAdapter.js +1 -1
- package/engine/graphics/particles/particular/engine/ParticularEngine.js +4 -2
- package/engine/graphics/particles/particular/engine/emitter/PARTICULAR_PARTICLE_SPECIFICATION.js +84 -0
- package/engine/graphics/particles/particular/engine/emitter/ParticleEmitter.js +92 -144
- package/engine/graphics/particles/particular/engine/emitter/ParticleLayer.js +14 -3
- package/engine/graphics/particles/particular/engine/emitter/ParticlePool.js +51 -12
- package/engine/graphics/particles/particular/engine/emitter/ParticlePool.spec.js +3 -2
- package/engine/graphics/particles/particular/engine/emitter/computeEmissionFunction.js +37 -0
- package/engine/graphics/particles/particular/engine/emitter/distance_to_camera.js +25 -0
- package/engine/graphics/particles/particular/engine/emitter/serde/ParameterLookupTableSerializationAdapter.js +8 -2
- package/engine/graphics/particles/particular/engine/parameter/ParameterLookupTable.js +2 -1
- package/engine/graphics/particles/particular/engine/parameter/ParameterTrack.js +1 -1
- package/engine/graphics/particles/particular/engine/parameter/ParticleParameter.js +1 -1
- package/engine/graphics/particles/particular/engine/renderers/billboard/BILLBOARD_PARTICLE_SPECIFICATION.js +21 -0
- package/engine/graphics/particles/particular/engine/renderers/billboard/ParticleBillboardMaterial.js +0 -20
- package/engine/graphics/particles/particular/engine/renderers/billboard/prototypeBillboardRenderer.js +9 -9
- package/engine/graphics/particles/particular/engine/shader/ShaderManager.js +7 -25
- package/engine/graphics/particles/particular/engine/simulator/SimulationStepApplyForce.js +2 -5
- package/engine/graphics/particles/particular/engine/simulator/SimulationStepCurlNoiseAcceleration.js +2 -6
- package/engine/graphics/particles/particular/engine/simulator/SimulationStepCurlNoiseVelocity.js +2 -7
- package/engine/graphics/particles/particular/engine/simulator/SimulationStepFixedPhysics.js +2 -5
- package/engine/graphics/particles/particular/engine/simulator/update_parameters.js +1 -1
- package/engine/graphics/particles/particular/engine/utils/distributeParticlesOnObject3D.js +1 -1
- package/engine/graphics/particles/particular/engine/utils/distrubuteParticlesOnMesh.js +1 -1
- package/engine/graphics/particles/particular/engine/utils/volume/ParticleVolume.js +384 -0
- package/engine/graphics/particles/particular/engine/utils/volume/prototypeParticleVolume.js +558 -0
- package/engine/graphics/particles/particular/group/Operation.js +18 -0
- package/engine/graphics/particles/particular/group/OperationType.js +9 -0
- package/engine/graphics/particles/particular/group/ParticleAttribute.js +2 -1
- package/engine/graphics/particles/particular/group/ParticleAttributeType.js +11 -0
- package/engine/graphics/particles/particular/group/ParticleDataType.js +10 -0
- package/engine/graphics/particles/particular/group/ParticleGroup.js +7 -245
- package/engine/graphics/particles/particular/group/ParticleGroup.spec.js +3 -1
- package/engine/graphics/particles/particular/group/ParticleSpecification.js +21 -14
- package/engine/graphics/particles/particular/group/itemSizeFromAttributeType.js +20 -0
- package/engine/graphics/particles/particular/group/optimizeCommandQueue.js +162 -0
- package/engine/graphics/particles/particular/group/typedArrayConstructorFromDataType.js +19 -0
- package/engine/graphics/render/buffer/buffers/prototypeNormalFrameBuffer.js +2 -2
- package/engine/graphics/render/buffer/simple-fx/ao/AmbientOcclusionPostProcessEffect.js +1 -1
- package/engine/graphics/render/buffer/slot/parameter/ProgramValueSlotParameter.js +2 -1
- package/engine/graphics/render/buffer/slot/parameter/ProgramValueSlotParameterSet.js +1 -1
- package/engine/graphics/render/forward_plus/LightManager.js +126 -95
- package/engine/graphics/render/forward_plus/PointLight.js +9 -0
- package/engine/graphics/render/forward_plus/PointLightData.js +1 -1
- package/engine/graphics/render/forward_plus/SpotLight.js +9 -0
- package/engine/graphics/render/forward_plus/cluster/compute_light_data_hash_0.js +2 -2
- package/engine/graphics/render/forward_plus/computeFrustumCorners.js +15 -33
- package/engine/graphics/render/forward_plus/plugin/ForwardPlusRenderingPlugin.js +1 -1
- package/engine/graphics/render/forward_plus/plugin/MaterialTransformer.js +12 -2
- package/engine/graphics/render/forward_plus/plugin/ptototypeFPPlugin.js +6 -6
- package/engine/graphics/render/forward_plus/prototypeLightManager.js +231 -136
- package/engine/graphics/render/forward_plus/query/analytical_triplanar_corner_mapping.js +8 -0
- package/engine/graphics/render/forward_plus/query/cube_mapping.js +38 -0
- package/engine/graphics/render/forward_plus/query/detailed_sphere_frustum_intersection_test.js +86 -0
- package/engine/graphics/render/forward_plus/query/point_light_inside_volume.js +73 -0
- package/engine/graphics/render/forward_plus/query/query_bvh_frustum_from_objects.js +131 -0
- package/engine/graphics/render/forward_plus/query/query_bvh_frustum_from_texture.js +129 -0
- package/engine/graphics/render/forward_plus/query/spot_light_inside_volume.js +33 -0
- package/engine/graphics/render/forward_plus/read_frustum_corner.js +14 -0
- package/engine/graphics/render/forward_plus/testClusterEquality.js +22 -0
- package/engine/graphics/render/layers/RenderLayerUtils.js +8 -5
- package/engine/graphics/render/visibility/IncrementalDeltaSet.js +11 -0
- package/engine/graphics/render/visibility/hiz/prototypeHiZ.js +2 -2
- package/engine/graphics/texture/atlas/AtlasPatch.js +7 -2
- package/engine/graphics/texture/atlas/TextureAtlas.js +18 -14
- package/engine/graphics/texture/sampler/HarmonicDiffusionGrid.spec.js +1 -1
- package/engine/graphics/texture/sampler/SampleTraverser.js +1 -1
- package/engine/graphics/texture/sampler/Sampler2D.js +8 -7
- package/engine/graphics/texture/sampler/distanceField.spec.js +1 -1
- package/engine/graphics/texture/sampler/scaleSampler2D.js +7 -10
- package/engine/graphics/trail/x/RibbonMaterialX.js +3 -3
- package/engine/graphics/trail/x/RibbonX.js +17 -2
- package/engine/graphics/trail/x/RibbonXPlugin.js +51 -1
- package/engine/graphics/util/projectSphere.js +1 -1
- package/engine/grid/components/GridObstacle.js +3 -10
- package/engine/intelligence/behavior/selector/WeightedElement.js +2 -1
- package/engine/intelligence/optimization/RandomOptimizer.js +1 -1
- package/engine/navigation/ecs/components/Path.js +3 -2
- package/engine/navigation/grid/FastBinaryHeap.spec.js +1 -1
- package/engine/reference/v2/Reference.js +6 -0
- package/engine/sound/ecs/emitter/SoundEmitter.js +2 -1
- package/engine/sound/ecs/emitter/SoundTrack.js +2 -1
- package/engine/sound/material/concrete/RandomSoundMaterial.js +1 -1
- package/engine/ui/notification/notificationGenerator.js +1 -1
- package/generation/filtering/numeric/complex/CellFilterAngleToNormal.js +3 -2
- package/generation/filtering/numeric/complex/CellFilterGaussianBlur.js +1 -1
- package/generation/grid/generation/GridTaskExecuteRuleTimes.js +2 -1
- package/generation/markers/GridCellActionPlaceMarker.js +13 -1
- package/generation/markers/MarkerNode.js +6 -0
- package/generation/markers/actions/MarkerNodeActionSelectRandom.js +1 -1
- package/generation/markers/transform/MarkerNodeTransformerRecordUniqueRandomEnum.js +1 -1
- package/generation/placement/action/random/CellActionSelectRandom.js +1 -1
- package/generation/theme/ThemeEngine.js +5 -2
- package/misc/makeMaterialIconCached.js +2 -2
- package/package.json +3 -3
- package/view/View.js +4 -2
- package/view/elements/image/HTMLElementCacheKey.js +2 -1
- package/view/elements/radial/RadialText.js +2 -1
- package/view/minimap/gl/MinimapMarkersGL.js +19 -101
- package/view/minimap/gl/buildMaterial.js +94 -0
- package/engine/graphics/micron/format/MicronGeometryBufferAttributeSpec.js +0 -71
- package/engine/graphics/render/forward_plus/queryBVH_Frustum.js +0 -345
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { computeHashFloat } from "./computeHashFloat.js";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
*
|
|
5
|
+
* @param {number[]|Float32Array|Float64Array} values
|
|
6
|
+
* @param {number} min
|
|
7
|
+
* @param {number} max
|
|
8
|
+
*/
|
|
9
|
+
export function computeHashFloatArray(values, min, max) {
|
|
10
|
+
const dataLength = values.length;
|
|
11
|
+
|
|
12
|
+
const dataRange = max - min;
|
|
13
|
+
|
|
14
|
+
/*
|
|
15
|
+
hash min and max
|
|
16
|
+
*/
|
|
17
|
+
const minHash = computeHashFloat(min);
|
|
18
|
+
const maxHash = computeHashFloat(min);
|
|
19
|
+
|
|
20
|
+
let hash = ((minHash << 5) - minHash) + maxHash;
|
|
21
|
+
|
|
22
|
+
for (let i = 0; i < dataLength; i++) {
|
|
23
|
+
const singleValue = values[i];
|
|
24
|
+
//normalize value
|
|
25
|
+
const valueNormalized = (singleValue - min) / dataRange;
|
|
26
|
+
//scale value to integer range
|
|
27
|
+
const integerValue = valueNormalized * 4294967295;
|
|
28
|
+
|
|
29
|
+
hash = ((hash << 5) - hash) + integerValue;
|
|
30
|
+
hash |= 0; // Convert to 32bit integer
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
return hash;
|
|
34
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { computeStringHash } from "../../primitives/strings/computeStringHash.js";
|
|
2
|
+
import { computeHashFloat } from "./computeHashFloat.js";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Recursively computes object hash
|
|
6
|
+
* @param {Object} value
|
|
7
|
+
* @param {number} [depth=3] Maximum recursion depth
|
|
8
|
+
* @returns {number}
|
|
9
|
+
*/
|
|
10
|
+
export function computeObjectHash(value, depth = 3) {
|
|
11
|
+
if (value === undefined) {
|
|
12
|
+
return 1;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
if (value === null) {
|
|
16
|
+
return 2;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
let hash = 0;
|
|
20
|
+
|
|
21
|
+
for (let p in value) {
|
|
22
|
+
|
|
23
|
+
hash = ((hash << 5) - hash) + computeStringHash(p);
|
|
24
|
+
|
|
25
|
+
const pValue = value[p];
|
|
26
|
+
|
|
27
|
+
const pType = typeof pValue;
|
|
28
|
+
|
|
29
|
+
let pHash;
|
|
30
|
+
if (pType === "string") {
|
|
31
|
+
pHash = computeStringHash(pValue);
|
|
32
|
+
} else if (pType === "number") {
|
|
33
|
+
pHash = computeHashFloat(pValue);
|
|
34
|
+
} else if (pType === "boolean") {
|
|
35
|
+
pHash = pValue ? 1 : 0;
|
|
36
|
+
} else if (pType === "object") {
|
|
37
|
+
|
|
38
|
+
if (depth <= 0) {
|
|
39
|
+
pHash = 3;
|
|
40
|
+
} else {
|
|
41
|
+
pHash = computeObjectHash(pValue, depth - 1);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
} else {
|
|
45
|
+
pHash = 0;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
hash = ((hash << 5) - hash) + pHash;
|
|
49
|
+
|
|
50
|
+
hash |= 0; // Convert to 32bit integer
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
return hash;
|
|
54
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { assert } from "../assert.js";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Returns true if two 1D lines intersect, touch is treated as intersection
|
|
5
|
+
* Parameters are assumed to be ordered, a1 >= a0, b1 >= b0
|
|
6
|
+
* @param {Number} a0
|
|
7
|
+
* @param {Number} a1
|
|
8
|
+
* @param {Number} b0
|
|
9
|
+
* @param {Number} b1
|
|
10
|
+
* @returns {boolean}
|
|
11
|
+
*/
|
|
12
|
+
export function intersects1D(a0, a1, b0, b1) {
|
|
13
|
+
assert.isNumber(a0, "a0");
|
|
14
|
+
assert.isNumber(a1, "a1");
|
|
15
|
+
assert.isNumber(b0, "b0");
|
|
16
|
+
assert.isNumber(b1, "b1");
|
|
17
|
+
|
|
18
|
+
return a1 >= b0 && b1 >= a0;
|
|
19
|
+
}
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
import { assert } from "../../assert.js";
|
|
8
8
|
import Signal from "../../events/signal/Signal.js";
|
|
9
9
|
import { inverseLerp } from "../inverseLerp.js";
|
|
10
|
-
import { computeHashFloat } from "../
|
|
10
|
+
import { computeHashFloat } from "../hash/computeHashFloat.js";
|
|
11
11
|
|
|
12
12
|
export class NumericInterval {
|
|
13
13
|
/**
|
|
@@ -61,7 +61,7 @@ export class NumericInterval {
|
|
|
61
61
|
this.max = max;
|
|
62
62
|
|
|
63
63
|
if (this.onChanged.hasHandlers()) {
|
|
64
|
-
this.onChanged.
|
|
64
|
+
this.onChanged.send4(min, max, oldMin, oldMax);
|
|
65
65
|
}
|
|
66
66
|
}
|
|
67
67
|
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Exclusive test, boundaries are not included in positive test
|
|
3
|
+
* @param {Number} value
|
|
4
|
+
* @param {Number} v0
|
|
5
|
+
* @param {Number} v1
|
|
6
|
+
* @returns {boolean}
|
|
7
|
+
*/
|
|
8
|
+
export function isValueBetween(value, v0, v1) {
|
|
9
|
+
return (v0 > value && value > v1) || (v1 > value && value > v0);
|
|
10
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Inclusive test, boundaries are included in positive test
|
|
3
|
+
* @param {Number} value
|
|
4
|
+
* @param {Number} v0
|
|
5
|
+
* @param {Number} v1
|
|
6
|
+
* @returns {boolean}
|
|
7
|
+
*/
|
|
8
|
+
export function isValueBetweenInclusive(value, v0, v1) {
|
|
9
|
+
return (v0 >= value && value >= v1) || (v1 >= value && value >= v0);
|
|
10
|
+
}
|
|
@@ -16,7 +16,7 @@ export function curl_noise_3dt(result, x, y, z, w) {
|
|
|
16
16
|
|
|
17
17
|
sdnoise3(p_x0, x + w, y, z);
|
|
18
18
|
sdnoise3(p_y0, x + 31.341, y - 43.23 + w, z + 12.34);
|
|
19
|
-
sdnoise3(p_z0, x - 231.141, y + 124.123, z
|
|
19
|
+
sdnoise3(p_z0, x - 231.141, y + 124.123, z - 54.4341 + w);
|
|
20
20
|
|
|
21
21
|
const _x = p_z0[1] - p_y0[2];
|
|
22
22
|
const _y = p_x0[2] - p_z0[0];
|
|
@@ -161,7 +161,7 @@ function grad2(result, hash) {
|
|
|
161
161
|
* @param {number[]} result
|
|
162
162
|
* @param {number} hash
|
|
163
163
|
*/
|
|
164
|
-
function grad3(result, hash
|
|
164
|
+
function grad3(result, hash) {
|
|
165
165
|
const h = hash & 15;
|
|
166
166
|
|
|
167
167
|
const h3 = h * 3;
|
|
@@ -253,8 +253,8 @@ function sdnoise1(derivatives, x) {
|
|
|
253
253
|
* F2 = 0.5*(sqrt(3.0)-1.0)
|
|
254
254
|
* G2 = (3.0-Math.sqrt(3.0))/6.0
|
|
255
255
|
*/
|
|
256
|
-
const F2 = .
|
|
257
|
-
const G2 = .
|
|
256
|
+
const F2 = 0.3660254037844386;
|
|
257
|
+
const G2 = 0.21132486540518713;
|
|
258
258
|
|
|
259
259
|
/** 2D simplex noise with derivatives.
|
|
260
260
|
* If the last two arguments are not null, the analytic derivative
|
|
@@ -398,8 +398,8 @@ function sdnoise2(derivatives, x, y) {
|
|
|
398
398
|
/* Skewing factors for 3D simplex grid:
|
|
399
399
|
* F3 = 1/3
|
|
400
400
|
* G3 = 1/6 */
|
|
401
|
-
const F3 = .
|
|
402
|
-
const G3 = .
|
|
401
|
+
const F3 = 0.3333333333333333;
|
|
402
|
+
const G3 = 0.16666666666666666;
|
|
403
403
|
|
|
404
404
|
|
|
405
405
|
/** 3D simplex noise with derivatives.
|
|
@@ -519,9 +519,9 @@ export function sdnoise3(derivatives, x, y, z) {
|
|
|
519
519
|
const z3 = z0 - 1.0 + G9;
|
|
520
520
|
|
|
521
521
|
/* Wrap the integer indices at 256, to avoid indexing perm[] out of bounds */
|
|
522
|
-
const ii = i
|
|
523
|
-
const jj = j
|
|
524
|
-
const kk = k
|
|
522
|
+
const ii = i & 255;
|
|
523
|
+
const jj = j & 255;
|
|
524
|
+
const kk = k & 255;
|
|
525
525
|
|
|
526
526
|
/* Calculate the contribution from the four corners */
|
|
527
527
|
t0 = 0.6 - x0 * x0 - y0 * y0 - z0 * z0;
|
|
@@ -652,8 +652,8 @@ export function sdnoise3(derivatives, x, y, z) {
|
|
|
652
652
|
}
|
|
653
653
|
|
|
654
654
|
// The skewing and unskewing factors are hairy again for the 4D case
|
|
655
|
-
const F4 = 0.
|
|
656
|
-
const G4 = 0.
|
|
655
|
+
const F4 = 0.30901699437494745;// F4 = (Math.sqrt(5.0)-1.0)/4.0
|
|
656
|
+
const G4 = 0.1381966011250105; // G4 = (5.0-Math.sqrt(5.0))/20.0
|
|
657
657
|
|
|
658
658
|
/**
|
|
659
659
|
* 4D simplex noise with derivatives.
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { assert } from "../assert.js";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Returns true if two 1D lines overlap, touch is not considered overlap
|
|
5
|
+
* Parameters are assumed to be ordered, a1 > a0, b1 > b0
|
|
6
|
+
* @param {Number} a0
|
|
7
|
+
* @param {Number} a1
|
|
8
|
+
* @param {Number} b0
|
|
9
|
+
* @param {Number} b1
|
|
10
|
+
* @returns {boolean}
|
|
11
|
+
*/
|
|
12
|
+
export function overlap1D(a0, a1, b0, b1) {
|
|
13
|
+
assert.isNumber(a0, "a0");
|
|
14
|
+
assert.isNumber(a1, "a1");
|
|
15
|
+
assert.isNumber(b0, "b0");
|
|
16
|
+
assert.isNumber(b1, "b1");
|
|
17
|
+
|
|
18
|
+
return a1 > b0 && b1 > a0;
|
|
19
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
// compute euclidian modulo of m % n
|
|
2
|
+
// https://en.wikipedia.org/wiki/Modulo_operation
|
|
3
|
+
function euclideanModulo(n, m) {
|
|
4
|
+
|
|
5
|
+
return ((n % m) + m) % m;
|
|
6
|
+
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
*
|
|
11
|
+
* @param {number} x
|
|
12
|
+
* @param {number} length
|
|
13
|
+
* @return {number}
|
|
14
|
+
*/
|
|
15
|
+
export function pingpong(x, length = 1) {
|
|
16
|
+
return length - Math.abs(euclideanModulo(x, length * 2) - length);
|
|
17
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
*
|
|
3
|
+
* @param {function():number} random returns a number between 0 and 1
|
|
4
|
+
* @param {number} min
|
|
5
|
+
* @param {number} max
|
|
6
|
+
* @returns {function():number} returns number between min and max
|
|
7
|
+
*/
|
|
8
|
+
export function makeRangedRandom(random, min, max) {
|
|
9
|
+
|
|
10
|
+
if (min === 0 && max === 1) {
|
|
11
|
+
//input already returns values in correct range
|
|
12
|
+
return random;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
const scale = max - min;
|
|
16
|
+
return function () {
|
|
17
|
+
return random() * scale + min;
|
|
18
|
+
};
|
|
19
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
*
|
|
3
|
+
* @param {function} random
|
|
4
|
+
* @param {number} min
|
|
5
|
+
* @param {number} max
|
|
6
|
+
* @returns {number}
|
|
7
|
+
*/
|
|
8
|
+
export function randomFloatBetween(random, min, max) {
|
|
9
|
+
const span = max - min;
|
|
10
|
+
|
|
11
|
+
const roll = random();
|
|
12
|
+
|
|
13
|
+
return roll * span + min;
|
|
14
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { assert } from "../../assert.js";
|
|
2
|
+
import { min2 } from "../min2.js";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* @template T
|
|
6
|
+
* @param {function} random
|
|
7
|
+
* @param {T[]} array
|
|
8
|
+
* @returns {T}
|
|
9
|
+
*/
|
|
10
|
+
export function randomFromArray(random, array) {
|
|
11
|
+
assert.isArray(array, 'array');
|
|
12
|
+
assert.isFunction(random, 'random');
|
|
13
|
+
|
|
14
|
+
const length = array.length;
|
|
15
|
+
|
|
16
|
+
const i = min2(length - 1, Math.floor(random() * length));
|
|
17
|
+
|
|
18
|
+
return array[i];
|
|
19
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Returns a random number within a normal distribution (Bell/Gaussian curve)
|
|
3
|
+
* @param {int} [quality=6] controls number of "die rolls" used to approximate curve, more rolls - better approximation but higher cost of computation
|
|
4
|
+
* @param {function():number} random
|
|
5
|
+
* @returns {number} value between 0 and 1 with normal weight at 0.5
|
|
6
|
+
*/
|
|
7
|
+
export function randomGaussian(random, quality = 6) {
|
|
8
|
+
let s = 0;
|
|
9
|
+
|
|
10
|
+
for (let i = 0; i < quality; i++) {
|
|
11
|
+
s += random();
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
return s / quality;
|
|
15
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Inclusive random between two boundaries, result is integer
|
|
3
|
+
* @param {function} random
|
|
4
|
+
* @param {number} min lower boundary, must be an integer
|
|
5
|
+
* @param {number} max upper boundary, must be an integer
|
|
6
|
+
* @returns {number}
|
|
7
|
+
*/
|
|
8
|
+
export function randomIntegerBetween(random, min, max) {
|
|
9
|
+
const span = max - min;
|
|
10
|
+
|
|
11
|
+
const roll = random();
|
|
12
|
+
|
|
13
|
+
return Math.round(roll * span) + min;
|
|
14
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Performs a probabilistic rounding where a fraction is rounded up or down with probability equal to the fraction
|
|
3
|
+
* @param {number} number
|
|
4
|
+
* @param {function} random
|
|
5
|
+
* @returns {int}
|
|
6
|
+
*/
|
|
7
|
+
export function roundFair(number, random) {
|
|
8
|
+
const mantissa = number % 1;
|
|
9
|
+
const roll = random();
|
|
10
|
+
if (roll < mantissa) {
|
|
11
|
+
return Math.ceil(number);
|
|
12
|
+
} else {
|
|
13
|
+
return Math.floor(number);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { assert } from "../assert.js";
|
|
2
|
+
import { min2 } from "./min2.js";
|
|
3
|
+
import { max2 } from "./max2.js";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Returns a number representing overlap distance between two 1D line segments.
|
|
7
|
+
* Positive number indicates overlap, negative number indicates that segments do not overlap; 0 indicates that segments are touching.
|
|
8
|
+
* @param {Number} a0
|
|
9
|
+
* @param {Number} a1
|
|
10
|
+
* @param {Number} b0
|
|
11
|
+
* @param {Number} b1
|
|
12
|
+
* @returns {number}
|
|
13
|
+
*/
|
|
14
|
+
export function separation1D(a0, a1, b0, b1) {
|
|
15
|
+
assert.isNumber(a0, "a0");
|
|
16
|
+
assert.isNumber(a1, "a1");
|
|
17
|
+
assert.isNumber(b0, "b0");
|
|
18
|
+
assert.isNumber(b1, "b1");
|
|
19
|
+
|
|
20
|
+
return min2(a1, b1) - max2(a0, b0);
|
|
21
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Return solutions for quadratic
|
|
3
|
+
* @param {number} a
|
|
4
|
+
* @param {number} b
|
|
5
|
+
* @param {number} c
|
|
6
|
+
* @returns {number[]|null}
|
|
7
|
+
*/
|
|
8
|
+
export function solveQuadratic(a, b, c) {
|
|
9
|
+
let sol = null;
|
|
10
|
+
if (Math.abs(a) < 1e-6) {
|
|
11
|
+
if (Math.abs(b) < 1e-6) {
|
|
12
|
+
sol = Math.abs(c) < 1e-6 ? [0, 0] : null;
|
|
13
|
+
} else {
|
|
14
|
+
sol = [-c / b, -c / b];
|
|
15
|
+
}
|
|
16
|
+
} else {
|
|
17
|
+
let disc = b * b - 4 * a * c;
|
|
18
|
+
if (disc >= 0) {
|
|
19
|
+
disc = Math.sqrt(disc);
|
|
20
|
+
a = 2 * a;
|
|
21
|
+
sol = [(-b - disc) / a, (-b + disc) / a];
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
return sol;
|
|
25
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { computeHashIntegerArray } from "../../../math/MathUtils.js";
|
|
2
1
|
import { computeStringHash } from "../../../primitives/strings/computeStringHash.js";
|
|
3
2
|
import { PortDirection } from "./PortDirection.js";
|
|
3
|
+
import { computeHashIntegerArray } from "../../../collection/array/computeHashIntegerArray.js";
|
|
4
4
|
|
|
5
5
|
export class Port {
|
|
6
6
|
constructor() {
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { randomFloatBetween, randomFromArray, randomIntegerBetween } from "../../../math/MathUtils.js";
|
|
2
1
|
import { seededRandom } from "../../../math/random/seededRandom.js";
|
|
3
2
|
import DataType from "../../../parser/simple/DataType.js";
|
|
4
3
|
import { ReactiveLiteralBoolean } from "../model/terminal/ReactiveLiteralBoolean.js";
|
|
@@ -7,6 +6,9 @@ import { ReactiveLiteralString } from "../model/terminal/ReactiveLiteralString.j
|
|
|
7
6
|
import { ReactiveReference } from "../model/terminal/ReactiveReference.js";
|
|
8
7
|
import { createRandomReactiveExpression } from "../model/util/createRandomReactiveExpression.js";
|
|
9
8
|
import { MultiPredicateEvaluator } from "./MultiPredicateEvaluator.js";
|
|
9
|
+
import { randomFromArray } from "../../../math/random/randomFromArray.js";
|
|
10
|
+
import { randomFloatBetween } from "../../../math/random/randomFloatBetween.js";
|
|
11
|
+
import { randomIntegerBetween } from "../../../math/random/randomIntegerBetween.js";
|
|
10
12
|
|
|
11
13
|
test.skip('performance', () => {
|
|
12
14
|
const random = seededRandom(12319);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { assert } from "../../../assert.js";
|
|
2
|
-
import { computeHashIntegerArray } from "../../../math/MathUtils.js";
|
|
3
2
|
import { ReactiveExpression } from "./ReactiveExpression.js";
|
|
3
|
+
import { computeHashIntegerArray } from "../../../collection/array/computeHashIntegerArray.js";
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* @extends {ReactiveExpression}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { assert } from "../../../../assert.js";
|
|
2
2
|
import Signal from "../../../../events/signal/Signal.js";
|
|
3
|
-
import { computeHashFloat } from "../../../../math/MathUtils.js";
|
|
4
3
|
import DataType from "../../../../parser/simple/DataType.js";
|
|
5
4
|
import { ReactiveExpression } from "../ReactiveExpression.js";
|
|
5
|
+
import { computeHashFloat } from "../../../../math/hash/computeHashFloat.js";
|
|
6
6
|
|
|
7
7
|
const dummySignal = new Signal();
|
|
8
8
|
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { assert } from "../../../../assert.js";
|
|
2
|
-
import { computeHashIntegerArray } from "../../../../math/MathUtils.js";
|
|
3
2
|
import DataType from "../../../../parser/simple/DataType.js";
|
|
4
3
|
import { computeStringHash } from "../../../../primitives/strings/computeStringHash.js";
|
|
5
4
|
import { ReactiveExpression } from "../ReactiveExpression.js";
|
|
5
|
+
import { computeHashIntegerArray } from "../../../../collection/array/computeHashIntegerArray.js";
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|
/**
|
|
@@ -4,7 +4,6 @@
|
|
|
4
4
|
* @param {ReactiveExpression} b
|
|
5
5
|
* @returns {ReactiveExpression}
|
|
6
6
|
*/
|
|
7
|
-
import { randomFromArray } from "../../../../math/MathUtils.js";
|
|
8
7
|
import DataType from "../../../../parser/simple/DataType.js";
|
|
9
8
|
import { ReactiveAdd } from "../arithmetic/ReactiveAdd.js";
|
|
10
9
|
import { ReactiveDivide } from "../arithmetic/ReactiveDivide.js";
|
|
@@ -20,6 +19,7 @@ import { ReactiveAnd } from "../logic/ReactiveAnd.js";
|
|
|
20
19
|
import { ReactiveOr } from "../logic/ReactiveOr.js";
|
|
21
20
|
import { ReactiveLiteralNumber } from "../terminal/ReactiveLiteralNumber.js";
|
|
22
21
|
import { ReactiveLiteralString } from "../terminal/ReactiveLiteralString.js";
|
|
22
|
+
import { randomFromArray } from "../../../../math/random/randomFromArray.js";
|
|
23
23
|
|
|
24
24
|
/**
|
|
25
25
|
*
|
|
@@ -7,10 +7,15 @@
|
|
|
7
7
|
export function computeIntegerArrayHash(data, offset, length) {
|
|
8
8
|
const end = offset + length;
|
|
9
9
|
|
|
10
|
-
let hash =
|
|
10
|
+
let hash = length;
|
|
11
11
|
|
|
12
12
|
for (let i = offset; i < end; i++) {
|
|
13
13
|
const singleValue = data[i];
|
|
14
|
+
/**
|
|
15
|
+
* Simple hashing scheme, multiplying existing hash by a prime and adding next value
|
|
16
|
+
* (h<<5) - h === h*31
|
|
17
|
+
* @type {number}
|
|
18
|
+
*/
|
|
14
19
|
hash = ((hash << 5) - hash) + singleValue;
|
|
15
20
|
hash |= 0; // Convert to 32bit integer
|
|
16
21
|
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { inverseLerp } from "../../../core/math/inverseLerp.js";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
*
|
|
5
|
+
* @param {number} t
|
|
6
|
+
* @param {Keyframe} keyframe0
|
|
7
|
+
* @param {Keyframe} keyframe1
|
|
8
|
+
* @return {number}
|
|
9
|
+
*/
|
|
10
|
+
function evaluate(t, keyframe0, keyframe1) {
|
|
11
|
+
|
|
12
|
+
const dt = keyframe1.time - keyframe0.time;
|
|
13
|
+
|
|
14
|
+
const m0 = keyframe0.outTangent * dt;
|
|
15
|
+
const m1 = keyframe1.inTangent * dt;
|
|
16
|
+
|
|
17
|
+
const t2 = t * t;
|
|
18
|
+
const t3 = t2 * t;
|
|
19
|
+
|
|
20
|
+
const a = 2 * t3 - 3 * t2 + 1;
|
|
21
|
+
const b = t3 - 2 * t2 + t;
|
|
22
|
+
const c = t3 - t2;
|
|
23
|
+
const d = -2 * t3 + 3 * t2;
|
|
24
|
+
|
|
25
|
+
return a * keyframe0.value + b * m0 + c * m1 + d * keyframe1.value;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Modelled on unity's AnimationCurve
|
|
30
|
+
* @see https://github.com/nothke/ThreadableCurve/blob/master/ThreadableCurve.cs
|
|
31
|
+
*/
|
|
32
|
+
export class AnimationCurve {
|
|
33
|
+
constructor() {
|
|
34
|
+
/**
|
|
35
|
+
*
|
|
36
|
+
* @type {Keyframe[]}
|
|
37
|
+
*/
|
|
38
|
+
this.keys = [];
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
evaluate(t) {
|
|
42
|
+
const keys = this.keys;
|
|
43
|
+
const key_count = keys.length;
|
|
44
|
+
if (key_count === 0) {
|
|
45
|
+
return 0;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
if (key_count === 1) {
|
|
49
|
+
return keys[0].value;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
if (t < keys[0].time) {
|
|
53
|
+
// before start
|
|
54
|
+
return keys[0].value;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
for (let i = 1; i < key_count; i++) {
|
|
58
|
+
const f1 = keys[i];
|
|
59
|
+
|
|
60
|
+
if (t < f1.time) {
|
|
61
|
+
const f0 = keys[i - 1];
|
|
62
|
+
const kt = inverseLerp(f0.time, f1.time, t);
|
|
63
|
+
|
|
64
|
+
return evaluate(kt, f0, f1);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// past end
|
|
69
|
+
return keys[key_count - 1].value;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export class Keyframe {
|
|
2
|
+
constructor() {
|
|
3
|
+
/**
|
|
4
|
+
*
|
|
5
|
+
* @type {number}
|
|
6
|
+
*/
|
|
7
|
+
this.value = 0;
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
*
|
|
11
|
+
* @type {number}
|
|
12
|
+
*/
|
|
13
|
+
this.time = 0;
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
*
|
|
17
|
+
* @type {number}
|
|
18
|
+
*/
|
|
19
|
+
this.inTangent = 0;
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
*
|
|
23
|
+
* @type {number}
|
|
24
|
+
*/
|
|
25
|
+
this.outTangent = 0;
|
|
26
|
+
}
|
|
27
|
+
}
|