@woosh/meep-engine 2.33.20 → 2.33.24

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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/__detailed_box_volume_intersection.js +11 -8
  9. package/core/collection/ArrayUtils.js +1 -1
  10. package/core/collection/HashMap.js +66 -22
  11. package/core/collection/array/arrayQuickSort.js +9 -6
  12. package/core/collection/array/array_swap.js +22 -0
  13. package/core/collection/array/computeHashArray.js +22 -0
  14. package/core/collection/array/computeHashIntegerArray.js +15 -0
  15. package/core/collection/table/DataType2TypedArrayConstructorMapping.js +15 -0
  16. package/core/color/Color.js +2 -1
  17. package/core/function/FunctionCompiler.js +2 -1
  18. package/core/geom/3d/CircleMath.js +4 -4
  19. package/core/geom/3d/aabb/aabb3_computeDistanceAbovePlane.js +9 -33
  20. package/core/geom/3d/cone/computeConeBoundingBox.js +4 -4
  21. package/core/geom/3d/{compute_bounding_cone_of_2_cones.js → cone/compute_bounding_cone_of_2_cones.js} +3 -3
  22. package/core/geom/3d/{compute_bounding_cone_of_2_cones.spec.js → cone/compute_bounding_cone_of_2_cones.spec.js} +1 -1
  23. package/core/geom/3d/frustum/array_setFromProjectionMatrix.js +1 -1
  24. package/core/geom/3d/frustum/frustum3_computeNearestPointToPoint.js +11 -3
  25. package/core/geom/3d/line/line3_computeSegmentPointDistance_sqr.js +41 -0
  26. package/core/geom/3d/morton/mortonEncode_magicbits.js +2 -1
  27. package/core/geom/3d/morton/reinterpret_float32_as_int32.js +13 -0
  28. package/core/geom/3d/morton/v3_morton_encode_transformed.js +33 -0
  29. package/core/geom/3d/{encode_unit3_hemioct.js → normal/hemioct/encode_unit3_hemioct.js} +0 -0
  30. package/core/geom/3d/{unit_hemioct.spec.js → normal/hemioct/unit_hemioct.spec.js} +1 -1
  31. package/core/geom/3d/normal/lamber_azimuth/transform.js +61 -0
  32. package/core/geom/3d/normal/spherical/sphere_map_transform.js +77 -0
  33. package/core/geom/3d/{lerp_planes_to_array.js → plane/lerp_planes_to_array.js} +1 -3
  34. package/core/geom/3d/plane/plane3_lerp.js +3 -1
  35. package/core/geom/3d/plane/plane3_slerp.js +4 -1
  36. package/core/geom/3d/{plane_computeConvex3PlaneIntersection.js → plane/plane_computeConvex3PlaneIntersection.js} +14 -16
  37. package/core/geom/3d/ray/ray_computeNearestPointToPoint.js +37 -0
  38. package/core/geom/3d/shape/AbstractShape3D.js +29 -0
  39. package/core/geom/3d/shape/CompositeShape.js +60 -0
  40. package/core/geom/3d/shape/TransformedShape3D.js +70 -0
  41. package/core/geom/3d/shape/UnitCubeShape3D.js +13 -0
  42. package/core/geom/3d/shape/UnitSphereShape3D.js +16 -0
  43. package/core/geom/3d/topology/TopoTriangle.js +1 -1
  44. package/core/geom/3d/topology/TopoVertex.js +1 -1
  45. package/core/geom/3d/topology/bounds/computeTraingleClusterNormalBoundingCone.js +2 -2
  46. package/core/geom/3d/topology/simplify/compute_face_normal_change_dot_product.js +1 -1
  47. package/core/geom/3d/topology/simplify/quadratic/Quadratic3.js +1 -1
  48. package/core/geom/3d/triangle/computeTrianglePlaneSide.js +1 -1
  49. package/core/geom/3d/triangle/computeTriangleRayIntersection.js +1 -1
  50. package/core/geom/3d/voxel/DenseBitVolume3D.js +87 -0
  51. package/core/geom/3d/voxel/buildVolumeFromProjectedGeometry.js +23 -0
  52. package/core/geom/AABB2.js +1 -1
  53. package/core/geom/ConicRay.js +3 -1
  54. package/core/geom/LineSegment.js +1 -77
  55. package/core/geom/Matrix4.js +8 -8
  56. package/core/geom/Plane.js +15 -10
  57. package/core/geom/Quaternion.js +2 -1
  58. package/core/geom/Rectangle.js +2 -1
  59. package/core/geom/Vector1.js +1 -1
  60. package/core/geom/Vector3.d.ts +2 -0
  61. package/core/geom/Vector3.js +35 -159
  62. package/core/geom/Vector3.spec.js +2 -1
  63. package/core/geom/Vector4.js +2 -1
  64. package/core/geom/random/randomPointInBox.js +7 -3
  65. package/core/geom/random/randomPointInPoint.js +6 -3
  66. package/core/geom/random/randomPointInSphere.js +6 -3
  67. package/core/geom/random/randomPointOnBox.js +7 -3
  68. package/core/geom/random/randomPointOnSphere.js +6 -3
  69. package/core/geom/v3_angle_between.js +31 -0
  70. package/core/geom/v3_distance.js +16 -0
  71. package/core/geom/v3_distance_sqr.js +17 -0
  72. package/core/geom/v3_dot.js +13 -0
  73. package/core/geom/v3_length.js +10 -0
  74. package/core/geom/v3_length_sqr.js +10 -0
  75. package/core/geom/v3_lerp.js +21 -0
  76. package/core/geom/v3_slerp.js +48 -0
  77. package/core/graph/graph_k_means_cluster.js +1 -1
  78. package/core/math/MathUtils.js +0 -354
  79. package/core/math/MathUtils.spec.js +7 -1
  80. package/core/math/gaussian.js +9 -0
  81. package/core/math/hash/computeHashFloat.js +17 -0
  82. package/core/math/hash/computeHashFloatArray.js +34 -0
  83. package/core/math/hash/computeObjectHash.js +54 -0
  84. package/core/math/intersects1D.js +19 -0
  85. package/core/math/interval/NumericInterval.js +2 -2
  86. package/core/math/isValueBetween.js +10 -0
  87. package/core/math/isValueBetweenInclusive.js +10 -0
  88. package/core/math/noise/curl_noise_3dt.js +1 -1
  89. package/core/math/noise/sdnoise.js +10 -10
  90. package/core/math/overlap1D.js +19 -0
  91. package/core/math/pingpong.js +17 -0
  92. package/core/math/random/makeRangedRandom.js +19 -0
  93. package/core/math/random/randomFloatBetween.js +14 -0
  94. package/core/math/random/randomFromArray.js +19 -0
  95. package/core/math/random/randomGaussian.js +15 -0
  96. package/core/math/random/randomIntegerBetween.js +14 -0
  97. package/core/math/random/roundFair.js +15 -0
  98. package/core/math/separation1D.js +21 -0
  99. package/core/math/solveQuadratic.js +25 -0
  100. package/core/model/BoundedValue.js +1 -1
  101. package/core/model/node-graph/node/NodeInstancePortReference.js +1 -1
  102. package/core/model/node-graph/node/Port.js +1 -1
  103. package/core/model/reactive/evaluation/MultiPredicateEvaluator.spec.js +3 -1
  104. package/core/model/reactive/model/ReactiveBinaryExpression.js +1 -1
  105. package/core/model/reactive/model/terminal/ReactiveLiteralNumber.js +1 -1
  106. package/core/model/reactive/model/terminal/ReactiveReference.js +1 -1
  107. package/core/model/reactive/model/util/createRandomReactiveExpression.js +1 -1
  108. package/core/model/stat/LinearModifier.js +1 -1
  109. package/core/primitives/array/computeIntegerArrayHash.js +6 -1
  110. package/engine/animation/curve/AnimationCurve.js +72 -0
  111. package/engine/animation/curve/Keyframe.js +27 -0
  112. package/engine/animation/keyed2/AnimationTrack.js +27 -3
  113. package/engine/asset/Asset.js +1 -1
  114. package/engine/asset/loaders/GLTFAssetLoader.d.ts +1 -1
  115. package/engine/asset/loaders/GLTFAssetLoader.js +10 -0
  116. package/engine/asset/loaders/image/ImageRGBADataAsset.js +8 -1
  117. package/engine/asset/loaders/material/computeImageBitmapEquality.js +11 -0
  118. package/engine/asset/loaders/material/computeImageBitmapHash.js +22 -28
  119. package/engine/asset/loaders/material/computeMaterialHash.js +4 -3
  120. package/engine/asset/loaders/material/computeTextureEquality.js +13 -5
  121. package/engine/asset/loaders/material/computeTextureHash.js +2 -1
  122. package/engine/ecs/animation/Animation.js +2 -1
  123. package/engine/ecs/animation/InverseKinematics.js +2 -1
  124. package/engine/ecs/animation/OneBoneSurfaceAlignmentSolver.js +3 -1
  125. package/engine/ecs/animation/TwoBoneInverseKinematicsSolver.js +3 -1
  126. package/engine/ecs/dynamic_actions/DynamicActorSystem.js +2 -1
  127. package/engine/ecs/dynamic_actions/DynamicRuleDescriptionTable.spec.js +3 -5
  128. package/engine/ecs/dynamic_actions/actions/definition/WeightedRandomActionDescription.js +1 -1
  129. package/engine/ecs/evaluation/complex/PointFitnessGaussianBlur.js +1 -1
  130. package/engine/ecs/foliage/ecs/Foliage2.js +1 -1
  131. package/engine/ecs/fow/FogOfWar.js +2 -3
  132. package/engine/ecs/fow/shader/FogOfWarRenderer.js +1 -1
  133. package/engine/ecs/gui/GUIElement.js +1 -1
  134. package/engine/ecs/gui/hud/HeadsUpDisplay.js +1 -1
  135. package/engine/ecs/gui/hud/HeadsUpDisplaySystem.js +1 -1
  136. package/engine/ecs/gui/position/ViewportPosition.js +2 -1
  137. package/engine/ecs/systems/RangedAttackSystem.js +1 -1
  138. package/engine/ecs/systems/SteeringSystem.js +3 -2
  139. package/engine/ecs/terrain/ecs/Terrain.js +6 -0
  140. package/engine/ecs/terrain/ecs/layers/TerrainLayers.js +5 -0
  141. package/engine/ecs/terrain/ecs/splat/SplatMapping.js +5 -0
  142. package/engine/ecs/terrain/tiles/TerrainTileManager.js +1 -1
  143. package/engine/ecs/tooltip/TooltipComponent.js +15 -0
  144. package/engine/ecs/util/hideEntityGracefully.js +18 -0
  145. package/engine/graphics/GraphicsEngine.js +1 -0
  146. package/engine/graphics/camera/testClippingPlaneComputation.js +2 -2
  147. package/engine/graphics/ecs/animation/animator/AnimationClip.js +2 -1
  148. package/engine/graphics/ecs/animation/animator/AnimationClipDefinition.js +2 -1
  149. package/engine/graphics/ecs/animation/animator/AnimationNotification.js +2 -1
  150. package/engine/graphics/ecs/animation/animator/AnimationNotificationDefinition.js +2 -1
  151. package/engine/graphics/ecs/animation/animator/graph/AnimationGraph.js +2 -1
  152. package/engine/graphics/ecs/animation/animator/graph/definition/AnimationGraphDefinition.js +2 -1
  153. package/engine/graphics/ecs/animation/animator/graph/definition/AnimationStateDefinition.js +1 -1
  154. package/engine/graphics/ecs/animation/animator/graph/definition/AnimationTransitionDefinition.js +2 -1
  155. package/engine/graphics/ecs/camera/CameraClippingPlaneComputer.js +2 -2
  156. package/engine/graphics/ecs/highlight/HighlightDefinition.js +2 -1
  157. package/engine/graphics/ecs/highlight/renderer/OutlineRenderer.js +0 -53
  158. package/engine/graphics/ecs/light/Light.d.ts +1 -1
  159. package/engine/graphics/ecs/light/Light.js +3 -0
  160. package/engine/graphics/ecs/mesh/Mesh.js +2 -1
  161. package/engine/graphics/ecs/mesh-v2/ShadedGeometry.d.ts +13 -0
  162. package/engine/graphics/ecs/mesh-v2/ShadedGeometrySystem.d.ts +6 -0
  163. package/engine/graphics/ecs/path/testPathDisplaySystem.js +98 -98
  164. package/engine/graphics/ecs/trail2d/Trail2D.js +17 -4
  165. package/engine/graphics/ecs/trail2d/Trail2DSystem.d.ts +2 -3
  166. package/engine/graphics/ecs/trail2d/Trail2DSystem.js +34 -118
  167. package/engine/graphics/geometry/AttributeSpec.js +105 -0
  168. package/engine/graphics/{micron/format/MicronVertexDataSpec.js → geometry/VertexDataSpec.js} +56 -25
  169. package/engine/graphics/geometry/bvh/buffered/BVHGeometryRaycaster.js +2 -1
  170. package/engine/graphics/micron/build/buildMicronGeometryFromBufferGeometry.js +7 -7
  171. package/engine/graphics/micron/build/clustering/computeFaceCurvatureScore.js +1 -1
  172. package/engine/graphics/micron/build/clustering/compute_face_connection_weight.js +1 -1
  173. package/engine/graphics/micron/build/fill_patch_geometry_data.js +1 -1
  174. package/engine/graphics/micron/build/hierarchy/computePatchMergeScore.js +1 -1
  175. package/engine/graphics/micron/build/hierarchy/patch_combine.js +1 -1
  176. package/engine/graphics/micron/buildPatchwork.js +1 -1
  177. package/engine/graphics/micron/format/MicronGeometry.js +3 -3
  178. package/engine/graphics/micron/format/serialization/MicronGeometryBinarySerializationAdapter.js +2 -2
  179. package/engine/graphics/micron/format/serialization/deserialize_attribute_spec.js +1 -1
  180. package/engine/graphics/micron/format/serialization/serialize_attribute_spec.js +1 -1
  181. package/engine/graphics/micron/render/PatchCacheKey.js +1 -1
  182. package/engine/graphics/micron/render/instanced/AttributeDataTexture.js +5 -5
  183. package/engine/graphics/micron/render/refinement/is_patch_facing_back.js +2 -2
  184. package/engine/graphics/micron/render/v1/ThreeVirtualGeometryAdapter.js +1 -1
  185. package/engine/graphics/particles/particular/engine/ParticularEngine.js +4 -2
  186. package/engine/graphics/particles/particular/engine/emitter/PARTICULAR_PARTICLE_SPECIFICATION.js +84 -0
  187. package/engine/graphics/particles/particular/engine/emitter/ParticleEmitter.js +92 -144
  188. package/engine/graphics/particles/particular/engine/emitter/ParticleLayer.js +14 -3
  189. package/engine/graphics/particles/particular/engine/emitter/ParticlePool.js +51 -12
  190. package/engine/graphics/particles/particular/engine/emitter/ParticlePool.spec.js +3 -2
  191. package/engine/graphics/particles/particular/engine/emitter/computeEmissionFunction.js +37 -0
  192. package/engine/graphics/particles/particular/engine/emitter/distance_to_camera.js +25 -0
  193. package/engine/graphics/particles/particular/engine/emitter/serde/ParameterLookupTableSerializationAdapter.js +8 -2
  194. package/engine/graphics/particles/particular/engine/parameter/ParameterLookupTable.js +2 -1
  195. package/engine/graphics/particles/particular/engine/parameter/ParameterTrack.js +1 -1
  196. package/engine/graphics/particles/particular/engine/parameter/ParticleParameter.js +1 -1
  197. package/engine/graphics/particles/particular/engine/renderers/billboard/BILLBOARD_PARTICLE_SPECIFICATION.js +21 -0
  198. package/engine/graphics/particles/particular/engine/renderers/billboard/ParticleBillboardMaterial.js +0 -20
  199. package/engine/graphics/particles/particular/engine/renderers/billboard/prototypeBillboardRenderer.js +9 -9
  200. package/engine/graphics/particles/particular/engine/shader/ShaderManager.js +7 -25
  201. package/engine/graphics/particles/particular/engine/simulator/SimulationStepApplyForce.js +2 -5
  202. package/engine/graphics/particles/particular/engine/simulator/SimulationStepCurlNoiseAcceleration.js +2 -6
  203. package/engine/graphics/particles/particular/engine/simulator/SimulationStepCurlNoiseVelocity.js +2 -7
  204. package/engine/graphics/particles/particular/engine/simulator/SimulationStepFixedPhysics.js +2 -5
  205. package/engine/graphics/particles/particular/engine/simulator/update_parameters.js +1 -1
  206. package/engine/graphics/particles/particular/engine/utils/distributeParticlesOnObject3D.js +1 -1
  207. package/engine/graphics/particles/particular/engine/utils/distrubuteParticlesOnMesh.js +1 -1
  208. package/engine/graphics/particles/particular/engine/utils/volume/ParticleVolume.js +384 -0
  209. package/engine/graphics/particles/particular/engine/utils/volume/prototypeParticleVolume.js +558 -0
  210. package/engine/graphics/particles/particular/group/Operation.js +18 -0
  211. package/engine/graphics/particles/particular/group/OperationType.js +9 -0
  212. package/engine/graphics/particles/particular/group/ParticleAttribute.js +2 -1
  213. package/engine/graphics/particles/particular/group/ParticleAttributeType.js +11 -0
  214. package/engine/graphics/particles/particular/group/ParticleDataType.js +10 -0
  215. package/engine/graphics/particles/particular/group/ParticleGroup.js +7 -245
  216. package/engine/graphics/particles/particular/group/ParticleGroup.spec.js +3 -1
  217. package/engine/graphics/particles/particular/group/ParticleSpecification.js +21 -14
  218. package/engine/graphics/particles/particular/group/itemSizeFromAttributeType.js +20 -0
  219. package/engine/graphics/particles/particular/group/optimizeCommandQueue.js +162 -0
  220. package/engine/graphics/particles/particular/group/typedArrayConstructorFromDataType.js +19 -0
  221. package/engine/graphics/render/buffer/buffers/prototypeNormalFrameBuffer.js +2 -2
  222. package/engine/graphics/render/buffer/simple-fx/ao/AmbientOcclusionPostProcessEffect.js +1 -1
  223. package/engine/graphics/render/buffer/slot/parameter/ProgramValueSlotParameter.js +2 -1
  224. package/engine/graphics/render/buffer/slot/parameter/ProgramValueSlotParameterSet.js +1 -1
  225. package/engine/graphics/render/forward_plus/LightManager.js +126 -95
  226. package/engine/graphics/render/forward_plus/PointLight.js +9 -0
  227. package/engine/graphics/render/forward_plus/PointLightData.js +1 -1
  228. package/engine/graphics/render/forward_plus/SpotLight.js +9 -0
  229. package/engine/graphics/render/forward_plus/cluster/compute_light_data_hash_0.js +2 -2
  230. package/engine/graphics/render/forward_plus/computeFrustumCorners.js +15 -33
  231. package/engine/graphics/render/forward_plus/plugin/ForwardPlusRenderingPlugin.js +1 -1
  232. package/engine/graphics/render/forward_plus/plugin/MaterialTransformer.js +12 -2
  233. package/engine/graphics/render/forward_plus/plugin/ptototypeFPPlugin.js +6 -6
  234. package/engine/graphics/render/forward_plus/prototypeLightManager.js +231 -136
  235. package/engine/graphics/render/forward_plus/query/analytical_triplanar_corner_mapping.js +8 -0
  236. package/engine/graphics/render/forward_plus/query/cube_mapping.js +38 -0
  237. package/engine/graphics/render/forward_plus/query/detailed_sphere_frustum_intersection_test.js +86 -0
  238. package/engine/graphics/render/forward_plus/query/point_light_inside_volume.js +73 -0
  239. package/engine/graphics/render/forward_plus/query/query_bvh_frustum_from_objects.js +131 -0
  240. package/engine/graphics/render/forward_plus/query/query_bvh_frustum_from_texture.js +129 -0
  241. package/engine/graphics/render/forward_plus/query/spot_light_inside_volume.js +33 -0
  242. package/engine/graphics/render/forward_plus/read_frustum_corner.js +14 -0
  243. package/engine/graphics/render/forward_plus/testClusterEquality.js +22 -0
  244. package/engine/graphics/render/layers/RenderLayerUtils.js +8 -5
  245. package/engine/graphics/render/visibility/IncrementalDeltaSet.js +11 -0
  246. package/engine/graphics/render/visibility/hiz/prototypeHiZ.js +2 -2
  247. package/engine/graphics/texture/atlas/AtlasPatch.js +7 -2
  248. package/engine/graphics/texture/atlas/TextureAtlas.js +18 -14
  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/projectSphere.js +1 -1
  258. package/engine/grid/components/GridObstacle.js +3 -10
  259. package/engine/intelligence/behavior/selector/WeightedElement.js +2 -1
  260. package/engine/intelligence/optimization/RandomOptimizer.js +1 -1
  261. package/engine/navigation/ecs/components/Path.js +3 -2
  262. package/engine/navigation/grid/FastBinaryHeap.spec.js +1 -1
  263. package/engine/reference/v2/Reference.js +6 -0
  264. package/engine/sound/ecs/emitter/SoundEmitter.js +2 -1
  265. package/engine/sound/ecs/emitter/SoundTrack.js +2 -1
  266. package/engine/sound/material/concrete/RandomSoundMaterial.js +1 -1
  267. package/engine/ui/notification/notificationGenerator.js +1 -1
  268. package/generation/filtering/numeric/complex/CellFilterAngleToNormal.js +3 -2
  269. package/generation/filtering/numeric/complex/CellFilterGaussianBlur.js +1 -1
  270. package/generation/grid/generation/GridTaskExecuteRuleTimes.js +2 -1
  271. package/generation/markers/GridCellActionPlaceMarker.js +13 -1
  272. package/generation/markers/MarkerNode.js +6 -0
  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 +5 -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 +19 -101
  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,384 @@
