@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
@@ -5,12 +5,17 @@
5
5
 
6
6
  import Vector4 from '../../../../core/geom/Vector4.js';
7
7
  import canvas2Sampler2D from "../../../graphics/texture/Canvas2Sampler2D.js";
8
- import convertSampler2D2Canvas from "../../../graphics/texture/sampler/Sampler2D2Canvas.js";
9
8
  import Vector2 from "../../../../core/geom/Vector2.js";
10
9
  import Vector1 from "../../../../core/geom/Vector1.js";
11
10
  import { assert } from "../../../../core/assert.js";
12
11
  import ObservedString from "../../../../core/model/ObservedString.js";
13
- import { ClampToEdgeWrapping, NearestFilter, Texture } from "three";
12
+ import { ClampToEdgeWrapping, DataTexture, NearestFilter } from "three";
13
+ import { Sampler2D } from "../../../graphics/texture/sampler/Sampler2D.js";
14
+ import { scaleSampler2D } from "../../../graphics/texture/sampler/scaleSampler2D.js";
15
+ import { uint82float } from "../../../../core/binary/uint82float.js";
16
+ import { float2uint8 } from "../../../../core/binary/float2uint8.js";
17
+ import { isTypedArray } from "../../../../core/collection/array/typed/isTypedArray.js";
18
+ import { array_copy } from "../../../../core/collection/array/copyArray.js";
14
19
 
