@woosh/meep-engine 2.37.18 → 2.38.0

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 (289) hide show
  1. package/core/assert.js +1 -1
  2. package/core/binary/float2uint8.js +8 -0
  3. package/core/binary/uint82float.js +8 -0
  4. package/core/bvh2/bvh3/ExplicitBinaryBoundingVolumeHierarchy.js +6 -4
  5. package/core/collection/array/array_get_index_in_range.js +16 -0
  6. package/core/collection/array/typed/isTypedArray.js +20 -0
  7. package/core/collection/array/typedArrayToDataType.js +1 -0
  8. package/{engine/navigation/grid → core/collection/heap}/BinaryHeap.js +6 -1
  9. package/{engine/navigation/grid → core/collection/heap}/FastBinaryHeap.js +3 -2
  10. package/{engine/navigation/grid → core/collection/heap}/FastBinaryHeap.spec.js +3 -3
  11. package/core/collection/heap/Uin32Heap.spec.js +59 -0
  12. package/core/collection/heap/Uint32Heap.js +385 -0
  13. package/core/collection/list/List.d.ts +1 -1
  14. package/core/collection/table/RowFirstTable.js +34 -0
  15. package/core/collection/table/RowFirstTable.spec.js +59 -1
  16. package/core/color/Color.js +83 -1
  17. package/core/color/YCbCr_to_rgb_uint24.js +3 -4
  18. package/core/color/hsv2rgb.js +4 -3
  19. package/core/color/linear_to_sRGB.js +4 -5
  20. package/core/color/rgb2hex.js +1 -1
  21. package/core/color/rgb2uint24.js +6 -4
  22. package/core/color/rgb_to_YCbCr_uint24.js +11 -13
  23. package/core/events/signal/Signal.d.ts +11 -9
  24. package/core/events/signal/Signal.spec.js +16 -0
  25. package/core/geom/2d/quad-tree/qt_collect_by_circle.js +67 -0
  26. package/core/geom/3d/topology/computeTopoMeshVertexDuplicates.js +9 -6
  27. package/core/geom/3d/topology/expandConnectivityByLocality.js +5 -5
  28. package/core/geom/3d/topology/query/query_edge_is_boundary.js +7 -0
  29. package/core/geom/3d/topology/query/query_edge_is_manifold.js +13 -0
  30. package/core/geom/3d/topology/query/query_edge_is_manifold_or_boundary.js +11 -0
  31. package/core/geom/3d/topology/query/query_edge_is_wire.js +13 -0
  32. package/core/geom/3d/topology/query/query_edge_other_vertex.js +20 -0
  33. package/core/geom/3d/topology/query/query_edge_share_vert.js +9 -0
  34. package/core/geom/3d/topology/query/query_face_get_other_edges.js +39 -0
  35. package/core/geom/3d/topology/query/query_face_next_vertex.js +19 -0
  36. package/core/geom/3d/topology/query/query_face_prev_vertex.js +18 -0
  37. package/core/geom/3d/topology/query/query_vertex_in_edge.js +14 -0
  38. package/core/geom/3d/topology/query/query_vertex_pair_share_face.js +24 -0
  39. package/core/geom/3d/topology/query/query_vertices_in_edge.js +19 -0
  40. package/core/geom/3d/topology/simplify/collapseEdge.spec.js +3 -5
  41. package/core/geom/3d/topology/simplify/collapse_all_degenerate_edges.js +8 -10
  42. package/core/geom/3d/topology/simplify/compute_face_normal_change_dot_product.js +12 -2
  43. package/core/geom/3d/topology/simplify/decimate_edge_collapse_snap.js +277 -0
  44. package/core/geom/3d/topology/simplify/edge_collapse_quadratic.js +126 -0
  45. package/core/geom/3d/topology/simplify/prototypeMeshSimplification.js +502 -0
  46. package/core/geom/3d/topology/simplify/quadratic/Quadratic3.js +37 -5
  47. package/core/geom/3d/topology/simplify/quadratic/build_vertex_quadratics.js +86 -1
  48. package/core/geom/3d/topology/simplify/simplifyTopoMesh.js +4 -4
  49. package/core/geom/3d/topology/simplify/simplifyTopoMesh2.js +119 -0
  50. package/core/geom/3d/topology/simplify/tm_edge_collapse_is_degenerate_flip.js +81 -0
  51. package/core/geom/3d/topology/{TopoEdge.js → struct/TopoEdge.js} +47 -20
  52. package/core/geom/3d/topology/{TopoEdge.spec.js → struct/TopoEdge.spec.js} +0 -0
  53. package/core/geom/3d/topology/{TopoMesh.js → struct/TopoMesh.js} +20 -41
  54. package/core/geom/3d/topology/{TopoTriangle.js → struct/TopoTriangle.js} +15 -25
  55. package/core/geom/3d/topology/{TopoVertex.js → struct/TopoVertex.js} +21 -4
  56. package/core/geom/3d/topology/{TopoVertex.spec.js → struct/TopoVertex.spec.js} +0 -0
  57. package/core/geom/3d/topology/tm_edge_kill.js +24 -0
  58. package/core/geom/3d/topology/tm_edge_splice.js +42 -0
  59. package/core/geom/3d/topology/tm_face_area.js +18 -0
  60. package/core/geom/3d/topology/tm_face_kill.js +12 -0
  61. package/core/geom/3d/topology/tm_face_normal.js +14 -0
  62. package/core/geom/3d/topology/tm_kill_only_edge.js +35 -0
  63. package/core/geom/3d/topology/tm_kill_only_face.js +12 -0
  64. package/core/geom/3d/topology/tm_kill_only_vert.js +14 -0
  65. package/core/geom/3d/topology/tm_vert_kill.js +19 -0
  66. package/core/geom/3d/topology/tm_vert_splice.js +64 -0
  67. package/core/geom/3d/topology/tm_vertex_compute_normal.js +42 -0
  68. package/core/geom/3d/topology/topoMeshToBufferGeometry.js +18 -4
  69. package/core/geom/3d/topology/weld_duplicate_vertices.js +63 -0
  70. package/core/geom/Quaternion.d.ts +21 -1
  71. package/core/geom/Quaternion.js +279 -200
  72. package/core/geom/Quaternion.spec.js +71 -2
  73. package/core/geom/Vector2.js +3 -3
  74. package/core/geom/Vector3.d.ts +2 -0
  75. package/core/geom/Vector3.js +31 -7
  76. package/core/geom/Vector3.schema.json +16 -0
  77. package/core/geom/Vector4.js +16 -0
  78. package/core/geom/packing/MaxRectangles.js +1 -1
  79. package/core/graph/cluster_mesh_metis.js +16 -0
  80. package/core/graph/coarsen_graph.js +1 -1
  81. package/core/graph/graph_k_means_cluster.js +1 -1
  82. package/core/json/JsonUtils.js +2 -20
  83. package/core/math/bell_membership_function.js +19 -0
  84. package/core/math/exp2.js +8 -0
  85. package/core/math/interval/NumericInterval.js +17 -0
  86. package/core/math/physics/brdf/brdf_burley.js +25 -0
  87. package/core/math/physics/bsdf/bsdf_schlick.js +22 -0
  88. package/core/math/physics/irradiance/interpolate_irradiance_linear.js +18 -0
  89. package/{engine/sound/ecs/emitter/attenuate/attenuateSoundLogarithmic.js → core/math/physics/irradiance/interpolate_irradiance_lograrithmic.js} +2 -2
  90. package/{engine/sound/ecs/emitter/attenuate/attenuateSoundSmith.js → core/math/physics/irradiance/interpolate_irradiance_smith.js} +1 -1
  91. package/core/math/random/seededRandom.js +2 -31
  92. package/core/math/random/seededRandom_Mulberry32.js +31 -0
  93. package/core/math/random/seededRandom_sine.js +33 -0
  94. package/core/model/ObservedEnum.js +8 -0
  95. package/editor/Editor.js +97 -1
  96. package/editor/actions/concrete/ModifyPatchSampler2DAction.js +118 -0
  97. package/editor/actions/concrete/ModifyPatchSampler2DAction.spec.js +30 -0
  98. package/editor/actions/concrete/PatchTerrainHeightAction.js +13 -105
  99. package/editor/ecs/component/FieldDescriptor.js +34 -0
  100. package/editor/ecs/component/FieldValueAdapter.js +20 -0
  101. package/editor/ecs/component/TypeEditor.js +33 -0
  102. package/editor/ecs/component/TypeSchema.d.ts +38 -0
  103. package/editor/ecs/component/createFieldEditor.js +90 -0
  104. package/editor/ecs/component/createObjectEditor.js +266 -60
  105. package/editor/ecs/component/editors/ColorEditor.js +39 -0
  106. package/editor/ecs/component/editors/HTMLElementEditor.js +17 -0
  107. package/editor/ecs/component/editors/ImagePathEditor.js +50 -0
  108. package/editor/ecs/component/editors/NumericIntervalEditor.js +86 -0
  109. package/editor/ecs/component/editors/ObservedBooleanEditor.js +13 -0
  110. package/editor/ecs/component/editors/ObservedEnumEditor.js +32 -0
  111. package/editor/ecs/component/editors/ObservedIntegerEditor.js +43 -0
  112. package/editor/ecs/component/editors/ObservedStringEditor.js +51 -0
  113. package/editor/ecs/component/editors/Sampler2DEditor.js +107 -0
  114. package/editor/ecs/component/editors/collection/ListEditor.js +83 -0
  115. package/editor/ecs/component/editors/common/BitFlagsEditor.js +80 -0
  116. package/editor/ecs/component/editors/common/EnumEditor.js +41 -0
  117. package/editor/ecs/component/editors/common/makeV3_editor.js +85 -0
  118. package/editor/ecs/component/editors/common/noEditor.js +9 -0
  119. package/editor/ecs/component/editors/ecs/GridObstacleEditor.js +17 -0
  120. package/editor/ecs/component/editors/ecs/MinimapMarkerEditor.js +16 -0
  121. package/editor/ecs/component/editors/ecs/ParameterLookupTableEditor.js +44 -0
  122. package/editor/ecs/component/editors/ecs/ParameterTrackEditor.js +17 -0
  123. package/editor/ecs/component/editors/ecs/ParticleEmitterEditor.js +58 -0
  124. package/editor/ecs/component/editors/ecs/ParticleEmitterLayerEditor.js +54 -0
  125. package/editor/ecs/component/editors/ecs/SimulationStepDefinitionEditor.js +21 -0
  126. package/editor/ecs/component/editors/ecs/Trail2DEditor.js +33 -0
  127. package/editor/ecs/component/editors/ecs/TransformEditor.js +23 -0
  128. package/editor/ecs/component/editors/ecs/terrain/SplatMappingEditor.js +21 -0
  129. package/editor/ecs/component/editors/ecs/terrain/TerrainEditor.js +89 -0
  130. package/editor/ecs/component/editors/ecs/terrain/TerrainLayerEditor.js +18 -0
  131. package/editor/ecs/component/editors/ecs/terrain/TerrainLayersEditor.js +22 -0
  132. package/editor/ecs/component/editors/ecs/terrain/TerrainOverlayEditor.js +20 -0
  133. package/editor/ecs/component/editors/geom/QuaternionEditor.js +56 -0
  134. package/editor/ecs/component/editors/geom/Vector1Editor.js +57 -0
  135. package/editor/ecs/component/editors/geom/Vector2Editor.js +11 -0
  136. package/editor/ecs/component/editors/geom/Vector3Editor.js +13 -0
  137. package/editor/ecs/component/editors/geom/Vector4Editor.js +12 -0
  138. package/editor/ecs/component/editors/primitive/ArrayEditor.js +46 -0
  139. package/editor/ecs/component/editors/primitive/BooleanEditor.js +27 -0
  140. package/editor/ecs/component/editors/primitive/FunctionEditor.js +29 -0
  141. package/editor/ecs/component/editors/primitive/NumberEditor.js +60 -0
  142. package/editor/ecs/component/editors/primitive/ObjectEditor.js +12 -0
  143. package/editor/ecs/component/editors/primitive/StringEditor.js +31 -0
  144. package/editor/ecs/component/editors/three/BufferGeometryEditor.js +28 -0
  145. package/editor/ecs/component/editors/three/MaterialEditor.js +27 -0
  146. package/editor/ecs/component/editors/three/MeshEditor.js +35 -0
  147. package/editor/ecs/component/editors/three/TextureEditor.js +32 -0
  148. package/editor/ecs/component/findNearestRegisteredType.js +59 -0
  149. package/editor/ecs/component/prototypeObjectEditor.js +379 -0
  150. package/editor/tools/SelectionTool.js +1 -1
  151. package/editor/tools/paint/TerrainHeightPaintTool.js +88 -68
  152. package/editor/tools/paint/TerrainPaintTool.js +2 -1
  153. package/editor/tools/paint/TerrainTexturePaintTool.js +8 -73
  154. package/editor/view/EditorView.js +1 -1
  155. package/editor/view/ecs/ComponentControlView.js +2 -30
  156. package/editor/view/ecs/EntityEditor.js +61 -139
  157. package/editor/view/ecs/components/GridObstacleController.js +4 -4
  158. package/editor/view/ecs/components/TerrainController.js +1 -1
  159. package/editor/view/ecs/components/common/NumberController.js +19 -7
  160. package/editor/view/node-graph/NodeGraphView.js +2 -2
  161. package/editor/view/node-graph/NodeView.js +7 -9
  162. package/engine/animation/keyed2/AnimationTrack.js +1 -1
  163. package/engine/asset/AssetManager.d.ts +1 -1
  164. package/engine/asset/AssetManager.js +390 -388
  165. package/engine/asset/loaders/gltf/extensions/MSFT_texture_dds.js +14 -2
  166. package/engine/ecs/components/TagEditor.js +15 -0
  167. package/engine/ecs/fow/FogOfWarEditor.js +13 -0
  168. package/engine/ecs/parent/ParentEntitySystem.js +57 -0
  169. package/engine/ecs/terrain/ecs/OffsetScaleTransform2D.d.ts +6 -0
  170. package/engine/ecs/terrain/ecs/Terrain.js +44 -43
  171. package/engine/ecs/terrain/ecs/TerrainSystem.js +2 -2
  172. package/engine/ecs/terrain/ecs/layers/TerrainLayer.js +1 -1
  173. package/engine/ecs/terrain/ecs/splat/SplatMapping.js +26 -28
  174. package/engine/ecs/terrain/overlay/TerrainOverlay.js +71 -66
  175. package/engine/ecs/terrain/tiles/TerrainTileManager.js +23 -0
  176. package/engine/ecs/terrain/util/loadVisibleTerrainTiles.js +1 -1
  177. package/engine/ecs/terrain/util/paintTerrainOverlayViaLookupTable.js +13 -7
  178. package/engine/ecs/terrain/util/tensionOptimizeUV.js +1 -1
  179. package/engine/ecs/transform/Transform.d.ts +2 -0
  180. package/engine/ecs/transform/Transform.editor.schema.json +16 -0
  181. package/engine/ecs/transform/Transform.js +3 -0
  182. package/engine/graphics/ecs/highlight/HighlightEditor.js +17 -0
  183. package/engine/graphics/ecs/light/Light.js +0 -47
  184. package/engine/graphics/ecs/light/LightSerializationAdapter.js +50 -0
  185. package/engine/graphics/ecs/mesh/MeshEditor.js +28 -0
  186. package/engine/graphics/ecs/mesh-v2/DrawMode.js +2 -1
  187. package/engine/graphics/ecs/mesh-v2/aggregate/prototypeSGMesh.js +3 -3
  188. package/engine/graphics/ecs/mesh-v2/build_three_object.js +3 -1
  189. package/engine/graphics/ecs/mesh-v2/sg_compute_hierarchy_bounding_box_by_parent_entity.js +31 -0
  190. package/engine/graphics/ecs/mesh-v2/sg_hierarchy_compute_bounding_box_via_parent_entity.d.ts +4 -0
  191. package/engine/graphics/ecs/sprite/Sprite.js +11 -0
  192. package/engine/graphics/ecs/sprite/SpriteSystemPE.js +133 -0
  193. package/engine/graphics/ecs/sprite/prototypeSpriteSystem.js +1570 -0
  194. package/engine/graphics/micron/build/PatchRepresentation.js +7 -3
  195. package/engine/graphics/micron/build/buildMicronGeometryFromBufferGeometry.js +18 -8
  196. package/engine/graphics/micron/build/clustering/build_clustering_2.js +1 -1
  197. package/engine/graphics/micron/build/clustering/build_leaf_patches.js +2 -2
  198. package/engine/graphics/micron/build/clustering/build_leaf_patches_metis.js +1 -1
  199. package/engine/graphics/micron/build/hierarchy/buildAbstractPatchHierarchy.js +21 -3
  200. package/engine/graphics/micron/build/hierarchy/merge_patches.js +96 -43
  201. package/engine/graphics/micron/build/hierarchy/qvdr_build_simplified_clusters.js +11 -5
  202. package/engine/graphics/micron/format/VirtualGeometry.js +46 -3
  203. package/engine/graphics/micron/format/micron_build_proxy_geometry.js +4 -2
  204. package/engine/graphics/micron/prototypeVirtualGeometry.js +47 -10
  205. package/engine/graphics/micron/render/instanced/shader/shader_rewrite_standard.js +17 -17
  206. package/engine/graphics/micron/render/refinement/get_geometry_patch_cut.js +15 -3
  207. package/engine/graphics/micron/simplifyGeometry.js +1 -1
  208. package/engine/graphics/particles/particular/engine/ParticularEngine.js +5 -0
  209. package/engine/graphics/particles/particular/engine/emitter/ParticleLayer.js +17 -9
  210. package/engine/graphics/particles/particular/engine/renderers/ParticleRenderer.js +12 -10
  211. package/engine/graphics/particles/particular/engine/renderers/billboard/ParticleBillboardMaterial.js +7 -2
  212. package/engine/graphics/particles/particular/engine/renderers/billboard/SoftBillboardParticlePool.js +27 -0
  213. package/engine/graphics/particles/particular/engine/renderers/billboard/SoftBillboardParticleRenderer.js +80 -0
  214. package/engine/graphics/particles/particular/engine/shader/ShaderManager.js +16 -4
  215. package/engine/graphics/shaders/TerrainShader.js +8 -8
  216. package/engine/graphics/texture/atlas/TextureAtlasDebugger.js +2 -1
  217. package/engine/graphics/texture/sampler/Sampler2D.js +206 -201
  218. package/engine/graphics/texture/sampler/Sampler2D.spec.js +34 -35
  219. package/engine/graphics/texture/sampler/bicubic.js +59 -0
  220. package/engine/graphics/texture/sampler/downsampleSample2D.spec.js +2 -2
  221. package/engine/graphics/texture/sampler/genericResampleSampler2D.js +0 -2
  222. package/engine/graphics/texture/sampler/prototypeSamplerFiltering.js +146 -0
  223. package/engine/graphics/texture/sampler/{downsampleSampler2D.js → sampler2D_scale_down_linear.js} +8 -4
  224. package/engine/graphics/texture/sampler/sampler2_d_scale_down_lanczos.js +140 -0
  225. package/engine/graphics/texture/sampler/scaleSampler2D.js +3 -3
  226. package/engine/graphics/texture/sampler/writeSampler2DDataToDataTexture.js +1 -1
  227. package/engine/graphics/util/ScaleObject3ToBox.js +14 -1
  228. package/engine/graphics/util/makeMeshPreviewScene.js +2 -1
  229. package/engine/grid/components/GridObstacle.js +0 -44
  230. package/engine/grid/components/GridObstacleSerializationAdapter.js +46 -0
  231. package/engine/input/devices/PointerDevice.d.ts +1 -1
  232. package/engine/input/devices/PointerDevice.js +17 -2
  233. package/engine/input/ecs/util/TerrainCameraTargetSampler.js +2 -2
  234. package/engine/navigation/ecs/components/Path.d.ts +2 -0
  235. package/engine/navigation/ecs/components/Path.js +6 -1
  236. package/engine/navigation/ecs/components/computeNonuniformCatmullRomSplineSample.js +117 -0
  237. package/engine/navigation/grid/AStar.js +1 -1
  238. package/engine/navigation/grid/GridField.js +3 -2
  239. package/engine/platform/GetURLHash.js +27 -0
  240. package/engine/platform/WebEnginePlatform.js +1 -22
  241. package/engine/sound/ecs/emitter/SoundEmitter.js +10 -6
  242. package/engine/ui/DraggableAspect.js +2 -2
  243. package/generation/GridGenerator.js +7 -6
  244. package/generation/example/SampleGenerator0.js +39 -35
  245. package/generation/example/filters/SampleGroundMoistureFilter.js +58 -17
  246. package/generation/example/generators/interactive/mir_generator_place_buff_objects.js +7 -6
  247. package/generation/example/generators/mir_generator_place_bases.js +7 -3
  248. package/generation/example/generators/mir_generator_place_road_decorators.js +3 -3
  249. package/generation/example/generators/mir_generator_place_starting_point.js +3 -2
  250. package/generation/example/themes/SampleTheme0.js +11 -7
  251. package/generation/filtering/numeric/CellFilterLiteralFloat.js +5 -0
  252. package/generation/filtering/numeric/complex/CellFilterDilate.js +36 -0
  253. package/generation/filtering/numeric/complex/CellFilterGaussianBlur.js +15 -5
  254. package/generation/filtering/numeric/complex/CellFilterSimplexNoise.js +53 -1
  255. package/generation/filtering/numeric/math/CellFilterMax2.js +3 -0
  256. package/generation/filtering/numeric/math/CellFilterMembershipGeneralizedBell.js +55 -0
  257. package/generation/filtering/numeric/sampling/AbstractCellFilterSampleGridLayer.js +42 -0
  258. package/generation/filtering/numeric/sampling/CellFilterSampleLayerCubic.js +36 -0
  259. package/generation/filtering/numeric/sampling/CellFilterSampleLayerLinear.js +41 -0
  260. package/generation/grid/GridData.d.ts +5 -1
  261. package/generation/grid/GridData.js +35 -36
  262. package/generation/grid/MarkerMatchCounter.js +5 -3
  263. package/generation/grid/generation/discrete/GridTaskConnectRooms.js +1 -1
  264. package/generation/grid/generation/discrete/layer/GridTaskBuildSourceDistanceMap.js +1 -1
  265. package/generation/grid/generation/discrete/layer/GridTaskDistanceToMarkers.js +1 -1
  266. package/generation/grid/generation/road/GridTaskGenerateRoads.js +1 -1
  267. package/generation/markers/GridActionRuleSet.js +15 -32
  268. package/generation/markers/GridCellActionPlaceMarker.js +12 -8
  269. package/generation/markers/debug/visualizeMarkers.js +56 -36
  270. package/generation/markers/emitter/MarkerNodeEmitterFromAction.js +8 -8
  271. package/generation/markers/prototypeGridCellActionPlaceMarker.js +209 -0
  272. package/generation/markers/transform/MarkerNodeTransformerOffsetPosition.js +1 -5
  273. package/generation/markers/transform/MarkerNodeTransformerYRotateByFilterGradient.spec.js +2 -2
  274. package/generation/placement/GridCellPlacementRule.js +31 -25
  275. package/generation/theme/ThemeEngine.js +1 -1
  276. package/package.json +1 -1
  277. package/samples/terrain/from_image.js +7 -3
  278. package/samples/terrain/main.js +1 -1
  279. package/view/View.js +23 -1
  280. package/view/common/LabelView.js +1 -1
  281. package/view/compose3x3transform.js +32 -8
  282. package/view/controller/dat/DatGuiUtils.js +1 -1
  283. package/view/elements/DropDownSelectionView.js +11 -3
  284. package/view/elements/image/ImageView.js +3 -1
  285. package/core/model/ObservedReal.js +0 -55
  286. package/editor/ecs/component/ObjectEditor.js +0 -0
  287. package/engine/graphics/particles/particular/engine/renderers/SoftBillboardParticleRenderer.js +0 -7
  288. package/engine/sound/ecs/emitter/attenuate/attenuateSoundLinear.js +0 -11
  289. package/generation/filtering/numeric/CellFilterReadGridLayer.js +0 -73
