36 #define INVALID_LOOP_EDGE_MARKER 4294967295u
146 return *(
int *)
v1 > *(
int *)
v2 ? 1 : *(
int *)
v1 < *(
int *)
v2 ? -1 : 0;
160 for (
int idx = 0; idx < max_idx; idx++) {
161 const int v1_i = sp1->
verts[idx];
162 const int v2_i = sp2->
verts[idx];
164 return (v1_i > v2_i) ? 1 : -1;
189 #define PRINT_MSG(...) \
191 CLOG_INFO(&LOG, 1, __VA_ARGS__); \
195 #define PRINT_ERR(...) \
199 CLOG_ERROR(&LOG, __VA_ARGS__); \
216 const bool do_verbose,
220 #define REMOVE_EDGE_TAG(_me) \
223 free_flag.edges = do_fixes; \
226 #define IS_REMOVED_EDGE(_me) (_me->v2 == _me->v1)
228 #define REMOVE_LOOP_TAG(_ml) \
230 _ml->e = INVALID_LOOP_EDGE_MARKER; \
231 free_flag.polyloops = do_fixes; \
234 #define REMOVE_POLY_TAG(_mp) \
236 _mp->totloop *= -1; \
237 free_flag.polyloops = do_fixes; \
253 int verts_weight : 1;
281 fix_flag.as_flag = 0;
282 free_flag.as_flag = 0;
283 recalc_flag.as_flag = 0;
285 PRINT_MSG(
"verts(%u), edges(%u), loops(%u), polygons(%u)", totvert, totedge, totloop, totpoly);
287 if (totedge == 0 && totpoly != 0) {
288 PRINT_ERR(
"\tLogical error, %u polygons and 0 edges", totpoly);
289 recalc_flag.edges = do_fixes;
292 const float(*vert_normals)[3] =
nullptr;
298 for (i = 0; i < totvert; i++,
mv++) {
299 bool fix_normal =
true;
301 for (j = 0; j < 3; j++) {
303 PRINT_ERR(
"\tVertex %u: has invalid coordinate", i);
308 fix_flag.verts =
true;
312 if (vert_normals && vert_normals[i][j] != 0.0f) {
318 if (vert_normals && fix_normal) {
329 PRINT_ERR(
"\tVertex %u: has zero normal, assuming Z-up normal", i);
331 float *
normal = (
float *)vert_normals[i];
333 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",
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 uint 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]);
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
552 "mesh validate's sort_polys");
553 SortPoly *prev_sp, *sp = sort_polys;
556 for (i = 0, mp = mpolys; i < totpoly; i++, mp++, sp++) {
562 if (mp->mat_nr < 0) {
563 PRINT_ERR(
"\tPoly %u has invalid material (%d)", sp->
index, mp->mat_nr);
569 if (mp->loopstart < 0 || mp->totloop < 3) {
571 PRINT_ERR(
"\tPoly %u is invalid (loopstart: %d, totloop: %d)",
577 else if (mp->loopstart + mp->totloop > totloop) {
580 "\tPoly %u uses loops out of range "
581 "(loopstart: %d, loopend: %d, max number of loops: %u)",
584 mp->loopstart + mp->totloop - 1,
592 sp->
verts =
v = (
int *)
MEM_mallocN(
sizeof(
int) * mp->totloop,
"Vert idx of SortPoly");
599 for (j = 0, ml = &mloops[sp->
loopstart]; j < mp->totloop; j++, ml++) {
600 if (ml->
v < totvert) {
606 for (j = 0, ml = &mloops[sp->
loopstart]; j < mp->totloop; j++, ml++,
v++) {
607 if (ml->
v >= totvert) {
613 PRINT_ERR(
"\tPoly %u has duplicated vert reference at corner (%u)", i, j);
627 for (j = 0, ml = &mloops[sp->
loopstart]; j < mp->totloop; j++, ml++) {
634 recalc_flag.edges =
true;
640 else if (ml->
e >= totedge) {
646 fix_flag.loops_edge =
true;
647 PRINT_ERR(
"\tLoop %u has invalid edge reference (%d), fixed using edge %u",
667 fix_flag.loops_edge =
true;
669 "\tPoly %u has invalid edge reference (%d, is_removed: %d), fixed using edge "
677 PRINT_ERR(
"\tPoly %u has invalid edge reference (%u)", sp->
index, ml->
e);
695 sp = prev_sp = sort_polys;
698 for (i = 1; i < totpoly; i++, sp++) {
700 const int *p1_v = sp->
verts, *p2_v = prev_sp->
verts;
709 if ((p1_nv == p2_nv) && (memcmp(p1_v, p2_v, p1_nv *
sizeof(*p1_v)) == 0)) {
713 for (j = 1; j < p1_nv; j++) {
733 for (i = 0; i < totpoly; i++, sp++) {
754 if (prev_end < sp->loopstart) {
755 for (j = prev_end, ml = &mloops[prev_end]; j < sp->
loopstart; j++, ml++) {
766 PRINT_ERR(
"\tPolys %u and %u share loops from %d to %d, considering poly %u as invalid.",
787 if (prev_end < totloop) {
788 for (j = prev_end, ml = &mloops[prev_end]; j < totloop; j++, ml++) {
804 for (i = 0, dv = dverts; i < totvert; i++, dv++) {
807 for (j = 0, dw = dv->
dw; j < dv->totweight; j++, dw++) {
813 fix_flag.verts_weight =
true;
820 fix_flag.verts_weight =
true;
826 if (dw->
def_nr >= INT_MAX) {
830 fix_flag.verts_weight =
true;
847 #undef REMOVE_EDGE_TAG
848 #undef IS_REMOVED_EDGE
849 #undef REMOVE_LOOP_TAG
850 #undef REMOVE_POLY_TAG
853 if (free_flag.faces) {
857 if (free_flag.polyloops) {
861 if (free_flag.edges) {
865 if (recalc_flag.edges) {
873 for (i = 0, msel =
mesh->
mselect; i < mesh->totselect; i++, msel++) {
876 if (msel->
index < 0) {
878 "\tMesh select element %u type %d index is negative, "
879 "resetting selection stack.\n",
882 free_flag.mselect = do_fixes;
886 switch (msel->
type) {
898 if (msel->
index > tot_elem) {
900 "\tMesh select element %u type %d index %d is larger than data array size %d, "
901 "resetting selection stack.\n",
907 free_flag.mselect = do_fixes;
912 if (free_flag.mselect) {
921 *r_changed = (fix_flag.as_flag || free_flag.as_flag || recalc_flag.as_flag);
923 BLI_assert((*r_changed ==
false) || (do_fixes ==
true));
931 const bool do_verbose,
936 bool has_fixes =
false;
939 PRINT_MSG(
"%s: Checking %d CD layers...\n", __func__,
data->totlayer);
941 while (i < data->totlayer) {
948 PRINT_ERR(
"\tCustomDataLayer type %d is a singleton, found %d in Mesh structure\n",
957 if ((layer_typemask &
mask) == 0) {
958 PRINT_ERR(
"\tCustomDataLayer type %d which isn't in the mask\n", layer->
type);
972 PRINT_ERR(
"\tCustomDataLayer type %d has some invalid data\n", layer->
type);
973 has_fixes = do_fixes;
979 PRINT_MSG(
"%s: Finished (is_valid=%d)\n\n", __func__, (
int)!has_fixes);
981 *r_change = has_fixes;
994 const bool check_meshmask,
995 const bool do_verbose,
1000 bool is_change_v, is_change_e, is_change_l, is_change_p;
1002 if (check_meshmask) {
1011 vdata,
mask.vmask, totvert, do_verbose, do_fixes, &is_change_v);
1013 edata,
mask.emask, totedge, do_verbose, do_fixes, &is_change_e);
1015 ldata,
mask.lmask, totloop, do_verbose, do_fixes, &is_change_l);
1017 pdata,
mask.pmask, totpoly, do_verbose, do_fixes, &is_change_p);
1022 "\tMore UV 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);
1090 const bool do_verbose =
true;
1091 const bool do_fixes =
false;
1094 bool changed =
true;
1138 const int totpoly = me->
totpoly;
1142 for (mp = me->
mpoly, i = 0; i < totpoly; i++, mp++) {
1169 for (
a =
b = 0, f = me->
mface; a < me->totface;
a++, f++) {
1192 for (
a =
b = 0, p = me->
mpoly; a < me->totpoly;
a++, p++) {
1193 bool invalid =
false;
1197 if (stop > me->
totloop || stop < i || p->loopstart < 0) {
1212 if (p->
totloop >= 3 && !invalid) {
1226 for (
a =
b = 0,
l = me->
mloop; a < me->totloop;
a++,
l++) {
1248 for (
a = 0, p = me->
mpoly; a < me->totpoly;
a++, p++) {
1262 for (
a =
b = 0,
e = me->
medge; a < me->totedge;
a++,
e++) {
1263 if (
e->v1 !=
e->v2) {
1283 for (
a = 0,
l = me->
mloop; a < me->totloop;
a++,
l++) {
1284 l->
e = new_idx[
l->
e];
1323 if (x1->
v1 >
x2->v1) {
1326 if (x1->
v1 <
x2->v1) {
1329 if (x1->
v2 >
x2->v2) {
1332 if (x1->
v2 <
x2->v2) {
1360 uint totedge_final = 0;
1365 for (
a = totface, mface = allface;
a > 0;
a--, mface++) {
1369 else if (mface->
v3) {
1386 for (
a = totface, mface = allface;
a > 0;
a--, mface++) {
1393 else if (mface->
v3) {
1402 for (
a = totedge, ed = edsort;
a > 1;
a--, ed++) {
1404 if (ed->
v1 != (ed + 1)->v1 || ed->
v2 != (ed + 1)->v2) {
1412 for (
a = totedge, med = medge, ed = edsort;
a > 1;
a--, ed++) {
1414 if (ed->
v1 != (ed + 1)->v1 || ed->
v2 != (ed + 1)->
v2) {
1417 if (use_old ==
false || ed->
is_draw) {
1426 if (ed->
v1 + 1 != ed->
v2) {
1449 for (edge_index = 0, med = medge; edge_index < totedge_final; edge_index++, med++) {
1454 for (
a = 0;
a < totpoly;
a++, mpoly++) {
1455 MLoop *ml, *ml_next;
1459 ml = &ml_next[i - 1];
1471 *r_totedge = totedge_final;
1529 for (
int i = 0; i < numFaces; i++, mf++) {
typedef float(TangentPoint)[2]
CustomData interface, see also DNA_customdata_types.h.
bool CustomData_layer_validate(struct CustomDataLayer *layer, uint totitems, bool do_fixes)
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)
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)
const float(* BKE_mesh_vertex_normals_ensure(const struct Mesh *mesh))[3]
void BKE_mesh_assert_normals_dirty_or_calculated(const struct Mesh *mesh)
bool BKE_mesh_vertex_normals_are_dirty(const struct Mesh *mesh)
void BKE_mesh_calc_edges(struct Mesh *mesh, bool keep_existing_edges, bool select_new_edges)
#define BLI_BITMAP_NEW(_num, _alloc_string)
#define BLI_BITMAP_TEST(_bitmap, _index)
#define BLI_BITMAP_ENABLE(_bitmap, _index)
#define BLI_BITMAP_DISABLE(_bitmap, _index)
void BLI_edgehash_free(EdgeHash *eh, EdgeHashFreeFP free_value)
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)
BLI_INLINE bool BLI_edgesetIterator_isDone(const EdgeSetIterator *esi)
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)
EdgeSet * BLI_edgeset_new_ex(const char *info, unsigned int nentries_reserve) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT
void BLI_edgeset_free(EdgeSet *es)
#define BLI_EDGEHASH_SIZE_GUESS_FROM_POLYS(totpoly)
EdgeSetIterator * BLI_edgesetIterator_new(EdgeSet *es)
bool BLI_edgehash_haskey(const EdgeHash *eh, unsigned int v0, unsigned int v1) ATTR_WARN_UNUSED_RESULT
int BLI_edgeset_len(const EdgeSet *es) ATTR_WARN_UNUSED_RESULT
EdgeHash * BLI_edgehash_new_ex(const char *info, unsigned int nentries_reserve)
void * BLI_edgehash_lookup(const EdgeHash *eh, unsigned int v0, unsigned int v1) ATTR_WARN_UNUSED_RESULT
MINLINE int max_ii(int a, int b)
MINLINE bool is_zero_v3(const float a[3]) ATTR_WARN_UNUSED_RESULT
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)
@ ID_RECALC_GEOMETRY_ALL_MODES
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 Output data from inside of a node group A color picker Mix two input colors RGB to Convert a color s luminance to a grayscale value Generate a normal vector and a dot product Bright Control the brightness and contrast of the input color Vector Map an input vectors to used to fine tune the interpolation of the input Camera Retrieve information about the camera and how it relates to the current shading point s position 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
IconTextureDrawCall normal
void(* MEM_freeN)(void *vmemh)
void *(* MEM_callocN)(size_t len, const char *str)
void *(* MEM_mallocN)(size_t len, const char *str)
ccl_device_inline float4 mask(const int4 &mask, const float4 &a)
void BKE_mesh_strip_loose_polysloops(Mesh *me)
#define CHECK_FACE_EDGE(a, b)
static bool mesh_validate_customdata(CustomData *data, eCustomDataMask mask, const uint totitems, const bool do_verbose, const bool do_fixes, bool *r_change)
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)
bool BKE_mesh_validate_arrays(Mesh *mesh, MVert *mverts, uint totvert, MEdge *medges, uint totedge, MFace *mfaces, uint totface, MLoop *mloops, uint totloop, MPoly *mpolys, uint totpoly, MDeformVert *dverts, const bool do_verbose, const bool do_fixes, bool *r_changed)
#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
#define REMOVE_EDGE_TAG(_me)
static int int64_cmp(const void *v1, const void *v2)
void BKE_mesh_strip_loose_edges(Mesh *me)
#define REMOVE_LOOP_TAG(_ml)
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)
static void to_edgesort(struct EdgeSort *ed, uint v1, uint v2, char is_loose, short is_draw)
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)
bool remove(void *owner, const AttributeIDRef &attribute_id)
static const pxr::TfToken b("b", pxr::TfToken::Immortal)
struct MDeformVert * dvert