47 const MLoop *loopstart,
51 const int nverts = mpoly->
totloop;
52 const float *v_prev = mvert[loopstart[nverts - 1].
v].
co;
58 for (
int i = 0; i < nverts; i++) {
59 v_curr = mvert[loopstart[i].
v].
co;
70 const MLoop *loopstart,
79 r_no, mvarray[loopstart[0].
v].co, mvarray[loopstart[1].
v].co, mvarray[loopstart[2].
v].co);
83 mvarray[loopstart[0].
v].co,
84 mvarray[loopstart[1].
v].co,
85 mvarray[loopstart[2].
v].co,
86 mvarray[loopstart[3].
v].co);
96 const MLoop *loopstart,
97 const float (*vertex_coords)[3],
100 const int nverts = mpoly->
totloop;
101 const float *v_prev = vertex_coords[loopstart[nverts - 1].
v];
107 for (
int i = 0; i < nverts; i++) {
108 v_curr = vertex_coords[loopstart[i].v];
119 const MLoop *loopstart,
120 const float (*vertex_coords)[3],
126 else if (mpoly->
totloop == 3) {
128 vertex_coords[loopstart[0].
v],
129 vertex_coords[loopstart[1].
v],
130 vertex_coords[loopstart[2].
v]);
132 else if (mpoly->
totloop == 4) {
134 vertex_coords[loopstart[0].
v],
135 vertex_coords[loopstart[1].
v],
136 vertex_coords[loopstart[2].
v],
137 vertex_coords[loopstart[3].
v]);
147 const MLoop *loopstart,
155 for (
int i = 0; i < mpoly->
totloop; i++) {
161 const MLoop *loopstart,
162 const MVert *mvarray,
167 mvarray[loopstart[0].
v].co,
168 mvarray[loopstart[1].
v].co,
169 mvarray[loopstart[2].
v].co);
171 else if (mpoly->
totloop == 4) {
173 mvarray[loopstart[0].
v].co,
174 mvarray[loopstart[1].
v].co,
175 mvarray[loopstart[2].
v].co,
176 mvarray[loopstart[3].
v].co);
187 mvarray[loopstart[0].
v].co, mvarray[loopstart[1].
v].co, mvarray[loopstart[2].
v].co);
190 const MLoop *l_iter = loopstart;
194 for (
int i = 0; i < mpoly->
totloop; i++, l_iter++) {
212 float total_area = 0;
214 for (mp = mpoly; i--; mp++) {
230 for (i = 0; i < mpoly->
totloop; i++, l_iter++) {
231 copy_v2_v2(vertexcos[i], uv_array[l_iter].uv);
241 const MLoop *loopstart,
242 const MVert *mvarray,
245 const float *v_pivot, *v_step1;
246 float total_volume = 0.0f;
250 v_pivot = mvarray[loopstart[0].
v].co;
251 v_step1 = mvarray[loopstart[1].
v].co;
253 for (
int i = 2; i < mpoly->
totloop; i++) {
254 const float *v_step2 = mvarray[loopstart[i].
v].co;
259 total_volume += tetra_volume;
267 for (
uint j = 0; j < 3; j++) {
268 r_cent[j] += tetra_volume * (v_pivot[j] + v_step1[j] + v_step2[j]);
283 const MLoop *loopstart,
284 const MVert *mvarray,
285 const float reference_center[3],
289 float v_pivot[3], v_step1[3];
290 float total_volume = 0.0f;
292 sub_v3_v3v3(v_pivot, mvarray[loopstart[0].
v].co, reference_center);
293 sub_v3_v3v3(v_step1, mvarray[loopstart[1].
v].co, reference_center);
294 for (
int i = 2; i < mpoly->
totloop; i++) {
296 sub_v3_v3v3(v_step2, mvarray[loopstart[i].
v].co, reference_center);
298 total_volume += tetra_volume;
299 for (
uint j = 0; j < 3; j++) {
300 r_cent[j] += tetra_volume * (v_pivot[j] + v_step1[j] + v_step2[j]);
314 const MLoop *loopstart,
315 const MVert *mvarray,
318 float total_area = 0.0f;
319 float v1[3],
v2[3], v3[3],
normal[3], tri_cent[3];
326 for (
int i = 2; i < mpoly->
totloop; i++) {
330 total_area += tri_area;
344 const MLoop *loopstart,
345 const MVert *mvarray,
351 int i_this = mpoly->
totloop - 1;
354 sub_v3_v3v3(nor_prev, mvarray[loopstart[i_this - 1].
v].co, mvarray[loopstart[i_this].
v].co);
357 while (i_next < mpoly->totloop) {
358 sub_v3_v3v3(nor_next, mvarray[loopstart[i_this].
v].co, mvarray[loopstart[i_next].
v].co);
371 const MLoop *ml, *ml_next;
375 ml = &ml_next[i - 1];
409 for (mvert = me->
mvert; i--; mvert++) {
427 for (; i--; mpoly++) {
429 for (
int j = mpoly->
loopstart; j < loopend; j++) {
458 float total_area = 0.0f;
464 for (mpoly = me->
mpoly; i--; mpoly++) {
469 total_area += poly_area;
489 float total_volume = 0.0f;
499 for (mpoly = me->
mpoly; i--; mpoly++) {
505 total_volume += poly_volume;
508 if (total_volume != 0.0f) {
518 return init_cent_result;
540 if (looptri_num == 0) {
544 float totweight = 0.0f;
547 for (i = 0, lt = looptri; i < looptri_num; i++, lt++) {
550 const MVert *v3 = &mverts[mloop[lt->
tri[2]].
v];
559 if (totweight == 0.0f) {
563 mul_v3_fl(r_center, 1.0f / (3.0f * totweight));
569 const int mverts_num,
571 const int looptri_num,
588 if (looptri_num == 0) {
598 for (i = 0, lt = looptri; i < looptri_num; i++, lt++) {
601 const MVert *v3 = &mverts[mloop[lt->
tri[2]].
v];
621 *r_volume =
fabsf(totvol);
627 if (totvol != 0.0f) {
628 mul_v3_fl(r_center, (1.0f / 3.0f) / totvol);
644 for (
int x = 0;
x < sides;
x++) {
647 for (
int y = 0;
y <
x;
y++) {
648 co_a = co[
y * sides +
x];
649 co_b = co[
x * sides +
y];
652 SWAP(
float, co_a[0], co_a[1]);
653 SWAP(
float, co_b[0], co_b[1]);
655 if (use_loop_mdisp_flip) {
661 co_a = co[
x * sides +
x];
663 SWAP(
float, co_a[0], co_a[1]);
665 if (use_loop_mdisp_flip) {
676 const bool use_loop_mdisp_flip)
679 int loopend = loopstart + mpoly->
totloop - 1;
683 for (
int i = loopstart; i <= loopend; i++) {
693 uint prev_edge_index = mloop[loopstart].
e;
694 mloop[loopstart].
e = mloop[loopend].
e;
696 for (loopstart++; loopend > loopstart; loopstart++, loopend--) {
697 mloop[loopend].
e = mloop[loopend - 1].
e;
698 SWAP(
uint, mloop[loopstart].
e, prev_edge_index);
700 if (!loops_in_ldata) {
701 SWAP(
MLoop, mloop[loopstart], mloop[loopend]);
709 if (loopstart == loopend) {
710 mloop[loopstart].
e = prev_edge_index;
726 for (mp = mpoly, i = 0; i < totpoly; mp++, i++) {
744 for (i = 0; i < totedge; i++) {
753 for (i = 0; i < totpoly; i++) {
754 MPoly *p = &mpoly[i];
756 for (j = 0; j < p->
totloop; j++) {
772 const int UNUSED(totedge),
777 for (
const MPoly *mp = mpoly; i--; mp++) {
781 for (ml = &mloop[mp->loopstart]; j--; ml++) {
789 for (
const MPoly *mp = mpoly; i--; mp++) {
790 if ((mp->flag &
ME_HIDE) == 0) {
793 for (ml = &mloop[mp->loopstart]; j--; ml++) {
819 for (
mv = mvert; i--;
mv++) {
824 for (med = medge; i--; med++) {
829 for (mp = mpoly; i--; mp++) {
836 for (ml = &mloop[mp->
loopstart]; j--; ml++) {
855 if ((edges[i].flag &
ME_HIDE) == 0) {
856 MEdge &edge = edges[i];
870 MPoly &poly = polys[i];
871 bool all_verts_selected =
true;
874 all_verts_selected =
false;
877 if (all_verts_selected) {
905 const float (*vert_cos_src)[3],
906 const float (*vert_cos_dst)[3],
908 const float (*vert_cos_org)[3],
909 float (*vert_cos_new)[3])
914 int *vert_accum = (
int *)
MEM_calloc_arrayN((
size_t)totvert,
sizeof(*vert_accum), __func__);
916 memset(vert_cos_new,
'\0',
sizeof(*vert_cos_new) * (
size_t)totvert);
918 for (i = 0, mp = mpoly; i < totpoly; i++, mp++) {
921 for (
int j = 0; j < mp->
totloop; j++) {
923 uint v_curr = loopstart[j].
v;
929 vert_cos_dst[v_curr],
930 vert_cos_org[v_prev],
931 vert_cos_org[v_curr],
932 vert_cos_org[v_next],
933 vert_cos_src[v_prev],
934 vert_cos_src[v_curr],
935 vert_cos_src[v_next]);
938 vert_accum[v_curr] += 1;
942 for (i = 0; i < totvert; i++) {
944 mul_v3_fl(vert_cos_new[i], 1.0f / (
float)vert_accum[i]);
typedef float(TangentPoint)[2]
CustomData interface, see also DNA_customdata_types.h.
void * CustomData_get_layer(const struct CustomData *data, int type)
void CustomData_swap(struct CustomData *data, int index_a, int index_b)
bool BKE_mesh_minmax(const struct Mesh *me, float r_min[3], float r_max[3])
#define BLI_array_alloca(arr, realsize)
#define BLI_BITMAP_ENABLE(_bitmap, _index)
bool BLI_edgehash_reinsert(EdgeHash *eh, unsigned int v0, unsigned int v1, void *val)
float normal_quad_v3(float n[3], const float v1[3], const float v2[3], const float v3[3], const float v4[3])
float area_poly_v3(const float verts[][3], unsigned int nr)
void transform_point_by_tri_v3(float pt_tar[3], float const pt_src[3], const float tri_tar_p1[3], const float tri_tar_p2[3], const float tri_tar_p3[3], const float tri_src_p1[3], const float tri_src_p2[3], const float tri_src_p3[3])
float area_tri_signed_v3(const float v1[3], const float v2[3], const float v3[3], const float normal[3])
float volume_tri_tetrahedron_signed_v3_6x(const float v1[3], const float v2[3], const float v3[3])
float area_tri_v3(const float v1[3], const float v2[3], const float v3[3])
float volume_tetrahedron_signed_v3(const float v1[3], const float v2[3], const float v3[3], const float v4[3])
float normal_tri_v3(float n[3], const float v1[3], const float v2[3], const float v3[3])
float area_poly_v2(const float verts[][2], unsigned int nr)
void mid_v3_v3v3v3v3(float v[3], const float v1[3], const float v2[3], const float v3[3], const float v4[3])
MINLINE void madd_v3_v3fl(float r[3], const float a[3], float f)
MINLINE float normalize_v3(float r[3])
MINLINE void add_newell_cross_v3_v3v3(float n[3], const float v_prev[3], const float v_curr[3])
MINLINE void sub_v3_v3v3(float r[3], const float a[3], const float b[3])
MINLINE void copy_v2_v2(float r[2], const float a[2])
MINLINE void mul_v3_fl(float r[3], float f)
MINLINE void copy_v3_v3(float r[3], const float a[3])
bool is_finite_v3(const float a[3]) ATTR_WARN_UNUSED_RESULT
void mid_v3_v3v3(float r[3], const float a[3], const float b[3])
MINLINE void swap_v3_v3(float a[3], float b[3])
MINLINE void zero_v3(float r[3])
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])
void mid_v3_v3v3v3(float v[3], const float v1[3], const float v2[3], const float v3[3])
#define UNUSED_FUNCTION(x)
#define INIT_MINMAX(min, max)
Object is a sort of wrapper for general info.
NSNotificationCenter * center
_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 y
_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.
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 const btScalar & w() const
Return the w value.
constexpr IndexRange index_range() const
constexpr Span slice(int64_t start, int64_t size) const
IconTextureDrawCall normal
void(* MEM_freeN)(void *vmemh)
void *(* MEM_calloc_arrayN)(size_t len, size_t size, const char *str)
bool BKE_mesh_center_median_from_polys(const Mesh *me, float r_cent[3])
static void mesh_calc_ngon_normal(const MPoly *mpoly, const MLoop *loopstart, const MVert *mvert, float normal[3])
static float mesh_calc_poly_volume_centroid_with_reference_center(const MPoly *mpoly, const MLoop *loopstart, const MVert *mvarray, const float reference_center[3], float r_cent[3])
static void mesh_calc_ngon_normal_coords(const MPoly *mpoly, const MLoop *loopstart, const float(*vertex_coords)[3], float r_normal[3])
void BKE_mesh_polygon_flip_ex(MPoly *mpoly, MLoop *mloop, CustomData *ldata, float(*lnors)[3], MDisps *mdisp, const bool use_loop_mdisp_flip)
static void mesh_flush_select_from_verts(const Span< MVert > verts, const Span< MLoop > loops, MutableSpan< MEdge > edges, MutableSpan< MPoly > polys)
void BKE_mesh_polygons_flip(MPoly *mpoly, MLoop *mloop, CustomData *ldata, int totpoly)
void BKE_mesh_calc_poly_normal(const MPoly *mpoly, const MLoop *loopstart, const MVert *mvarray, float r_no[3])
bool BKE_mesh_center_of_surface(const Mesh *me, float r_cent[3])
bool BKE_mesh_center_bounds(const Mesh *me, float r_cent[3])
void BKE_mesh_poly_edgebitmap_insert(uint *edge_bitmap, const MPoly *mp, const MLoop *mloop)
void BKE_mesh_mdisp_flip(MDisps *md, const bool use_loop_mdisp_flip)
float BKE_mesh_calc_area(const Mesh *me)
void BKE_mesh_calc_poly_angles(const MPoly *mpoly, const MLoop *loopstart, const MVert *mvarray, float angles[])
void BKE_mesh_flush_hidden_from_polys(Mesh *me)
float BKE_mesh_calc_poly_area(const MPoly *mpoly, const MLoop *loopstart, const MVert *mvarray)
void BKE_mesh_flush_select_from_polys_ex(MVert *mvert, const int totvert, const MLoop *mloop, MEdge *medge, const int totedge, const MPoly *mpoly, const int totpoly)
void BKE_mesh_calc_poly_center(const MPoly *mpoly, const MLoop *loopstart, const MVert *mvarray, float r_cent[3])
void BKE_mesh_polygon_flip(MPoly *mpoly, MLoop *mloop, CustomData *ldata)
void BKE_mesh_calc_relative_deform(const MPoly *mpoly, const int totpoly, const MLoop *mloop, const int totvert, const float(*vert_cos_src)[3], const float(*vert_cos_dst)[3], const float(*vert_cos_org)[3], float(*vert_cos_new)[3])
void BKE_mesh_calc_poly_normal_coords(const MPoly *mpoly, const MLoop *loopstart, const float(*vertex_coords)[3], float r_no[3])
bool BKE_mesh_center_median(const Mesh *me, float r_cent[3])
static float UNUSED_FUNCTION() mesh_calc_poly_volume_centroid(const MPoly *mpoly, const MLoop *loopstart, const MVert *mvarray, float r_cent[3])
void BKE_mesh_flush_hidden_from_verts(Mesh *me)
void BKE_mesh_flush_select_from_verts(Mesh *me)
void BKE_mesh_poly_edgehash_insert(EdgeHash *ehash, const MPoly *mp, const MLoop *mloop)
void BKE_mesh_flush_hidden_from_polys_ex(MVert *mvert, const MLoop *mloop, MEdge *medge, const int UNUSED(totedge), const MPoly *mpoly, const int totpoly)
float BKE_mesh_calc_poly_uv_area(const MPoly *mpoly, const MLoopUV *uv_array)
void BKE_mesh_calc_volume(const MVert *mverts, const int mverts_num, const MLoopTri *looptri, const int looptri_num, const MLoop *mloop, float *r_volume, float r_center[3])
static bool mesh_calc_center_centroid_ex(const MVert *mverts, int UNUSED(mverts_num), const MLoopTri *looptri, int looptri_num, const MLoop *mloop, float r_center[3])
static float mesh_calc_poly_area_centroid(const MPoly *mpoly, const MLoop *loopstart, const MVert *mvarray, float r_cent[3])
void BKE_mesh_flush_hidden_from_verts_ex(const MVert *mvert, const MLoop *mloop, MEdge *medge, const int totedge, MPoly *mpoly, const int totpoly)
bool BKE_mesh_center_of_volume(const Mesh *me, float r_cent[3])
static void mesh_calc_ngon_center(const MPoly *mpoly, const MLoop *loopstart, const MVert *mvert, float cent[3])
void BKE_mesh_flush_select_from_polys(Mesh *me)
static void area(int d1, int d2, int e1, int e2, float weights[2])