26#include "RNA_prototypes.hh"
48 if (smd->
fac == 0.0f ||
flag == 0) {
68 if (mesh ==
nullptr) {
72 float(*accumulated_vecs)[3] =
static_cast<float(*)[3]
>(
74 if (!accumulated_vecs) {
78 uint *accumulated_vecs_count =
static_cast<uint *
>(
80 if (!accumulated_vecs_count) {
85 const float fac_new = smd->
fac;
86 const float fac_orig = 1.0f - fac_new;
95 for (
int j = 0; j < smd->
repeat; j++) {
97 memset(accumulated_vecs, 0,
sizeof(*accumulated_vecs) *
size_t(verts_num));
98 memset(accumulated_vecs_count, 0,
sizeof(*accumulated_vecs_count) *
size_t(verts_num));
103 const uint idx1 = edges[i][0];
104 const uint idx2 = edges[i][1];
106 mid_v3_v3v3(fvec, vertexCos[idx1], vertexCos[idx2]);
108 accumulated_vecs_count[idx1]++;
111 accumulated_vecs_count[idx2]++;
118 for (
int i = 0; i < verts_num; i++, dv++) {
119 float *vco_orig = vertexCos[i];
120 if (accumulated_vecs_count[i] > 0) {
121 mul_v3_fl(accumulated_vecs[i], 1.0f /
float(accumulated_vecs_count[i]));
123 float *vco_new = accumulated_vecs[i];
127 if (f_vgroup <= 0.0f) {
130 const float f_new = f_vgroup * fac_new;
131 const float f_orig = 1.0f - f_new;
134 vco_orig[0] = f_orig * vco_orig[0] + f_new * vco_new[0];
137 vco_orig[1] = f_orig * vco_orig[1] + f_new * vco_new[1];
140 vco_orig[2] = f_orig * vco_orig[2] + f_new * vco_new[2];
145 for (
int i = 0; i < verts_num; i++) {
146 float *vco_orig = vertexCos[i];
147 if (accumulated_vecs_count[i] > 0) {
148 mul_v3_fl(accumulated_vecs[i], 1.0f /
float(accumulated_vecs_count[i]));
150 float *vco_new = accumulated_vecs[i];
153 vco_orig[0] = fac_orig * vco_orig[0] + fac_new * vco_new[0];
156 vco_orig[1] = fac_orig * vco_orig[1] + fac_new * vco_new[1];
159 vco_orig[2] = fac_orig * vco_orig[2] + fac_new * vco_new[2];
176 smd, ctx->
object, mesh,
reinterpret_cast<float(*)[3]
>(positions.
data()), positions.
size());
191 uiItemR(row,
ptr,
"use_x", toggles_flag,
nullptr, ICON_NONE);
192 uiItemR(row,
ptr,
"use_y", toggles_flag,
nullptr, ICON_NONE);
193 uiItemR(row,
ptr,
"use_z", toggles_flag,
nullptr, ICON_NONE);
212 "SmoothModifierData",
void BKE_modifier_copydata_generic(const ModifierData *md, ModifierData *md_dst, int flag)
@ eModifierTypeFlag_AcceptsCVs
@ eModifierTypeFlag_SupportsEditmode
@ eModifierTypeFlag_AcceptsMesh
MINLINE void mul_v3_fl(float r[3], float f)
void mid_v3_v3v3(float r[3], const float a[3], const float b[3])
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_SMOOTH_INVERT_VGROUP
Read Guarded memory(de)allocation.
static void init_data(ModifierData *md)
static void deform_verts(ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh, blender::MutableSpan< blender::float3 > positions)
static void panel_register(ARegionType *region_type)
static void required_data_mask(ModifierData *, CustomData_MeshMasks *r_cddata_masks)
static void panel_draw(const bContext *, Panel *panel)
static void init_data(ModifierData *md)
static void deform_verts(ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh, blender::MutableSpan< blender::float3 > positions)
static void panel_register(ARegionType *region_type)
ModifierTypeInfo modifierType_Smooth
static void smoothModifier_do(SmoothModifierData *smd, Object *ob, Mesh *mesh, float(*vertexCos)[3], int verts_num)
static void panel_draw(const bContext *, Panel *panel)
static void required_data_mask(ModifierData *md, CustomData_MeshMasks *r_cddata_masks)
void modifier_panel_end(uiLayout *layout, PointerRNA *ptr)
PanelType * modifier_panel_register(ARegionType *region_type, ModifierType type, PanelDrawFn draw)
PointerRNA * modifier_panel_get_property_pointers(Panel *panel, PointerRNA *r_ob_ptr)
void modifier_vgroup_ui(uiLayout *layout, PointerRNA *ptr, PointerRNA *ob_ptr, const char *vgroup_prop, const char *invert_vgroup_prop, const char *text)
void MOD_get_vgroup(const Object *ob, const Mesh *mesh, const char *name, const MDeformVert **dvert, int *defgrp_index)
void uiLayoutSetPropSep(uiLayout *layout, bool is_sep)
uiLayout * uiLayoutRowWithHeading(uiLayout *layout, bool align, const char *heading)
uiLayout * uiLayoutColumn(uiLayout *layout, bool align)
void uiItemR(uiLayout *layout, PointerRNA *ptr, const char *propname, eUI_Item_Flag flag, const char *name, int icon)
@ UI_ITEM_R_FORCE_BLANK_DECORATE
constexpr int64_t size() const
constexpr T * data() const
constexpr IndexRange index_range() const
draw_view in_light_buf[] float
void *(* MEM_calloc_arrayN)(size_t len, size_t size, const char *str)
void MEM_freeN(void *vmemh)