Blender V4.5
BKE_paint_bvh.hh
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2023 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
5#pragma once
6
11
12#include <variant>
13
14#include "BLI_array.hh"
16#include "BLI_bit_vector.hh"
17#include "BLI_bounds_types.hh"
18#include "BLI_function_ref.hh"
19#include "BLI_index_mask_fwd.hh"
21#include "BLI_offset_indices.hh"
22#include "BLI_set.hh"
23#include "BLI_span.hh"
24#include "BLI_string_ref.hh"
25#include "BLI_utildefines.h"
26#include "BLI_utility_mixins.hh"
27#include "BLI_vector.hh"
28#include "BLI_vector_set.hh"
29
30struct BMFace;
31struct BMLog;
32struct BMesh;
33struct BMVert;
34struct CCGKey;
35struct Depsgraph;
36struct IsectRayPrecalc;
37struct Mesh;
38struct SubdivCCG;
39struct SubdivCCGCoord;
40struct Image;
41struct ImageUser;
42struct Object;
43
44namespace blender::bke::pbvh {
45class Node;
46class Tree;
47namespace pixels {
48struct PBVHData;
49struct NodeData;
50} // namespace pixels
51} // namespace blender::bke::pbvh
52
53namespace blender::bke::pbvh {
54
55class Tree;
56
62 friend Tree;
63
64 public:
65 enum Flags : uint32_t {
66 None = 0,
67 Leaf = 1 << 0,
68
69 FullyHidden = 1 << 10,
70 FullyMasked = 1 << 11,
71 FullyUnmasked = 1 << 12,
72
73 UpdateTopology = 1 << 13,
74 RebuildPixels = 1 << 15,
75 TexLeaf = 1 << 16,
77 TopologyUpdated = 1 << 17,
78 };
79
80 /* Index of the parent node. A value of -1 indicates that the node is the root node. */
81 int parent_ = -1;
82
87
88 /* For internal nodes, the offset of the children in the blender::bke::pbvh::Tree
89 * 'nodes' array. */
91
92 /* Indicates whether this node is a leaf or not; also used for
93 * marking various updates that need to be applied. */
95
100 float tmin_ = 0.0f;
101
108
111
112 std::optional<int> parent() const;
113 const Bounds<float3> &bounds() const;
114 const Bounds<float3> &bounds_orig() const;
115};
116
118
179
180struct GridsNode : public Node {
183
185 Span<int> grids() const;
186};
187
208
210 public:
211 virtual ~DrawCache() = default;
212 virtual void tag_positions_changed(const IndexMask &node_mask) = 0;
213 virtual void tag_visibility_changed(const IndexMask &node_mask) = 0;
214 virtual void tag_topology_changed(const IndexMask &node_mask) = 0;
215 virtual void tag_face_sets_changed(const IndexMask &node_mask) = 0;
216 virtual void tag_masks_changed(const IndexMask &node_mask) = 0;
217 virtual void tag_attribute_changed(const IndexMask &node_mask, StringRef attribute_name) = 0;
218};
219
220enum class Type {
224};
225
230class Tree {
231 friend Node;
232 Type type_;
233
235 Array<int, 0> prim_indices_;
236
242 BitVector<> bounds_dirty_;
243
249 BitVector<> normals_dirty_;
250
256 BitVector<> visibility_dirty_;
257
258 public:
259 std::variant<Vector<MeshNode>, Vector<GridsNode>, Vector<BMeshNode>> nodes_;
260
262
263 std::unique_ptr<DrawCache> draw_data;
264
265 Tree(const Tree &other) = delete;
266 Tree(Tree &&other) = default;
267 Tree &operator=(const Tree &other) = delete;
268 Tree &operator=(Tree &&other) = default;
269 ~Tree();
270
272 static Tree from_mesh(const Mesh &mesh);
274 static Tree from_grids(const Mesh &base_mesh, const SubdivCCG &subdiv_ccg);
276 static Tree from_bmesh(BMesh &bm);
277
278 int nodes_num() const;
279 template<typename NodeT> Span<NodeT> nodes() const;
280 template<typename NodeT> MutableSpan<NodeT> nodes();
281
282 Type type() const;
283
289 void tag_positions_changed(const IndexMask &node_mask);
290
292 void tag_visibility_changed(const IndexMask &node_mask);
293
297 void tag_topology_changed(const IndexMask &node_mask);
298
300 void tag_face_sets_changed(const IndexMask &node_mask);
301
303 void tag_masks_changed(const IndexMask &node_mask);
304
308 void tag_attribute_changed(const IndexMask &node_mask, StringRef attribute_name);
309
316
321 void update_bounds(const Depsgraph &depsgraph, const Object &object);
322 void update_bounds_mesh(Span<float3> vert_positions);
323 void update_bounds_grids(Span<float3> positions, int grid_area);
324 void update_bounds_bmesh(const BMesh &bm);
325
326 void update_normals(Object &object_orig, Object &object_eval);
327
328 void update_visibility(const Object &object);
329
330 private:
331 explicit Tree(Type type);
332};
333
334void build_pixels(const Depsgraph &depsgraph, Object &object, Image &image, ImageUser &image_user);
335
336/* Ray-cast
337 * the hit callback is called for all leaf nodes intersecting the ray;
338 * it's up to the callback to find the primitive within the leaves that is
339 * hit first */
340
342 FunctionRef<void(Node &node, float *tmin)> hit_fn,
343 const float3 &ray_start,
344 const float3 &ray_normal,
345 bool original);
346
347bool node_raycast_mesh(const MeshNode &node,
348 Span<float3> node_positions,
349 Span<float3> vert_positions,
351 Span<int> corner_verts,
352 Span<int3> corner_tris,
353 Span<bool> hide_poly,
354 const float3 &ray_start,
355 const float3 &ray_normal,
356 IsectRayPrecalc *isect_precalc,
357 float *depth,
358 int &r_active_vertex,
359 int &r_active_face_index,
360 float3 &r_face_normal);
361
362bool node_raycast_grids(const SubdivCCG &subdiv_ccg,
363 GridsNode &node,
364 Span<float3> node_positions,
365 const float3 &ray_start,
366 const float3 &ray_normal,
367 const IsectRayPrecalc *isect_precalc,
368 float *depth,
369 SubdivCCGCoord &r_active_vertex,
370 int &r_active_grid_index,
371 float3 &r_face_normal);
372
374 const float3 &ray_start,
375 const float3 &ray_normal,
376 const IsectRayPrecalc *isect_precalc,
377 float *depth,
378 bool use_original,
379 BMVert **r_active_vertex,
380 float3 &r_face_normal);
381
382bool raycast_node_detail_bmesh(const BMeshNode &node,
383 const float3 &ray_start,
384 const IsectRayPrecalc *isect_precalc,
385 float *depth,
386 float *r_edge_length);
387
398void clip_ray_ortho(
399 Tree &pbvh, bool original, float ray_start[3], float ray_end[3], float ray_normal[3]);
400
402 const FunctionRef<void(Node &node, float *tmin)> fn,
403 const float3 &ray_start,
404 const float3 &ray_normal,
405 bool original);
406
408 Node &node,
409 Span<float3> node_positions,
410 bool use_origco,
411 Span<float3> vert_positions,
413 Span<int> corner_verts,
414 Span<int3> corner_tris,
415 Span<bool> hide_poly,
416 const SubdivCCG *subdiv_ccg,
417 const float ray_start[3],
418 const float ray_normal[3],
419 float *depth,
420 float *dist_sq);
421
426
430bool node_frustum_contain_aabb(const Node &node, Span<float4> frustum_planes);
431
435bool node_frustum_exclude_aabb(const Node &node, Span<float4> frustum_planes);
436
437} // namespace blender::bke::pbvh
438
440
441namespace blender::bke::pbvh {
442
446int count_grid_quads(const BitGroupVector<> &grid_hidden,
447 Span<int> grid_indices,
448 int gridsize,
449 int display_gridsize);
450
451} // namespace blender::bke::pbvh
452
453int BKE_pbvh_get_grid_num_verts(const Object &object);
454int BKE_pbvh_get_grid_num_faces(const Object &object);
455
461
462namespace blender::bke::pbvh {
463
468 Tree &pbvh,
469 BMLog &bm_log,
471 float min_edge_len,
472 float max_edge_len,
473 const float3 &center,
474 const std::optional<float3> &view_normal,
475 float radius,
476 bool use_frontface,
477 bool use_projected);
478
479} // namespace blender::bke::pbvh
480
481/* Node Access */
482
485void BKE_pbvh_node_fully_hidden_set(blender::bke::pbvh::Node &node, int fully_hidden);
487void BKE_pbvh_node_fully_masked_set(blender::bke::pbvh::Node &node, int fully_masked);
491
493
494namespace blender::bke::pbvh {
495
500Span<int> node_face_indices_calc_grids(const SubdivCCG &subdiv_ccg,
501 const GridsNode &node,
502 Vector<int> &faces);
503
504} // namespace blender::bke::pbvh
505
507
513
521 BMLog *log,
523 bool use_original);
525
526namespace blender::bke::pbvh {
527
534void store_bounds_orig(Tree &pbvh);
535
537void update_mask_mesh(const Mesh &mesh, const IndexMask &node_mask, Tree &pbvh);
538void update_mask_grids(const SubdivCCG &subdiv_ccg, const IndexMask &node_mask, Tree &pbvh);
539void update_mask_bmesh(const BMesh &bm, const IndexMask &node_mask, Tree &pbvh);
540
541void update_normals(const Depsgraph &depsgraph, Object &object_orig, Tree &pbvh);
543void update_normals_from_eval(Object &object_eval, Tree &pbvh);
544
545} // namespace blender::bke::pbvh
546
547namespace blender::bke::pbvh {
548IndexMask nodes_to_face_selection_grids(const SubdivCCG &subdiv_ccg,
549 Span<GridsNode> nodes,
550 const IndexMask &nodes_mask,
551 IndexMaskMemory &memory);
552}
553
555 blender::Span<blender::float3> vert_positions);
556
558 blender::Span<blender::float3> &r_orig_positions,
559 blender::Span<blender::int3> &r_orig_tris);
560
561namespace blender::bke::pbvh {
562
568Span<float3> vert_positions_eval(const Depsgraph &depsgraph, const Object &object_orig);
569Span<float3> vert_positions_eval_from_eval(const Object &object_eval);
570
577MutableSpan<float3> vert_positions_eval_for_write(const Depsgraph &depsgraph, Object &object_orig);
578
583Span<float3> vert_normals_eval(const Depsgraph &depsgraph, const Object &object_orig);
584Span<float3> vert_normals_eval_from_eval(const Object &object_eval);
585
586Span<float3> face_normals_eval_from_eval(const Object &object_eval);
587
588} // namespace blender::bke::pbvh
589
591
592namespace blender::bke::pbvh {
593
595IndexMask all_leaf_nodes(const Tree &pbvh, IndexMaskMemory &memory);
596
598IndexMask search_nodes(const Tree &pbvh,
599 IndexMaskMemory &memory,
600 FunctionRef<bool(const Node &)> filter_fn);
601
602void node_update_mask_mesh(Span<float> mask, MeshNode &node);
603void node_update_mask_grids(const CCGKey &key, Span<float> masks, GridsNode &node);
604void node_update_mask_bmesh(int mask_offset, BMeshNode &node);
605
606void node_update_visibility_mesh(Span<bool> hide_vert, MeshNode &node);
607void node_update_visibility_grids(const BitGroupVector<> &grid_hidden, GridsNode &node);
609
610void update_node_bounds_mesh(Span<float3> positions, MeshNode &node);
611void update_node_bounds_grids(int grid_area, Span<float3> positions, GridsNode &node);
613
614inline std::optional<int> Node::parent() const
615{
616 if (parent_ == -1) {
617 return std::nullopt;
618 }
619
620 return parent_;
621}
622
623inline const Bounds<float3> &Node::bounds() const
624{
625 return bounds_;
626}
627
629{
630 return bounds_orig_;
631}
632
634{
635 return face_indices_;
636}
638{
639 return vert_indices_.as_span().slice(0, unique_verts_num_);
640}
642{
643 return vert_indices_;
644}
645inline int MeshNode::corners_num() const
646{
647 return corners_num_;
648}
649
651{
652 return prim_indices_;
653}
654
655inline Type Tree::type() const
656{
657 return type_;
658}
659
660} // namespace blender::bke::pbvh
bool BKE_pbvh_node_fully_hidden_get(const blender::bke::pbvh::Node &node)
Definition pbvh.cc:1539
void BKE_pbvh_mark_rebuild_pixels(blender::bke::pbvh::Tree &pbvh)
Definition pbvh.cc:1514
void BKE_pbvh_node_fully_unmasked_set(blender::bke::pbvh::Node &node, int fully_masked)
Definition pbvh.cc:1563
void BKE_pbvh_node_mark_topology_update(blender::bke::pbvh::Node &node)
int BKE_pbvh_debug_draw_gen_get(blender::bke::pbvh::Node &node)
Definition pbvh.cc:2457
int BKE_pbvh_get_grid_num_verts(const Object &object)
Definition pbvh.cc:1491
float BKE_pbvh_node_get_tmin(const blender::bke::pbvh::Node *node)
Definition pbvh.cc:773
void BKE_pbvh_node_mark_update(blender::bke::pbvh::Node &node)
Definition pbvh.cc:1509
bool BKE_pbvh_node_fully_masked_get(const blender::bke::pbvh::Node &node)
Definition pbvh.cc:1557
void BKE_pbvh_bmesh_after_stroke(BMesh &bm, blender::bke::pbvh::Tree &pbvh)
void BKE_pbvh_node_fully_hidden_set(blender::bke::pbvh::Node &node, int fully_hidden)
Definition pbvh.cc:1527
int BKE_pbvh_get_grid_num_faces(const Object &object)
Definition pbvh.cc:1499
const blender::Set< BMFace *, 0 > & BKE_pbvh_bmesh_node_faces(blender::bke::pbvh::BMeshNode *node)
PBVHTopologyUpdateMode
@ PBVH_Collapse
@ PBVH_Subdivide
void BKE_pbvh_node_fully_masked_set(blender::bke::pbvh::Node &node, int fully_masked)
Definition pbvh.cc:1545
const blender::Set< BMVert *, 0 > & BKE_pbvh_bmesh_node_unique_verts(blender::bke::pbvh::BMeshNode *node)
void BKE_pbvh_bmesh_node_save_orig(BMesh *bm, BMLog *log, blender::bke::pbvh::BMeshNode *node, bool use_original)
const blender::Set< BMVert *, 0 > & BKE_pbvh_bmesh_node_other_verts(blender::bke::pbvh::BMeshNode *node)
bool BKE_pbvh_node_fully_unmasked_get(const blender::bke::pbvh::Node &node)
Definition pbvh.cc:1575
void BKE_pbvh_vert_coords_apply(blender::bke::pbvh::Tree &pbvh, blender::Span< blender::float3 > vert_positions)
Definition pbvh.cc:2348
void BKE_pbvh_sync_visibility_from_verts(Object &object)
Definition pbvh.cc:2462
void BKE_pbvh_node_get_bm_orco_data(const blender::bke::pbvh::BMeshNode &node, blender::Span< blender::float3 > &r_orig_positions, blender::Span< blender::int3 > &r_orig_tris)
Definition pbvh.cc:1602
#define ENUM_OPERATORS(_type, _max)
struct Object Object
BMesh * bm
BPy_StructRNA * depsgraph
NonCopyable(const NonCopyable &other)=delete
virtual void tag_visibility_changed(const IndexMask &node_mask)=0
virtual ~DrawCache()=default
virtual void tag_topology_changed(const IndexMask &node_mask)=0
virtual void tag_attribute_changed(const IndexMask &node_mask, StringRef attribute_name)=0
virtual void tag_positions_changed(const IndexMask &node_mask)=0
virtual void tag_masks_changed(const IndexMask &node_mask)=0
virtual void tag_face_sets_changed(const IndexMask &node_mask)=0
Bounds< float3 > bounds_
const Bounds< float3 > & bounds() const
const Bounds< float3 > & bounds_orig() const
pixels::NodeData * pixels_
std::optional< int > parent() const
Bounds< float3 > bounds_orig_
MutableSpan< NodeT > nodes()
void update_normals(Object &object_orig, Object &object_eval)
Definition pbvh.cc:1045
void tag_attribute_changed(const IndexMask &node_mask, StringRef attribute_name)
Definition pbvh.cc:600
Tree(const Tree &other)=delete
void tag_positions_changed(const IndexMask &node_mask)
Definition pbvh.cc:559
static Tree from_bmesh(BMesh &bm)
Tree & operator=(const Tree &other)=delete
Span< NodeT > nodes() const
void update_bounds(const Depsgraph &depsgraph, const Object &object)
Definition pbvh.cc:1202
int nodes_num() const
Definition pbvh.cc:514
void update_bounds_grids(Span< float3 > positions, int grid_area)
Definition pbvh.cc:1175
void tag_face_sets_changed(const IndexMask &node_mask)
Definition pbvh.cc:586
Tree & operator=(Tree &&other)=default
void tag_masks_changed(const IndexMask &node_mask)
Definition pbvh.cc:593
std::unique_ptr< DrawCache > draw_data
void tag_visibility_changed(const IndexMask &node_mask)
Definition pbvh.cc:570
void update_visibility(const Object &object)
Definition pbvh.cc:1395
static Tree from_grids(const Mesh &base_mesh, const SubdivCCG &subdiv_ccg)
Definition pbvh.cc:395
static Tree from_mesh(const Mesh &mesh)
Definition pbvh.cc:233
void tag_topology_changed(const IndexMask &node_mask)
Definition pbvh.cc:579
Tree(Tree &&other)=default
void update_bounds_mesh(Span< float3 > vert_positions)
Definition pbvh.cc:1162
void update_bounds_bmesh(const BMesh &bm)
Definition pbvh.cc:1189
pixels::PBVHData * pixels_
std::variant< Vector< MeshNode >, Vector< GridsNode >, Vector< BMeshNode > > nodes_
void flush_bounds_to_parents()
Definition pbvh.cc:1122
#define log
ccl_device_inline float2 mask(const MaskType mask, const float2 a)
static char faces[256]
void raycast(Tree &pbvh, FunctionRef< void(Node &node, float *tmin)> hit_fn, const float3 &ray_start, const float3 &ray_normal, bool original)
IndexMask search_nodes(const Tree &pbvh, IndexMaskMemory &memory, FunctionRef< bool(const Node &)> filter_fn)
Definition pbvh.cc:2579
void update_mask_bmesh(const BMesh &bm, const IndexMask &node_mask, Tree &pbvh)
Definition pbvh.cc:1312
void update_normals(const Depsgraph &depsgraph, Object &object_orig, Tree &pbvh)
Definition pbvh.cc:1073
void update_mask_mesh(const Mesh &mesh, const IndexMask &node_mask, Tree &pbvh)
Definition pbvh.cc:1248
Span< float3 > vert_normals_eval_from_eval(const Object &object_eval)
Definition pbvh.cc:2441
IndexMask all_leaf_nodes(const Tree &pbvh, IndexMaskMemory &memory)
Definition pbvh.cc:2544
void clip_ray_ortho(Tree &pbvh, bool original, float ray_start[3], float ray_end[3], float ray_normal[3])
Definition pbvh.cc:1998
int count_grid_quads(const BitGroupVector<> &grid_hidden, Span< int > grid_indices, int gridsize, int display_gridsize)
Definition pbvh.cc:1421
bool node_raycast_mesh(const MeshNode &node, Span< float3 > node_positions, Span< float3 > vert_positions, OffsetIndices< int > faces, Span< int > corner_verts, Span< int3 > corner_tris, Span< bool > hide_poly, const float3 &ray_start, const float3 &ray_normal, IsectRayPrecalc *isect_precalc, float *depth, int &r_active_vertex, int &r_active_face_index, float3 &r_face_normal)
Definition pbvh.cc:1792
void update_node_bounds_bmesh(BMeshNode &node)
Definition pbvh.cc:1110
bool node_frustum_exclude_aabb(const Node &node, Span< float4 > frustum_planes)
Definition pbvh.cc:2341
Span< float3 > vert_positions_eval_from_eval(const Object &object_eval)
Definition pbvh.cc:2422
void node_update_mask_bmesh(int mask_offset, BMeshNode &node)
Definition pbvh.cc:1295
void node_update_mask_mesh(Span< float > mask, MeshNode &node)
Definition pbvh.cc:1237
void node_update_visibility_grids(const BitGroupVector<> &grid_hidden, GridsNode &node)
Definition pbvh.cc:1352
bool 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)
void node_update_mask_grids(const CCGKey &key, Span< float > masks, GridsNode &node)
Definition pbvh.cc:1265
bool node_raycast_grids(const SubdivCCG &subdiv_ccg, GridsNode &node, Span< float3 > node_positions, const float3 &ray_start, const float3 &ray_normal, const IsectRayPrecalc *isect_precalc, float *depth, SubdivCCGCoord &r_active_vertex, int &r_active_grid_index, float3 &r_face_normal)
Definition pbvh.cc:1908
void update_node_bounds_mesh(Span< float3 > positions, MeshNode &node)
Definition pbvh.cc:1090
void node_update_visibility_bmesh(BMeshNode &node)
Definition pbvh.cc:1376
Bounds< float3 > bounds_get(const Tree &pbvh)
Definition pbvh.cc:1477
void update_normals_from_eval(Object &object_eval, Tree &pbvh)
Definition pbvh.cc:1080
Span< float3 > vert_normals_eval(const Depsgraph &depsgraph, const Object &object_orig)
Definition pbvh.cc:2435
IndexMask nodes_to_face_selection_grids(const SubdivCCG &subdiv_ccg, Span< GridsNode > nodes, const IndexMask &nodes_mask, IndexMaskMemory &memory)
Definition pbvh.cc:1459
void update_mask_grids(const SubdivCCG &subdiv_ccg, const IndexMask &node_mask, Tree &pbvh)
Definition pbvh.cc:1279
MutableSpan< float3 > vert_positions_eval_for_write(const Depsgraph &depsgraph, Object &object_orig)
Definition pbvh.cc:2429
bool bmesh_update_topology(BMesh &bm, Tree &pbvh, BMLog &bm_log, PBVHTopologyUpdateMode mode, float min_edge_len, float max_edge_len, const float3 &center, const std::optional< float3 > &view_normal, float radius, bool use_frontface, bool use_projected)
bool raycast_node_detail_bmesh(const BMeshNode &node, const float3 &ray_start, const IsectRayPrecalc *isect_precalc, float *depth, float *r_edge_length)
Span< float3 > face_normals_eval_from_eval(const Object &object_eval)
Definition pbvh.cc:2448
void update_node_bounds_grids(int grid_area, Span< float3 > positions, GridsNode &node)
Definition pbvh.cc:1099
bool node_frustum_contain_aabb(const Node &node, Span< float4 > frustum_planes)
Definition pbvh.cc:2336
void build_pixels(const Depsgraph &depsgraph, Object &object, Image &image, ImageUser &image_user)
bool find_nearest_to_ray_node(Tree &pbvh, Node &node, Span< float3 > node_positions, bool use_origco, Span< float3 > vert_positions, const OffsetIndices< int > faces, Span< int > corner_verts, Span< int3 > corner_tris, Span< bool > hide_poly, const SubdivCCG *subdiv_ccg, const float ray_start[3], const float ray_normal[3], float *depth, float *dist_sq)
Definition pbvh.cc:2248
void store_bounds_orig(Tree &pbvh)
Definition pbvh.cc:1224
Span< int > node_face_indices_calc_grids(const SubdivCCG &subdiv_ccg, const GridsNode &node, Vector< int > &faces)
Definition pbvh.cc:1583
Span< float3 > vert_positions_eval(const Depsgraph &depsgraph, const Object &object_orig)
Definition pbvh.cc:2416
void node_update_visibility_mesh(Span< bool > hide_vert, MeshNode &node)
Definition pbvh.cc:1328
void find_nearest_to_ray(Tree &pbvh, const FunctionRef< void(Node &node, float *tmin)> fn, const float3 &ray_start, const float3 &ray_normal, bool original)
Definition pbvh.cc:2110
PythonProbingStrategy<> DefaultProbingStrategy
VecBase< float, 3 > float3
Array< BMVert *, 0 > orig_verts_
Array< float3, 0 > orig_positions_
Set< BMVert *, 0 > bm_unique_verts_
Set< BMVert *, 0 > bm_other_verts_
Span< int > all_verts() const
VectorSet< int, 0, DefaultProbingStrategy, DefaultHash< int >, DefaultEquality< int >, SimpleVectorSetSlot< int, LocalVertMapIndexT >, GuardedAllocator > LocalVertMap