28 # pragma GCC diagnostic error "-Wsign-conversion"
36 #define USE_NONMANIFOLD_WORKAROUND
48 return !((edge_ref->
p1 == 0) && (edge_ref->
p2 == 0));
58 int i, verts_num, edges_num, polys_num;
82 (
size_t)edges_num,
sizeof(
EdgeFaceRef),
"Edge Connectivity");
87 for (i = 0; i < polys_num; i++, mp++) {
92 for (j = 0; j < mp->
totloop; j++, ml++) {
94 edge_ref = &edge_ref_array[ml->
e];
99 else if ((edge_ref->
p1 != -1) && (edge_ref->
p2 == -1)) {
104 edge_ref->
p1 = edge_ref->
p2 = -1;
105 #ifdef USE_NONMANIFOLD_WORKAROUND
113 for (i = 0, ed = medge, edge_ref = edge_ref_array; i < edges_num; i++, ed++, edge_ref++) {
117 if (edge_ref->
p2 != -1) {
121 add_v3_v3v3(edge_normal, face_nors[edge_ref->f1], face_nors[edge_ref->f2]);
127 edge_normal, poly_nors[edge_ref->
p1], poly_nors[edge_ref->
p2]);
135 add_v3_v3(r_vert_nors[ed->v1], edge_normal);
136 add_v3_v3(r_vert_nors[ed->v2], edge_normal);
144 for (i = 0; i < verts_num; i++) {
163 MVert *
mv, *mvert, *orig_mvert;
164 MEdge *ed, *medge, *orig_medge;
165 MLoop *ml, *mloop, *orig_mloop;
166 MPoly *mp, *mpoly, *orig_mpoly;
171 uint newLoops = 0, newPolys = 0, newEdges = 0, newVerts = 0, rimVerts = 0;
175 const short mat_ofs = mat_nr_max ? smd->
mat_ofs : 0;
176 const short mat_ofs_rim = mat_nr_max ? smd->
mat_ofs_rim : 0;
187 verts_num,
sizeof(*old_vert_arr),
"old_vert_arr in solidify");
190 int *edge_order =
NULL;
201 const float ofs_new = smd->
offset + ofs_orig;
208 const bool do_bevel_convex = bevel_convex != 0.0f;
231 if (need_poly_normals) {
244 #define INVALID_UNUSED ((uint)-1)
245 #define INVALID_PAIR ((uint)-2)
247 new_vert_arr =
MEM_malloc_arrayN(verts_num, 2 *
sizeof(*new_vert_arr), __func__);
249 ((edges_num * 2) + verts_num),
sizeof(*new_edge_arr), __func__);
251 edge_users =
MEM_malloc_arrayN(edges_num,
sizeof(*edge_users),
"solid_mod edges");
252 edge_order =
MEM_malloc_arrayN(edges_num,
sizeof(*edge_order),
"solid_mod order");
259 for (eidx = 0, ed = orig_medge; eidx < edges_num; eidx++, ed++) {
263 for (i = 0, mp = orig_mpoly; i < polys_num; i++, mp++) {
268 ml_prev = ml + (mp->
totloop - 1);
270 for (j = 0; j < mp->
totloop; j++, ml++) {
274 ed = orig_medge + eidx;
276 edge_users[eidx] = (ml_prev->
v > ml->
v) == (ed->
v1 < ed->
v2) ? i : (i + polys_num);
277 edge_order[eidx] = j;
286 for (eidx = 0, ed = orig_medge; eidx < edges_num; eidx++, ed++) {
296 for (i = 0; i < verts_num; i++) {
310 if (do_shell ==
false) {
328 (
int)((verts_num *
stride) + newVerts),
329 (
int)((edges_num *
stride) + newEdges + rimVerts),
331 (
int)((loops_num *
stride) + newLoops),
332 (
int)((polys_num *
stride) + newPolys));
339 if (do_bevel_convex) {
364 for (i = 0, j = (
int)verts_num; i < verts_num; i++) {
373 for (i = 0, j = (
int)edges_num; i < edges_num; i++) {
375 MEdge *ed_src, *ed_dst;
380 ed_dst->
v1 = old_vert_arr[ed_src->
v1] + verts_num;
381 ed_dst->
v2 = old_vert_arr[ed_src->
v2] + verts_num;
392 #define INIT_VERT_ARRAY_OFFSETS(test) \
393 if (((ofs_new >= ofs_orig) == do_flip) == test) { \
395 do_shell_align = true; \
401 do_shell_align = true; \
405 do_shell_align = false; \
407 mv = &mvert[verts_num]; \
416 mp = mpoly + polys_num;
418 const int loop_end = mp->
totloop - 1;
427 for (j = 0; j < mp->
totloop; j++) {
438 for (
int j_prev = loop_end; j < mp->
totloop; j_prev = j++) {
453 for (j = 0; j < loop_end; j++) {
454 ml2[j].
e = ml2[j + 1].
e;
460 for (j = 0; j < mp->
totloop; j++) {
461 ml2[j].
e += edges_num;
462 ml2[j].
v += verts_num;
466 for (i = 0, ed = medge + edges_num; i < edges_num; i++, ed++) {
475 float ofs_new_vgroup;
478 float *vert_lens =
NULL;
479 float *vert_angs =
NULL;
484 float *edge_angs =
NULL;
488 copy_vn_fl(vert_lens, (
int)verts_num, FLT_MAX);
489 for (
uint i = 0; i < edges_num; i++) {
491 vert_lens[medge[i].
v1] =
min_ff(vert_lens[medge[i].
v1], ed_len_sq);
492 vert_lens[medge[i].v2] =
min_ff(vert_lens[medge[i].
v2], ed_len_sq);
496 if (do_angle_clamp || do_bevel_convex) {
498 if (do_angle_clamp) {
502 if (do_bevel_convex) {
505 edge_users =
MEM_malloc_arrayN(edges_num,
sizeof(*edge_users),
"solid_mod edges");
509 edges_num,
sizeof(*edge_user_pairs),
"edge_user_pairs");
510 for (eidx = 0; eidx < edges_num; eidx++) {
515 for (
uint i = 0; i < polys_num; i++, mp++) {
522 ed = orig_medge + eidx;
524 char flip = (char)((ml_prev->
v > ml->
v) == (ed->
v1 < ed->
v2));
526 edge_user_pairs[eidx][flip] = i;
537 for (
uint i = 0; i < edges_num; i++, ed++) {
540 const float *n0 = poly_nors[edge_user_pairs[i][0]];
541 const float *n1 = poly_nors[edge_user_pairs[i][1]];
545 if (do_angle_clamp) {
549 if (do_bevel_convex) {
550 edge_angs[i] =
angle;
560 if (ofs_new != 0.0f) {
564 ofs_new_vgroup = ofs_new;
568 for (i_orig = 0; i_orig < i_end; i_orig++,
mv++) {
569 const uint i = do_shell_align ? i_orig : new_vert_arr[i_orig];
578 ofs_new_vgroup = (offset_fac_vg + (ofs_new_vgroup * offset_fac_vg_inv)) * ofs_new;
580 if (do_clamp &&
offset > FLT_EPSILON) {
583 ofs_new_vgroup = ofs_new;
585 if (do_angle_clamp) {
586 float cos_ang =
cosf(((2 *
M_PI) - vert_angs[i]) * 0.5f);
588 float max_off =
sqrtf(vert_lens[i]) * 0.5f / cos_ang;
589 if (max_off <
offset * 0.5f) {
590 ofs_new_vgroup *= max_off /
offset * 2;
595 if (vert_lens[i] < offset_sq) {
597 ofs_new_vgroup *= scalar;
610 if (ofs_orig != 0.0f) {
614 ofs_new_vgroup = ofs_orig;
619 for (i_orig = 0; i_orig < i_end; i_orig++,
mv++) {
620 const uint i = do_shell_align ? i_orig : new_vert_arr[i_orig];
629 ofs_new_vgroup = (offset_fac_vg + (ofs_new_vgroup * offset_fac_vg_inv)) * ofs_orig;
631 if (do_clamp &&
offset > FLT_EPSILON) {
634 ofs_new_vgroup = ofs_orig;
636 if (do_angle_clamp) {
637 float cos_ang =
cosf(vert_angs[i_orig] * 0.5f);
639 float max_off =
sqrtf(vert_lens[i]) * 0.5f / cos_ang;
640 if (max_off <
offset * 0.5f) {
641 ofs_new_vgroup *= max_off /
offset * 2;
646 if (vert_lens[i] < offset_sq) {
648 ofs_new_vgroup *= scalar;
661 if (do_bevel_convex) {
662 for (
uint i = 0; i < edges_num; i++) {
664 float angle = edge_angs[i];
667 clamp_f(bevel_convex, -1.0f, 0.0f)) *
673 (
int)medge[i + edges_num].
bweight +
675 clamp_f(bevel_convex, -1.0f, 0.0f)) *
690 if (do_angle_clamp) {
696 #ifdef USE_NONMANIFOLD_WORKAROUND
701 verts_num,
sizeof(
float[2]),
"mod_solid_pair");
702 float *vert_accum = vert_angles + verts_num;
706 if (vert_nors ==
NULL) {
708 for (i = 0,
mv = mvert; i < verts_num; i++,
mv++) {
709 copy_v3_v3(vert_nors[i], mesh_vert_normals[i]);
713 for (i = 0, mp = mpoly; i < polys_num; i++, mp++) {
723 sub_v3_v3v3(nor_prev, mvert[ml[i_curr - 1].
v].co, mvert[ml[i_curr].
v].co);
726 while (i_next < mp->totloop) {
728 sub_v3_v3v3(nor_next, mvert[ml[i_curr].
v].co, mvert[ml[i_next].
v].co);
733 if (
angle < FLT_EPSILON) {
738 vert_accum[vidx] +=
angle;
740 #ifdef USE_NONMANIFOLD_WORKAROUND
742 if ((check_non_manifold ==
false) ||
749 vert_angles[vidx] +=
angle;
769 for (i = 0; i < verts_num; i++, dv++) {
771 scalar = offset_fac_vg + (scalar * offset_fac_vg_inv);
772 vert_angles[i] *= scalar;
776 for (i = 0; i < verts_num; i++, dv++) {
778 scalar = offset_fac_vg + (scalar * offset_fac_vg_inv);
779 vert_angles[i] *= scalar;
785 float *vert_angs =
NULL;
787 float *edge_angs =
NULL;
789 if (do_angle_clamp || do_bevel_convex) {
791 if (do_angle_clamp) {
795 if (do_bevel_convex) {
798 edge_users =
MEM_malloc_arrayN(edges_num,
sizeof(*edge_users),
"solid_mod edges");
802 edges_num,
sizeof(*edge_user_pairs),
"edge_user_pairs");
803 for (eidx = 0; eidx < edges_num; eidx++) {
807 for (i = 0, mp = orig_mpoly; i < polys_num; i++, mp++) {
811 for (
int j = 0; j < mp->
totloop; j++, ml++) {
814 ed = orig_medge + eidx;
816 char flip = (char)((ml_prev->
v > ml->
v) == (ed->
v1 < ed->
v2));
818 edge_user_pairs[eidx][flip] = i;
829 for (i = 0; i < edges_num; i++, ed++) {
832 const float *n0 = poly_nors[edge_user_pairs[i][0]];
833 const float *n1 = poly_nors[edge_user_pairs[i][1]];
834 if (do_angle_clamp) {
839 if (do_bevel_convex) {
853 const float clamp_fac = 1 + (do_angle_clamp ?
fabsf(smd->
offset_fac) : 0);
855 if (
offset > FLT_EPSILON) {
856 float *vert_lens_sq =
MEM_malloc_arrayN(verts_num,
sizeof(
float),
"vert_lens_sq");
858 copy_vn_fl(vert_lens_sq, (
int)verts_num, FLT_MAX);
859 for (i = 0; i < edges_num; i++) {
861 vert_lens_sq[medge[i].
v1] =
min_ff(vert_lens_sq[medge[i].
v1], ed_len);
862 vert_lens_sq[medge[i].v2] =
min_ff(vert_lens_sq[medge[i].
v2], ed_len);
864 if (do_angle_clamp) {
865 for (i = 0; i < verts_num; i++) {
866 float cos_ang =
cosf(vert_angs[i] * 0.5f);
868 float max_off =
sqrtf(vert_lens_sq[i]) * 0.5f / cos_ang;
869 if (max_off <
offset * 0.5f) {
870 vert_angles[i] *= max_off /
offset * 2;
877 for (i = 0; i < verts_num; i++) {
878 if (vert_lens_sq[i] < offset_sq) {
880 vert_angles[i] *= scalar;
888 if (do_bevel_convex) {
889 for (i = 0; i < edges_num; i++) {
891 float angle = edge_angs[i];
894 clamp_f(bevel_convex, -1, 0)) *
900 (
int)medge[i + edges_num].
bweight +
902 clamp_f(bevel_convex, -1, 0)) *
915 #undef INVALID_UNUSED
918 if (ofs_new != 0.0f) {
924 for (i_orig = 0; i_orig < i_end; i_orig++,
mv++) {
925 const uint i_other = do_shell_align ? i_orig : new_vert_arr[i_orig];
926 if (vert_accum[i_other]) {
928 mv->co, vert_nors[i_other], ofs_new * (vert_angles[i_other] / vert_accum[i_other]));
933 if (ofs_orig != 0.0f) {
940 for (i_orig = 0; i_orig < i_end; i_orig++,
mv++) {
941 const uint i_other = do_shell_align ? i_orig : new_vert_arr[i_orig];
942 if (vert_accum[i_other]) {
944 mv->co, vert_nors[i_other], ofs_orig * (vert_angles[i_other] / vert_accum[i_other]));
963 mv = mvert + verts_num;
964 for (i = 0; i < verts_num; i++) {
965 negate_v3((
float *)mesh_vert_normals[i]);
970 if (shell_defgrp_index != -1 || rim_defgrp_index != -1) {
982 if (rim_defgrp_index != -1) {
983 for (
uint i = 0; i < rimVerts; i++) {
992 if (shell_defgrp_index != -1) {
993 for (
uint i = verts_num; i <
result->totvert; i++) {
1010 #define SOLIDIFY_SIDE_NORMALS
1012 #ifdef SOLIDIFY_SIDE_NORMALS
1017 float(*edge_vert_nos)[3] = do_side_normals ?
1026 int *origindex_edge;
1030 if (crease_rim || crease_outer || crease_inner) {
1036 orig_ed = (origindex_edge) ? &origindex_edge[(edges_num *
stride) + newEdges] :
NULL;
1037 ed = &medge[(edges_num *
stride) + newEdges];
1038 for (i = 0; i < rimVerts; i++, ed++) {
1039 ed->
v1 = new_vert_arr[i];
1040 ed->
v2 = (do_shell ? new_vert_arr[i] : i) + verts_num;
1054 mp = mpoly + (polys_num *
stride);
1055 ml = mloop + (loops_num *
stride);
1057 for (i = 0; i < newPolys; i++, mp++) {
1058 uint eidx = new_edge_arr[i];
1059 uint pidx = edge_users[eidx];
1063 if (pidx >= polys_num) {
1086 k2 = mpoly[pidx].
loopstart + (edge_order[eidx]);
1099 if (flip ==
false) {
1104 ml[j++].e = (edges_num *
stride) + old_vert_arr[ed->
v2] + newEdges;
1106 ml[j].v = (do_shell ? ed->
v2 : old_vert_arr[ed->
v2]) + verts_num;
1107 ml[j++].e = (do_shell ? eidx : i) + edges_num;
1109 ml[j].v = (do_shell ? ed->
v1 : old_vert_arr[ed->
v1]) + verts_num;
1110 ml[j++].e = (edges_num *
stride) + old_vert_arr[ed->
v1] + newEdges;
1117 ml[j++].e = (edges_num *
stride) + old_vert_arr[ed->
v1] + newEdges;
1119 ml[j].v = (do_shell ? ed->
v1 : old_vert_arr[ed->
v1]) + verts_num;
1120 ml[j++].e = (do_shell ? eidx : i) + edges_num;
1122 ml[j].v = (do_shell ? ed->
v2 : old_vert_arr[ed->
v2]) + verts_num;
1123 ml[j++].e = (edges_num *
stride) + old_vert_arr[ed->
v2] + newEdges;
1126 if (origindex_edge) {
1133 mp->
mat_nr += mat_ofs_rim;
1138 char *cr = &(ed->
crease);
1139 int tcr = *cr + crease_outer;
1140 *cr = tcr > 255 ? 255 : tcr;
1145 char *cr = &(medge[edges_num + (do_shell ? eidx : i)].crease);
1146 int tcr = *cr + crease_inner;
1147 *cr = tcr > 255 ? 255 : tcr;
1150 #ifdef SOLIDIFY_SIDE_NORMALS
1151 if (do_side_normals) {
1153 mvert[ml[j - 4].
v].co,
1154 mvert[ml[j - 3].
v].co,
1155 mvert[ml[j - 2].
v].co,
1156 mvert[ml[j - 1].
v].co);
1164 #ifdef SOLIDIFY_SIDE_NORMALS
1165 if (do_side_normals) {
1166 const MEdge *ed_orig = medge;
1167 ed = medge + (edges_num *
stride);
1168 for (i = 0; i < rimVerts; i++, ed++, ed_orig++) {
1176 for (k = 0; k < 2; k++) {
1180 copy_v3_v3((
float *)mesh_vert_normals[*(&ed->v1 + k)],
nor);
1202 #undef SOLIDIFY_SIDE_NORMALS
typedef float(TangentPoint)[2]
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_duplicate_referenced_layer(struct CustomData *data, int type, int totelem)
void CustomData_copy_data(const struct CustomData *source, struct CustomData *dest, int source_index, int dest_index, int count)
const float(* BKE_mesh_poly_normals_ensure(const struct Mesh *mesh))[3]
struct Mesh * BKE_mesh_new_nomain_from_template(const struct Mesh *me_src, int verts_len, int edges_len, int tessface_len, int loops_len, int polys_len)
const float(* BKE_mesh_vertex_normals_ensure(const struct Mesh *mesh))[3]
bool BKE_mesh_vertex_normals_are_dirty(const struct Mesh *mesh)
void BKE_mesh_normals_tag_dirty(struct Mesh *mesh)
#define BLI_BITMAP_NEW(_num, _alloc_string)
#define BLI_BITMAP_TEST(_bitmap, _index)
#define BLI_BITMAP_ENABLE(_bitmap, _index)
MINLINE float max_ff(float a, float b)
MINLINE float clamp_f(float value, float min, float max)
MINLINE float min_ff(float a, float b)
MINLINE int clamp_i(int value, int min, int max)
float normal_quad_v3(float n[3], const float v1[3], const float v2[3], const float v3[3], const float v4[3])
MINLINE float shell_v3v3_normalized_to_dist(const float a[3], const float b[3])
MINLINE void madd_v3_v3fl(float r[3], const float a[3], float f)
MINLINE float normalize_v3(float r[3])
MINLINE float len_squared_v3v3(const float a[3], const float b[3]) ATTR_WARN_UNUSED_RESULT
MINLINE void sub_v3_v3v3(float r[3], const float a[3], const float b[3])
MINLINE void copy_v3_v3(float r[3], const float a[3])
void copy_vn_fl(float *array_tar, int size, float val)
MINLINE void add_v3_v3v3(float r[3], const float a[3], const float b[3])
void mid_v3_v3v3_angle_weighted(float r[3], const float a[3], const float b[3])
float angle_signed_on_axis_v3v3_v3(const float v1[3], const float v2[3], const float axis[3]) ATTR_WARN_UNUSED_RESULT
MINLINE void negate_v3(float r[3])
MINLINE float normalize_v3_v3(float r[3], const float a[3])
void copy_vn_i(int *array_tar, int size, int val)
MINLINE float normalize_v3_length(float r[3], float unit_scale)
float angle_normalized_v3v3(const float v1[3], const float v2[3]) ATTR_WARN_UNUSED_RESULT
MINLINE void add_v3_v3(float r[3], const float a[3])
#define STACK_PUSH(stack, val)
#define STACK_DECLARE(stack)
#define STACK_SIZE(stack)
#define STACK_INIT(stack, stack_num)
@ MOD_SOLIDIFY_NORMAL_CALC
@ MOD_SOLIDIFY_OFFSET_ANGLE_CLAMP
@ MOD_SOLIDIFY_VGROUP_INV
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 stride
_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.
BLI_INLINE bool edgeref_is_init(const EdgeFaceRef *edge_ref)
struct EdgeFaceRef EdgeFaceRef
Mesh * MOD_solidify_extrude_modifyMesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh)
static void mesh_calc_hq_normal(Mesh *mesh, const float(*poly_nors)[3], float(*r_vert_nors)[3])
#define INIT_VERT_ARRAY_OFFSETS(test)
void MOD_get_vgroup(Object *ob, struct Mesh *mesh, const char *name, MDeformVert **dvert, int *defgrp_index)
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 BMVert const BMEdge * e
ATTR_WARN_UNUSED_RESULT const BMVert * v
SIMD_FORCE_INLINE btScalar angle(const btVector3 &v) const
Return the angle between this and another vector.
ccl_gpu_kernel_postfix ccl_global float int int int int float bool int offset
void *(* MEM_malloc_arrayN)(size_t len, size_t size, const char *str)
void(* MEM_freeN)(void *vmemh)
void *(* MEM_calloc_arrayN)(size_t len, size_t size, const char *str)
char shell_defgrp_name[64]