44 return (this->v_low << 8) ^ this->
v_high;
70 const bool keep_existing_edges,
75 edge_maps, [&](
EdgeMap &edge_map) { edge_map.
reserve(totedge_guess / edge_maps.
size()); });
84 const int task_index = &edge_map - edge_maps.
data();
86 OrderedEdge ordered_edge{edge.v1, edge.v2};
88 if (task_index == (parallel_mask & ordered_edge.hash2())) {
89 edge_map.add_new(ordered_edge, {&edge});
101 const int task_index = &edge_map - edge_maps.
data();
103 Span<MLoop> poly_loops = loops.slice(poly.loopstart, poly.totloop);
104 const MLoop *prev_loop = &poly_loops.last();
105 for (const MLoop &next_loop : poly_loops) {
107 if (prev_loop->v != next_loop.v) {
108 OrderedEdge ordered_edge{prev_loop->v, next_loop.v};
110 if (task_index == (parallel_mask & ordered_edge.hash2())) {
111 edge_map.lookup_or_add(ordered_edge, {nullptr});
114 prev_loop = &next_loop;
128 edge_index_offsets[0] = 0;
130 edge_index_offsets[i + 1] = edge_index_offsets[i] + edge_maps[i].
size();
134 const int task_index = &edge_map - edge_maps.
data();
136 int new_edge_index = edge_index_offsets[task_index];
138 MEdge &new_edge = new_edges[new_edge_index];
139 const MEdge *orig_edge = item.value.original_edge;
140 if (orig_edge != nullptr) {
142 new_edge = *orig_edge;
146 new_edge.v1 = item.key.v_low;
147 new_edge.v2 = item.key.v_high;
148 new_edge.flag = new_edge_flag;
150 item.value.index = new_edge_index;
162 for (const int poly_index : range) {
163 MPoly &poly = mesh->mpoly[poly_index];
164 MutableSpan<MLoop> poly_loops = loops.slice(poly.loopstart, poly.totloop);
166 MLoop *prev_loop = &poly_loops.last();
167 for (MLoop &next_loop : poly_loops) {
169 if (prev_loop->v != next_loop.v) {
170 OrderedEdge ordered_edge{prev_loop->v, next_loop.v};
172 const EdgeMap &edge_map = edge_maps[parallel_mask & ordered_edge.hash2()];
173 edge_index = edge_map.lookup(ordered_edge).index;
181 prev_loop->e = edge_index;
182 prev_loop = &next_loop;
222 if (keep_existing_edges) {
229 for (
EdgeMap &edge_map : edge_maps) {
230 new_totedge += edge_map.size();
CustomData interface, see also DNA_customdata_types.h.
void CustomData_free(struct CustomData *data, int totelem)
void * CustomData_add_layer(struct CustomData *data, int type, eCDAllocType alloctype, void *layer, int totelem)
void CustomData_reset(struct CustomData *data)
MINLINE int power_of_2_min_i(int n)
MINLINE int is_power_of_2_i(int n)
int BLI_system_thread_count(void)
Object is a sort of wrapper for general info.
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint GLsizei GLsizei GLenum type _GL_VOID_RET _GL_VOID GLsizei GLenum GLenum const void *pixels _GL_VOID_RET _GL_VOID const void *pointer _GL_VOID_RET _GL_VOID GLdouble v _GL_VOID_RET _GL_VOID GLfloat v _GL_VOID_RET _GL_VOID GLint GLint i2 _GL_VOID_RET _GL_VOID GLint j _GL_VOID_RET _GL_VOID GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble GLdouble GLdouble zFar _GL_VOID_RET _GL_UINT GLdouble *equation _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLenum GLfloat *v _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLfloat *values _GL_VOID_RET _GL_VOID GLushort *values _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLenum GLdouble *params _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_BOOL GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLushort pattern _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint GLdouble v1
ATTR_WARN_UNUSED_RESULT const BMVert * v2
ItemIterator items() const
constexpr int64_t size() const
constexpr T * data() const
void *(* MEM_calloc_arrayN)(size_t len, size_t size, const char *str)
void BKE_mesh_calc_edges(Mesh *mesh, bool keep_existing_edges, const bool select_new_edges)
static int get_parallel_maps_count(const Mesh *mesh)
static void add_polygon_edges_to_hash_maps(Mesh *mesh, MutableSpan< EdgeMap > edge_maps, uint32_t parallel_mask)
static void update_edge_indices_in_poly_loops(Mesh *mesh, Span< EdgeMap > edge_maps, uint32_t parallel_mask)
static void serialize_and_initialize_deduplicated_edges(MutableSpan< EdgeMap > edge_maps, MutableSpan< MEdge > new_edges, short new_edge_flag)
static void reserve_hash_maps(const Mesh *mesh, const bool keep_existing_edges, MutableSpan< EdgeMap > edge_maps)
static void clear_hash_tables(MutableSpan< EdgeMap > edge_maps)
static void add_existing_edges_to_hash_maps(Mesh *mesh, MutableSpan< EdgeMap > edge_maps, uint32_t parallel_mask)
void parallel_for(IndexRange range, int64_t grain_size, const Function &function)
void parallel_for_each(Range &range, const Function &function)
unsigned __int64 uint64_t
OrderedEdge(const uint v1, const uint v2)
OrderedEdge(const int v1, const int v2)
friend bool operator==(const OrderedEdge &e1, const OrderedEdge &e2)
const MEdge * original_edge