35 #include "RNA_prototypes.h"
102 sys->vertexCos =
NULL;
111 memset(sys->eweights, val,
sizeof(
float) * sys->
edges_num);
112 memset(sys->
fweights, val,
sizeof(
float[3]) * sys->loops_num);
113 memset(sys->ne_ed_num, val,
sizeof(
short) * sys->
verts_num);
114 memset(sys->ne_fa_num, val,
sizeof(
short) * sys->
verts_num);
115 memset(sys->ring_areas, val,
sizeof(
float) * sys->
verts_num);
116 memset(sys->vlengths, val,
sizeof(
float) * sys->
verts_num);
117 memset(sys->vweights, val,
sizeof(
float) * sys->
verts_num);
118 memset(sys->zerola, val,
sizeof(
bool) * sys->
verts_num);
129 sys->polys_num = a_numPolys;
130 sys->loops_num = a_numLoops;
157 const MLoop *l_prev = l_first + 1;
158 const MLoop *l_curr = l_first + 2;
161 for (; l_curr != l_term; l_prev = l_curr, l_curr++) {
176 beta =
pow(vini / vend, 1.0f / 3.0f);
179 sys->vertexCos[i][0] = (sys->vertexCos[i][0] - sys->vert_centroid[0]) *
beta +
180 sys->vert_centroid[0];
183 sys->vertexCos[i][1] = (sys->vertexCos[i][1] - sys->vert_centroid[1]) *
beta +
184 sys->vert_centroid[1];
187 sys->vertexCos[i][2] = (sys->vertexCos[i][2] - sys->vert_centroid[2]) *
beta +
188 sys->vert_centroid[2];
203 idv1 = sys->medges[i].v1;
204 idv2 = sys->medges[i].v2;
206 v1 = sys->vertexCos[idv1];
207 v2 = sys->vertexCos[idv2];
209 sys->ne_ed_num[idv1] = sys->ne_ed_num[idv1] + 1;
210 sys->ne_ed_num[idv2] = sys->ne_ed_num[idv2] + 1;
213 sys->zerola[idv1] =
true;
214 sys->zerola[idv2] =
true;
220 sys->eweights[i] = w1;
223 for (i = 0; i < sys->polys_num; i++) {
224 const MPoly *mp = &sys->mpoly[i];
227 const MLoop *l_prev = l_term - 2;
228 const MLoop *l_curr = l_term - 1;
230 for (; l_next != l_term; l_prev = l_curr, l_curr = l_next, l_next++) {
231 const float *v_prev = sys->vertexCos[l_prev->
v];
232 const float *v_curr = sys->vertexCos[l_curr->
v];
233 const float *v_next = sys->vertexCos[l_next->
v];
234 const uint l_curr_index = l_curr - sys->mloop;
236 sys->ne_fa_num[l_curr->
v] += 1;
241 sys->zerola[l_curr->
v] =
true;
244 sys->ring_areas[l_prev->
v] += areaf;
245 sys->ring_areas[l_curr->
v] += areaf;
246 sys->ring_areas[l_next->
v] += areaf;
252 sys->
fweights[l_curr_index][0] += w1;
253 sys->
fweights[l_curr_index][1] += w2;
254 sys->
fweights[l_curr_index][2] += w3;
256 sys->vweights[l_curr->
v] += w2 + w3;
257 sys->vweights[l_next->
v] += w1 + w3;
258 sys->vweights[l_prev->
v] += w1 + w2;
262 idv1 = sys->medges[i].v1;
263 idv2 = sys->medges[i].v2;
265 if (sys->ne_ed_num[idv1] != sys->ne_fa_num[idv1] &&
266 sys->ne_ed_num[idv2] != sys->ne_fa_num[idv2]) {
267 sys->vlengths[idv1] += sys->eweights[i];
268 sys->vlengths[idv2] += sys->eweights[i];
278 for (i = 0; i < sys->polys_num; i++) {
279 const MPoly *mp = &sys->mpoly[i];
282 const MLoop *l_prev = l_term - 2;
283 const MLoop *l_curr = l_term - 1;
285 for (; l_next != l_term; l_prev = l_curr, l_curr = l_next, l_next++) {
286 const uint l_curr_index = l_curr - sys->mloop;
289 if (sys->ne_ed_num[l_curr->
v] == sys->ne_fa_num[l_curr->
v] &&
290 sys->zerola[l_curr->
v] ==
false) {
294 sys->
fweights[l_curr_index][2] * sys->vweights[l_curr->
v]);
298 sys->
fweights[l_curr_index][1] * sys->vweights[l_curr->
v]);
300 if (sys->ne_ed_num[l_next->
v] == sys->ne_fa_num[l_next->
v] &&
301 sys->zerola[l_next->
v] ==
false) {
305 sys->
fweights[l_curr_index][2] * sys->vweights[l_next->
v]);
309 sys->
fweights[l_curr_index][0] * sys->vweights[l_next->
v]);
311 if (sys->ne_ed_num[l_prev->
v] == sys->ne_fa_num[l_prev->
v] &&
312 sys->zerola[l_prev->
v] ==
false) {
316 sys->
fweights[l_curr_index][1] * sys->vweights[l_prev->
v]);
320 sys->
fweights[l_curr_index][0] * sys->vweights[l_prev->
v]);
326 idv1 = sys->medges[i].v1;
327 idv2 = sys->medges[i].v2;
329 if (sys->ne_ed_num[idv1] != sys->ne_fa_num[idv1] &&
330 sys->ne_ed_num[idv2] != sys->ne_fa_num[idv2] && sys->zerola[idv1] ==
false &&
331 sys->zerola[idv2] ==
false) {
333 sys->
context, idv1, idv2, sys->eweights[i] * sys->vlengths[idv1]);
335 sys->
context, idv2, idv1, sys->eweights[i] * sys->vlengths[idv2]);
344 float vini = 0.0f, vend = 0.0f;
348 sys->vert_centroid, sys->vertexCos, sys->mpoly, sys->polys_num, sys->mloop);
351 if (sys->zerola[i] ==
false) {
352 lam = sys->ne_ed_num[i] == sys->ne_fa_num[i] ? (lambda >= 0.0f ? 1.0f : -1.0f) :
353 (lambda_border >= 0.0f ? 1.0f : -1.0f);
356 sys->vertexCos[i][0]);
360 sys->vertexCos[i][1]);
364 sys->vertexCos[i][2]);
370 sys->vert_centroid, sys->vertexCos, sys->mpoly, sys->polys_num, sys->mloop);
395 sys->min_area = 0.00001f;
398 sys->vert_centroid[0] = 0.0f;
399 sys->vert_centroid[1] = 0.0f;
400 sys->vert_centroid[2] = 0.0f;
407 for (iter = 0; iter < smd->
repeat; iter++) {
435 if (sys->zerola[i] ==
false) {
437 w = sys->vweights[i];
438 sys->vweights[i] = (
w == 0.0f) ? 0.0f : -
fabsf(smd->
lambda) * wpaint /
w;
439 w = sys->vlengths[i];
441 if (sys->ne_ed_num[i] == sys->ne_fa_num[i]) {
450 w = sys->vweights[i] * sys->ring_areas[i];
451 sys->vweights[i] = (
w == 0.0f) ? 0.0f : -
fabsf(smd->
lambda) * wpaint / (4.0f *
w);
452 w = sys->vlengths[i];
455 if (sys->ne_ed_num[i] == sys->ne_fa_num[i]) {
460 (4.0f * sys->ring_areas[i]));
499 bool UNUSED(useRenderParams))
564 if (mesh_src !=
NULL) {
611 N_(
"LaplacianSmooth"),
612 "LaplacianSmoothModifierData",
614 &RNA_LaplacianSmoothModifier,
typedef float(TangentPoint)[2]
void BKE_id_free(struct Main *bmain, void *idv)
void BKE_mesh_wrapper_ensure_mdata(struct Mesh *me)
@ eModifierTypeFlag_SupportsEditmode
@ eModifierTypeFlag_AcceptsMesh
void BKE_modifier_copydata_generic(const struct ModifierData *md, struct ModifierData *md_dst, int flag)
@ eModifierTypeType_OnlyDeform
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 cotangent_tri_weight_v3(const float v1[3], const float v2[3], const float v3[3])
MINLINE float len_v3v3(const float a[3], const float b[3]) ATTR_WARN_UNUSED_RESULT
MINLINE void mul_v3_fl(float r[3], float f)
MINLINE void add_v3_v3(float r[3], const float a[3])
#define MEMCMP_STRUCT_AFTER_IS_ZERO(struct_var, member)
#define MEMCPY_STRUCT_AFTER(struct_dst, struct_src, member)
#define CD_MASK_MDEFORMVERT
#define DNA_struct_default_get(struct_name)
@ MOD_LAPLACIANSMOOTH_PRESERVE_VOLUME
@ MOD_LAPLACIANSMOOTH_NORMALIZED
@ MOD_LAPLACIANSMOOTH_INVERT_VGROUP
struct LaplacianSmoothModifierData LaplacianSmoothModifierData
@ eModifierType_LaplacianSmooth
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 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.
static void init_data(ModifierData *md)
static bool is_disabled(const struct Scene *scene, ModifierData *md, bool useRenderParams)
static void deformVerts(ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh, float(*vertexCos)[3], int verts_num)
static void deformVertsEM(ModifierData *md, const ModifierEvalContext *ctx, struct BMEditMesh *editData, Mesh *mesh, float(*vertexCos)[3], int verts_num)
static void laplaciansmoothModifier_do(LaplacianSmoothModifierData *smd, Object *ob, Mesh *mesh, float(*vertexCos)[3], int verts_num)
ModifierTypeInfo modifierType_LaplacianSmooth
static void init_laplacian_matrix(LaplacianSystem *sys)
static void delete_laplacian_system(LaplacianSystem *sys)
static void volume_preservation(LaplacianSystem *sys, float vini, float vend, short flag)
static void memset_laplacian_system(LaplacianSystem *sys, int val)
static void required_data_mask(Object *ob, ModifierData *md, CustomData_MeshMasks *r_cddata_masks)
static void validate_solution(LaplacianSystem *sys, short flag, float lambda, float lambda_border)
static void panel_draw(const bContext *UNUSED(C), Panel *panel)
static void fill_laplacian_matrix(LaplacianSystem *sys)
static float compute_volume(const float center[3], float(*vertexCos)[3], const MPoly *mpoly, int polys_num, const MLoop *mloop)
static void panelRegister(ARegionType *region_type)
static LaplacianSystem * init_laplacian_system(int a_numEdges, int a_numPolys, int a_numLoops, int a_numVerts)
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)
void modifier_vgroup_ui(uiLayout *layout, PointerRNA *ptr, PointerRNA *ob_ptr, const char *vgroup_prop, const char *invert_vgroup_prop, const char *text)
Mesh * MOD_deform_mesh_eval_get(Object *ob, struct BMEditMesh *em, Mesh *mesh, const float(*vertexCos)[3], const int verts_num, const bool use_normals, const bool use_orco)
void MOD_get_vgroup(Object *ob, struct Mesh *mesh, const char *name, MDeformVert **dvert, int *defgrp_index)
uiLayout * uiLayoutRowWithHeading(uiLayout *layout, bool align, const char *heading)
void uiLayoutSetPropSep(uiLayout *layout, bool is_sep)
@ 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
SIMD_FORCE_INLINE const btScalar & w() const
Return the w value.
void EIG_linear_solver_variable_set(LinearSolver *solver, int rhs, int index, double value)
void EIG_linear_solver_right_hand_side_add(LinearSolver *solver, int rhs, int index, double value)
LinearSolver * EIG_linear_least_squares_solver_new(int num_rows, int num_columns, int num_rhs)
void EIG_linear_solver_delete(LinearSolver *solver)
double EIG_linear_solver_variable_get(LinearSolver *solver, int rhs, int index)
void EIG_linear_solver_matrix_add(LinearSolver *solver, int row, int col, double value)
bool EIG_linear_solver_solve(LinearSolver *solver)
void(* MEM_freeN)(void *vmemh)
void *(* MEM_calloc_arrayN)(size_t len, size_t size, const char *str)
void *(* MEM_callocN)(size_t len, const char *str)
ccl_device_inline float3 pow(float3 v, float e)
ccl_device_inline float beta(float x, float y)