From 2401a022abf2f7bbdcf9911b4b39cbe4e30e7f43 Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Tue, 23 Jul 2024 22:01:43 -0400 Subject: [PATCH] Cleanup: Sculpt: Reduce indirection for painting data access Remove unnecessary structs that just hold pointers to other data --- source/blender/blenkernel/BKE_pbvh_api.hh | 26 +++------- source/blender/blenkernel/BKE_pbvh_pixels.hh | 6 +++ .../blender/blenkernel/intern/pbvh_pixels.cc | 48 +++++++++---------- .../blenkernel/intern/pbvh_pixels_copy.cc | 6 +-- 4 files changed, 39 insertions(+), 47 deletions(-) diff --git a/source/blender/blenkernel/BKE_pbvh_api.hh b/source/blender/blenkernel/BKE_pbvh_api.hh index ac22e531fc1..9a11920be47 100644 --- a/source/blender/blenkernel/BKE_pbvh_api.hh +++ b/source/blender/blenkernel/BKE_pbvh_api.hh @@ -48,6 +48,10 @@ namespace blender { namespace bke::pbvh { class Node; class Tree; +namespace pixels { +struct PBVHData; +struct NodeData; +} // namespace pixels } // namespace bke::pbvh namespace draw::pbvh { struct PBVHBatches; @@ -59,24 +63,6 @@ struct PBVHColorBufferNode { float (*color)[4] = nullptr; }; -struct PBVHPixels { - /** - * Storage for texture painting on blender::bke::pbvh::Tree level. - * - * Contains #blender::bke::pbvh::pixels::PBVHData - */ - void *data = nullptr; -}; - -struct PBVHPixelsNode { - /** - * Contains triangle/pixel data used during texture painting. - * - * Contains #blender::bke::pbvh::pixels::NodeData. - */ - void *node_data = nullptr; -}; - namespace blender::bke::pbvh { class Tree; @@ -176,7 +162,7 @@ class Node { /* Used to store the brush color during a stroke and composite it over the original color */ PBVHColorBufferNode color_buffer_; - PBVHPixelsNode pixels_; + pixels::NodeData *pixels_ = nullptr; /* Used to flash colors of updated node bounding boxes in * debug draw mode (when G.debug_value / bpy.app.debug_value is 889). @@ -231,7 +217,7 @@ class Tree { BMLog *bm_log_ = nullptr; - PBVHPixels pixels_; + pixels::PBVHData *pixels_ = nullptr; public: Tree(const Type type) : type_(type) {} diff --git a/source/blender/blenkernel/BKE_pbvh_pixels.hh b/source/blender/blenkernel/BKE_pbvh_pixels.hh index 719c8675eb0..dfe8bf8e75e 100644 --- a/source/blender/blenkernel/BKE_pbvh_pixels.hh +++ b/source/blender/blenkernel/BKE_pbvh_pixels.hh @@ -169,6 +169,9 @@ struct UDIMTileUndo { UDIMTileUndo(short tile_number, rcti ®ion) : tile_number(tile_number), region(region) {} }; +/** + * Contains triangle/pixel data used during texture painting. + */ struct NodeData { struct { bool dirty : 1; @@ -403,6 +406,9 @@ struct CopyPixelTiles { /** \} */ +/** + * Storage for texture painting on blender::bke::pbvh::Tree level. + */ struct PBVHData { /* Per UVPRimitive contains the paint data. */ PaintGeometryPrimitives geom_primitives; diff --git a/source/blender/blenkernel/intern/pbvh_pixels.cc b/source/blender/blenkernel/intern/pbvh_pixels.cc index df09920bba1..c41eb109e9c 100644 --- a/source/blender/blenkernel/intern/pbvh_pixels.cc +++ b/source/blender/blenkernel/intern/pbvh_pixels.cc @@ -64,7 +64,7 @@ static float2 calc_barycentric_delta_x(const ImBuf *image_buffer, static int count_node_pixels(Node &node) { - if (!node.pixels_.node_data) { + if (!node.pixels_) { return 0; } @@ -148,8 +148,8 @@ static void split_pixel_node( NodeData *data1 = MEM_new(__func__); NodeData *data2 = MEM_new(__func__); - child1->pixels_.node_data = static_cast(data1); - child2->pixels_.node_data = static_cast(data2); + child1->pixels_ = data1; + child2->pixels_ = data2; data1->uv_primitives = data.uv_primitives; data2->uv_primitives = data.uv_primitives; @@ -462,7 +462,7 @@ static void do_encode_pixels(EncodePixelsUserData *data, const int n) Image *image = data->image; ImageUser image_user = *data->image_user; Node *node = (*data->nodes)[n]; - NodeData *node_data = static_cast(node->pixels_.node_data); + NodeData *node_data = static_cast(node->pixels_); const uv_islands::UVIslandsMask &uv_masks = *data->uv_masks; LISTBASE_FOREACH (ImageTile *, tile, &data->image->tiles) { @@ -540,7 +540,7 @@ static bool should_pixels_be_updated(const Node &node) if ((node.flag_ & PBVH_RebuildPixels) != 0) { return true; } - NodeData *node_data = static_cast(node.pixels_.node_data); + NodeData *node_data = static_cast(node.pixels_); if (node_data != nullptr) { return false; } @@ -575,12 +575,12 @@ static bool find_nodes_to_update(Tree &pbvh, Vector &r_nodes_to_update) } /* Init or reset Tree pixel data when changes detected. */ - if (pbvh.pixels_.data == nullptr) { + if (pbvh.pixels_ == nullptr) { PBVHData *pbvh_data = MEM_new(__func__); - pbvh.pixels_.data = pbvh_data; + pbvh.pixels_ = pbvh_data; } else { - PBVHData *pbvh_data = static_cast(pbvh.pixels_.data); + PBVHData *pbvh_data = static_cast(pbvh.pixels_); pbvh_data->clear_data(); } @@ -593,12 +593,12 @@ static bool find_nodes_to_update(Tree &pbvh, Vector &r_nodes_to_update) r_nodes_to_update.append(&node); node.flag_ = static_cast(node.flag_ | PBVH_RebuildPixels); - if (node.pixels_.node_data == nullptr) { + if (node.pixels_ == nullptr) { NodeData *node_data = MEM_new(__func__); - node.pixels_.node_data = node_data; + node.pixels_ = node_data; } else { - NodeData *node_data = static_cast(node.pixels_.node_data); + NodeData *node_data = static_cast(node.pixels_); node_data->clear_data(); } } @@ -620,7 +620,7 @@ static void apply_watertight_check(Tree &pbvh, Image *image, ImageUser *image_us if ((node.flag_ & PBVH_Leaf) == 0) { continue; } - NodeData *node_data = static_cast(node.pixels_.node_data); + NodeData *node_data = static_cast(node.pixels_); UDIMTilePixels *tile_node_data = node_data->find_tile_data(image_tile); if (tile_node_data == nullptr) { continue; @@ -712,7 +712,7 @@ static bool update_pixels(Tree &pbvh, Mesh *mesh, Image *image, ImageUser *image /* Rebuild the undo regions. */ for (Node *node : nodes_to_update) { - NodeData *node_data = static_cast(node->pixels_.node_data); + NodeData *node_data = static_cast(node->pixels_); node_data->rebuild_undo_regions(); } @@ -759,22 +759,22 @@ static bool update_pixels(Tree &pbvh, Mesh *mesh, Image *image, ImageUser *image NodeData &node_data_get(Node &node) { - BLI_assert(node.pixels_.node_data != nullptr); - NodeData *node_data = static_cast(node.pixels_.node_data); + BLI_assert(node.pixels_ != nullptr); + NodeData *node_data = static_cast(node.pixels_); return *node_data; } PBVHData &data_get(Tree &pbvh) { - BLI_assert(pbvh.pixels_.data != nullptr); - PBVHData *data = static_cast(pbvh.pixels_.data); + BLI_assert(pbvh.pixels_ != nullptr); + PBVHData *data = static_cast(pbvh.pixels_); return *data; } void mark_image_dirty(Node &node, Image &image, ImageUser &image_user) { - BLI_assert(node.pixels_.node_data != nullptr); - NodeData *node_data = static_cast(node.pixels_.node_data); + BLI_assert(node.pixels_ != nullptr); + NodeData *node_data = static_cast(node.pixels_); if (node_data->flags.dirty) { ImageUser local_image_user = image_user; LISTBASE_FOREACH (ImageTile *, tile, &image.tiles) { @@ -794,7 +794,7 @@ void mark_image_dirty(Node &node, Image &image, ImageUser &image_user) void collect_dirty_tiles(Node &node, Vector &r_dirty_tiles) { - NodeData *node_data = static_cast(node.pixels_.node_data); + NodeData *node_data = static_cast(node.pixels_); node_data->collect_dirty_tiles(r_dirty_tiles); } @@ -813,21 +813,21 @@ void build_pixels(Tree &pbvh, Mesh *mesh, Image *image, ImageUser *image_user) void node_pixels_free(Node *node) { - pixels::NodeData *node_data = static_cast(node->pixels_.node_data); + pixels::NodeData *node_data = static_cast(node->pixels_); if (!node_data) { return; } MEM_delete(node_data); - node->pixels_.node_data = nullptr; + node->pixels_ = nullptr; } void pixels_free(Tree *pbvh) { - pixels::PBVHData *pbvh_data = static_cast(pbvh->pixels_.data); + pixels::PBVHData *pbvh_data = static_cast(pbvh->pixels_); MEM_delete(pbvh_data); - pbvh->pixels_.data = nullptr; + pbvh->pixels_ = nullptr; } } // namespace blender::bke::pbvh diff --git a/source/blender/blenkernel/intern/pbvh_pixels_copy.cc b/source/blender/blenkernel/intern/pbvh_pixels_copy.cc index 3c4d1327de7..525f922d5b6 100644 --- a/source/blender/blenkernel/intern/pbvh_pixels_copy.cc +++ b/source/blender/blenkernel/intern/pbvh_pixels_copy.cc @@ -175,7 +175,7 @@ class PixelNodesTileData : public Vector> for (blender::bke::pbvh::Node &node : pbvh.nodes_) { if (should_add_node(node, image_tile)) { - NodeData &node_data = *static_cast(node.pixels_.node_data); + NodeData &node_data = *static_cast(node.pixels_); UDIMTilePixels &tile_pixels = *node_data.find_tile_data(image_tile); append(tile_pixels); } @@ -189,10 +189,10 @@ class PixelNodesTileData : public Vector> if ((node.flag_ & PBVH_Leaf) == 0) { return false; } - if (node.pixels_.node_data == nullptr) { + if (node.pixels_ == nullptr) { return false; } - NodeData &node_data = *static_cast(node.pixels_.node_data); + NodeData &node_data = *static_cast(node.pixels_); if (node_data.find_tile_data(image_tile) == nullptr) { return false; }