51 #define INVALID_LOOP_EDGE_MARKER 4294967295u
126 if (sfa->
es[0].
edval > sfb->es[0].edval) {
129 if (sfa->
es[0].
edval < sfb->es[0].edval) {
133 if (sfa->
es[1].
edval > sfb->es[1].edval) {
136 if (sfa->
es[1].
edval < sfb->es[1].edval) {
140 if (sfa->
es[2].
edval > sfb->es[2].edval) {
143 if (sfa->
es[2].
edval < sfb->es[2].edval) {
147 if (sfa->
es[3].
edval > sfb->es[3].edval) {
150 if (sfa->
es[3].
edval < sfb->es[3].edval) {
160 return *(
int *)
v1 > *(
int *)
v2 ? 1 : *(
int *)
v1 < *(
int *)
v2 ? -1 : 0;
174 for (
int idx = 0; idx < max_idx; idx++) {
175 const int v1_i = sp1->
verts[idx];
176 const int v2_i = sp2->
verts[idx];
178 return (v1_i > v2_i) ? 1 : -1;
202 #define PRINT_MSG(...) \
204 CLOG_INFO(&LOG, 1, __VA_ARGS__); \
208 #define PRINT_ERR(...) \
212 CLOG_ERROR(&LOG, __VA_ARGS__); \
224 unsigned int totvert,
226 unsigned int totedge,
228 unsigned int totface,
230 unsigned int totloop,
232 unsigned int totpoly,
234 const bool do_verbose,
238 #define REMOVE_EDGE_TAG(_me) \
241 free_flag.edges = do_fixes; \
244 #define IS_REMOVED_EDGE(_me) (_me->v2 == _me->v1)
246 #define REMOVE_LOOP_TAG(_ml) \
248 _ml->e = INVALID_LOOP_EDGE_MARKER; \
249 free_flag.polyloops = do_fixes; \
252 #define REMOVE_POLY_TAG(_mp) \
254 _mp->totloop *= -1; \
255 free_flag.polyloops = do_fixes; \
271 int verts_weight : 1;
299 fix_flag.as_flag = 0;
300 free_flag.as_flag = 0;
301 recalc_flag.as_flag = 0;
303 PRINT_MSG(
"verts(%u), edges(%u), loops(%u), polygons(%u)", totvert, totedge, totloop, totpoly);
305 if (totedge == 0 && totpoly != 0) {
306 PRINT_ERR(
"\tLogical error, %u polygons and 0 edges", totpoly);
307 recalc_flag.edges = do_fixes;
310 for (i = 0; i < totvert; i++,
mv++) {
311 bool fix_normal =
true;
313 for (j = 0; j < 3; j++) {
315 PRINT_ERR(
"\tVertex %u: has invalid coordinate", i);
320 fix_flag.verts =
true;
324 if (
mv->no[j] != 0) {
331 PRINT_ERR(
"\tVertex %u: has zero normal, assuming Z-up normal", i);
333 mv->no[2] = SHRT_MAX;
334 fix_flag.verts =
true;
339 for (i = 0, me = medges; i < totedge; i++, me++) {
342 if (me->
v1 == me->
v2) {
343 PRINT_ERR(
"\tEdge %u: has matching verts, both %u", i, me->
v1);
346 if (me->
v1 >= totvert) {
347 PRINT_ERR(
"\tEdge %u: v1 index out of range, %u", i, me->
v1);
350 if (me->
v2 >= totvert) {
351 PRINT_ERR(
"\tEdge %u: v2 index out of range, %u", i, me->
v2);
356 PRINT_ERR(
"\tEdge %u: is a duplicate of %d",
362 if (remove ==
false) {
363 if (me->
v1 != me->
v2) {
372 if (mfaces && !mpolys) {
373 #define REMOVE_FACE_TAG(_mf) \
376 free_flag.faces = do_fixes; \
379 #define CHECK_FACE_VERT_INDEX(a, b) \
380 if (mf->a == mf->b) { \
381 PRINT_ERR(" face %u: verts invalid, " STRINGIFY(a) "/" STRINGIFY(b) " both %u", i, mf->a); \
385 #define CHECK_FACE_EDGE(a, b) \
386 if (!BLI_edgehash_haskey(edge_hash, mf->a, mf->b)) { \
387 PRINT_ERR(" face %u: edge " STRINGIFY(a) "/" STRINGIFY(b) " (%u,%u) is missing edge data", \
391 recalc_flag.edges = do_fixes; \
401 unsigned int totsortface = 0;
403 PRINT_ERR(
"No Polys, only tessellated Faces");
405 for (i = 0, mf = mfaces, sf = sort_faces; i < totface; i++, mf++) {
410 fidx = mf->
v4 ? 3 : 2;
412 fv[fidx] = *(&(mf->
v1) + fidx);
413 if (fv[fidx] >= totvert) {
414 PRINT_ERR(
"\tFace %u: 'v%d' index out of range, %u", i, fidx + 1, fv[fidx]);
419 if (remove ==
false) {
437 if (remove ==
false) {
480 for (i = 1; i < totsortface; i++, sf++) {
484 if (memcmp(sf->
es, sf_prev->
es,
sizeof(sf_prev->
es)) == 0) {
485 mf = mfaces + sf->
index;
488 mf_prev = mfaces + sf_prev->
index;
491 PRINT_ERR(
"\tFace %u & %u: are duplicates (%u,%u,%u,%u) (%u,%u,%u,%u)",
504 PRINT_ERR(
"\tFace %u & %u: are duplicates (%u,%u,%u) (%u,%u,%u)",
529 #undef REMOVE_FACE_TAG
530 #undef CHECK_FACE_VERT_INDEX
531 #undef CHECK_FACE_EDGE
550 SortPoly *prev_sp, *sp = sort_polys;
553 for (i = 0, mp = mpolys; i < totpoly; i++, mp++, sp++) {
559 if (mp->mat_nr < 0) {
560 PRINT_ERR(
"\tPoly %u has invalid material (%d)", sp->
index, mp->mat_nr);
566 if (mp->loopstart < 0 || mp->totloop < 3) {
568 PRINT_ERR(
"\tPoly %u is invalid (loopstart: %d, totloop: %d)",
574 else if (mp->loopstart + mp->totloop > totloop) {
577 "\tPoly %u uses loops out of range (loopstart: %d, loopend: %d, max nbr of loops: %u)",
580 mp->loopstart + mp->totloop - 1,
595 for (j = 0, ml = &mloops[sp->
loopstart]; j < mp->totloop; j++, ml++) {
596 if (ml->
v < totvert) {
602 for (j = 0, ml = &mloops[sp->
loopstart]; j < mp->totloop; j++, ml++,
v++) {
603 if (ml->
v >= totvert) {
609 PRINT_ERR(
"\tPoly %u has duplicated vert reference at corner (%u)", i, j);
623 for (j = 0, ml = &mloops[sp->
loopstart]; j < mp->totloop; j++, ml++) {
630 recalc_flag.edges =
true;
636 else if (ml->
e >= totedge) {
642 fix_flag.loops_edge =
true;
643 PRINT_ERR(
"\tLoop %u has invalid edge reference (%d), fixed using edge %u",
663 fix_flag.loops_edge =
true;
665 "\tPoly %u has invalid edge reference (%d, is_removed: %d), fixed using edge "
673 PRINT_ERR(
"\tPoly %u has invalid edge reference (%u)", sp->
index, ml->
e);
689 sp = prev_sp = sort_polys;
692 for (i = 1; i < totpoly; i++, sp++) {
694 const int *p1_v = sp->
verts, *p2_v = prev_sp->
verts;
703 if ((p1_nv == p2_nv) && (memcmp(p1_v, p2_v, p1_nv *
sizeof(*p1_v)) == 0)) {
707 for (j = 1; j < p1_nv; j++) {
727 for (i = 0; i < totpoly; i++, sp++) {
747 if (prev_end < sp->loopstart) {
748 for (j = prev_end, ml = &mloops[prev_end]; j < sp->
loopstart; j++, ml++) {
759 PRINT_ERR(
"\tPolys %u and %u share loops from %d to %d, considering poly %u as invalid.",
780 if (prev_end < totloop) {
781 for (j = prev_end, ml = &mloops[prev_end]; j < totloop; j++, ml++) {
797 for (i = 0, dv = dverts; i < totvert; i++, dv++) {
800 for (j = 0, dw = dv->
dw; j < dv->totweight; j++, dw++) {
806 fix_flag.verts_weight =
true;
813 fix_flag.verts_weight =
true;
819 if (dw->
def_nr >= INT_MAX) {
823 fix_flag.verts_weight =
true;
840 #undef REMOVE_EDGE_TAG
841 #undef IS_REMOVED_EDGE
842 #undef REMOVE_LOOP_TAG
843 #undef REMOVE_POLY_TAG
846 if (free_flag.faces) {
850 if (free_flag.polyloops) {
854 if (free_flag.edges) {
858 if (recalc_flag.edges) {
866 for (i = 0, msel =
mesh->
mselect; i < mesh->totselect; i++, msel++) {
869 if (msel->
index < 0) {
871 "\tMesh select element %u type %d index is negative, "
872 "resetting selection stack.\n",
875 free_flag.mselect = do_fixes;
879 switch (msel->
type) {
891 if (msel->
index > tot_elem) {
893 "\tMesh select element %u type %d index %d is larger than data array size %d, "
894 "resetting selection stack.\n",
900 free_flag.mselect = do_fixes;
905 if (free_flag.mselect) {
914 *r_changed = (fix_flag.as_flag || free_flag.as_flag || recalc_flag.as_flag);
916 BLI_assert((*r_changed ==
false) || (do_fixes ==
true));
924 const bool do_verbose,
929 bool has_fixes =
false;
932 PRINT_MSG(
"%s: Checking %d CD layers...\n", __func__,
data->totlayer);
934 while (i < data->totlayer) {
941 PRINT_ERR(
"\tCustomDataLayer type %d is a singleton, found %d in Mesh structure\n",
950 if ((layer_typemask &
mask) == 0) {
951 PRINT_ERR(
"\tCustomDataLayer type %d which isn't in the mask\n", layer->
type);
965 PRINT_ERR(
"\tCustomDataLayer type %d has some invalid data\n", layer->
type);
966 has_fixes = do_fixes;
972 PRINT_MSG(
"%s: Finished (is_valid=%d)\n\n", __func__, (
int)!has_fixes);
974 *r_change = has_fixes;
990 const bool check_meshmask,
991 const bool do_verbose,
996 bool is_change_v, is_change_e, is_change_l, is_change_p;
998 if (check_meshmask) {
1003 vdata,
mask.vmask, totvert, do_verbose, do_fixes, &is_change_v);
1005 edata,
mask.emask, totedge, do_verbose, do_fixes, &is_change_e);
1007 ldata,
mask.lmask, totloop, do_verbose, do_fixes, &is_change_l);
1009 pdata,
mask.pmask, totpoly, do_verbose, do_fixes, &is_change_p);
1015 "\tMore UV layers than %d allowed, %d last ones won't be available for render, shaders, "
1022 "\tMore VCol layers than %d allowed, %d last ones won't be available for render, shaders, "
1038 *r_change = (is_change_v || is_change_e || is_change_l || is_change_p);
1103 const bool do_verbose =
true;
1104 const bool do_fixes =
false;
1107 bool changed =
true;
1153 const int totpoly = me->
totpoly;
1157 for (mp = me->
mpoly, i = 0; i < totpoly; i++, mp++) {
1184 for (
a = b = 0, f = me->
mface; a < me->totface;
a++, f++) {
1187 memcpy(&me->
mface[b], f,
sizeof(me->
mface[b]));
1214 for (
a = b = 0, p = me->
mpoly; a < me->totpoly;
a++, p++) {
1215 bool invalid =
false;
1219 if (stop > me->
totloop || stop < i || p->loopstart < 0) {
1234 if (p->
totloop >= 3 && !invalid) {
1236 memcpy(&me->
mpoly[b], p,
sizeof(me->
mpoly[b]));
1248 for (
a = b = 0,
l = me->
mloop; a < me->totloop;
a++,
l++) {
1270 for (
a = 0, p = me->
mpoly; a < me->totpoly;
a++, p++) {
1284 for (
a = b = 0,
e = me->
medge; a < me->totedge;
a++,
e++) {
1285 if (
e->v1 !=
e->v2) {
1305 for (
a = 0,
l = me->
mloop; a < me->totloop;
a++,
l++) {
1306 l->
e = new_idx[
l->
e];
1326 struct EdgeSort *ed,
unsigned int v1,
unsigned int v2,
char is_loose,
short is_draw)
1344 if (x1->
v1 >
x2->v1) {
1347 if (x1->
v1 <
x2->v1) {
1350 if (x1->
v2 >
x2->v2) {
1353 if (x1->
v2 <
x2->v2) {
1381 unsigned int totedge_final = 0;
1382 unsigned int edge_index;
1386 for (
a = totface, mface = allface;
a > 0;
a--, mface++) {
1390 else if (mface->
v3) {
1407 for (
a = totface, mface = allface;
a > 0;
a--, mface++) {
1414 else if (mface->
v3) {
1423 for (
a = totedge, ed = edsort;
a > 1;
a--, ed++) {
1425 if (ed->
v1 != (ed + 1)->v1 || ed->
v2 != (ed + 1)->v2) {
1433 for (
a = totedge, med = medge, ed = edsort;
a > 1;
a--, ed++) {
1435 if (ed->
v1 != (ed + 1)->v1 || ed->
v2 != (ed + 1)->v2) {
1438 if (use_old ==
false || ed->
is_draw) {
1447 if (ed->
v1 + 1 != ed->
v2) {
1448 SWAP(
unsigned int, med->
v1, med->
v2);
1470 for (edge_index = 0, med = medge; edge_index < totedge_final; edge_index++, med++) {
1475 for (
a = 0;
a < totpoly;
a++, mpoly++) {
1476 MLoop *ml, *ml_next;
1480 ml = &ml_next[i - 1];
1492 *r_totedge = totedge_final;
1560 for (
int i = 0; i < numFaces; i++, mf++) {
1596 mesh->edata = edgeData;
CustomData interface, see also DNA_customdata_types.h.
void CustomData_free(struct CustomData *data, int totelem)
int CustomData_number_of_layers(const struct CustomData *data, int type)
int CustomData_get_clone_layer(const struct CustomData *data, int type)
bool CustomData_free_layer(struct CustomData *data, int type, int totelem, int index)
bool CustomData_layertype_is_singleton(int type)
bool CustomData_layer_validate(struct CustomDataLayer *layer, const uint totitems, const bool do_fixes)
void CustomData_set_layer_clone(struct CustomData *data, int type, int n)
int CustomData_get_stencil_layer(const struct CustomData *data, int type)
void * CustomData_get_layer(const struct CustomData *data, int type)
void * CustomData_add_layer(struct CustomData *data, int type, eCDAllocType alloctype, void *layer, int totelem)
void CustomData_free_elem(struct CustomData *data, int index, int count)
void CustomData_set_layer_stencil(struct CustomData *data, int type, int n)
#define CD_TYPE_AS_MASK(_type)
void CustomData_copy_data(const struct CustomData *source, struct CustomData *dest, int source_index, int dest_index, int count)
const CustomData_MeshMasks CD_MASK_MESH
void CustomData_reset(struct CustomData *data)
void BKE_mesh_calc_edges(struct Mesh *mesh, bool keep_existing_edges, const bool select_new_edges)
void BLI_edgehash_free(EdgeHash *eh, EdgeHashFreeFP free_value)
BLI_INLINE bool BLI_edgesetIterator_isDone(EdgeSetIterator *esi)
EdgeHash * BLI_edgehash_new_ex(const char *info, const unsigned int nentries_reserve)
void BLI_edgehash_insert(EdgeHash *eh, unsigned int v0, unsigned int v1, void *val)
bool BLI_edgeset_add(EdgeSet *es, unsigned int v0, unsigned int v1)
int BLI_edgeset_len(EdgeSet *es) ATTR_WARN_UNUSED_RESULT
BLI_INLINE void BLI_edgesetIterator_step(EdgeSetIterator *esi)
BLI_INLINE void BLI_edgesetIterator_getKey(EdgeSetIterator *esi, unsigned int *r_v0, unsigned int *r_v1)
void BLI_edgesetIterator_free(EdgeSetIterator *esi)
void BLI_edgeset_free(EdgeSet *es)
#define BLI_EDGEHASH_SIZE_GUESS_FROM_POLYS(totpoly)
EdgeSetIterator * BLI_edgesetIterator_new(EdgeSet *es)
void * BLI_edgehash_lookup(EdgeHash *eh, unsigned int v0, unsigned int v1) ATTR_WARN_UNUSED_RESULT
EdgeSet * BLI_edgeset_new_ex(const char *info, const unsigned int nentries_reserve) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT
bool BLI_edgehash_haskey(EdgeHash *eh, unsigned int v0, unsigned int v1) ATTR_WARN_UNUSED_RESULT
MINLINE int max_ii(int a, int b)
MINLINE void zero_v3(float r[3])
#define POINTER_FROM_INT(i)
#define POINTER_AS_UINT(i)
#define POINTER_AS_INT(i)
#define POINTER_FROM_UINT(i)
#define CLOG_INFO(clg_ref, level,...)
void DEG_id_tag_update(struct ID *id, int flag)
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 GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble u2 _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLdouble GLdouble v2 _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLdouble GLdouble nz _GL_VOID_RET _GL_VOID GLfloat GLfloat nz _GL_VOID_RET _GL_VOID GLint GLint nz _GL_VOID_RET _GL_VOID GLshort GLshort nz _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const GLfloat *values _GL_VOID_RET _GL_VOID GLsizei const GLushort *values _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID const GLuint const GLclampf *priorities _GL_VOID_RET _GL_VOID GLdouble y _GL_VOID_RET _GL_VOID GLfloat y _GL_VOID_RET _GL_VOID GLint y _GL_VOID_RET _GL_VOID GLshort y _GL_VOID_RET _GL_VOID GLdouble GLdouble z _GL_VOID_RET _GL_VOID GLfloat GLfloat z _GL_VOID_RET _GL_VOID GLint GLint z _GL_VOID_RET _GL_VOID GLshort GLshort z _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble w _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat w _GL_VOID_RET _GL_VOID GLint GLint GLint w _GL_VOID_RET _GL_VOID GLshort GLshort GLshort w _GL_VOID_RET _GL_VOID GLdouble GLdouble x2
_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
Read Guarded memory(de)allocation.
Group RGB to Bright Vector Camera CLAMP
ATTR_WARN_UNUSED_RESULT const BMVert * v2
ATTR_WARN_UNUSED_RESULT const BMLoop * l
ATTR_WARN_UNUSED_RESULT const BMVert const BMEdge * e
ATTR_WARN_UNUSED_RESULT const BMVert * v
void(* MEM_freeN)(void *vmemh)
void *(* MEM_callocN)(size_t len, const char *str)
void *(* MEM_mallocN)(size_t len, const char *str)
void BKE_mesh_strip_loose_polysloops(Mesh *me)
#define CHECK_FACE_EDGE(a, b)
static void edge_store_from_mface_quad(EdgeUUID es[4], MFace *mf)
#define IS_REMOVED_EDGE(_me)
static void mesh_calc_edges_mdata(MVert *UNUSED(allvert), MFace *allface, MLoop *allloop, MPoly *allpoly, int UNUSED(totvert), int totface, int UNUSED(totloop), int totpoly, const bool use_old, MEdge **r_medge, int *r_totedge)
static int search_face_cmp(const void *v1, const void *v2)
static int vergedgesort(const void *v1, const void *v2)
static int search_poly_cmp(const void *v1, const void *v2)
static void edge_store_assign(uint32_t verts[2], const uint32_t v1, const uint32_t v2)
void BKE_mesh_calc_edges_legacy(Mesh *me, const bool use_old)
void BKE_mesh_calc_edges_tessface(Mesh *mesh)
#define CHECK_FACE_VERT_INDEX(a, b)
#define REMOVE_FACE_TAG(_mf)
static int search_polyloop_cmp(const void *v1, const void *v2)
#define REMOVE_POLY_TAG(_mp)
#define INVALID_LOOP_EDGE_MARKER
static void to_edgesort(struct EdgeSort *ed, unsigned int v1, unsigned int v2, char is_loose, short is_draw)
#define REMOVE_EDGE_TAG(_me)
bool BKE_mesh_validate_arrays(Mesh *mesh, MVert *mverts, unsigned int totvert, MEdge *medges, unsigned int totedge, MFace *mfaces, unsigned int totface, MLoop *mloops, unsigned int totloop, MPoly *mpolys, unsigned int totpoly, MDeformVert *dverts, const bool do_verbose, const bool do_fixes, bool *r_changed)
static int int64_cmp(const void *v1, const void *v2)
void BKE_mesh_strip_loose_edges(Mesh *me)
#define REMOVE_LOOP_TAG(_ml)
static bool mesh_validate_customdata(CustomData *data, CustomDataMask mask, const uint totitems, const bool do_verbose, const bool do_fixes, bool *r_change)
static int int_cmp(const void *v1, const void *v2)
bool BKE_mesh_validate_material_indices(Mesh *me)
bool BKE_mesh_validate(Mesh *me, const bool do_verbose, const bool cddata_check_mask)
void BKE_mesh_calc_edges_loose(Mesh *mesh)
bool BKE_mesh_is_valid(Mesh *me)
static void edge_store_from_mface_tri(EdgeUUID es[4], MFace *mf)
bool BKE_mesh_validate_all_customdata(CustomData *vdata, const uint totvert, CustomData *edata, const uint totedge, CustomData *ldata, const uint totloop, CustomData *pdata, const uint totpoly, const bool check_meshmask, const bool do_verbose, const bool do_fixes, bool *r_change)
void BKE_mesh_strip_loose_faces(Mesh *me)
struct CustomData pdata ldata
struct MDeformVert * dvert
struct CustomData vdata edata fdata
ccl_device_inline float4 mask(const int4 &mask, const float4 &a)