[Bf-blender-cvs] [54dae0fb3cd] temp-pbvh-seam-texturing-tweaks: Remove MeshVertex, use indices for edges and primitives
Hans Goudey
noreply at git.blender.org
Wed Sep 28 05:04:27 CEST 2022
Commit: 54dae0fb3cdf907162dd0b6cb4b3e0c156889f98
Author: Hans Goudey
Date: Tue Sep 27 21:07:36 2022 -0500
Branches: temp-pbvh-seam-texturing-tweaks
https://developer.blender.org/rB54dae0fb3cdf907162dd0b6cb4b3e0c156889f98
Remove MeshVertex, use indices for edges and primitives
===================================================================
M source/blender/blenkernel/intern/pbvh_pixels.cc
M source/blender/blenkernel/intern/pbvh_uv_islands.cc
M source/blender/blenkernel/intern/pbvh_uv_islands.hh
===================================================================
diff --git a/source/blender/blenkernel/intern/pbvh_pixels.cc b/source/blender/blenkernel/intern/pbvh_pixels.cc
index 5cb1b9374c0..538a3b5618e 100644
--- a/source/blender/blenkernel/intern/pbvh_pixels.cc
+++ b/source/blender/blenkernel/intern/pbvh_pixels.cc
@@ -1,6 +1,7 @@
/* SPDX-License-Identifier: GPL-2.0-or-later
* Copyright 2022 Blender Foundation. All rights reserved. */
+#include "BKE_attribute.hh"
#include "BKE_customdata.h"
#include "BKE_mesh.h"
#include "BKE_mesh_mapping.h"
@@ -106,9 +107,9 @@ static void update_geom_primitives(PBVH &pbvh, const uv_islands::MeshData &mesh_
PBVHData &pbvh_data = BKE_pbvh_pixels_data_get(pbvh);
pbvh_data.clear_data();
for (const uv_islands::MeshPrimitive &mesh_primitive : mesh_data.primitives) {
- pbvh_data.geom_primitives.append(int3(mesh_primitive.vertices[0].vertex->v,
- mesh_primitive.vertices[1].vertex->v,
- mesh_primitive.vertices[2].vertex->v));
+ pbvh_data.geom_primitives.append(int3(mesh_primitive.vertices[0].vertex,
+ mesh_primitive.vertices[1].vertex,
+ mesh_primitive.vertices[2].vertex));
}
}
@@ -134,7 +135,7 @@ struct UVPrimitiveLookup {
for (VectorList<uv_islands::UVPrimitive>::UsedVector &uv_primitives :
uv_island.uv_primitives) {
for (uv_islands::UVPrimitive &uv_primitive : uv_primitives) {
- lookup[uv_primitive.primitive->index].append_as(Entry(&uv_primitive, uv_island_index));
+ lookup[uv_primitive.primitive_i].append_as(Entry(&uv_primitive, uv_island_index));
}
}
uv_island_index++;
@@ -143,6 +144,7 @@ struct UVPrimitiveLookup {
};
struct EncodePixelsUserData {
+ const uv_islands::MeshData *mesh_data;
Image *image;
ImageUser *image_user;
PBVH *pbvh;
@@ -158,6 +160,7 @@ static void do_encode_pixels(void *__restrict userdata,
const TaskParallelTLS *__restrict UNUSED(tls))
{
EncodePixelsUserData *data = static_cast<EncodePixelsUserData *>(userdata);
+ const uv_islands::MeshData &mesh_data = *data->mesh_data;
Image *image = data->image;
ImageUser image_user = *data->image_user;
PBVHNode *node = (*data->nodes)[n];
@@ -183,9 +186,9 @@ static void do_encode_pixels(void *__restrict userdata,
data->uv_primitive_lookup->lookup[geom_prim_index]) {
uv_islands::UVBorder uv_border = entry.uv_primitive->extract_border();
float2 uvs[3] = {
- entry.uv_primitive->get_uv_vertex(0)->uv - tile_offset,
- entry.uv_primitive->get_uv_vertex(1)->uv - tile_offset,
- entry.uv_primitive->get_uv_vertex(2)->uv - tile_offset,
+ entry.uv_primitive->get_uv_vertex(mesh_data, 0)->uv - tile_offset,
+ entry.uv_primitive->get_uv_vertex(mesh_data, 1)->uv - tile_offset,
+ entry.uv_primitive->get_uv_vertex(mesh_data, 2)->uv - tile_offset,
};
const float minv = clamp_f(min_fff(uvs[0].y, uvs[1].y, uvs[2].y), 0.0f, 1.0f);
const int miny = floor(minv * image_buffer->y);
@@ -362,9 +365,9 @@ static void update_pixels(PBVH *pbvh, Mesh *mesh, Image *image, ImageUser *image
}
uv_islands::MeshData mesh_data({pbvh->looptri, pbvh->totprim},
- {pbvh->mloop, pbvh->totprim},
+ {pbvh->mloop, mesh->totloop},
pbvh->totvert,
- {ldata_uv, pbvh->totprim});
+ {ldata_uv, mesh->totloop});
uv_islands::UVIslands islands(mesh_data);
uv_islands::UVIslandsMask uv_masks;
@@ -380,16 +383,17 @@ static void update_pixels(PBVH *pbvh, Mesh *mesh, Image *image, ImageUser *image
ushort2(tile_buffer->x, tile_buffer->y));
BKE_image_release_ibuf(image, tile_buffer, nullptr);
}
- uv_masks.add(islands);
+ uv_masks.add(mesh_data, islands);
uv_masks.dilate(image->seamfix_iter);
islands.extract_borders();
- islands.extend_borders(uv_masks);
+ islands.extend_borders(mesh_data, uv_masks);
update_geom_primitives(*pbvh, mesh_data);
UVPrimitiveLookup uv_primitive_lookup(mesh_data.looptris.size(), islands);
EncodePixelsUserData user_data;
+ user_data.mesh_data = &mesh_data;
user_data.pbvh = pbvh;
user_data.image = image;
user_data.image_user = image_user;
diff --git a/source/blender/blenkernel/intern/pbvh_uv_islands.cc b/source/blender/blenkernel/intern/pbvh_uv_islands.cc
index 3303a3623fb..cb7ce9e9ad0 100644
--- a/source/blender/blenkernel/intern/pbvh_uv_islands.cc
+++ b/source/blender/blenkernel/intern/pbvh_uv_islands.cc
@@ -31,23 +31,23 @@ static void uv_primitive_append_to_uv_vertices(UVPrimitive &uv_primitive)
/** \name MeshPrimitive
* \{ */
-MeshUVVert *MeshPrimitive::get_other_uv_vertex(const MeshVertex *v1, const MeshVertex *v2)
+int MeshPrimitive::get_other_uv_vertex(const int v1, const int v2) const
{
BLI_assert(vertices[0].vertex == v1 || vertices[1].vertex == v1 || vertices[2].vertex == v1);
BLI_assert(vertices[0].vertex == v2 || vertices[1].vertex == v2 || vertices[2].vertex == v2);
- for (MeshUVVert &uv_vertex : vertices) {
+ for (const MeshUVVert &uv_vertex : vertices) {
if (uv_vertex.vertex != v1 && uv_vertex.vertex != v2) {
- return &uv_vertex;
+ return uv_vertex.vertex;
}
}
- return nullptr;
+ return -1;
}
-bool MeshPrimitive::has_shared_uv_edge(const MeshPrimitive *other) const
+bool MeshPrimitive::has_shared_uv_edge(const MeshPrimitive &other) const
{
int shared_uv_verts = 0;
for (const MeshUVVert &vert : vertices) {
- for (const MeshUVVert &other_vert : other->vertices) {
+ for (const MeshUVVert &other_vert : other.vertices) {
if (vert.uv == other_vert.uv) {
shared_uv_verts += 1;
}
@@ -56,7 +56,7 @@ bool MeshPrimitive::has_shared_uv_edge(const MeshPrimitive *other) const
return shared_uv_verts >= 2;
}
-static const MeshUVVert &get_uv_vert(const MeshPrimitive &mesh_primitive, const MeshVertex *vert)
+static const MeshUVVert &get_uv_vert(const MeshPrimitive &mesh_primitive, const int vert)
{
for (const MeshUVVert &uv_vert : mesh_primitive.vertices) {
if (uv_vert.vertex == vert) {
@@ -67,10 +67,10 @@ static const MeshUVVert &get_uv_vert(const MeshPrimitive &mesh_primitive, const
return mesh_primitive.vertices[0];
}
-const bool has_vertex(const MeshPrimitive &mesh_primitive, const MeshVertex &mesh_vertex)
+static bool has_vertex(const MeshPrimitive &mesh_primitive, const int vert)
{
for (int i = 0; i < 3; i++) {
- if (mesh_primitive.vertices[i].vertex == &mesh_vertex) {
+ if (mesh_primitive.vertices[i].vertex == vert) {
return true;
}
}
@@ -93,16 +93,6 @@ rctf MeshPrimitive::uv_bounds() const
/** \name MeshData
* \{ */
-static void mesh_data_init_vertices(MeshData &mesh_data)
-{
- mesh_data.vertices.reserve(mesh_data.verts_num);
- for (int64_t i = 0; i < mesh_data.verts_num; i++) {
- MeshVertex vert;
- vert.v = i;
- mesh_data.vertices.append(vert);
- }
-}
-
static void mesh_data_init_primitives(MeshData &mesh_data)
{
mesh_data.primitives.reserve(mesh_data.looptris.size());
@@ -115,7 +105,7 @@ static void mesh_data_init_primitives(MeshData &mesh_data)
for (int j = 0; j < 3; j++) {
MeshUVVert uv_vert;
uv_vert.loop = tri.tri[j];
- uv_vert.vertex = &mesh_data.vertices[mesh_data.loops[uv_vert.loop].v];
+ uv_vert.vertex = mesh_data.loops[uv_vert.loop].v;
uv_vert.uv = mesh_data.mloopuv[uv_vert.loop].uv;
primitive.vertices.append(uv_vert);
}
@@ -123,7 +113,7 @@ static void mesh_data_init_primitives(MeshData &mesh_data)
}
}
-void mesh_data_init_edges(MeshData &mesh_data)
+static void mesh_data_init_edges(MeshData &mesh_data)
{
mesh_data.edges.reserve(mesh_data.looptris.size() * 2);
EdgeHash *eh = BLI_edgehash_new_ex(__func__, mesh_data.looptris.size() * 3);
@@ -144,82 +134,96 @@ void mesh_data_init_edges(MeshData &mesh_data)
edge_index = mesh_data.edges.size();
*edge_index_ptr = POINTER_FROM_INT(edge_index + 1);
MeshEdge edge;
- edge.vert1 = &mesh_data.vertices[v1];
- edge.vert2 = &mesh_data.vertices[v2];
+ edge.vert1 = v1;
+ edge.vert2 = v2;
mesh_data.edges.append(edge);
- MeshEdge *edge_ptr = &mesh_data.edges.last();
- mesh_data.vertices[v1].edges.append(edge_ptr);
- mesh_data.vertices[v2].edges.append(edge_ptr);
+ mesh_data.vert_to_edge_map.add(edge_index, v1, v2);
}
- MeshEdge *edge = &mesh_data.edges[edge_index];
- edge->primitives.append(&primitive);
- primitive.edges.append(edge);
+ primitive.edges.append(edge_index);
+ }
+ }
+ /* Build edge to neighboring triangle map. */
+ mesh_data.edge_to_primitive_map = EdgeToPrimitiveMap(mesh_data.edges.size());
+ for (const int prim_i : mesh_data.primitives.index_range()) {
+ const MeshPrimitive &primitive = mesh_data.primitives[prim_i];
+ for (const int edge_i : primitive.edges) {
+ mesh_data.edge_to_primitive_map.add(prim_i, edge_i);
}
}
+
BLI_edgehash_free(eh, nullptr);
}
-static const int64_t INVALID_UV_ISLAND_ID = -1;
+static constexpr int INVALID_UV_ISLAND_ID = -1;
/**
* NOTE: doesn't support weird topology where unconnected mesh primitives share the same uv
* island. For a accurate implementation we should use implement an uv_prim_lookup.
*/
-static void extract_uv_neighbors(Vector<MeshPrimitive *> &prims_to_add, MeshPrimitive *primitive)
-{
- for (MeshEdge *edge : primitive->edges) {
- for (MeshPrimitive *other_primitive : edge->primitives) {
- if (primitive == other_primitive) {
+static void extract_uv_neighbors(const MeshData &mesh_data,
+ const Span<int> uv_island_ids,
+ const int primitive_i,
+ Vector<int> &prims_to_add)
+{
+ const MeshPrimitive &primitive = mesh_data.primitives[primitive_i];
+ for (const int edge : primitive.edges) {
+ for (const int other_primitive_i :
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list