@woosh/meep-engine 2.33.21 → 2.33.25

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (285) hide show
  1. package/core/assert.js +3 -1
  2. package/core/bvh2/BinaryNode.js +1 -1
  3. package/core/bvh2/aabb3/AABB3.js +18 -0
  4. package/core/bvh2/aabb3/AABB3Math.js +1 -1
  5. package/core/bvh2/binary/2/BinaryUint32BVH.js +498 -0
  6. package/core/bvh2/binary/2/BinaryUint32BVH.spec.js +54 -0
  7. package/core/bvh2/binary/IndexedBinaryBVH.js +22 -26
  8. package/core/bvh2/traversal/ThreeClippingPlaneComputingBVHVisitor.js +5 -1
  9. package/core/bvh2/traversal/__detailed_box_volume_intersection.js +31 -11
  10. package/core/collection/ArrayUtils.js +1 -1
  11. package/core/collection/array/arrayQuickSort.js +9 -6
  12. package/core/collection/array/array_swap.js +22 -0
  13. package/core/collection/array/binarySearchHighIndex.js +1 -1
  14. package/core/collection/array/computeHashArray.js +22 -0
  15. package/core/collection/array/computeHashIntegerArray.js +15 -0
  16. package/core/collection/array/copyArray.js +2 -2
  17. package/core/collection/table/DataType2TypedArrayConstructorMapping.js +15 -0
  18. package/core/color/Color.js +2 -1
  19. package/core/function/FunctionCompiler.js +2 -1
  20. package/core/geom/3d/aabb/aabb3_computeDistanceAbovePlane.js +9 -33
  21. package/core/geom/3d/frustum/frustum3_computeNearestPointToPoint.js +10 -2
  22. package/core/geom/3d/line/line3_computeSegmentPointDistance_sqr.js +41 -0
  23. package/core/geom/3d/morton/mortonEncode_magicbits.js +2 -1
  24. package/core/geom/3d/morton/reinterpret_float32_as_int32.js +13 -0
  25. package/core/geom/3d/morton/v3_morton_encode_transformed.js +33 -0
  26. package/core/geom/3d/normal/hemioct/unit_hemioct.spec.js +1 -1
  27. package/core/geom/3d/plane/plane_computeConvex3PlaneIntersection.js +13 -14
  28. package/core/geom/3d/ray/ray_computeNearestPointToPoint.js +37 -0
  29. package/core/geom/3d/shape/AbstractShape3D.js +38 -0
  30. package/core/geom/3d/shape/CompositeShape.js +240 -0
  31. package/core/geom/3d/shape/TransformedShape3D.js +126 -0
  32. package/core/geom/3d/shape/UnitCubeShape3D.js +24 -0
  33. package/core/geom/3d/shape/UnitSphereShape3D.js +24 -0
  34. package/core/geom/3d/shape/util/shape_to_visual_entity.js +159 -0
  35. package/core/geom/3d/voxel/DenseBitVolume3D.js +87 -0
  36. package/core/geom/3d/voxel/buildVolumeFromProjectedGeometry.js +23 -0
  37. package/core/geom/AABB2.js +1 -1
  38. package/core/geom/ConicRay.js +3 -1
  39. package/core/geom/LineSegment.js +0 -78
  40. package/core/geom/Matrix4.js +7 -8
  41. package/core/geom/Plane.js +14 -9
  42. package/core/geom/Rectangle.js +2 -1
  43. package/core/geom/Vector1.js +1 -1
  44. package/core/geom/Vector3.js +2 -1
  45. package/core/geom/Vector4.js +2 -1
  46. package/core/geom/random/randomPointInBox.js +7 -3
  47. package/core/geom/random/randomPointInPoint.js +6 -3
  48. package/core/geom/random/randomPointInSphere.js +9 -5
  49. package/core/geom/random/randomPointOnBox.js +7 -3
  50. package/core/geom/random/randomPointOnSphere.js +6 -3
  51. package/core/geom/v3_length.js +8 -3
  52. package/core/graph/graph_k_means_cluster.js +1 -1
  53. package/core/json/resolvePathByArray.js +2 -2
  54. package/core/math/MathUtils.js +0 -354
  55. package/core/math/MathUtils.spec.js +7 -1
  56. package/core/math/gaussian.js +9 -0
  57. package/core/math/hash/computeHashFloat.js +17 -0
  58. package/core/math/hash/computeHashFloatArray.js +34 -0
  59. package/core/math/hash/computeObjectHash.js +54 -0
  60. package/core/math/intersects1D.js +19 -0
  61. package/core/math/interval/NumericInterval.js +2 -2
  62. package/core/math/isValueBetween.js +10 -0
  63. package/core/math/isValueBetweenInclusive.js +10 -0
  64. package/core/math/noise/curl_noise_3dt.js +1 -1
  65. package/core/math/noise/sdnoise.js +10 -10
  66. package/core/math/overlap1D.js +19 -0
  67. package/core/math/pingpong.js +17 -0
  68. package/core/math/random/makeRangedRandom.js +19 -0
  69. package/core/math/random/randomFloatBetween.js +14 -0
  70. package/core/math/random/randomFromArray.js +19 -0
  71. package/core/math/random/randomGaussian.js +15 -0
  72. package/core/math/random/randomIntegerBetween.js +14 -0
  73. package/core/math/random/roundFair.js +15 -0
  74. package/core/math/separation1D.js +21 -0
  75. package/core/math/solveQuadratic.js +25 -0
  76. package/core/model/BoundedValue.js +1 -1
  77. package/core/model/node-graph/node/NodeInstancePortReference.js +1 -1
  78. package/core/model/node-graph/node/Port.js +1 -1
  79. package/core/model/reactive/evaluation/MultiPredicateEvaluator.spec.js +3 -1
  80. package/core/model/reactive/model/ReactiveBinaryExpression.js +1 -1
  81. package/core/model/reactive/model/terminal/ReactiveLiteralNumber.js +1 -1
  82. package/core/model/reactive/model/terminal/ReactiveReference.js +1 -1
  83. package/core/model/reactive/model/util/createRandomReactiveExpression.js +1 -1
  84. package/core/model/stat/LinearModifier.js +1 -1
  85. package/core/primitives/array/computeIntegerArrayHash.js +1 -1
  86. package/{engine/graphics/render/forward_plus/materials → core/primitives/strings}/insert_after.js +3 -0
  87. package/core/primitives/strings/insert_after_or_replace.js +27 -0
  88. package/editor/process/symbolic/makeHelperBoxGeometry.js +44 -0
  89. package/editor/view/ecs/EntityEditor.js +2 -2
  90. package/editor/view/ecs/components/particles/ParticleEmitterController.js +2 -2
  91. package/engine/EngineHarness.js +1 -0
  92. package/engine/animation/AnimationUtils.js +5 -5
  93. package/engine/animation/curve/AnimationCurve.js +72 -0
  94. package/engine/animation/curve/Keyframe.js +27 -0
  95. package/engine/animation/keyed2/AnimationTrack.js +27 -3
  96. package/engine/asset/Asset.js +1 -1
  97. package/engine/asset/loaders/GLTFAssetLoader.d.ts +1 -1
  98. package/engine/asset/loaders/GLTFAssetLoader.js +10 -0
  99. package/engine/asset/loaders/image/ImageRGBADataAsset.js +8 -1
  100. package/engine/asset/loaders/material/computeImageBitmapEquality.js +11 -0
  101. package/engine/asset/loaders/material/computeImageBitmapHash.js +22 -28
  102. package/engine/asset/loaders/material/computeMaterialHash.js +3 -1
  103. package/engine/asset/loaders/material/computeTextureHash.js +2 -1
  104. package/engine/ecs/EntityBuilder.js +25 -5
  105. package/engine/ecs/animation/Animation.js +2 -1
  106. package/engine/ecs/animation/InverseKinematics.js +2 -1
  107. package/engine/ecs/attachment/AttachmentBinding.js +8 -0
  108. package/engine/ecs/attachment/AttachmentSystem.js +4 -0
  109. package/engine/ecs/attachment/TransformAttachmentBinding.js +14 -44
  110. package/engine/ecs/components/Tag.js +27 -6
  111. package/engine/ecs/dynamic_actions/DynamicActorSystem.js +2 -1
  112. package/engine/ecs/dynamic_actions/DynamicRuleDescriptionTable.spec.js +3 -5
  113. package/engine/ecs/dynamic_actions/actions/definition/WeightedRandomActionDescription.js +1 -1
  114. package/engine/ecs/evaluation/complex/PointFitnessGaussianBlur.js +1 -1
  115. package/engine/ecs/foliage/ecs/Foliage2.js +1 -1
  116. package/engine/ecs/fow/FogOfWar.js +4 -0
  117. package/engine/ecs/fow/FogOfWarSystem.js +2 -0
  118. package/engine/ecs/fow/shader/FogOfWarRenderer.js +1 -1
  119. package/engine/ecs/gui/GUIElement.js +1 -1
  120. package/engine/ecs/gui/hud/HeadsUpDisplay.js +1 -1
  121. package/engine/ecs/gui/hud/HeadsUpDisplaySystem.js +2 -0
  122. package/engine/ecs/gui/position/ViewportPosition.js +2 -1
  123. package/engine/ecs/system/AbstractContextSystem.js +1 -1
  124. package/engine/ecs/systems/RangedAttackSystem.js +1 -1
  125. package/engine/ecs/systems/SteeringSystem.js +1 -1
  126. package/engine/ecs/systems/TagSystem.js +17 -0
  127. package/engine/ecs/terrain/tiles/TerrainTileManager.js +1 -1
  128. package/engine/ecs/tooltip/TooltipComponent.js +15 -0
  129. package/engine/ecs/transform/Transform.js +19 -6
  130. package/engine/ecs/util/hideEntityGracefully.js +18 -0
  131. package/engine/graphics/GraphicsEngine.js +11 -23
  132. package/engine/graphics/camera/testClippingPlaneComputation.js +2 -2
  133. package/engine/graphics/composit/CompositLayer.js +17 -4
  134. package/engine/graphics/composit/CompositingStages.js +8 -0
  135. package/engine/graphics/composit/LayerCompositer.js +35 -6
  136. package/engine/graphics/ecs/animation/animator/AnimationClip.js +2 -1
  137. package/engine/graphics/ecs/animation/animator/AnimationClipDefinition.js +2 -1
  138. package/engine/graphics/ecs/animation/animator/AnimationNotification.js +2 -1
  139. package/engine/graphics/ecs/animation/animator/AnimationNotificationDefinition.js +2 -1
  140. package/engine/graphics/ecs/animation/animator/graph/AnimationGraph.js +2 -1
  141. package/engine/graphics/ecs/animation/animator/graph/definition/AnimationGraphDefinition.js +2 -1
  142. package/engine/graphics/ecs/animation/animator/graph/definition/AnimationStateDefinition.js +1 -1
  143. package/engine/graphics/ecs/animation/animator/graph/definition/AnimationTransitionDefinition.js +2 -1
  144. package/engine/graphics/ecs/camera/CameraClippingPlaneComputer.js +1 -1
  145. package/engine/graphics/ecs/highlight/HighlightDefinition.js +2 -1
  146. package/engine/graphics/ecs/highlight/plugin/OutlineRenderPlugin.js +11 -7
  147. package/engine/graphics/ecs/light/Light.d.ts +1 -1
  148. package/engine/graphics/ecs/light/Light.js +5 -0
  149. package/engine/graphics/ecs/light/binding/three/ThreeLightBinding.js +5 -1
  150. package/engine/graphics/ecs/mesh/Mesh.js +2 -1
  151. package/engine/graphics/ecs/mesh-v2/DrawMode.js +5 -0
  152. package/engine/graphics/ecs/mesh-v2/ShadedGeometry.d.ts +13 -0
  153. package/engine/graphics/ecs/mesh-v2/ShadedGeometry.js +32 -18
  154. package/engine/graphics/ecs/mesh-v2/ShadedGeometrySystem.d.ts +6 -0
  155. package/engine/graphics/ecs/path/testPathDisplaySystem.js +98 -98
  156. package/engine/graphics/ecs/trail2d/Trail2D.js +17 -4
  157. package/engine/graphics/ecs/trail2d/Trail2DSystem.d.ts +2 -3
  158. package/engine/graphics/ecs/trail2d/Trail2DSystem.js +34 -118
  159. package/engine/graphics/geometry/AttributeSpec.js +105 -0
  160. package/engine/graphics/{micron/format/MicronVertexDataSpec.js → geometry/VertexDataSpec.js} +56 -25
  161. package/engine/graphics/micron/build/buildMicronGeometryFromBufferGeometry.js +7 -7
  162. package/engine/graphics/micron/build/fill_patch_geometry_data.js +1 -1
  163. package/engine/graphics/micron/buildPatchwork.js +1 -1
  164. package/engine/graphics/micron/format/MicronGeometry.js +3 -3
  165. package/engine/graphics/micron/format/serialization/MicronGeometryBinarySerializationAdapter.js +2 -2
  166. package/engine/graphics/micron/format/serialization/deserialize_attribute_spec.js +1 -1
  167. package/engine/graphics/micron/format/serialization/serialize_attribute_spec.js +1 -1
  168. package/engine/graphics/micron/render/PatchCacheKey.js +1 -1
  169. package/engine/graphics/micron/render/instanced/AttributeDataTexture.js +5 -5
  170. package/engine/graphics/micron/render/v1/ThreeVirtualGeometryAdapter.js +1 -1
  171. package/engine/graphics/particles/ParticleEmitterLibrary.js +3 -0
  172. package/engine/graphics/particles/ecs/{ParticleEmitterSystem2.js → ParticleEmitterSystem.js} +17 -9
  173. package/engine/graphics/particles/particular/engine/ParticularEngine.js +12 -4
  174. package/engine/graphics/particles/particular/engine/emitter/PARTICULAR_PARTICLE_SPECIFICATION.js +84 -0
  175. package/engine/graphics/particles/particular/engine/emitter/ParticleEmitter.js +106 -169
  176. package/engine/graphics/particles/particular/engine/emitter/ParticleEmitterFlag.js +5 -0
  177. package/engine/graphics/particles/particular/engine/emitter/ParticleLayer.js +14 -3
  178. package/engine/graphics/particles/particular/engine/emitter/ParticlePool.js +141 -14
  179. package/engine/graphics/particles/particular/engine/emitter/ParticlePool.spec.js +8 -7
  180. package/engine/graphics/particles/particular/engine/emitter/computeEmissionFunction.js +37 -0
  181. package/engine/graphics/particles/particular/engine/emitter/distance_to_camera.js +25 -0
  182. package/engine/graphics/particles/particular/engine/emitter/serde/ParameterLookupTableSerializationAdapter.js +8 -2
  183. package/engine/graphics/particles/particular/engine/parameter/ParameterLookupTable.js +2 -1
  184. package/engine/graphics/particles/particular/engine/parameter/ParameterTrack.js +1 -1
  185. package/engine/graphics/particles/particular/engine/parameter/ParticleParameter.js +1 -1
  186. package/engine/graphics/particles/particular/engine/renderers/billboard/BILLBOARD_PARTICLE_SPECIFICATION.js +24 -0
  187. package/engine/graphics/particles/particular/engine/renderers/billboard/ParticleBillboardMaterial.js +262 -71
  188. package/engine/graphics/particles/particular/engine/renderers/billboard/prototypeBillboardRenderer.js +9 -9
  189. package/engine/graphics/particles/particular/engine/shader/ShaderManager.js +80 -46
  190. package/engine/graphics/particles/particular/engine/shader/debugAtlas.js +14 -0
  191. package/engine/graphics/particles/particular/engine/simulator/SimulationStepApplyForce.js +2 -5
  192. package/engine/graphics/particles/particular/engine/simulator/SimulationStepCurlNoiseAcceleration.js +2 -6
  193. package/engine/graphics/particles/particular/engine/simulator/SimulationStepCurlNoiseVelocity.js +2 -7
  194. package/engine/graphics/particles/particular/engine/simulator/SimulationStepFixedPhysics.js +2 -5
  195. package/engine/graphics/particles/particular/engine/simulator/update_parameters.js +1 -1
  196. package/engine/graphics/particles/particular/engine/utils/distributeParticlesOnObject3D.js +1 -1
  197. package/engine/graphics/particles/particular/engine/utils/distrubuteParticlesOnMesh.js +1 -1
  198. package/engine/graphics/particles/particular/engine/utils/volume/AttributeValue.js +141 -0
  199. package/engine/graphics/particles/particular/engine/utils/volume/ParticleVolume.js +478 -0
  200. package/engine/graphics/particles/particular/engine/utils/volume/lut_to_sampler.js +27 -0
  201. package/engine/graphics/particles/particular/engine/utils/volume/prototypeParticleVolume.js +935 -0
  202. package/engine/graphics/particles/particular/group/Operation.js +18 -0
  203. package/engine/graphics/particles/particular/group/OperationType.js +9 -0
  204. package/engine/graphics/particles/particular/group/ParticleAttribute.js +2 -1
  205. package/engine/graphics/particles/particular/group/ParticleAttributeType.js +11 -0
  206. package/engine/graphics/particles/particular/group/ParticleDataType.js +10 -0
  207. package/engine/graphics/particles/particular/group/ParticleGroup.js +7 -245
  208. package/engine/graphics/particles/particular/group/ParticleGroup.spec.js +3 -1
  209. package/engine/graphics/particles/particular/group/ParticleSpecification.js +21 -14
  210. package/engine/graphics/particles/particular/group/itemSizeFromAttributeType.js +20 -0
  211. package/engine/graphics/particles/particular/group/optimizeCommandQueue.js +162 -0
  212. package/engine/graphics/particles/particular/group/typedArrayConstructorFromDataType.js +19 -0
  213. package/engine/graphics/render/buffer/buffers/prototypeNormalFrameBuffer.js +2 -2
  214. package/engine/graphics/render/buffer/simple-fx/ao/AmbientOcclusionPostProcessEffect.js +13 -7
  215. package/engine/graphics/render/buffer/slot/parameter/ProgramValueSlotParameter.js +2 -1
  216. package/engine/graphics/render/buffer/slot/parameter/ProgramValueSlotParameterSet.js +1 -1
  217. package/engine/graphics/render/forward_plus/LightManager.js +126 -95
  218. package/engine/graphics/render/forward_plus/PointLight.js +9 -0
  219. package/engine/graphics/render/forward_plus/PointLightData.js +1 -1
  220. package/engine/graphics/render/forward_plus/SpotLight.js +9 -0
  221. package/engine/graphics/render/forward_plus/cluster/compute_light_data_hash_0.js +2 -2
  222. package/engine/graphics/render/forward_plus/computeFrustumCorners.js +14 -32
  223. package/engine/graphics/render/forward_plus/materials/FP_INJECTION_POINT_ACCUMULATION.js +1 -0
  224. package/engine/graphics/render/forward_plus/materials/FP_SHADER_CHUNK_ACCUMULATION.js +32 -0
  225. package/engine/graphics/render/forward_plus/materials/FP_SHADER_CHUNK_DECODE_PARS.js +51 -0
  226. package/engine/graphics/render/forward_plus/materials/FP_SHADER_CHUNK_PREAMBLE.js +25 -0
  227. package/engine/graphics/render/forward_plus/materials/fp_build_fragment_shader.js +31 -120
  228. package/engine/graphics/render/forward_plus/materials/fp_build_vertex_lighting_shared.js +35 -0
  229. package/engine/graphics/render/forward_plus/materials/fp_build_vertex_shader.js +4 -5
  230. package/engine/graphics/render/forward_plus/plugin/ForwardPlusRenderingPlugin.js +1 -1
  231. package/engine/graphics/render/forward_plus/plugin/MaterialTransformer.js +10 -3
  232. package/engine/graphics/render/forward_plus/plugin/ptototypeFPPlugin.js +595 -60
  233. package/engine/graphics/render/forward_plus/prototypeLightManager.js +256 -136
  234. package/engine/graphics/render/forward_plus/query/analytical_triplanar_corner_mapping.js +8 -0
  235. package/engine/graphics/render/forward_plus/query/cube_mapping.js +38 -0
  236. package/engine/graphics/render/forward_plus/query/detailed_sphere_frustum_intersection_test.js +86 -0
  237. package/engine/graphics/render/forward_plus/query/point_light_inside_volume.js +73 -0
  238. package/engine/graphics/render/forward_plus/query/query_bvh_frustum_from_objects.js +131 -0
  239. package/engine/graphics/render/forward_plus/query/query_bvh_frustum_from_texture.js +129 -0
  240. package/engine/graphics/render/forward_plus/query/spot_light_inside_volume.js +33 -0
  241. package/engine/graphics/render/forward_plus/read_frustum_corner.js +14 -0
  242. package/engine/graphics/render/forward_plus/testClusterEquality.js +22 -0
  243. package/engine/graphics/render/layers/RenderLayerUtils.js +7 -4
  244. package/engine/graphics/render/visibility/IncrementalDeltaSet.js +11 -0
  245. package/engine/graphics/render/visibility/hiz/prototypeHiZ.js +2 -2
  246. package/engine/graphics/shaders/TerrainShader.js +4 -5
  247. package/engine/graphics/texture/atlas/AtlasPatch.js +7 -2
  248. package/engine/graphics/texture/atlas/TextureAtlas.js +2 -2
  249. package/engine/graphics/texture/sampler/HarmonicDiffusionGrid.spec.js +1 -1
  250. package/engine/graphics/texture/sampler/SampleTraverser.js +1 -1
  251. package/engine/graphics/texture/sampler/Sampler2D.js +8 -7
  252. package/engine/graphics/texture/sampler/distanceField.spec.js +1 -1
  253. package/engine/graphics/texture/sampler/scaleSampler2D.js +7 -10
  254. package/engine/graphics/trail/x/RibbonMaterialX.js +3 -3
  255. package/engine/graphics/trail/x/RibbonX.js +17 -2
  256. package/engine/graphics/trail/x/RibbonXPlugin.js +51 -1
  257. package/engine/graphics/util/composeMatrix4.js +33 -23
  258. package/engine/graphics/util/decompose_matrix_4_array.js +61 -0
  259. package/engine/grid/components/GridObstacle.js +3 -10
  260. package/engine/intelligence/behavior/ecs/BehaviorComponent.js +30 -14
  261. package/engine/intelligence/behavior/selector/WeightedElement.js +2 -1
  262. package/engine/intelligence/optimization/RandomOptimizer.js +1 -1
  263. package/engine/knowledge/database/StaticKnowledgeDataTable.js +6 -1
  264. package/engine/navigation/ecs/components/Path.js +1 -6
  265. package/engine/navigation/grid/FastBinaryHeap.spec.js +1 -1
  266. package/engine/reference/v2/Reference.js +6 -0
  267. package/engine/sound/ecs/emitter/SoundEmitter.js +2 -1
  268. package/engine/sound/ecs/emitter/SoundTrack.js +2 -1
  269. package/engine/sound/material/concrete/RandomSoundMaterial.js +1 -1
  270. package/engine/ui/notification/notificationGenerator.js +1 -1
  271. package/generation/filtering/numeric/complex/CellFilterGaussianBlur.js +1 -1
  272. package/generation/grid/generation/GridTaskExecuteRuleTimes.js +2 -1
  273. package/generation/markers/actions/MarkerNodeActionSelectRandom.js +1 -1
  274. package/generation/markers/transform/MarkerNodeTransformerRecordUniqueRandomEnum.js +1 -1
  275. package/generation/placement/action/random/CellActionSelectRandom.js +1 -1
  276. package/generation/theme/ThemeEngine.js +2 -2
  277. package/misc/makeMaterialIconCached.js +2 -2
  278. package/package.json +3 -3
  279. package/view/View.js +4 -2
  280. package/view/elements/image/HTMLElementCacheKey.js +2 -1
  281. package/view/elements/radial/RadialText.js +2 -1
  282. package/view/minimap/gl/MinimapMarkersGL.js +6 -100
  283. package/view/minimap/gl/buildMaterial.js +94 -0
  284. package/engine/graphics/micron/format/MicronGeometryBufferAttributeSpec.js +0 -71
  285. package/engine/graphics/render/forward_plus/queryBVH_Frustum.js +0 -345
