@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,86 @@
1
+ import { v3_distance_sqr } from "../../../../../core/geom/v3_distance_sqr.js";
2
+ import { biplanar_edge_mapping, triplanar_corner_mapping } from "./cube_mapping.js";
3
+ import { line3_computeSegmentPointDistance_sqr } from "../../../../../core/geom/3d/line/line3_computeSegmentPointDistance_sqr.js";
4
+
5
+ /**
6
+ *
7
+ * @param {number} radius
8
+ * @param {number} light_x
9
+ * @param {number} light_y
10
+ * @param {number} light_z
11
+ * @param {number} outside_plane_count
12
+ * @param {number} outside_plane_bitfield
13
+ * @param {number[]} points
14
+ * @return {boolean}
15
+ */
16
+ export function detailed_sphere_frustum_intersection_test(
17
+ radius, light_x, light_y, light_z,
18
+ outside_plane_count, outside_plane_bitfield,
19
+ points
20
+ ) {
21
+
22
+ const radius_sqr = radius * radius;
23
+
24
+ if (outside_plane_count === 3) {
25
+ // nearest point in a corner, find the corner
26
+ const point_index = triplanar_corner_mapping[outside_plane_bitfield];
27
+
28
+ const point_address = point_index * 3;
29
+
30
+ const point_x = points[point_address];
31
+ const point_y = points[point_address + 1];
32
+ const point_z = points[point_address + 2];
33
+
34
+ const distance_to_light_sqr = v3_distance_sqr(
35
+ point_x, point_y, point_z,
36
+ light_x, light_y, light_z
37
+ );
38
+
39
+ // query_bvh_frustum_from_objects.checks_sphere_frustum_corner++;
40
+
41
+ // return distance_to_light_sqr <= radius_sqr;
42
+
43
+ if (distance_to_light_sqr > radius_sqr) {
44
+
45
+ // query_bvh_frustum_from_objects.rejection_sphere_count++;
46
+ return false;
47
+ }
48
+
49
+ } else if (outside_plane_count === 2) {
50
+ // nearest point is on an edge of two plane intersection
51
+ const edge_bitfield = biplanar_edge_mapping[outside_plane_bitfield];
52
+
53
+ // get 2 corners from edge bitfield
54
+ const corner_index_0 = edge_bitfield & 0b111;
55
+ const corner_address_0 = corner_index_0 * 3;
56
+
57
+ const corner_index_1 = (edge_bitfield >> 3) & 0b111;
58
+ const corner_address_1 = corner_index_1 * 3;
59
+
60
+ const point_0_x = points[corner_address_0];
61
+ const point_0_y = points[corner_address_0 + 1];
62
+ const point_0_z = points[corner_address_0 + 2];
63
+
64
+ const point_1_x = points[corner_address_1];
65
+ const point_1_y = points[corner_address_1 + 1];
66
+ const point_1_z = points[corner_address_1 + 2];
67
+
68
+ const distance_to_frustum_sqr = line3_computeSegmentPointDistance_sqr(
69
+ point_0_x, point_0_y, point_0_z,
70
+ point_1_x, point_1_y, point_1_z,
71
+ light_x, light_y, light_z
72
+ );
73
+
74
+ // query_bvh_frustum_from_objects.checks_sphere_frustum_edge++;
75
+
76
+ // return distance_to_frustum_sqr <= radius_sqr;
77
+
78
+ if (distance_to_frustum_sqr > radius_sqr) {
79
+
80
+ // query_bvh_frustum_from_objects.rejection_sphere_count++;
81
+ return false;
82
+ }
83
+ }
84
+
85
+ return true;
86
+ }
@@ -0,0 +1,73 @@
1
+ import { detailed_sphere_frustum_intersection_test } from "./detailed_sphere_frustum_intersection_test.js";
2
+
3
+ /**
4
+ *
5
+ * @param {number} light_x
6
+ * @param {number} light_y
7
+ * @param {number} light_z
8
+ * @param {number} radius
9
+ * @param {number[]} points
10
+ * @param {number[]|Float32Array|Float64Array} planes
11
+ * @returns {boolean}
12
+ */
13
+ export function point_light_inside_volume(
14
+ light_x, light_y, light_z, radius,
15
+ points, planes
16
+ ) {
17
+ let j = 0;
18
+ let outside_plane_count = 0;
19
+ let outside_plane_bitfield = 0;
20
+
21
+ // validate if the sphere intersects the plane-bound space
22
+
23
+ // query_bvh_frustum_from_objects.checks_sphere++;
24
+
25
+ for (; j < 6; j++) {
26
+
27
+ const plane_address = j * 4;
28
+
29
+ const plane_normal_x = planes[plane_address];
30
+ const plane_normal_y = planes[plane_address + 1];
31
+ const plane_normal_z = planes[plane_address + 2];
32
+ const plane_constant = planes[plane_address + 3];
33
+
34
+ /*
35
+ compute distance from the center of the sphere to the plane
36
+ NOTE: inlined computation of distance from point to plane
37
+ */
38
+ const distance = (plane_normal_x * light_x + plane_normal_y * light_y + plane_normal_z * light_z) + plane_constant;
39
+
40
+ // query_bvh_frustum_from_objects.checks_sphere_plane++;
41
+
42
+ if (distance < 0) {
43
+ // center of the sphere is below the plane
44
+
45
+ if (distance < -radius) {
46
+ // sphere is entirely below the plane
47
+
48
+ // query_bvh_frustum_from_objects.rejection_sphere_count++;
49
+
50
+ return false;
51
+ }
52
+
53
+ // sphere intersects the plane
54
+
55
+ outside_plane_count++;
56
+
57
+ const plane_bit_mask = 1 << j;
58
+
59
+ outside_plane_bitfield |= plane_bit_mask;
60
+ }
61
+
62
+ }
63
+
64
+ if (outside_plane_count < 2) {
65
+ return true;
66
+ } else {
67
+ return detailed_sphere_frustum_intersection_test(
68
+ radius, light_x, light_y, light_z,
69
+ outside_plane_count, outside_plane_bitfield,
70
+ points
71
+ );
72
+ }
73
+ }
@@ -0,0 +1,131 @@
1
+ import { aabb3_computeDistanceAbovePlane } from "../../../../../core/geom/3d/aabb/aabb3_computeDistanceAbovePlane.js";
2
+ import { point_light_inside_volume } from "./point_light_inside_volume.js";
3
+ import { spot_light_inside_volume } from "./spot_light_inside_volume.js";
4
+
5
+ /**
6
+ *
7
+ * @type {(BinaryNode|LeafNode)[]}
8
+ */
9
+ const stack = [];
10
+
11
+ let stackPointer = 0;
12
+
13
+ /**
14
+ * Most of the data is in flat continuous array for cache coherence
15
+ * @param {PointLightData[]} destination
16
+ * @param {number} destination_offset
17
+ * @param {BinaryNode<PointLightData>} root
18
+ * @param {number[]|Float32Array|Float64Array} planes
19
+ * @param {number[]|Float32Array|Float64Array} points
20
+ * @returns {number} number of items added to the destination, non-negative integer
21
+ */
22
+ export function query_bvh_frustum_from_objects(
23
+ destination,
24
+ destination_offset,
25
+ root, planes, points
26
+ ) {
27
+ let i = 0;
28
+ let j = 0;
29
+ // read out points
30
+ const stackOffset = stackPointer;
31
+
32
+ stack[stackPointer] = root;
33
+
34
+ stackPointer++;
35
+
36
+ stack_loop:while (stackPointer-- > stackOffset) {
37
+
38
+ // query_bvh_frustum_from_objects.iteration_count++;
39
+
40
+ const n = stack[stackPointer];
41
+
42
+ if (n.isBinaryNode === true) {
43
+
44
+ for (j = 0; j < 6; j++) {
45
+
46
+ const plane_address = j * 4;
47
+
48
+ const plane_normal_x = planes[plane_address];
49
+ const plane_normal_y = planes[plane_address + 1];
50
+ const plane_normal_z = planes[plane_address + 2];
51
+ const plane_constant = planes[plane_address + 3];
52
+
53
+ const distanceAbovePlane = aabb3_computeDistanceAbovePlane(
54
+ plane_normal_x, plane_normal_y, plane_normal_z, plane_constant,
55
+ n.x0, n.y0, n.z0,
56
+ n.x1, n.y1, n.z1
57
+ );
58
+
59
+ if (distanceAbovePlane < 0) {
60
+ // node is below the plane
61
+
62
+ // query_bvh_frustum_from_objects.rejection_count++;
63
+
64
+ continue stack_loop;
65
+ }
66
+ }
67
+
68
+
69
+ if (n.right !== null) {
70
+ stack[stackPointer] = n.right;
71
+ stackPointer++;
72
+ }
73
+
74
+ if (n.left !== null) {
75
+ stack[stackPointer] = n.left;
76
+ stackPointer++
77
+ }
78
+
79
+ } else {
80
+
81
+ // leaf node
82
+
83
+ /**
84
+ *
85
+ * @type {PointLightData}
86
+ */
87
+ const light_data = n.object;
88
+
89
+ const light = light_data.light;
90
+
91
+ if (light.isPointLight) {
92
+
93
+ const light_position = light.position;
94
+
95
+ const light_x = light_position.x;
96
+ const light_y = light_position.y;
97
+ const light_z = light_position.z;
98
+
99
+ const radius = light.radius.getValue();
100
+
101
+ if (!point_light_inside_volume(light_x, light_y, light_z, radius, points, planes)) {
102
+ continue;
103
+ }
104
+ } else if (light.isSpotLight) {
105
+ if (!spot_light_inside_volume(light, points, planes)) {
106
+ continue;
107
+ }
108
+ }
109
+
110
+ destination[destination_offset + i] = light_data;
111
+
112
+ i++;
113
+ }
114
+
115
+ }
116
+
117
+ //drop the stack frame
118
+ stackPointer = stackOffset;
119
+
120
+ return i;
121
+ }
122
+
123
+ query_bvh_frustum_from_objects.iteration_count = 0;
124
+ query_bvh_frustum_from_objects.rejection_count = 0;
125
+ query_bvh_frustum_from_objects.rejection_sphere_count = 0;
126
+ query_bvh_frustum_from_objects.plane_tests = 0;
127
+ query_bvh_frustum_from_objects.plane_tests_early_exits = 0;
128
+ query_bvh_frustum_from_objects.checks_sphere = 0;
129
+ query_bvh_frustum_from_objects.checks_sphere_plane = 0;
130
+ query_bvh_frustum_from_objects.checks_sphere_frustum_corner = 0;
131
+ query_bvh_frustum_from_objects.checks_sphere_frustum_edge = 0;
@@ -0,0 +1,129 @@
1
+ import { aabb3_computeDistanceAbovePlane } from "../../../../../core/geom/3d/aabb/aabb3_computeDistanceAbovePlane.js";
2
+ import { point_light_inside_volume } from "./point_light_inside_volume.js";
3
+ import { BVH_BINARY_NODE_SIZE, BVH_LEAF_NODE_SIZE } from "../../../../../core/bvh2/binary/2/BinaryUint32BVH.js";
4
+
5
+ /**
6
+ *
7
+ * @type {number[]}
8
+ */
9
+ const stack = [];
10
+
11
+ /**
12
+ * Most of the data is in flat continuous array for cache coherence
13
+ * @param {number[]} destination
14
+ * @param {number} destination_offset
15
+ * @param {BinaryUint32BVH} root
16
+ * @param {number[]|Uint8ClampedArray} source_data
17
+ * @param {number[]|Float32Array|Float64Array} planes
18
+ * @param {number[]|Float32Array|Float64Array} points
19
+ * @returns {number} number of items added to the destination, non-negative integer
20
+ */
21
+ export function query_bvh_frustum_from_texture(
22
+ destination,
23
+ destination_offset,
24
+ root,
25
+ source_data,
26
+ planes, points
27
+ ) {
28
+
29
+ let stackPointer = 1;
30
+ let result = 0;
31
+
32
+ /**
33
+ * After performing empirical tests, stack-based depth-first traversal turns out faster than using a queue
34
+ * @type {number}
35
+ */
36
+ stack[0] = 0;
37
+
38
+ const binary_node_count = root.getBinaryNodeCount();
39
+ const last_valid_index = binary_node_count + root.getLeafNodeCount();
40
+ const data_view = root.getDataView();
41
+
42
+ stack_loop:while (stackPointer-- > 0) {
43
+
44
+ // query_bvh_frustum_from_objects.iteration_count++;
45
+ const node_index = stack[stackPointer];
46
+
47
+ if (node_index < binary_node_count) {
48
+ // is intermediate node
49
+ const node_address = node_index * BVH_BINARY_NODE_SIZE;
50
+
51
+ const n_x0 = data_view.getFloat32(node_address);
52
+ const n_y0 = data_view.getFloat32(node_address + 4);
53
+ const n_z0 = data_view.getFloat32(node_address + 8);
54
+ const n_x1 = data_view.getFloat32(node_address + 12);
55
+ const n_y1 = data_view.getFloat32(node_address + 16);
56
+ const n_z1 = data_view.getFloat32(node_address + 20);
57
+
58
+ for (let j = 0; j < 6; j++) {
59
+
60
+ const plane_address = j * 4;
61
+
62
+ const plane_normal_x = planes[plane_address];
63
+ const plane_normal_y = planes[plane_address + 1];
64
+ const plane_normal_z = planes[plane_address + 2];
65
+ const plane_constant = planes[plane_address + 3];
66
+
67
+ const distanceAbovePlane = aabb3_computeDistanceAbovePlane(
68
+ plane_normal_x, plane_normal_y, plane_normal_z, plane_constant,
69
+ n_x0, n_y0, n_z0,
70
+ n_x1, n_y1, n_z1
71
+ );
72
+
73
+ if (distanceAbovePlane < 0) {
74
+ // node is below the plane
75
+
76
+ // query_bvh_frustum_from_objects.rejection_count++;
77
+
78
+ continue stack_loop;
79
+ }
80
+
81
+ // TODO under current scheme we can reserve 6 bit in what we push onto the stack for plane mask (allows us to skip some planar tests)
82
+ }
83
+
84
+ const left_index = (node_index << 1) + 1;
85
+ const right_index = left_index + 1;
86
+
87
+ if (left_index < last_valid_index) {
88
+ stack[stackPointer] = left_index;
89
+ stackPointer++;
90
+ }
91
+
92
+ if (right_index < last_valid_index) {
93
+ stack[stackPointer] = right_index;
94
+ stackPointer++;
95
+ }
96
+
97
+
98
+ } else {
99
+ // leaf node
100
+ const leaf_index = node_index - binary_node_count;
101
+ const node_address = leaf_index * BVH_LEAF_NODE_SIZE + binary_node_count * BVH_BINARY_NODE_SIZE;
102
+
103
+ const light_index = data_view.getUint32(node_address + 24);
104
+
105
+ const light_address = light_index * 8;
106
+
107
+ // TODO figure out light type from address
108
+
109
+
110
+ const light_x = source_data[light_address];
111
+ const light_y = source_data[light_address + 1];
112
+ const light_z = source_data[light_address + 2];
113
+
114
+ const radius = source_data[light_address + 3];
115
+
116
+ if (!point_light_inside_volume(light_x, light_y, light_z, radius, points, planes)) {
117
+ continue;
118
+ }
119
+
120
+ // write to output
121
+ destination[destination_offset + result] = light_index;
122
+
123
+ result++;
124
+ }
125
+
126
+ }
127
+
128
+ return result;
129
+ }
@@ -0,0 +1,33 @@
1
+ import { computeConePlaneSide } from "../../../../../core/geom/3d/cone/computeConePlaneSide.js";
2
+
3
+ /**
4
+ *
5
+ * @param {SpotLight} light
6
+ * @param {number[]} points
7
+ * @param {number[]|Float32Array|Float64Array} planes
8
+ * @returns {boolean}
9
+ */
10
+ export function spot_light_inside_volume(light, points, planes) {
11
+ for (let j = 0; j < 6; j++) {
12
+
13
+ const plane_address = j * 4;
14
+
15
+ const plane_normal_x = planes[plane_address];
16
+ const plane_normal_y = planes[plane_address + 1];
17
+ const plane_normal_z = planes[plane_address + 2];
18
+ const plane_constant = planes[plane_address + 3];
19
+
20
+ const side = computeConePlaneSide(
21
+ plane_normal_x, plane_normal_y, plane_normal_z, plane_constant,
22
+ light.position.x, light.position.y, light.position.z,
23
+ light.direction.x, light.direction.y, light.direction.z,
24
+ light.angle.getValue(), light.distance.getValue()
25
+ );
26
+
27
+ if (side < 0) {
28
+ return false;
29
+ }
30
+ }
31
+
32
+ return true;
33
+ }
@@ -0,0 +1,14 @@
1
+ /**
2
+ *
3
+ * @param {number[]|Float32Array|Float64Array} source
4
+ * @param {number} source_index
5
+ * @param {number[]|Float32Array|Float64Array} destination
6
+ * @param {number} destination_offset
7
+ */
8
+ export function read_frustum_corner(source, source_index, destination, destination_offset) {
9
+ const address = source_index * 3;
10
+
11
+ destination[destination_offset] = source[address];
12
+ destination[destination_offset + 1] = source[address + 1];
13
+ destination[destination_offset + 2] = source[address + 2];
14
+ }
@@ -0,0 +1,22 @@
1
+ /**
2
+ *
3
+ * @param {number[]} light_data
4
+ * @param {number} count
5
+ * @param {number[]|Uint32Array|Uint16Array|Uint8Array|Uint8ClampedArray} light_lookup_texture_data
6
+ * @param {number} address
7
+ * @returns {boolean}
8
+ */
9
+ export function testClusterEquality(light_data, count, light_lookup_texture_data, address) {
10
+ for (let i = 0; i < count; i++) {
11
+
12
+ const existing_light_address = light_lookup_texture_data[address + i];
13
+
14
+ const datum = light_data[i] * 2;
15
+
16
+ if (datum !== existing_light_address) {
17
+ return false;
18
+ }
19
+ }
20
+
21
+ return true;
22
+ }
@@ -1,6 +1,5 @@
1
- import Vector3 from "../../../../core/geom/Vector3.js";
2
1
  import { computePointDistanceToPlane } from "../../../../core/geom/Plane.js";
