34 #include "RNA_prototypes.h"
71 #define SV_UNUSED (UINT_MAX)
72 #define SV_INVALID ((UINT_MAX)-1)
73 #define SV_IS_VALID(v) ((v) < SV_INVALID)
118 const float axis_vec[3],
119 const float axis_offset[3],
120 const float merge_threshold)
124 const float merge_threshold_sq =
square_f(merge_threshold);
125 const bool use_offset = axis_offset !=
NULL;
126 uint tot_doubles = 0;
127 for (
uint i = 0; i < totvert; i += 1) {
131 sub_v3_v3v3(offset_co, mvert_new[i].co, axis_offset);
139 if (dist_sq <= merge_threshold_sq) {
146 if (tot_doubles != 0) {
147 uint tot = totvert * step_tot;
149 copy_vn_i(full_doubles_map, (
int)tot, -1);
151 uint tot_doubles_left = tot_doubles;
152 for (
uint i = 0; i < totvert; i += 1) {
154 int *doubles_map = &full_doubles_map[totvert + i];
155 for (
uint step = 1; step < step_tot; step += 1) {
156 *doubles_map = (int)i;
157 doubles_map += totvert;
159 tot_doubles_left -= 1;
160 if (tot_doubles_left == 0) {
167 (
int)(tot_doubles * (step_tot - 1)),
191 const int quad_ord[4] = {
197 const int quad_ord_ofs[4] = {
204 uint maxVerts = 0, maxEdges = 0, maxPolys = 0;
216 float uv_v_minmax[2] = {FLT_MAX, -FLT_MAX};
217 float uv_v_range_inv;
218 float uv_axis_plane[4];
220 char axis_char =
'X';
224 float axis_vec[3] = {0.0f, 0.0f, 0.0f};
225 float tmp_vec1[3], tmp_vec2[3];
229 float mtx_tx_inv[4][4];
230 float mtx_tmp_a[4][4];
232 uint vc_tot_linked = 0;
233 short other_axis_1, other_axis_2;
234 const float *tmpf1, *tmpf2;
238 MPoly *mpoly_orig, *mpoly_new, *mp_new;
239 MLoop *mloop_orig, *mloop_new, *ml_new;
240 MEdge *medge_orig, *med_orig, *med_new, *med_new_firstloop, *medge_new;
241 MVert *mvert_new, *mvert_orig, *mv_orig, *mv_new, *mv_new_base;
254 switch (ltmd->
axis) {
269 axis_vec[ltmd->
axis] = 1.0f;
271 if (ob_axis !=
NULL) {
284 float totlen =
len_v3(mtx_tx[3]);
286 if (totlen != 0.0f) {
287 const float zero[3] = {0.0f, 0.0f, 0.0f};
299 if (ltmd->
flag & MOD_SCREW_OBJECT_ANGLE) {
303 float vec[3] = {0, 1, 0};
322 if (
len_v3v3(axis_tmp, axis_vec) > 1.0f) {
330 axis_char = (char)(axis_char + ltmd->
axis);
334 axis_vec[ltmd->
axis] = 1.0f;
339 screw_ofs *= (
float)ltmd->
iter;
340 uv_u_scale = 1.0f / (
float)(step_tot);
343 step_tot = ((step_tot + 1) * ltmd->
iter) - (ltmd->
iter - 1);
348 if (
fabsf(screw_ofs) <= (FLT_EPSILON * 100.0f) &&
353 maxVerts = totvert * step_tot;
354 maxEdges = (totvert * step_tot) +
355 (totedge * step_tot);
356 maxPolys = totedge * step_tot;
366 maxVerts = totvert * step_tot;
367 maxEdges = (totvert * (step_tot - 1)) +
368 (totedge * step_tot);
369 maxPolys = totedge * (step_tot - 1);
380 mesh, (
int)maxVerts, (
int)maxEdges, 0, (
int)maxPolys * 4, (
int)maxPolys);
386 mvert_new =
result->mvert;
387 mpoly_new =
result->mpoly;
388 mloop_new =
result->mloop;
389 medge_new =
result->medge;
399 if (mloopuv_layers_tot) {
400 const float zero_co[3] = {0};
404 if (mloopuv_layers_tot) {
406 for (uv_lay = 0; uv_lay < mloopuv_layers_tot; uv_lay++) {
411 for (i = 0, mv_orig = mvert_orig; i < totvert; i++, mv_orig++) {
413 uv_v_minmax[0] =
min_ff(
v, uv_v_minmax[0]);
414 uv_v_minmax[1] =
max_ff(
v, uv_v_minmax[1]);
420 uv_v_range_inv = uv_v_minmax[1] - uv_v_minmax[0];
421 uv_v_range_inv = uv_v_range_inv ? 1.0f / uv_v_range_inv : 0.0f;
427 mv_orig = mvert_orig;
432 med_orig = medge_orig;
434 for (i = 0; i < totedge; i++, med_orig++, med_new++) {
435 med_new->
v1 = med_orig->
v1;
436 med_new->
v2 = med_orig->
v2;
452 memset(edge_poly_map, 0xff,
sizeof(*edge_poly_map) * totedge);
455 memset(vert_loop_map, 0xff,
sizeof(*vert_loop_map) * totvert);
457 for (i = 0, mp_orig = mpoly_orig; i < totpoly; i++, mp_orig++) {
461 MLoop *ml_orig = &mloop_orig[loopstart];
463 for (k = loopstart; k < loopend; k++, ml_orig++) {
464 edge_poly_map[ml_orig->
e] = i;
465 vert_loop_map[ml_orig->
v] = k;
468 if (medge_new[ml_orig->
e].
v1 != ml_orig->
v) {
510 if (ob_axis !=
NULL) {
512 for (i = 0; i < totvert; i++, mv_new++, mv_orig++, vc++) {
513 vc->
co[0] = mv_new->co[0] = mv_orig->co[0];
514 vc->
co[1] = mv_new->co[1] = mv_orig->co[1];
515 vc->
co[2] = mv_new->co[2] = mv_orig->co[2];
518 vc->
e[0] = vc->
e[1] =
NULL;
523 vc->
dist = vc->
co[other_axis_1] * vc->
co[other_axis_1] +
524 vc->
co[other_axis_2] * vc->
co[other_axis_2];
530 for (i = 0; i < totvert; i++, mv_new++, mv_orig++, vc++) {
531 vc->
co[0] = mv_new->co[0] = mv_orig->co[0];
532 vc->
co[1] = mv_new->co[1] = mv_orig->co[1];
533 vc->
co[2] = mv_new->co[2] = mv_orig->co[2];
536 vc->
e[0] = vc->
e[1] =
NULL;
540 vc->
dist = vc->
co[other_axis_1] * vc->
co[other_axis_1] +
541 vc->
co[other_axis_2] * vc->
co[other_axis_2];
548 for (i = 0; i < totedge; i++, med_new++) {
549 vc = &vert_connect[med_new->
v1];
552 vc->
v[0] = med_new->
v2;
556 vc->
v[1] = med_new->
v2;
563 vc = &vert_connect[med_new->
v2];
567 vc->
v[0] = med_new->
v1;
571 vc->
v[1] = med_new->
v1;
581 for (i = 0; i < totvert; i++, vc++) {
591 bool ed_loop_flip =
false;
595 for (j = 0; j < 2; j++) {
612 if (fl <= lt_iter.v_poin->dist) {
631 if (vc_tot_linked > 1) {
632 float vf_1, vf_2, vf_best;
634 vc_tmp = &vert_connect[v_best];
636 tmpf1 = vert_connect[vc_tmp->
v[0]].
co;
637 tmpf2 = vert_connect[vc_tmp->
v[1]].
co;
644 vf_1 = tmpf1[ltmd->
axis];
645 vf_2 = tmpf2[ltmd->
axis];
646 vf_best = vc_tmp->
co[ltmd->
axis];
648 if (vf_1 < vf_best && vf_best < vf_2) {
651 else if (vf_1 > vf_best && vf_best > vf_2) {
661 if (tmp_vec1[ltmd->
axis] < tmp_vec2[ltmd->
axis]) {
671 if (tmpf1[ltmd->
axis] < vc_tmp->
co[ltmd->
axis]) {
680 printf(
"No Connected ___\n");
690 ed_loop_flip = !ed_loop_flip;
695 ed_loop_flip = !ed_loop_flip;
699 for (j = ed_loop_closed; j < 2; j++) {
710 ed_loop_flip = !ed_loop_flip;
718 if (lt_iter.
v == lt_iter.
e->
v1) {
719 if (ed_loop_flip == 0) {
725 printf(
"\t\t\tFlipping Not 0\n");
729 else if (lt_iter.
v == lt_iter.
e->
v2) {
730 if (ed_loop_flip == 1) {
736 printf(
"\t\t\tFlipping Not 1\n");
742 printf(
"\t\tIncorrect edge topology");
748 printf(
"\t\tNo Edge at this point\n");
760 mv_orig = mvert_orig;
763 for (i = 0; i < totvert; i++, mv_new++, mv_orig++) {
770 for (step = 1; step < step_tot; step++) {
771 const uint varray_stride = totvert * step;
777 if (ob_axis !=
NULL) {
786 madd_v3_v3fl(mat[3], axis_vec, screw_ofs * ((
float)step / (
float)(step_tot - 1)));
792 mv_new_base = mvert_new;
793 mv_new = &mvert_new[varray_stride];
795 for (j = 0; j < totvert; j++, mv_new_base++, mv_new++) {
802 if (ob_axis !=
NULL) {
814 med_new->
v1 = varray_stride + j;
815 med_new->
v2 = med_new->
v1 - totvert;
832 const uint varray_stride = (step_tot - 1) * totvert;
834 for (i = 0; i < totvert; i++) {
836 med_new->
v2 = varray_stride + i;
847 med_new_firstloop = medge_new;
850 edge_offset = totedge + (totvert * (step_tot - (close ? 0 : 1)));
852 for (i = 0; i < totedge; i++, med_new_firstloop++) {
853 const uint step_last = step_tot - (close ? 1 : 2);
854 const uint mpoly_index_orig = totpoly ? edge_poly_map[i] :
UINT_MAX;
855 const bool has_mpoly_orig = (mpoly_index_orig !=
UINT_MAX);
856 float uv_v_offset_a, uv_v_offset_b;
858 const uint mloop_index_orig[2] = {
859 vert_loop_map ? vert_loop_map[medge_new[i].
v1] :
UINT_MAX,
860 vert_loop_map ? vert_loop_map[medge_new[i].
v2] :
UINT_MAX,
862 const bool has_mloop_orig = mloop_index_orig[0] !=
UINT_MAX;
867 i1 = med_new_firstloop->
v1;
868 i2 = med_new_firstloop->
v2;
870 if (has_mpoly_orig) {
871 mat_nr = mpoly_orig[mpoly_index_orig].
mat_nr;
877 if (has_mloop_orig ==
false && mloopuv_layers_tot) {
882 uv_v_offset_a = (uv_v_offset_a - uv_v_minmax[0]) * uv_v_range_inv;
883 uv_v_offset_b = (uv_v_offset_b - uv_v_minmax[0]) * uv_v_range_inv;
887 for (step = 0; step <= step_last; step++) {
890 if (has_mpoly_orig) {
892 &
mesh->
pdata, &
result->pdata, (
int)mpoly_index_orig, (
int)mpoly_index, 1);
893 origindex[mpoly_index] = (int)mpoly_index_orig;
897 mp_new->
flag = mpoly_flag;
904 if (has_mloop_orig) {
905 int l_index = (int)(ml_new - mloop_new);
908 &
mesh->
ldata, &
result->ldata, (
int)mloop_index_orig[0], l_index + 0, 1);
910 &
mesh->
ldata, &
result->ldata, (
int)mloop_index_orig[1], l_index + 1, 1);
912 &
mesh->
ldata, &
result->ldata, (
int)mloop_index_orig[1], l_index + 2, 1);
914 &
mesh->
ldata, &
result->ldata, (
int)mloop_index_orig[0], l_index + 3, 1);
916 if (mloopuv_layers_tot) {
918 const float uv_u_offset_a = (
float)(step)*uv_u_scale;
919 const float uv_u_offset_b = (
float)(step + 1) * uv_u_scale;
920 for (uv_lay = 0; uv_lay < mloopuv_layers_tot; uv_lay++) {
921 MLoopUV *mluv = &mloopuv_layers[uv_lay][l_index];
923 mluv[quad_ord[0]].
uv[0] += uv_u_offset_a;
924 mluv[quad_ord[1]].
uv[0] += uv_u_offset_a;
925 mluv[quad_ord[2]].
uv[0] += uv_u_offset_b;
926 mluv[quad_ord[3]].
uv[0] += uv_u_offset_b;
931 if (mloopuv_layers_tot) {
932 int l_index = (int)(ml_new - mloop_new);
935 const float uv_u_offset_a = (
float)(step)*uv_u_scale;
936 const float uv_u_offset_b = (
float)(step + 1) * uv_u_scale;
937 for (uv_lay = 0; uv_lay < mloopuv_layers_tot; uv_lay++) {
938 MLoopUV *mluv = &mloopuv_layers[uv_lay][l_index];
940 copy_v2_fl2(mluv[quad_ord[0]].uv, uv_u_offset_a, uv_v_offset_a);
941 copy_v2_fl2(mluv[quad_ord[1]].uv, uv_u_offset_a, uv_v_offset_b);
942 copy_v2_fl2(mluv[quad_ord[2]].uv, uv_u_offset_b, uv_v_offset_b);
943 copy_v2_fl2(mluv[quad_ord[3]].uv, uv_u_offset_b, uv_v_offset_a);
949 if (!(close && step == step_last)) {
951 ml_new[quad_ord[0]].
v =
i1;
952 ml_new[quad_ord[1]].
v = i2;
953 ml_new[quad_ord[2]].
v = i2 + totvert;
954 ml_new[quad_ord[3]].
v =
i1 + totvert;
956 ml_new[quad_ord_ofs[0]].
e = step == 0 ? i :
957 (edge_offset + step + (i * (step_tot - 1))) - 1;
958 ml_new[quad_ord_ofs[1]].
e = totedge + i2;
959 ml_new[quad_ord_ofs[2]].
e = edge_offset + step + (i * (step_tot - 1));
960 ml_new[quad_ord_ofs[3]].
e = totedge +
i1;
966 med_new->
flag = med_new_firstloop->
flag;
975 ml_new[quad_ord[0]].
v =
i1;
976 ml_new[quad_ord[1]].
v = i2;
977 ml_new[quad_ord[2]].
v = med_new_firstloop->
v2;
978 ml_new[quad_ord[3]].
v = med_new_firstloop->
v1;
980 ml_new[quad_ord_ofs[0]].
e = (edge_offset + step + (i * (step_tot - 1))) - 1;
981 ml_new[quad_ord_ofs[1]].
e = totedge + i2;
982 ml_new[quad_ord_ofs[2]].
e = i;
983 ml_new[quad_ord_ofs[3]].
e = totedge +
i1;
1004 for (; i < maxPolys * 4; i += 4) {
1006 ml_new = mloop_new + i;
1007 ii = findEd(medge_new, maxEdges, ml_new[0].
v, ml_new[1].
v);
1008 printf(
"%d %d -- ", ii, ml_new[0].
e);
1011 ii = findEd(medge_new, maxEdges, ml_new[1].
v, ml_new[2].
v);
1012 printf(
"%d %d -- ", ii, ml_new[1].
e);
1015 ii = findEd(medge_new, maxEdges, ml_new[2].
v, ml_new[3].
v);
1016 printf(
"%d %d -- ", ii, ml_new[2].
e);
1019 ii = findEd(medge_new, maxEdges, ml_new[3].
v, ml_new[0].
v);
1020 printf(
"%d %d\n", ii, ml_new[3].
e);
1028 if (edge_poly_map) {
1032 if (vert_loop_map) {
1036 if (do_remove_doubles) {
1042 ob_axis !=
NULL ? mtx_tx[3] :
NULL,
1093 uiItemR(sub,
ptr,
"use_object_screw_offset", 0,
NULL, ICON_NONE);
1104 uiItemR(row,
ptr,
"use_merge_vertices", 0,
"", ICON_NONE);
1107 uiItemR(sub,
ptr,
"merge_threshold", 0,
"", ICON_NONE);
1142 "ScrewModifierData",
typedef float(TangentPoint)[2]
int CustomData_number_of_layers(const struct CustomData *data, int type)
bool CustomData_has_layer(const struct CustomData *data, int type)
void * CustomData_get_layer_n(const struct CustomData *data, int type, int n)
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_copy_data(const struct CustomData *source, struct CustomData *dest, int source_index, int dest_index, int count)
@ MESH_MERGE_VERTS_DUMP_IF_MAPPED
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)
struct Mesh * BKE_mesh_merge_verts(struct Mesh *mesh, const int *vtargetmap, int tot_vtargetmap, int merge_mode)
void(* IDWalkFunc)(void *userData, struct Object *ob, struct ID **idpoin, int cb_flag)
@ eModifierTypeFlag_AcceptsCVs
@ eModifierTypeFlag_EnableInEditmode
@ eModifierTypeFlag_SupportsEditmode
@ eModifierTypeFlag_AcceptsMesh
void BKE_modifier_copydata_generic(const struct ModifierData *md, struct ModifierData *md_dst, int flag)
@ eModifierTypeType_Constructive
#define BLI_array_alloca(arr, realsize)
#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 min_ff(float a, float b)
MINLINE float square_f(float a)
MINLINE float sqrtf_signed(float f)
void plane_from_point_normal_v3(float r_plane[4], const float plane_co[3], const float plane_no[3])
float dist_signed_to_plane_v3(const float p[3], const float plane[4])
float closest_to_line_v3(float r_close[3], const float p[3], const float l1[3], const float l2[3])
float dist_signed_squared_to_plane_v3(const float p[3], const float plane[4])
void mul_m4_m4m4(float R[4][4], const float A[4][4], const float B[4][4])
void copy_m3_m4(float m1[3][3], const float m2[4][4])
void copy_m4_m3(float m1[4][4], const float m2[3][3])
void mul_mat3_m4_v3(const float M[4][4], float r[3])
bool invert_m4_m4(float R[4][4], const float A[4][4])
void mul_m4_v3(const float M[4][4], float r[3])
void copy_m4_m4(float m1[4][4], const float m2[4][4])
void mul_v3_m3v3(float r[3], const float M[3][3], const float a[3])
void axis_angle_to_mat3_single(float R[3][3], char axis, float angle)
void axis_angle_normalized_to_mat3(float R[3][3], const float axis[3], float angle)
float angle_v3v3(const float a[3], const float b[3]) ATTR_WARN_UNUSED_RESULT
MINLINE float len_v3v3(const float a[3], const float b[3]) ATTR_WARN_UNUSED_RESULT
MINLINE void madd_v3_v3fl(float r[3], const float a[3], float f)
MINLINE void copy_v2_fl2(float v[2], float x, float y)
MINLINE float normalize_v3(float r[3])
MINLINE void sub_v3_v3(float r[3], const float a[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 project_v3_v3v3_normalized(float out[3], const float p[3], const float v_proj[3])
MINLINE void cross_v3_v3v3(float r[3], const float a[3], const float b[3])
void copy_vn_i(int *array_tar, int size, int val)
MINLINE void zero_v3(float r[3])
MINLINE void add_v3_v3(float r[3], const float a[3])
MINLINE float len_v3(const float a[3]) ATTR_WARN_UNUSED_RESULT
Strict compiler flags for areas of code we want to ensure don't do conversions without us knowing abo...
#define MEMCMP_STRUCT_AFTER_IS_ZERO(struct_var, member)
#define MEMCPY_STRUCT_AFTER(struct_dst, struct_src, member)
void DEG_add_object_relation(struct DepsNodeHandle *node_handle, struct Object *object, eDepsObjectComponentType component, const char *description)
void DEG_add_modifier_to_transform_relation(struct DepsNodeHandle *node_handle, const char *description)
#define DNA_struct_default_get(struct_name)
@ MOD_SCREW_SMOOTH_SHADING
@ MOD_SCREW_OBJECT_OFFSET
struct ScrewModifierData ScrewModifierData
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 i1
_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.
struct ScrewVertConnect ScrewVertConnect
static void screwvert_iter_init(ScrewVertIter *iter, ScrewVertConnect *array, uint v_init, uint dir)
static Mesh * mesh_remove_doubles_on_axis(Mesh *result, MVert *mvert_new, const uint totvert, const uint step_tot, const float axis_vec[3], const float axis_offset[3], const float merge_threshold)
static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx)
struct ScrewVertIter ScrewVertIter
static Mesh * modifyMesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh *meshData)
static void foreachIDLink(ModifierData *md, Object *ob, IDWalkFunc walk, void *userData)
static void normals_panel_draw(const bContext *UNUSED(C), Panel *panel)
ModifierTypeInfo modifierType_Screw
static void panel_draw(const bContext *UNUSED(C), Panel *panel)
static void initData(ModifierData *md)
static void panelRegister(ARegionType *region_type)
static void screwvert_iter_step(ScrewVertIter *iter)
PointerRNA * modifier_panel_get_property_pointers(Panel *panel, PointerRNA *r_ob_ptr)
void modifier_panel_end(uiLayout *layout, PointerRNA *ptr)
PanelType * modifier_panel_register(ARegionType *region_type, ModifierType type, PanelDrawFn draw)
PanelType * modifier_subpanel_register(ARegionType *region_type, const char *name, const char *label, PanelDrawFn draw_header, PanelDrawFn draw, PanelType *parent)
uiLayout * uiLayoutRowWithHeading(uiLayout *layout, bool align, const char *heading)
void uiLayoutSetActive(uiLayout *layout, bool active)
uiLayout * uiLayoutColumn(uiLayout *layout, bool align)
void uiLayoutSetPropSep(uiLayout *layout, bool is_sep)
void uiItemS(uiLayout *layout)
uiLayout * uiLayoutRow(uiLayout *layout, bool align)
@ UI_ITEM_R_FORCE_BLANK_DECORATE
void uiItemR(uiLayout *layout, struct PointerRNA *ptr, const char *propname, int flag, const char *name, int icon)
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.
void *(* MEM_malloc_arrayN)(size_t len, size_t size, const char *str)
void(* MEM_freeN)(void *vmemh)
PointerRNA RNA_pointer_get(PointerRNA *ptr, const char *name)
bool RNA_pointer_is_null(const PointerRNA *ptr)
bool RNA_boolean_get(PointerRNA *ptr, const char *name)
struct DepsNodeHandle * node
unsigned int render_steps
ScrewVertConnect * v_array
ScrewVertConnect * v_poin