@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,7 +1,7 @@
1
1
  import { EngineHarness } from "../../../EngineHarness.js";
2
2
  import { ImpostorBaker } from "./ImpostorBaker.js";
3
3
  import { ShadedGeometry } from "../../ecs/mesh-v2/ShadedGeometry.js";
4
- import EntityBuilder from "../../../ecs/EntityBuilder.js";
4
+ import Entity from "../../../ecs/Entity.js";
5
5
  import ViewportPosition from "../../../ecs/gui/position/ViewportPosition.js";
6
6
  import GUIElement from "../../../ecs/gui/GUIElement.js";
7
7
  import GUIElementSystem from "../../../ecs/gui/GUIElementSystem.js";
@@ -79,7 +79,7 @@ async function main(engine) {
79
79
  mode: 'alpha'
80
80
  });
81
81
 
82
- new EntityBuilder()
82
+ new Entity()
83
83
  .add(new ViewportPosition({
84
84
  offset: new Vector2(0, 0)
85
85
  }))
@@ -110,7 +110,7 @@ async function main(engine) {
110
110
  sg_mesh.castShadow = false;
111
111
  sg_mesh.receiveShadow = false;
112
112
 
113
- const entity_true_mesh = new EntityBuilder();
113
+ const entity_true_mesh = new Entity();
114
114
  entity_true_mesh
115
115
  .add(sg_mesh)
116
116
  .add(t1)
@@ -122,7 +122,7 @@ async function main(engine) {
122
122
 
123
123
  /**
124
124
  *
125
- * @param {EntityBuilder} entity
125
+ * @param {Entity} entity
126
126
  * @param {number} [speed]
127
127
  * @param {Vector3} [axis]
128
128
  */
@@ -173,7 +173,7 @@ function make_impostor_wireframe(id, t = new Transform()) {
173
173
  sg.clearFlag(ShadedGeometryFlags.CastShadow);
174
174
  sg.clearFlag(ShadedGeometryFlags.ReceiveShadow);
175
175
 
176
- return new EntityBuilder()
176
+ return new Entity()
177
177
  .add(transform)
178
178
  .add(sg)
179
179
  ;
@@ -183,7 +183,7 @@ function make_impostor_wireframe(id, t = new Transform()) {
183
183
  *
184
184
  * @param {ImpostorDescription} id
185
185
  * @param {Transform} t
186
- * @returns {EntityBuilder}
186
+ * @returns {Entity}
187
187
  */
188
188
  function make_impostor_entity(id, t = new Transform()) {
189
189
 
@@ -201,7 +201,7 @@ function make_impostor_entity(id, t = new Transform()) {
201
201
  sg.clearFlag(ShadedGeometryFlags.CastShadow);
202
202
  sg.clearFlag(ShadedGeometryFlags.ReceiveShadow);
203
203
 
204
- return new EntityBuilder()
204
+ return new Entity()
205
205
  .add(transform)
206
206
  .add(sg)
207
207
  ;
@@ -8,10 +8,10 @@ import { MouseEvents } from "../../../../input/devices/events/MouseEvents.js";
8
8
  import InterfaceCommand from "../../../../../view/interaction/InterfaceCommand.js";
9
9
  import { InteractionCommand } from "../../../../../view/interaction/InteractionCommand.js";
10
10
  import { serializeNodeGraphToJSON } from "../../../../../core/model/node-graph/json/serializeNodeGraphToJSON.js";
11
- import { downloadAsFile } from "../../../../../core/binary/ByteArrayTools.js";
12
11
  import {
13
12
  deserializeNodeGraphFromJSON
14
13
  } from "../../../../../core/model/node-graph/json/deserializeNodeGraphFromJSON.js";
14
+ import {downloadAsFile} from "../../../../../core/binary/downloadAsFile.js";
15
15
 
16
16
  export class ParticleSpecificationEditorView extends View {
17
17
  constructor() {
@@ -3,7 +3,7 @@ import List from "../../../../../../core/collection/list/List.js";
3
3
  import { lerp } from "../../../../../../core/math/lerp.js";
4
4
  import { max2 } from "../../../../../../core/math/max2.js";
5
5
  import { min2 } from "../../../../../../core/math/min2.js";
6
- import { Box3, BufferGeometry, Frustum, Matrix4, Points, PointsMaterial } from 'three';
6
+ import { Box3, BufferGeometry, Frustum, Points, PointsMaterial } from 'three';
7
7
  import { ParticlePool } from "./ParticlePool.js";
8
8
  import { ParticleParameter } from "../parameter/ParticleParameter.js";
9
9
  import { ParameterSet } from "../parameter/ParameterSet.js";
@@ -28,13 +28,13 @@ import {
28
28
  PARTICLE_ATTRIBUTE_UV,
29
29
  PARTICLE_ATTRIBUTE_VELOCITY
30
30
  } from "./PARTICLE_ATTRIBUTES.js";
31
- import { composeMatrix4 } from "../../../../util/composeMatrix4.js";
32
31
  import { update_parameters } from "../simulator/update_parameters.js";
33
- import { distance_to_camera } from "./distance_to_camera.js";
34
32
  import { computeEmissionFunction } from "./computeEmissionFunction.js";
35
33
  import { PARTICULAR_PARTICLE_SPECIFICATION } from "./PARTICULAR_PARTICLE_SPECIFICATION.js";
36
34
  import { computeHashIntegerArray } from "../../../../../../core/collection/array/computeHashIntegerArray.js";
37
35
  import { frustum_from_camera } from "../../../../ecs/camera/frustum_from_camera.js";
36
+ import { v3_dot_array_array } from "../../../../../../core/geom/vec3/v3_dot_array_array.js";
37
+ import { compose_matrix4_array } from "../../../../../../core/geom/3d/compose_matrix4_array.js";
38
38
 
39
39
  const EMPTY_GEOMETRY = new BufferGeometry();
40
40
 
@@ -53,6 +53,8 @@ const SERIALIZABLE_FLAGS = ParticleEmitterFlag.PreWarm
53
53
  */
54
54
  const corners = new Float64Array(24);
55
55
 
56
+ const scratch_near_plane_normal = new Float32Array(3);
57
+
56
58
  /**
57
59
  *
58
60
  * @type {number[]}
@@ -81,16 +83,16 @@ function generateStandardParameterSet(parameters) {
81
83
  }
82
84
 
83
85
 
84
- const uint16_mul = 65536;
86
+ const UINT16_MAX = 65535; // = 2^16 - 1
85
87
 
86
88
  /**
87
89
  *
88
- * @param {AtlasPatch} atlasPatch
90
+ * @param {AtlasPatch} patch
89
91
  * @param {ParticlePool} particles
90
92
  * @param {number} ref
91
93
  */
92
- function write_particle_patch_uv(atlasPatch, particles, ref) {
93
- const uv = atlasPatch.uv;
94
+ function write_particle_patch_uv(patch, particles, ref) {
95
+ const uv = patch.uv;
94
96
 
95
97
  const uv_position = uv.position;
96
98
 
@@ -105,96 +107,101 @@ function write_particle_patch_uv(atlasPatch, particles, ref) {
105
107
  particles.writeAttributeVector4(
106
108
  ref,
107
109
  PARTICLE_ATTRIBUTE_UV,
108
- u0 * uint16_mul, v0 * uint16_mul, u1 * uint16_mul, v1 * uint16_mul
110
+ u0 * UINT16_MAX, v0 * UINT16_MAX, u1 * UINT16_MAX, v1 * UINT16_MAX
109
111
  );
110
112
  }
111
113
 
112
114
  export class ParticleEmitter {
113
- constructor() {
114
- /**
115
- * @type {ParameterSet}
116
- */
117
- this.parameters = new ParameterSet();
118
- generateStandardParameterSet(this.parameters);
119
115
 
116
+ /**
117
+ * @private
118
+ * @type {List<ParticleLayer>}
119
+ */
120
+ layers = new List();
120
121
 
121
- /**
122
- * @private
123
- * @type {List<ParticleLayer>}
124
- */
125
- this.layers = new List();
122
+ /**
123
+ *
124
+ * @type {Vector3}
125
+ */
126
+ position = new Vector3(0, 0, 0);
127
+ scale = new Vector3(1, 1, 1);
128
+ rotation = new Quaternion(0, 0, 0, 1);
126
129
 
127
- /**
128
- *
129
- * @type {Vector3}
130
- */
131
- this.position = new Vector3(0, 0, 0);
132
- this.scale = new Vector3(1, 1, 1);
133
- this.rotation = new Quaternion(0, 0, 0, 1);
130
+ /**
131
+ *
132
+ * @type {Vector3}
133
+ * @private
134
+ */
135
+ __lastSpawnPosition = new Vector3(0, 0, 0);
134
136
 
135
- /**
136
- *
137
- * @type {Vector3}
138
- * @private
139
- */
140
- this.__lastSpawnPosition = new Vector3(0, 0, 0);
137
+ /**
138
+ * How long has this emitter been sleeping for?
139
+ * This amount of time needs to be simulated when we wake the emitter up, but we can typically do it in a small number of large steps
140
+ * @type {number}
141
+ */
142
+ sleepTime = 0;
141
143
 
142
- this.sleepTime = 0;
144
+ /**
145
+ *
146
+ * @type {BlendingType|number}
147
+ */
148
+ blendingMode = BlendingType.Normal;
143
149
 
144
- /**
145
- *
146
- * @type {BlendingType|number}
147
- */
148
- this.blendingMode = BlendingType.Normal;
150
+ /**
151
+ *
152
+ * @type {ParticlePool|null}
153
+ */
154
+ particles = null;
149
155
 
150
- /**
151
- *
152
- * @type {ParticlePool|null}
153
- */
154
- this.particles = null;
156
+ /**
157
+ *
158
+ * @type {Object3D|null}
159
+ */
160
+ mesh = null;
155
161
 
156
- /**
157
- *
158
- * @type {Object3D|null}
159
- */
160
- this.mesh = null;
162
+ /**
163
+ *
164
+ * @type {LeafNode}
165
+ */
166
+ bvhLeaf = new LeafNode(this, 0, 0, 0, 0, 0, 0);
161
167
 
168
+ /**
169
+ *
170
+ * @type {AABB3}
171
+ */
172
+ particleBounds = new AABB3(Infinity, Infinity, Infinity, -Infinity, -Infinity, -Infinity);
162
173
 
163
- /**
164
- *
165
- * @type {LeafNode}
166
- */
167
- this.bvhLeaf = new LeafNode(this, 0, 0, 0, 0, 0, 0);
174
+ /**
175
+ *
176
+ * @type {AABB3}
177
+ */
178
+ emissionBounds = new AABB3(0, 0, 0, 0, 0, 0);
168
179
 
169
180
 
170
- /**
171
- *
172
- * @type {AABB3}
173
- */
174
- this.particleBounds = new AABB3(Infinity, Infinity, Infinity, -Infinity, -Infinity, -Infinity);
181
+ /**
182
+ * Bit Field of {@link ParticleEmitterFlag}
183
+ * @type {number}
184
+ */
185
+ flags = ParticleEmitterFlag.DepthSorting | ParticleEmitterFlag.HashNeedUpdate | ParticleEmitterFlag.Emitting;
175
186
 
187
+ /**
188
+ *
189
+ * @type {number}
190
+ * @private
191
+ */
192
+ __hash = 0;
193
+
194
+ constructor() {
176
195
  /**
177
- *
178
- * @type {AABB3}
196
+ * @type {ParameterSet}
179
197
  */
180
- this.emisionBounds = new AABB3(0, 0, 0, 0, 0, 0);
198
+ this.parameters = new ParameterSet();
199
+ generateStandardParameterSet(this.parameters);
200
+
181
201
 
182
202
  this.position.onChanged.add(this.updateTransform, this);
183
203
  this.scale.onChanged.add(this.updateTransform, this);
184
204
  this.rotation.onChanged.add(this.updateTransform, this);
185
-
186
- /**
187
- * Bit Field of {@link ParticleEmitterFlag}
188
- * @type {number}
189
- */
190
- this.flags = ParticleEmitterFlag.DepthSorting | ParticleEmitterFlag.HashNeedUpdate | ParticleEmitterFlag.Emitting;
191
-
192
- /**
193
- *
194
- * @type {number}
195
- * @private
196
- */
197
- this.__hash = 0;
198
205
  }
199
206
 
200
207
  updateTransform() {
@@ -442,9 +449,7 @@ export class ParticleEmitter {
442
449
  const rotation = this.rotation;
443
450
  const scale = this.scale;
444
451
 
445
- composeMatrix4(matrix4, position, rotation, scale);
446
-
447
- const m4 = matrix4.elements;
452
+ compose_matrix4_array(matrix4, position, rotation, scale);
448
453
 
449
454
  for (let i = 0; i < numLayers; i++) {
450
455
  const particleLayer = layers.get(i);
@@ -463,9 +468,9 @@ export class ParticleEmitter {
463
468
  const z = corners[j + 2];
464
469
 
465
470
  //apply matrix transform
466
- const _x = m4[0] * x + m4[4] * y + m4[8] * z + m4[12];
467
- const _y = m4[1] * x + m4[5] * y + m4[9] * z + m4[13];
468
- const _z = m4[2] * x + m4[6] * y + m4[10] * z + m4[14];
471
+ const _x = matrix4[0] * x + matrix4[4] * y + matrix4[8] * z + matrix4[12];
472
+ const _y = matrix4[1] * x + matrix4[5] * y + matrix4[9] * z + matrix4[13];
473
+ const _z = matrix4[2] * x + matrix4[6] * y + matrix4[10] * z + matrix4[14];
469
474
 
470
475
 
471
476
  //update bounds
@@ -479,7 +484,7 @@ export class ParticleEmitter {
479
484
  }
480
485
  }
481
486
 
482
- this.emisionBounds.setBounds(
487
+ this.emissionBounds.setBounds(
483
488
  bounds_x0, bounds_y0, bounds_z0,
484
489
  bounds_x1, bounds_y1, bounds_z1
485
490
  );
@@ -534,7 +539,7 @@ export class ParticleEmitter {
534
539
  this.computeParticleBounds();
535
540
  }
536
541
 
537
- const ebb = this.emisionBounds;
542
+ const ebb = this.emissionBounds;
538
543
  const pbb = this.particleBounds;
539
544
 
540
545
  const bounds_x0 = min2(ebb.x0, pbb.x0);
@@ -732,6 +737,7 @@ export class ParticleEmitter {
732
737
  assert.notNull(camera, 'camera');
733
738
 
734
739
  //sort particles by distance from camera to ensure proper rendering order
740
+ // NOTE we don't use full distance calculation, but DOT product instead, as the final component is always the same and we only care about relative distance for comparison
735
741
 
736
742
  /**
737
743
  *
@@ -748,10 +754,11 @@ export class ParticleEmitter {
748
754
  frustum_from_camera(camera, frustum);
749
755
  const nearPlane = frustum.planes[0];
750
756
  const nearPlaneNormal = nearPlane.normal;
757
+ nearPlaneNormal.toArray(scratch_near_plane_normal);
751
758
 
752
759
  //Bind attribute array directly for faster access
753
760
  const positionAttribute = particles.attributes[PARTICLE_ATTRIBUTE_POSITION];
754
- const positionArray = positionAttribute.array;
761
+ const position_array = positionAttribute.array;
755
762
 
756
763
 
757
764
  if (particleCount <= 1) {
@@ -777,18 +784,18 @@ export class ParticleEmitter {
777
784
  i = left;
778
785
  j = right;
779
786
 
780
- const pivotIndex = (left + right) >> 1;
787
+ const pivot_index = (left + right) >> 1;
781
788
 
782
- const pivot = distance_to_camera(pivotIndex, positionArray, nearPlaneNormal);
789
+ const pivot = v3_dot_array_array(position_array, pivot_index * 3, scratch_near_plane_normal, 0);
783
790
 
784
791
  /* partition */
785
792
  while (i <= j) {
786
793
 
787
- while (distance_to_camera(i, positionArray, nearPlaneNormal) > pivot) {
794
+ while (v3_dot_array_array(position_array, i * 3, scratch_near_plane_normal, 0) > pivot) {
788
795
  i++;
789
796
  }
790
797
 
791
- while (distance_to_camera(j, positionArray, nearPlaneNormal) < pivot) {
798
+ while (v3_dot_array_array(position_array, j * 3, scratch_near_plane_normal, 0) < pivot) {
792
799
  j--;
793
800
  }
794
801
 
@@ -912,7 +919,7 @@ export class ParticleEmitter {
912
919
  const emitter_position = this.position;
913
920
  const last_spawn_position = this.__lastSpawnPosition;
914
921
 
915
- composeMatrix4(matrix4, emitter_position, this.rotation, this.scale);
922
+ compose_matrix4_array(matrix4, emitter_position, this.rotation, this.scale);
916
923
 
917
924
  let time = -layer.timeSinceLastEmission;
918
925
 
@@ -935,13 +942,13 @@ export class ParticleEmitter {
935
942
 
936
943
  if (this.getFlag(ParticleEmitterFlag.PositionChanged)) {
937
944
  //compute position in between
938
- matrix4.elements[12] = lerp(emitter_position.x, last_spawn_position.x, f);
939
- matrix4.elements[13] = lerp(emitter_position.y, last_spawn_position.y, f);
940
- matrix4.elements[14] = lerp(emitter_position.z, last_spawn_position.z, f);
945
+ matrix4[12] = lerp(emitter_position.x, last_spawn_position.x, f);
946
+ matrix4[13] = lerp(emitter_position.y, last_spawn_position.y, f);
947
+ matrix4[14] = lerp(emitter_position.z, last_spawn_position.z, f);
941
948
  }
942
949
 
943
950
  //apply emitter transform
944
- v3position.applyMatrix4_three(matrix4);
951
+ v3position.applyMatrix4(matrix4);
945
952
 
946
953
 
947
954
  //randomize initial age across time delta
@@ -1032,7 +1039,7 @@ export class ParticleEmitter {
1032
1039
  const emissionFunction = computeEmissionFunction(layer.emissionFrom, layer.emissionShape);
1033
1040
 
1034
1041
  //compute transform matrix of the emitter
1035
- composeMatrix4(matrix4, this.position, this.rotation, this.scale);
1042
+ compose_matrix4_array(matrix4, this.position, this.rotation, this.scale);
1036
1043
 
1037
1044
  //pre-grow particle pool
1038
1045
  particles.growCapacity(particles.capacity + count);
@@ -1052,7 +1059,7 @@ export class ParticleEmitter {
1052
1059
  v3position.add(layer.position);
1053
1060
 
1054
1061
  //apply emitter transform
1055
- v3position.applyMatrix4_three(matrix4);
1062
+ v3position.applyMatrix4(matrix4);
1056
1063
 
1057
1064
 
1058
1065
  //randomize initial age across time delta
@@ -1212,7 +1219,7 @@ ParticleEmitter.Attributes = {
1212
1219
  ParticleEmitter.SERIALIZABLE_FLAGS = SERIALIZABLE_FLAGS;
1213
1220
 
1214
1221
 
1215
- const matrix4 = new Matrix4();
1222
+ const matrix4 = new Float32Array(16);
1216
1223
 
1217
1224
  const defaultPointsMaterial = new PointsMaterial({ color: 0xFFFFFF });
1218
1225
 
@@ -73,3 +73,28 @@ test('BinaryBuffer serialization consistency', () => {
73
73
  expect(actual.particleVelocityDirection.roughlyEquals(expected.particleVelocityDirection)).toBe(true);
74
74
  expect(actual.particleSpeed.equals(expected.particleSpeed)).toBe(true);
75
75
  });
76
+
77
+
78
+ test("hash - basics", () => {
79
+ const layer = new ParticleLayer();
80
+
81
+ const hash = layer.hash();
82
+
83
+ expect(layer.hash()).toEqual(hash); // consistency
84
+ expect(typeof hash).toBe("number");
85
+ expect(Number.isInteger(hash)).toBe(true);
86
+ });
87
+
88
+ test("equals - basics", () => {
89
+ const a = new ParticleLayer();
90
+
91
+ expect(a.equals(a)).toBe(true);
92
+
93
+ const b = new ParticleLayer();
94
+
95
+ expect(a.equals(b)).toBe(true);
96
+
97
+ b.emissionRate++;
98
+
99
+ expect(a.equals(b)).toBe(false);
100
+ });
@@ -231,41 +231,6 @@ export class ParticlePool {
231
231
  }
232
232
  }
233
233
 
234
- /**
235
- *
236
- * @param {AttributeSpec} spec
237
- * @return {number}
238
- * @private
239
- */
240
- __compute_attribute_byte_size(spec) {
241
-
242
- const item_size = spec.itemSize;
243
-
244
- const TypedArrayConstructor = compute_typed_array_constructor_from_data_type(spec.type);
245
-
246
- const element_byte_size = TypedArrayConstructor.BYTES_PER_ELEMENT;
247
-
248
- return item_size * element_byte_size * this.capacity;
249
- }
250
-
251
- /**
252
- *
253
- * @return {number}
254
- * @private
255
- */
256
- __compute_attribute_byte_size_total() {
257
-
258
- const spec_attributes = this.spec.attributes;
259
- const l = spec_attributes.length;
260
-
261
- let r = 0;
262
- for (let i = 0; i < l; i++) {
263
- r += this.__compute_attribute_byte_size(spec_attributes[i]);
264
- }
265
-
266
- return r;
267
- }
268
-
269
234
  build() {
270
235
  const geometry = new BufferGeometry();
271
236
  geometry.dynamic = true;
@@ -10,8 +10,8 @@ import { AttributeSpec } from "../../../../geometry/AttributeSpec.js";
10
10
  function samplePool() {
11
11
  const specification = new VertexDataSpec();
12
12
 
13
- specification.add(AttributeSpec.fromJSON({name:'a', type:BinaryDataType.Float32, itemSize:1}));
14
- specification.add(AttributeSpec.fromJSON({name:'b', type:BinaryDataType.Float32, itemSize:4}));
13
+ specification.add(AttributeSpec.fromJSON({ name: 'a', type: BinaryDataType.Float32, itemSize: 1 }));
14
+ specification.add(AttributeSpec.fromJSON({ name: 'b', type: BinaryDataType.Float32, itemSize: 4 }));
15
15
 
16
16
  const pool = new ParticlePool(specification);
17
17
 
@@ -186,3 +186,40 @@ test('read/write scalar attribute', () => {
186
186
 
187
187
  expect(pool.readAttributeScalar(1, 0)).toBe(42);
188
188
  });
189
+
190
+
191
+ test("update on empty pool", () => {
192
+
193
+ const pool = samplePool();
194
+
195
+ expect(pool.size()).toBe(0);
196
+
197
+ pool.update();
198
+
199
+ expect(pool.size()).toBe(0);
200
+
201
+ pool.update();
202
+
203
+ expect(pool.size()).toBe(0);
204
+ });
205
+
206
+ test("swap", () => {
207
+
208
+ const pool = samplePool();
209
+
210
+ populatePool(pool, 2);
211
+
212
+ pool.writeAttributeScalar(0, 0, 17);
213
+ pool.writeAttributeScalar(1, 0, 23);
214
+
215
+ pool.swap(0, 1);
216
+
217
+ expect(pool.readAttributeScalar(0, 0)).toBe(23);
218
+ expect(pool.readAttributeScalar(1, 0)).toBe(17);
219
+ });
220
+
221
+ test("calling dispose on newly created instance should not throw", () => {
222
+ const pool = samplePool();
223
+
224
+ pool.dispose();
225
+ });
@@ -7,7 +7,7 @@ import { writeSample2DDataToDataTexture } from "../../../../../texture/sampler/w
7
7
  import { ImageRGBADataLoader } from "../../../../../../asset/loaders/image/ImageRGBADataLoader.js";
8
8
  import { EngineConfiguration } from "../../../../../../EngineConfiguration.js";
9
9
  import { MeshSystem } from "../../../../../ecs/mesh/MeshSystem.js";
10
- import EntityBuilder from "../../../../../../ecs/EntityBuilder.js";
10
+ import Entity from "../../../../../../ecs/Entity.js";
11
11
  import { Transform } from "../../../../../../ecs/transform/Transform.js";
12
12
  import Mesh from "../../../../../ecs/mesh/Mesh.js";
13
13
  import Vector3 from "../../../../../../../core/geom/Vector3.js";
@@ -155,7 +155,7 @@ async function main(engine) {
155
155
  });
156
156
 
157
157
 
158
- new EntityBuilder()
158
+ new Entity()
159
159
  .add(Mesh.fromJSON({ url: 'data/models/Jauntmessina/Red_Robot/gltf/Model.gltf' }))
160
160
  .add(new Transform())
161
161
  .build(ecd)
@@ -88,6 +88,12 @@ function buildDataTexture(
88
88
  }
89
89
 
90
90
  export class ShaderManager {
91
+ /**
92
+ *
93
+ * @type {Map<ParticleLayer, Reference<AtlasPatch>>}
94
+ */
95
+ #sprite_references = new Map();
96
+
91
97
  /**
92
98
  *
93
99
  * @param {AssetManager} assetManager
@@ -107,7 +113,6 @@ export class ShaderManager {
107
113
  * @type {ManagedAtlas}
108
114
  */
109
115
  this.spriteAtlas = new ManagedAtlas(assetManager);
110
- this.spriteAtlas.autoUpdate = false;
111
116
 
112
117
  /**
113
118
  *
@@ -275,9 +280,12 @@ export class ShaderManager {
275
280
 
276
281
  const patchPromise = spriteAtlas.acquire(layer.imageURL);
277
282
 
278
- patchPromise.then(function (patch) {
279
- layer.setAtlasPatch(patch);
280
- }, (e) => {
283
+ patchPromise.then(ref => {
284
+ this.#sprite_references.set(layer, ref);
285
+ layer.setAtlasPatch(ref.getValue());
286
+ });
287
+
288
+ patchPromise.catch((e) => {
281
289
  console.warn(`Failed to load sprite '${layer.imageURL}':`, e);
282
290
  });
283
291
  }
@@ -349,7 +357,7 @@ export class ShaderManager {
349
357
  const entry = this.materialMap.get(emitter);
350
358
 
351
359
  if (entry === undefined) {
352
- console.error(`Attempted to deregisted emitter that was not registered (not found in materialMap). Request ignored.`, emitter);
360
+ console.error(`Attempted to deregister emitter that was not registered (not found in materialMap). Request ignored.`, emitter);
353
361
  return;
354
362
  }
355
363
 
@@ -363,7 +371,15 @@ export class ShaderManager {
363
371
  const layer_count = particle_layers.length;
364
372
  for (let i = 0; i < layer_count; i++) {
365
373
  const layer = particle_layers.get(i);
366
- spriteAtlas.release(layer.imageURL);
374
+
375
+ // TODO deal with the case where we remove the layer before sprite is loaded
376
+ const ref = this.#sprite_references.get(layer);
377
+
378
+ if (ref !== undefined) {
379
+ ref.release();
380
+ }
381
+
382
+ layer.setAtlasPatch(null); // clear patch
367
383
  }
368
384
 
369
385
  if (entry.count <= 0) {
@@ -1,4 +1,4 @@
1
- import EntityBuilder from "../../../../../../ecs/EntityBuilder";
1
+ import Entity from "../../../../../../ecs/Entity";
2
2
  import {AbstractShape3D} from "../../../../../../../core/geom/3d/shape/AbstractShape3D";
3
3
  import {AttributeValue} from "./AttributeValue";
4
4
  import {SamplingFunctionKind} from "./SamplingFunctionKind";
@@ -17,7 +17,7 @@ interface Attributes {
17
17
  }
18
18
 
19
19
  export class ParticleVolume {
20
- readonly entity: EntityBuilder
20
+ readonly entity: Entity
21
21
 
22
22
  from(args?: Args): void
23
23