|
Blender V4.5
|
#include "BLI_bounds.hh"#include "BLI_heap_simple.h"#include "BLI_map.hh"#include "BLI_math_geom.h"#include "BLI_math_vector.h"#include "BLI_math_vector.hh"#include "BLI_memarena.h"#include "BLI_span.hh"#include "BLI_time.h"#include "BLI_utildefines.h"#include "BKE_global.hh"#include "BKE_paint_bvh.hh"#include "bmesh.hh"#include "pbvh_intern.hh"#include "CLG_log.h"Go to the source code of this file.
Classes | |
| struct | blender::bke::pbvh::EdgeQueue |
| struct | blender::bke::pbvh::EdgeQueueContext |
| struct | blender::bke::pbvh::FastNodeBuildInfo |
Namespaces | |
| namespace | blender |
| namespace | blender::bke |
| namespace | blender::bke::pbvh |
Macros | |
| #define | pbvh_bmesh_node_vert_use_count_is_equal(nodes, cd_face_node_offset, node, v, n) |
| #define | EDGE_QUEUE_TEST(e) |
| #define | EDGE_QUEUE_ENABLE(e) |
| #define | EDGE_QUEUE_DISABLE(e) |
Functions | |
| static void | blender::bke::pbvh::pbvh_bmesh_node_finalize (BMeshNode &n, const int node_index, const int cd_vert_node_offset, const int cd_face_node_offset) |
| static void | blender::bke::pbvh::pbvh_bmesh_node_split (Vector< BMeshNode > &nodes, Vector< bool > &node_changed, const int cd_vert_node_offset, const int cd_face_node_offset, const Span< Bounds< float3 > > face_bounds, const int node_index) |
| static bool | blender::bke::pbvh::pbvh_bmesh_node_limit_ensure (BMesh &bm, Vector< BMeshNode > &nodes, Vector< bool > &node_changed, const int cd_vert_node_offset, const int cd_face_node_offset, const int node_index) |
| BLI_INLINE int | blender::bke::pbvh::pbvh_bmesh_node_index_from_vert (const int cd_vert_node_offset, const BMVert *key) |
| BLI_INLINE int | blender::bke::pbvh::pbvh_bmesh_node_index_from_face (const int cd_face_node_offset, const BMFace *key) |
| BLI_INLINE BMeshNode * | blender::bke::pbvh::pbvh_bmesh_node_from_vert (MutableSpan< BMeshNode > nodes, const int cd_vert_node_offset, const BMVert *key) |
| BLI_INLINE BMeshNode * | blender::bke::pbvh::pbvh_bmesh_node_from_face (MutableSpan< BMeshNode > nodes, const int cd_face_node_offset, const BMFace *key) |
| static BMVert * | blender::bke::pbvh::pbvh_bmesh_vert_create (BMesh &bm, MutableSpan< BMeshNode > nodes, MutableSpan< bool > node_changed, BMLog &bm_log, const BMVert *v1, const BMVert *v2, const int node_index, const float3 &co, const float3 &no, const int cd_vert_node_offset, const int cd_vert_mask_offset) |
| static BMFace * | blender::bke::pbvh::pbvh_bmesh_face_create (BMesh &bm, MutableSpan< BMeshNode > nodes, MutableSpan< bool > node_changed, const int cd_face_node_offset, BMLog &bm_log, const int node_index, const Span< BMVert * > v_tri, const Span< BMEdge * > e_tri, const BMFace *f_example) |
| static int | blender::bke::pbvh::pbvh_bmesh_node_vert_use_count_at_most (MutableSpan< BMeshNode > nodes, const int cd_face_node_offset, const BMeshNode *node, BMVert *v, const int count_max) |
| static std::optional< int > | blender::bke::pbvh::pbvh_bmesh_vert_other_node_find (const int cd_vert_node_offset, const int cd_face_node_offset, BMVert *v) |
| static void | blender::bke::pbvh::pbvh_bmesh_vert_ownership_transfer (MutableSpan< BMeshNode > nodes, MutableSpan< bool > node_changed, const int cd_vert_node_offset, const int new_owner_index, BMVert *v) |
| static void | blender::bke::pbvh::pbvh_bmesh_vert_remove (MutableSpan< BMeshNode > nodes, MutableSpan< bool > node_changed, const int cd_vert_node_offset, const int cd_face_node_offset, BMVert *v) |
| static void | blender::bke::pbvh::pbvh_bmesh_face_remove (MutableSpan< BMeshNode > nodes, MutableSpan< bool > node_changed, const int cd_vert_node_offset, const int cd_face_node_offset, BMLog &bm_log, BMFace *f) |
| static Array< BMLoop * > | blender::bke::pbvh::pbvh_bmesh_edge_loops (BMEdge *e) |
| static void | blender::bke::pbvh::pbvh_bmesh_node_drop_orig (BMeshNode *node) |
| static bool | blender::bke::pbvh::edge_queue_tri_in_sphere (const EdgeQueue *queue, BMFace *f) |
| static bool | blender::bke::pbvh::edge_queue_tri_in_circle (const EdgeQueue *queue, BMFace *f) |
| static bool | blender::bke::pbvh::check_mask (const EdgeQueueContext *eq_ctx, const BMVert *v) |
| static void | blender::bke::pbvh::edge_queue_insert (const EdgeQueueContext *eq_ctx, BMEdge *e, const float priority) |
| static bool | blender::bke::pbvh::is_boundary_edge (const BMEdge &edge) |
| static bool | blender::bke::pbvh::is_boundary_vert (const BMVert &vertex) |
| static bool | blender::bke::pbvh::is_edge_adjacent_to_boundary (const BMEdge &edge) |
| static float | blender::bke::pbvh::long_edge_queue_priority (const BMEdge &edge) |
| static float | blender::bke::pbvh::short_edge_queue_priority (const BMEdge &edge) |
| static void | blender::bke::pbvh::long_edge_queue_edge_add (const EdgeQueueContext *eq_ctx, BMEdge *e) |
| static void | blender::bke::pbvh::long_edge_queue_edge_add_recursive (const EdgeQueueContext *eq_ctx, const BMLoop *l_edge, const BMLoop *l_end, const float len_sq, const float limit_len) |
| static void | blender::bke::pbvh::short_edge_queue_edge_add (const EdgeQueueContext *eq_ctx, BMEdge *e) |
| static void | blender::bke::pbvh::long_edge_queue_face_add (const EdgeQueueContext *eq_ctx, BMFace *f) |
| static void | blender::bke::pbvh::short_edge_queue_face_add (const EdgeQueueContext *eq_ctx, BMFace *f) |
| static void | blender::bke::pbvh::long_edge_queue_create (const EdgeQueueContext *eq_ctx, const float max_edge_len, MutableSpan< BMeshNode > nodes, const float3 ¢er, const std::optional< float3 > view_normal, const float radius, const bool use_frontface, const bool use_projected) |
| static void | blender::bke::pbvh::short_edge_queue_create (const EdgeQueueContext *eq_ctx, const float min_edge_len, MutableSpan< BMeshNode > nodes, const float3 ¢er, const std::optional< float3 > view_normal, const float radius, const bool use_frontface, const bool use_projected) |
| static void | blender::bke::pbvh::copy_edge_data (BMesh &bm, BMEdge &dst, const BMEdge &src) |
| static void | blender::bke::pbvh::merge_edge_data (BMesh &bm, BMEdge &dst, const BMEdge &src) |
| static void | blender::bke::pbvh::pbvh_bmesh_split_edge (const EdgeQueueContext *eq_ctx, BMesh &bm, MutableSpan< BMeshNode > nodes, MutableSpan< bool > node_changed, const int cd_vert_node_offset, const int cd_face_node_offset, BMLog &bm_log, BMEdge *e) |
| static bool | blender::bke::pbvh::pbvh_bmesh_subdivide_long_edges (const EdgeQueueContext *eq_ctx, BMesh &bm, MutableSpan< BMeshNode > nodes, MutableSpan< bool > node_changed, const int cd_vert_node_offset, const int cd_face_node_offset, BMLog &bm_log) |
| static bool | blender::bke::pbvh::vert_in_face_adjacent_to_edge (BMVert &vert, BMEdge &edge) |
| static void | blender::bke::pbvh::merge_flap_edge_data (BMesh &bm, const BMFace *del_face, const BMFace *flap_face, BMEdge *e, BMVert *v_del, const BMLoop *l_del, BMVert *v_conn) |
| static BMVert * | blender::bke::pbvh::find_outer_flap_vert (BMFace &face) |
| static void | blender::bke::pbvh::try_merge_flap_edge_data_before_dissolve (BMesh &bm, BMFace &face) |
| static void | blender::bke::pbvh::merge_face_edge_data (BMesh &bm, BMFace *, BMFace *new_face, BMVert *v_del, const BMLoop *l_del, const BMVert *v_conn) |
| static void | blender::bke::pbvh::pbvh_bmesh_collapse_edge (BMesh &bm, MutableSpan< BMeshNode > nodes, MutableSpan< bool > node_changed, const int cd_vert_node_offset, const int cd_face_node_offset, BMLog &bm_log, BMEdge *e, BMVert *v1, BMVert *v2, Map< BMVert *, BMVert * > &deleted_verts, const EdgeQueueContext *eq_ctx) |
| static bool | blender::bke::pbvh::pbvh_bmesh_collapse_short_edges (const EdgeQueueContext *eq_ctx, const float min_edge_len, BMesh &bm, MutableSpan< BMeshNode > nodes, MutableSpan< bool > node_changed, const int cd_vert_node_offset, const int cd_face_node_offset, BMLog &bm_log) |
| bool | blender::bke::pbvh::node_raycast_bmesh (BMeshNode &node, const float3 &ray_start, const float3 &ray_normal, const IsectRayPrecalc *isect_precalc, float *depth, bool use_original, BMVert **r_active_vertex, float3 &r_face_normal) |
| bool | blender::bke::pbvh::raycast_node_detail_bmesh (const BMeshNode &node, const float3 &ray_start, const IsectRayPrecalc *isect_precalc, float *depth, float *r_edge_length) |
| bool | blender::bke::pbvh::bmesh_node_nearest_to_ray (BMeshNode &node, const float3 &ray_start, const float3 &ray_normal, float *r_depth, float *dist_sq, const bool use_original) |
| void | blender::bke::pbvh::bmesh_normals_update (Tree &pbvh, const IndexMask &nodes_to_update) |
| static void | blender::bke::pbvh::pbvh_bmesh_node_limit_ensure_fast (const MutableSpan< BMFace * > nodeinfo, const Span< Bounds< float3 > > face_bounds, FastNodeBuildInfo *node, MemArena *arena) |
| static void | blender::bke::pbvh::pbvh_bmesh_create_nodes_fast_recursive (Vector< BMeshNode > &nodes, const int cd_vert_node_offset, const int cd_face_node_offset, const Span< BMFace * > nodeinfo, const Span< Bounds< float3 > > face_bounds, const FastNodeBuildInfo *node, const int node_index, const int parent_index) |
| bool | blender::bke::pbvh::bmesh_update_topology (BMesh &bm, Tree &pbvh, BMLog &bm_log, PBVHTopologyUpdateMode mode, float min_edge_len, float max_edge_len, const float3 ¢er, const std::optional< float3 > &view_normal, float radius, bool use_frontface, bool use_projected) |
| static void | blender::bke::pbvh::copy_original_vert (BMLog *log, BMeshNode *node, BMVert *v, int i, bool use_original) |
| void | BKE_pbvh_bmesh_node_save_orig (BMesh *bm, BMLog *log, blender::bke::pbvh::BMeshNode *node, bool use_original) |
| void | BKE_pbvh_bmesh_after_stroke (BMesh &bm, blender::bke::pbvh::Tree &pbvh) |
| void | BKE_pbvh_node_mark_topology_update (blender::bke::pbvh::Node &node) |
| const blender::Set< BMVert *, 0 > & | BKE_pbvh_bmesh_node_unique_verts (blender::bke::pbvh::BMeshNode *node) |
| const blender::Set< BMVert *, 0 > & | BKE_pbvh_bmesh_node_other_verts (blender::bke::pbvh::BMeshNode *node) |
| const blender::Set< BMFace *, 0 > & | BKE_pbvh_bmesh_node_faces (blender::bke::pbvh::BMeshNode *node) |
Variables | |
| static CLG_LogRef | LOG = {"pbvh.bmesh"} |
| constexpr int | blender::bke::pbvh::leaf_limit = 400 |
| static constexpr int | blender::bke::pbvh::dyntopo_node_none = -1 |
BMesh Utility API | |
Use some local functions which assume triangles. | |
| #define | BM_LOOPS_OF_VERT_ITER_BEGIN(l_iter_radial_, v_) |
| #define | BM_LOOPS_OF_VERT_ITER_END |
| #define | BM_FACES_OF_VERT_ITER_BEGIN(f_iter_, v_) |
| #define | BM_FACES_OF_VERT_ITER_END |
| static Bounds< float3 > | blender::bke::pbvh::negative_bounds () |
| static std::array< BMEdge *, 3 > | blender::bke::pbvh::bm_edges_from_tri (BMesh &bm, const Span< BMVert * > v_tri) |
| BLI_INLINE std::array< BMVert *, 3 > | blender::bke::pbvh::bm_face_as_array (const BMFace &f) |
| static BMFace * | blender::bke::pbvh::bm_face_exists_tri_from_loop_vert (const BMLoop *l_radial_first, const BMVert *v_opposite) |
| static BMVert * | blender::bke::pbvh::bm_vert_hash_lookup_chain (Map< BMVert *, BMVert * > &deleted_verts, BMVert *v) |
| #define BM_FACES_OF_VERT_ITER_BEGIN | ( | f_iter_, | |
| v_ ) |
Definition at line 96 of file pbvh_bmesh.cc.
Referenced by blender::bke::pbvh::pbvh_bmesh_node_vert_use_count_at_most(), blender::bke::pbvh::pbvh_bmesh_vert_other_node_find(), and blender::bke::pbvh::pbvh_bmesh_vert_remove().
| #define BM_FACES_OF_VERT_ITER_END |
Definition at line 102 of file pbvh_bmesh.cc.
Referenced by blender::bke::pbvh::pbvh_bmesh_node_vert_use_count_at_most(), blender::bke::pbvh::pbvh_bmesh_vert_other_node_find(), and blender::bke::pbvh::pbvh_bmesh_vert_remove().
| #define BM_LOOPS_OF_VERT_ITER_BEGIN | ( | l_iter_radial_, | |
| v_ ) |
Typically using BM_LOOPS_OF_VERT and BM_FACES_OF_VERT iterators are fine, however this is an area where performance matters so do it in-line.
Take care since 'break' won't works as expected within these macros!
Definition at line 66 of file pbvh_bmesh.cc.
Referenced by blender::bke::pbvh::pbvh_bmesh_collapse_edge().
| #define BM_LOOPS_OF_VERT_ITER_END |
Definition at line 83 of file pbvh_bmesh.cc.
Referenced by blender::bke::pbvh::pbvh_bmesh_collapse_edge().
| #define EDGE_QUEUE_DISABLE | ( | e | ) |
Definition at line 692 of file pbvh_bmesh.cc.
Referenced by blender::bke::pbvh::pbvh_bmesh_collapse_short_edges(), and blender::bke::pbvh::pbvh_bmesh_subdivide_long_edges().
| #define EDGE_QUEUE_ENABLE | ( | e | ) |
Definition at line 691 of file pbvh_bmesh.cc.
Referenced by blender::bke::pbvh::edge_queue_insert().
| #define EDGE_QUEUE_TEST | ( | e | ) |
Definition at line 690 of file pbvh_bmesh.cc.
Referenced by blender::bke::pbvh::edge_queue_insert(), blender::bke::pbvh::long_edge_queue_edge_add(), blender::bke::pbvh::long_edge_queue_edge_add_recursive(), and blender::bke::pbvh::short_edge_queue_edge_add().
| #define pbvh_bmesh_node_vert_use_count_is_equal | ( | nodes, | |
| cd_face_node_offset, | |||
| node, | |||
| v, | |||
| n ) |
Definition at line 486 of file pbvh_bmesh.cc.
Referenced by blender::bke::pbvh::pbvh_bmesh_face_remove().
| void BKE_pbvh_bmesh_after_stroke | ( | BMesh & | bm, |
| blender::bke::pbvh::Tree & | pbvh ) |
Definition at line 2420 of file pbvh_bmesh.cc.
References bm, CD_PROP_INT32, CustomData_get_offset_named(), blender::bke::pbvh::Node::flag_, blender::IndexMask::from_bools(), i, blender::bke::pbvh::Node::Leaf, blender::bke::pbvh::Tree::nodes_, blender::bke::pbvh::Tree::tag_positions_changed(), and blender::bke::pbvh::Tree::tag_topology_changed().
Referenced by blender::ed::sculpt_paint::flush_update_done().
| const blender::Set< BMFace *, 0 > & BKE_pbvh_bmesh_node_faces | ( | blender::bke::pbvh::BMeshNode * | node | ) |
Definition at line 2467 of file pbvh_bmesh.cc.
References blender::bke::pbvh::BMeshNode::bm_faces_.
Referenced by blender::ed::sculpt_paint::undo::bmesh_push(), blender::ed::sculpt_paint::islands::calc_topology_islands_bmesh(), blender::draw::pbvh::ensure_vbos_allocated_bmesh(), blender::ed::sculpt_paint::face_set::gesture_apply_bmesh(), blender::ed::sculpt_paint::hide::invert_visibility_bmesh(), blender::ed::sculpt_paint::hide::partialvis_update_bmesh_nodes(), blender::draw::pbvh::update_face_sets_bmesh(), blender::draw::pbvh::update_masks_bmesh(), blender::draw::pbvh::update_normals_bmesh(), and blender::draw::pbvh::update_positions_bmesh().
| const blender::Set< BMVert *, 0 > & BKE_pbvh_bmesh_node_other_verts | ( | blender::bke::pbvh::BMeshNode * | node | ) |
Definition at line 2461 of file pbvh_bmesh.cc.
References blender::bke::pbvh::BMeshNode::bm_other_verts_.
Referenced by blender::ed::sculpt_paint::undo::bmesh_push(), and blender::ed::sculpt_paint::hide::partialvis_update_bmesh_nodes().
| void BKE_pbvh_bmesh_node_save_orig | ( | BMesh * | bm, |
| BMLog * | log, | ||
| blender::bke::pbvh::BMeshNode * | node, | ||
| bool | use_original ) |
In order to perform operations on the original node coordinates (currently just ray-cast), store the node's triangles and vertices.
Skips triangles that are hidden.
Definition at line 2368 of file pbvh_bmesh.cc.
References VectorSet< Key, InlineBufferCapacity, ProbingStrategy, Hash, IsEqual, Slot, Allocator >::add(), Set< Key, InlineBufferCapacity, ProbingStrategy, Hash, IsEqual, Slot, Allocator >::begin(), bm, BM_elem_flag_test, BM_ELEM_HIDDEN, blender::bke::pbvh::bm_face_as_array(), blender::bke::pbvh::BMeshNode::bm_faces_, blender::bke::pbvh::BMeshNode::bm_other_verts_, blender::bke::pbvh::BMeshNode::bm_unique_verts_, BM_VERT, blender::bke::pbvh::copy_original_vert(), Set< Key, InlineBufferCapacity, ProbingStrategy, Hash, IsEqual, Slot, Allocator >::end(), i, VectorSet< Key, InlineBufferCapacity, ProbingStrategy, Hash, IsEqual, Slot, Allocator >::index_of(), log, blender::bke::pbvh::BMeshNode::orig_positions_, blender::bke::pbvh::BMeshNode::orig_tris_, blender::bke::pbvh::BMeshNode::orig_verts_, Array< T, InlineBufferCapacity, Allocator >::reinitialize(), VectorSet< Key, InlineBufferCapacity, ProbingStrategy, Hash, IsEqual, Slot, Allocator >::reserve(), Set< Key, InlineBufferCapacity, ProbingStrategy, Hash, IsEqual, Slot, Allocator >::size(), v, and verts.
Referenced by blender::bke::pbvh::bmesh_update_topology(), and blender::ed::sculpt_paint::dynamic_topology_update().
| const blender::Set< BMVert *, 0 > & BKE_pbvh_bmesh_node_unique_verts | ( | blender::bke::pbvh::BMeshNode * | node | ) |
Definition at line 2455 of file pbvh_bmesh.cc.
References blender::bke::pbvh::BMeshNode::bm_unique_verts_.
Referenced by blender::ed::sculpt_paint::cloth::apply_filter_forces_bmesh(), blender::ed::sculpt_paint::mask::apply_mask_bmesh(), blender::ed::sculpt_paint::mask::apply_new_mask_bmesh(), blender::ed::sculpt_paint::project::apply_projection_bmesh(), blender::ed::sculpt_paint::smooth::blur_geometry_data_array(), blender::ed::sculpt_paint::undo::bmesh_push(), blender::ed::sculpt_paint::calc_area_normal_and_center_node_bmesh(), blender::ed::sculpt_paint::boundary::calc_bend_bmesh(), blender::ed::sculpt_paint::brushes::calc_bmesh(), blender::ed::sculpt_paint::pose::calc_bmesh(), blender::ed::sculpt_paint::cloth::calc_constraint_factors(), blender::ed::sculpt_paint::filter::calc_enhance_details_filter(), blender::ed::sculpt_paint::calc_factors_common_bmesh(), blender::ed::sculpt_paint::calc_factors_common_from_orig_data_bmesh(), blender::ed::sculpt_paint::cloth::calc_forces_bmesh(), blender::ed::sculpt_paint::boundary::calc_grab_bmesh(), blender::ed::sculpt_paint::boundary::calc_inflate_bmesh(), blender::ed::sculpt_paint::filter::calc_inflate_filter(), blender::ed::sculpt_paint::filter::calc_random_filter(), blender::ed::sculpt_paint::filter::calc_relax_face_sets_filter(), blender::ed::sculpt_paint::filter::calc_relax_filter(), blender::ed::sculpt_paint::filter::calc_scale_filter(), blender::ed::sculpt_paint::filter::calc_sharpen_filter(), blender::ed::sculpt_paint::boundary::calc_slide_bmesh(), blender::ed::sculpt_paint::boundary::calc_smooth_bmesh(), blender::ed::sculpt_paint::filter::calc_smooth_filter(), blender::ed::sculpt_paint::filter::calc_sphere_filter(), blender::ed::sculpt_paint::filter::calc_surface_smooth_filter(), blender::ed::sculpt_paint::boundary::calc_twist_bmesh(), blender::ed::sculpt_paint::create_node_vert_offsets_bmesh(), blender::ed::sculpt_paint::mask::decrease_contrast_mask_bmesh(), blender::ed::sculpt_paint::cloth::do_simulation_step(), blender::ed::sculpt_paint::elastic_transform_node_bmesh(), blender::ed::sculpt_paint::cloth::ensure_nodes_constraints(), blender::ed::sculpt_paint::fake_neighbor_search_bmesh(), blender::ed::sculpt_paint::mask::fill_mask_bmesh(), blender::ed::sculpt_paint::mask::gesture_apply_for_symmetry_pass(), blender::ed::sculpt_paint::pose::grow_factors_bmesh(), blender::ed::sculpt_paint::mask::grow_mask_bmesh(), blender::ed::sculpt_paint::mask::increase_contrast_mask_bmesh(), blender::ed::sculpt_paint::mask::invert_mask_bmesh(), blender::ed::sculpt_paint::hide::invert_visibility_bmesh(), blender::ed::sculpt_paint::filter::mesh_filter_sharpen_init(), blender::ed::sculpt_paint::nearest_vert_calc_bmesh(), blender::ed::sculpt_paint::hide::partialvis_update_bmesh_nodes(), blender::ed::sculpt_paint::undo::restore_mask_from_undo_step(), blender::ed::sculpt_paint::undo::restore_position_from_undo_step(), blender::ed::sculpt_paint::brushes::sample_node_surface_bmesh(), blender::ed::sculpt_paint::mask::sculpt_mask_init_exec(), blender::ed::sculpt_paint::mask::sharpen_mask_bmesh(), blender::ed::sculpt_paint::mask::shrink_mask_bmesh(), blender::ed::sculpt_paint::mask::smooth_mask_bmesh(), blender::ed::sculpt_paint::transform_node_bmesh(), and blender::ed::sculpt_paint::expand::update_mask_bmesh().
| void BKE_pbvh_node_mark_topology_update | ( | blender::bke::pbvh::Node & | node | ) |
Definition at line 2450 of file pbvh_bmesh.cc.
References blender::bke::pbvh::Node::flag_, and blender::bke::pbvh::Node::UpdateTopology.
Referenced by blender::ed::sculpt_paint::dynamic_topology_update(), and blender::ed::sculpt_paint::dyntopo::sculpt_detail_flood_fill_exec().
|
static |
Definition at line 28 of file pbvh_bmesh.cc.