@@ -1,9 +1,12 @@
1
1
  import { BitSet } from "../../../../../../core/binary/BitSet.js";
2
2
  import { max3 } from "../../../../../../core/math/max3.js";
3
- import { itemSizeFromAttributeType, typedArrayConstructorFromDataType } from "../../group/ParticleGroup.js";
4
- import { BufferAttribute, BufferGeometry, DynamicDrawUsage } from 'three';
3
+ import { BufferAttribute, BufferGeometry, StreamDrawUsage } from 'three';
5
4
  import ObservedValue from "../../../../../../core/model/ObservedValue.js";
6
5
  import { typed_array_copy } from "../../../../../../core/collection/array/typed/typed_array_copy.js";
6
+ import { assert } from "../../../../../../core/assert.js";
7
+ import { compute_typed_array_constructor_from_data_type } from "../../../../../../core/collection/table/DataType2TypedArrayConstructorMapping.js";
8
+ import { min2 } from "../../../../../../core/math/min2.js";
9
+ import { max2 } from "../../../../../../core/math/max2.js";
7
10
 
8
11
  const SHRINK_THRESHOLD = 64;
9
12
  const GROW_MIN_STEP = 32;
@@ -11,13 +14,15 @@ const GROW_MIN_STEP = 32;
11
14
  export class ParticlePool {
12
15
  /**
13
16
  *
14
- * @param {ParticleSpecification} spec
17
+ * @param {VertexDataSpec} spec
15
18
  * @constructor
16
19
  */
17
20
  constructor(spec) {
21
+ assert.equal(spec.isVertexDataSpec, true, 'spec.VertexDataSpec !== true');
22
+
18
23
  /**
19
24
  *
20
- * @type {ParticleSpecification}
25
+ * @type {VertexDataSpec}
21
26
  */
22
27
  this.spec = spec;
23
28
 
@@ -215,15 +220,50 @@ export class ParticlePool {
215
220
  const addressA = offsetA + j;
216
221
  const addressB = offsetB + j;
217
222
 
218
- const elementA = array[addressA];
223
+ const temp = array[addressA];
219
224
 
220
225
  array[addressA] = array[addressB];
221
226
 
222
- array[addressB] = elementA;
227
+ array[addressB] = temp;
223
228
  }
224
229
  }
225
230
  }
