29#include "RNA_prototypes.hh"
34#define BEND_EPS 0.000001f
78static void axis_limit(
const int axis,
const float limits[2],
float co[3],
float dcut[3])
81 val = std::max(limits[0], val);
82 val = std::min(limits[1], val);
84 dcut[axis] = co[axis] - val;
93 float x = r_co[0],
y = r_co[1],
z = r_co[2];
94 float scale =
z * factor;
96 r_co[0] =
x +
x * scale;
97 r_co[1] =
y +
y * scale;
108 float x = r_co[0],
y = r_co[1],
z = r_co[2];
111 scale = (
z *
z * factor - factor + 1.0f);
115 r_co[2] =
z * (1.0f + factor);
125 float x = r_co[0],
y = r_co[1],
z = r_co[2];
126 float theta, sint, cost;
132 r_co[0] =
x * cost -
y * sint;
133 r_co[1] =
x * sint +
y * cost;
144 float x = r_co[0],
y = r_co[1],
z = r_co[2];
145 float theta, sint, cost;
166 r_co[1] =
y * cost + (1.0f - cost) / factor;
167 r_co[2] = -(
y - 1.0f / factor) * sint;
170 r_co[1] += sint * dcut[2];
171 r_co[2] += cost * dcut[2];
175 r_co[0] =
x * cost + (1.0f - cost) / factor;
177 r_co[2] = -(
x - 1.0f / factor) * sint;
179 r_co[0] += sint * dcut[2];
181 r_co[2] += cost * dcut[2];
185 r_co[0] = -(
y - 1.0f / factor) * sint;
186 r_co[1] =
y * cost + (1.0f - cost) / factor;
189 r_co[0] += cost * dcut[0];
190 r_co[1] += sint * dcut[0];
206 const float base_limit[2] = {0.0f, 0.0f};
208 if (weight != 0.0f) {
209 float co[3], dcut[3] = {0.0f, 0.0f, 0.0f};
211 if (curr_deform_data->
transf) {
234 switch (curr_deform_data->
mode) {
264 if (curr_deform_data->
transf) {
275 float (*vertexCos)[3],
279 float smd_limit[2], smd_factor;
285 const int deform_axis = std::clamp(
int(smd->
deform_axis), 0, 2);
286 int lock_axis = smd->
axis;
293 if (deform_axis == 0) {
296 if (deform_axis == 1) {
299 if (deform_axis == 2) {
309 smd->
limit[0] = std::max(smd->
limit[0], 0.0f);
310 smd->
limit[0] = std::min(smd->
limit[0], 1.0f);
315 if (smd->
origin !=
nullptr) {
316 transf = &tmp_transf;
321 int limit_axis = deform_axis;
324 switch (deform_axis) {
339 for (
i = 0;
i < verts_num;
i++) {
347 lower =
min_ff(lower, tmp[limit_axis]);
348 upper =
max_ff(upper, tmp[limit_axis]);
352 smd_limit[1] = lower + (upper - lower) * smd->
limit[1];
353 smd_limit[0] = lower + (upper - lower) * smd->
limit[0];
355 smd_factor = smd->
factor /
max_ff(FLT_EPSILON, smd_limit[1] - smd_limit[0]);
372 deform_pool_data.
transf = transf;
376 deform_pool_data.
vgroup = vgroup;
377 deform_pool_data.
smd_limit[0] = smd_limit[0];
378 deform_pool_data.
smd_limit[1] = smd_limit[1];
379 deform_pool_data.
dvert = dvert;
417 if (smd->
origin !=
nullptr) {
434 reinterpret_cast<float (*)[3]
>(positions.
data()),
448 row = &layout->
row(
false);
481 if (
ELEM(deform_method,
488 row = &layout->
row(
true,
IFACE_(
"Lock"));
489 if (deform_axis != 0) {
490 row->
prop(
ptr,
"lock_x", toggles_flag, std::nullopt, ICON_NONE);
492 if (deform_axis != 1) {
493 row->
prop(
ptr,
"lock_y", toggles_flag, std::nullopt, ICON_NONE);
495 if (deform_axis != 2) {
496 row->
prop(
ptr,
"lock_z", toggles_flag, std::nullopt, ICON_NONE);
514 "SimpleDeformModifierData",
516 &RNA_SimpleDeformModifier,
522 ICON_MOD_SIMPLEDEFORM,
void(*)(void *user_data, Object *ob, ID **idpoin, LibraryForeachIDCallbackFlag cb_flag) IDWalkFunc
void BKE_modifier_copydata_generic(const ModifierData *md, ModifierData *md_dst, int flag)
@ eModifierTypeFlag_AcceptsCVs
@ eModifierTypeFlag_EnableInEditmode
@ eModifierTypeFlag_SupportsEditmode
@ eModifierTypeFlag_AcceptsVertexCosOnly
@ eModifierTypeFlag_AcceptsMesh
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)
@ MOD_SIMPLEDEFORM_LOCK_AXIS_Z
@ MOD_SIMPLEDEFORM_LOCK_AXIS_X
@ MOD_SIMPLEDEFORM_LOCK_AXIS_Y
@ MOD_SIMPLEDEFORM_FLAG_INVERT_VGROUP
@ MOD_SIMPLEDEFORM_MODE_TAPER
@ MOD_SIMPLEDEFORM_MODE_STRETCH
@ MOD_SIMPLEDEFORM_MODE_BEND
@ MOD_SIMPLEDEFORM_MODE_TWIST
@ eModifierType_SimpleDeform
Object is a sort of wrapper for general info.
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 foreach_ID_link(ModifierData *md, Object *ob, IDWalkFunc walk, void *user_data)
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_subpanel_register(ARegionType *region_type, const char *name, const char *label, PanelDrawFn draw_header, PanelDrawFn draw, PanelType *parent)
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
SIMD_FORCE_INLINE const btScalar & z() const
Return the z value.
constexpr int64_t size() const
constexpr T * data() const
static void update_depsgraph(tGraphSliderOp *gso)
int RNA_enum_get(PointerRNA *ptr, const char *name)
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)