@woosh/meep-engine 2.48.20 → 2.48.22
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/package.json +1 -1
- package/src/{engine/graphics/micron/build/clustering → core/geom/3d/topology/util}/compute_face_connection_weight.js +40 -35
- package/src/core/graph/build_face_graph_from_mesh.js +1 -1
- package/src/engine/graphics/ecs/mesh-v2/sample/load_gltf.js +0 -3
- package/src/engine/graphics/micron/MICRON_GEOMETRY_FIELD.js +0 -1
- package/src/engine/graphics/micron/MICRON_URI_FIELD.js +0 -1
- package/src/engine/graphics/micron/build/MICRON_PATCH_SIZE_MAX.js +0 -5
- package/src/engine/graphics/micron/build/PatchRepresentation.js +0 -424
- package/src/engine/graphics/micron/build/buildMicronGeometryFromBufferGeometry.js +0 -311
- package/src/engine/graphics/micron/build/build_geometry_info.js +0 -21
- package/src/engine/graphics/micron/build/clustering/assignInitialPatchNeighbours.js +0 -63
- package/src/engine/graphics/micron/build/clustering/assign_patch_neighbours_from_topology.js +0 -46
- package/src/engine/graphics/micron/build/clustering/build_clustering_2.js +0 -37
- package/src/engine/graphics/micron/build/clustering/build_leaf_patches.js +0 -326
- package/src/engine/graphics/micron/build/clustering/build_leaf_patches_metis.js +0 -76
- package/src/engine/graphics/micron/build/clustering/computeBorderLengthChange.js +0 -59
- package/src/engine/graphics/micron/build/clustering/computeFaceCurvatureScore.js +0 -57
- package/src/engine/graphics/micron/build/clustering/computeOpenFaceFreedom.js +0 -35
- package/src/engine/graphics/micron/build/clustering/populateOpenFaceNeighboursForPatch.js +0 -56
- package/src/engine/graphics/micron/build/clustering/validate_leaf_patch_connectivity.js +0 -44
- package/src/engine/graphics/micron/build/compute_micron_buffer_array_constructor.js +0 -24
- package/src/engine/graphics/micron/build/compute_vertex_remap_cost.js +0 -29
- package/src/engine/graphics/micron/build/debug/build_clustering_info.js +0 -58
- package/src/engine/graphics/micron/build/debug/build_graph_info.js +0 -59
- package/src/engine/graphics/micron/build/fill_patch_geometry_data.js +0 -270
- package/src/engine/graphics/micron/build/hierarchy/buildAbstractPatchHierarchy.js +0 -196
- package/src/engine/graphics/micron/build/hierarchy/build_intermediate_patch_topology.js +0 -162
- package/src/engine/graphics/micron/build/hierarchy/build_merge_graph.js +0 -89
- package/src/engine/graphics/micron/build/hierarchy/computePatchMergeScore.js +0 -146
- package/src/engine/graphics/micron/build/hierarchy/compute_patches_shared_vertex_count.js +0 -32
- package/src/engine/graphics/micron/build/hierarchy/compute_patches_shared_vertices.js +0 -34
- package/src/engine/graphics/micron/build/hierarchy/merge_patches.js +0 -581
- package/src/engine/graphics/micron/build/hierarchy/metis_cluster_clusters.js +0 -53
- package/src/engine/graphics/micron/build/hierarchy/optimize_graph_partitioning_balance.js +0 -515
- package/src/engine/graphics/micron/build/hierarchy/patch_combine.js +0 -180
- package/src/engine/graphics/micron/build/hierarchy/patch_fill_holes_by_uncollapse.js +0 -60
- package/src/engine/graphics/micron/build/hierarchy/patch_stitch_parent_border.js +0 -320
- package/src/engine/graphics/micron/build/hierarchy/qvdr_build_simplified_clusters.js +0 -547
- package/src/engine/graphics/micron/build/hierarchy/qvdr_build_tree.js +0 -140
- package/src/engine/graphics/micron/buildPatchwork.js +0 -68
- package/src/engine/graphics/micron/convert_three_object_to_micron.js +0 -179
- package/src/engine/graphics/micron/debug/VirtualGeometryStats.js +0 -42
- package/src/engine/graphics/micron/format/MICRON_GEOMETRY_PROPERTY_NAME.js +0 -1
- package/src/engine/graphics/micron/format/MicronGeometry.d.ts +0 -21
- package/src/engine/graphics/micron/format/MicronGeometry.js +0 -334
- package/src/engine/graphics/micron/format/MicronGeometryPatch.d.ts +0 -3
- package/src/engine/graphics/micron/format/MicronGeometryPatch.js +0 -205
- package/src/engine/graphics/micron/format/MicronGeometryPatchOccurance.js +0 -50
- package/src/engine/graphics/micron/format/ThreeMicronMesh.d.ts +0 -10
- package/src/engine/graphics/micron/format/ThreeMicronMesh.js +0 -45
- package/src/engine/graphics/micron/format/VirtualGeometry.js +0 -158
- package/src/engine/graphics/micron/format/micron_build_proxy_geometry.js +0 -205
- package/src/engine/graphics/micron/format/serialization/MicronGeometryBinarySerializationAdapter.js +0 -123
- package/src/engine/graphics/micron/format/serialization/MicronGeometryBinarySerializationAdapter.spec.js +0 -63
- package/src/engine/graphics/micron/format/serialization/collection/geometry_collection_serialization.js +0 -83
- package/src/engine/graphics/micron/format/serialization/collection/geometry_collection_serialization.spec.js +0 -51
- package/src/engine/graphics/micron/format/serialization/deserialize_attribute_spec.js +0 -25
- package/src/engine/graphics/micron/format/serialization/deserialize_patch.js +0 -106
- package/src/engine/graphics/micron/format/serialization/serialize_attribute_spec.js +0 -18
- package/src/engine/graphics/micron/format/serialization/serialize_patch.js +0 -84
- package/src/engine/graphics/micron/format/validate_patch_bounds.js +0 -69
- package/src/engine/graphics/micron/plugin/GLTFAssetTransformer.js +0 -265
- package/src/engine/graphics/micron/plugin/GLTF_MICRON_ID_FIELD.js +0 -5
- package/src/engine/graphics/micron/plugin/MicronRenderPlugin.d.ts +0 -8
- package/src/engine/graphics/micron/plugin/MicronRenderPlugin.js +0 -150
- package/src/engine/graphics/micron/plugin/serialization/BufferGeometrySerializationAdapter.js +0 -176
- package/src/engine/graphics/micron/plugin/shaded_geometry/MicronShadedGeometryRenderAdapter.js +0 -216
- package/src/engine/graphics/micron/prototypeMicronProxyBuild.js +0 -227
- package/src/engine/graphics/micron/prototypeVirtualGeometry.js +0 -911
- package/src/engine/graphics/micron/render/PatchCacheKey.js +0 -79
- package/src/engine/graphics/micron/render/VIRTUAL_MESH_FLAG.d.ts +0 -1
- package/src/engine/graphics/micron/render/VIRTUAL_MESH_FLAG.js +0 -1
- package/src/engine/graphics/micron/render/VirtualGeometryBuilder.js +0 -207
- package/src/engine/graphics/micron/render/approximateTriangleArea.js +0 -25
- package/src/engine/graphics/micron/render/culling/PatchCullingSystem.js +0 -129
- package/src/engine/graphics/micron/render/instanced/PatchDataTextures.js +0 -329
- package/src/engine/graphics/micron/render/instanced/ThreeInstancedAdapter.js +0 -175
- package/src/engine/graphics/micron/render/instanced/shader/constants.js +0 -3
- package/src/engine/graphics/micron/render/instanced/shader/gen_micron_vertex_attribute_texture_name.js +0 -8
- package/src/engine/graphics/micron/render/instanced/shader/shader_rewrite_standard.js +0 -250
- package/src/engine/graphics/micron/render/makeThreeMeshFromVirtualGeometry.js +0 -37
- package/src/engine/graphics/micron/render/refinement/ActivePatchFlags.js +0 -8
- package/src/engine/graphics/micron/render/refinement/ActivePatchList.js +0 -241
- package/src/engine/graphics/micron/render/refinement/ActivePatchRecord.js +0 -154
- package/src/engine/graphics/micron/render/refinement/RefinementSpec.js +0 -84
- package/src/engine/graphics/micron/render/refinement/get_geometry_patch_cut.js +0 -133
- package/src/engine/graphics/micron/render/refinement/is_patch_facing_back.js +0 -43
- package/src/engine/graphics/micron/render/refinement/is_patch_visible.js +0 -37
- package/src/engine/graphics/micron/render/v1/MaterialContext.js +0 -150
- package/src/engine/graphics/micron/render/v1/MaterialVertexSpec.js +0 -115
- package/src/engine/graphics/micron/render/v1/MicronRenderContext.js +0 -145
- package/src/engine/graphics/micron/render/v1/ThreeVirtualGeometryAdapter.js +0 -255
- package/src/engine/graphics/micron/render/v1/VGThreeRenderer.js +0 -142
- package/src/engine/graphics/micron/render/v1/getTransformedPositionsCached.js +0 -54
- package/src/engine/graphics/micron/simplifyGeometry.js +0 -26
- package/src/engine/graphics/micron/util/patchToBufferGeometry.js +0 -19
|
@@ -1,162 +0,0 @@
|
|
|
1
|
-
import { simplifyTopoMesh } from "../../../../../core/geom/3d/topology/simplify/simplifyTopoMesh.js";
|
|
2
|
-
import { MICRON_PATCH_SIZE_MAX } from "../MICRON_PATCH_SIZE_MAX.js";
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
*
|
|
7
|
-
* @param {Set<number>} result
|
|
8
|
-
* @param {TopoMesh} topology
|
|
9
|
-
* @param {PatchRepresentation[]} cluster_nodes
|
|
10
|
-
*/
|
|
11
|
-
export function compute_set_of_shared_vertices(result, topology, cluster_nodes) {
|
|
12
|
-
// build outer neighbour set
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
*
|
|
16
|
-
* @type {Set<PatchRepresentation>}
|
|
17
|
-
*/
|
|
18
|
-
const outer_neighbours = new Set();
|
|
19
|
-
|
|
20
|
-
const cluster_node_count = cluster_nodes.length;
|
|
21
|
-
for (let i = 0; i < cluster_node_count; i++) {
|
|
22
|
-
const node = cluster_nodes[i];
|
|
23
|
-
|
|
24
|
-
const node_neighbours = node.neighbours;
|
|
25
|
-
const node_neighbour_count = node_neighbours.length;
|
|
26
|
-
for (let j = 0; j < node_neighbour_count; j++) {
|
|
27
|
-
const neighbour = node_neighbours[j];
|
|
28
|
-
|
|
29
|
-
if (cluster_nodes.indexOf(neighbour) !== -1) {
|
|
30
|
-
// not an outer neighbour
|
|
31
|
-
continue;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
outer_neighbours.add(neighbour);
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
// ingest topology vertices into a set for quick access
|
|
39
|
-
const topo_vertices = new Set();
|
|
40
|
-
const vertices = topology.vertices;
|
|
41
|
-
const topo_vertex_count = vertices.length;
|
|
42
|
-
for (let i = 0; i < topo_vertex_count; i++) {
|
|
43
|
-
const vertex = vertices[i];
|
|
44
|
-
|
|
45
|
-
topo_vertices.add(vertex.index);
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
// identify border vertices
|
|
49
|
-
for (const outerNeighbour of outer_neighbours) {
|
|
50
|
-
const neighbour_topo = outerNeighbour.topology_snapshot;
|
|
51
|
-
|
|
52
|
-
const n_vx = neighbour_topo.vertices;
|
|
53
|
-
const n_vx_count = n_vx.length;
|
|
54
|
-
|
|
55
|
-
for (let i = 0; i < n_vx_count; i++) {
|
|
56
|
-
const v = n_vx[i];
|
|
57
|
-
|
|
58
|
-
const vi = v.index;
|
|
59
|
-
|
|
60
|
-
if (topo_vertices.has(vi)) {
|
|
61
|
-
result.add(vi);
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
/**
|
|
68
|
-
*
|
|
69
|
-
* @param {Set<number>} result
|
|
70
|
-
* @param {TopoMesh} topology
|
|
71
|
-
*/
|
|
72
|
-
export function compute_set_of_border_vertex_indices(result, topology) {
|
|
73
|
-
const edges = topology.getEdges();
|
|
74
|
-
|
|
75
|
-
for (let edge of edges) {
|
|
76
|
-
const faces = edge.faces;
|
|
77
|
-
let included_face_count = 0;
|
|
78
|
-
|
|
79
|
-
if (!edge.isLinked()) {
|
|
80
|
-
// edge was removed
|
|
81
|
-
continue;
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
const face_count = faces.length;
|
|
85
|
-
for (let i = 0; i < face_count; i++) {
|
|
86
|
-
const face = faces[i];
|
|
87
|
-
|
|
88
|
-
if (topology.containsFace(face)) {
|
|
89
|
-
included_face_count++;
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
if (included_face_count <= 1) {
|
|
94
|
-
const v0 = edge.v0;
|
|
95
|
-
result.add(v0.index);
|
|
96
|
-
|
|
97
|
-
const v1 = edge.v1;
|
|
98
|
-
result.add(v1.index);
|
|
99
|
-
//
|
|
100
|
-
// if (!topology.containsVertex(v0) || !topology.containsVertex(v1)) {
|
|
101
|
-
//
|
|
102
|
-
// console.log(edge);
|
|
103
|
-
// debugger;
|
|
104
|
-
// }
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
/**
|
|
110
|
-
*
|
|
111
|
-
* @param {TopoMesh} result
|
|
112
|
-
* @param {TopoMesh} a
|
|
113
|
-
* @param {TopoMesh} b
|
|
114
|
-
*/
|
|
115
|
-
export function compute_merged_topology(result, a, b) {
|
|
116
|
-
|
|
117
|
-
/**
|
|
118
|
-
*
|
|
119
|
-
* @type {Map<number, TopoVertex>}
|
|
120
|
-
*/
|
|
121
|
-
const vertex_index_map = new Map();
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
// accumulate topology
|
|
125
|
-
result._addWithVertexMap(a, vertex_index_map);
|
|
126
|
-
result._addWithVertexMap(b, vertex_index_map);
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
/**
|
|
130
|
-
*
|
|
131
|
-
* @param {PatchRepresentation} patch
|
|
132
|
-
*/
|
|
133
|
-
export function build_intermediate_patch_topology(patch) {
|
|
134
|
-
// figure out if patches are connected
|
|
135
|
-
const a = patch.children[0];
|
|
136
|
-
const b = patch.children[1];
|
|
137
|
-
|
|
138
|
-
// const children_connected = a.hasNeighbour(b);
|
|
139
|
-
|
|
140
|
-
compute_merged_topology(patch.topology_mask, a.topology_mask, b.topology_mask);
|
|
141
|
-
|
|
142
|
-
// r.traverse(p =>{
|
|
143
|
-
// if(p.lod === 0){
|
|
144
|
-
// r.topology._addWithVertexMap(p.topology,vertex_index_map);
|
|
145
|
-
// }
|
|
146
|
-
// });
|
|
147
|
-
|
|
148
|
-
const restricted_vertices = new Set();
|
|
149
|
-
|
|
150
|
-
compute_set_of_border_vertex_indices(restricted_vertices, patch.topology_mask);
|
|
151
|
-
|
|
152
|
-
// remove discontinuities. move vertices in A to match B
|
|
153
|
-
// apply_collapsed_edges(b.simplified_points, r.topology);
|
|
154
|
-
|
|
155
|
-
// debugValidateMesh(r.topology);
|
|
156
|
-
|
|
157
|
-
simplifyTopoMesh(patch.topology_mask, MICRON_PATCH_SIZE_MAX, restricted_vertices);
|
|
158
|
-
|
|
159
|
-
// build mapping for simplified points
|
|
160
|
-
// build_vertex_mapping_from_simplification(patch.simplified_points, patch.reverse_simplified_points, patch.collapsed_edges);
|
|
161
|
-
|
|
162
|
-
}
|
|
@@ -1,89 +0,0 @@
|
|
|
1
|
-
import { Graph } from "../../../../../core/graph/v2/Graph.js";
|
|
2
|
-
import { MultiNode } from "../../../../../core/graph/MultiNode.js";
|
|
3
|
-
import { computePatchMergeScore } from "./computePatchMergeScore.js";
|
|
4
|
-
import { WeightedEdge } from "../../../../../core/graph/WeightedEdge.js";
|
|
5
|
-
import { assert } from "../../../../../core/assert.js";
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
*
|
|
9
|
-
* @param {PatchRepresentation[]} leaves
|
|
10
|
-
* @returns {Graph<MultiNode<PatchRepresentation>>}
|
|
11
|
-
*/
|
|
12
|
-
export function build_merge_graph(leaves) {
|
|
13
|
-
/**
|
|
14
|
-
*
|
|
15
|
-
* @type {Graph<MultiNode<PatchRepresentation>>}
|
|
16
|
-
*/
|
|
17
|
-
const graph = new Graph();
|
|
18
|
-
|
|
19
|
-
/**
|
|
20
|
-
*
|
|
21
|
-
* @type {Map<PatchRepresentation, MultiNode<PatchRepresentation>>}
|
|
22
|
-
*/
|
|
23
|
-
const leaf_to_node_map = new Map();
|
|
24
|
-
|
|
25
|
-
// add nodes
|
|
26
|
-
const leaf_count = leaves.length;
|
|
27
|
-
for (let i = 0; i < leaf_count; i++) {
|
|
28
|
-
const leaf = leaves[i];
|
|
29
|
-
|
|
30
|
-
const node = MultiNode.fromOne(leaf);
|
|
31
|
-
|
|
32
|
-
graph.addNode(node);
|
|
33
|
-
|
|
34
|
-
leaf_to_node_map.set(leaf, node);
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
// create edges
|
|
38
|
-
for (let i = 0; i < leaf_count; i++) {
|
|
39
|
-
const leaf = leaves[i];
|
|
40
|
-
|
|
41
|
-
const neighbours = leaf.neighbours;
|
|
42
|
-
const neighbour_count = neighbours.length;
|
|
43
|
-
|
|
44
|
-
const node_leaf = leaf_to_node_map.get(leaf);
|
|
45
|
-
|
|
46
|
-
const node_container_leaf = graph.getNodeContainer(node_leaf);
|
|
47
|
-
|
|
48
|
-
const connected_edges = node_container_leaf.getEdges();
|
|
49
|
-
|
|
50
|
-
if (neighbour_count === 0 && connected_edges.length === 0) {
|
|
51
|
-
// no neighbours and not otherwise connected in the graph
|
|
52
|
-
// TODO address
|
|
53
|
-
// throw new Error('Disconnected node');
|
|
54
|
-
continue;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
for (let j = 0; j < neighbour_count; j++) {
|
|
58
|
-
const neighbour = neighbours[j];
|
|
59
|
-
|
|
60
|
-
const node_neighbour = leaf_to_node_map.get(neighbour);
|
|
61
|
-
|
|
62
|
-
if (node_neighbour === undefined) {
|
|
63
|
-
// not in the input set
|
|
64
|
-
continue;
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
const existing_edge = node_container_leaf.getAnyEdgeWith(node_neighbour);
|
|
68
|
-
|
|
69
|
-
if (existing_edge !== undefined) {
|
|
70
|
-
// edge already exists
|
|
71
|
-
continue;
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
const connection_weight = computePatchMergeScore(leaf, neighbour);
|
|
75
|
-
|
|
76
|
-
assert.isNumber(connection_weight, 'connection_weight');
|
|
77
|
-
assert.notNaN(connection_weight, 'connection_weight');
|
|
78
|
-
assert.isFiniteNumber(connection_weight, 'connection_weight');
|
|
79
|
-
|
|
80
|
-
const edge = new WeightedEdge(node_leaf, node_neighbour);
|
|
81
|
-
|
|
82
|
-
edge.weight = connection_weight;
|
|
83
|
-
|
|
84
|
-
graph.addEdge(edge);
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
return graph;
|
|
89
|
-
}
|
|
@@ -1,146 +0,0 @@
|
|
|
1
|
-
import { ConicRay } from "../../../../../core/geom/ConicRay.js";
|
|
2
|
-
import { compute_bounding_cone_of_2_cones } from "../../../../../core/geom/3d/cone/compute_bounding_cone_of_2_cones.js";
|
|
3
|
-
import { compute_patches_shared_vertex_count } from "./compute_patches_shared_vertex_count.js";
|
|
4
|
-
import {
|
|
5
|
-
compute_bounding_sphere_of_2_spheres
|
|
6
|
-
} from "../../../../../core/geom/3d/compute_bounding_sphere_of_2_spheres.js";
|
|
7
|
-
import { max2 } from "../../../../../core/math/max2.js";
|
|
8
|
-
import { min2 } from "../../../../../core/math/min2.js";
|
|
9
|
-
import { assert } from "../../../../../core/assert.js";
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* Assumes that neither array contains duplicated in it's own scope
|
|
14
|
-
* @template T
|
|
15
|
-
* @param {T[]} array_a
|
|
16
|
-
* @param {T[]} array_b
|
|
17
|
-
* @returns {number}
|
|
18
|
-
*/
|
|
19
|
-
function array_compute_common_element_count(array_a, array_b) {
|
|
20
|
-
|
|
21
|
-
let result = 0;
|
|
22
|
-
|
|
23
|
-
const a_count = array_a.length;
|
|
24
|
-
|
|
25
|
-
for (let i = 0; i < a_count; i++) {
|
|
26
|
-
const a = array_a[i];
|
|
27
|
-
|
|
28
|
-
if (array_b.indexOf(a) !== -1) {
|
|
29
|
-
result++;
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
return result;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
const scratch_cone = new ConicRay();
|
|
37
|
-
|
|
38
|
-
/**
|
|
39
|
-
*
|
|
40
|
-
* @type {number[]}
|
|
41
|
-
*/
|
|
42
|
-
const scratch_v4 = [];
|
|
43
|
-
|
|
44
|
-
/**
|
|
45
|
-
*
|
|
46
|
-
* @param {ConicRay} a
|
|
47
|
-
* @param {ConicRay} b
|
|
48
|
-
* @returns {number}
|
|
49
|
-
*/
|
|
50
|
-
function coneMergeCost_2(a, b) {
|
|
51
|
-
compute_bounding_cone_of_2_cones(scratch_cone, a, b);
|
|
52
|
-
|
|
53
|
-
return scratch_cone.angle;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
/**
|
|
57
|
-
* pi^2
|
|
58
|
-
* @type {number}
|
|
59
|
-
*/
|
|
60
|
-
const pi_sqr = 9.86960440109;
|
|
61
|
-
|
|
62
|
-
/**
|
|
63
|
-
*
|
|
64
|
-
* @param {number} r radius
|
|
65
|
-
* @return {number}
|
|
66
|
-
*/
|
|
67
|
-
function compute_sphere_volume(r) {
|
|
68
|
-
const r3 = r * r * r;
|
|
69
|
-
|
|
70
|
-
return r3 * 4.18879020479;
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
/**
|
|
74
|
-
*
|
|
75
|
-
* @param {number} a
|
|
76
|
-
* @param {number} b
|
|
77
|
-
* @return {number}
|
|
78
|
-
*/
|
|
79
|
-
function normalized_difference(a, b) {
|
|
80
|
-
assert.isNumber(a, 'a');
|
|
81
|
-
assert.isNumber(b, 'a');
|
|
82
|
-
|
|
83
|
-
assert.notNaN(a,'a');
|
|
84
|
-
assert.notNaN(b,'b');
|
|
85
|
-
|
|
86
|
-
return Math.abs(a - b) / (max2(a, b) + 0.0001);
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
/**
|
|
90
|
-
*
|
|
91
|
-
* @param {PatchRepresentation} a
|
|
92
|
-
* @param {PatchRepresentation} b
|
|
93
|
-
* @returns {number} higher score means better fitness
|
|
94
|
-
*/
|
|
95
|
-
export function computePatchMergeScore(a, b) {
|
|
96
|
-
// compute common neighbours
|
|
97
|
-
const a_neighbours = a.neighbours;
|
|
98
|
-
const b_neighbours = b.neighbours;
|
|
99
|
-
|
|
100
|
-
const common_neighbours = array_compute_common_element_count(a_neighbours, b_neighbours);
|
|
101
|
-
|
|
102
|
-
// normalize neighbour count
|
|
103
|
-
const common_neighbour_score = common_neighbours / (min2(a_neighbours.length, b_neighbours.length) + 0.01);
|
|
104
|
-
|
|
105
|
-
// prefer merging patches of similar LOD level, this creates a more flat hierarchy
|
|
106
|
-
const lod_score = 1 - normalized_difference(a.lod, b.lod);
|
|
107
|
-
|
|
108
|
-
const merged_cone_angle = coneMergeCost_2(a.normal_cone, b.normal_cone);
|
|
109
|
-
/**
|
|
110
|
-
* Try to merge patches that have similar normals, that is they face in the same direction
|
|
111
|
-
* @type {number}
|
|
112
|
-
*/
|
|
113
|
-
const normal_score = 1 - (merged_cone_angle * merged_cone_angle) / pi_sqr;
|
|
114
|
-
|
|
115
|
-
/*
|
|
116
|
-
prefer cluster of similar volume
|
|
117
|
-
*/
|
|
118
|
-
const a_bounds_radius = a.bounding_sphere[3];
|
|
119
|
-
const b_bounds_radius = b.bounding_sphere[3];
|
|
120
|
-
|
|
121
|
-
const similar_volume_score = 1 - normalized_difference(a_bounds_radius, b_bounds_radius);
|
|
122
|
-
/*
|
|
123
|
-
prefer merging patches that have similar bounds, this ensures good spatial locality
|
|
124
|
-
*/
|
|
125
|
-
compute_bounding_sphere_of_2_spheres(scratch_v4, a.bounding_sphere, b.bounding_sphere);
|
|
126
|
-
|
|
127
|
-
const merged_sphere_volume = compute_sphere_volume(scratch_v4[3]);
|
|
128
|
-
|
|
129
|
-
const summed_sphere_volume = compute_sphere_volume(a_bounds_radius) + compute_sphere_volume(b_bounds_radius)
|
|
130
|
-
|
|
131
|
-
const volume_score = summed_sphere_volume / (merged_sphere_volume + 0.01);
|
|
132
|
-
|
|
133
|
-
/*
|
|
134
|
-
Prefer patches that share more vertices
|
|
135
|
-
*/
|
|
136
|
-
const shared_vertex_count = compute_patches_shared_vertex_count(a, b);
|
|
137
|
-
|
|
138
|
-
const result = similar_volume_score * 0.01
|
|
139
|
-
+ shared_vertex_count
|
|
140
|
-
+ normal_score * 0.001
|
|
141
|
-
+ common_neighbour_score
|
|
142
|
-
+ lod_score * 0.1
|
|
143
|
-
+ volume_score;
|
|
144
|
-
|
|
145
|
-
return result;
|
|
146
|
-
}
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
*
|
|
3
|
-
* @param {PatchRepresentation} a
|
|
4
|
-
* @param {PatchRepresentation} b
|
|
5
|
-
* @returns {number}
|
|
6
|
-
*/
|
|
7
|
-
export function compute_patches_shared_vertex_count(a, b) {
|
|
8
|
-
let result = 0;
|
|
9
|
-
|
|
10
|
-
const seen_vertices = new Set();
|
|
11
|
-
|
|
12
|
-
const a_vertices = a.topology_snapshot.vertices;
|
|
13
|
-
const a_vertex_count = a_vertices.length;
|
|
14
|
-
for (let i = 0; i < a_vertex_count; i++) {
|
|
15
|
-
const v = a_vertices[i];
|
|
16
|
-
|
|
17
|
-
seen_vertices.add(v.index);
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
const b_vertices = b.topology_snapshot.vertices;
|
|
22
|
-
const b_vertex_count = b_vertices.length;
|
|
23
|
-
for (let i = 0; i < b_vertex_count; i++) {
|
|
24
|
-
const v = b_vertices[i];
|
|
25
|
-
|
|
26
|
-
if (seen_vertices.has(v.index)) {
|
|
27
|
-
result++;
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
return result;
|
|
32
|
-
}
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
*
|
|
3
|
-
* @param {PatchRepresentation} a
|
|
4
|
-
* @param {PatchRepresentation} b
|
|
5
|
-
* @returns {Set<number>}
|
|
6
|
-
*/
|
|
7
|
-
export function compute_patches_shared_vertices(a, b) {
|
|
8
|
-
const seen = new Set();
|
|
9
|
-
const result = new Set();
|
|
10
|
-
|
|
11
|
-
const a_vertices = a.topology_mask.vertices;
|
|
12
|
-
|
|
13
|
-
const a_vertex_count = a_vertices.length;
|
|
14
|
-
|
|
15
|
-
for (let i = 0; i < a_vertex_count; i++) {
|
|
16
|
-
const v = a_vertices[i];
|
|
17
|
-
|
|
18
|
-
seen.add(v.index);
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
const b_vertices = b.topology_mask.vertices;
|
|
23
|
-
const b_vertex_count = b_vertices.length;
|
|
24
|
-
for (let i = 0; i < b_vertex_count; i++) {
|
|
25
|
-
const v = b_vertices[i];
|
|
26
|
-
const v_index = v.index;
|
|
27
|
-
if (seen.add(v_index)) {
|
|
28
|
-
result.add(v_index);
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
return result;
|
|
34
|
-
}
|