15
20
  class Context {
16
21
  /**
@@ -41,6 +46,8 @@ class Context {
41
46
  }
42
47
  }
43
48
 
49
+ const COLOR_UINT_8_TRANSPARENT = [0, 0, 0, 0];
50
+
44
51
 
45
52
  export class TerrainOverlay {
46
53
  /**
@@ -68,14 +75,13 @@ export class TerrainOverlay {
68
75
  */
69
76
  this.tileImage = new ObservedString("");
70
77
 
71
- const canvas = this.canvas = document.createElement("canvas");
72
-
73
- canvas.width = size.x;
74
- canvas.height = size.y;
78
+ /**
79
+ *
80
+ * @type {Sampler2D}
81
+ */
82
+ this.sampler = Sampler2D.uint8(4, size.x, size.y);
75
83
 
76
- this.fillColor = new Vector4();
77
- this.context2d = canvas.getContext('2d');
78
- const texture = this.texture = new Texture(canvas);
84
+ const texture = this.texture = new DataTexture(this.sampler.data);
79
85
 
80
86
  texture.wrapS = ClampToEdgeWrapping;
81
87
  texture.wrapT = ClampToEdgeWrapping;
@@ -83,6 +89,8 @@ export class TerrainOverlay {
83
89
  texture.magFilter = NearestFilter;
84
90
  texture.minFilter = NearestFilter;
85
91
 
92
+ texture.anisotropy = 0;
93
+
86
94
  texture.flipY = false;
87
95
 
88
96
  texture.repeat.set(1, 1);
@@ -96,17 +104,30 @@ export class TerrainOverlay {
96
104
  */
97
105
  this.stack = [];
98
106
 
99
- this.size.onChanged.add(function (x, y) {
100
- canvas.width = x;
101
- canvas.height = y;
107
+ this.size.onChanged.add((x, y) => {
108
+ this.sampler.resize(x, y);
109
+
110
+ this.texture.dispose();
111
+
112
+ this.texture.image.data = this.sampler.data;
113
+
114
+ this.texture.image.width = x;
115
+ this.texture.image.height = y;
102
116
  });
103
117
  }
104
118
 
119
+ /**
120
+ * @returns {HTMLCanvasElement}
121
+ */
122
+ get canvas() {
123
+ throw new Error('Deprecated, used .sampler instead');
124
+ }
125
+
105
126
  /**
106
127
  * Pushes new context onto the stack, allowing you to preserve current state for later
107
128
  */
108
129
  push() {
109
- const sampler = canvas2Sampler2D(this.canvas);
130
+ const sampler = this.sampler.clone();
110
131
 
111
132
  const context = new Context(sampler, this.borderWidth.getValue(), this.tileImage.getValue());
112
133
 
@@ -135,7 +156,7 @@ export class TerrainOverlay {
135
156
  this.size.set(sampler.width, sampler.height);
136
157
 
137
158
  // write context onto canvas
138
- convertSampler2D2Canvas(sampler, 1, 0, this.canvas);
159
+ this.sampler.copy(sampler, 0, 0, 0, 0, sampler.width, sampler.height);
139
160
 
140
161
  this.borderWidth.set(context.borderWidth);
141
162
 
@@ -146,7 +167,8 @@ export class TerrainOverlay {
146
167
 
147
168
  clear() {
148
169
  const size = this.size;
149
- this.context2d.clearRect(0, 0, size.x, size.y);
170
+
171
+ this.sampler.zeroFill(0, 0, size.x, size.y);
150
172
 
151
173
  this.update();
152
174
  }
@@ -162,15 +184,11 @@ export class TerrainOverlay {
162
184
  * @param {Vector4} result
163
185
  */
164
186
  readPoint(x, y, result) {
165
- const imageData = this.context2d.getImageData(x, y, 1, 1);
166
- const data = imageData.data;
167
-
168
- const r = uint82float(data[0]);
169
- const g = uint82float(data[1]);
170
- const b = uint82float(data[2]);
171
- const a = uint82float(data[3]);
187
+ for (let i = 0; i < 4; i++) {
188
+ const v = this.sampler.readChannel(x, y, i);
172
189
 
173
- result.set(r, g, b, a);
190
+ result[i] = uint82float(v);
191
+ }
174
192
  }
175
193
 
176
194
  /**
@@ -204,7 +222,7 @@ export class TerrainOverlay {
204
222
  * @param {number} y
205
223
  */
206
224
  clearPoint(x, y) {
207
- this.context2d.clearRect(x, y, 1, 1);
225
+ this.sampler.set(x, y, COLOR_UINT_8_TRANSPARENT);
208
226
  }
209
227
 
210
228
  /**
@@ -214,25 +232,12 @@ export class TerrainOverlay {
214
232
  * @param {Vector4} vec4
215
233
  */
216
234
  paintPoint(x, y, vec4) {
217
- const ctx = this.context2d;
218
-
219
- const fill_color = this.fillColor;
220
-
221
- if (!fill_color.equals(vec4)) {
222
- // change style
223
- fill_color.copy(vec4);
235
+ for (let i = 0; i < 4; i++) {
224
236
 
225
- const r = float2uint8(vec4.x);
226
- const g = float2uint8(vec4.y);
227
- const b = float2uint8(vec4.z);
237
+ this.sampler.writeChannel(x, y, i, float2uint8(vec4[i]));
228
238
 
229
- const a = vec4.w;
230
-
231
- ctx.fillStyle = "rgba(" + r + "," + g + "," + b + "," + a + ")";
232
239
  }
233
240
 
234
- ctx.fillRect(x, y, 1, 1);
235
-
236
241
  this.texture.needsUpdate = true;
237
242
  }
238
243
 
@@ -241,10 +246,7 @@ export class TerrainOverlay {
241
246
  * @param {Uint8Array|number[]} data
242
247
  */
243
248
  writeData(data) {
244
-
245
- assert.ok(Array.isArray(data) || data instanceof Uint8Array || data instanceof Uint8ClampedArray, `expected data to be Array,Uint8Array or ClampedUint8Array, got something else instead`);
246
-
247
- const ctx = this.context2d;
249
+ assert.isArrayLike(data, 'data');
248
250
 
249
251
  const size = this.size;
250
252
 
@@ -253,13 +255,15 @@ export class TerrainOverlay {
253
255
  return;
254
256
  }
255
257
 
256
- const imageData = ctx.createImageData(size.x, size.y);
257
-
258
- const array = imageData.data;
258
+ assert.equal(data.length, this.sampler.data.length);
259
259
 
260
- array.set(data);
260
+ if (isTypedArray(this.sampler.data)) {
261
+ this.sampler.data.set(data);
262
+ } else {
263
+ array_copy(data, 0, this.sampler.data, 0, data.length);
264
+ }
261
265
 
262
- ctx.putImageData(imageData, 0, 0);
266
+ this.sampler.version++;
263
267
 
264
268
  this.texture.needsUpdate = true;
265
269
  }
@@ -273,27 +277,28 @@ export class TerrainOverlay {
273
277
  * @param {number} [dHeight]
274
278
  */
275
279
  paintImage(image, dx, dy, dWidth, dHeight) {
280
+ const source = canvas2Sampler2D(image);
281
+
282
+ this.paintSampler(source, dx, dy, dWidth, dHeight);
283
+ }
284
+
285
+ /**
286
+ *
287
+ * @param {Sampler2D} source
288
+ * @param {number} dx
289
+ * @param {number} dy
290
+ * @param {number} dWidth
291
+ * @param {number} dHeight
292
+ */
293
+ paintSampler(source, dx, dy, dWidth, dHeight) {
294
+
295
+ // rescale source if needed
296
+ const scaled_source = Sampler2D.uint8(4, dWidth, dHeight);
297
+ scaleSampler2D(source, scaled_source);
276
298
 
277
- this.context2d.drawImage(image, dx, dy, dWidth, dHeight);
299
+ this.sampler.paint(scaled_source, 0, 0, dx, dy, dWidth, dHeight);
278
300
 
279
301
  this.texture.needsUpdate = true;
280
302
  }
281
303
  }
282
304
 
283
- /**
284
- *
285
- * @param {number} v
286
- * @returns {number}
287
- */
288
- function float2uint8(v) {
289
- return Math.round(v * 255);
290
- }
291
-
292
- /**
293
- *
294
- * @param {number} v
295
- * @returns {number}
296
- */
297
- function uint82float(v) {
298
- return v / 255;
299
- }
@@ -281,6 +281,29 @@ class TerrainTileManager {
281
281
  this.initializeTiles();
282
282
  }
283
283
 
284
+ /**
285
+ * Rebuild tiles that overlap rectangular region of the overall terrain defined by normalized coordinates (UV space)
286
+ * @param {number} u0
287
+ * @param {number} v0
288
+ * @param {number} u1
289
+ * @param {number} v1
290
+ */
291
+ rebuildTilesByUV(u0, v0, u1, v1) {
292
+
293
+ const tx0 = u0 * this.totalSize.x;
294
+ const tx1 = u1 * this.totalSize.x;
295
+
296
+ const ty0 = v0 * this.totalSize.y;
297
+ const ty1 = v1 * this.totalSize.y;
298
+
299
+ const dirtyTiles = this.getRawTilesOverlappingRectangle(tx0 - 1, ty0 - 1, tx1 + 1, ty1 + 1);
300
+
301
+ dirtyTiles.forEach(tile => {
302
+ tile.isBuilt = false;
303
+ });
304
+ }
305
+
306
+
284
307
  /**
285
308
  *
286
309
  * @param {number} x0
@@ -43,7 +43,7 @@ export function loadVisibleTerrainTiles(em, ecd) {
43
43
  });
44
44
 
45
45
  totalTiles = tiles.length;
46
- const tileManager = terrain.tiles;
46
+ const tileManager = terrain.__tiles;
47
47
 
48
48
  function handleObtainedTile(t) {
49
49
  if (attemptId !== attempt) {
@@ -2,6 +2,7 @@ import { Sampler2D } from "../../../graphics/texture/sampler/Sampler2D.js";
2
2
  import { ParameterLookupTable } from "../../../graphics/particles/particular/engine/parameter/ParameterLookupTable.js";
3
3
  import { passThrough } from "../../../../core/function/Functions.js";
4
4
  import { clamp01 } from "../../../../core/math/clamp01.js";
5
+ import { scaleSampler2D } from "../../../graphics/texture/sampler/scaleSampler2D.js";
5
6
 
6
7
 
7
8
  const heatmap_lut = new ParameterLookupTable(4);
@@ -23,7 +24,13 @@ heatmap_lut.computeUniformPositions();
23
24
  * @param {NumericInterval} range Range of values of interest within the sampler that are to be mapped onto LUT
24
25
  * @param {function(number):number} [lookupScaleFunction]
25
26
  */
26
- export function paintTerrainOverlayViaLookupTable({ overlay, sampler, lut = heatmap_lut, range, lookupScaleFunction = passThrough }) {
27
+ export function paintTerrainOverlayViaLookupTable({
28
+ overlay,
29
+ sampler,
30
+ lut = heatmap_lut,
31
+ range,
32
+ lookupScaleFunction = passThrough
33
+ }) {
27
34
  let i, j;
28
35
 
29
36
  const colorSample = [];
@@ -33,18 +40,17 @@ export function paintTerrainOverlayViaLookupTable({ overlay, sampler, lut = heat
33
40
 
34
41
  const buffer = Sampler2D.uint8(4, w, h);
35
42
 
36
- const j_max = h - 1;
37
-
38
- const i_max = w - 1;
43
+ // rescale source
44
+ const scaled_sampler = sampler.clone();
45
+ scaled_sampler.resize(w, h);
46
+ scaleSampler2D(sampler, scaled_sampler);
39
47
 
40
48
  for (j = 0; j < h; j++) {
41
49
 
42
- const v = j / j_max;
43
50
 
44
51
  for (i = 0; i < w; i++) {
45
- const u = i / i_max;
46
52
 
47
- const p = sampler.sampleChannelBilinearUV(u, v, 0);
53
+ const p = scaled_sampler.readChannel(i, j, 0);
48
54
 
49
55
  const scaledPosition = lookupScaleFunction(p);
50
56
 
@@ -1,4 +1,4 @@
1
- import { TopoMesh } from "../../../../core/geom/3d/topology/TopoMesh.js";
1
+ import { TopoMesh } from "../../../../core/geom/3d/topology/struct/TopoMesh.js";
2
2
 
3
3
  /**
4
4
  * Move UVs to reduce stretching
@@ -29,4 +29,6 @@ export class Transform {
29
29
  toMatrix4(result: ArrayLike<number>): void
30
30
 
31
31
  fromMatrix4(matrix: ArrayLike<number>): void
32
+
33
+ multiplyTransforms(a: Transform, b: Transform): void
32
34
  }
@@ -0,0 +1,16 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-04/schema",
3
+ "title": "Transform",
4
+ "type": "object",
5
+ "properties": {
6
+ "position": {
7
+ "allOf": [{"$ref": "Vector3"}]
8
+ },
9
+ "rotation": {
10
+ "allOf": [{"$ref": "Quaterion"}]
11
+ },
12
+ "scale": {
13
+ "allOf": [{"$ref": "Vector3"}]
14
+ }
15
+ }
16
+ }
@@ -19,6 +19,9 @@ const m4_0 = new Float32Array(scratch_buffer, 0, 16);
19
19
 
20
20
  const FLAGS_DEFAULT = TransformFlags.AutomaticChangeDetection;
21
21
 
22
+ /**
23
+ * @class
24
+ */
22
25
  export class Transform {
23
26
  /**
24
27
  *
@@ -0,0 +1,17 @@
1
+ import { ObjectEditor } from "../../../../editor/ecs/component/editors/primitive/ObjectEditor.js";
2
+ import List from "../../../../core/collection/list/List.js";
3
+ import { HighlightDefinition } from "./HighlightDefinition.js";
4
+
5
+ export class HighlightEditor extends ObjectEditor {
6
+ get schema() {
7
+ return {
8
+ additionalProperties: false,
9
+ properties: {
10
+ elements: {
11
+ type: List,
12
+ type_parameters: [HighlightDefinition]
13
+ }
14
+ }
15
+ };
16
+ }
17
+ }
@@ -6,7 +6,6 @@ import ObservedEnum from "../../../../core/model/ObservedEnum.js";
6
6
  import Vector1 from "../../../../core/geom/Vector1.js";
7
7
  import { Color } from "../../../../core/color/Color.js";
8
8
  import ObservedBoolean from "../../../../core/model/ObservedBoolean.js";
9
- import { BinaryClassSerializationAdapter } from "../../../ecs/storage/binary/BinaryClassSerializationAdapter.js";
10
9
  import { LightType } from "./LightType.js";
11
10
 
12
11
  export class Light {
@@ -161,49 +160,3 @@ Light.typeName = "Light";
161
160
 
162
161
  Light.Type = LightType;
163
162
 
164
- export class LightSerializationAdapter extends BinaryClassSerializationAdapter {
165
- constructor() {
166
- super();
167
-
168
- this.klass = Light;
169
- this.version = 0;
170
- }
171
-
172
- /**
173
- *
174
- * @param {BinaryBuffer} buffer
175
- * @param {Light} value
176
- */
177
- serialize(buffer, value) {
178
-
179
- buffer.writeUint8(value.type.getValue());
180
- buffer.writeUint32(value.color.toUint());
181
- value.intensity.toBinaryBuffer(buffer);
182
- value.castShadow.toBinaryBuffer(buffer);
183
-
184
- if (value.type.getValue() === LightType.SPOT) {
185
- value.angle.toBinaryBuffer(buffer);
186
- value.penumbra.toBinaryBuffer(buffer);
187
- value.distance.toBinaryBuffer(buffer);
188
- }
189
- }
190
-
191
- /**
192
- *
193
- * @param {BinaryBuffer} buffer
194
- * @param {Light} value
195
- */
196
- deserialize(buffer, value) {
197
-
198
- value.type.set(buffer.readUint8());
199
- value.color.fromUint(buffer.readUint32());
200
- value.intensity.fromBinaryBuffer(buffer);
201
- value.castShadow.fromBinaryBuffer(buffer);
202
-
203
- if (value.type.getValue() === LightType.SPOT) {
204
- value.angle.fromBinaryBuffer(buffer);
205
- value.penumbra.fromBinaryBuffer(buffer);
206
- value.distance.fromBinaryBuffer(buffer);
207
- }
208
- }
209
- }
@@ -0,0 +1,50 @@
1
+ import { BinaryClassSerializationAdapter } from "../../../ecs/storage/binary/BinaryClassSerializationAdapter.js";
2
+ import { LightType } from "./LightType.js";
3
+ import { Light } from "./Light.js";
4
+
5
+ export class LightSerializationAdapter extends BinaryClassSerializationAdapter {
6
+ constructor() {
7
+ super();
8
+
9
+ this.klass = Light;
10
+ this.version = 0;
11
+ }
12
+
13
+ /**
14
+ *
15
+ * @param buffer
16
+ * @param {Light} value
17
+ */
18
+ serialize(buffer, value) {
19
+
20
+ buffer.writeUint8(value.type.getValue());
21
+ buffer.writeUint32(value.color.toUint());
22
+ value.intensity.toBinaryBuffer(buffer);
23
+ value.castShadow.toBinaryBuffer(buffer);
24
+
25
+ if (value.type.getValue() === LightType.SPOT) {
26
+ value.angle.toBinaryBuffer(buffer);
27
+ value.penumbra.toBinaryBuffer(buffer);
28
+ value.distance.toBinaryBuffer(buffer);
29
+ }
30
+ }
31
+
32
+ /**
33
+ *
34
+ * @param buffer
35
+ * @param {Light} value
36
+ */
37
+ deserialize(buffer, value) {
38
+
39
+ value.type.set(buffer.readUint8());
40
+ value.color.fromUint(buffer.readUint32());
41
+ value.intensity.fromBinaryBuffer(buffer);
42
+ value.castShadow.fromBinaryBuffer(buffer);
43
+
44
+ if (value.type.getValue() === LightType.SPOT) {
45
+ value.angle.fromBinaryBuffer(buffer);
46
+ value.penumbra.fromBinaryBuffer(buffer);
47
+ value.distance.fromBinaryBuffer(buffer);
48
+ }
49
+ }
50
+ }
@@ -0,0 +1,28 @@
1
+ import { ObjectEditor } from "../../../../editor/ecs/component/editors/primitive/ObjectEditor.js";
2
+ import { BitFlagsEditor } from "../../../../editor/ecs/component/editors/common/BitFlagsEditor.js";
3
+ import { MeshFlags } from "./Mesh.js";
4
+
5
+ export class MeshEditor extends ObjectEditor {
6
+ get schema() {
7
+ return {
8
+ properties: {
9
+ bvh: {
10
+ transient: true
11
+ },
12
+ asset: {
13
+ transient: true
14
+ },
15
+ boundingBox: {
16
+ transient: true
17
+ },
18
+ flags: {
19
+ editor: new BitFlagsEditor(MeshFlags),
20
+ transient: true
21
+ },
22
+ center: {
23
+ deprecated: true
24
+ }
25
+ }
26
+ };
27
+ }
28
+ }
@@ -1,5 +1,6 @@
1
1
  export const DrawMode = {
2
2
  Triangles: 0,
3
3
  Lines: 2,
4
- LineSegments: 3
4
+ LineSegments: 3,
5
+ Points: 4
5
6
  };
@@ -56,7 +56,7 @@ new EngineHarness().initialize({
56
56
  function make_grid(ecd, engine) {
57
57
  const random = seededRandom(1);
58
58
 
59
- const GRID_SIZE = 20;
59
+ const GRID_SIZE = 40;
60
60
  const GRID_FREQUENCY_SIZE = 7;
61
61
 
62
62
  for (let i = 0; i < GRID_SIZE; i++) {
@@ -106,8 +106,8 @@ function make_grid(ecd, engine) {
106
106
  });
107
107
 
108
108
 
109
- // const mesh = SGMesh.fromURL("data/models/RTS_Buildings_Humans/18/Building_R_18_out/Building_R_18.gltf");
110
- const mesh = SGMesh.fromURL("data/models/samples/transform-hierarchy.glb");
109
+ const mesh = SGMesh.fromURL("data/models/RTS_Buildings_Humans/18/Building_R_18_out/Building_R_18.gltf");
110
+ // const mesh = SGMesh.fromURL("data/models/samples/transform-hierarchy.glb");
111
111
  new EntityBuilder()
112
112
  .add(mesh)
113
113
  .add(transform)
@@ -1,5 +1,5 @@
1
1
  import { DrawMode } from "./DrawMode.js";
2
- import { Line, LineSegments, Mesh } from "three";
2
+ import { Line, LineSegments, Mesh, Points } from "three";
3
3
  import { ShadedGeometryFlags } from "./ShadedGeometryFlags.js";
4
4
 
5
5
  /**
@@ -24,6 +24,8 @@ export function build_three_object(sg) {
24
24
  object = new Line(geo, shader);
25
25
  } else if (mode === DrawMode.LineSegments) {
26
26
  object = new LineSegments(geo, shader);
27
+ } else if (mode === DrawMode.Points) {
28
+ object = new Points(geo, shader);
27
29
  } else {
28
30
  throw new Error(`Unsupported draw mode '${mode}'`);
29
31
  }
@@ -0,0 +1,31 @@
1
+ import { ShadedGeometry } from "./ShadedGeometry.js";
2
+ import { AABB3 } from "../../../../core/bvh2/aabb3/AABB3.js";
3
+ import { ParentEntitySystem } from "../../../ecs/parent/ParentEntitySystem.js";
4
+
5
+ const scratch_aabb3 = new AABB3();
6
+
7
+ /**
8
+ *
9
+ * @param {AABB3} result
10
+ * @param {number} root_entity
11
+ * @param {EntityComponentDataset} ecd
12
+ */
13
+ export function sg_hierarchy_compute_bounding_box_via_parent_entity(result, root_entity, ecd) {
14
+ function visit(entity, ecd) {
15
+
16
+ /**
17
+ * @type {ShadedGeometry}
18
+ */
19
+ const sg = ecd.getComponent(root_entity, ShadedGeometry);
20
+
21
+ if (sg !== null) {
22
+ sg.getBoundingBox(scratch_aabb3);
23
+
24
+ result.expandToFit(scratch_aabb3);
25
+ }
26
+ }
27
+
28
+ result.setNegativelyInfiniteBounds();
29
+
30
+ ParentEntitySystem.traverse(ecd, root_entity, visit);
31
+ }
@@ -0,0 +1,4 @@
1
+ import {AABB3} from "../../../../core/bvh2/aabb3/AABB3";
2
+ import {EntityComponentDataset} from "../../../ecs/EntityComponentDataset";
3
+
4
+ export function sg_hierarchy_compute_bounding_box_via_parent_entity(result: AABB3, root_entity: number, ecd: EntityComponentDataset): void
@@ -0,0 +1,11 @@
1
+ import Vector1 from "../../../../core/geom/Vector1.js";
2
+ import { Color } from "../../../../core/color/Color.js";
3
+
4
+ export class Sprite {
5
+ size = 1;
6
+ url = "";
7
+ opacity = new Vector1(1);
8
+ color = new Color(1, 1, 1);
9
+ }
10
+
11
+ Sprite.typeName = "Sprite";