@@ -1,10 +1,15 @@
1
1
  import { assert } from "../../core/assert.js";
2
2
  import { QuadTreeNode } from "../../core/geom/2d/quad-tree/QuadTreeNode.js";
3
3
  import { OffsetScaleTransform2D } from "../../engine/ecs/terrain/ecs/OffsetScaleTransform2D.js";
4
- import { MarkerMatchCounter } from "./MarkerMatchCounter.js";
5
4
  import { max2 } from "../../core/math/max2.js";
5
+ import { qt_collect_by_circle } from "../../core/geom/2d/quad-tree/qt_collect_by_circle.js";
6
+ import { v2_length_sqr } from "../../core/geom/Vector2.js";
6
7
 
7
- const scratch_match_counter = new MarkerMatchCounter();
8
+ /**
9
+ *
10
+ * @type {QuadTreeDatum<MarkerNode>[]}
11
+ */
12
+ const marker_collection = [];
8
13
 
9
14
  export class GridData {
10
15
  constructor() {
@@ -78,34 +83,6 @@ export class GridData {
78
83
  return undefined;
79
84
  }
80
85
 
81
- /**
82
- *
83
- * @param {MarkerNode[]} result
84
- * @param {number} x
85
- * @param {number} y
86
- * @param {number} radius
87
- * @param {MarkerNodeMatcher} matcher
88
- * @returns {number} match count
89
- */
90
- queryMarkersInCircle(result, x, y, radius, matcher) {
91
- let count = 0;
92
- this.markers.traverseCircleIntersections(x, y, this.radius, leaf => {
93
- /**
94
- *
95
- * @type {MarkerNode}
96
- */
97
- const marker = leaf.data;
98
-
99
- if (matcher.match(marker)) {
100
- result.push(marker);
101
-
102
- count++;
103
- }
104
- });
105
-
106
- return count;
107
- }
108
-
109
86
  /**
110
87
  *
111
88
  * @param {number} x
@@ -127,12 +104,34 @@ export class GridData {
127
104
  * @returns {number}
128
105
  */
129
106
  countMarkerInCircle(x, y, radius, matcher) {
130
- scratch_match_counter.matcher = matcher;
131
- scratch_match_counter.count = 0;
107
+ const match_count = qt_collect_by_circle(marker_collection, 0, this.markers, x, y, radius);
108
+
109
+ let result = 0;
110
+
111
+ for (let i = 0; i < match_count; i++) {
112
+ const marker_datum = marker_collection[i];
113
+
114
+ /**
115
+ *
116
+ * @type {MarkerNode|null}
117
+ */
118
+ const marker = marker_datum.data;
119
+
120
+ const distance_limit = radius + marker.size;
121
+
122
+ const distance_limit_sqr = distance_limit * distance_limit;
123
+
124
+ // check refined containment
125
+ if (v2_length_sqr(x - marker.position.x, y - marker.position.y) > distance_limit_sqr) {
126
+ continue;
127
+ }
132
128
 
133
- this.markers.traverseCircleIntersections(x, y, radius, scratch_match_counter.exec, scratch_match_counter);
129
+ if (matcher.match(marker)) {
130
+ result++;
131
+ }
132
+ }
134
133
 
135
- return scratch_match_counter.count;
134
+ return result;
136
135
  }
137
136
 
138
137
  /**
@@ -171,8 +170,8 @@ export class GridData {
171
170
  assert.isNumber(width, 'width');
172
171
  assert.isNumber(height, 'height');
173
172
 
174
- assert.isNonNegativeInteger(width,'width');
175
- assert.isNonNegativeInteger(height,'height');
173
+ assert.isNonNegativeInteger(width, 'width');
174
+ assert.isNonNegativeInteger(height, 'height');
176
175
 
177
176
  assert.isFiniteNumber(width, 'width');
178
177
  assert.isFiniteNumber(height, 'width');
@@ -5,7 +5,7 @@ export class MarkerMatchCounter {
5
5
  constructor() {
6
6
  /**
7
7
  * Predicate
8
- * @type {{match:function(T):boolean}|null}
8
+ * @type {MarkerNodeMatcher|null}
9
9
  */
10
10
  this.matcher = null;
11
11
  this.count = 0;
@@ -13,10 +13,12 @@ export class MarkerMatchCounter {
13
13
 
14
14
  /**
15
15
  *
16
- * @param {QuadTreeDatum<T>} node
16
+ * @param {QuadTreeDatum<MarkerNode>} node
17
17
  */
18
18
  exec(node) {
19
- if (this.matcher.match(node.data)) {
19
+ const marker = node.data;
20
+
21
+ if (this.matcher.match(marker)) {
20
22
  this.count++;
21
23
  }
22
24
  }
@@ -4,7 +4,7 @@ import { BitSet } from "../../../../core/binary/BitSet.js";
4
4
  import Task from "../../../../core/process/task/Task.js";
5
5
  import TaskSignal from "../../../../core/process/task/TaskSignal.js";
6
6
  import Vector2 from "../../../../core/geom/Vector2.js";
7
- import BinaryHeap from "../../../../engine/navigation/grid/FastBinaryHeap.js";
7
+ import BinaryHeap from "../../../../core/collection/heap/FastBinaryHeap.js";
8
8
  import { passThrough } from "../../../../core/function/Functions.js";
9
9
  import TaskGroup from "../../../../core/process/task/TaskGroup.js";
10
10
  import { Sampler2D } from "../../../../engine/graphics/texture/sampler/Sampler2D.js";
@@ -3,7 +3,7 @@ import Task from "../../../../../core/process/task/Task.js";
3
3
  import { BitSet } from "../../../../../core/binary/BitSet.js";
4
4
  import TaskGroup from "../../../../../core/process/task/TaskGroup.js";
5
5
  import TaskSignal from "../../../../../core/process/task/TaskSignal.js";
6
- import BinaryHeap from "../../../../../engine/navigation/grid/FastBinaryHeap.js";
6
+ import BinaryHeap from "../../../../../core/collection/heap/FastBinaryHeap.js";
7
7
  import { GridTaskGenerator } from "../../../GridTaskGenerator.js";
8
8
  import { assert } from "../../../../../core/assert.js";
9
9
 
@@ -1,6 +1,6 @@
1
1
  import { GridTaskGenerator } from "../../../GridTaskGenerator.js";
2
2
  import { actionTask } from "../../../../../core/process/task/TaskUtils.js";
3
- import BinaryHeap from "../../../../../engine/navigation/grid/FastBinaryHeap.js";
3
+ import BinaryHeap from "../../../../../core/collection/heap/FastBinaryHeap.js";
4
4
 
5
5
  export class GridTaskDistanceToMarkers extends GridTaskGenerator {
6
6
  constructor() {
@@ -5,7 +5,7 @@ import { GridTaskGenerator } from "../../GridTaskGenerator.js";
5
5
  import { actionTask, countTask } from "../../../../core/process/task/TaskUtils.js";
6
6
  import TaskGroup from "../../../../core/process/task/TaskGroup.js";
7
7
  import Graph from "../../../../core/graph/Graph.js";
8
- import BinaryHeap from "../../../../engine/navigation/grid/FastBinaryHeap.js";
8
+ import BinaryHeap from "../../../../core/collection/heap/FastBinaryHeap.js";
9
9
  import { BitSet } from "../../../../core/binary/BitSet.js";
10
10
  import { matcher_tag_traversable } from "../../../example/rules/matcher_tag_traversable.js";
11
11
  import { buildPathFromDistanceMap } from "../util/buildPathFromDistanceMap.js";
@@ -43,11 +43,6 @@ export class GridActionRuleSet {
43
43
  */
44
44
  this.matchOrigin = true;
45
45
 
46
- /**
47
- *
48
- * @type {boolean}
49
- */
50
- this.allowEveryRotation = false;
51
46
  }
52
47
 
53
48
  /**
@@ -58,16 +53,20 @@ export class GridActionRuleSet {
58
53
  * @param {boolean} [allowEveryRotation]
59
54
  * @returns {GridActionRuleSet}
60
55
  */
61
- static from({ rules, policy = RuleSelectionPolicyType.Sequential, pattern = [0, 0], allowEveryRotation = false }) {
56
+ static from({ rules, policy = RuleSelectionPolicyType.Sequential, pattern = [0, 0], allowEveryRotation }) {
62
57
  assert.enum(policy, RuleSelectionPolicyType, 'policy');
63
- assert.typeOf(allowEveryRotation, 'boolean', 'allowEveryRotation');
58
+ assert.isArray(rules, 'rules');
59
+ assert.isArray(pattern, 'pattern');
64
60
 
65
61
  const r = new GridActionRuleSet();
66
62
 
67
63
  rules.forEach(r.add, r);
68
64
  r.policy = policy;
69
65
  r.pattern = pattern;
70
- r.allowEveryRotation = allowEveryRotation;
66
+
67
+ if (allowEveryRotation !== undefined) {
68
+ console.warn('.allowEveryRotation is deprecated');
69
+ }
71
70
 
72
71
  return r;
73
72
  }
@@ -122,7 +121,6 @@ export class GridActionRuleSet {
122
121
  const patternSize = pattern.length;
123
122
 
124
123
  const matchOrigin = this.matchOrigin;
125
- const allowEveryRotation = this.allowEveryRotation;
126
124
 
127
125
  const sampleCountX = width * resolution;
128
126
  const sampleCountY = height * resolution;
@@ -160,30 +158,17 @@ export class GridActionRuleSet {
160
158
  const sampleOffsetX = pattern[sampleIndex++];
161
159
  const sampleOffsetY = pattern[sampleIndex++];
162
160
 
161
+ const ROTATION_COUNT = element.allowRotation ? 4 : 1;
163
162
 
164
- let final_sample_offset_x = sampleOffsetX;
165
- let final_sample_offset_y = sampleOffsetY;
166
-
167
- rotation_loop: for (let j = 0; j < 4; j++) {
168
-
163
+ for (let j = 0; j < ROTATION_COUNT; j++) {
169
164
 
170
165
  const rotation = j * PI_HALF;
171
166
 
172
- if (j > 0) {
173
- if (!element.allowRotation) {
174
- break rotation_loop;
175
- } else {
176
-
177
-
178
- const sin = Math.sin(rotation);
179
- const cos = Math.cos(rotation);
167
+ const sin = Math.sin(rotation);
168
+ const cos = Math.cos(rotation);
180
169
 
181
- final_sample_offset_x = sampleOffsetX * cos - sampleOffsetY * sin;
182
- final_sample_offset_y = sampleOffsetX * sin + sampleOffsetY * cos;
183
-
184
- }
185
-
186
- }
170
+ const final_sample_offset_x = sampleOffsetX * cos - sampleOffsetY * sin;
171
+ const final_sample_offset_y = sampleOffsetX * sin + sampleOffsetY * cos;
187
172
 
188
173
  const p_x = final_sample_offset_x + x;
189
174
  const p_y = final_sample_offset_y + y;
@@ -198,7 +183,7 @@ export class GridActionRuleSet {
198
183
  }
199
184
 
200
185
  if (!match) {
201
- continue rotation_loop;
186
+ continue;
202
187
  }
203
188
 
204
189
  const roll = random();
@@ -209,9 +194,7 @@ export class GridActionRuleSet {
209
194
 
210
195
  element.execute(grid, p_x, p_y, rotation);
211
196
 
212
- if (!allowEveryRotation) {
213
- break sampling_loop;
214
- }
197
+ break sampling_loop;
215
198
  }
216
199
 
217
200
  }
@@ -3,6 +3,7 @@ import { MarkerNode } from "./MarkerNode.js";
3
3
  import { Transform } from "../../engine/ecs/transform/Transform.js";
4
4
  import Vector2 from "../../core/geom/Vector2.js";
5
5
  import { assert } from "../../core/assert.js";
6
+ import Vector3 from "../../core/geom/Vector3.js";
6
7
 
7
8
  export class GridCellActionPlaceMarker extends GridCellAction {
8
9
  constructor() {
@@ -172,22 +173,25 @@ export class GridCellActionPlaceMarker extends GridCellAction {
172
173
 
173
174
  node.size = this.size;
174
175
 
176
+ const transform = data.transform;
177
+
175
178
  node.transform.position.set(
176
- target_x * data.transform.scale_x + data.transform.offset_x,
179
+ target_x * transform.scale_x + transform.offset_x,
177
180
  0,
178
- target_y * data.transform.scale_y + data.transform.offset_y
181
+ target_y * transform.scale_y + transform.offset_y
179
182
  );
180
183
 
181
- node.transform.rotation.__setFromEuler(0, -rotation, 0);
184
+ node.transform.rotation.fromAxisAngle(Vector3.down, rotation);
182
185
 
183
186
  node.transform.multiplyTransforms(node.transform, this.transform);
184
187
 
185
188
  //add tags
186
189
  const tags = this.tags;
187
- const tagCount = tags.length;
188
- for (let i = 0; i < tagCount; i++) {
190
+ const tag_count = tags.length;
191
+ const node_tags = node.tags;
192
+ for (let i = 0; i < tag_count; i++) {
189
193
  const tag = tags[i];
190
- node.tags.push(tag);
194
+ node_tags.push(tag);
191
195
  }
192
196
 
193
197
  //write properties
@@ -197,9 +201,9 @@ export class GridCellActionPlaceMarker extends GridCellAction {
197
201
 
198
202
  //apply transformations
199
203
  const transformers = this.transformers;
200
- const transformerCount = transformers.length;
204
+ const transformer_count = transformers.length;
201
205
 
202
- for (let i = 0; i < transformerCount; i++) {
206
+ for (let i = 0; i < transformer_count; i++) {
203
207
  const transformer = transformers[i];
204
208
  node = transformer.transform(node, data);
205
209
  }
@@ -51,8 +51,14 @@ function CircleGeometry(radius, arc) {
51
51
  * @param {GridData} grid
52
52
  * @param {EntityComponentDataset} ecd
53
53
  * @param {MarkerNodeMatcher} marker_filter
54
+ * @param {boolean} [display_data]
54
55
  */
55
- export function visualizeMarkers({ grid, ecd, marker_filter = MarkerNodeMatcherAny.INSTANCE }) {
56
+ export function visualizeMarkers({
57
+ grid,
58
+ ecd,
59
+ marker_filter = MarkerNodeMatcherAny.INSTANCE,
60
+ display_data = true
61
+ }) {
56
62
 
57
63
  /**
58
64
  *
@@ -85,7 +91,8 @@ export function visualizeMarkers({ grid, ecd, marker_filter = MarkerNodeMatcherA
85
91
  */
86
92
  const terrain = obtainTerrain(ecd);
87
93
 
88
- const geometry_0 = new TetrahedronBufferGeometry(0.05, 2);
94
+ const marker_radius = 0.05;
95
+ const geometry_0 = new TetrahedronBufferGeometry(marker_radius, 2);
89
96
 
90
97
  const geometry_cylinder = CircleGeometry(1, 1);
91
98
 
@@ -110,63 +117,76 @@ export function visualizeMarkers({ grid, ecd, marker_filter = MarkerNodeMatcherA
110
117
  mark_1.position.copy(markerNode.transform.position);
111
118
  mark_1.position.sub(v3);
112
119
 
113
- const line_geometry = new BufferGeometry();
114
- line_geometry.setFromPoints([
115
- mark_0.position,
116
- mark_1.position
117
- ]);
118
-
119
- const mark_line = new Line(line_geometry, m_line);
120
-
121
-
122
120
  const mark_size = new Line(geometry_cylinder, m3);
123
121
  mark_size.scale.set(markerNode.size, markerNode.size, markerNode.size);
124
122
 
125
123
 
126
124
  g.add(mark_0);
127
- g.add(mark_1);
125
+
126
+ if (mark_1.position.distanceToSquared(mark_0.position) > marker_radius * marker_radius * 0.2) {
127
+ // only draw second marker if they are sufficiently far apart
128
+
129
+ const line_geometry = new BufferGeometry();
130
+ line_geometry.setFromPoints([
131
+ mark_0.position,
132
+ mark_1.position
133
+ ]);
134
+
135
+ const mark_line = new Line(line_geometry, m_line);
136
+
137
+ g.add(mark_1);
138
+ g.add(mark_line);
139
+ }
140
+
128
141
  g.add(mark_size);
129
- g.add(mark_line);
142
+
143
+ const entityBuilder = new EntityBuilder();
130
144
 
131
145
  const renderable = new Renderable(g);
132
146
  renderable.computeBoundsFromObject();
133
147
 
134
- const props = [];
148
+ if (display_data) {
149
+ const props = [];
135
150
 
136
- props.push(`TYPE: ${markerNode.type}`);
151
+ props.push(`TYPE: ${markerNode.type}`);
137
152
 
138
- for (const propertyKey in markerNode.properties) {
139
- let propValue = formatValue(markerNode.properties[propertyKey]);
153
+ for (const propertyKey in markerNode.properties) {
154
+ let propValue = formatValue(markerNode.properties[propertyKey]);
140
155
 
141
- props.push(`${propertyKey}:${propValue}`);
142
- }
156
+ props.push(`${propertyKey}:${propValue}`);
157
+ }
143
158
 
144
- props.push(`# [x: ${formatValue(markerNode.position.x)}, y: ${formatValue(markerNode.position.y)}]`);
145
- props.push(`# [size: ${formatValue(markerNode.size)}]`);
159
+ props.push(`# [x: ${formatValue(markerNode.position.x)}, y: ${formatValue(markerNode.position.y)}]`);
160
+ props.push(`# [size: ${formatValue(markerNode.size)}]`);
146
161
 
147
- for (let j = 0; j < markerNode.tags.length; j++) {
148
- const tag = markerNode.tags[j];
162
+ for (let j = 0; j < markerNode.tags.length; j++) {
163
+ const tag = markerNode.tags[j];
149
164
 
150
- props.push(`# T: ${tag}`);
151
- }
165
+ props.push(`# T: ${tag}`);
166
+ }
152
167
 
153
168
 
154
- const v = new LabelView(props.join('\n'), { classList: ['__debug-plaque'] });
155
- v.css({
156
- position: 'absolute',
157
- whiteSpace: 'pre',
158
- left: 0,
159
- top: 0
160
- })
169
+ const v = new LabelView(props.join('\n'), { classList: ['__debug-plaque'] });
170
+ v.css({
171
+ position: 'absolute',
172
+ whiteSpace: 'pre',
173
+ left: 0,
174
+ top: 0
175
+ })
176
+
177
+ entityBuilder
178
+ .add(new HeadsUpDisplay())
179
+ .add(new ViewportPosition())
180
+ .add(GUIElement.fromView(v))
181
+ ;
182
+ }
161
183
 
162
184
  const t = new Transform();
163
185
 
164
186
  t.position.copy(v3);
165
187
 
166
- new EntityBuilder()
167
- .add(new HeadsUpDisplay())
168
- .add(new ViewportPosition())
169
- .add(GUIElement.fromView(v))
188
+
189
+ entityBuilder
170
190
  .add(renderable)
171
191
  .add(t)
172
192
  .build(ecd);
@@ -1,7 +1,7 @@
1
1
  import { MarkerNodeEmitter } from "./MarkerNodeEmitter.js";
2
2
  import { assert } from "../../../core/assert.js";
3
3
 
4
- export class MarkerNodeEmitterFromAction extends MarkerNodeEmitter{
4
+ export class MarkerNodeEmitterFromAction extends MarkerNodeEmitter {
5
5
  constructor() {
6
6
  super();
7
7
 
@@ -18,8 +18,8 @@ export class MarkerNodeEmitterFromAction extends MarkerNodeEmitter{
18
18
  * @param {GridCellActionPlaceMarker[]} actions
19
19
  * @return {MarkerNodeEmitterFromAction}
20
20
  */
21
- static from(actions){
22
- assert.isArray(actions,'actions');
21
+ static from(actions) {
22
+ assert.isArray(actions, 'actions');
23
23
 
24
24
  for (let i = 0; i < actions.length; i++) {
25
25
 
@@ -27,11 +27,11 @@ assert.isArray(actions,'actions');
27
27
  assert.equal(action.isGridCellActionPlaceMarker, true, 'action.isGridCellActionPlaceMarker !== true');
28
28
  }
29
29
 
30
- const r = new MarkerNodeEmitterFromAction();
30
+ const r = new MarkerNodeEmitterFromAction();
31
31
 
32
- r.actions = actions;
32
+ r.actions = actions;
33
33
 
34
- return r;
34
+ return r;
35
35
  }
36
36
 
37
37
  initialize(data, seed) {
@@ -41,7 +41,7 @@ assert.isArray(actions,'actions');
41
41
  for (let i = 0; i < n; i++) {
42
42
  const action = actions[i];
43
43
 
44
- action.initialize(data,seed);
44
+ action.initialize(data, seed);
45
45
  }
46
46
  }
47
47
 
@@ -54,7 +54,7 @@ assert.isArray(actions,'actions');
54
54
 
55
55
  const action = actions[i];
56
56
 
57
- const node = action.buildNode(data,x,y,rotation);
57
+ const node = action.buildNode(data, x, y, rotation);
58
58
 
59
59
  consumer.consume(node);
60
60