@woosh/meep-engine 2.33.21 → 2.33.25

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/ThreeClippingPlaneComputingBVHVisitor.js +5 -1
  9. package/core/bvh2/traversal/__detailed_box_volume_intersection.js +31 -11
  10. package/core/collection/ArrayUtils.js +1 -1
  11. package/core/collection/array/arrayQuickSort.js +9 -6
  12. package/core/collection/array/array_swap.js +22 -0
  13. package/core/collection/array/binarySearchHighIndex.js +1 -1
  14. package/core/collection/array/computeHashArray.js +22 -0
  15. package/core/collection/array/computeHashIntegerArray.js +15 -0
  16. package/core/collection/array/copyArray.js +2 -2
  17. package/core/collection/table/DataType2TypedArrayConstructorMapping.js +15 -0
  18. package/core/color/Color.js +2 -1
  19. package/core/function/FunctionCompiler.js +2 -1
  20. package/core/geom/3d/aabb/aabb3_computeDistanceAbovePlane.js +9 -33
  21. package/core/geom/3d/frustum/frustum3_computeNearestPointToPoint.js +10 -2
  22. package/core/geom/3d/line/line3_computeSegmentPointDistance_sqr.js +41 -0
  23. package/core/geom/3d/morton/mortonEncode_magicbits.js +2 -1
  24. package/core/geom/3d/morton/reinterpret_float32_as_int32.js +13 -0
  25. package/core/geom/3d/morton/v3_morton_encode_transformed.js +33 -0
  26. package/core/geom/3d/normal/hemioct/unit_hemioct.spec.js +1 -1
  27. package/core/geom/3d/plane/plane_computeConvex3PlaneIntersection.js +13 -14
  28. package/core/geom/3d/ray/ray_computeNearestPointToPoint.js +37 -0
  29. package/core/geom/3d/shape/AbstractShape3D.js +38 -0
  30. package/core/geom/3d/shape/CompositeShape.js +240 -0
  31. package/core/geom/3d/shape/TransformedShape3D.js +126 -0
  32. package/core/geom/3d/shape/UnitCubeShape3D.js +24 -0
  33. package/core/geom/3d/shape/UnitSphereShape3D.js +24 -0
  34. package/core/geom/3d/shape/util/shape_to_visual_entity.js +159 -0
  35. package/core/geom/3d/voxel/DenseBitVolume3D.js +87 -0
  36. package/core/geom/3d/voxel/buildVolumeFromProjectedGeometry.js +23 -0
  37. package/core/geom/AABB2.js +1 -1
  38. package/core/geom/ConicRay.js +3 -1
  39. package/core/geom/LineSegment.js +0 -78
  40. package/core/geom/Matrix4.js +7 -8
  41. package/core/geom/Plane.js +14 -9
  42. package/core/geom/Rectangle.js +2 -1
  43. package/core/geom/Vector1.js +1 -1
  44. package/core/geom/Vector3.js +2 -1
  45. package/core/geom/Vector4.js +2 -1
  46. package/core/geom/random/randomPointInBox.js +7 -3
  47. package/core/geom/random/randomPointInPoint.js +6 -3
  48. package/core/geom/random/randomPointInSphere.js +9 -5
  49. package/core/geom/random/randomPointOnBox.js +7 -3
  50. package/core/geom/random/randomPointOnSphere.js +6 -3
  51. package/core/geom/v3_length.js +8 -3
  52. package/core/graph/graph_k_means_cluster.js +1 -1
  53. package/core/json/resolvePathByArray.js +2 -2
  54. package/core/math/MathUtils.js +0 -354
  55. package/core/math/MathUtils.spec.js +7 -1
  56. package/core/math/gaussian.js +9 -0
  57. package/core/math/hash/computeHashFloat.js +17 -0
  58. package/core/math/hash/computeHashFloatArray.js +34 -0
  59. package/core/math/hash/computeObjectHash.js +54 -0
  60. package/core/math/intersects1D.js +19 -0
  61. package/core/math/interval/NumericInterval.js +2 -2
  62. package/core/math/isValueBetween.js +10 -0
  63. package/core/math/isValueBetweenInclusive.js +10 -0
  64. package/core/math/noise/curl_noise_3dt.js +1 -1
  65. package/core/math/noise/sdnoise.js +10 -10
  66. package/core/math/overlap1D.js +19 -0
  67. package/core/math/pingpong.js +17 -0
  68. package/core/math/random/makeRangedRandom.js +19 -0
  69. package/core/math/random/randomFloatBetween.js +14 -0
  70. package/core/math/random/randomFromArray.js +19 -0
  71. package/core/math/random/randomGaussian.js +15 -0
  72. package/core/math/random/randomIntegerBetween.js +14 -0
  73. package/core/math/random/roundFair.js +15 -0
  74. package/core/math/separation1D.js +21 -0
  75. package/core/math/solveQuadratic.js +25 -0
  76. package/core/model/BoundedValue.js +1 -1
  77. package/core/model/node-graph/node/NodeInstancePortReference.js +1 -1
  78. package/core/model/node-graph/node/Port.js +1 -1
  79. package/core/model/reactive/evaluation/MultiPredicateEvaluator.spec.js +3 -1
  80. package/core/model/reactive/model/ReactiveBinaryExpression.js +1 -1
  81. package/core/model/reactive/model/terminal/ReactiveLiteralNumber.js +1 -1
  82. package/core/model/reactive/model/terminal/ReactiveReference.js +1 -1
  83. package/core/model/reactive/model/util/createRandomReactiveExpression.js +1 -1
  84. package/core/model/stat/LinearModifier.js +1 -1
  85. package/core/primitives/array/computeIntegerArrayHash.js +1 -1
  86. package/{engine/graphics/render/forward_plus/materials → core/primitives/strings}/insert_after.js +3 -0
  87. package/core/primitives/strings/insert_after_or_replace.js +27 -0
  88. package/editor/process/symbolic/makeHelperBoxGeometry.js +44 -0
  89. package/editor/view/ecs/EntityEditor.js +2 -2
  90. package/editor/view/ecs/components/particles/ParticleEmitterController.js +2 -2
  91. package/engine/EngineHarness.js +1 -0
  92. package/engine/animation/AnimationUtils.js +5 -5
  93. package/engine/animation/curve/AnimationCurve.js +72 -0
  94. package/engine/animation/curve/Keyframe.js +27 -0
  95. package/engine/animation/keyed2/AnimationTrack.js +27 -3
  96. package/engine/asset/Asset.js +1 -1
  97. package/engine/asset/loaders/GLTFAssetLoader.d.ts +1 -1
  98. package/engine/asset/loaders/GLTFAssetLoader.js +10 -0
  99. package/engine/asset/loaders/image/ImageRGBADataAsset.js +8 -1
  100. package/engine/asset/loaders/material/computeImageBitmapEquality.js +11 -0
  101. package/engine/asset/loaders/material/computeImageBitmapHash.js +22 -28
  102. package/engine/asset/loaders/material/computeMaterialHash.js +3 -1
  103. package/engine/asset/loaders/material/computeTextureHash.js +2 -1
  104. package/engine/ecs/EntityBuilder.js +25 -5
  105. package/engine/ecs/animation/Animation.js +2 -1
  106. package/engine/ecs/animation/InverseKinematics.js +2 -1
  107. package/engine/ecs/attachment/AttachmentBinding.js +8 -0
  108. package/engine/ecs/attachment/AttachmentSystem.js +4 -0
  109. package/engine/ecs/attachment/TransformAttachmentBinding.js +14 -44
  110. package/engine/ecs/components/Tag.js +27 -6
  111. package/engine/ecs/dynamic_actions/DynamicActorSystem.js +2 -1
  112. package/engine/ecs/dynamic_actions/DynamicRuleDescriptionTable.spec.js +3 -5
  113. package/engine/ecs/dynamic_actions/actions/definition/WeightedRandomActionDescription.js +1 -1
  114. package/engine/ecs/evaluation/complex/PointFitnessGaussianBlur.js +1 -1
  115. package/engine/ecs/foliage/ecs/Foliage2.js +1 -1
  116. package/engine/ecs/fow/FogOfWar.js +4 -0
  117. package/engine/ecs/fow/FogOfWarSystem.js +2 -0
  118. package/engine/ecs/fow/shader/FogOfWarRenderer.js +1 -1
  119. package/engine/ecs/gui/GUIElement.js +1 -1
  120. package/engine/ecs/gui/hud/HeadsUpDisplay.js +1 -1
  121. package/engine/ecs/gui/hud/HeadsUpDisplaySystem.js +2 -0
  122. package/engine/ecs/gui/position/ViewportPosition.js +2 -1
  123. package/engine/ecs/system/AbstractContextSystem.js +1 -1
  124. package/engine/ecs/systems/RangedAttackSystem.js +1 -1
  125. package/engine/ecs/systems/SteeringSystem.js +1 -1
  126. package/engine/ecs/systems/TagSystem.js +17 -0
  127. package/engine/ecs/terrain/tiles/TerrainTileManager.js +1 -1
  128. package/engine/ecs/tooltip/TooltipComponent.js +15 -0
  129. package/engine/ecs/transform/Transform.js +19 -6
  130. package/engine/ecs/util/hideEntityGracefully.js +18 -0
  131. package/engine/graphics/GraphicsEngine.js +11 -23
  132. package/engine/graphics/camera/testClippingPlaneComputation.js +2 -2
  133. package/engine/graphics/composit/CompositLayer.js +17 -4
  134. package/engine/graphics/composit/CompositingStages.js +8 -0
  135. package/engine/graphics/composit/LayerCompositer.js +35 -6
  136. package/engine/graphics/ecs/animation/animator/AnimationClip.js +2 -1
  137. package/engine/graphics/ecs/animation/animator/AnimationClipDefinition.js +2 -1
  138. package/engine/graphics/ecs/animation/animator/AnimationNotification.js +2 -1
  139. package/engine/graphics/ecs/animation/animator/AnimationNotificationDefinition.js +2 -1
  140. package/engine/graphics/ecs/animation/animator/graph/AnimationGraph.js +2 -1
  141. package/engine/graphics/ecs/animation/animator/graph/definition/AnimationGraphDefinition.js +2 -1
  142. package/engine/graphics/ecs/animation/animator/graph/definition/AnimationStateDefinition.js +1 -1
  143. package/engine/graphics/ecs/animation/animator/graph/definition/AnimationTransitionDefinition.js +2 -1
  144. package/engine/graphics/ecs/camera/CameraClippingPlaneComputer.js +1 -1
  145. package/engine/graphics/ecs/highlight/HighlightDefinition.js +2 -1
  146. package/engine/graphics/ecs/highlight/plugin/OutlineRenderPlugin.js +11 -7
  147. package/engine/graphics/ecs/light/Light.d.ts +1 -1
  148. package/engine/graphics/ecs/light/Light.js +5 -0
  149. package/engine/graphics/ecs/light/binding/three/ThreeLightBinding.js +5 -1
  150. package/engine/graphics/ecs/mesh/Mesh.js +2 -1
  151. package/engine/graphics/ecs/mesh-v2/DrawMode.js +5 -0
  152. package/engine/graphics/ecs/mesh-v2/ShadedGeometry.d.ts +13 -0
  153. package/engine/graphics/ecs/mesh-v2/ShadedGeometry.js +32 -18
  154. package/engine/graphics/ecs/mesh-v2/ShadedGeometrySystem.d.ts +6 -0
  155. package/engine/graphics/ecs/path/testPathDisplaySystem.js +98 -98
  156. package/engine/graphics/ecs/trail2d/Trail2D.js +17 -4
  157. package/engine/graphics/ecs/trail2d/Trail2DSystem.d.ts +2 -3
  158. package/engine/graphics/ecs/trail2d/Trail2DSystem.js +34 -118
  159. package/engine/graphics/geometry/AttributeSpec.js +105 -0
  160. package/engine/graphics/{micron/format/MicronVertexDataSpec.js → geometry/VertexDataSpec.js} +56 -25
  161. package/engine/graphics/micron/build/buildMicronGeometryFromBufferGeometry.js +7 -7
  162. package/engine/graphics/micron/build/fill_patch_geometry_data.js +1 -1
  163. package/engine/graphics/micron/buildPatchwork.js +1 -1
  164. package/engine/graphics/micron/format/MicronGeometry.js +3 -3
  165. package/engine/graphics/micron/format/serialization/MicronGeometryBinarySerializationAdapter.js +2 -2
  166. package/engine/graphics/micron/format/serialization/deserialize_attribute_spec.js +1 -1
  167. package/engine/graphics/micron/format/serialization/serialize_attribute_spec.js +1 -1
  168. package/engine/graphics/micron/render/PatchCacheKey.js +1 -1
  169. package/engine/graphics/micron/render/instanced/AttributeDataTexture.js +5 -5
  170. package/engine/graphics/micron/render/v1/ThreeVirtualGeometryAdapter.js +1 -1
  171. package/engine/graphics/particles/ParticleEmitterLibrary.js +3 -0
  172. package/engine/graphics/particles/ecs/{ParticleEmitterSystem2.js → ParticleEmitterSystem.js} +17 -9
  173. package/engine/graphics/particles/particular/engine/ParticularEngine.js +12 -4
  174. package/engine/graphics/particles/particular/engine/emitter/PARTICULAR_PARTICLE_SPECIFICATION.js +84 -0
  175. package/engine/graphics/particles/particular/engine/emitter/ParticleEmitter.js +106 -169
  176. package/engine/graphics/particles/particular/engine/emitter/ParticleEmitterFlag.js +5 -0
  177. package/engine/graphics/particles/particular/engine/emitter/ParticleLayer.js +14 -3
  178. package/engine/graphics/particles/particular/engine/emitter/ParticlePool.js +141 -14
  179. package/engine/graphics/particles/particular/engine/emitter/ParticlePool.spec.js +8 -7
  180. package/engine/graphics/particles/particular/engine/emitter/computeEmissionFunction.js +37 -0
  181. package/engine/graphics/particles/particular/engine/emitter/distance_to_camera.js +25 -0
  182. package/engine/graphics/particles/particular/engine/emitter/serde/ParameterLookupTableSerializationAdapter.js +8 -2
  183. package/engine/graphics/particles/particular/engine/parameter/ParameterLookupTable.js +2 -1
  184. package/engine/graphics/particles/particular/engine/parameter/ParameterTrack.js +1 -1
  185. package/engine/graphics/particles/particular/engine/parameter/ParticleParameter.js +1 -1
  186. package/engine/graphics/particles/particular/engine/renderers/billboard/BILLBOARD_PARTICLE_SPECIFICATION.js +24 -0
  187. package/engine/graphics/particles/particular/engine/renderers/billboard/ParticleBillboardMaterial.js +262 -71
  188. package/engine/graphics/particles/particular/engine/renderers/billboard/prototypeBillboardRenderer.js +9 -9
  189. package/engine/graphics/particles/particular/engine/shader/ShaderManager.js +80 -46
  190. package/engine/graphics/particles/particular/engine/shader/debugAtlas.js +14 -0
  191. package/engine/graphics/particles/particular/engine/simulator/SimulationStepApplyForce.js +2 -5
  192. package/engine/graphics/particles/particular/engine/simulator/SimulationStepCurlNoiseAcceleration.js +2 -6
  193. package/engine/graphics/particles/particular/engine/simulator/SimulationStepCurlNoiseVelocity.js +2 -7
  194. package/engine/graphics/particles/particular/engine/simulator/SimulationStepFixedPhysics.js +2 -5
  195. package/engine/graphics/particles/particular/engine/simulator/update_parameters.js +1 -1
  196. package/engine/graphics/particles/particular/engine/utils/distributeParticlesOnObject3D.js +1 -1
  197. package/engine/graphics/particles/particular/engine/utils/distrubuteParticlesOnMesh.js +1 -1
  198. package/engine/graphics/particles/particular/engine/utils/volume/AttributeValue.js +141 -0
  199. package/engine/graphics/particles/particular/engine/utils/volume/ParticleVolume.js +478 -0
  200. package/engine/graphics/particles/particular/engine/utils/volume/lut_to_sampler.js +27 -0
  201. package/engine/graphics/particles/particular/engine/utils/volume/prototypeParticleVolume.js +935 -0
  202. package/engine/graphics/particles/particular/group/Operation.js +18 -0
  203. package/engine/graphics/particles/particular/group/OperationType.js +9 -0
  204. package/engine/graphics/particles/particular/group/ParticleAttribute.js +2 -1
  205. package/engine/graphics/particles/particular/group/ParticleAttributeType.js +11 -0
  206. package/engine/graphics/particles/particular/group/ParticleDataType.js +10 -0
  207. package/engine/graphics/particles/particular/group/ParticleGroup.js +7 -245
  208. package/engine/graphics/particles/particular/group/ParticleGroup.spec.js +3 -1
  209. package/engine/graphics/particles/particular/group/ParticleSpecification.js +21 -14
  210. package/engine/graphics/particles/particular/group/itemSizeFromAttributeType.js +20 -0
  211. package/engine/graphics/particles/particular/group/optimizeCommandQueue.js +162 -0
  212. package/engine/graphics/particles/particular/group/typedArrayConstructorFromDataType.js +19 -0
  213. package/engine/graphics/render/buffer/buffers/prototypeNormalFrameBuffer.js +2 -2
  214. package/engine/graphics/render/buffer/simple-fx/ao/AmbientOcclusionPostProcessEffect.js +13 -7
  215. package/engine/graphics/render/buffer/slot/parameter/ProgramValueSlotParameter.js +2 -1
  216. package/engine/graphics/render/buffer/slot/parameter/ProgramValueSlotParameterSet.js +1 -1
  217. package/engine/graphics/render/forward_plus/LightManager.js +126 -95
  218. package/engine/graphics/render/forward_plus/PointLight.js +9 -0
  219. package/engine/graphics/render/forward_plus/PointLightData.js +1 -1
  220. package/engine/graphics/render/forward_plus/SpotLight.js +9 -0
  221. package/engine/graphics/render/forward_plus/cluster/compute_light_data_hash_0.js +2 -2
  222. package/engine/graphics/render/forward_plus/computeFrustumCorners.js +14 -32
  223. package/engine/graphics/render/forward_plus/materials/FP_INJECTION_POINT_ACCUMULATION.js +1 -0
  224. package/engine/graphics/render/forward_plus/materials/FP_SHADER_CHUNK_ACCUMULATION.js +32 -0
  225. package/engine/graphics/render/forward_plus/materials/FP_SHADER_CHUNK_DECODE_PARS.js +51 -0
  226. package/engine/graphics/render/forward_plus/materials/FP_SHADER_CHUNK_PREAMBLE.js +25 -0
  227. package/engine/graphics/render/forward_plus/materials/fp_build_fragment_shader.js +31 -120
  228. package/engine/graphics/render/forward_plus/materials/fp_build_vertex_lighting_shared.js +35 -0
  229. package/engine/graphics/render/forward_plus/materials/fp_build_vertex_shader.js +4 -5
  230. package/engine/graphics/render/forward_plus/plugin/ForwardPlusRenderingPlugin.js +1 -1
  231. package/engine/graphics/render/forward_plus/plugin/MaterialTransformer.js +10 -3
  232. package/engine/graphics/render/forward_plus/plugin/ptototypeFPPlugin.js +595 -60
  233. package/engine/graphics/render/forward_plus/prototypeLightManager.js +256 -136
  234. package/engine/graphics/render/forward_plus/query/analytical_triplanar_corner_mapping.js +8 -0
  235. package/engine/graphics/render/forward_plus/query/cube_mapping.js +38 -0
  236. package/engine/graphics/render/forward_plus/query/detailed_sphere_frustum_intersection_test.js +86 -0
  237. package/engine/graphics/render/forward_plus/query/point_light_inside_volume.js +73 -0
  238. package/engine/graphics/render/forward_plus/query/query_bvh_frustum_from_objects.js +131 -0
  239. package/engine/graphics/render/forward_plus/query/query_bvh_frustum_from_texture.js +129 -0
  240. package/engine/graphics/render/forward_plus/query/spot_light_inside_volume.js +33 -0
  241. package/engine/graphics/render/forward_plus/read_frustum_corner.js +14 -0
  242. package/engine/graphics/render/forward_plus/testClusterEquality.js +22 -0
  243. package/engine/graphics/render/layers/RenderLayerUtils.js +7 -4
  244. package/engine/graphics/render/visibility/IncrementalDeltaSet.js +11 -0
  245. package/engine/graphics/render/visibility/hiz/prototypeHiZ.js +2 -2
  246. package/engine/graphics/shaders/TerrainShader.js +4 -5
  247. package/engine/graphics/texture/atlas/AtlasPatch.js +7 -2
  248. package/engine/graphics/texture/atlas/TextureAtlas.js +2 -2
  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/composeMatrix4.js +33 -23
  258. package/engine/graphics/util/decompose_matrix_4_array.js +61 -0
  259. package/engine/grid/components/GridObstacle.js +3 -10
  260. package/engine/intelligence/behavior/ecs/BehaviorComponent.js +30 -14
  261. package/engine/intelligence/behavior/selector/WeightedElement.js +2 -1
  262. package/engine/intelligence/optimization/RandomOptimizer.js +1 -1
  263. package/engine/knowledge/database/StaticKnowledgeDataTable.js +6 -1
  264. package/engine/navigation/ecs/components/Path.js +1 -6
  265. package/engine/navigation/grid/FastBinaryHeap.spec.js +1 -1
  266. package/engine/reference/v2/Reference.js +6 -0
  267. package/engine/sound/ecs/emitter/SoundEmitter.js +2 -1
  268. package/engine/sound/ecs/emitter/SoundTrack.js +2 -1
  269. package/engine/sound/material/concrete/RandomSoundMaterial.js +1 -1
  270. package/engine/ui/notification/notificationGenerator.js +1 -1
  271. package/generation/filtering/numeric/complex/CellFilterGaussianBlur.js +1 -1
  272. package/generation/grid/generation/GridTaskExecuteRuleTimes.js +2 -1
  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 +2 -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 +6 -100
  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
