Skip to content

Commit

Permalink
Remove vertex welding
Browse files Browse the repository at this point in the history
  • Loading branch information
xelatihy committed Jan 29, 2024
1 parent 1e63c3e commit 8c7ecb3
Show file tree
Hide file tree
Showing 2 changed files with 0 additions and 185 deletions.
154 changes: 0 additions & 154 deletions libs/yocto/yocto_shape.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<int>& old_indices) {
if (old_verts.empty()) return old_verts;
using T = typename std::remove_cvref_t<decltype(old_verts[0])>;
auto verts = vector<T>(old_indices.size());
for (auto&& [idx, vert] : enumerate(verts))
vert = old_verts[old_indices[idx]];
return verts;
};
auto transform_elem = [](auto&& elems_, const vector<int>& new_indices) {
auto elems = std::move(elems_);
for (auto& elem : elems)
if constexpr (std::is_same_v<std::remove_cvref_t<decltype(elem)>, 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<string> shape_stats(const shape_data& shape, bool verbose) {
auto format = [](auto num) {
Expand Down Expand Up @@ -2490,115 +2445,6 @@ void split_facevarying(vector<vec4i>& split_quads,
}
}

// Weld vertices within a threshold.
pair<vector<vec3f>, vector<int>> weld_vertices(
const vector<vec3f>& positions, float threshold) {
auto indices = vector<int>(positions.size());
auto welded = vector<vec3f>{};
auto grid = make_hash_grid(threshold);
auto neighbors = vector<int>{};
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<int>, vector<int>> weld_indices(
const vector<vec3f>& positions, float threshold) {
auto new_indices = vector<int>(positions.size());
auto old_indices = vector<int>();
auto grid = make_hash_grid(threshold);
auto neighbors = vector<int>{};
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<vec3i>, vector<vec3f>> weld_triangles(
const vector<vec3i>& triangles, const vector<vec3f>& 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<vec4i>, vector<vec3f>> weld_quads(const vector<vec4i>& quads,
const vector<vec3f>& 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<vec2i>& lines, vector<vec3f>& positions,
vector<vec3f>& tangents, vector<vec2f>& texcoords, vector<float>& radius,
const vector<vec2i>& merge_lines, const vector<vec3f>& merge_positions,
const vector<vec3f>& merge_tangents,
const vector<vec2f>& merge_texturecoords,
const vector<float>& 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<vec3i>& triangles, vector<vec3f>& positions,
vector<vec3f>& normals, vector<vec2f>& texcoords,
const vector<vec3i>& merge_triangles, const vector<vec3f>& merge_positions,
const vector<vec3f>& merge_normals,
const vector<vec2f>& 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<vec4i>& quads, vector<vec3f>& positions,
vector<vec3f>& normals, vector<vec2f>& texcoords,
const vector<vec4i>& merge_quads, const vector<vec3f>& merge_positions,
const vector<vec3f>& merge_normals,
const vector<vec2f>& 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

// -----------------------------------------------------------------------------
Expand Down
31 changes: 0 additions & 31 deletions libs/yocto/yocto_shape.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -571,35 +569,6 @@ void split_facevarying(vector<vec4i>& split_quads,
const vector<vec3f>& positions, const vector<vec3f>& normals,
const vector<vec2f>& texcoords);

// Weld vertices within a threshold.
pair<vector<vec3f>, vector<int>> weld_vertices(
const vector<vec3f>& positions, float threshold);
pair<vector<int>, vector<int>> weld_indices(
const vector<vec3f>& positions, float threshold);
pair<vector<vec3i>, vector<vec3f>> weld_triangles(
const vector<vec3i>& triangles, const vector<vec3f>& positions,
float threshold);
pair<vector<vec4i>, vector<vec3f>> weld_quads(const vector<vec4i>& quads,
const vector<vec3f>& positions, float threshold);

// Merge shape elements
void merge_lines(vector<vec2i>& lines, vector<vec3f>& positions,
vector<vec3f>& tangents, vector<vec2f>& texcoords, vector<float>& radius,
const vector<vec2i>& merge_lines, const vector<vec3f>& merge_positions,
const vector<vec3f>& merge_tangents,
const vector<vec2f>& merge_texturecoords,
const vector<float>& merge_radius);
void merge_triangles(vector<vec3i>& triangles, vector<vec3f>& positions,
vector<vec3f>& normals, vector<vec2f>& texcoords,
const vector<vec2i>& merge_triangles, const vector<vec3f>& merge_positions,
const vector<vec3f>& merge_normals,
const vector<vec2f>& merge_texturecoords);
void merge_quads(vector<vec4i>& quads, vector<vec3f>& positions,
vector<vec3f>& normals, vector<vec2f>& texcoords,
const vector<vec4i>& merge_quads, const vector<vec3f>& merge_positions,
const vector<vec3f>& merge_normals,
const vector<vec2f>& merge_texturecoords);

} // namespace yocto

// -----------------------------------------------------------------------------
Expand Down

0 comments on commit 8c7ecb3

Please sign in to comment.