26#include "RNA_prototypes.hh"
49 if (smd->
fac == 0.0f ||
flag == 0) {
69 if (mesh ==
nullptr) {
74 if (!accumulated_vecs) {
79 if (!accumulated_vecs_count) {
84 const float fac_new = smd->
fac;
85 const float fac_orig = 1.0f - fac_new;
94 for (
int j = 0; j < smd->
repeat; j++) {
96 memset(accumulated_vecs, 0,
sizeof(*accumulated_vecs) *
size_t(verts_num));
97 memset(accumulated_vecs_count, 0,
sizeof(*accumulated_vecs_count) *
size_t(verts_num));
102 const uint idx1 = edges[
i][0];
103 const uint idx2 = edges[
i][1];
105 mid_v3_v3v3(fvec, vertexCos[idx1], vertexCos[idx2]);
107 accumulated_vecs_count[idx1]++;
110 accumulated_vecs_count[idx2]++;
117 for (
int i = 0;
i < verts_num;
i++, dv++) {
118 float *vco_orig = vertexCos[
i];
119 if (accumulated_vecs_count[
i] > 0) {
120 mul_v3_fl(accumulated_vecs[
i], 1.0f /
float(accumulated_vecs_count[
i]));
122 float *vco_new = accumulated_vecs[
i];
126 if (f_vgroup <= 0.0f) {
129 const float f_new = f_vgroup * fac_new;
130 const float f_orig = 1.0f - f_new;
133 vco_orig[0] = f_orig * vco_orig[0] + f_new * vco_new[0];
136 vco_orig[1] = f_orig * vco_orig[1] + f_new * vco_new[1];
139 vco_orig[2] = f_orig * vco_orig[2] + f_new * vco_new[2];
144 for (
int i = 0;
i < verts_num;
i++) {
145 float *vco_orig = vertexCos[
i];
146 if (accumulated_vecs_count[
i] > 0) {
147 mul_v3_fl(accumulated_vecs[
i], 1.0f /
float(accumulated_vecs_count[
i]));
149 float *vco_new = accumulated_vecs[
i];
152 vco_orig[0] = fac_orig * vco_orig[0] + fac_new * vco_new[0];
155 vco_orig[1] = fac_orig * vco_orig[1] + fac_new * vco_new[1];
158 vco_orig[2] = fac_orig * vco_orig[2] + fac_new * vco_new[2];
175 smd, ctx->
object, mesh,
reinterpret_cast<float (*)[3]
>(positions.
data()), positions.
size());
189 row = &layout->
row(
true,
IFACE_(
"Axis"));
190 row->
prop(
ptr,
"use_x", toggles_flag, std::nullopt, ICON_NONE);
191 row->
prop(
ptr,
"use_y", toggles_flag, std::nullopt, ICON_NONE);
192 row->
prop(
ptr,
"use_z", toggles_flag, std::nullopt, ICON_NONE);
211 "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_vgroup_ui(uiLayout *layout, PointerRNA *ptr, PointerRNA *ob_ptr, const StringRefNull vgroup_prop, const std::optional< StringRefNull > invert_vgroup_prop, const std::optional< StringRefNull > text)
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_error_message_draw(uiLayout *layout, PointerRNA *ptr)
void MOD_get_vgroup(const Object *ob, const Mesh *mesh, const char *name, const MDeformVert **dvert, int *defgrp_index)
@ UI_ITEM_R_FORCE_BLANK_DECORATE
constexpr int64_t size() const
constexpr T * data() const
constexpr IndexRange index_range() const
void * MEM_calloc_arrayN(size_t len, size_t size, const char *str)
void MEM_freeN(void *vmemh)
uiLayout & column(bool align)
uiLayout & row(bool align)
void use_property_split_set(bool value)
void prop(PointerRNA *ptr, PropertyRNA *prop, int index, int value, eUI_Item_Flag flag, std::optional< blender::StringRef > name_opt, int icon, std::optional< blender::StringRef > placeholder=std::nullopt)