@woosh/meep-engine 2.56.1 → 2.57.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 (227) hide show
  1. package/editor/ecs/component/editors/ColorEditor.js +1 -1
  2. package/editor/ecs/component/editors/ImagePathEditor.js +2 -2
  3. package/editor/ecs/component/editors/{LargeStrongEditor.js → LargeStringEditor.js} +1 -1
  4. package/editor/tools/GridPaintTool.js +3 -3
  5. package/editor/tools/TopDownCameraControlTool.js +1 -1
  6. package/editor/tools/TransformTool.js +1 -1
  7. package/editor/tools/engine/Tool.js +9 -23
  8. package/editor/tools/engine/ToolEngine.js +5 -7
  9. package/editor/tools/paint/TerrainHeightPaintTool.js +2 -2
  10. package/editor/tools/paint/TerrainPaintTool.js +2 -2
  11. package/editor/tools/paint/TerrainTexturePaintTool.js +2 -2
  12. package/package.json +1 -1
  13. package/src/core/bvh2/bvh3/query/compute_tight_near_far_clipping_planes.js +1 -1
  14. package/src/core/bvh2/traversal/ThreeClippingPlaneComputingBVHVisitor.js +1 -1
  15. package/src/core/bvh2/traversal/__process_point_if_within_planes.js +1 -1
  16. package/src/core/cache/LoadingCache.js +3 -2
  17. package/src/core/collection/array/arraySetSortingDiff.spec.js +12 -12
  18. package/src/core/collection/array/weightedRandomFromArray.js +2 -2
  19. package/src/core/color/Color.js +6 -6
  20. package/src/core/color/YCbCr/YCbCr.spec.js +16 -0
  21. package/src/core/color/{YCbCr_to_rgb_uint24.js → YCbCr/YCbCr_to_rgb_uint24.js} +6 -6
  22. package/src/core/color/YCbCr/rgb_to_YCbCr_uint24.js +16 -0
  23. package/src/core/color/{hex2rgb.js → hex/hex2rgb.js} +1 -1
  24. package/src/core/color/{rgb2hex.js → hex/rgb2hex.js} +1 -1
  25. package/src/core/color/{hsv2rgb.js → hsv/hsv2rgb.js} +3 -3
  26. package/src/core/color/hsv/rgb2hsv.js +49 -0
  27. package/src/core/color/{kelvin_to_rgb.js → kelvin/kelvin_to_rgb.js} +1 -1
  28. package/src/core/color/{kelvin_to_rgb.spec.js → kelvin/kelvin_to_rgb.spec.js} +2 -2
  29. package/src/core/color/{prototype_kelvin_to_rgb.js → kelvin/prototype_kelvin_to_rgb.js} +5 -5
  30. package/src/core/color/{rgb_to_kelvin.spec.js → kelvin/rgb_to_kelvin.spec.js} +1 -1
  31. package/src/core/color/{parseColor.js → parse_color.js} +4 -4
  32. package/src/core/color/parse_color.spec.js +18 -0
  33. package/src/core/color/rgb2uint24.js +3 -3
  34. package/src/core/color/sRGB/sRGB.spec.js +16 -0
  35. package/src/core/color/xyz/XYZ.spec.js +16 -0
  36. package/src/core/color/xyz/rgb_to_xyz.js +15 -0
  37. package/src/core/color/xyz/xyz_to_rgb.js +14 -0
  38. package/src/core/events/signal/Signal.js +5 -0
  39. package/src/core/events/signal/{signalAggregateByTimeWindow.js → signal_aggregate_by_time_window.js} +1 -1
  40. package/src/core/events/signal/{SignalUtils.js → signal_filter.js} +1 -2
  41. package/src/core/geom/2d/spline_bezier2_2d.js +26 -0
  42. package/src/core/geom/2d/spline_bezier2_2d.spec.js +16 -0
  43. package/src/core/geom/3d/SurfacePoint3.js +1 -1
  44. package/src/core/geom/3d/aabb/aabb3_compute_plane_side.js +1 -1
  45. package/src/core/geom/3d/aabb/aabb3_detailed_volume_intersection.js +1 -1
  46. package/src/core/geom/3d/aabb/aabb3_transformed_compute_plane_side.js +1 -1
  47. package/src/core/geom/3d/compute_circle_bounding_box.js +1 -1
  48. package/src/core/geom/3d/cone/computeConeBoundingBox.js +1 -1
  49. package/src/core/geom/3d/frustum/frustum3_computeNearestPointToPoint.js +1 -1
  50. package/src/core/geom/3d/line/line3_computeSegmentPointDistance_sqr.js +1 -1
  51. package/src/core/geom/3d/line/line3_compute_nearest_point_to_point.js +1 -1
  52. package/src/core/geom/3d/normal/hemioct/unit_hemioct.spec.js +1 -1
  53. package/src/core/geom/3d/normal/spherical/sphere_map_transform.js +1 -1
  54. package/src/core/geom/3d/plane/is_point_within_planes.js +1 -1
  55. package/src/core/geom/3d/plane/lerp_planes_to_array.js +1 -1
  56. package/src/core/geom/3d/plane/plane3_compute_convex_3_plane_intersection.js +1 -1
  57. package/src/core/geom/3d/plane/plane3_compute_line_segment_intersection.js +1 -1
  58. package/src/core/geom/3d/plane/plane3_compute_ray_intersection.js +1 -1
  59. package/src/core/geom/3d/plane/plane3_lerp.js +2 -2
  60. package/src/core/geom/3d/plane/plane3_projectPoint.js +1 -1
  61. package/src/core/geom/3d/plane/plane3_slerp.js +3 -3
  62. package/src/core/geom/3d/ray/ray_computeNearestPointToPoint.js +1 -1
  63. package/src/core/geom/3d/ray/ray_distance_to_point.js +1 -1
  64. package/src/core/geom/3d/shape/UnionShape3D.js +3 -3
  65. package/src/core/geom/3d/shape/UnitCubeShape3D.js +1 -1
  66. package/src/core/geom/3d/shape/UnitSphereShape3D.js +1 -1
  67. package/src/core/geom/3d/sphere/sphere_intersects_ray.js +1 -1
  68. package/src/core/geom/3d/tetrahedra/TetrahedralMesh.js +6 -0
  69. package/src/core/geom/3d/tetrahedra/compute_bounding_simplex_3d.js +1 -1
  70. package/src/core/geom/3d/tetrahedra/compute_bounding_simplex_3d.spec.js +1 -1
  71. package/src/core/geom/3d/tetrahedra/compute_circumsphere.js +1 -1
  72. package/src/core/geom/3d/tetrahedra/delaunay/compute_delaunay_tetrahedral_mesh.js +1 -0
  73. package/src/core/geom/3d/tetrahedra/delaunay/compute_delaunay_tetrahedral_mesh.spec.js +10 -2
  74. package/src/core/geom/3d/topology/bounds/computeTriangleClusterNormalBoundingCone.js +1 -1
  75. package/src/core/geom/3d/topology/samples/sampleFloodFill.js +1 -1
  76. package/src/core/geom/3d/topology/simplify/compute_face_normal_change_dot_product.js +1 -1
  77. package/src/core/geom/3d/topology/simplify/quadratic/Quadratic3.js +1 -1
  78. package/src/core/geom/3d/topology/simplify/tm_edge_collapse_is_degenerate_flip.js +2 -2
  79. package/src/core/geom/3d/topology/struct/TopoVertex.js +1 -1
  80. package/src/core/geom/3d/topology/util/compute_face_connection_weight.js +2 -2
  81. package/src/core/geom/3d/triangle/computeTrianglePlaneSide.js +1 -1
  82. package/src/core/geom/3d/triangle/computeTriangleRayIntersection.js +1 -1
  83. package/src/core/geom/3d/triangle/computeTriangleRayIntersectionBarycentricEdge.js +1 -1
  84. package/src/core/geom/3d/v3_compute_triangle_normal.js +1 -1
  85. package/src/core/geom/Quaternion.js +1 -1
  86. package/src/core/geom/Vector3.js +7 -7
  87. package/src/core/geom/Vector3.spec.js +68 -1
  88. package/src/core/geom/mat2/m2_add.js +17 -0
  89. package/src/core/geom/mat2/m2_determinant.js +8 -0
  90. package/src/core/geom/mat2/m2_multiply.js +17 -0
  91. package/src/core/geom/mat2/m2_multiply_scalar.js +18 -0
  92. package/src/core/geom/mat2/m2_multiply_transposed.js +18 -0
  93. package/src/core/geom/mat2/m2_sub_transposed.js +17 -0
  94. package/src/{view → core/geom/mat3}/m3_cm_compose_transform.js +0 -29
  95. package/src/core/geom/mat3/m3_cm_extract_rotation.js +8 -0
  96. package/src/core/geom/mat3/m3_cm_from_translation.js +19 -0
  97. package/src/{view/multiplyMatrices3.js → core/geom/mat3/m3_multiply.js} +2 -2
  98. package/src/{view → core/geom/mat3}/m3_rm_compose_transform.js +0 -9
  99. package/src/core/geom/mat3/m3_rm_extract_scale.js +7 -0
  100. package/src/core/geom/{3d/vector/allocate_v3.js → vec3/v3_allocate.js} +1 -1
  101. package/src/core/geom/{v3_angle_between.js → vec3/v3_angle_between.js} +1 -1
  102. package/src/core/geom/vec3/v3_dot_array_array.js +20 -0
  103. package/src/core/geom/{v3_lerp.js → vec3/v3_lerp.js} +1 -1
  104. package/src/core/graph/SquareMatrix.js +26 -3
  105. package/src/core/graph/SquareMatrix.spec.js +52 -2
  106. package/src/core/math/clamp01.js +1 -0
  107. package/src/core/math/fract.js +3 -1
  108. package/src/core/math/inverseLerp.js +7 -5
  109. package/src/core/math/lerp.js +5 -5
  110. package/src/core/math/physics/spring/computeHookeForce.js +9 -0
  111. package/src/core/math/remap.js +19 -0
  112. package/src/core/math/remap.spec.js +15 -0
  113. package/src/core/math/smoothStep.spec.js +16 -0
  114. package/src/core/math/spline/spline_bezier2.js +13 -0
  115. package/src/core/math/spline/spline_bezier2.spec.js +13 -0
  116. package/src/core/model/object/compareValues.js +2 -2
  117. package/src/core/model/object/read_property.js +10 -2
  118. package/src/core/model/object/write_property.js +3 -23
  119. package/src/core/model/object/write_property.spec.js +26 -0
  120. package/src/core/primitives/numbers/number_pretty_print.spec.js +19 -0
  121. package/src/engine/ecs/ik/OneBoneSurfaceAlignmentSolver.js +2 -2
  122. package/src/engine/ecs/ik/TwoBoneInverseKinematicsSolver.js +2 -2
  123. package/src/engine/ecs/systems/SteeringSystem.js +1 -1
  124. package/src/engine/ecs/terrain/ecs/splat/SplatMapOptimizerDebugger.js +1 -1
  125. package/src/engine/graphics/ecs/camera/Camera.js +1 -1
  126. package/src/engine/graphics/ecs/camera/CameraClippingPlaneComputer.js +1 -1
  127. package/src/engine/graphics/ecs/decal/v2/FPDecalSystem.js +3 -11
  128. package/src/engine/graphics/ecs/highlight/Highlight.js +20 -102
  129. package/src/engine/graphics/ecs/mesh/Mesh.js +12 -18
  130. package/src/engine/graphics/ecs/mesh/MeshSystem.js +41 -26
  131. package/src/engine/graphics/ecs/mesh-v2/ShadedGeometrySystem.js +1 -1
  132. package/src/engine/graphics/ecs/path/tube/build/TubePathBuilder.js +1 -1
  133. package/src/engine/graphics/ecs/path/tube/build/makeTubeGeometry.js +1 -1
  134. package/src/engine/graphics/ecs/path/tube/build/make_cap.js +3 -3
  135. package/src/engine/graphics/ecs/path/tube/build/make_ring_vertices.js +1 -1
  136. package/src/engine/graphics/geometry/MikkT/InitTriInfo.js +5 -6
  137. package/src/engine/graphics/geometry/MikkT/MikkTSpace.js +3 -3
  138. package/src/engine/graphics/geometry/MikkT/NormalizeSafe.js +1 -2
  139. package/src/engine/graphics/geometry/MikkT/STSpace.js +3 -3
  140. package/src/engine/graphics/geometry/MikkT/v3_scale_dot_sub_normalize.js +2 -2
  141. package/src/engine/graphics/geometry/bvh/buffered/BVHGeometryRaycaster.js +1 -1
  142. package/src/engine/graphics/geometry/clipping/ClippedGeometry.js +1 -1
  143. package/src/engine/graphics/particles/particular/engine/emitter/ParticleEmitter.js +102 -95
  144. package/src/engine/graphics/particles/particular/engine/emitter/ParticleLayer.spec.js +25 -0
  145. package/src/engine/graphics/particles/particular/engine/emitter/ParticlePool.js +0 -35
  146. package/src/engine/graphics/particles/particular/engine/emitter/ParticlePool.spec.js +39 -2
  147. package/src/engine/graphics/particles/particular/engine/shader/ShaderManager.js +22 -6
  148. package/src/engine/graphics/render/forward_plus/LightManager.js +1 -1
  149. package/src/engine/graphics/render/forward_plus/plugin/ptototypeFPPlugin.js +2 -2
  150. package/src/engine/graphics/render/forward_plus/prototype/prototypeLightManager.js +3 -3
  151. package/src/engine/graphics/render/forward_plus/query/detailed_sphere_frustum_intersection_test.js +1 -1
  152. package/src/engine/graphics/render/layers/RenderLayerUtils.js +1 -1
  153. package/src/engine/graphics/render/visibility/hiz/prototypeHiZ.js +3 -2
  154. package/src/engine/graphics/sh3/LightProbeVolume.js +1 -1
  155. package/src/engine/graphics/sh3/path_tracer/PathTracer.js +2 -2
  156. package/src/engine/graphics/sh3/path_tracer/prototypePathTracer.js +2 -2
  157. package/src/engine/graphics/sh3/path_tracer/random_in_hemisphere.js +1 -1
  158. package/src/engine/graphics/sh3/path_tracer/ray_hit_apply_transform.js +1 -1
  159. package/src/engine/graphics/sh3/path_tracer/ray_reflect.js +1 -1
  160. package/src/engine/graphics/sh3/sky/hosek/data.js +3744 -0
  161. package/src/engine/graphics/sh3/sky/hosek/sky_hosek_compute_irradiance_by_direction.js +10 -3786
  162. package/src/engine/graphics/texture/atlas/AbstractTextureAtlas.js +1 -1
  163. package/src/engine/graphics/texture/atlas/AtlasPatch.js +0 -1
  164. package/src/engine/graphics/texture/atlas/AtlasPatchFlag.js +8 -1
  165. package/src/engine/graphics/texture/atlas/CachingTextureAtlas.js +25 -0
  166. package/src/engine/graphics/texture/atlas/CachingTextureAtlas.spec.js +54 -0
  167. package/src/engine/graphics/texture/atlas/ManagedTextureAtlas.js +101 -160
  168. package/src/engine/graphics/texture/atlas/TextureAtlas.js +18 -1
  169. package/src/engine/graphics/texture/sampler/sampler2d_ensure_uint8_RGBA.js +22 -0
  170. package/src/engine/graphics/util/projectSphere.js +1 -1
  171. package/src/engine/navigation/ecs/components/Path.js +1 -1
  172. package/src/engine/physics/mls-mpm/MLS_MPM.js +11 -106
  173. package/src/engine/reference/v2/Reference.js +6 -2
  174. package/src/engine/sound/ecs/emitter/SoundEmitter.js +7 -7
  175. package/src/engine/sound/ecs/emitter/SoundTrack.js +6 -6
  176. package/src/generation/filtering/numeric/complex/CellFilterAngleToNormal.js +1 -1
  177. package/src/generation/grid/generation/road/GridTaskGenerateRoads.js +2 -4
  178. package/src/generation/placement/action/random/weighted/CellActionSelectWeightedRandom.js +2 -2
  179. package/src/generation/theme/ThemeEngine.js +2 -2
  180. package/src/generation/theme/ThemeEngine.spec.js +7 -0
  181. package/src/view/View.js +21 -13
  182. package/src/view/elements/ColorPickerView.js +2 -2
  183. package/src/view/minimap/gl/MarkerGL.js +20 -18
  184. package/src/view/minimap/gl/MinimapMarkersGL.js +2 -1
  185. package/editor/tools/FoliagePaintTool.js +0 -168
  186. package/editor/tools/engine/ToolStateMachine.js +0 -53
  187. package/src/core/NumberFormat.js +0 -4
  188. package/src/core/color/rgb2hsv.js +0 -47
  189. package/src/core/color/rgb_to_YCbCr_uint24.js +0 -16
  190. package/src/core/fsm/StateMachine.js +0 -440
  191. package/src/core/fsm/Transition.js +0 -65
  192. package/src/core/geom/Bezier.js +0 -24
  193. package/src/core/geom/Bezier.spec.js +0 -16
  194. package/src/core/math/spline/quadraticCurve.js +0 -11
  195. package/src/core/math/spline/quadraticCurve.spec.js +0 -13
  196. package/src/core/primitives/numbers/compareNumbers.js +0 -9
  197. package/src/engine/graphics/ecs/decal/Decal.js +0 -10
  198. package/src/engine/graphics/ecs/decal/DecalSystem.js +0 -99
  199. package/src/engine/graphics/ecs/decal/threejs/DecalGeometry.js +0 -298
  200. package/src/engine/graphics/ecs/trail/Trail.js +0 -83
  201. package/src/engine/graphics/ecs/trail/TrailMaterial.js +0 -67
  202. package/src/engine/graphics/ecs/trail/TrailMaterial2.js +0 -73
  203. package/src/engine/graphics/ecs/trail/TrailSystem.js +0 -162
  204. package/src/engine/graphics/ecs/water2/NodeWaterShader1.js +0 -213
  205. package/src/engine/graphics/ecs/water2/shader/JBWaterShader.js +0 -315
  206. package/src/engine/graphics/geometry/MikkT/Length.js +0 -10
  207. package/src/engine/graphics/texture/ImageLoader.js +0 -33
  208. package/src/engine/graphics/three/DDSLoader.js +0 -286
  209. package/src/engine/graphics/three/Water2.js +0 -343
  210. package/src/engine/physics/spring/computeHookeForce.js +0 -9
  211. package/src/engine/reference/v1/ReferenceManager.js +0 -124
  212. /package/src/core/color/{hex2rgb.spec.js → hex/hex2rgb.spec.js} +0 -0
  213. /package/src/core/color/{rgb2hex.spec.js → hex/rgb2hex.spec.js} +0 -0
  214. /package/src/core/color/{hsv2rgb.spec.js → hsv/hsv2rgb.spec.js} +0 -0
  215. /package/src/core/color/{rgb_to_kelvin.js → kelvin/rgb_to_kelvin.js} +0 -0
  216. /package/src/core/color/{linear_to_sRGB.js → sRGB/linear_to_sRGB.js} +0 -0
  217. /package/src/core/color/{sRGB_to_linear.js → sRGB/sRGB_to_linear.js} +0 -0
  218. /package/src/core/geom/{m3_determinant.js → mat3/m3_determinant.js} +0 -0
  219. /package/src/core/geom/{v3_distance.js → vec3/v3_distance.js} +0 -0
  220. /package/src/core/geom/{v3_distance_above_plane.js → vec3/v3_distance_above_plane.js} +0 -0
  221. /package/src/core/geom/{v3_distance_above_plane.spec.js → vec3/v3_distance_above_plane.spec.js} +0 -0
  222. /package/src/core/geom/{v3_distance_sqr.d.ts → vec3/v3_distance_sqr.d.ts} +0 -0
  223. /package/src/core/geom/{v3_distance_sqr.js → vec3/v3_distance_sqr.js} +0 -0
  224. /package/src/core/geom/{v3_dot.js → vec3/v3_dot.js} +0 -0
  225. /package/src/core/geom/{v3_length.js → vec3/v3_length.js} +0 -0
  226. /package/src/core/geom/{v3_length_sqr.js → vec3/v3_length_sqr.js} +0 -0
  227. /package/src/core/geom/{v3_slerp.js → vec3/v3_slerp.js} +0 -0
