@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.
- package/core/assert.js +1 -1
- package/core/binary/float2uint8.js +8 -0
- package/core/binary/uint82float.js +8 -0
- package/core/bvh2/bvh3/ExplicitBinaryBoundingVolumeHierarchy.js +6 -4
- package/core/collection/array/array_get_index_in_range.js +16 -0
- package/core/collection/array/typed/isTypedArray.js +20 -0
- package/core/collection/array/typedArrayToDataType.js +1 -0
- package/{engine/navigation/grid → core/collection/heap}/BinaryHeap.js +6 -1
- package/{engine/navigation/grid → core/collection/heap}/FastBinaryHeap.js +3 -2
- package/{engine/navigation/grid → core/collection/heap}/FastBinaryHeap.spec.js +3 -3
- package/core/collection/heap/Uin32Heap.spec.js +59 -0
- package/core/collection/heap/Uint32Heap.js +385 -0
- package/core/collection/list/List.d.ts +1 -1
- package/core/collection/table/RowFirstTable.js +34 -0
- package/core/collection/table/RowFirstTable.spec.js +59 -1
- package/core/color/Color.js +83 -1
- package/core/color/YCbCr_to_rgb_uint24.js +3 -4
- package/core/color/hsv2rgb.js +4 -3
- package/core/color/linear_to_sRGB.js +4 -5
- package/core/color/rgb2hex.js +1 -1
- package/core/color/rgb2uint24.js +6 -4
- package/core/color/rgb_to_YCbCr_uint24.js +11 -13
- package/core/events/signal/Signal.d.ts +11 -9
- package/core/events/signal/Signal.spec.js +16 -0
- package/core/geom/2d/quad-tree/qt_collect_by_circle.js +67 -0
- package/core/geom/3d/topology/computeTopoMeshVertexDuplicates.js +9 -6
- package/core/geom/3d/topology/expandConnectivityByLocality.js +5 -5
- package/core/geom/3d/topology/query/query_edge_is_boundary.js +7 -0
- package/core/geom/3d/topology/query/query_edge_is_manifold.js +13 -0
- package/core/geom/3d/topology/query/query_edge_is_manifold_or_boundary.js +11 -0
- package/core/geom/3d/topology/query/query_edge_is_wire.js +13 -0
- package/core/geom/3d/topology/query/query_edge_other_vertex.js +20 -0
- package/core/geom/3d/topology/query/query_edge_share_vert.js +9 -0
- package/core/geom/3d/topology/query/query_face_get_other_edges.js +39 -0
- package/core/geom/3d/topology/query/query_face_next_vertex.js +19 -0
- package/core/geom/3d/topology/query/query_face_prev_vertex.js +18 -0
- package/core/geom/3d/topology/query/query_vertex_in_edge.js +14 -0
- package/core/geom/3d/topology/query/query_vertex_pair_share_face.js +24 -0
- package/core/geom/3d/topology/query/query_vertices_in_edge.js +19 -0
- package/core/geom/3d/topology/simplify/collapseEdge.spec.js +3 -5
- package/core/geom/3d/topology/simplify/collapse_all_degenerate_edges.js +8 -10
- package/core/geom/3d/topology/simplify/compute_face_normal_change_dot_product.js +12 -2
- package/core/geom/3d/topology/simplify/decimate_edge_collapse_snap.js +277 -0
- package/core/geom/3d/topology/simplify/edge_collapse_quadratic.js +126 -0
- package/core/geom/3d/topology/simplify/prototypeMeshSimplification.js +502 -0
- package/core/geom/3d/topology/simplify/quadratic/Quadratic3.js +37 -5
- package/core/geom/3d/topology/simplify/quadratic/build_vertex_quadratics.js +86 -1
- package/core/geom/3d/topology/simplify/simplifyTopoMesh.js +4 -4
- package/core/geom/3d/topology/simplify/simplifyTopoMesh2.js +119 -0
- package/core/geom/3d/topology/simplify/tm_edge_collapse_is_degenerate_flip.js +81 -0
- package/core/geom/3d/topology/{TopoEdge.js → struct/TopoEdge.js} +47 -20
- package/core/geom/3d/topology/{TopoEdge.spec.js → struct/TopoEdge.spec.js} +0 -0
- package/core/geom/3d/topology/{TopoMesh.js → struct/TopoMesh.js} +20 -41
- package/core/geom/3d/topology/{TopoTriangle.js → struct/TopoTriangle.js} +15 -25
- package/core/geom/3d/topology/{TopoVertex.js → struct/TopoVertex.js} +21 -4
- package/core/geom/3d/topology/{TopoVertex.spec.js → struct/TopoVertex.spec.js} +0 -0
- package/core/geom/3d/topology/tm_edge_kill.js +24 -0
- package/core/geom/3d/topology/tm_edge_splice.js +42 -0
- package/core/geom/3d/topology/tm_face_area.js +18 -0
- package/core/geom/3d/topology/tm_face_kill.js +12 -0
- package/core/geom/3d/topology/tm_face_normal.js +14 -0
- package/core/geom/3d/topology/tm_kill_only_edge.js +35 -0
- package/core/geom/3d/topology/tm_kill_only_face.js +12 -0
- package/core/geom/3d/topology/tm_kill_only_vert.js +14 -0
- package/core/geom/3d/topology/tm_vert_kill.js +19 -0
- package/core/geom/3d/topology/tm_vert_splice.js +64 -0
- package/core/geom/3d/topology/tm_vertex_compute_normal.js +42 -0
- package/core/geom/3d/topology/topoMeshToBufferGeometry.js +18 -4
- package/core/geom/3d/topology/weld_duplicate_vertices.js +63 -0
- package/core/geom/Quaternion.d.ts +21 -1
- package/core/geom/Quaternion.js +279 -200
- package/core/geom/Quaternion.spec.js +71 -2
- package/core/geom/Vector2.js +3 -3
- package/core/geom/Vector3.d.ts +2 -0
- package/core/geom/Vector3.js +31 -7
- package/core/geom/Vector3.schema.json +16 -0
- package/core/geom/Vector4.js +16 -0
- package/core/geom/packing/MaxRectangles.js +1 -1
- package/core/graph/cluster_mesh_metis.js +16 -0
- package/core/graph/coarsen_graph.js +1 -1
- package/core/graph/graph_k_means_cluster.js +1 -1
- package/core/json/JsonUtils.js +2 -20
- package/core/math/bell_membership_function.js +19 -0
- package/core/math/exp2.js +8 -0
- package/core/math/interval/NumericInterval.js +17 -0
- package/core/math/physics/brdf/brdf_burley.js +25 -0
- package/core/math/physics/bsdf/bsdf_schlick.js +22 -0
- package/core/math/physics/irradiance/interpolate_irradiance_linear.js +18 -0
- package/{engine/sound/ecs/emitter/attenuate/attenuateSoundLogarithmic.js → core/math/physics/irradiance/interpolate_irradiance_lograrithmic.js} +2 -2
- package/{engine/sound/ecs/emitter/attenuate/attenuateSoundSmith.js → core/math/physics/irradiance/interpolate_irradiance_smith.js} +1 -1
- package/core/math/random/seededRandom.js +2 -31
- package/core/math/random/seededRandom_Mulberry32.js +31 -0
- package/core/math/random/seededRandom_sine.js +33 -0
- package/core/model/ObservedEnum.js +8 -0
- package/editor/Editor.js +97 -1
- package/editor/actions/concrete/ModifyPatchSampler2DAction.js +118 -0
- package/editor/actions/concrete/ModifyPatchSampler2DAction.spec.js +30 -0
- package/editor/actions/concrete/PatchTerrainHeightAction.js +13 -105
- package/editor/ecs/component/FieldDescriptor.js +34 -0
- package/editor/ecs/component/FieldValueAdapter.js +20 -0
- package/editor/ecs/component/TypeEditor.js +33 -0
- package/editor/ecs/component/TypeSchema.d.ts +38 -0
- package/editor/ecs/component/createFieldEditor.js +90 -0
- package/editor/ecs/component/createObjectEditor.js +266 -60
- package/editor/ecs/component/editors/ColorEditor.js +39 -0
- package/editor/ecs/component/editors/HTMLElementEditor.js +17 -0
- package/editor/ecs/component/editors/ImagePathEditor.js +50 -0
- package/editor/ecs/component/editors/NumericIntervalEditor.js +86 -0
- package/editor/ecs/component/editors/ObservedBooleanEditor.js +13 -0
- package/editor/ecs/component/editors/ObservedEnumEditor.js +32 -0
- package/editor/ecs/component/editors/ObservedIntegerEditor.js +43 -0
- package/editor/ecs/component/editors/ObservedStringEditor.js +51 -0
- package/editor/ecs/component/editors/Sampler2DEditor.js +107 -0
- package/editor/ecs/component/editors/collection/ListEditor.js +83 -0
- package/editor/ecs/component/editors/common/BitFlagsEditor.js +80 -0
- package/editor/ecs/component/editors/common/EnumEditor.js +41 -0
- package/editor/ecs/component/editors/common/makeV3_editor.js +85 -0
- package/editor/ecs/component/editors/common/noEditor.js +9 -0
- package/editor/ecs/component/editors/ecs/GridObstacleEditor.js +17 -0
- package/editor/ecs/component/editors/ecs/MinimapMarkerEditor.js +16 -0
- package/editor/ecs/component/editors/ecs/ParameterLookupTableEditor.js +44 -0
- package/editor/ecs/component/editors/ecs/ParameterTrackEditor.js +17 -0
- package/editor/ecs/component/editors/ecs/ParticleEmitterEditor.js +58 -0
- package/editor/ecs/component/editors/ecs/ParticleEmitterLayerEditor.js +54 -0
- package/editor/ecs/component/editors/ecs/SimulationStepDefinitionEditor.js +21 -0
- package/editor/ecs/component/editors/ecs/Trail2DEditor.js +33 -0
- package/editor/ecs/component/editors/ecs/TransformEditor.js +23 -0
- package/editor/ecs/component/editors/ecs/terrain/SplatMappingEditor.js +21 -0
- package/editor/ecs/component/editors/ecs/terrain/TerrainEditor.js +89 -0
- package/editor/ecs/component/editors/ecs/terrain/TerrainLayerEditor.js +18 -0
- package/editor/ecs/component/editors/ecs/terrain/TerrainLayersEditor.js +22 -0
- package/editor/ecs/component/editors/ecs/terrain/TerrainOverlayEditor.js +20 -0
- package/editor/ecs/component/editors/geom/QuaternionEditor.js +56 -0
- package/editor/ecs/component/editors/geom/Vector1Editor.js +57 -0
- package/editor/ecs/component/editors/geom/Vector2Editor.js +11 -0
- package/editor/ecs/component/editors/geom/Vector3Editor.js +13 -0
- package/editor/ecs/component/editors/geom/Vector4Editor.js +12 -0
- package/editor/ecs/component/editors/primitive/ArrayEditor.js +46 -0
- package/editor/ecs/component/editors/primitive/BooleanEditor.js +27 -0
- package/editor/ecs/component/editors/primitive/FunctionEditor.js +29 -0
- package/editor/ecs/component/editors/primitive/NumberEditor.js +60 -0
- package/editor/ecs/component/editors/primitive/ObjectEditor.js +12 -0
- package/editor/ecs/component/editors/primitive/StringEditor.js +31 -0
- package/editor/ecs/component/editors/three/BufferGeometryEditor.js +28 -0
- package/editor/ecs/component/editors/three/MaterialEditor.js +27 -0
- package/editor/ecs/component/editors/three/MeshEditor.js +35 -0
- package/editor/ecs/component/editors/three/TextureEditor.js +32 -0
- package/editor/ecs/component/findNearestRegisteredType.js +59 -0
- package/editor/ecs/component/prototypeObjectEditor.js +379 -0
- package/editor/tools/SelectionTool.js +1 -1
- package/editor/tools/paint/TerrainHeightPaintTool.js +88 -68
- package/editor/tools/paint/TerrainPaintTool.js +2 -1
- package/editor/tools/paint/TerrainTexturePaintTool.js +8 -73
- package/editor/view/EditorView.js +1 -1
- package/editor/view/ecs/ComponentControlView.js +2 -30
- package/editor/view/ecs/EntityEditor.js +61 -139
- package/editor/view/ecs/components/GridObstacleController.js +4 -4
- package/editor/view/ecs/components/TerrainController.js +1 -1
- package/editor/view/ecs/components/common/NumberController.js +19 -7
- package/editor/view/node-graph/NodeGraphView.js +2 -2
- package/editor/view/node-graph/NodeView.js +7 -9
- package/engine/animation/keyed2/AnimationTrack.js +1 -1
- package/engine/asset/AssetManager.d.ts +1 -1
- package/engine/asset/AssetManager.js +390 -388
- package/engine/asset/loaders/gltf/extensions/MSFT_texture_dds.js +14 -2
- package/engine/ecs/components/TagEditor.js +15 -0
- package/engine/ecs/fow/FogOfWarEditor.js +13 -0
- package/engine/ecs/parent/ParentEntitySystem.js +57 -0
- package/engine/ecs/terrain/ecs/OffsetScaleTransform2D.d.ts +6 -0
- package/engine/ecs/terrain/ecs/Terrain.js +44 -43
- package/engine/ecs/terrain/ecs/TerrainSystem.js +2 -2
- package/engine/ecs/terrain/ecs/layers/TerrainLayer.js +1 -1
- package/engine/ecs/terrain/ecs/splat/SplatMapping.js +26 -28
- package/engine/ecs/terrain/overlay/TerrainOverlay.js +71 -66
- package/engine/ecs/terrain/tiles/TerrainTileManager.js +23 -0
- package/engine/ecs/terrain/util/loadVisibleTerrainTiles.js +1 -1
- package/engine/ecs/terrain/util/paintTerrainOverlayViaLookupTable.js +13 -7
- package/engine/ecs/terrain/util/tensionOptimizeUV.js +1 -1
- package/engine/ecs/transform/Transform.d.ts +2 -0
- package/engine/ecs/transform/Transform.editor.schema.json +16 -0
- package/engine/ecs/transform/Transform.js +3 -0
- package/engine/graphics/ecs/highlight/HighlightEditor.js +17 -0
- package/engine/graphics/ecs/light/Light.js +0 -47
- package/engine/graphics/ecs/light/LightSerializationAdapter.js +50 -0
- package/engine/graphics/ecs/mesh/MeshEditor.js +28 -0
- package/engine/graphics/ecs/mesh-v2/DrawMode.js +2 -1
- package/engine/graphics/ecs/mesh-v2/aggregate/prototypeSGMesh.js +3 -3
- package/engine/graphics/ecs/mesh-v2/build_three_object.js +3 -1
- package/engine/graphics/ecs/mesh-v2/sg_compute_hierarchy_bounding_box_by_parent_entity.js +31 -0
- package/engine/graphics/ecs/mesh-v2/sg_hierarchy_compute_bounding_box_via_parent_entity.d.ts +4 -0
- package/engine/graphics/ecs/sprite/Sprite.js +11 -0
- package/engine/graphics/ecs/sprite/SpriteSystemPE.js +133 -0
- package/engine/graphics/ecs/sprite/prototypeSpriteSystem.js +1570 -0
- package/engine/graphics/micron/build/PatchRepresentation.js +7 -3
- package/engine/graphics/micron/build/buildMicronGeometryFromBufferGeometry.js +18 -8
- package/engine/graphics/micron/build/clustering/build_clustering_2.js +1 -1
- package/engine/graphics/micron/build/clustering/build_leaf_patches.js +2 -2
- package/engine/graphics/micron/build/clustering/build_leaf_patches_metis.js +1 -1
- package/engine/graphics/micron/build/hierarchy/buildAbstractPatchHierarchy.js +21 -3
- package/engine/graphics/micron/build/hierarchy/merge_patches.js +96 -43
- package/engine/graphics/micron/build/hierarchy/qvdr_build_simplified_clusters.js +11 -5
- package/engine/graphics/micron/format/VirtualGeometry.js +46 -3
- package/engine/graphics/micron/format/micron_build_proxy_geometry.js +4 -2
- package/engine/graphics/micron/prototypeVirtualGeometry.js +47 -10
- package/engine/graphics/micron/render/instanced/shader/shader_rewrite_standard.js +17 -17
- package/engine/graphics/micron/render/refinement/get_geometry_patch_cut.js +15 -3
- package/engine/graphics/micron/simplifyGeometry.js +1 -1
- package/engine/graphics/particles/particular/engine/ParticularEngine.js +5 -0
- package/engine/graphics/particles/particular/engine/emitter/ParticleLayer.js +17 -9
- package/engine/graphics/particles/particular/engine/renderers/ParticleRenderer.js +12 -10
- package/engine/graphics/particles/particular/engine/renderers/billboard/ParticleBillboardMaterial.js +7 -2
- package/engine/graphics/particles/particular/engine/renderers/billboard/SoftBillboardParticlePool.js +27 -0
- package/engine/graphics/particles/particular/engine/renderers/billboard/SoftBillboardParticleRenderer.js +80 -0
- package/engine/graphics/particles/particular/engine/shader/ShaderManager.js +16 -4
- package/engine/graphics/shaders/TerrainShader.js +8 -8
- package/engine/graphics/texture/atlas/TextureAtlasDebugger.js +2 -1
- package/engine/graphics/texture/sampler/Sampler2D.js +206 -201
- package/engine/graphics/texture/sampler/Sampler2D.spec.js +34 -35
- package/engine/graphics/texture/sampler/bicubic.js +59 -0
- package/engine/graphics/texture/sampler/downsampleSample2D.spec.js +2 -2
- package/engine/graphics/texture/sampler/genericResampleSampler2D.js +0 -2
- package/engine/graphics/texture/sampler/prototypeSamplerFiltering.js +146 -0
- package/engine/graphics/texture/sampler/{downsampleSampler2D.js → sampler2D_scale_down_linear.js} +8 -4
- package/engine/graphics/texture/sampler/sampler2_d_scale_down_lanczos.js +140 -0
- package/engine/graphics/texture/sampler/scaleSampler2D.js +3 -3
- package/engine/graphics/texture/sampler/writeSampler2DDataToDataTexture.js +1 -1
- package/engine/graphics/util/ScaleObject3ToBox.js +14 -1
- package/engine/graphics/util/makeMeshPreviewScene.js +2 -1
- package/engine/grid/components/GridObstacle.js +0 -44
- package/engine/grid/components/GridObstacleSerializationAdapter.js +46 -0
- package/engine/input/devices/PointerDevice.d.ts +1 -1
- package/engine/input/devices/PointerDevice.js +17 -2
- package/engine/input/ecs/util/TerrainCameraTargetSampler.js +2 -2
- package/engine/navigation/ecs/components/Path.d.ts +2 -0
- package/engine/navigation/ecs/components/Path.js +6 -1
- package/engine/navigation/ecs/components/computeNonuniformCatmullRomSplineSample.js +117 -0
- package/engine/navigation/grid/AStar.js +1 -1
- package/engine/navigation/grid/GridField.js +3 -2
- package/engine/platform/GetURLHash.js +27 -0
- package/engine/platform/WebEnginePlatform.js +1 -22
- package/engine/sound/ecs/emitter/SoundEmitter.js +10 -6
- package/engine/ui/DraggableAspect.js +2 -2
- package/generation/GridGenerator.js +7 -6
- package/generation/example/SampleGenerator0.js +39 -35
- package/generation/example/filters/SampleGroundMoistureFilter.js +58 -17
- package/generation/example/generators/interactive/mir_generator_place_buff_objects.js +7 -6
- package/generation/example/generators/mir_generator_place_bases.js +7 -3
- package/generation/example/generators/mir_generator_place_road_decorators.js +3 -3
- package/generation/example/generators/mir_generator_place_starting_point.js +3 -2
- package/generation/example/themes/SampleTheme0.js +11 -7
- package/generation/filtering/numeric/CellFilterLiteralFloat.js +5 -0
- package/generation/filtering/numeric/complex/CellFilterDilate.js +36 -0
- package/generation/filtering/numeric/complex/CellFilterGaussianBlur.js +15 -5
- package/generation/filtering/numeric/complex/CellFilterSimplexNoise.js +53 -1
- package/generation/filtering/numeric/math/CellFilterMax2.js +3 -0
- package/generation/filtering/numeric/math/CellFilterMembershipGeneralizedBell.js +55 -0
- package/generation/filtering/numeric/sampling/AbstractCellFilterSampleGridLayer.js +42 -0
- package/generation/filtering/numeric/sampling/CellFilterSampleLayerCubic.js +36 -0
- package/generation/filtering/numeric/sampling/CellFilterSampleLayerLinear.js +41 -0
- package/generation/grid/GridData.d.ts +5 -1
- package/generation/grid/GridData.js +35 -36
- package/generation/grid/MarkerMatchCounter.js +5 -3
- package/generation/grid/generation/discrete/GridTaskConnectRooms.js +1 -1
- package/generation/grid/generation/discrete/layer/GridTaskBuildSourceDistanceMap.js +1 -1
- package/generation/grid/generation/discrete/layer/GridTaskDistanceToMarkers.js +1 -1
- package/generation/grid/generation/road/GridTaskGenerateRoads.js +1 -1
- package/generation/markers/GridActionRuleSet.js +15 -32
- package/generation/markers/GridCellActionPlaceMarker.js +12 -8
- package/generation/markers/debug/visualizeMarkers.js +56 -36
- package/generation/markers/emitter/MarkerNodeEmitterFromAction.js +8 -8
- package/generation/markers/prototypeGridCellActionPlaceMarker.js +209 -0
- package/generation/markers/transform/MarkerNodeTransformerOffsetPosition.js +1 -5
- package/generation/markers/transform/MarkerNodeTransformerYRotateByFilterGradient.spec.js +2 -2
- package/generation/placement/GridCellPlacementRule.js +31 -25
- package/generation/theme/ThemeEngine.js +1 -1
- package/package.json +1 -1
- package/samples/terrain/from_image.js +7 -3
- package/samples/terrain/main.js +1 -1
- package/view/View.js +23 -1
- package/view/common/LabelView.js +1 -1
- package/view/compose3x3transform.js +32 -8
- package/view/controller/dat/DatGuiUtils.js +1 -1
- package/view/elements/DropDownSelectionView.js +11 -3
- package/view/elements/image/ImageView.js +3 -1
- package/core/model/ObservedReal.js +0 -55
- package/editor/ecs/component/ObjectEditor.js +0 -0
- package/engine/graphics/particles/particular/engine/renderers/SoftBillboardParticleRenderer.js +0 -7
- package/engine/sound/ecs/emitter/attenuate/attenuateSoundLinear.js +0 -11
- package/generation/filtering/numeric/CellFilterReadGridLayer.js +0 -73
|
@@ -1,14 +1,18 @@
|
|
|
1
|
-
import { TopoMesh } from "../../../../core/geom/3d/topology/TopoMesh.js";
|
|
1
|
+
import { TopoMesh } from "../../../../core/geom/3d/topology/struct/TopoMesh.js";
|
|
2
2
|
import { MicronGeometryPatch } from "../format/MicronGeometryPatch.js";
|
|
3
3
|
import { fill_patch_geometry_data } from "./fill_patch_geometry_data.js";
|
|
4
4
|
import { AABB3 } from "../../../../core/bvh2/aabb3/AABB3.js";
|
|
5
5
|
import { assert } from "../../../../core/assert.js";
|
|
6
|
-
import {
|
|
6
|
+
import {
|
|
7
|
+
computeTraingleClusterNormalBoundingCone
|
|
8
|
+
} from "../../../../core/geom/3d/topology/bounds/computeTraingleClusterNormalBoundingCone.js";
|
|
7
9
|
import { noop } from "../../../../core/function/Functions.js";
|
|
8
10
|
import { ConicRay } from "../../../../core/geom/ConicRay.js";
|
|
9
11
|
import { vec4 } from "gl-matrix";
|
|
10
12
|
import { computeTopoMeshBoundiningBox } from "../../../../core/geom/3d/topology/bounds/computeTopoMeshBoundiningBox.js";
|
|
11
|
-
import {
|
|
13
|
+
import {
|
|
14
|
+
computeTopoMeshBoundingSphere
|
|
15
|
+
} from "../../../../core/geom/3d/topology/bounds/computeTopoMeshBoundingSphere.js";
|
|
12
16
|
import { meshopt_optimizeVertexCache } from "../../geometry/optimization/VertexCacheOptimizer.js";
|
|
13
17
|
import { array_copy } from "../../../../core/collection/array/copyArray.js";
|
|
14
18
|
|
|
@@ -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
|
import { PatchRepresentation } from "./PatchRepresentation.js";
|
|
3
3
|
import { MicronGeometry } from "../format/MicronGeometry.js";
|
|
4
4
|
import { buildAbstractPatchHierarchy } from "./hierarchy/buildAbstractPatchHierarchy.js";
|
|
@@ -8,14 +8,16 @@ import { DataType } from "../../../../core/collection/table/DataType.js";
|
|
|
8
8
|
import { MicronGeometryPatch } from "../format/MicronGeometryPatch.js";
|
|
9
9
|
import { build_clustering_info } from "./debug/build_clustering_info.js";
|
|
10
10
|
import { build_graph_info } from "./debug/build_graph_info.js";
|
|
11
|
-
import { expandConnectivityByLocality } from "../../../../core/geom/3d/topology/expandConnectivityByLocality.js";
|
|
12
11
|
import { build_geometry_info } from "./build_geometry_info.js";
|
|
13
12
|
import { build_leaf_patches_metis } from "./clustering/build_leaf_patches_metis.js";
|
|
14
13
|
import { compute_buffer_geometry_byte_size } from "../../geometry/buffered/compute_buffer_geometry_byte_size.js";
|
|
15
14
|
import { deinterleaveBufferGeometry } from "../../geometry/buffered/deinterleaveBufferGeometry.js";
|
|
16
|
-
import { AABB3 } from "../../../../core/bvh2/aabb3/AABB3.js";
|
|
17
|
-
import { aabb3_from_v3_array } from "../../../../core/bvh2/aabb3/aabb3_from_v3_array.js";
|
|
18
15
|
import { update_topo_face_normals } from "../../../../core/geom/3d/topology/update_topo_face_normals.js";
|
|
16
|
+
import {
|
|
17
|
+
collapse_all_degenerate_edges
|
|
18
|
+
} from "../../../../core/geom/3d/topology/simplify/collapse_all_degenerate_edges.js";
|
|
19
|
+
import { mergeVertices } from "three/examples/jsm/utils/BufferGeometryUtils.js";
|
|
20
|
+
import { debugValidateMesh } from "../../../../core/geom/3d/topology/debugValidateMesh.js";
|
|
19
21
|
|
|
20
22
|
/**
|
|
21
23
|
* Returns current time in milliseconds
|
|
@@ -124,7 +126,10 @@ const PRINT_VERBOSE_STATS = false;
|
|
|
124
126
|
* @returns {Promise<MicronGeometry>}
|
|
125
127
|
*/
|
|
126
128
|
export async function buildMicronGeometryFromBufferGeometry(input) {
|
|
127
|
-
|
|
129
|
+
let source_geometry = deinterleaveBufferGeometry(input);
|
|
130
|
+
|
|
131
|
+
// merge vertices to create better connectivity
|
|
132
|
+
source_geometry = mergeVertices(source_geometry);
|
|
128
133
|
|
|
129
134
|
// build topology representation
|
|
130
135
|
const topoMesh = new TopoMesh();
|
|
@@ -138,10 +143,15 @@ export async function buildMicronGeometryFromBufferGeometry(input) {
|
|
|
138
143
|
topoMesh.build(vertex_position_array, face_index_array);
|
|
139
144
|
|
|
140
145
|
// compute aabb
|
|
141
|
-
const geometry_aabb = new AABB3();
|
|
142
|
-
aabb3_from_v3_array(geometry_aabb, vertex_position_array, vertex_position_array.length);
|
|
146
|
+
// const geometry_aabb = new AABB3();
|
|
147
|
+
// aabb3_from_v3_array(geometry_aabb, vertex_position_array, vertex_position_array.length);
|
|
148
|
+
|
|
149
|
+
// weld_duplicate_vertices(topoMesh, geometry_aabb);
|
|
150
|
+
|
|
151
|
+
debugValidateMesh(topoMesh);
|
|
143
152
|
|
|
144
|
-
expandConnectivityByLocality(topoMesh, geometry_aabb);
|
|
153
|
+
// expandConnectivityByLocality(topoMesh, geometry_aabb);
|
|
154
|
+
collapse_all_degenerate_edges(topoMesh.getEdges(), topoMesh);
|
|
145
155
|
|
|
146
156
|
// ensure faces have normals for mesh simplification
|
|
147
157
|
update_topo_face_normals(Array.from(topoMesh.getFaces()), topoMesh.getFaces().size);
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import FastBinaryHeap from "
|
|
1
|
+
import FastBinaryHeap from "../../../../../core/collection/heap/FastBinaryHeap.js";
|
|
2
2
|
import { mn_graph_collapse_weighted_edge } from "../../../../../core/graph/mn_graph_collapse_weighted_edge.js";
|
|
3
3
|
import { build_face_graph_from_mesh } from "../../../../../core/graph/build_face_graph_from_mesh.js";
|
|
4
4
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { computeMeshSurfaceArea } from "../../../geometry/computeMeshSurfaceArea.js";
|
|
2
2
|
import { BitSet } from "../../../../../core/binary/BitSet.js";
|
|
3
3
|
import { computeOpenFaceFreedom } from "./computeOpenFaceFreedom.js";
|
|
4
|
-
import FastBinaryHeap from "
|
|
4
|
+
import FastBinaryHeap from "../../../../../core/collection/heap/FastBinaryHeap.js";
|
|
5
5
|
import { PatchRepresentation } from "../PatchRepresentation.js";
|
|
6
6
|
import { MICRON_PATCH_SIZE_MAX } from "../MICRON_PATCH_SIZE_MAX.js";
|
|
7
7
|
import { populateOpenFaceNeighboursForPatch } from "./populateOpenFaceNeighboursForPatch.js";
|
|
@@ -9,7 +9,7 @@ import { update_topo_face_normals } from "../../../../../core/geom/3d/topology/u
|
|
|
9
9
|
import { computeBorderLengthChange } from "./computeBorderLengthChange.js";
|
|
10
10
|
import { sign } from "../../../../../core/math/sign.js";
|
|
11
11
|
import { vec3 } from "gl-matrix";
|
|
12
|
-
import { TopoMesh } from "../../../../../core/geom/3d/topology/TopoMesh.js";
|
|
12
|
+
import { TopoMesh } from "../../../../../core/geom/3d/topology/struct/TopoMesh.js";
|
|
13
13
|
|
|
14
14
|
const scratch_set = new Set();
|
|
15
15
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { cluster_mesh_metis } from "../../../../../core/graph/cluster_mesh_metis.js";
|
|
2
2
|
import { MICRON_PATCH_SIZE_MAX } from "../MICRON_PATCH_SIZE_MAX.js";
|
|
3
3
|
import { PatchRepresentation } from "../PatchRepresentation.js";
|
|
4
|
-
import { TopoMesh } from "../../../../../core/geom/3d/topology/TopoMesh.js";
|
|
4
|
+
import { TopoMesh } from "../../../../../core/geom/3d/topology/struct/TopoMesh.js";
|
|
5
5
|
import { assign_patch_neighbours_from_topology } from "./assign_patch_neighbours_from_topology.js";
|
|
6
6
|
|
|
7
7
|
/**
|
|
@@ -6,7 +6,9 @@ import { build_merge_graph } from "./build_merge_graph.js";
|
|
|
6
6
|
import { assign_patch_neighbours_from_topology } from "../clustering/assign_patch_neighbours_from_topology.js";
|
|
7
7
|
import { assert } from "../../../../../core/assert.js";
|
|
8
8
|
import { graph_create_off_mesh_links } from "../../../../../core/graph/build_face_graph_from_mesh.js";
|
|
9
|
-
import {
|
|
9
|
+
import {
|
|
10
|
+
build_vertex_quadratics
|
|
11
|
+
} from "../../../../../core/geom/3d/topology/simplify/quadratic/build_vertex_quadratics.js";
|
|
10
12
|
|
|
11
13
|
/**
|
|
12
14
|
*
|
|
@@ -34,6 +36,11 @@ function merge_graph_level(graph, n) {
|
|
|
34
36
|
* @type {number}
|
|
35
37
|
*/
|
|
36
38
|
const DEFAULT_MERGE_COUNT = 4;
|
|
39
|
+
/**
|
|
40
|
+
* Maximum number of patches that can be merged together
|
|
41
|
+
* @type {number}
|
|
42
|
+
*/
|
|
43
|
+
const LIMIT_MERGE_COUNT = 64;
|
|
37
44
|
|
|
38
45
|
/**
|
|
39
46
|
*
|
|
@@ -76,11 +83,12 @@ async function assemble_graph(nodes) {
|
|
|
76
83
|
for (let i = 0; i < __node_count.value; i++) {
|
|
77
84
|
const patch = __nodes[i];
|
|
78
85
|
|
|
79
|
-
build_vertex_quadratics(patch.topology_snapshot, vertex_quadratics);
|
|
86
|
+
build_vertex_quadratics({ mesh: patch.topology_snapshot, quadratics: vertex_quadratics });
|
|
80
87
|
}
|
|
81
88
|
|
|
82
89
|
|
|
83
90
|
main_loop: while (__node_count.value > 1) {
|
|
91
|
+
|
|
84
92
|
// assemble nodes into a graph
|
|
85
93
|
const leaf_cluster_weight_graph = build_merge_graph(__nodes);
|
|
86
94
|
|
|
@@ -89,7 +97,7 @@ async function assemble_graph(nodes) {
|
|
|
89
97
|
graph_create_off_mesh_links(leaf_cluster_weight_graph);
|
|
90
98
|
}
|
|
91
99
|
|
|
92
|
-
// merge graph nodes up to
|
|
100
|
+
// merge graph nodes up to X nodes per cluster
|
|
93
101
|
merge_graph_level(leaf_cluster_weight_graph, merge_count);
|
|
94
102
|
|
|
95
103
|
// assemble multi-nodes
|
|
@@ -113,6 +121,16 @@ async function assemble_graph(nodes) {
|
|
|
113
121
|
await Promise.all(__promises);
|
|
114
122
|
|
|
115
123
|
if (__node_count.value >= old_node_count) {
|
|
124
|
+
|
|
125
|
+
if (leaf_cluster_weight_graph.getNodeCount() <= 1) {
|
|
126
|
+
// graph is already merged to the maximum level
|
|
127
|
+
throw new Error(`Simplification failed, graph already at maximum coarseness`);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
if (merge_count >= LIMIT_MERGE_COUNT) {
|
|
131
|
+
throw new Error(`Exceeded merge limit(=${LIMIT_MERGE_COUNT}), attempting to merge too many patches together`);
|
|
132
|
+
}
|
|
133
|
+
|
|
116
134
|
// failed to do any merging, increase merge scope
|
|
117
135
|
merge_count *= 2;
|
|
118
136
|
|
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
//
|
|
2
2
|
|
|
3
|
-
import { TopoMesh } from "../../../../../core/geom/3d/topology/TopoMesh.js";
|
|
3
|
+
import { TopoMesh } from "../../../../../core/geom/3d/topology/struct/TopoMesh.js";
|
|
4
4
|
import { MICRON_PATCH_SIZE_MAX } from "../MICRON_PATCH_SIZE_MAX.js";
|
|
5
5
|
import { compute_set_of_shared_vertices } from "./build_intermediate_patch_topology.js";
|
|
6
6
|
import { max2 } from "../../../../../core/math/max2.js";
|
|
7
|
-
import
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
import {
|
|
11
|
-
|
|
7
|
+
import {
|
|
8
|
+
collapse_all_degenerate_edges
|
|
9
|
+
} from "../../../../../core/geom/3d/topology/simplify/collapse_all_degenerate_edges.js";
|
|
10
|
+
import {
|
|
11
|
+
deep_copy_vertex_quadratics
|
|
12
|
+
} from "../../../../../core/geom/3d/topology/simplify/quadratic/build_vertex_quadratics.js";
|
|
12
13
|
import { SquareMatrix } from "../../../../../core/graph/SquareMatrix.js";
|
|
13
14
|
import { DataType } from "../../../../../core/collection/table/DataType.js";
|
|
14
15
|
import { matrix_eigenvalues_in_place } from "../../../../../core/graph/eigen/eigen.js";
|
|
@@ -23,9 +24,19 @@ import { patch_build_parent } from "./patch_combine.js";
|
|
|
23
24
|
import { array_copy } from "../../../../../core/collection/array/copyArray.js";
|
|
24
25
|
import { ceilPowerOfTwo } from "../../../../../core/binary/operations/ceilPowerOfTwo.js";
|
|
25
26
|
import { isPowerOfTwo } from "../../../../../core/math/isPowerOrTwo.js";
|
|
26
|
-
import {
|
|
27
|
+
import {
|
|
28
|
+
computeTopoMeshBoundiningBox
|
|
29
|
+
} from "../../../../../core/geom/3d/topology/bounds/computeTopoMeshBoundiningBox.js";
|
|
27
30
|
import { AABB3 } from "../../../../../core/bvh2/aabb3/AABB3.js";
|
|
28
|
-
import {
|
|
31
|
+
import {
|
|
32
|
+
computeTopoMeshBoundingSphere
|
|
33
|
+
} from "../../../../../core/geom/3d/topology/bounds/computeTopoMeshBoundingSphere.js";
|
|
34
|
+
import { Uint32Heap } from "../../../../../core/collection/heap/Uint32Heap.js";
|
|
35
|
+
import {
|
|
36
|
+
edge_collapse_populate_heap,
|
|
37
|
+
edge_collapse_reduce_face_count
|
|
38
|
+
} from "../../../../../core/geom/3d/topology/simplify/simplifyTopoMesh2.js";
|
|
39
|
+
import { cluster_mesh_metis } from "../../../../../core/graph/cluster_mesh_metis.js";
|
|
29
40
|
|
|
30
41
|
/**
|
|
31
42
|
*
|
|
@@ -201,7 +212,7 @@ function build_graph_node_index_map(graph) {
|
|
|
201
212
|
* @param {number} per_cluster_triangle_limit
|
|
202
213
|
* @returns {TopoMesh[]}
|
|
203
214
|
*/
|
|
204
|
-
function recursive_split_mesh_partition(mesh, k, per_cluster_triangle_limit) {
|
|
215
|
+
async function recursive_split_mesh_partition(mesh, k, per_cluster_triangle_limit) {
|
|
205
216
|
if (!isPowerOfTwo(k)) {
|
|
206
217
|
throw new Error(`k must be power of two, instead was '${k}'`);
|
|
207
218
|
}
|
|
@@ -216,7 +227,7 @@ function recursive_split_mesh_partition(mesh, k, per_cluster_triangle_limit) {
|
|
|
216
227
|
for (let j = 0; j < meshes.length; j++) {
|
|
217
228
|
const topoMesh = meshes[j];
|
|
218
229
|
|
|
219
|
-
const split = partition_mesh(topoMesh, 2, merge_target);
|
|
230
|
+
const split = await partition_mesh(topoMesh, 2, merge_target);
|
|
220
231
|
|
|
221
232
|
Array.prototype.push.apply(output_meshes, split);
|
|
222
233
|
}
|
|
@@ -227,6 +238,69 @@ function recursive_split_mesh_partition(mesh, k, per_cluster_triangle_limit) {
|
|
|
227
238
|
return meshes;
|
|
228
239
|
}
|
|
229
240
|
|
|
241
|
+
/**
|
|
242
|
+
*
|
|
243
|
+
* @param {TopoMesh} mesh
|
|
244
|
+
* @param {number} k
|
|
245
|
+
* @param {number} per_cluster_triangle_limit
|
|
246
|
+
* @returns {TopoMesh[]}
|
|
247
|
+
*/
|
|
248
|
+
async function partition_mesh_advanced(mesh, k, per_cluster_triangle_limit) {
|
|
249
|
+
const metis_result = await partition_mesh_metis(mesh, k, per_cluster_triangle_limit);
|
|
250
|
+
|
|
251
|
+
if (metis_result !== undefined) {
|
|
252
|
+
return metis_result;
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
// fallback
|
|
256
|
+
return recursive_split_mesh_partition(mesh, k, per_cluster_triangle_limit);
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
/**
|
|
260
|
+
*
|
|
261
|
+
* @param {TopoMesh} mesh
|
|
262
|
+
* @param {number} k
|
|
263
|
+
* @param {number} per_cluster_triangle_limit
|
|
264
|
+
* @returns {TopoMesh[]|undefined} Either returns the desired partitioning, or undefined in case of failure
|
|
265
|
+
*/
|
|
266
|
+
async function partition_mesh_metis(mesh, k, per_cluster_triangle_limit) {
|
|
267
|
+
|
|
268
|
+
const input_face_count = mesh.getFaces().size;
|
|
269
|
+
const face_array = Array.from(mesh.getFaces());
|
|
270
|
+
|
|
271
|
+
const partitioning = new Uint32Array(input_face_count);
|
|
272
|
+
|
|
273
|
+
const cluster_count = await cluster_mesh_metis(partitioning, mesh, per_cluster_triangle_limit);
|
|
274
|
+
|
|
275
|
+
if (cluster_count !== k) {
|
|
276
|
+
return undefined;
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
|
|
280
|
+
const result = [];
|
|
281
|
+
const vertexMaps = [];
|
|
282
|
+
|
|
283
|
+
for (let i = 0; i < cluster_count; i++) {
|
|
284
|
+
result[i] = new TopoMesh();
|
|
285
|
+
vertexMaps[i] = new Map();
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
for (let i = 0; i < input_face_count; i++) {
|
|
289
|
+
|
|
290
|
+
const triangle = face_array[i];
|
|
291
|
+
|
|
292
|
+
const partition_index = partitioning[i];
|
|
293
|
+
|
|
294
|
+
const patition_mesh = result[partition_index];
|
|
295
|
+
const vertexMap = vertexMaps[partition_index];
|
|
296
|
+
|
|
297
|
+
patition_mesh.addFaceCopy(triangle, vertexMap)
|
|
298
|
+
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
return result;
|
|
302
|
+
}
|
|
303
|
+
|
|
230
304
|
/**
|
|
231
305
|
*
|
|
232
306
|
* @param {TopoMesh} mesh
|
|
@@ -374,38 +448,19 @@ async function many_to_many_merge(
|
|
|
374
448
|
// simplify topology
|
|
375
449
|
if (num_desired_faces_to_remove > 0) {
|
|
376
450
|
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
const edge_to_collapse_map = new Map();
|
|
388
|
-
|
|
389
|
-
build_edge_collapse_candidates(
|
|
390
|
-
merged_mesh,
|
|
391
|
-
open_set,
|
|
392
|
-
edge_to_collapse_map,
|
|
393
|
-
vertex_quadratics,
|
|
394
|
-
restricted_vertices
|
|
395
|
-
);
|
|
396
|
-
|
|
397
|
-
// execute mesh simplification
|
|
398
|
-
|
|
399
|
-
collapse_edges(
|
|
400
|
-
num_desired_faces_to_remove,
|
|
401
|
-
open_set,
|
|
402
|
-
merged_mesh,
|
|
403
|
-
edge_to_collapse_map,
|
|
404
|
-
vertex_quadratics,
|
|
405
|
-
restricted_vertices
|
|
406
|
-
);
|
|
451
|
+
const heap = new Uint32Heap(merged_mesh.getEdges().size);
|
|
452
|
+
const edge_lookup = new Map();
|
|
453
|
+
|
|
454
|
+
// debugValidateMesh(merged_mesh);
|
|
455
|
+
|
|
456
|
+
edge_collapse_populate_heap(merged_mesh.getEdges(), restricted_vertices, heap, vertex_quadratics, edge_lookup);
|
|
457
|
+
edge_collapse_reduce_face_count(merged_mesh, num_desired_faces_to_remove, heap, edge_lookup, restricted_vertices, vertex_quadratics);
|
|
458
|
+
|
|
459
|
+
// debugValidateMesh(merged_mesh);
|
|
460
|
+
|
|
407
461
|
collapse_all_degenerate_edges(merged_mesh.getEdges(), merged_mesh);
|
|
408
462
|
|
|
463
|
+
// debugValidateMesh(merged_mesh);
|
|
409
464
|
|
|
410
465
|
const merged_mesh_face_count = merged_mesh.getFaces().size;
|
|
411
466
|
|
|
@@ -464,13 +519,11 @@ async function many_to_many_merge(
|
|
|
464
519
|
// const group_per_pixel_error = Math.sqrt(largest_squared_error);
|
|
465
520
|
|
|
466
521
|
// split topology into desired number of pieces
|
|
467
|
-
const pieces =
|
|
522
|
+
const pieces = await partition_mesh_advanced(merged_mesh, actual_up_count, MICRON_PATCH_SIZE_MAX);
|
|
468
523
|
|
|
469
524
|
for (let i = 0; i < actual_up_count; i++) {
|
|
470
525
|
const rep = patch_build_parent(nodes);
|
|
471
526
|
|
|
472
|
-
// TODO we can be more deliberate in child assignment, partitions can be such that a new patch doesn't overlap with one of the original children
|
|
473
|
-
|
|
474
527
|
const piece_mesh = pieces[i];
|
|
475
528
|
|
|
476
529
|
rep.topology_snapshot = piece_mesh;
|
|
@@ -1,13 +1,19 @@
|
|
|
1
1
|
import { array_push_if_unique } from "../../../../../core/collection/array/array_push_if_unique.js";
|
|
2
|
-
import FastBinaryHeap from "
|
|
3
|
-
import {
|
|
2
|
+
import FastBinaryHeap from "../../../../../core/collection/heap/FastBinaryHeap.js";
|
|
3
|
+
import {
|
|
4
|
+
build_vertex_quadratics
|
|
5
|
+
} from "../../../../../core/geom/3d/topology/simplify/quadratic/build_vertex_quadratics.js";
|
|
4
6
|
import { compute_set_of_border_vertex_indices } from "./build_intermediate_patch_topology.js";
|
|
5
7
|
import { compute_patches_shared_vertices } from "./compute_patches_shared_vertices.js";
|
|
6
8
|
import { max2 } from "../../../../../core/math/max2.js";
|
|
7
9
|
import { MICRON_PATCH_SIZE_MAX } from "../MICRON_PATCH_SIZE_MAX.js";
|
|
8
10
|
import { collapse_edges, extract_edge_cost } from "../../../../../core/geom/3d/topology/simplify/simplifyTopoMesh.js";
|
|
9
|
-
import {
|
|
10
|
-
|
|
11
|
+
import {
|
|
12
|
+
build_edge_collapse_candidates
|
|
13
|
+
} from "../../../../../core/geom/3d/topology/simplify/build_edge_collapse_candidates.js";
|
|
14
|
+
import {
|
|
15
|
+
collapse_all_degenerate_edges
|
|
16
|
+
} from "../../../../../core/geom/3d/topology/simplify/collapse_all_degenerate_edges.js";
|
|
11
17
|
import { compute_set_intersection } from "../../../../../core/collection/set/compute_set_intersection.js";
|
|
12
18
|
|
|
13
19
|
/**
|
|
@@ -334,7 +340,7 @@ export function build_simplified_clusters(root, mesh) {
|
|
|
334
340
|
*/
|
|
335
341
|
const vertex_quadratics = new Map();
|
|
336
342
|
|
|
337
|
-
build_vertex_quadratics(mesh, vertex_quadratics);
|
|
343
|
+
build_vertex_quadratics({ mesh: mesh, quadratics: vertex_quadratics });
|
|
338
344
|
|
|
339
345
|
let total_relaxed_vertex_count = 0;
|
|
340
346
|
let rejection_count_shared_vertices = 0;
|
|
@@ -1,12 +1,33 @@
|
|
|
1
1
|
import { MicronGeometryPatchOccurrence } from "./MicronGeometryPatchOccurance.js";
|
|
2
|
+
import { max3 } from "../../../../core/math/max3.js";
|
|
3
|
+
|
|
4
|
+
const DEFAULT_CAPACITY = 10000;
|
|
5
|
+
/**
|
|
6
|
+
*
|
|
7
|
+
* @type {number}
|
|
8
|
+
*/
|
|
9
|
+
const CAPACITY_GROW_FACTOR = 1.2;
|
|
10
|
+
/**
|
|
11
|
+
*
|
|
12
|
+
* @type {number}
|
|
13
|
+
*/
|
|
14
|
+
const CAPACITY_GROW_MIN_STEP = 64;
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Number of words making up a single patch element
|
|
18
|
+
* @type {number}
|
|
19
|
+
*/
|
|
20
|
+
const PATCH_WORD_COUNT = 3;
|
|
2
21
|
|
|
3
22
|
export class VirtualGeometry {
|
|
4
23
|
constructor() {
|
|
24
|
+
this.__capacity = DEFAULT_CAPACITY;
|
|
5
25
|
/**
|
|
6
26
|
* pack patch instance as [INSTANCE_ID, GEOMETRY_ID, PATCH_ID]
|
|
7
27
|
* @type {number[]}
|
|
8
28
|
*/
|
|
9
|
-
this.patches = new Uint32Array(
|
|
29
|
+
this.patches = new Uint32Array(this.__capacity * PATCH_WORD_COUNT);
|
|
30
|
+
|
|
10
31
|
|
|
11
32
|
/**
|
|
12
33
|
*
|
|
@@ -36,6 +57,28 @@ export class VirtualGeometry {
|
|
|
36
57
|
this.stats_source_byte_size = 0;
|
|
37
58
|
}
|
|
38
59
|
|
|
60
|
+
ensureCapacity(patch_count) {
|
|
61
|
+
if (this.__capacity < patch_count) {
|
|
62
|
+
const new_capacity = Math.ceil(max3(
|
|
63
|
+
patch_count,
|
|
64
|
+
patch_count * CAPACITY_GROW_FACTOR,
|
|
65
|
+
patch_count + CAPACITY_GROW_MIN_STEP
|
|
66
|
+
));
|
|
67
|
+
|
|
68
|
+
const new_array = new Uint32Array(new_capacity * PATCH_WORD_COUNT);
|
|
69
|
+
|
|
70
|
+
new_array.set(this.patches);
|
|
71
|
+
|
|
72
|
+
this.patches = new_array;
|
|
73
|
+
|
|
74
|
+
this.__capacity = new_capacity;
|
|
75
|
+
|
|
76
|
+
return false;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
return true;
|
|
80
|
+
}
|
|
81
|
+
|
|
39
82
|
resetStats() {
|
|
40
83
|
this.stats_instance_count = 0;
|
|
41
84
|
this.stats_source_triangle_count = 0;
|
|
@@ -53,7 +96,7 @@ export class VirtualGeometry {
|
|
|
53
96
|
const patches = this.patches;
|
|
54
97
|
|
|
55
98
|
for (let i = 0; i < patch_count; i++) {
|
|
56
|
-
const i3 = i *
|
|
99
|
+
const i3 = i * PATCH_WORD_COUNT;
|
|
57
100
|
|
|
58
101
|
const geometry_id = patches[i3 + 1];
|
|
59
102
|
const patch_id = patches[i3 + 2];
|
|
@@ -77,7 +120,7 @@ export class VirtualGeometry {
|
|
|
77
120
|
const patch_count = this.patch_count;
|
|
78
121
|
const patches = this.patches;
|
|
79
122
|
for (let i = 0; i < patch_count; i++) {
|
|
80
|
-
const i3 = i *
|
|
123
|
+
const i3 = i * PATCH_WORD_COUNT;
|
|
81
124
|
|
|
82
125
|
const geometry_id = patches[i3 + 1];
|
|
83
126
|
const patch_id = patches[i3 + 2];
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
//
|
|
2
2
|
|
|
3
|
-
import BinaryHeap from "
|
|
3
|
+
import BinaryHeap from "../../../../core/collection/heap/FastBinaryHeap.js";
|
|
4
4
|
import { BufferAttribute, BufferGeometry } from "three";
|
|
5
5
|
import { UintArrayForCount } from "../../../../core/collection/array/typed/uint_array_for_count.js";
|
|
6
|
-
import {
|
|
6
|
+
import {
|
|
7
|
+
compute_typed_array_constructor_from_data_type
|
|
8
|
+
} from "../../../../core/collection/table/DataType2TypedArrayConstructorMapping.js";
|
|
7
9
|
import { BitSet } from "../../../../core/binary/BitSet.js";
|
|
8
10
|
import { min2 } from "../../../../core/math/min2.js";
|
|
9
11
|
import { max2 } from "../../../../core/math/max2.js";
|
|
@@ -46,9 +46,13 @@ import { StaticMaterialCache } from "../../asset/loaders/material/StaticMaterial
|
|
|
46
46
|
import convertSampler2D2Canvas from "../texture/sampler/Sampler2D2Canvas.js";
|
|
47
47
|
import { CanvasView } from "../../../view/elements/CanvasView.js";
|
|
48
48
|
import { Sampler2D } from "../texture/sampler/Sampler2D.js";
|
|
49
|
-
import {
|
|
49
|
+
import { sampler2D_scale_down_linear } from "../texture/sampler/sampler2D_scale_down_linear.js";
|
|
50
50
|
import { ShadowMapRenderer } from "../shadows/ShadowMapRenderer.js";
|
|
51
51
|
import { mat4 } from "gl-matrix";
|
|
52
|
+
import { seededRandom } from "../../../core/math/random/seededRandom.js";
|
|
53
|
+
import { Color } from "../../../core/color/Color.js";
|
|
54
|
+
|
|
55
|
+
document.body.style.margin = 0;
|
|
52
56
|
|
|
53
57
|
const background = new TextureLoader().load('data/textures/utility/checkers_white_grey_256x256.png');
|
|
54
58
|
background.repeat.set(50, 30);
|
|
@@ -129,7 +133,7 @@ function debug_shadow_map() {
|
|
|
129
133
|
|
|
130
134
|
const resampled = Sampler2D.uint8(4, 512, 512);
|
|
131
135
|
|
|
132
|
-
|
|
136
|
+
sampler2D_scale_down_linear(sampler, resampled);
|
|
133
137
|
|
|
134
138
|
convertSampler2D2Canvas(resampled, 1, 0, cv.el);
|
|
135
139
|
|
|
@@ -148,7 +152,7 @@ const orbitControls = new OrbitControls(camera, container);
|
|
|
148
152
|
|
|
149
153
|
animate();
|
|
150
154
|
|
|
151
|
-
async function micron_add_object(object) {
|
|
155
|
+
async function micron_add_object(object, random_color = false) {
|
|
152
156
|
object.traverse(t => {
|
|
153
157
|
t.castShadow = true;
|
|
154
158
|
t.receiveShadow = true;
|
|
@@ -179,6 +183,26 @@ async function micron_add_object(object) {
|
|
|
179
183
|
}
|
|
180
184
|
});
|
|
181
185
|
|
|
186
|
+
if (random_color) {
|
|
187
|
+
const random = seededRandom(7);
|
|
188
|
+
|
|
189
|
+
const color = new Color();
|
|
190
|
+
|
|
191
|
+
object.traverse(t => {
|
|
192
|
+
if (t.isMesh && t.material !== null) {
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
color.setHSV(random(), 1, 1);
|
|
196
|
+
|
|
197
|
+
t.material = new MeshStandardMaterial({
|
|
198
|
+
color: color.toUint()
|
|
199
|
+
});
|
|
200
|
+
|
|
201
|
+
}
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
|
|
182
206
|
object.traverse(t => {
|
|
183
207
|
if (t.isMesh && t.material !== null) {
|
|
184
208
|
|
|
@@ -279,6 +303,7 @@ function init() {
|
|
|
279
303
|
wireframe: false,
|
|
280
304
|
side: FrontSide,
|
|
281
305
|
color: 0xffffff
|
|
306
|
+
// color: 0x000000
|
|
282
307
|
});
|
|
283
308
|
|
|
284
309
|
//
|
|
@@ -310,7 +335,7 @@ function init() {
|
|
|
310
335
|
build_stats();
|
|
311
336
|
|
|
312
337
|
function sample_square() {
|
|
313
|
-
const geometry = new PlaneBufferGeometry(1, 1,
|
|
338
|
+
const geometry = new PlaneBufferGeometry(1, 1, 100, 100);
|
|
314
339
|
|
|
315
340
|
const m = new Matrix4();
|
|
316
341
|
|
|
@@ -351,6 +376,15 @@ function init() {
|
|
|
351
376
|
});
|
|
352
377
|
}
|
|
353
378
|
|
|
379
|
+
function sample_isiflow_floor() {
|
|
380
|
+
const loader = new PLYLoader();
|
|
381
|
+
loader.load("moicon/isiflow_Oct_15_21/0/floor_01.ply", function (geometry) {
|
|
382
|
+
|
|
383
|
+
createScene(geometry, cubeMaterial1, 1.5);
|
|
384
|
+
|
|
385
|
+
});
|
|
386
|
+
}
|
|
387
|
+
|
|
354
388
|
function sample_lucy_28m() {
|
|
355
389
|
const loader = new PLYLoader();
|
|
356
390
|
loader.load("data/models/stanford/lucy.ply", function (geometry) {
|
|
@@ -409,7 +443,7 @@ function init() {
|
|
|
409
443
|
t.receiveShadow = true;
|
|
410
444
|
})
|
|
411
445
|
|
|
412
|
-
const r = await micron_add_object(object);
|
|
446
|
+
const r = await micron_add_object(object, false);
|
|
413
447
|
// scene.add(object);
|
|
414
448
|
|
|
415
449
|
|
|
@@ -463,16 +497,13 @@ function init() {
|
|
|
463
497
|
|
|
464
498
|
// sample_gltf_sponza();
|
|
465
499
|
// gltf_sample('data/models/RTS_Buildings_Humans/18/Building_R_18_out/Building_R_18.gltf');
|
|
466
|
-
sample_lucy();
|
|
467
500
|
// sample_dragon();
|
|
468
501
|
// sample_gltf_hapro_2();
|
|
469
502
|
// sample_gltf_hapro_1();
|
|
470
503
|
// sample_gltf_broken_isiflow();
|
|
471
|
-
// gltf_grid('data/models/moicon/Kople/EVCharger1.gltf');
|
|
472
504
|
// gltf_grid('data/models/RTS_Buildings_Humans/18/Building_R_18_out/Building_R_18.gltf');
|
|
473
505
|
// gltf_sample('moicon/08-clickable-assets/model.gltf');
|
|
474
506
|
// gltf_sample('moicon/05-ground-floor/model.gltf');
|
|
475
|
-
// gltf_sample('data/models/moicon/isiflow_Oct_15_21/0/model.gltf');
|
|
476
507
|
// gltf_sample('moicon/29_Dec_2021_Nammo/1/model.gltf');
|
|
477
508
|
// gltf_sample('moicon/29_Dec_2021_Nammo/1-onematerial/model.gltf');
|
|
478
509
|
// gltf_sample('moicon/29_Dec_2021_Nammo/2/model.gltf');
|
|
@@ -484,8 +515,14 @@ function init() {
|
|
|
484
515
|
// gltf_sample('moicon/03_Jan_22_Demo/worker_test/model.gltf');
|
|
485
516
|
// gltf_sample('moicon/A4/A4/model.gltf');
|
|
486
517
|
// gltf_sample('moicon/06_04_hapro/08-clickable-assets-new/model.gltf');
|
|
487
|
-
// gltf_sample('moicon/ztest_object_many_pieces/model.gltf');
|
|
488
518
|
// gltf_grid('moicon/ztest_object_many_pieces/model.gltf', 3, 3);
|
|
519
|
+
gltf_sample('moicon/ztest_object_many_pieces/model.gltf');
|
|
520
|
+
// gltf_grid('data/models/moicon/Kople/EVCharger1.gltf');
|
|
521
|
+
// gltf_sample('data/models/moicon/Kople/EVCharger1.gltf');
|
|
522
|
+
// gltf_sample('data/models/moicon/isiflow_Oct_15_21/0/model.gltf');
|
|
523
|
+
// sample_lucy();
|
|
524
|
+
// sample_square();
|
|
525
|
+
// sample_isiflow_floor();
|
|
489
526
|
|
|
490
527
|
document.addEventListener("mousemove", onDocumentMouseMove);
|
|
491
528
|
|
|
@@ -557,7 +594,7 @@ function createScene(geometry, m1, scale) {
|
|
|
557
594
|
geometry.computeVertexNormals();
|
|
558
595
|
|
|
559
596
|
|
|
560
|
-
const grid_size =
|
|
597
|
+
const grid_size = 1;
|
|
561
598
|
const grid_spacing = 2000;
|
|
562
599
|
|
|
563
600
|
for (let i = 0; i < grid_size; i++) {
|