@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,345 +0,0 @@
1
- import { line3_computeSegmentPointDistance_sqr } from "../../../../core/geom/LineSegment.js";
2
- import { computeConePlaneSide } from "../../../../core/geom/3d/cone/computeConePlaneSide.js";
3
- import { aabb3_computeDistanceAbovePlane } from "../../../../core/geom/3d/aabb/aabb3_computeDistanceAbovePlane.js";
4
- import { v3_distance_sqr } from "../../../../core/geom/v3_distance_sqr.js";
5
-
6
- /**
7
- *
8
- * @type {(BinaryNode|LeafNode)[]}
9
- */
10
- const stack = [];
11
-
12
- let stackPointer = 0;
13
-
14
- const _lut_array_buffer = new ArrayBuffer(84);
15
-
16
- /**
17
- * Mapping from 3 plane bitfield, corresponding to intersection point of the planes
18
- * @type {number[]}
19
- */
20
- const triplanar_corner_mapping = new Uint8Array(_lut_array_buffer, 0, 43);
21
-
22
- triplanar_corner_mapping[0b010101] = 0;
23
- triplanar_corner_mapping[0b100101] = 1;
24
- triplanar_corner_mapping[0b011001] = 2;
25
- triplanar_corner_mapping[0b101001] = 3;
26
- triplanar_corner_mapping[0b010110] = 4;
27
- triplanar_corner_mapping[0b100110] = 5;
28
- triplanar_corner_mapping[0b011010] = 6;
29
- triplanar_corner_mapping[0b101010] = 7;
30
-
31
- function analytical_triplanar_corner_mapping(field) {
32
- return ((field << 1) & 0b100) | ((field >> 2) & 0b10) | ((field >> 5) & 0b1);
33
- }
34
-
35
- /**
36
- * Mapping from 2 plane bitfield to 2 corner bitfield, corresponding to corner indices of intersecting planes
37
- * @type {number[]}
38
- */
39
- const biplanar_edge_mapping = new Uint8Array(_lut_array_buffer, 43, 41);
40
-
41
- biplanar_edge_mapping[0b000101] = 0 | (1 << 3);
42
- biplanar_edge_mapping[0b000110] = 4 | (5 << 3);
43
-
44
- biplanar_edge_mapping[0b001001] = 2 | (3 << 3);
45
- biplanar_edge_mapping[0b001010] = 6 | (7 << 3);
46
-
47
- biplanar_edge_mapping[0b010100] = 0 | (4 << 3);
48
- biplanar_edge_mapping[0b011000] = 2 | (6 << 3);
49
-
50
- biplanar_edge_mapping[0b100100] = 1 | (5 << 3);
51
- biplanar_edge_mapping[0b101000] = 3 | (7 << 3);
52
-
53
- biplanar_edge_mapping[0b010001] = 0 | (2 << 3);
54
- biplanar_edge_mapping[0b010010] = 4 | (6 << 3);
55
-
56
- biplanar_edge_mapping[0b100001] = 1 | (3 << 3);
57
- biplanar_edge_mapping[0b100010] = 5 | (7 << 3);
58
-
59
- /**
60
- *
61
- * @param {number} radius
62
- * @param {number} light_x
63
- * @param {number} light_y
64
- * @param {number} light_z
65
- * @param {number} outside_plane_count
66
- * @param {number} outside_plane_bitfield
67
- * @param {number[]} points
68
- * @return {boolean}
69
- */
70
- function detailed_sphere_frustum_intersection_test(radius, light_x, light_y, light_z, outside_plane_count, outside_plane_bitfield, points) {
71
-
72
- const radius_sqr = radius * radius;
73
-
74
- if (outside_plane_count === 3) {
75
- // nearest point in a corner, find the corner
76
- const point_index = analytical_triplanar_corner_mapping(outside_plane_bitfield);
77
-
78
- const point_address = point_index * 3;
79
-
80
- const point_x = points[point_address];
81
- const point_y = points[point_address + 1];
82
- const point_z = points[point_address + 2];
83
-
84
- const distance_to_light_sqr = v3_distance_sqr(
85
- point_x, point_y, point_z,
86
- light_x, light_y, light_z
87
- );
88
-
89
- // queryBVH_Frustum.checks_sphere_frustum_corner++;
90
-
91
- // return distance_to_light_sqr <= radius_sqr;
92
-
93
- if (distance_to_light_sqr > radius_sqr) {
94
-
95
- // queryBVH_Frustum.rejection_sphere_count++;
96
- return false;
97
- }
98
-
99
- } else if (outside_plane_count === 2) {
100
- // nearest point is on an edge of two plane intersection
101
- const edge_bitfield = biplanar_edge_mapping[outside_plane_bitfield];
102
-
103
- // get 2 corners from edge bitfield
104
- const corner_index_0 = edge_bitfield & 0b111;
105
- const corner_address_0 = corner_index_0 * 3;
106
-
107
- const corner_index_1 = (edge_bitfield >> 3) & 0b111;
108
- const corner_address_1 = corner_index_1 * 3;
109
-
110
- const point_0_x = points[corner_address_0];
111
- const point_0_y = points[corner_address_0 + 1];
112
- const point_0_z = points[corner_address_0 + 2];
113
-
114
- const point_1_x = points[corner_address_1];
115
- const point_1_y = points[corner_address_1 + 1];
116
- const point_1_z = points[corner_address_1 + 2];
117
-
118
- const distance_to_frustum_sqr = line3_computeSegmentPointDistance_sqr(
119
- point_0_x, point_0_y, point_0_z,
120
- point_1_x, point_1_y, point_1_z,
121
- light_x, light_y, light_z
122
- );
123
-
124
- // queryBVH_Frustum.checks_sphere_frustum_edge++;
125
-
126
- // return distance_to_frustum_sqr <= radius_sqr;
127
-
128
- if (distance_to_frustum_sqr > radius_sqr) {
129
-
130
- // queryBVH_Frustum.rejection_sphere_count++;
131
- return false;
132
- }
133
- }
134
-
135
- return true;
136
- }
137
-
138
- /**
139
- *
140
- * @param {PointLight} light
141
- * @param {number[]} points
142
- * @param {number[]|Float32Array|Float64Array} planes
143
- * @returns {boolean}
144
- */
145
- function point_light_inside_volume(light, points, planes) {
146
- let j = 0;
147
- let outside_plane_count = 0;
148
- let outside_plane_bitfield = 0;
149
-
150
- // validate if the sphere intersects the plane-bound space
151
-
152
- const light_position = light.position;
153
-
154
- const light_x = light_position.x;
155
- const light_y = light_position.y;
156
- const light_z = light_position.z;
157
-
158
- const radius = light.radius.getValue();
159
-
160
- // queryBVH_Frustum.checks_sphere++;
161
-
162
- for (; j < 6; j++) {
163
-
164
- const plane_address = j * 4;
165
-
166
- const plane_normal_x = planes[plane_address];
167
- const plane_normal_y = planes[plane_address + 1];
168
- const plane_normal_z = planes[plane_address + 2];
169
- const plane_constant = planes[plane_address + 3];
170
-
171
- /*
172
- compute distance from the center of the sphere to the plane
173
- NOTE: inlined computation of distance from point to plane
174
- */
175
- const distance = (plane_normal_x * light_x + plane_normal_y * light_y + plane_normal_z * light_z) + plane_constant;
176
-
177
- // queryBVH_Frustum.checks_sphere_plane++;
178
-
179
- if (distance < 0) {
180
- // center of the sphere is below the plane
181
-
182
- if (distance < -radius) {
183
- // sphere is entirely below the plane
184
-
185
- // queryBVH_Frustum.rejection_sphere_count++;
186
-
187
- return false;
188
- }
189
-
190
- // sphere intersects the plane
191
-
192
- outside_plane_count++;
193
-
194
- const plane_bit_mask = 1 << j;
195
-
196
- outside_plane_bitfield |= plane_bit_mask;
197
- }
198
-
199
- }
200
-
201
- if (outside_plane_count < 2) {
202
- return true;
203
- } else {
204
- return detailed_sphere_frustum_intersection_test(radius, light_x, light_y, light_z, outside_plane_count, outside_plane_bitfield, points);
205
- }
206
- }
207
-
208
- /**
209
- *
210
- * @param {SpotLight} light
211
- * @param {number[]} points
212
- * @param {number[]|Float32Array|Float64Array} planes
213
- * @returns {boolean}
214
- */
215
- function spot_light_inside_volume(light, points, planes) {
216
- for (let j = 0; j < 6; j++) {
217
-
218
- const plane_address = j * 4;
219
-
220
- const plane_normal_x = planes[plane_address];
221
- const plane_normal_y = planes[plane_address + 1];
222
- const plane_normal_z = planes[plane_address + 2];
223
- const plane_constant = planes[plane_address + 3];
224
-
225
- const side = computeConePlaneSide(
226
- plane_normal_x, plane_normal_y, plane_normal_z, plane_constant,
227
- light.position.x, light.position.y, light.position.z,
228
- light.direction.x, light.direction.y, light.direction.z,
229
- light.angle.getValue(), light.distance.getValue()
230
- );
231
-
232
- if (side < 0) {
233
- return false;
234
- }
235
- }
236
-
237
- return true;
238
- }
239
-
240
- /**
241
- * Most of the data is in flat continuous array for cache coherence
242
- * @param {PointLightData[]} destination
243
- * @param {number} destination_offset
244
- * @param {BinaryNode<PointLightData>} root
245
- * @param {number[]|Float32Array|Float64Array} planes
246
- * @param {number[]|Float32Array|Float64Array} points
247
- * @returns {number} number of items added to the destination, non-negative integer
248
- */
249
- export function queryBVH_Frustum(destination, destination_offset, root, planes, points) {
250
- let i = 0;
251
- let j = 0;
252
- // read out points
253
- const stackOffset = stackPointer;
254
-
255
- stack[stackPointer] = root;
256
-
257
- stackPointer++;
258
-
259
- stack_loop:while (stackPointer-- > stackOffset) {
260
-
261
- queryBVH_Frustum.iteration_count++;
262
-
263
- const n = stack[stackPointer];
264
-
265
- if (n.isBinaryNode === true) {
266
-
267
- for (j = 0; j < 6; j++) {
268
-
269
- const plane_address = j * 4;
270
-
271
- const plane_normal_x = planes[plane_address];
272
- const plane_normal_y = planes[plane_address + 1];
273
- const plane_normal_z = planes[plane_address + 2];
274
- const plane_constant = planes[plane_address + 3];
275
-
276
- const distanceAbovePlane = aabb3_computeDistanceAbovePlane(
277
- plane_normal_x, plane_normal_y, plane_normal_z, plane_constant,
278
- n.x0, n.y0, n.z0,
279
- n.x1, n.y1, n.z1
280
- );
281
-
282
- if (distanceAbovePlane < 0) {
283
- // node is below the plane
284
-
285
- queryBVH_Frustum.rejection_count++;
286
-
287
- continue stack_loop;
288
- }
289
- }
290
-
291
-
292
- if (n.right !== null) {
293
- stack[stackPointer] = n.right;
294
- stackPointer++;
295
- }
296
-
297
- if (n.left !== null) {
298
- stack[stackPointer] = n.left;
299
- stackPointer++
300
- }
301
-
302
- } else {
303
-
304
- // leaf node
305
-
306
- /**
307
- *
308
- * @type {PointLightData}
309
- */
310
- const light_data = n.object;
311
-
312
- const light = light_data.light;
313
-
314
- if (light.isPointLight) {
315
- if (!point_light_inside_volume(light, points, planes)) {
316
- continue;
317
- }
318
- } else if (light.isSpotLight) {
319
- if (!spot_light_inside_volume(light, points, planes)) {
320
- continue;
321
- }
322
- }
323
-
324
- destination[destination_offset + i] = light_data;
325
-
326
- i++;
327
- }
328
-
329
- }
330
-
331
- //drop the stack frame
332
- stackPointer = stackOffset;
333
-
334
- return i;
335
- }
336
-
337
- queryBVH_Frustum.iteration_count = 0;
338
- queryBVH_Frustum.rejection_count = 0;
339
- queryBVH_Frustum.rejection_sphere_count = 0;
340
- queryBVH_Frustum.plane_tests = 0;
341
- queryBVH_Frustum.plane_tests_early_exits = 0;
342
- queryBVH_Frustum.checks_sphere = 0;
343
- queryBVH_Frustum.checks_sphere_plane = 0;
344
- queryBVH_Frustum.checks_sphere_frustum_corner = 0;
345
- queryBVH_Frustum.checks_sphere_frustum_edge = 0;