60 return (this->v_low << 8) ^ this->
v_high;
86 const bool keep_existing_edges,
91 edge_maps, [&](
EdgeMap &edge_map) { edge_map.
reserve(totedge_guess / edge_maps.
size()); });
100 const int task_index = &edge_map - &edge_maps[0];
102 OrderedEdge ordered_edge{edge.v1, edge.v2};
104 if (task_index == (parallel_mask & ordered_edge.hash2())) {
105 edge_map.add_new(ordered_edge, {&edge});
117 const int task_index = &edge_map - &edge_maps[0];
119 Span<MLoop> poly_loops = loops.slice(poly.loopstart, poly.totloop);
120 const MLoop *prev_loop = &poly_loops.last();
121 for (const MLoop &next_loop : poly_loops) {
123 if (prev_loop->v != next_loop.v) {
124 OrderedEdge ordered_edge{prev_loop->v, next_loop.v};
126 if (task_index == (parallel_mask & ordered_edge.hash2())) {
127 edge_map.lookup_or_add(ordered_edge, {nullptr});
130 prev_loop = &next_loop;
144 edge_index_offsets[0] = 0;
146 edge_index_offsets[i + 1] = edge_index_offsets[i] + edge_maps[i].
size();
150 const int task_index = &edge_map - &edge_maps[0];
152 int new_edge_index = edge_index_offsets[task_index];
154 MEdge &new_edge = new_edges[new_edge_index];
155 const MEdge *orig_edge = item.value.original_edge;
156 if (orig_edge != nullptr) {
158 new_edge = *orig_edge;
162 new_edge.v1 = item.key.v_low;
163 new_edge.v2 = item.key.v_high;
164 new_edge.flag = new_edge_flag;
166 item.value.index = new_edge_index;
178 for (const int poly_index : range) {
179 MPoly &poly = mesh->mpoly[poly_index];
180 MutableSpan<MLoop> poly_loops = loops.slice(poly.loopstart, poly.totloop);
182 MLoop *prev_loop = &poly_loops.last();
183 for (MLoop &next_loop : poly_loops) {
185 if (prev_loop->v != next_loop.v) {
186 OrderedEdge ordered_edge{prev_loop->v, next_loop.v};
188 const EdgeMap &edge_map = edge_maps[parallel_mask & ordered_edge.hash2()];
189 edge_index = edge_map.lookup(ordered_edge).index;
197 prev_loop->e = edge_index;
198 prev_loop = &next_loop;
241 if (keep_existing_edges) {
248 for (
EdgeMap &edge_map : edge_maps) {
249 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
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