@@ -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
+ }
@@ -5,7 +5,7 @@
5
5
 
6
6
  import Signal from "../events/signal/Signal.js";
7
7
  import { inverseLerp } from "../math/inverseLerp.js";
8
- import { computeHashFloat } from "../math/MathUtils.js";
8
+ import { computeHashFloat } from "../math/hash/computeHashFloat.js";
9
9
 
10
10
  /**
11
11
  *
@@ -1,5 +1,5 @@
1
1
  import { assert } from "../../../assert.js";
2
- import { computeHashIntegerArray } from "../../../math/MathUtils.js";
2
+ import { computeHashIntegerArray } from "../../../collection/array/computeHashIntegerArray.js";
3
3
 
4
4
  /**
5
5
  * Reference for a port of a node instance
@@ -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
  *
@@ -1,5 +1,5 @@
1
1
  import { assert } from "../../assert.js";
2
- import { computeHashFloat } from "../../math/MathUtils.js";
2
+ import { computeHashFloat } from "../../math/hash/computeHashFloat.js";
3
3
 
4
4
 
5
5
  /**
@@ -7,7 +7,7 @@
7
7
  export function computeIntegerArrayHash(data, offset, length) {
8
8
  const end = offset + length;
9
9
 
10
- let hash = 0;
10
+ let hash = length;
11
11
 
12
12
  for (let i = offset; i < end; i++) {
13
13
  const singleValue = data[i];
@@ -3,6 +3,7 @@
3
3
  * @param {string} source
4
4
  * @param {string} term
5
5
  * @param {string} extra
6
+ * @returns {string}
6
7
  */
