@woosh/meep-engine 2.33.23 → 2.33.27

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 (302) hide show
  1. package/core/binary/BitSet.js +151 -167
  2. package/core/binary/BitSet.spec.js +99 -1
  3. package/core/binary/ValidatingBitSetWrapper.js +81 -0
  4. package/core/bvh2/BinaryNode.js +1 -1
  5. package/core/bvh2/aabb3/AABB3.js +21 -10
  6. package/core/bvh2/aabb3/AABB3Math.js +1 -1
  7. package/core/bvh2/binary/2/BinaryUint32BVH.js +498 -0
  8. package/core/bvh2/binary/2/BinaryUint32BVH.spec.js +54 -0
  9. package/core/bvh2/binary/IndexedBinaryBVH.js +22 -26
  10. package/core/bvh2/traversal/ThreeClippingPlaneComputingBVHVisitor.js +5 -1
  11. package/core/bvh2/traversal/__detailed_box_volume_intersection.js +22 -5
  12. package/core/cache/Cache.d.ts +4 -2
  13. package/core/cache/Cache.js +5 -2
  14. package/core/collection/ArrayUtils.js +1 -1
  15. package/core/collection/HashMap.d.ts +9 -2
  16. package/core/collection/HashSet.d.ts +7 -2
  17. package/core/collection/HashSet.js +7 -2
  18. package/core/collection/array/arrayQuickSort.js +9 -6
  19. package/core/collection/array/array_swap.js +22 -0
  20. package/core/collection/array/binarySearchHighIndex.js +1 -1
  21. package/core/collection/array/computeHashArray.js +22 -0
  22. package/core/collection/array/computeHashIntegerArray.js +15 -0
  23. package/core/collection/array/copyArray.js +2 -2
  24. package/core/collection/array/typed/typed_array_copy.js +1 -1
  25. package/core/collection/table/DataType2TypedArrayConstructorMapping.js +15 -0
  26. package/core/color/Color.js +2 -1
  27. package/core/function/FunctionCompiler.js +2 -1
  28. package/core/geom/3d/aabb/aabb3_computeDistanceAbovePlane.js +9 -33
  29. package/core/geom/3d/frustum/array_setFromProjectionMatrix.js +3 -3
  30. package/core/geom/3d/frustum/frustum3_computeNearestPointToPoint.js +1 -1
  31. package/core/geom/3d/line/line3_computeSegmentPointDistance_sqr.js +41 -0
  32. package/core/geom/3d/morton/mortonEncode_magicbits.js +2 -1
  33. package/core/geom/3d/morton/reinterpret_float32_as_int32.js +13 -0
  34. package/core/geom/3d/morton/v3_morton_encode_transformed.js +33 -0
  35. package/core/geom/3d/normal/hemioct/unit_hemioct.spec.js +1 -1
  36. package/core/geom/3d/ray/ray_computeNearestPointToPoint.js +37 -0
  37. package/core/geom/3d/shape/AbstractShape3D.js +65 -0
  38. package/core/geom/3d/shape/TransformedShape3D.js +181 -0
  39. package/core/geom/3d/shape/TransformedShape3D.spec.js +33 -0
  40. package/core/geom/3d/shape/UnionShape3D.js +255 -0
  41. package/core/geom/3d/shape/UnitCubeShape3D.js +101 -0
  42. package/core/geom/3d/shape/UnitCubeShape3D.spec.js +42 -0
  43. package/core/geom/3d/shape/UnitSphereShape3D.js +55 -0
  44. package/core/geom/3d/shape/util/compute_signed_distance_gradient_by_sampling.js +48 -0
  45. package/core/geom/3d/shape/util/shape_to_visual_entity.js +159 -0
  46. package/core/geom/AABB2.js +1 -1
  47. package/core/geom/ConicRay.js +3 -1
  48. package/core/geom/LineSegment.js +0 -78
  49. package/core/geom/Matrix4.js +7 -8
  50. package/core/geom/Rectangle.js +2 -1
  51. package/core/geom/Vector1.js +1 -1
  52. package/core/geom/Vector3.js +2 -1
  53. package/core/geom/Vector4.js +2 -1
  54. package/core/geom/random/randomPointInBox.js +7 -3
  55. package/core/geom/random/randomPointInPoint.js +6 -3
  56. package/core/geom/random/randomPointInSphere.js +9 -5
  57. package/core/geom/random/randomPointOnBox.js +7 -3
  58. package/core/geom/random/randomPointOnSphere.js +6 -3
  59. package/core/geom/v3_length.js +8 -3
  60. package/core/graph/graph_k_means_cluster.js +1 -1
  61. package/core/json/resolvePathByArray.js +2 -2
  62. package/core/math/MathUtils.js +0 -354
  63. package/core/math/MathUtils.spec.js +7 -1
  64. package/core/math/gaussian.js +9 -0
  65. package/core/math/hash/computeHashFloat.js +17 -0
  66. package/core/math/hash/computeHashFloatArray.js +34 -0
  67. package/core/math/hash/computeObjectHash.js +54 -0
  68. package/core/math/intersects1D.js +19 -0
  69. package/core/math/interval/NumericInterval.js +2 -2
  70. package/core/math/isValueBetween.js +10 -0
  71. package/core/math/isValueBetweenInclusive.js +10 -0
  72. package/core/math/noise/curl_noise_3dt.js +1 -1
  73. package/core/math/noise/sdnoise.js +10 -10
  74. package/core/math/overlap1D.js +19 -0
  75. package/core/math/pingpong.js +17 -0
  76. package/core/math/random/makeRangedRandom.js +19 -0
  77. package/core/math/random/randomFloatBetween.js +14 -0
  78. package/core/math/random/randomFromArray.js +19 -0
  79. package/core/math/random/randomGaussian.js +15 -0
  80. package/core/math/random/randomIntegerBetween.js +14 -0
  81. package/core/math/random/roundFair.js +15 -0
  82. package/core/math/separation1D.js +21 -0
  83. package/core/math/solveQuadratic.js +25 -0
  84. package/core/model/BoundedValue.js +1 -1
  85. package/core/model/node-graph/node/NodeInstancePortReference.js +1 -1
  86. package/core/model/node-graph/node/Port.js +1 -1
  87. package/core/model/reactive/evaluation/MultiPredicateEvaluator.spec.js +3 -1
  88. package/core/model/reactive/model/ReactiveBinaryExpression.js +1 -1
  89. package/core/model/reactive/model/terminal/ReactiveLiteralNumber.js +1 -1
  90. package/core/model/reactive/model/terminal/ReactiveReference.js +1 -1
  91. package/core/model/reactive/model/util/createRandomReactiveExpression.js +1 -1
  92. package/core/model/stat/LinearModifier.js +1 -1
  93. package/core/parser/simple/Token.d.ts +13 -0
  94. package/core/parser/simple/Token.js +61 -27
  95. package/{engine/graphics/render/forward_plus/materials → core/primitives/strings}/insert_after.js +3 -0
  96. package/core/primitives/strings/insert_after_or_replace.js +27 -0
  97. package/editor/process/symbolic/makeHelperBoxGeometry.js +44 -0
  98. package/editor/tools/FoliagePaintTool.js +4 -4
  99. package/editor/view/ecs/EntityEditor.js +2 -2
  100. package/editor/view/ecs/components/particles/ParticleEmitterController.js +2 -2
  101. package/engine/EngineHarness.js +1 -0
  102. package/engine/animation/AnimationUtils.js +5 -5
  103. package/engine/animation/curve/AnimationCurve.js +72 -0
  104. package/engine/animation/curve/Keyframe.js +27 -0
  105. package/engine/animation/keyed2/AnimationTrack.js +27 -3
  106. package/engine/asset/Asset.js +1 -1
  107. package/engine/asset/loaders/GLTFAssetLoader.d.ts +1 -1
  108. package/engine/asset/loaders/GLTFAssetLoader.js +62 -1
  109. package/engine/asset/loaders/image/ImageDecoderWorker.js +4 -3
  110. package/engine/asset/loaders/image/ImageRGBADataAsset.js +10 -2
  111. package/engine/asset/loaders/image/ImageRGBADataLoader.js +3 -3
  112. package/engine/asset/loaders/image/codec/NativeImageDecoder.js +2 -1
  113. package/engine/asset/loaders/image/png/PNG.js +113 -6
  114. package/engine/asset/loaders/image/png/PNGReader.js +5 -0
  115. package/engine/asset/loaders/material/bitmap2sampler_gl.js +1 -1
  116. package/engine/asset/loaders/material/computeImageBitmapEquality.js +6 -1
  117. package/engine/asset/loaders/material/computeMaterialHash.js +3 -1
  118. package/engine/asset/loaders/material/computeTextureEquality.js +40 -49
  119. package/engine/asset/loaders/material/computeTextureHash.js +2 -1
  120. package/engine/ecs/EntityBuilder.js +25 -5
  121. package/engine/ecs/EntityComponentDataset.js +1 -1
  122. package/engine/ecs/animation/Animation.js +2 -1
  123. package/engine/ecs/animation/InverseKinematics.js +2 -1
  124. package/engine/ecs/attachment/AttachmentBinding.js +8 -0
  125. package/engine/ecs/attachment/AttachmentSystem.js +4 -0
  126. package/engine/ecs/attachment/TransformAttachmentBinding.js +14 -44
  127. package/engine/ecs/components/Tag.js +27 -6
  128. package/engine/ecs/dynamic_actions/DynamicActorSystem.js +2 -1
  129. package/engine/ecs/dynamic_actions/DynamicRuleDescriptionTable.spec.js +3 -5
  130. package/engine/ecs/dynamic_actions/actions/definition/WeightedRandomActionDescription.js +1 -1
  131. package/engine/ecs/evaluation/complex/PointFitnessGaussianBlur.js +1 -1
  132. package/engine/ecs/foliage/InstancedFoliage.js +277 -266
  133. package/engine/ecs/foliage/ecs/Foliage2System.js +7 -7
  134. package/engine/ecs/foliage/ecs/InstancedMeshComponent.js +37 -0
  135. package/engine/ecs/foliage/ecs/{Foliage2.js → InstancedMeshLayer.js} +3 -45
  136. package/engine/ecs/foliage/ecs/InstancedMeshSerializationAdapter.js +6 -5
  137. package/engine/ecs/foliage/ecs/InstancedMeshUtils.js +7 -6
  138. package/engine/ecs/fow/FogOfWar.js +4 -0
  139. package/engine/ecs/fow/FogOfWarSystem.js +2 -0
  140. package/engine/ecs/fow/shader/FogOfWarRenderer.js +1 -1
  141. package/engine/ecs/gui/GUIElement.js +1 -1
  142. package/engine/ecs/gui/hud/HeadsUpDisplay.js +1 -1
  143. package/engine/ecs/gui/hud/HeadsUpDisplaySystem.js +2 -0
  144. package/engine/ecs/gui/position/ViewportPosition.js +2 -1
  145. package/engine/ecs/storage/binary/BinarySerializationRegistry.js +1 -1
  146. package/engine/ecs/system/AbstractContextSystem.js +1 -1
  147. package/engine/ecs/systems/RangedAttackSystem.js +1 -1
  148. package/engine/ecs/systems/SteeringSystem.js +1 -1
  149. package/engine/ecs/systems/TagSystem.js +17 -0
  150. package/engine/ecs/terrain/ecs/layers/TerrainLayer.js +12 -16
  151. package/engine/ecs/terrain/tiles/TerrainTileManager.js +1 -1
  152. package/engine/ecs/tooltip/TooltipComponent.js +15 -0
  153. package/engine/ecs/transform/Transform.js +19 -6
  154. package/engine/graphics/GraphicsEngine.js +11 -6
  155. package/engine/graphics/composit/CompositLayer.js +17 -4
  156. package/engine/graphics/composit/CompositingStages.js +8 -0
  157. package/engine/graphics/composit/LayerCompositer.js +35 -6
  158. package/engine/graphics/ecs/animation/animator/AnimationClip.js +2 -1
  159. package/engine/graphics/ecs/animation/animator/AnimationClipDefinition.js +2 -1
  160. package/engine/graphics/ecs/animation/animator/AnimationNotification.js +2 -1
  161. package/engine/graphics/ecs/animation/animator/AnimationNotificationDefinition.js +2 -1
  162. package/engine/graphics/ecs/animation/animator/graph/AnimationGraph.js +2 -1
  163. package/engine/graphics/ecs/animation/animator/graph/definition/AnimationGraphDefinition.js +2 -1
  164. package/engine/graphics/ecs/animation/animator/graph/definition/AnimationStateDefinition.js +1 -1
  165. package/engine/graphics/ecs/animation/animator/graph/definition/AnimationTransitionDefinition.js +2 -1
  166. package/engine/graphics/ecs/camera/CameraClippingPlaneComputer.js +1 -1
  167. package/engine/graphics/ecs/highlight/HighlightDefinition.js +2 -1
  168. package/engine/graphics/ecs/highlight/plugin/OutlineRenderPlugin.js +11 -7
  169. package/engine/graphics/ecs/light/Light.d.ts +1 -1
  170. package/engine/graphics/ecs/light/Light.js +5 -0
  171. package/engine/graphics/ecs/light/binding/three/ThreeLightBinding.js +5 -1
  172. package/engine/graphics/ecs/mesh/Mesh.js +2 -1
  173. package/engine/graphics/ecs/mesh-v2/DrawMode.js +5 -0
  174. package/engine/graphics/ecs/mesh-v2/ShadedGeometry.d.ts +13 -0
  175. package/engine/graphics/ecs/mesh-v2/ShadedGeometry.js +32 -18
  176. package/engine/graphics/ecs/mesh-v2/ShadedGeometrySystem.d.ts +6 -0
  177. package/engine/graphics/geometry/AttributeSpec.js +105 -0
  178. package/engine/graphics/{micron/format/MicronVertexDataSpec.js → geometry/VertexDataSpec.js} +56 -25
  179. package/engine/graphics/geometry/instancing/InstancedMeshGroup.js +14 -72
  180. package/engine/graphics/geometry/instancing/rewriteMaterial.js +70 -0
  181. package/engine/graphics/material/manager/MaterialManager.js +2 -1
  182. package/engine/graphics/micron/build/buildMicronGeometryFromBufferGeometry.js +7 -7
  183. package/engine/graphics/micron/build/fill_patch_geometry_data.js +1 -1
  184. package/engine/graphics/micron/buildPatchwork.js +1 -1
  185. package/engine/graphics/micron/format/MicronGeometry.js +3 -3
  186. package/engine/graphics/micron/format/serialization/MicronGeometryBinarySerializationAdapter.js +2 -2
  187. package/engine/graphics/micron/format/serialization/deserialize_attribute_spec.js +1 -1
  188. package/engine/graphics/micron/format/serialization/serialize_attribute_spec.js +1 -1
  189. package/engine/graphics/micron/render/PatchCacheKey.js +1 -1
  190. package/engine/graphics/micron/render/instanced/AttributeDataTexture.js +11 -9
  191. package/engine/graphics/micron/render/instanced/ThreeInstancedAdapter.js +0 -2
  192. package/engine/graphics/micron/render/v1/ThreeVirtualGeometryAdapter.js +1 -1
  193. package/engine/graphics/particles/ParticleEmitterLibrary.js +3 -0
  194. package/engine/graphics/particles/ecs/{ParticleEmitterSystem2.js → ParticleEmitterSystem.js} +17 -9
  195. package/engine/graphics/particles/particular/engine/ParticularEngine.js +8 -2
  196. package/engine/graphics/particles/particular/engine/emitter/PARTICULAR_PARTICLE_SPECIFICATION.js +80 -16
  197. package/engine/graphics/particles/particular/engine/emitter/ParticleEmitter.js +71 -77
  198. package/engine/graphics/particles/particular/engine/emitter/ParticleEmitterFlag.js +5 -0
  199. package/engine/graphics/particles/particular/engine/emitter/ParticleLayer.js +2 -1
  200. package/engine/graphics/particles/particular/engine/emitter/ParticlePool.js +141 -14
  201. package/engine/graphics/particles/particular/engine/emitter/ParticlePool.spec.js +8 -7
  202. package/engine/graphics/particles/particular/engine/emitter/computeEmissionFunction.js +1 -1
  203. package/engine/graphics/particles/particular/engine/emitter/serde/ParameterLookupTableSerializationAdapter.js +8 -2
  204. package/engine/graphics/particles/particular/engine/parameter/ParameterLookupTable.js +2 -1
  205. package/engine/graphics/particles/particular/engine/parameter/ParameterTrack.js +1 -1
  206. package/engine/graphics/particles/particular/engine/parameter/ParticleParameter.js +1 -1
  207. package/engine/graphics/particles/particular/engine/renderers/billboard/BILLBOARD_PARTICLE_SPECIFICATION.js +24 -0
  208. package/engine/graphics/particles/particular/engine/renderers/billboard/ParticleBillboardMaterial.js +262 -71
  209. package/engine/graphics/particles/particular/engine/renderers/billboard/prototypeBillboardRenderer.js +9 -9
  210. package/engine/graphics/particles/particular/engine/shader/ShaderManager.js +81 -48
  211. package/engine/graphics/particles/particular/engine/shader/debugAtlas.js +14 -0
  212. package/engine/graphics/particles/particular/engine/simulator/SimulationStepApplyForce.js +2 -5
  213. package/engine/graphics/particles/particular/engine/simulator/SimulationStepCurlNoiseAcceleration.js +2 -6
  214. package/engine/graphics/particles/particular/engine/simulator/SimulationStepCurlNoiseVelocity.js +2 -7
  215. package/engine/graphics/particles/particular/engine/simulator/SimulationStepFixedPhysics.js +2 -5
  216. package/engine/graphics/particles/particular/engine/simulator/update_parameters.js +1 -1
  217. package/engine/graphics/particles/particular/engine/utils/distributeParticlesOnObject3D.js +1 -1
  218. package/engine/graphics/particles/particular/engine/utils/distrubuteParticlesOnMesh.js +1 -1
  219. package/engine/graphics/particles/particular/engine/utils/volume/AttributeValue.js +141 -0
  220. package/engine/graphics/particles/particular/engine/utils/volume/ParticleVolume.js +478 -0
  221. package/engine/graphics/particles/particular/engine/utils/volume/lut_to_sampler.js +27 -0
  222. package/engine/graphics/particles/particular/engine/utils/volume/prototypeParticleVolume.js +938 -0
  223. package/engine/graphics/particles/particular/group/Operation.js +18 -0
  224. package/engine/graphics/particles/particular/group/OperationType.js +9 -0
  225. package/engine/graphics/particles/particular/group/ParticleAttribute.js +2 -1
  226. package/engine/graphics/particles/particular/group/ParticleAttributeType.js +11 -0
  227. package/engine/graphics/particles/particular/group/ParticleDataType.js +10 -0
  228. package/engine/graphics/particles/particular/group/ParticleGroup.js +7 -245
  229. package/engine/graphics/particles/particular/group/ParticleGroup.spec.js +3 -1
  230. package/engine/graphics/particles/particular/group/ParticleSpecification.js +21 -14
  231. package/engine/graphics/particles/particular/group/itemSizeFromAttributeType.js +20 -0
  232. package/engine/graphics/particles/particular/group/optimizeCommandQueue.js +162 -0
  233. package/engine/graphics/particles/particular/group/typedArrayConstructorFromDataType.js +19 -0
  234. package/engine/graphics/render/buffer/simple-fx/ao/AmbientOcclusionPostProcessEffect.js +16 -11
  235. package/engine/graphics/render/buffer/slot/parameter/ProgramValueSlotParameter.js +2 -1
  236. package/engine/graphics/render/buffer/slot/parameter/ProgramValueSlotParameterSet.js +1 -1
  237. package/engine/graphics/render/forward_plus/LightManager.js +117 -94
  238. package/engine/graphics/render/forward_plus/PointLight.js +9 -0
  239. package/engine/graphics/render/forward_plus/PointLightData.js +1 -1
  240. package/engine/graphics/render/forward_plus/SpotLight.js +9 -0
  241. package/engine/graphics/render/forward_plus/cluster/compute_light_data_hash_0.js +2 -2
  242. package/engine/graphics/render/forward_plus/materials/FP_INJECTION_POINT_ACCUMULATION.js +1 -0
  243. package/engine/graphics/render/forward_plus/materials/FP_SHADER_CHUNK_ACCUMULATION.js +32 -0
  244. package/engine/graphics/render/forward_plus/materials/FP_SHADER_CHUNK_DECODE_PARS.js +51 -0
  245. package/engine/graphics/render/forward_plus/materials/FP_SHADER_CHUNK_PREAMBLE.js +25 -0
  246. package/engine/graphics/render/forward_plus/materials/FPlusDebugMaterial.js +3 -3
  247. package/engine/graphics/render/forward_plus/materials/ForwardPlusThreeMaterial.js +1 -1
  248. package/engine/graphics/render/forward_plus/materials/fp_build_fragment_shader.js +31 -120
  249. package/engine/graphics/render/forward_plus/materials/fp_build_vertex_lighting_shared.js +35 -0
  250. package/engine/graphics/render/forward_plus/materials/fp_build_vertex_shader.js +4 -5
  251. package/engine/graphics/render/forward_plus/plugin/ForwardPlusRenderingPlugin.js +1 -1
  252. package/engine/graphics/render/forward_plus/plugin/MaterialTransformer.js +10 -3
  253. package/engine/graphics/render/forward_plus/plugin/ptototypeFPPlugin.js +594 -59
  254. package/engine/graphics/render/forward_plus/prototypeLightManager.js +208 -89
  255. package/engine/graphics/render/forward_plus/query/analytical_triplanar_corner_mapping.js +8 -0
  256. package/engine/graphics/render/forward_plus/query/cube_mapping.js +38 -0
  257. package/engine/graphics/render/forward_plus/query/detailed_sphere_frustum_intersection_test.js +86 -0
  258. package/engine/graphics/render/forward_plus/query/point_light_inside_volume.js +74 -0
  259. package/engine/graphics/render/forward_plus/query/query_bvh_frustum_from_objects.js +131 -0
  260. package/engine/graphics/render/forward_plus/query/query_bvh_frustum_from_texture.js +129 -0
  261. package/engine/graphics/render/forward_plus/query/spot_light_inside_volume.js +33 -0
  262. package/engine/graphics/render/forward_plus/read_frustum_corner.js +14 -0
  263. package/engine/graphics/render/forward_plus/testClusterEquality.js +22 -0
  264. package/engine/graphics/render/visibility/IncrementalDeltaSet.js +11 -0
  265. package/engine/graphics/render/visibility/hiz/prototypeHiZ.js +1 -1
  266. package/engine/graphics/shaders/TerrainShader.js +4 -5
  267. package/engine/graphics/shadows/ShadowMapRenderer.js +8 -2
  268. package/engine/graphics/texture/atlas/ManagedTextureAtlas.js +12 -1
  269. package/engine/graphics/texture/sampler/HarmonicDiffusionGrid.spec.js +1 -1
  270. package/engine/graphics/texture/sampler/SampleTraverser.js +1 -1
  271. package/engine/graphics/texture/sampler/Sampler2D.js +3 -1
  272. package/engine/graphics/texture/sampler/convertTexture2Sampler2D.js +1 -1
  273. package/engine/graphics/texture/sampler/copy_Sampler2D_channel_data.js +66 -0
  274. package/engine/graphics/texture/sampler/distanceField.spec.js +1 -1
  275. package/engine/graphics/util/composeMatrix4.js +33 -23
  276. package/engine/graphics/util/decompose_matrix_4_array.js +61 -0
  277. package/engine/grid/components/GridObstacle.js +1 -1
  278. package/engine/intelligence/behavior/ecs/BehaviorComponent.js +30 -14
  279. package/engine/intelligence/behavior/selector/WeightedElement.js +2 -1
  280. package/engine/intelligence/optimization/RandomOptimizer.js +1 -1
  281. package/engine/knowledge/database/StaticKnowledgeDataTable.js +6 -1
  282. package/engine/navigation/ecs/components/Path.js +1 -6
  283. package/engine/navigation/grid/FastBinaryHeap.spec.js +1 -1
  284. package/engine/sound/ecs/emitter/SoundEmitter.js +2 -1
  285. package/engine/sound/ecs/emitter/SoundTrack.js +2 -1
  286. package/engine/sound/material/concrete/RandomSoundMaterial.js +1 -1
  287. package/engine/ui/notification/notificationGenerator.js +1 -1
  288. package/generation/filtering/numeric/complex/CellFilterGaussianBlur.js +1 -1
  289. package/generation/grid/generation/GridTaskExecuteRuleTimes.js +2 -1
  290. package/generation/markers/actions/MarkerNodeActionSelectRandom.js +1 -1
  291. package/generation/markers/transform/MarkerNodeTransformerRecordUniqueRandomEnum.js +1 -1
  292. package/generation/placement/action/random/CellActionSelectRandom.js +1 -1
  293. package/generation/theme/ThemeEngine.js +1 -1
  294. package/misc/makeMaterialIconCached.js +2 -2
  295. package/package.json +1 -1
  296. package/view/elements/image/HTMLElementCacheKey.js +2 -1
  297. package/view/elements/radial/RadialText.js +2 -1
  298. package/view/minimap/gl/MinimapMarkersGL.js +6 -100
  299. package/view/minimap/gl/MinimapWorldGL.js +12 -5
  300. package/view/minimap/gl/buildMaterial.js +94 -0
  301. package/engine/graphics/micron/format/MicronGeometryBufferAttributeSpec.js +0 -71
  302. package/engine/graphics/render/forward_plus/queryBVH_Frustum.js +0 -357
