From 8c7ecb3838a71dffc5c998cfe605ef62e0f9d329 Mon Sep 17 00:00:00 2001 From: Fabio Pellacini Date: Mon, 29 Jan 2024 11:55:05 +0100 Subject: [PATCH] Remove vertex welding --- libs/yocto/yocto_shape.cpp | 154 ------------------------------------- libs/yocto/yocto_shape.h | 31 -------- 2 files changed, 185 deletions(-) diff --git a/libs/yocto/yocto_shape.cpp b/libs/yocto/yocto_shape.cpp index 9e6f8d9d5..1d07df4d0 100644 --- a/libs/yocto/yocto_shape.cpp +++ b/libs/yocto/yocto_shape.cpp @@ -395,51 +395,6 @@ shape_data add_normals(const shape_data& shape) { transformed.normals = compute_normals(shape); return transformed; } -shape_data weld_vertices( - const shape_data& shape, float threshold, bool normals, bool others) { - auto transform_vert = [](auto&& old_verts, const vector& old_indices) { - if (old_verts.empty()) return old_verts; - using T = typename std::remove_cvref_t; - auto verts = vector(old_indices.size()); - for (auto&& [idx, vert] : enumerate(verts)) - vert = old_verts[old_indices[idx]]; - return verts; - }; - auto transform_elem = [](auto&& elems_, const vector& new_indices) { - auto elems = std::move(elems_); - for (auto& elem : elems) - if constexpr (std::is_same_v, int>) { - elem = new_indices[elem]; - } else { - for (auto& vid : elem) vid = new_indices[vid]; - } - return elems; - }; - - auto [old_indices, new_indices] = weld_indices(shape.positions, threshold); - auto transformed = shape; - transformed.positions = transform_vert(transformed.positions, old_indices); - if (normals) { - transformed.normals = transform_vert(transformed.normals, old_indices); - } else { - transformed.normals = {}; - } - if (others) { - transformed.texcoords = transform_vert(transformed.texcoords, old_indices); - transformed.colors = transform_vert(transformed.colors, old_indices); - transformed.radius = transform_vert(transformed.radius, old_indices); - } else { - transformed.texcoords = {}; - transformed.colors = {}; - transformed.radius = {}; - } - transformed.tangents = transform_vert(transformed.tangents, old_indices); - transformed.points = transform_elem(transformed.points, new_indices); - transformed.lines = transform_elem(transformed.lines, new_indices); - transformed.triangles = transform_elem(transformed.triangles, new_indices); - transformed.quads = transform_elem(transformed.quads, new_indices); - return transformed; -} vector shape_stats(const shape_data& shape, bool verbose) { auto format = [](auto num) { @@ -2490,115 +2445,6 @@ void split_facevarying(vector& split_quads, } } -// Weld vertices within a threshold. -pair, vector> weld_vertices( - const vector& positions, float threshold) { - auto indices = vector(positions.size()); - auto welded = vector{}; - auto grid = make_hash_grid(threshold); - auto neighbors = vector{}; - for (auto vertex : range(positions.size())) { - auto& position = positions[vertex]; - find_neighbors(grid, neighbors, position, threshold); - if (neighbors.empty()) { - welded.push_back(position); - indices[vertex] = (int)welded.size() - 1; - insert_vertex(grid, position); - } else { - indices[vertex] = neighbors.front(); - } - } - return {welded, indices}; -} -inline pair, vector> weld_indices( - const vector& positions, float threshold) { - auto new_indices = vector(positions.size()); - auto old_indices = vector(); - auto grid = make_hash_grid(threshold); - auto neighbors = vector{}; - for (auto vertex : range(positions.size())) { - auto& position = positions[vertex]; - find_neighbors(grid, neighbors, position, threshold); - if (neighbors.empty()) { - old_indices.push_back((int)vertex); - new_indices[vertex] = (int)old_indices.size() - 1; - insert_vertex(grid, position); - } else { - new_indices[vertex] = neighbors.front(); - } - } - return {old_indices, new_indices}; -} -pair, vector> weld_triangles( - const vector& triangles, const vector& positions, - float threshold) { - auto [wpositions, indices] = weld_vertices(positions, threshold); - auto wtriangles = triangles; - for (auto& t : wtriangles) t = {indices[t.x], indices[t.y], indices[t.z]}; - return {wtriangles, wpositions}; -} -pair, vector> weld_quads(const vector& quads, - const vector& positions, float threshold) { - auto [wpositions, indices] = weld_vertices(positions, threshold); - auto wquads = quads; - for (auto& q : wquads) - q = { - indices[q.x], - indices[q.y], - indices[q.z], - indices[q.w], - }; - return {wquads, wpositions}; -} - -// Merge shape elements -void merge_lines(vector& lines, vector& positions, - vector& tangents, vector& texcoords, vector& radius, - const vector& merge_lines, const vector& merge_positions, - const vector& merge_tangents, - const vector& merge_texturecoords, - const vector& merge_radius) { - auto merge_verts = (int)positions.size(); - for (auto& l : merge_lines) - lines.push_back({l.x + merge_verts, l.y + merge_verts}); - positions.insert( - positions.end(), merge_positions.begin(), merge_positions.end()); - tangents.insert(tangents.end(), merge_tangents.begin(), merge_tangents.end()); - texcoords.insert( - texcoords.end(), merge_texturecoords.begin(), merge_texturecoords.end()); - radius.insert(radius.end(), merge_radius.begin(), merge_radius.end()); -} -void merge_triangles(vector& triangles, vector& positions, - vector& normals, vector& texcoords, - const vector& merge_triangles, const vector& merge_positions, - const vector& merge_normals, - const vector& merge_texturecoords) { - auto merge_verts = (int)positions.size(); - for (auto& t : merge_triangles) - triangles.push_back( - {t.x + merge_verts, t.y + merge_verts, t.z + merge_verts}); - positions.insert( - positions.end(), merge_positions.begin(), merge_positions.end()); - normals.insert(normals.end(), merge_normals.begin(), merge_normals.end()); - texcoords.insert( - texcoords.end(), merge_texturecoords.begin(), merge_texturecoords.end()); -} -void merge_quads(vector& quads, vector& positions, - vector& normals, vector& texcoords, - const vector& merge_quads, const vector& merge_positions, - const vector& merge_normals, - const vector& merge_texturecoords) { - auto merge_verts = (int)positions.size(); - for (auto& q : merge_quads) - quads.push_back({q.x + merge_verts, q.y + merge_verts, q.z + merge_verts, - q.w + merge_verts}); - positions.insert( - positions.end(), merge_positions.begin(), merge_positions.end()); - normals.insert(normals.end(), merge_normals.begin(), merge_normals.end()); - texcoords.insert( - texcoords.end(), merge_texturecoords.begin(), merge_texturecoords.end()); -} - } // namespace yocto // ----------------------------------------------------------------------------- diff --git a/libs/yocto/yocto_shape.h b/libs/yocto/yocto_shape.h index 1d887b2f7..da3e2fc1a 100644 --- a/libs/yocto/yocto_shape.h +++ b/libs/yocto/yocto_shape.h @@ -142,8 +142,6 @@ shape_data flipyz_shape(const shape_data& shape); // Manipulate vertex data shape_data remove_normals(const shape_data& shape); shape_data add_normals(const shape_data& shape); -shape_data weld_vertices(const shape_data& shape, float threshold, - bool normals = false, bool others = false); // Merge a shape into another void merge_shape_inplace(shape_data& shape, const shape_data& merge); @@ -571,35 +569,6 @@ void split_facevarying(vector& split_quads, const vector& positions, const vector& normals, const vector& texcoords); -// Weld vertices within a threshold. -pair, vector> weld_vertices( - const vector& positions, float threshold); -pair, vector> weld_indices( - const vector& positions, float threshold); -pair, vector> weld_triangles( - const vector& triangles, const vector& positions, - float threshold); -pair, vector> weld_quads(const vector& quads, - const vector& positions, float threshold); - -// Merge shape elements -void merge_lines(vector& lines, vector& positions, - vector& tangents, vector& texcoords, vector& radius, - const vector& merge_lines, const vector& merge_positions, - const vector& merge_tangents, - const vector& merge_texturecoords, - const vector& merge_radius); -void merge_triangles(vector& triangles, vector& positions, - vector& normals, vector& texcoords, - const vector& merge_triangles, const vector& merge_positions, - const vector& merge_normals, - const vector& merge_texturecoords); -void merge_quads(vector& quads, vector& positions, - vector& normals, vector& texcoords, - const vector& merge_quads, const vector& merge_positions, - const vector& merge_normals, - const vector& merge_texturecoords); - } // namespace yocto // -----------------------------------------------------------------------------