27#include "RNA_prototypes.hh"
32#define BEND_EPS 0.000001f
76static void axis_limit(
const int axis,
const float limits[2],
float co[3],
float dcut[3])
79 if (limits[0] > val) {
82 if (limits[1] < val) {
86 dcut[axis] = co[axis] - val;
95 float x = r_co[0], y = r_co[1],
z = r_co[2];
96 float scale =
z * factor;
98 r_co[0] = x + x * scale;
99 r_co[1] = y + y * scale;
110 float x = r_co[0], y = r_co[1],
z = r_co[2];
113 scale = (
z *
z * factor - factor + 1.0f);
117 r_co[2] =
z * (1.0f + factor);
127 float x = r_co[0], y = r_co[1],
z = r_co[2];
128 float theta, sint, cost;
134 r_co[0] = x * cost - y * sint;
135 r_co[1] = x * sint + y * cost;
146 float x = r_co[0], y = r_co[1],
z = r_co[2];
147 float theta, sint, cost;
168 r_co[1] = y * cost + (1.0f - cost) / factor;
169 r_co[2] = -(y - 1.0f / factor) * sint;
172 r_co[1] += sint * dcut[2];
173 r_co[2] += cost * dcut[2];
177 r_co[0] = x * cost + (1.0f - cost) / factor;
179 r_co[2] = -(x - 1.0f / factor) * sint;
181 r_co[0] += sint * dcut[2];
183 r_co[2] += cost * dcut[2];
187 r_co[0] = -(y - 1.0f / factor) * sint;
188 r_co[1] = y * cost + (1.0f - cost) / factor;
191 r_co[0] += cost * dcut[0];
192 r_co[1] += sint * dcut[0];
204 curr_deform_data->
dvert, iter, curr_deform_data->
vgroup);
208 const float base_limit[2] = {0.0f, 0.0f};
211 weight = 1.0f - weight;
214 if (weight != 0.0f) {
215 float co[3], dcut[3] = {0.0f, 0.0f, 0.0f};
217 if (curr_deform_data->
transf) {
240 switch (curr_deform_data->
mode) {
270 if (curr_deform_data->
transf) {
281 float (*vertexCos)[3],
285 float smd_limit[2], smd_factor;
291 const int deform_axis = std::clamp(
int(smd->
deform_axis), 0, 2);
292 int lock_axis = smd->
axis;
299 if (deform_axis == 0) {
300 lock_axis &= ~MOD_SIMPLEDEFORM_LOCK_AXIS_X;
302 if (deform_axis == 1) {
303 lock_axis &= ~MOD_SIMPLEDEFORM_LOCK_AXIS_Y;
305 if (deform_axis == 2) {
306 lock_axis &= ~MOD_SIMPLEDEFORM_LOCK_AXIS_Z;
315 if (smd->
limit[0] < 0.0f) {
316 smd->
limit[0] = 0.0f;
318 if (smd->
limit[0] > 1.0f) {
319 smd->
limit[0] = 1.0f;
325 if (smd->
origin !=
nullptr) {
326 transf = &tmp_transf;
331 int limit_axis = deform_axis;
334 switch (deform_axis) {
349 for (i = 0; i < verts_num; i++) {
357 lower =
min_ff(lower, tmp[limit_axis]);
358 upper =
max_ff(upper, tmp[limit_axis]);
362 smd_limit[1] = lower + (upper - lower) * smd->
limit[1];
363 smd_limit[0] = lower + (upper - lower) * smd->
limit[0];
365 smd_factor = smd->
factor /
max_ff(FLT_EPSILON, smd_limit[1] - smd_limit[0]);
380 deform_pool_data.smd_factor = smd_factor;
381 deform_pool_data.deform_axis = deform_axis;
382 deform_pool_data.transf = transf;
383 deform_pool_data.vertexCos = vertexCos;
384 deform_pool_data.invert_vgroup = invert_vgroup;
385 deform_pool_data.lock_axis = lock_axis;
386 deform_pool_data.vgroup = vgroup;
387 deform_pool_data.smd_limit[0] = smd_limit[0];
388 deform_pool_data.smd_limit[1] = smd_limit[1];
389 deform_pool_data.dvert = dvert;
390 deform_pool_data.limit_axis = limit_axis;
427 if (smd->
origin !=
nullptr) {
444 reinterpret_cast<float(*)[3]
>(positions.data()),
491 if (
ELEM(deform_method,
499 if (deform_axis != 0) {
500 uiItemR(row,
ptr,
"lock_x", toggles_flag,
nullptr, ICON_NONE);
502 if (deform_axis != 1) {
503 uiItemR(row,
ptr,
"lock_y", toggles_flag,
nullptr, ICON_NONE);
505 if (deform_axis != 2) {
506 uiItemR(row,
ptr,
"lock_z", toggles_flag,
nullptr, ICON_NONE);
524 "SimpleDeformModifierData",
526 &RNA_SimpleDeformModifier,
532 ICON_MOD_SIMPLEDEFORM,
void BKE_modifier_copydata_generic(const ModifierData *md, ModifierData *md_dst, int flag)
@ eModifierTypeFlag_AcceptsCVs
@ eModifierTypeFlag_EnableInEditmode
@ eModifierTypeFlag_SupportsEditmode
@ eModifierTypeFlag_AcceptsVertexCosOnly
@ eModifierTypeFlag_AcceptsMesh
void(*)(void *user_data, Object *ob, ID **idpoin, int cb_flag) IDWalkFunc
MINLINE float max_ff(float a, float b)
MINLINE float min_ff(float a, float b)
void BLI_space_transform_apply(const struct SpaceTransform *data, float co[3])
void BLI_space_transform_invert(const struct SpaceTransform *data, float co[3])
#define BLI_SPACE_TRANSFORM_SETUP(data, local, target)
MINLINE void copy_v3_v3(float r[3], const float a[3])
void interp_v3_v3v3(float r[3], const float a[3], const float b[3], float t)
MINLINE void add_v3_v3(float r[3], const float a[3])
void BLI_task_parallel_range(int start, int stop, void *userdata, TaskParallelRangeFunc func, const TaskParallelSettings *settings)
BLI_INLINE void BLI_parallel_range_settings_defaults(TaskParallelSettings *settings)
#define MEMCMP_STRUCT_AFTER_IS_ZERO(struct_var, member)
#define MEMCPY_STRUCT_AFTER(struct_dst, struct_src, member)
void DEG_add_depends_on_transform_relation(DepsNodeHandle *node_handle, const char *description)
void DEG_add_object_relation(DepsNodeHandle *node_handle, Object *object, eDepsObjectComponentType component, const char *description)
#define CD_MASK_MDEFORMVERT
#define DNA_struct_default_get(struct_name)
struct SimpleDeformModifierData SimpleDeformModifierData
@ MOD_SIMPLEDEFORM_LOCK_AXIS_Z
@ MOD_SIMPLEDEFORM_LOCK_AXIS_X
@ MOD_SIMPLEDEFORM_LOCK_AXIS_Y
@ MOD_SIMPLEDEFORM_FLAG_INVERT_VGROUP
@ eModifierType_SimpleDeform
@ MOD_SIMPLEDEFORM_MODE_TAPER
@ MOD_SIMPLEDEFORM_MODE_STRETCH
@ MOD_SIMPLEDEFORM_MODE_BEND
@ MOD_SIMPLEDEFORM_MODE_TWIST
Object is a sort of wrapper for general info.
PanelType * modifier_subpanel_register(ARegionType *region_type, const char *name, const char *label, PanelDrawFn draw_header, PanelDrawFn draw, PanelType *parent)
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)
uiLayout * uiLayoutRow(uiLayout *layout, bool align)
void uiLayoutSetPropSep(uiLayout *layout, bool is_sep)
uiLayout * uiLayoutRowWithHeading(uiLayout *layout, bool align, const char *heading)
void uiItemR(uiLayout *layout, PointerRNA *ptr, const char *propname, eUI_Item_Flag flag, const char *name, int icon)
@ UI_ITEM_R_FORCE_BLANK_DECORATE
SIMD_FORCE_INLINE const btScalar & z() const
Return the z value.
local_group_size(16, 16) .push_constant(Type b
draw_view in_light_buf[] float
int RNA_enum_get(PointerRNA *ptr, const char *name)