@@ -1,5 +1,5 @@
1
1
  import { vec3 } from "gl-matrix";
2
- import { allocate_v3 } from "../../../../core/geom/3d/vector/allocate_v3.js";
2
+ import { v3_allocate } from "../../../../core/geom/vec3/v3_allocate.js";
3
3
 
4
4
  export class STSpace {
5
5
  constructor() {
@@ -7,12 +7,12 @@ export class STSpace {
7
7
  *
8
8
  * @type {vec3|Float32Array}
9
9
  */
10
- this.vOs = allocate_v3();
10
+ this.vOs = v3_allocate();
11
11
  /**
12
12
  *
13
13
  * @type {vec3|Float32Array}
14
14
  */
15
- this.vOt = allocate_v3();
15
+ this.vOt = v3_allocate();
16
16
 
17
17
  this.fMagS = 0;
18
18
  this.fMagT = 0;
@@ -1,6 +1,6 @@
1
1
  import { vec3 } from "gl-matrix";
2
- import { v3_length } from "../../../../core/geom/v3_length.js";
3
- import { v3_dot } from "../../../../core/geom/v3_dot.js";
2
+ import { v3_length } from "../../../../core/geom/vec3/v3_length.js";
3
+ import { v3_dot } from "../../../../core/geom/vec3/v3_dot.js";
4
4
 
5
5
  /**
6
6
  * executes following formula: v1 - v0*( dot(v0,v1) )
@@ -4,7 +4,7 @@ import { Vector3 as ThreeVector3 } from 'three';
4
4
  import { rayTriangleIntersection } from "../../../../../core/geom/3d/triangle/rayTriangleIntersection.js";
5
5
  import { SurfacePoint3 } from "../../../../../core/geom/3d/SurfacePoint3.js";
6
6
  import { assert } from "../../../../../core/assert.js";
7
- import { v3_length } from "../../../../../core/geom/v3_length.js";
7
+ import { v3_length } from "../../../../../core/geom/vec3/v3_length.js";
8
8
  import { ray3_array_apply_matrix4 } from "../../../../../core/geom/3d/ray/ray3_array_apply_matrix4.js";
9
9
  import { mat4 } from "gl-matrix";
10
10
  import { ray3_array_compose } from "../../../../../core/geom/3d/ray/ray3_array_compose.js";
@@ -1,4 +1,4 @@
1
- import { v3_distance_above_plane } from "../../../../core/geom/v3_distance_above_plane.js";
1
+ import { v3_distance_above_plane } from "../../../../core/geom/vec3/v3_distance_above_plane.js";
2
2
 
3
3
 
4
4
  // TODO incomplete
@@ -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
+ });
@@ -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) {
@@ -37,7 +37,7 @@ import { writeSample2DDataToDataTexture } from "../../texture/sampler/writeSampl
37
37
  import { Decal } from "./model/Decal.js";
38
38
  import { ReferencedTextureAtlas } from "../../texture/atlas/ReferencedTextureAtlas.js";
39
39
  import { v3_morton_encode_transformed } from "../../../../core/geom/3d/morton/v3_morton_encode_transformed.js";
40
- import { v3_distance } from "../../../../core/geom/v3_distance.js";
40
+ import { v3_distance } from "../../../../core/geom/vec3/v3_distance.js";
41
41
  import { array_copy } from "../../../../core/collection/array/array_copy.js";
42
42
  import { arrayQuickSort } from "../../../../core/collection/array/arrayQuickSort.js";
43
43
  import { frustum_from_camera } from "../../ecs/camera/frustum_from_camera.js";
@@ -62,7 +62,7 @@ import { OrbitingBehavior } from "../../../../../../../model/game/util/behavior/
62
62
  import { BehaviorComponent } from "../../../../intelligence/behavior/ecs/BehaviorComponent.js";
63
63
  import { Light } from "../../../ecs/light/Light.js";
64
64
  import { LightType } from "../../../ecs/light/LightType.js";
65
- import { parseColor } from "../../../../../core/color/parseColor.js";
65
+ import { parse_color } from "../../../../../core/color/parse_color.js";
66
66
  import Renderable from "../../../../ecs/renderable/Renderable.js";
67
67
  import { makeHelperSphereGeometry } from "../../../../../../editor/process/symbolic/makeHelperSphereGeometry.js";
68
68
  import TopDownCameraController from "../../../ecs/camera/topdown/TopDownCameraController.js";
@@ -197,7 +197,7 @@ function makeLight(position, radius, color, intensity = 1) {
197
197
  light.color.fromUint(color);
198
198
  } else {
199
199
 
200
- const c = parseColor(color);
200
+ const c = parse_color(color);
201
201
 
202
202
  light.color.setRGB(c[0] / 255, c[1] / 255, c[2] / 255);
203
203
  }
@@ -25,7 +25,7 @@ import { MouseEvents } from "../../../../input/devices/events/MouseEvents.js";
25
25
  import { RingBuffer } from "../../../../../core/collection/RingBuffer.js";
26
26
  import { query_bvh_frustum_from_objects } from "../query/query_bvh_frustum_from_objects.js";
27
27
  import { FPlusDebugMaterial } from "../materials/FPlusDebugMaterial.js";
28
- import { parseColor } from "../../../../../core/color/parseColor.js";
28
+ import { parse_color } from "../../../../../core/color/parse_color.js";
29
29
  import { buildLightClusterWidget } from "../debug/buildLightClusterWidget.js";
30
30
  import domify from "../../../../../view/DOM.js";
31
31
  import { createScreenGrid } from "../debug/createScreenGrid.js";
@@ -237,7 +237,7 @@ function addSpotLight(position, direction, color, distance = 1, angle = 1, penum
237
237
  light.color.fromUint(color);
238
238
  } else {
239
239
 
240
- const c = parseColor(color);
240
+ const c = parse_color(color);
241
241
 
242
242
  light.color.setRGB(c[0] / 255, c[1] / 255, c[2] / 255);
243
243
  }
@@ -281,7 +281,7 @@ function addPointLight({
281
281
  light.color.fromUint(color);
282
282
  } else {
283
283
 
284
- const c = parseColor(color);
284
+ const c = parse_color(color);
285
285
 
286
286
  light.color.setRGB(c[0] / 255, c[1] / 255, c[2] / 255);
287
287
  }
@@ -1,4 +1,4 @@
1
- import { v3_distance_sqr } from "../../../../../core/geom/v3_distance_sqr.js";
1
+ import { v3_distance_sqr } from "../../../../../core/geom/vec3/v3_distance_sqr.js";
2
2
  import { biplanar_edge_mapping, triplanar_corner_mapping } from "./cube_mapping.js";
3
3
  import {
4
4
  line3_computeSegmentPointDistance_sqr
@@ -1,4 +1,4 @@
1
- import { v3_distance_above_plane } from "../../../../core/geom/v3_distance_above_plane.js";
1
+ import { v3_distance_above_plane } from "../../../../core/geom/vec3/v3_distance_above_plane.js";
2
2
  import {
3
3
  plane3_three_compute_convex_3_plane_intersection
4
4
  } from "../../../../core/geom/3d/plane/plane3_three_compute_convex_3_plane_intersection.js";