1
+ import { ParticleEmitterFlag } from "../../emitter/ParticleEmitterFlag.js";
2
+ import {
3
+ PARTICLE_ATTRIBUTE_AGE,
4
+ PARTICLE_ATTRIBUTE_BLEND,
5
+ PARTICLE_ATTRIBUTE_COLOR,
6
+ PARTICLE_ATTRIBUTE_DEATH_AGE,
7
+ PARTICLE_ATTRIBUTE_LAYER_POSITION,
8
+ PARTICLE_ATTRIBUTE_POSITION,
9
+ PARTICLE_ATTRIBUTE_SIZE,
10
+ PARTICLE_ATTRIBUTE_SIZE_INITIAL,
11
+ PARTICLE_ATTRIBUTE_VELOCITY
12
+ } from "../../emitter/PARTICLE_ATTRIBUTES.js";
13
+ import { EmissionShapeType } from "../../emitter/EmissionShapeType.js";
14
+ import { computeEmissionFunction } from "../../emitter/computeEmissionFunction.js";
15
+ import { Matrix4 } from "three";
16
+ import { composeMatrix4 } from "../../../../../util/composeMatrix4.js";
17
+ import Quaternion from "../../../../../../../core/geom/Quaternion.js";
18
+ import { ParticleEmitter } from "../../emitter/ParticleEmitter.js";
19
+ import { Transform } from "../../../../../../ecs/transform/Transform.js";
20
+ import EntityBuilder from "../../../../../../ecs/EntityBuilder.js";
21
+ import { vec3 } from "gl-matrix";
22
+
23
+ /**
24
+ *
25
+ * @param {ParticleLayer} layer
26
+ * @returns {number}
27
+ */
28
+ function computeLayerVolume(layer) {
29
+ let base_volume = 0;
30
+
31
+ switch (layer.emissionShape) {
32
+ case EmissionShapeType.Box:
33
+ base_volume = 1;
34
+ break;
35
+ case EmissionShapeType.Sphere:
36
+ base_volume = 0.5236;
37
+ break;
38
+ case EmissionShapeType.Point:
39
+ base_volume = 0;
40
+ break;
41
+ }
42
+
43
+ const scale_volume = layer.scale.x * layer.scale.y * layer.scale.z;
44
+
45
+ return base_volume * scale_volume;
46
+ }
47
+
48
+ /**
49
+ *
50
+ * @param {ParticleEmitter} emitter
51
+ * @param {Transform} transform
52
+ * @returns {number}
53
+ */
54
+ function computeEmitterVolume(emitter, transform) {
55
+
56
+ const layers = emitter.layers;
57
+ const n = layers.length;
58
+
59
+ let layer_volume_sum = 0;
60
+
61
+ for (let i = 0; i < n; i++) {
62
+ const particleLayer = layers.get(i);
63
+
64
+ layer_volume_sum += computeLayerVolume(particleLayer);
65
+ }
66
+
67
+ const scale_volume = transform.scale.x * transform.scale.y * transform.scale.z;
68
+
69
+ return layer_volume_sum * scale_volume;
70
+ }
71
+
72
+ export class ParticleVolume {
73
+
74
+ constructor() {
75
+ this.__emitter = new ParticleEmitter();
76
+
77
+ this.__emitter.fromJSON({
78
+ "parameters": [
79
+ {
80
+ "name": "scale",
81
+ "itemSize": 1,
82
+ "defaultTrackValue": {
83
+ "itemSize": 1,
84
+ "data": [
85
+ 1
86
+ ],
87
+ "positions": [
88
+ 0
89
+ ]
90
+ }
91
+ },
92
+ {
93
+ "name": "color",
94
+ "itemSize": 4,
95
+ "defaultTrackValue": {
96
+ "itemSize": 4,
97
+ "data": [
98
+ 1,
99
+ 1,
100
+ 1,
101
+ 1
102
+ ],
103
+ "positions": [
104
+ 0
105
+ ]
106
+ }
107
+ }
108
+ ],
109
+ "preWarm": false,
110
+ "readDepth": true,
111
+ "softDepth": true,
112
+ "depthSort": false,
113
+ "velocityAlign": false,
114
+ "blendingMode": 0,
115
+ "layers": [
116
+ {
117
+ "imageURL": "data/textures/particle/smokeparticle.png",
118
+ "particleLife": {
119
+ "min": 6,
120
+ "max": 8
121
+ },
122
+ "particleSize": {
123
+ "min": 0.4,
124
+ "max": 0.4
125
+ },
126
+ "particleRotation": {
127
+ "min": 0,
128
+ "max": 0
129
+ },
130
+ "particleRotationSpeed": {
131
+ "min": 0,
132
+ "max": 0
133
+ },
134
+ "emissionShape": 1,
135
+ "emissionFrom": 1,
136
+ "emissionRate": 0,
137
+ "emissionImmediate": 0,
138
+ "parameterTracks": [
139
+ {
140
+ "name": "color",
141
+ "track": {
142
+ "itemSize": 4,
143
+ "data": [
144
+ 0.5764705882352941,
145
+ 0.5764705882352941,
146
+ 0.5764705882352941,
147
+ 0,
148
+ 0.803921568627451,
149
+ 0.803921568627451,
150
+ 0.803921568627451,
151
+ 0.28160919540229884,
152
+ 0.803921568627451,
153
+ 0.803921568627451,
154
+ 0.803921568627451,
155
+ 0.21264367816091953,
156
+ 0.803921568627451,
157
+ 0.803921568627451,
158
+ 0.803921568627451,
159
+ 0
160
+ ],
161
+ "positions": [
162
+ 0,
163
+ 0.18085106382978725,
164
+ 0.7074468085106383,
165
+ 1
166
+ ]
167
+ }
168
+ },
169
+ {
170
+ "name": "scale",
171
+ "track": {
172
+ "itemSize": 1,
173
+ "data": [
174
+ 1
175
+ ],
176
+ "positions": [
177
+ 0
178
+ ]
179
+ }
180
+ }
181
+ ],
182
+ "position": {
183
+ "x": 0,
184
+ "y": 0,
185
+ "z": 0
186
+ },
187
+ "scale": {
188
+ "x": 1,
189
+ "y": 1,
190
+ "z": 1
191
+ },
192
+ "particleVelocityDirection": {
193
+ "direction": {
194
+ "x": 0,
195
+ "y": 1,
196
+ "z": 0
197
+ },
198
+ "angle": 0.1
199
+ },
200
+ "particleSpeed": {
201
+ "min": 0,
202
+ "max": 0
203
+ },
204
+ "steps": []
205
+ }
206
+ ]
207
+ });
208
+
209
+ /**
210
+ *
211
+ * @type {Transform}
212
+ * @private
213
+ */
214
+ this.__transform = new Transform();
215
+
216
+ /**
217
+ * Particle count per unit of volume
218
+ * @type {number}
219
+ * @private
220
+ */
221
+ this.__density = 1;
222
+
223
+ const eb = new EntityBuilder();
224
+
225
+ eb.add(this.__emitter)
226
+ .add(this.__transform);
227
+
228
+ /**
229
+ *
230
+ * @type {EntityBuilder}
231
+ */
232
+ this.entity = eb;
233
+ }
234
+
235
+ get emitter() {
236
+ return this.__emitter;
237
+ }
238
+
239
+ get transform() {
240
+ return this.__transform;
241
+ }
242
+
243
+ from({
244
+ density = 1,
245
+ particle_size = 1,
246
+ }) {
247
+
248
+ this.__density = density;
249
+
250
+ this.__emitter.layers.get(0).particleSize.set(particle_size, particle_size);
251
+
252
+ }
253
+
254
+ __ensure_initialized() {
255
+
256
+ const emitter = this.__emitter;
257
+
258
+ if (!emitter.getFlag(ParticleEmitterFlag.Built)) {
259
+ //particle pool needs to be set up first
260
+ emitter.build();
261
+ }
262
+
263
+ if (!emitter.getFlag(ParticleEmitterFlag.Initialized)) {
264
+ //particles are not initialized, do that
265
+ emitter.initialize();
266
+ }
267
+
268
+ }
269
+
270
+ /**
271
+ * Distribute particles in the volume
272
+ * @param {function():number} random
273
+ * @private
274
+ */
275
+ __distribute(random) {
276
+ const emitter = this.__emitter;
277
+ const particles = emitter.particles;
278
+ const particle_count = particles.size();
279
+
280
+ const layer = emitter.layers.get(0);
281
+
282
+ const volume_sampler = computeEmissionFunction(layer.emissionFrom, layer.emissionShape);
283
+
284
+ const m4_transform = new Matrix4();
285
+
286
+ const t = this.__transform;
287
+
288
+ composeMatrix4(m4_transform, t.position, t.rotation, t.scale);
289
+
290
+
291
+ const m4_layer = new Matrix4();
292
+
293
+ composeMatrix4(m4_layer, layer.position, new Quaternion(), layer.scale);
294
+
295
+ const v3_position = [];
296
+
297
+ const m4_final = new Matrix4();
298
+
299
+ m4_final.multiplyMatrices(m4_transform, m4_layer);
300
+
301
+ const blending = emitter.blendingMode;
302
+
303
+ for (let i = 0; i < particle_count; i++) {
304
+
305
+ volume_sampler(random, v3_position, 0);
306
+
307
+ vec3.transformMat4(v3_position, v3_position, m4_final.elements);
308
+
309
+ particles.writeAttributeScalar(i, PARTICLE_ATTRIBUTE_AGE, 0);
310
+
311
+ particles.writeAttributeVector3(i, PARTICLE_ATTRIBUTE_VELOCITY, 0, 0, 0);
312
+
313
+ particles.writeAttributeVector3(i, PARTICLE_ATTRIBUTE_POSITION, v3_position[0], v3_position[1], v3_position[2]);
314
+
315
+ particles.writeAttributeScalar(i, PARTICLE_ATTRIBUTE_DEATH_AGE, 99999999);
316
+
317
+ const size = layer.particleSize.sampleRandom(random);
318
+
319
+ particles.writeAttributeScalar(i, PARTICLE_ATTRIBUTE_SIZE_INITIAL, size);
320
+ particles.writeAttributeScalar(i, PARTICLE_ATTRIBUTE_SIZE, size);
321
+
322
+ particles.writeAttributeScalar(i, PARTICLE_ATTRIBUTE_LAYER_POSITION, 0);
323
+
324
+ particles.writeAttributeVector4(i, PARTICLE_ATTRIBUTE_COLOR, 1, 1, 1, 1);
325
+
326
+ particles.writeAttributeScalar(i, PARTICLE_ATTRIBUTE_BLEND, blending);
327
+ }
328
+
329
+ // request bounds update
330
+ emitter.setFlag(ParticleEmitterFlag.ParticleBoundsNeedUpdate);
331
+ }
332
+
333
+ build() {
334
+ const volume_value = computeEmitterVolume(this.__emitter, this.__transform);
335
+
336
+ // total particle count
337
+ const particle_count = Math.max(1, Math.ceil(volume_value * this.__density));
338
+
339
+
340
+ this.__ensure_initialized();
341
+
342
+ const particles = this.__emitter.particles;
343
+
344
+ // reserve particles
345
+ particles.setCapacity(particle_count);
346
+
347
+ // "spawn" particles to occupy the entire pool
348
+ particles.occupancy.setRange(0, particle_count - 1);
349
+
350
+ // trigger sprite update
351
+ this.__emitter.setFlag(ParticleEmitterFlag.SpritesNeedUpdate);
352
+
353
+ this.__distribute(Math.random);
354
+ }
355
+
356
+ /**
357
+ *
358
+ * @param {number} r
359
+ * @param {number} g
360
+ * @param {number} b
361
+ * @param {number} a
362
+ */
363
+ setColor(r, g, b, a) {
364
+
365
+ this.__ensure_initialized();
366
+
367
+ const emitter = this.__emitter;
368
+
369
+ const particles = emitter.particles;
370
+
371
+ const particle_count = particles.size();
372
+
373
+ for (let i = 0; i < particle_count; i++) {
374
+
375
+ particles.writeAttributeVector4(i, PARTICLE_ATTRIBUTE_COLOR, r, g, b, a);
376
+
377
+ }
378
+
379
+ const attribute = particles.attributes[PARTICLE_ATTRIBUTE_COLOR];
380
+ attribute.needsUpdate = true;
381
+ attribute.updateRange.count = particle_count;
382
+ attribute.updateRange.offset = 0;
383
+ }
384
+ }