226
231
 
232
+ /**
233
+ *
234
+ * @param {AttributeSpec} spec
235
+ * @return {number}
236
+ * @private
237
+ */
238
+ __compute_attribute_byte_size(spec) {
239
+
240
+ const item_size = spec.itemSize;
241
+
242
+ const TypedArrayConstructor = compute_typed_array_constructor_from_data_type(spec.type);
243
+
244
+ const element_byte_size = TypedArrayConstructor.BYTES_PER_ELEMENT;
245
+
246
+ return item_size * element_byte_size * this.capacity;
247
+ }
248
+
249
+ /**
250
+ *
251
+ * @return {number}
252
+ * @private
253
+ */
254
+ __compute_attribute_byte_size_total() {
255
+
256
+ const spec_attributes = this.spec.attributes;
257
+ const l = spec_attributes.length;
258
+
259
+ let r = 0;
260
+ for (let i = 0; i < l; i++) {
261
+ r += this.__compute_attribute_byte_size(spec_attributes[i]);
262
+ }
263
+
264
+ return r;
265
+ }
266
+
227
267
  build() {
228
268
  const geometry = new BufferGeometry();
229
269
  geometry.dynamic = true;
@@ -234,25 +274,26 @@ export class ParticlePool {
234
274
  for (let i = 0; i < l; i++) {
235
275
 
236
276
  /**
237
- * @type {ParticleAttribute}
277
+ * @type {AttributeSpec}
238
278
  */
239
279
  const attributeSpec = spec_attributes[i];
240
280
 
241
- const itemSize = itemSizeFromAttributeType(attributeSpec.type);
242
- const TypedArrayConstructor = typedArrayConstructorFromDataType(attributeSpec.dataType);
281
+ const itemSize = attributeSpec.itemSize;
282
+ const TypedArrayConstructor = compute_typed_array_constructor_from_data_type(attributeSpec.type);
243
283
 
244
284
  const newArrayLength = itemSize * this.capacity;
245
285
  const newArray = new TypedArrayConstructor(newArrayLength);
246
286
 
247
- const attribute = this.attributes[i];
248
- if (attribute !== undefined && attribute.count !== 0) {
287
+ const old_attribute = this.attributes[i];
288
+
289
+ if (old_attribute !== undefined && old_attribute.count !== 0) {
249
290
  //copy old data
250
- typed_array_copy(attribute.array, newArray);
291
+ typed_array_copy(old_attribute.array, newArray);
251
292
  }
252
293
 
253
- const newAttribute = new BufferAttribute(newArray, itemSize);
294
+ const newAttribute = new BufferAttribute(newArray, itemSize, attributeSpec.normalized);
254
295
 
255
- newAttribute.setUsage(DynamicDrawUsage);
296
+ newAttribute.setUsage(StreamDrawUsage);
256
297
  newAttribute.name = attributeSpec.name;
257
298
 
258
299
  this.attributes[i] = newAttribute;
@@ -466,6 +507,92 @@ export class ParticlePool {
466
507
  array[address + 3] = w;
467
508
  }
468
509
 
510
+ /**
511
+ * Write the same attribute value for every particle.
512
+ * Assumes particles are packed (no holes).
513
+ * @param {number} attribute_index
514
+ * @param {number[]|Float32Array|Uint8Array|Uint16Array|Int8Array|Int32Array} value
515
+ */
516
+ writeAttributeForAllArray(attribute_index, value) {
517
+ const attribute = this.attributes[attribute_index];
518
+
519
+ const itemSize = attribute.itemSize;
520
+
521
+ if (value.length < itemSize) {
522
+ throw new Error(`Argument underflow, attribute.itemSize is '${itemSize}', but supplier argument's length is '${value.length}'`);
523
+ }
524
+
525
+ const n = this.size();
526
+
527
+ const destination = attribute.array;
528
+
529
+ let k;
530
+ for (let i = 0; i < n; i++) {
531
+ const offset = i * itemSize;
532
+
533
+ for (k = 0; k < itemSize; k++) {
534
+ destination[offset + k] = value[k];
535
+ }
536
+ }
537
+
538
+ // mark for update
539
+ attribute.needsUpdate = true;
540
+ attribute.updateRange.count = n;
541
+ attribute.updateRange.offset = 0;
542
+ }
543
+
544
+ /**
545
+ *
546
+ * @param {number} attribute_index
547
+ * @param {number[]} result
548
+ */
549
+ computeAttributeVector3AxisAlignedBoundingBox(attribute_index, result) {
550
+ const attribute = this.attributes[attribute_index];
551
+ const item_size = attribute.itemSize;
552
+
553
+ if (item_size !== 3) {
554
+ throw new Error(`Attribute item_size is expected to be 3, instead was '${item_size}'`);
555
+ }
556
+
557
+ let bounds_x0 = Infinity;
558
+ let bounds_y0 = Infinity;
559
+ let bounds_z0 = Infinity;
560
+
561
+ let bounds_x1 = -Infinity;
562
+ let bounds_y1 = -Infinity;
563
+ let bounds_z1 = -Infinity;
564
+
565
+ const particle_count = this.size();
566
+
567
+ const data = attribute.array;
568
+
569
+ for (let i = 0; i < particle_count; i++) {
570
+ const particle_address = i * 3;
571
+
572
+ const x = data[particle_address];
573
+ const y = data[particle_address + 1];
574
+ const z = data[particle_address + 2];
575
+
576
+ bounds_x0 = min2(bounds_x0, x);
577
+ bounds_y0 = min2(bounds_y0, y);
578
+ bounds_z0 = min2(bounds_z0, z);
579
+
580
+ bounds_x1 = max2(bounds_x1, x);
581
+ bounds_y1 = max2(bounds_y1, y);
582
+ bounds_z1 = max2(bounds_z1, z);
583
+ }
584
+
585
+ // read out
586
+ result[0] = bounds_x0;
587
+ result[1] = bounds_y0;
588
+ result[2] = bounds_z0;
589
+
590
+ result[3] = bounds_x1;
591
+ result[4] = bounds_y1;
592
+ result[5] = bounds_z1;
593
+
594
+ }
595
+
469
596
  dispose() {
470
597
  const bufferGeometry = this.geometry.getValue();
471
598
 
@@ -1,16 +1,17 @@
1
1
  import { ParticlePool } from "./ParticlePool.js";
2
- import { ParticleAttributeType, ParticleDataType, } from "../../group/ParticleGroup.js";
3
- import { ParticleSpecification } from "../../group/ParticleSpecification.js";
4
- import { ParticleAttribute } from "../../group/ParticleAttribute.js";
2
+ import { VertexDataSpec } from "../../../../geometry/VertexDataSpec.js";
3
+ import { DataType } from "../../../../../../core/collection/table/DataType.js";
4
+ import { AttributeSpec } from "../../../../geometry/AttributeSpec.js";
5
5
 
6
6
  /**
7
7
  *
8
8
  * @returns {ParticlePool}
9
9
  */
10
10
  function samplePool() {
11
- const specification = new ParticleSpecification();
12
- specification.add(new ParticleAttribute('a', ParticleAttributeType.Scalar, ParticleDataType.Float32));
13
- specification.add(new ParticleAttribute('b', ParticleAttributeType.Vector4, ParticleDataType.Float32));
11
+ const specification = new VertexDataSpec();
12
+
13
+ specification.add(AttributeSpec.fromJSON({name:'a', type:DataType.Float32, itemSize:1}));
14
+ specification.add(AttributeSpec.fromJSON({name:'b', type:DataType.Float32, itemSize:4}));
14
15
 
15
16
  const pool = new ParticlePool(specification);
16
17
 
@@ -184,4 +185,4 @@ test('read/write scalar attribute', () => {
184
185
  pool.writeAttributeScalar(1, 0, 42);
185
186
 
186
187
  expect(pool.readAttributeScalar(1, 0)).toBe(42);
187
- });
188
+ });
@@ -0,0 +1,37 @@
1
+ import { EmissionShapeType } from "./EmissionShapeType.js";
2
+ import { randomPointInPoint } from "../../../../../../core/geom/random/randomPointInPoint.js";
3
+ import { EmissionFromType } from "./EmissionFromType.js";
4
+ import { randomPointInSphere } from "../../../../../../core/geom/random/randomPointInSphere.js";
5
+ import { randomPointOnSphere } from "../../../../../../core/geom/random/randomPointOnSphere.js";
6
+ import { randomPointInBox } from "../../../../../../core/geom/random/randomPointInBox.js";
7
+ import { randomPointOnBox } from "../../../../../../core/geom/random/randomPointOnBox.js";
8
+
9
+ /**
10
+ *
11
+ * @param {EmissionFromType} emissionType
12
+ * @param {EmissionShapeType} emissionShape
13
+ * @returns {function(random: function, result:(number[]|Float32Array|Float64Array), result_offset:number):void}
14
+ */
15
+ export function computeEmissionFunction(emissionType, emissionShape) {
16
+ if (emissionShape === EmissionShapeType.Point) {
17
+ return randomPointInPoint;
18
+ } else if (emissionShape === EmissionShapeType.Sphere) {
19
+ if (emissionType === EmissionFromType.Volume) {
20
+ return randomPointInSphere;
21
+ } else if (emissionType === EmissionFromType.Shell) {
22
+ return randomPointOnSphere;
23
+ } else {
24
+ throw new TypeError('Unsupported EmissionFrom Type');
25
+ }
26
+ } else if (emissionShape === EmissionShapeType.Box) {
27
+ if (emissionType === EmissionFromType.Volume) {
28
+ return randomPointInBox;
29
+ } else if (emissionType === EmissionFromType.Shell) {
30
+ return randomPointOnBox;
31
+ } else {
32
+ throw new TypeError('Unsupported EmissionFrom Type');
33
+ }
34
+ } else {
35
+ throw new TypeError('Unsupported emission shape');
36
+ }
37
+ }
@@ -0,0 +1,25 @@
1
+ /**
2
+ *
3
+ * @param {number} index
4
+ * @param {number[]|Float32Array} positionArray
5
+ * @param {Vector3} planeNormal
6
+ * @return {number}
7
+ */
8
+ export function distance_to_camera(index, positionArray, planeNormal) {
9
+ const address = index * 3;
10
+
11
+ // extract position components of the particle
12
+ const x = positionArray[address];
13
+ const y = positionArray[address + 1];
14
+ const z = positionArray[address + 2];
15
+
16
+ const planeNormalX = planeNormal.x;
17
+ const planeNormalY = planeNormal.y;
18
+ const planeNormalZ = planeNormal.z;
19
+
20
+ // compute dot product
21
+ const dot = x * planeNormalX + y * planeNormalY + z * planeNormalZ;
22
+
23
+ // use dot product instead of the actual distance to save computation. Difference is going to be constant
24
+ return dot;
25
+ }
@@ -86,10 +86,16 @@ export class ParameterLookupTableSerializationAdapter extends BinaryClassSeriali
86
86
 
87
87
  const dataLength = itemCount * value.itemSize;
88
88
 
89
- const data = new Float32Array(dataLength);
89
+ /**
90
+ * Reserve a continuous chunk of memory for faster access
91
+ * @type {ArrayBuffer}
92
+ */
93
+ const array_buffer = new ArrayBuffer((dataLength + itemCount) * 4);
94
+
95
+ const data = new Float32Array(array_buffer, itemCount * 4, dataLength);
90
96
  buffer.readFloat32Array(data, 0, dataLength);
91
97
 
92
- const positions = new Float32Array(itemCount);
98
+ const positions = new Float32Array(array_buffer, 0, itemCount);
93
99
  buffer.readFloat32Array(positions, 0, itemCount);
94
100
 
95
101
  value.write(data, positions);
@@ -1,11 +1,12 @@
1
1
  import { inverseLerp } from "../../../../../../core/math/inverseLerp.js";
2
- import { computeHashFloatArray, computeHashIntegerArray } from "../../../../../../core/math/MathUtils.js";
3
2
  import { assert } from "../../../../../../core/assert.js";
4
3
  import { max2 } from "../../../../../../core/math/max2.js";
5
4
  import { min2 } from "../../../../../../core/math/min2.js";
6
5
  import { mix } from "../../../../../../core/math/mix.js";
7
6
  import { ParameterLookupTableFlags } from "./ParameterLookupTableFlags.js";
8
7
  import { ParameterLookupTableSerializationAdapter } from "../emitter/serde/ParameterLookupTableSerializationAdapter.js";
8
+ import { computeHashIntegerArray } from "../../../../../../core/collection/array/computeHashIntegerArray.js";
9
+ import { computeHashFloatArray } from "../../../../../../core/math/hash/computeHashFloatArray.js";
9
10
 
10
11
 
11
12
  export class ParameterLookupTable {
@@ -5,8 +5,8 @@
5
5
  * @constructor
6
6
  */
7
7
  import { ParameterLookupTable } from "./ParameterLookupTable.js";
8
- import { computeHashIntegerArray } from "../../../../../../core/math/MathUtils.js";
9
8
  import { computeStringHash } from "../../../../../../core/primitives/strings/computeStringHash.js";
9
+ import { computeHashIntegerArray } from "../../../../../../core/collection/array/computeHashIntegerArray.js";
10
10
 
11
11
  export class ParameterTrack {
12
12
  constructor(name, lut) {
@@ -1,10 +1,10 @@
1
- import { computeHashIntegerArray} from "../../../../../../core/math/MathUtils.js";
2
1
  import { assert } from "../../../../../../core/assert.js";
3
2
  import { max2 } from "../../../../../../core/math/max2.js";
4
3
  import { min2 } from "../../../../../../core/math/min2.js";
5
4
  import { ParameterLookupTable } from "./ParameterLookupTable.js";
6
5
  import List from "../../../../../../core/collection/list/List.js";
7
6
  import { computeStringHash } from "../../../../../../core/primitives/strings/computeStringHash.js";
7
+ import { computeHashIntegerArray } from "../../../../../../core/collection/array/computeHashIntegerArray.js";
8
8
 
9
9
 
10
10
  export class ParticleParameter {
@@ -0,0 +1,24 @@
1
+ import { VertexDataSpec } from "../../../../../geometry/VertexDataSpec.js";
2
+ import { AttributeSpec } from "../../../../../geometry/AttributeSpec.js";
3
+ import { DataType } from "../../../../../../../core/collection/table/DataType.js";
4
+
5
+ export const BILLBOARD_PARTICLE_ATTRIBUTE_POSITION = 0;
6
+ export const BILLBOARD_PARTICLE_ATTRIBUTE_UV = 1;
7
+ export const BILLBOARD_PARTICLE_ATTRIBUTE_SIZE = 2;
8
+ export const BILLBOARD_PARTICLE_ATTRIBUTE_VELOCITY = 3;
9
+ export const BILLBOARD_PARTICLE_ATTRIBUTE_COLOR = 5;
10
+ export const BILLBOARD_PARTICLE_ATTRIBUTE_BLEND = 6;
11
+
12
+ export const BILLBOARD_PARTICLE_SPECIFICATION = new VertexDataSpec();
13
+
14
+ BILLBOARD_PARTICLE_SPECIFICATION.add(AttributeSpec.fromJSON({ name: 'position', itemSize: 3, type: DataType.Float32 }));
15
+ BILLBOARD_PARTICLE_SPECIFICATION.add(AttributeSpec.fromJSON({
16
+ name: 'atlasPatch',
17
+ itemSize: 4,
18
+ type: DataType.Float32
19
+ }));
20
+ BILLBOARD_PARTICLE_SPECIFICATION.add(AttributeSpec.fromJSON({ name: 'size', itemSize: 1, type: DataType.Float32 }));
21
+ BILLBOARD_PARTICLE_SPECIFICATION.add(AttributeSpec.fromJSON({ name: 'velocity', itemSize: 3, type: DataType.Float32 }));
22
+ BILLBOARD_PARTICLE_SPECIFICATION.add(AttributeSpec.fromJSON({ name: 'rotation', itemSize: 1, type: DataType.Float32 }));
23
+ BILLBOARD_PARTICLE_SPECIFICATION.add(AttributeSpec.fromJSON({ name: 'color', itemSize: 1, type: DataType.Float32 }));
24
+ BILLBOARD_PARTICLE_SPECIFICATION.add(AttributeSpec.fromJSON({ name: 'blending', itemSize: 1, type: DataType.Uint8 }));