@@ -0,0 +1,74 @@
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
+
47
+ // sphere intersects the plane
48
+
49
+ outside_plane_count++;
50
+
51
+ const plane_bit_mask = 1 << j;
52
+
53
+ outside_plane_bitfield |= plane_bit_mask;
54
+ } else {
55
+ // sphere is entirely below the plane
56
+
57
+ // query_bvh_frustum_from_objects.rejection_sphere_count++;
58
+
59
+ return false;
60
+ }
61
+ }
62
+
63
+ }
64
+
65
+ if (outside_plane_count < 2) {
66
+ return true;
67
+ } else {
68
+ return detailed_sphere_frustum_intersection_test(
69
+ radius, light_x, light_y, light_z,
70
+ outside_plane_count, outside_plane_bitfield,
71
+ points
72
+ );
73
+ }
74
+ }
@@ -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
+ }
@@ -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
 
@@ -121,7 +121,6 @@ function fragment() {
121
121
  uniform float opacity;
122
122
 
123
123
  varying vec3 vViewPosition;
124
-
125
124
 
126
125
 
127
126
  #include <common>
@@ -364,10 +363,10 @@ function fragment() {
364
363
 
365
364
  vec3 outgoingLight = totalDiffuse + totalSpecular + totalEmissiveRadiance;
366
365
 
367
- pc_fragColor = vec4( outgoingLight, diffuseColor.a );
366
+ gl_FragColor = vec4( outgoingLight, diffuseColor.a );
368
367
 
369
368
  #if defined( TONE_MAPPING )
370
- pc_fragColor.rgb = toneMapping( pc_fragColor.rgb );
369
+ gl_FragColor.rgb = toneMapping( pc_fragColor.rgb );
371
370
  #endif
372
371
 
373
372
  //encode fragment
@@ -378,12 +377,12 @@ function fragment() {
378
377
  #else
379
378
  float fogFactor = smoothstep( fogNear, fogFar, fogDepth );
380
379
  #endif
381
- pc_fragColor.rgb = mix( pc_fragColor.rgb, fogColor, fogFactor );
380
+ gl_FragColor.rgb = mix( pc_fragColor.rgb, fogColor, fogFactor );
382
381
  #endif
383
382
 
384
383
  #ifdef PREMULTIPLIED_ALPHA
385
384
  // Get get normal blending with premultipled, use with CustomBlending, OneFactor, OneMinusSrcAlphaFactor, AddEquation.
386
- pc_fragColor.rgb *= pc_fragColor.a;
385
+ gl_FragColor.rgb *= pc_fragColor.a;
387
386
  #endif
388
387
 
389
388
  #ifdef DITHERING
@@ -173,13 +173,19 @@ export class ShadowMapRenderer {
173
173
 
174
174
  if (shadow.map === null) {
175
175
 
176
- const pars = { format: RGBAFormat };
176
+ const pars = {
177
+ format: RGBAFormat,
178
+ scissorTest: false,
179
+ stencilBuffer: false
180
+ };
177
181
 
178
182
  if (!shadow.isPointLightShadow && renderer.shadowMap.type === VSMShadowMap) {
179
183
  pars.minFilter = LinearFilter;
180
184
  pars.magFilter = LinearFilter;
181
185
 
182
- shadow.mapPass = new WebGLRenderTarget(_shadowMapSize.x, _shadowMapSize.y, pars);
186
+ shadow.mapPass = new WebGLRenderTarget(_shadowMapSize.x, _shadowMapSize.y, Object.assign({
187
+ depthBuffer: false
188
+ }, pars));
183
189
 
184
190
  } else {
185
191
  pars.minFilter = NearestFilter;
@@ -6,6 +6,7 @@ import { GameAssetType } from "../../../asset/GameAssetType.js";
6
6
  import { HashMap } from "../../../../core/collection/HashMap.js";
7
7
  import { strictEquals } from "../../../../core/function/Functions.js";
8
8
  import { computeStringHash } from "../../../../core/primitives/strings/computeStringHash.js";
9
+ import { copy_Sampler2D_channel_data } from "../sampler/copy_Sampler2D_channel_data.js";
9
10
 
10
11
  const CACHE_SIZE = 4194304;
11
12
 
@@ -139,10 +140,20 @@ export class ManagedAtlas {
139
140
 
140
141
  const image = asset.create();
141
142
 
143
+ const source = new Sampler2D(image.data, image.itemSize, image.width, image.height);
142
144
  //assert.equal(atlas.patches.filter(p => p.sampler.data === image.data).length, 0, "Atlas already contains this asset data");
143
145
 
144
146
  //build sampler
145
- const sampler = new Sampler2D(image.data, 4, image.width, image.height);
147
+ let sampler;
148
+
149
+ if (source.itemSize !== 4) {
150
+ // source image is not in RGBA layout, resample
151
+ sampler = Sampler2D.uint8(4, image.width, image.height);
152
+ copy_Sampler2D_channel_data(source, sampler)
153
+ } else {
154
+ sampler = source;
155
+ }
156
+
146
157
  const patch = atlas.add(sampler);
147
158
 
148
159
  //record active patch
@@ -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);
@@ -3,8 +3,8 @@
3
3
  */
4
4
  import QuadTree from '../../../../core/geom/2d/quad-tree/PointQuadTree.js';
5
5
  import AABB2 from '../../../../core/geom/AABB2.js';
6
- import { makeRangedRandom} from '../../../../core/math/MathUtils.js';
7
6
  import { seededRandom } from "../../../../core/math/random/seededRandom.js";
7
+ import { makeRangedRandom } from "../../../../core/math/random/makeRangedRandom.js";
8
8
 
9
9
 
10
10
  const Point2 = function (x, y) {
@@ -164,11 +164,13 @@ export function Sampler2D(data = [], itemSize = 1, width = 0, height = 0) {
164
164
  * @type {Number}
165
165
  */
166
166
  this.height = height;
167
+
167
168
  /**
168
- *
169
+ * Number of channels
169
170
  * @type {Number}
170
171
  */
171
172
  this.itemSize = itemSize;
173
+
172
174
  /**
173
175
  *
174
176
  * @type {Array<number>|Uint8Array|Uint16Array|Int8Array|Float32Array|Float64Array}
@@ -17,7 +17,7 @@ const DEFAULT_TEXTURE_HEIGHT = 512;
17
17
  * @return {Sampler2D}
18
18
  */
19
19
  export function convertTexture2Sampler2D(texture, width, height, flipY = true) {
20
-
20
+ // TODO take channel count into account
21
21
 
22
22
  if (width === undefined || height === undefined) {
23
23
 
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Allows copying data from one sampler to another with unequal number of channels (a.itemSize !== b.itemSize)
3
+ * @example convert RGBA to RGB or R to RGB
4
+ * @param {Sampler2D} source
5
+ * @param {Sampler2D} destination
6
+ */
7
+ export function copy_Sampler2D_channel_data(source, destination) {
8
+ if (source.width !== destination.width || source.height !== destination.height) {
9
+ throw new Error('Source and destination dimensions do not match');
10
+ }
11
+
12
+ const source_item_size = source.itemSize;
13
+ const destination_item_size = destination.itemSize;
14
+
15
+ const pixel_count = source.width * source.height;
16
+
17
+ const destination_data = destination.data;
18
+ const source_data = source.data;
19
+
20
+ let i, j;
21
+
22
+ if (source_item_size === destination_item_size) {
23
+ // just copy data chunk
24
+ destination_data.set(source_data);
25
+
26
+ } else if (source_item_size > destination_item_size) {
27
+
28
+ for (i = 0; i < pixel_count; i++) {
29
+ const source_sample_offset = i * source_item_size;
30
+ const destination_sample_offset = i * destination_item_size;
31
+
32
+ for (j = 0; j < destination_item_size; j++) {
33
+ destination_data[destination_sample_offset + j] = source_data[source_sample_offset + j];
34
+ }
35
+ }
36
+
37
+ } else if (source_item_size === 3 && destination_item_size === 4) {
38
+ // RGB -> RGBA
39
+ for (i = 0; i < pixel_count; i++) {
40
+ const i3 = i * 3;
41
+ const i4 = i * 4;
42
+
43
+ destination_data[i4] = source_data[i3];
44
+ destination_data[i4 + 1] = source_data[i3 + 1];
45
+ destination_data[i4 + 2] = source_data[i3 + 2];
46
+
47
+ destination_data[i4] = 255; // fill alpha
48
+ }
49
+ } else if (source_item_size === 2 && destination_item_size === 4) {
50
+ //RA -> RGBA
51
+ for (i = 0; i < pixel_count; i++) {
52
+ const i2 = i * 2;
53
+ const i4 = i * 4;
54
+
55
+ const r = source_data[i2];
56
+
57
+ destination_data[i4] = r;
58
+ destination_data[i4 + 1] = r;
59
+ destination_data[i4 + 2] = r;
60
+
61
+ destination_data[i4 + 3] = source_data[i2 + 1]; // fill alpha
62
+ }
63
+ } else {
64
+ throw new Error('Unsupported channel layout combination');
65
+ }
66
+ }
@@ -1,7 +1,7 @@
1
1
  import { seededRandom } from "../../../../core/math/random/seededRandom.js";
2
2
  import { Sampler2D } from "./Sampler2D.js";
3
3
  import { computeUnsignedDistanceField } from "./distanceField.js";
4
- import { randomIntegerBetween} from "../../../../core/math/MathUtils.js";
4
+ import { randomIntegerBetween } from "../../../../core/math/random/randomIntegerBetween.js";
5
5
 
6
6
  describe('computeUnsignedDistanceField', () => {
7
7
  test('empty', () => {