7
8
  export function insert_after(source, term, extra) {
8
9
  const i = source.indexOf(term);
@@ -16,3 +17,5 @@ export function insert_after(source, term, extra) {
16
17
 
17
18
  return source.slice(0, end) + extra + source.slice(end);
18
19
  }
20
+
21
+
@@ -0,0 +1,27 @@
1
+ /**
2
+ *
3
+ * @param {string} source
4
+ * @param {string} insert_term
5
+ * @param {string} replace_term
6
+ * @param {string} value
7
+ * @returns {string}
8
+ */
9
+ export function insert_after_or_replace(source, insert_term, replace_term, value) {
10
+ const insert_term_index = source.indexOf(insert_term);
11
+
12
+ if (insert_term_index !== -1) {
13
+ const end = insert_term_index + insert_term.length;
14
+ return source.slice(0, end) + value + source.slice(end);
15
+ }
16
+
17
+ const replace_term_index = source.indexOf(replace_term);
18
+
19
+ if (replace_term_index === -1) {
20
+ // not found
21
+ console.warn(`Neither insert term '${insert_term}', nor replacement term '${replace_term}' were found in the source`, source, value);
22
+ return source;
23
+ }
24
+
25
+
26
+ return source.slice(0, replace_term_index) + value + source.slice(replace_term_index + replace_term.length);
27
+ }
@@ -0,0 +1,44 @@
1
+ import { BufferAttribute, BufferGeometry, Float32BufferAttribute } from "three";
2
+
3
+ export function makeHelperBoxGeometry(sx = 1, sy = 1, sz = 1) {
4
+
5
+ const geometry = new BufferGeometry();
6
+
7
+ const dx = sx / 2;
8
+ const dy = sy / 2;
9
+ const dz = sz / 2;
10
+
11
+ const vertices = new Float32Array([
12
+ -dx, -dy, -dz,
13
+ dx, -dy, -dz,
14
+ dx, dy, -dz,
15
+ -dx, dy, -dz,
16
+
17
+ -dx, dy, dz,
18
+ dx, dy, dz,
19
+ dx, -dy, dz,
20
+ -dx, -dy, dz
21
+ ]);
22
+
23
+ geometry.setAttribute("position", new Float32BufferAttribute(vertices, 3));
24
+
25
+ geometry.setIndex(new BufferAttribute(new Uint8Array([
26
+ 0, 1,
27
+ 1, 2,
28
+ 2, 3,
29
+ 3, 0,
30
+
31
+ 4, 5,
32
+ 5, 6,
33
+ 6, 7,
34
+ 7, 4,
35
+
36
+
37
+ 0, 7,
38
+ 1, 6,
39
+ 2, 5,
40
+ 3, 4
41
+ ]), 1, false));
42
+
43
+ return geometry;
44
+ }
@@ -38,7 +38,7 @@ import { HeadsUpDisplayController } from "./components/HeadsUpDisplayController.
38
38
  import { BlackboardController } from "./components/BlackboardController.js";
39
39
  import { GridObstacleController } from "./components/GridObstacleController.js";
40
40
  import { AttachmentSocketsController } from "./components/sockets/AttachmentSocketsController.js";
41
- import { ParticleEmitterSystem2 } from "../../../engine/graphics/particles/ecs/ParticleEmitterSystem2.js";
41
+ import { ParticleEmitterSystem } from "../../../engine/graphics/particles/ecs/ParticleEmitterSystem.js";
42
42
 
43
43
  /**
44
44
  *
@@ -82,7 +82,7 @@ function prepareComponentFactory(factory, editor) {
82
82
  .register('ParticleEmitter', () => {
83
83
  const em = editor.engine.entityManager;
84
84
 
85
- const particleEmitterSystem = em.getSystem(ParticleEmitterSystem2);
85
+ const particleEmitterSystem = em.getSystem(ParticleEmitterSystem);
86
86
 
87
87
  return new ParticleEmitterController(particleEmitterSystem);
88
88
  })
@@ -24,7 +24,7 @@ export function enumNameByValue(value, enumerable) {
24
24
  /**
25
25
  *
26
26
  * @param {ParticleEmitter} emitter
27
- * @param {ParticleEmitterSystem2} system
27
+ * @param {ParticleEmitterSystem} system
28
28
  * @param {function} op
29
29
  * @param {*} [arg0]
30
30
  */
@@ -61,7 +61,7 @@ function applyEmitterChanges(emitter, system, op, arg0) {
61
61
  export class ParticleEmitterController extends EmptyView {
62
62
  /**
63
63
  *
64
- * @param {ParticleEmitterSystem2} particleEmitterSystem
64
+ * @param {ParticleEmitterSystem} particleEmitterSystem
65
65
  * @constructor
66
66
  */
67
67
  constructor(particleEmitterSystem) {
@@ -367,6 +367,7 @@ export class EngineHarness {
367
367
  sensitivity
368
368
  });
369
369
 
370
+ eb.add(Tag.fromJSON(['CameraController']));
370
371
  eb.add(SerializationMetadata.Transient);
371
372
 
372
373
  eb.build(ecd);
@@ -7,7 +7,7 @@ import { removeComponentsExcept } from "../ecs/util/removeComponentsExcept.js";
7
7
  import { createSound, createTimer } from "../EntityCreator.js";
8
8
  import Mesh from "../graphics/ecs/mesh/Mesh.js";
9
9
  import Trail2D, { Trail2DFlags } from "../graphics/ecs/trail2d/Trail2D.js";
10
- import { ParticleEmitterSystem2 } from "../graphics/particles/ecs/ParticleEmitterSystem2.js";
10
+ import { ParticleEmitterSystem } from "../graphics/particles/ecs/ParticleEmitterSystem.js";
11
11
  import { ParticleEmitter } from "../graphics/particles/particular/engine/emitter/ParticleEmitter.js";
12
12
  import { ParticleEmitterFlag } from "../graphics/particles/particular/engine/emitter/ParticleEmitterFlag.js";
13
13
  import { distributeParticlesOnObject3D } from "../graphics/particles/particular/engine/utils/distributeParticlesOnObject3D.js";
@@ -137,9 +137,9 @@ export function removeEntityWithMeshParticlesEffect(
137
137
 
138
138
  /**
139
139
  *
140
- * @type {ParticleEmitterSystem2}
140
+ * @type {ParticleEmitterSystem}
141
141
  */
142
- const sPE = entityManager.getSystem(ParticleEmitterSystem2);
142
+ const sPE = entityManager.getSystem(ParticleEmitterSystem);
143
143
 
144
144
  /**
145
145
  *
@@ -214,9 +214,9 @@ export function removeEntityGenericEffect(
214
214
 
215
215
  /**
216
216
  *
217
- * @type {ParticleEmitterSystem2}
217
+ * @type {ParticleEmitterSystem}
218
218
  */
219
- const sPE = engine.entityManager.getSystem(ParticleEmitterSystem2);
219
+ const sPE = engine.entityManager.getSystem(ParticleEmitterSystem);
220
220
 
221
221
  /**
222
222
  *
@@ -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
+ }
@@ -19,18 +19,43 @@ function AnimationTrack(properties) {
19
19
  */
20
20
  this.propertyCount = properties.length;
21
21
 
22
+ /**
23
+ *
24
+ * @type {number[]}
25
+ */
22
26
  this.keyValues = [];
27
+
28
+ /**
29
+ *
30
+ * @type {number[]}
31
+ */
23
32
  this.keyTimes = [];
24
33
 
25
34
  this.timeStart = Number.POSITIVE_INFINITY;
26
35
  this.timeEnd = Number.NEGATIVE_INFINITY;
27
36
 
37
+ /**
38
+ * Indices of keys from which transition takes place
39
+ * @type {number[]}
40
+ */
28
41
  this.transitionKeys = [];
42
+
43
+ /**
44
+ * Transition function associated with a key
45
+ * @type {function[]}
46
+ */
29
47
  this.transitionFunctions = [];
30
48
  }
31
49
 
32
- AnimationTrack.prototype.initialize = function () {
33
- const keysTyped = new Float64Array(this.keyValues.length);
50
+ AnimationTrack.prototype.optimize = function () {
51
+ const key_value_count = this.keyValues.length;
52
+ const key_count = this.keyTimes.length;
53
+
54
+ // use a common buffer to get better cache locality
55
+ const buffer = new ArrayBuffer(key_count * 4 + key_value_count * 8);
56
+
57
+ const keyTimesTyped = new Float32Array(buffer, 0, key_count);
58
+ const keysTyped = new Float64Array(buffer, key_count * 4, key_value_count);
34
59
 
35
60
  //transfer original keys into typed array
36
61
  keysTyped.set(this.keyValues, 0);
@@ -38,7 +63,6 @@ AnimationTrack.prototype.initialize = function () {
38
63
  //overwrite the original array
39
64
  this.keyValues = keysTyped;
40
65
 
41
- const keyTimesTyped = new Float32Array(this.keyTimes.length);
42
66
  keyTimesTyped.set(this.keyTimes, 0);
43
67
 
44
68
  this.keyTimes = keyTimesTyped;
@@ -4,9 +4,9 @@
4
4
  * @param {string} type
5
5
  * @constructor
6
6
  */
7
- import { computeHashIntegerArray } from "../../core/math/MathUtils.js";
8
7
  import { assert } from "../../core/assert.js";
9
8
  import { computeStringHash } from "../../core/primitives/strings/computeStringHash.js";
9
+ import { computeHashIntegerArray } from "../../core/collection/array/computeHashIntegerArray.js";
10
10
 
11
11
  export class AssetDescription {
12
12
  /**
@@ -2,5 +2,5 @@ import {AssetLoader} from "./AssetLoader";
2
2
  import {Object3D} from "three";
3
3
 
4
4
  export class GLTFAssetLoader extends AssetLoader<Object3D> {
5
-
5
+ setDracoDecoderPath(path: string): void
6
6
  }
@@ -127,6 +127,8 @@ export class GLTFAssetLoader extends AssetLoader {
127
127
 
128
128
  this.__dracoLoader = new DRACOLoader();
129
129
  this.__dracoLoader.setWorkerLimit(1);
130
+
131
+ // set default path
130
132
  this.__dracoLoader.setDecoderPath(buildDracoDecoderPath());
131
133
 
132
134
  const loader = new GLTFLoader();
@@ -156,6 +158,14 @@ export class GLTFAssetLoader extends AssetLoader {
156
158
  });
157
159
  }
158
160
 
161
+ /**
162
+ *
163
+ * @param {string} p
164
+ */
165
+ setDracoDecoderPath(p) {
166
+ this.__dracoLoader.setDecoderPath(p);
167
+ }
168
+
159
169
  /**
160
170
  *
161
171
  * @param {boolean} v