3
- import { plane_three_computeConvex3PlaneIntersection } from "../../../../core/geom/3d/plane_computeConvex3PlaneIntersection.js";
2
+ import { plane_three_computeConvex3PlaneIntersection } from "../../../../core/geom/3d/plane/plane_computeConvex3PlaneIntersection.js";
4
3
 
5
4
  /**
6
5
  *
@@ -10,7 +9,11 @@ import { plane_three_computeConvex3PlaneIntersection } from "../../../../core/ge
10
9
  */
11
10
  export function buildPlanarRenderLayerClipPlaneComputationMethod(traversePlanes, bias = 0) {
12
11
 
13
- const p = new Vector3();
12
+ /**
13
+ *
14
+ * @type {number[]}
15
+ */
16
+ const p = [];
14
17
 
15
18
  const adjacentPlanePairs = [
16
19
  [],
@@ -38,7 +41,7 @@ export function buildPlanarRenderLayerClipPlaneComputationMethod(traversePlanes,
38
41
  const p0 = pair[0];
39
42
  const p1 = pair[1];
40
43
 
41
- const planeIntersection = plane_three_computeConvex3PlaneIntersection(p, p0, p1, objectPlane);
44
+ const planeIntersection = plane_three_computeConvex3PlaneIntersection(p, 0, p0, p1, objectPlane);
42
45
 
43
46
  if (!planeIntersection) {
44
47
  //no intersection
@@ -48,7 +51,7 @@ export function buildPlanarRenderLayerClipPlaneComputationMethod(traversePlanes,
48
51
 
49
52
  const plane_normal = nearPlane.normal;
50
53
 
51
- const distanceToNearPlane = computePointDistanceToPlane(p.x, p.y, p.z, plane_normal.x, plane_normal.y, plane_normal.z, nearPlane.constant);
54
+ const distanceToNearPlane = computePointDistanceToPlane(p[0], p[1], p[2], plane_normal.x, plane_normal.y, plane_normal.z, nearPlane.constant);
52
55
 
53
56
  //update near and far plane distances
54
57
  if (distanceToNearPlane > 0 && distanceToNearPlane < range.near) {
@@ -2,6 +2,7 @@ import { BitSet } from "../../../../core/binary/BitSet.js";
2
2
  import Signal from "../../../../core/events/signal/Signal.js";
3
3
  import { assert } from "../../../../core/assert.js";
4
4
  import { IllegalStateException } from "../../../../core/fsm/exceptions/IllegalStateException.js";
5
+ import { arrayQuickSort } from "../../../../core/collection/array/arrayQuickSort.js";
5
6
 
6
7
  /**
7
8
  * @readonly
@@ -68,6 +69,16 @@ export class IncrementalDeltaSet {
68
69
  this.state = IncrementalDeltaSetState.Clear;
69
70
  }
70
71
 
72
+
73
+ /**
74
+ *
75
+ * @param {function(T):number} score_function
76
+ * @param {*} [score_context]
77
+ */
78
+ sort(score_function, score_context) {
79
+ arrayQuickSort(this.elements, score_function, score_context, 0, this.size - 1);
80
+ }
81
+
71
82
  /**
72
83
  *
73
84
  * @param {V} element
@@ -62,7 +62,6 @@ import { buildCanvasViewFromTexture } from "./buildCanvasViewFromTexture.js";
62
62
  import { BatchOcclusionQuery } from "./query/BatchOcclusionQuery.js";
63
63
  import HeadsUpDisplay from "../../../../ecs/gui/hud/HeadsUpDisplay.js";
64
64
  import LabelView from "../../../../../view/common/LabelView.js";
65
- import { randomFloatBetween } from "../../../../../core/math/MathUtils.js";
66
65
  import { seededRandom } from "../../../../../core/math/random/seededRandom.js";
67
66
  import { Sampler2D } from "../../../texture/sampler/Sampler2D.js";
68
67
  import { inverseLerp } from "../../../../../core/math/inverseLerp.js";
@@ -71,6 +70,7 @@ import { max2 } from "../../../../../core/math/max2.js";
71
70
  import { min2 } from "../../../../../core/math/min2.js";
72
71
  import { buildCubeURLs } from "../../../texture/cubemap/buildCubeURLs.js";
73
72
  import { mat4 } from "gl-matrix";
73
+ import { randomFloatBetween } from "../../../../../core/math/random/randomFloatBetween.js";
74
74
 
75
75
  const engineHarness = new EngineHarness();
76
76
 
@@ -112,7 +112,7 @@ function makeConfig(engine) {
112
112
  new ClingToTerrainSystem(),
113
113
  new TerrainSystem(graphics, assetManager),
114
114
  new WaterSystem(graphics),
115
- new Trail2DSystem(graphics, assetManager),
115
+ new Trail2DSystem(engine),
116
116
  new Foliage2System(assetManager, graphics),
117
117
  new ViewportPositionSystem(graphics.viewport.size),
118
118
  new GridPosition2TransformSystem(),
@@ -5,12 +5,15 @@ import AABB2 from "../../../../core/geom/AABB2.js";
5
5
  export class AtlasPatch {
6
6
  constructor() {
7
7
  /**
8
- *
8
+ * Position in the atlas where the raw patch data is found, excludes padding
9
+ * @readonly
9
10
  * @type {Vector2}
10
11
  */
11
12
  this.position = new Vector2(0, 0);
13
+
12
14
  /**
13
- *
15
+ * Size in pixels of the patch, excludes padding
16
+ * @readonly
14
17
  * @type {Vector2}
15
18
  */
16
19
  this.size = new Vector2(0, 0);
@@ -34,11 +37,13 @@ export class AtlasPatch {
34
37
  this.sampler = null;
35
38
 
36
39
  /**
40
+ * @readonly
37
41
  * @type {Rectangle}
38
42
  */
39
43
  this.uv = new Rectangle(0, 0, 0, 0);
40
44
 
41
45
  /**
46
+ * Area in the atlas where patch along with the padding is packed into
42
47
  * Used for packing inside TextureAtlas. Do not modify manually
43
48
  * @readonly
44
49
  * @protected
@@ -82,8 +82,8 @@ export class TextureAtlas {
82
82
  * @returns {boolean}
83
83
  */
84
84
  contains(patch) {
85
- assert.notEqual(patch, null, 'patch is null');
86
- assert.notEqual(patch, undefined, 'patch is undefined');
85
+ assert.notNull(patch, 'patch');
86
+ assert.defined(patch, 'patch');
87
87
  assert.ok(patch.isAtlasPatch, 'patch argument is not an AtlasPatch');
88
88
 
89
89
  return this.patches.includes(patch);
@@ -116,28 +116,32 @@ export class TextureAtlas {
116
116
  *
117
117
  * @param {number} x
118
118
  * @param {number} y
119
- * @returns {boolean}
119
+ * @returns {boolean} true if resizing successful, false otherwise
120
120
  */
121
121
  resize(x, y) {
122
122
  //check if any patches would be cut
123
123
  const patches = this.patches;
124
124
  const numPatches = patches.length;
125
- const patchBoundsViolated = patches.some(patch => {
126
125
 
127
- if (!patch.getFlag(AtlasPatchFlag.Packed)) {
126
+ //update patch UVs
127
+ for (let i = 0; i < numPatches; i++) {
128
+ const patch = patches[i];
129
+
130
+ if (patch.getFlag(AtlasPatchFlag.Packed)) {
128
131
  //only care about packed patches
129
- return false;
130
- }
131
132
 
132
- const x1 = patch.position.x + patch.size.x + patch.padding;
133
- const y1 = patch.position.y + patch.size.y + patch.padding;
133
+ const pp = patch.position;
134
+ const ps = patch.size;
134
135
 
135
- return x1 >= x || y1 >= y;
136
- });
136
+ const x1 = pp.x + ps.x + patch.padding;
137
+ const y1 = pp.y + ps.y + patch.padding;
137
138
 
138
- if (patchBoundsViolated) {
139
- //Resizing atlas would result in some patches not fitting
140
- return false;
139
+ if (x1 >= x || y1 >= y) {
140
+ // patch bounds would violate the desired atlas extends
141
+ //Resizing atlas would result in some patches not fitting
142
+ return false;
143
+ }
144
+ }
141
145
  }
142
146
 
143
147
  //update patch UVs
@@ -1,6 +1,6 @@
1
1
  import { seededRandom } from "../../../../core/math/random/seededRandom.js";
2
2
  import { HarmonicDiffusionGrid } from "./HarmonicDiffusionGrid.js";
3
- import { randomIntegerBetween} from "../../../../core/math/MathUtils.js";
3
+ import { randomIntegerBetween } from "../../../../core/math/random/randomIntegerBetween.js";
4
4
 
5
5
  test("constructor doesn't throw", () => {
6
6
  new HarmonicDiffusionGrid([], 0, 0);