@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,5 +1,4 @@
1
1
  import { Sampler2D } from "./Sampler2D.js";
2
- import Vector4 from "../../../../core/geom/Vector4.js";
3
2
 
4
3
  test("constructor arguments", () => {
5
4
  const uint8Array = new Uint8Array(24);
@@ -18,7 +17,7 @@ test("get method v1 1x1", () => {
18
17
 
19
18
  const ut = new Sampler2D(uint8Array, 1, 1, 1);
20
19
 
21
- expect(ut.get(0, 0)).toBe(7);
20
+ expect(ut.readChannel(0, 0, 0)).toBe(7);
22
21
  });
23
22
 
24
23
  test("resize uint8 v1 1x1 to 2x3", () => {
@@ -32,7 +31,7 @@ test("resize uint8 v1 1x1 to 2x3", () => {
32
31
  expect(s.height).toBe(3);
33
32
 
34
33
  //old data is preserved
35
- expect(s.get(0, 0)).toBe(1);
34
+ expect(s.readChannel(0, 0, 0)).toBe(1);
36
35
 
37
36
  expect(s.data.length).toBe(6);
38
37
  });
@@ -49,8 +48,8 @@ test("resize uint8 v1 1x2 to 2x3", () => {
49
48
  expect(s.height).toBe(3);
50
49
 
51
50
  //old data is preserved
52
- expect(s.get(0, 0)).toBe(1);
53
- expect(s.get(0, 1)).toBe(3);
51
+ expect(s.readChannel(0, 0, 0)).toBe(1);
52
+ expect(s.readChannel(0, 1, 0)).toBe(3);
54
53
 
55
54
  expect(s.data.length).toBe(6);
56
55
  });
@@ -67,8 +66,8 @@ test("resize uint8 v1 2x3 to 1x2", () => {
67
66
  expect(s.height).toBe(2);
68
67
 
69
68
  //old data is preserved
70
- expect(s.get(0, 0)).toBe(1);
71
- expect(s.get(0, 1)).toBe(3);
69
+ expect(s.readChannel(0, 0, 0)).toBe(1);
70
+ expect(s.readChannel(0, 1, 0)).toBe(3);
72
71
 
73
72
  expect(s.data.length).toBe(2);
74
73
  });
@@ -83,10 +82,10 @@ test("get method v1 2x2", () => {
83
82
 
84
83
  const ut = new Sampler2D(uint8Array, 1, 2, 2);
85
84
 
86
- expect(ut.get(0, 0)).toBe(7);
87
- expect(ut.get(1, 0)).toBe(11);
88
- expect(ut.get(0, 1)).toBe(13);
89
- expect(ut.get(1, 1)).toBe(5);
85
+ expect(ut.readChannel(0, 0, 0)).toBe(7);
86
+ expect(ut.readChannel(1, 0, 0)).toBe(11);
87
+ expect(ut.readChannel(0, 1, 0)).toBe(13);
88
+ expect(ut.readChannel(1, 1, 0)).toBe(5);
90
89
  });
91
90
 
92
91
 
@@ -100,23 +99,23 @@ test('set and get consistency itemSize=4, 2x2', () => {
100
99
  ut.set(1, 1, [13, 14, 15, 16]);
101
100
 
102
101
 
103
- const sample = new Vector4();
102
+ const sample = [];
104
103
 
105
- ut.get(0, 0, sample);
104
+ ut.read(0, 0, sample);
106
105
 
107
- expect(sample.asArray()).toEqual([1, 2, 3, 4]);
106
+ expect(sample).toEqual([1, 2, 3, 4]);
108
107
 
109
- ut.get(1, 0, sample);
108
+ ut.read(1, 0, sample);
110
109
 
111
- expect(sample.asArray()).toEqual([5, 6, 7, 8]);
110
+ expect(sample).toEqual([5, 6, 7, 8]);
112
111
 
113
- ut.get(0, 1, sample);
112
+ ut.read(0, 1, sample);
114
113
 
115
- expect(sample.asArray()).toEqual([9, 10, 11, 12]);
114
+ expect(sample).toEqual([9, 10, 11, 12]);
116
115
 
117
- ut.get(1, 1, sample);
116
+ ut.read(1, 1, sample);
118
117
 
119
- expect(sample.asArray()).toEqual([13, 14, 15, 16]);
118
+ expect(sample).toEqual([13, 14, 15, 16]);
120
119
  });
121
120
 
122
121
  test('computeMax itemSize=1, 0x0', () => {
@@ -192,11 +191,11 @@ test('sampleChannelBilinear 2x2', () => {
192
191
  expect(s.sampleChannelBilinear(1, 1, 0)).toBe(11);
193
192
 
194
193
 
195
- expect(s.sampleChannelBilinear(0.5, 0, 0)).toBe(3);
196
- expect(s.sampleChannelBilinear(0, 0.5, 0)).toBe(4);
197
- expect(s.sampleChannelBilinear(0.5, 0.5, 0)).toBe(6);
198
- expect(s.sampleChannelBilinear(1, 0.5, 0)).toBe(8);
199
- expect(s.sampleChannelBilinear(0.5, 1, 0)).toBe(9);
194
+ expect(s.sampleChannelBilinear(0.5, 0, 0)).toBeCloseTo(3);
195
+ expect(s.sampleChannelBilinear(0, 0.5, 0)).toBeCloseTo(4);
196
+ expect(s.sampleChannelBilinear(0.5, 0.5, 0)).toBeCloseTo(6);
197
+ expect(s.sampleChannelBilinear(1, 0.5, 0)).toBeCloseTo(8);
198
+ expect(s.sampleChannelBilinear(0.5, 1, 0)).toBeCloseTo(9);
200
199
 
201
200
 
202
201
  });
@@ -256,7 +255,7 @@ describe("copy method", () => {
256
255
 
257
256
  target.copy(source, 0, 0, 1, 1, 1, 1);
258
257
 
259
- expect(target.get(1, 1)).toBe(2);
258
+ expect(target.readChannel(1, 1, 0)).toBe(2);
260
259
  });
261
260
  });
262
261
 
@@ -271,22 +270,22 @@ describe("copyWithMargin method", () => {
271
270
  target.copyWithMargin(source, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1);
272
271
 
273
272
  //top left
274
- expect(target.get(0, 0)).toEqual(2);
273
+ expect(target.readChannel(0, 0, 0)).toEqual(2);
275
274
  //top
276
- expect(target.get(1, 0)).toEqual(2);
275
+ expect(target.readChannel(1, 0, 0)).toEqual(2);
277
276
  //top right
278
- expect(target.get(2, 0)).toEqual(2);
277
+ expect(target.readChannel(2, 0, 0)).toEqual(2);
279
278
  //left
280
- expect(target.get(0, 1)).toEqual(2);
279
+ expect(target.readChannel(0, 1, 0)).toEqual(2);
281
280
  //copied region
282
- expect(target.get(1, 1)).toEqual(2);
281
+ expect(target.readChannel(1, 1, 0)).toEqual(2);
283
282
  //right
284
- expect(target.get(2, 1)).toEqual(2);
283
+ expect(target.readChannel(2, 1, 0)).toEqual(2);
285
284
  //bottom left
286
- expect(target.get(0, 2)).toEqual(2);
285
+ expect(target.readChannel(0, 2, 0)).toEqual(2);
287
286
  //bottom
288
- expect(target.get(1, 2)).toEqual(2);
287
+ expect(target.readChannel(1, 2, 0)).toEqual(2);
289
288
  //bottom right
290
- expect(target.get(2, 2)).toEqual(2);
289
+ expect(target.readChannel(2, 2, 0)).toEqual(2);
291
290
  });
292
291
  });
@@ -0,0 +1,59 @@
1
+ /**
2
+ * @see https://github.com/hughsk/bicubic/blob/master/index.js
3
+ * @param xf
4
+ * @param yf
5
+ * @param p00
6
+ * @param p01
7
+ * @param p02
8
+ * @param p03
9
+ * @param p10
10
+ * @param p11
11
+ * @param p12
12
+ * @param p13
13
+ * @param p20
14
+ * @param p21
15
+ * @param p22
16
+ * @param p23
17
+ * @param p30
18
+ * @param p31
19
+ * @param p32
20
+ * @param p33
21
+ * @returns {*}
22
+ */
23
+ export function bicubic(
24
+ xf, yf
25
+ , p00, p01, p02, p03
26
+ , p10, p11, p12, p13
27
+ , p20, p21, p22, p23
28
+ , p30, p31, p32, p33
29
+ ) {
30
+ var yf2 = yf * yf
31
+ var xf2 = xf * xf
32
+ var xf3 = xf * xf2
33
+
34
+ var x00 = p03 - p02 - p00 + p01
35
+ var x01 = p00 - p01 - x00
36
+ var x02 = p02 - p00
37
+ var x0 = x00 * xf3 + x01 * xf2 + x02 * xf + p01
38
+
39
+ var x10 = p13 - p12 - p10 + p11
40
+ var x11 = p10 - p11 - x10
41
+ var x12 = p12 - p10
42
+ var x1 = x10 * xf3 + x11 * xf2 + x12 * xf + p11
43
+
44
+ var x20 = p23 - p22 - p20 + p21
45
+ var x21 = p20 - p21 - x20
46
+ var x22 = p22 - p20
47
+ var x2 = x20 * xf3 + x21 * xf2 + x22 * xf + p21
48
+
49
+ var x30 = p33 - p32 - p30 + p31
50
+ var x31 = p30 - p31 - x30
51
+ var x32 = p32 - p30
52
+ var x3 = x30 * xf3 + x31 * xf2 + x32 * xf + p31
53
+
54
+ var y0 = x3 - x2 - x0 + x1
55
+ var y1 = x0 - x1 - y0
56
+ var y2 = x2 - x0
57
+
58
+ return y0 * yf * yf2 + y1 * yf2 + y2 * yf + x1
59
+ }
@@ -1,5 +1,5 @@
1
1
  import { Sampler2D } from "./Sampler2D.js";
2
- import { downsampleSampler2D } from "./downsampleSampler2D.js";
2
+ import { sampler2D_scale_down_linear } from "./sampler2D_scale_down_linear.js";
3
3
 
4
4
  test('2x2 -> 1x1 2x channel', () => {
5
5
  const input = Sampler2D.float32(2, 2, 2);
@@ -10,7 +10,7 @@ test('2x2 -> 1x1 2x channel', () => {
10
10
  input.set(0, 1, [11, 13]);
11
11
  input.set(1, 1, [17, 19]);
12
12
 
13
- downsampleSampler2D(input, output);
13
+ sampler2D_scale_down_linear(input, output);
14
14
 
15
15
  expect(output.data[0]).toEqual(8.5);
16
16
  expect(output.data[1]).toEqual(10.5);
@@ -11,8 +11,6 @@ export function genericResampleSampler2D(source, target) {
11
11
 
12
12
  // build kernel
13
13
 
14
- // TODO add gaussian weights kernel for samples
15
-
16
14
  const u_scale = source.width / target_width;
17
15
  const v_scale = source.height / target_height;
18
16
 
@@ -0,0 +1,146 @@
1
+ import { EngineHarness } from "../../../EngineHarness.js";
2
+ import { ImageRGBADataLoader } from "../../../asset/loaders/image/ImageRGBADataLoader.js";
3
+ import sampler2D2Canvas from "./Sampler2D2Canvas.js";
4
+ import { CanvasView } from "../../../../view/elements/CanvasView.js";
5
+ import { sampler2D_scale_down_lanczos } from "./sampler2_d_scale_down_lanczos.js";
6
+ import { Sampler2D } from "./Sampler2D.js";
7
+ import { genericResampleSampler2D } from "./genericResampleSampler2D.js";
8
+ import Vector2 from "../../../../core/geom/Vector2.js";
9
+
10
+ function grid(engine, input, transforms, size = new Vector2(input.width, input.height)) {
11
+
12
+ for (let i = 0; i < transforms.length; i++) {
13
+ const out = input.clone();
14
+
15
+ out.resize(size.x, size.y);
16
+
17
+ transforms[i](out, input);
18
+
19
+ display(engine, out, i * (size.x + 4), 0);
20
+ }
21
+
22
+ }
23
+
24
+
25
+ function display(engine, sampler, x = 0, y = 0) {
26
+
27
+ const view = new CanvasView();
28
+ view.size.set(sampler.width, sampler.height);
29
+ sampler2D2Canvas(sampler, 1, 0, view.el);
30
+
31
+ view.css({
32
+ position: 'absolute',
33
+ top: `${y}px`,
34
+ left: `${x}px`
35
+ });
36
+
37
+ engine.gameView.addChild(view);
38
+ }
39
+
40
+
41
+ new EngineHarness().initialize({
42
+ configuration(config) {
43
+ config.addLoader('image', new ImageRGBADataLoader());
44
+ }
45
+ }).then(async engine => {
46
+
47
+ const asset = await engine.assetManager.promise("data/textures/utility/Lenna.png", 'image');
48
+ // const asset = await engine.assetManager.promise("data/textures/utility/resolver.jpeg", 'image');
49
+ // const asset = await engine.assetManager.promise("data/textures/icons/500_skill_icons_02/Skill_nobg/skill_492_noBG.png", 'image');
50
+ // const asset = await engine.assetManager.promise("data/textures/utility/sampling-test.png", 'image');
51
+
52
+ const source = asset.create();
53
+
54
+ test_sampling(source, engine)
55
+
56
+ engine.graphics.getRenderer().setClearColor('green');
57
+
58
+ return;
59
+ const TARGET_SCALE = 0.2;
60
+
61
+ // display(source);
62
+
63
+ const TARGET_HEIGHT = Math.ceil(source.height * TARGET_SCALE);
64
+ const TARGET_WIDTH = Math.ceil(source.width * TARGET_SCALE);
65
+
66
+ const COMPARE_X_OFFSET = 0;
67
+
68
+ const small = Sampler2D.uint8(source.itemSize, TARGET_WIDTH, TARGET_HEIGHT);
69
+
70
+ // sampler2D_lanczos(source, small);
71
+ console.time('filter');
72
+ sampler2D_scale_down_lanczos(source, small, 3);
73
+ console.timeEnd('filter');
74
+
75
+ display(engine, small, COMPARE_X_OFFSET, 0);
76
+
77
+ // const big = Sampler2D.uint8(source.itemSize, Math.ceil(source.width / TARGET_SCALE), Math.ceil(source.height / TARGET_SCALE));
78
+ // sampler2D_scale_down_lanczos(source, big,3);
79
+ //
80
+ // display(big, 0, source.height);
81
+
82
+ const small_scale_2 = Sampler2D.uint8(source.itemSize, TARGET_WIDTH, TARGET_HEIGHT);
83
+ console.time('filter-generic');
84
+ genericResampleSampler2D(source, small_scale_2);
85
+ console.timeEnd('filter-generic');
86
+ display(engine, small_scale_2, COMPARE_X_OFFSET, TARGET_HEIGHT);
87
+ })
88
+
89
+ function test_sampling(source, engine) {
90
+ grid(engine, source, [
91
+ (out, input) => {
92
+ const sample = [];
93
+ for (let y = 0; y < out.height; y++) {
94
+
95
+ for (let x = 0; x < out.width; x++) {
96
+
97
+ input.sampleNearestUV(x / (out.width - 1), y / (out.height - 1), sample);
98
+
99
+ out.set(x, y, sample);
100
+ }
101
+ }
102
+ },
103
+ (out, input) => {
104
+ const sample = new Uint8ClampedArray(4);
105
+ for (let y = 0; y < out.height; y++) {
106
+
107
+ for (let x = 0; x < out.width; x++) {
108
+
109
+ input.sampleBilinearUV(x / (out.width - 1), y / (out.height - 1), sample);
110
+
111
+ out.set(x, y, sample);
112
+ }
113
+ }
114
+ },
115
+ (out, input) => {
116
+ const sample = new Uint8ClampedArray(4);
117
+ for (let y = 0; y < out.height; y++) {
118
+
119
+ for (let x = 0; x < out.width; x++) {
120
+
121
+ input.sampleBicubicUV(x / (out.width - 1), y / (out.height - 1), sample);
122
+
123
+ out.set(x, y, sample);
124
+ }
125
+ }
126
+ },
127
+ (out, input) => {
128
+ const sample = new Uint8ClampedArray(4);
129
+ for (let y = 0; y < out.height; y++) {
130
+
131
+ for (let x = 0; x < out.width; x++) {
132
+
133
+ input.sampleCatmullRomUV(x / (out.width - 1), y / (out.height - 1), sample);
134
+
135
+ out.set(x, y, sample);
136
+ }
137
+ }
138
+ }
139
+ ], new Vector2(
140
+ 200, 200
141
+ ));
142
+ }
143
+
144
+ function lanczos() {
145
+
146
+ }
@@ -5,7 +5,7 @@ import { assert } from "../../../../core/assert.js";
5
5
  * @param {Sampler2D} input
6
6
  * @param {Sampler2D} output
7
7
  */
8
- export function downsampleSampler2D(input, output) {
8
+ export function sampler2D_scale_down_linear(input, output) {
9
9
  assert.notEqual(input, undefined, 'input is undefined');
10
10
  assert.notEqual(output, undefined, 'output is undefined');
11
11
 
@@ -32,6 +32,7 @@ export function downsampleSampler2D(input, output) {
32
32
  const sample = new Array(itemSize);
33
33
 
34
34
  const sampleSize = sW * sH;
35
+ const sampleSizeInv = 1 / sampleSize;
35
36
 
36
37
  const iData = input.data;
37
38
  const oData = output.data;
@@ -43,9 +44,11 @@ export function downsampleSampler2D(input, output) {
43
44
 
44
45
  const sampleOffsetY = y * sH;
45
46
 
47
+ const row_address = y * oW * itemSize;
48
+
46
49
  for (x = 0; x < oW; x++) {
47
50
 
48
- const oAddress = (x + y * oW) * itemSize;
51
+ const output_texel_address = row_address + x * itemSize;
49
52
 
50
53
  for (i = 0; i < itemSize; i++) {
51
54
  // reset sample
@@ -57,10 +60,11 @@ export function downsampleSampler2D(input, output) {
57
60
  // accumulate sample
58
61
  for (j = 0; j < sH; j++) {
59
62
  const row_index = (sampleOffsetY + j) * iW;
63
+ const texel_offset = row_index + sampleOffsetX;
60
64
 
61
65
  for (i = 0; i < sW; i++) {
62
66
 
63
- const iAddress = ((sampleOffsetX + i) + row_index) * itemSize;
67
+ const iAddress = (texel_offset + i) * itemSize;
64
68
 
65
69
  for (k = 0; k < itemSize; k++) {
66
70
  sample[k] += iData[k + iAddress];
@@ -71,7 +75,7 @@ export function downsampleSampler2D(input, output) {
71
75
 
72
76
  // dilute the sample
73
77
  for (i = 0; i < itemSize; i++) {
74
- oData[oAddress + i] = sample[i] / sampleSize;
78
+ oData[output_texel_address + i] = sample[i] * sampleSizeInv;
75
79
  }
76
80
 
77
81
 
@@ -0,0 +1,140 @@
1
+ import { max2 } from "../../../../core/math/max2.js";
2
+ import { min2 } from "../../../../core/math/min2.js";
3
+
4
+
5
+ /**
6
+ * @see https://en.wikipedia.org/wiki/Lanczos_resampling
7
+ * Calculate lanczos weight
8
+ * @param {number} x
9
+ * @param {number} lobes
10
+ * @returns {number}
11
+ */
12
+ function lanczos(x, lobes) {
13
+
14
+ /*
15
+ // not needed in our case, as X is always positive
16
+ if (x < 0) {
17
+ x = -x;
18
+ }
19
+
20
+ */
21
+
22
+ if (x > lobes) {
23
+ return 0;
24
+ }
25
+
26
+ if (x < 1e-16) {
27
+ return 1;
28
+ }
29
+
30
+ const xx = x / lobes;
31
+
32
+ return Math.sin(Math.PI * x) * Math.sin(Math.PI * xx) / (x * x);
33
+ }
34
+
35
+ export function filter_lanczos3(t) {
36
+ if (t < 0) {
37
+ t = -t;
38
+ }
39
+ if (t < 3.0) {
40
+ return Math.sin(t) * Math.sin(t / 3.0);
41
+ }
42
+ return 0.0;
43
+ }
44
+
45
+ filter_lanczos3.support = 3;
46
+
47
+
48
+ /**
49
+ * Good for down-sampling
50
+ * @param {Sampler2D} source
51
+ * @param {Sampler2D} destination
52
+ * @param {number} [lobes]
53
+ */
54
+ export function sampler2D_scale_down_lanczos(source, destination, lobes = 3) {
55
+
56
+ const d_w = destination.width;
57
+ const d_h = destination.height;
58
+
59
+ const item_size = destination.itemSize;
60
+
61
+ const source_width = source.width;
62
+ const source_height = source.height;
63
+
64
+ const source_data = source.data;
65
+ const destination_data = destination.data;
66
+
67
+ const ratio_x = source_width / d_w;
68
+ const ratio_y = source_height / d_h;
69
+
70
+
71
+ const range2_x = Math.ceil(ratio_x * lobes / 2);
72
+ const range2_y = Math.ceil(ratio_y * lobes / 2);
73
+
74
+ const sample = new Array(item_size);
75
+
76
+ let v, u, i, j, k;
77
+
78
+ for (v = 0; v < d_h; v++) {
79
+
80
+ const center_y = (v) * ratio_y;
81
+ const source_y0 = max2(Math.ceil(center_y - range2_y), 0);
82
+ const source_y1 = min2(Math.floor(center_y + range2_y), source_height - 1);
83
+
84
+ for (u = 0; u < d_w; u++) {
85
+ const center_x = (u) * ratio_x;
86
+
87
+ const source_x0 = max2(Math.ceil(center_x - range2_x), 0);
88
+ const source_x1 = min2(Math.floor(center_x + range2_x), source_width - 1);
89
+
90
+ let z = 0;
91
+ // reset sample
92
+ for (i = 0; i < item_size; i++) {
93
+ sample[i] = 0;
94
+ }
95
+
96
+ for (j = source_y0; j <= source_y1; j++) {
97
+
98
+ const f_y = (j - center_y);
99
+
100
+ const f_y_rcp2 = f_y * f_y;
101
+
102
+ for (i = source_x0; i <= source_x1; i++) {
103
+
104
+ const f_x = (i - center_x);
105
+
106
+ const f_x_rcp2 = f_x * f_x;
107
+
108
+ const distance_from_center_sqr = f_x_rcp2 + f_y_rcp2;
109
+ const distance_from_center = Math.sqrt(distance_from_center_sqr);
110
+
111
+ const lanczos_weight = lanczos(distance_from_center, lobes);
112
+
113
+ if (lanczos_weight <= 0) {
114
+ continue;
115
+ }
116
+
117
+ z += lanczos_weight;
118
+
119
+ const source_texel_address = (j * source_width + i) * item_size;
120
+
121
+ for (k = 0; k < item_size; k++) {
122
+ sample[k] += lanczos_weight * source_data[source_texel_address + k];
123
+ }
124
+
125
+ }
126
+ }
127
+
128
+
129
+ // dilute sample and write to destination
130
+ const inv_z = 1 / z;
131
+
132
+ const texel_address = (v * d_w + u) * item_size;
133
+
134
+ for (i = 0; i < item_size; i++) {
135
+ destination_data[texel_address + i] = sample[i] * inv_z;
136
+ }
137
+ }
138
+ }
139
+
140
+ }
@@ -1,5 +1,5 @@
1
1
  import { assert } from "../../../../core/assert.js";
2
- import { downsampleSampler2D } from "./downsampleSampler2D.js";
2
+ import { sampler2D_scale_down_linear } from "./sampler2D_scale_down_linear.js";
3
3
  import { Sampler2D } from "./Sampler2D.js";
4
4
  import { upsampleSampler2D } from "./upsampleSampler2D.js";
5
5
  import { genericResampleSampler2D } from "./genericResampleSampler2D.js";
@@ -29,10 +29,10 @@ export function scaleSampler2D(input, output) {
29
29
  // downscaling
30
30
  if (Number.isInteger(sourceWidth / targetWidth) && Number.isInteger(sourceHeight / targetHeight)) {
31
31
  // dimensions are multiples of source/target
32
- downsampleSampler2D(input, output);
32
+ sampler2D_scale_down_linear(input, output);
33
33
  } else {
34
34
  // generic downsample
35
- genericResampleSampler2D(input, output);
35
+ genericResampleSampler2D(input, output, 3);
36
36
  }
37
37
  } else if (sourceWidth < targetWidth && sourceHeight < targetHeight) {
38
38
  // upscaling
@@ -3,7 +3,7 @@ import { LuminanceFormat, RedFormat, RGBAFormat, RGBFormat, RGFormat } from "thr
3
3
  /**
4
4
  *
5
5
  * @param {Sampler2D} sampler
6
- * @param {DataTexture} texture
6
+ * @param {THREE.DataTexture} texture
7
7
  */
8
8
  export function writeSample2DDataToDataTexture(sampler, texture) {
9
9
  if (sampler.itemSize === 1) {
@@ -13,6 +13,19 @@ export function scaleObject3ToBox(object, size, result) {
13
13
 
14
14
  const boundingBox = new Box3();
15
15
 
16
+ object.traverse(a => {
17
+ if (a.isMesh) {
18
+ /**
19
+ * @type {THREE.BufferGeometry}
20
+ */
21
+ const geometry = a.geometry;
22
+
23
+ if (geometry.boundingBox === null) {
24
+ geometry.computeBoundingBox();
25
+ }
26
+ }
27
+ });
28
+
16
29
  boundingBox.expandByObject(object);
17
30
 
18
31
  //box size
@@ -22,4 +35,4 @@ export function scaleObject3ToBox(object, size, result) {
22
35
  result.set(scale, scale, scale);
23
36
 
24
37
  return actualBoxSize.multiplyScalar(scale);
25
- }
38
+ }
@@ -11,6 +11,7 @@ import { rootObject3DFastMatrixUpdate } from "../ecs/mesh/rootObject3DFastMatrix
11
11
  import { computeMeshPreviewCameraDistance } from "./computeMeshPreviewCameraDistance.js";
12
12
  import { scaleObject3ToBox } from "./ScaleObject3ToBox.js";
13
13
  import { DEG_TO_RAD } from "../../../core/math/DEG_TO_RAD.js";
14
+ import AABB2 from "../../../core/geom/AABB2.js";
14
15
 
15
16
  /**
16
17
  *
@@ -19,7 +20,7 @@ import { DEG_TO_RAD } from "../../../core/math/DEG_TO_RAD.js";
19
20
  * @param {AABB2} focus
20
21
  * @returns {{scene: Scene, camera: PerspectiveCamera}}
21
22
  */
22
- export function makeMeshPreviewScene(mesh, size, focus) {
23
+ export function makeMeshPreviewScene(mesh, size, focus = new AABB2(0, 0, size.x, size.y)) {
23
24
  const scene = new ThreeScene();
24
25
 
25
26
  //lights