29#include "RNA_prototypes.hh"
50 if ((cmd->
fac == 0.0f) ||
flag == 0) {
77 if (cmd->
object !=
nullptr) {
95 bool has_radius =
false;
99 float facm = 1.0f - fac;
100 const float fac_orig = fac;
101 float vec[3], center[3] = {0.0f, 0.0f, 0.0f};
102 float mat[4][4], imat[4][4];
119 mul_m4_m4m4(mat, imat, ob->object_to_world().ptr());
124 mul_v3_m4v3(center, ob->world_to_object().ptr(), ctrl_ob->object_to_world().location());
132 if (cmd->
radius > FLT_EPSILON) {
150 for (i = 0; i < positions.size(); i++) {
153 len /= positions.size();
160 for (i = 0; i < positions.size(); i++) {
186 const float weight = invert_vgroup ?
190 if (weight == 0.0f) {
194 fac = fac_orig * weight;
201 tmp_co[0] = fac * vec[0] *
len + facm * tmp_co[0];
204 tmp_co[1] = fac * vec[1] *
len + facm * tmp_co[1];
207 tmp_co[2] = fac * vec[2] *
len + facm * tmp_co[2];
233 Object *ctrl_ob =
nullptr;
236 bool has_radius =
false;
238 float fac = cmd->
fac;
239 float facm = 1.0f - fac;
240 const float fac_orig = fac;
241 float min[3], max[3], bb[8][3];
242 float center[3] = {0.0f, 0.0f, 0.0f};
243 float mat[4][4], imat[4][4];
254 if (cmd->
radius > FLT_EPSILON) {
267 mul_m4_m4m4(mat, imat, ob->object_to_world().ptr());
272 mul_v3_m4v3(center, ob->world_to_object().ptr(), ctrl_ob->object_to_world().location());
276 for (i = 0; i < 3; i++) {
282 for (i = 0; i < 3; i++) {
302 for (i = 0; i < positions.size(); i++) {
308 for (i = 0; i < positions.size(); i++) {
329 bb[0][0] = bb[2][0] = bb[4][0] = bb[6][0] =
min[0];
330 bb[1][0] = bb[3][0] = bb[5][0] = bb[7][0] = max[0];
331 bb[0][1] = bb[1][1] = bb[4][1] = bb[5][1] =
min[1];
332 bb[2][1] = bb[3][1] = bb[6][1] = bb[7][1] = max[1];
333 bb[0][2] = bb[1][2] = bb[2][2] = bb[3][2] =
min[2];
334 bb[4][2] = bb[5][2] = bb[6][2] = bb[7][2] = max[2];
337 for (i = 0; i < positions.size(); i++) {
339 float d[3], dmax, apex[3], fbb;
361 const float weight = invert_vgroup ?
365 if (weight == 0.0f) {
369 fac = fac_orig * weight;
383 if (tmp_co[0] > 0.0f) {
386 if (tmp_co[1] > 0.0f) {
389 if (tmp_co[2] > 0.0f) {
397 d[0] = tmp_co[0] / apex[0];
398 d[1] = tmp_co[1] / apex[1];
399 d[2] = tmp_co[2] / apex[2];
415 if (
fabsf(tmp_co[coord]) < FLT_EPSILON) {
421 fbb = apex[coord] / tmp_co[coord];
425 tmp_co[0] = facm * tmp_co[0] + fac * tmp_co[0] * fbb;
428 tmp_co[1] = facm * tmp_co[1] + fac * tmp_co[1] * fbb;
431 tmp_co[2] = facm * tmp_co[2] + fac * tmp_co[2] * fbb;
478 uiItemR(row,
ptr,
"use_x", toggles_flag,
nullptr, ICON_NONE);
479 uiItemR(row,
ptr,
"use_y", toggles_flag,
nullptr, ICON_NONE);
480 uiItemR(row,
ptr,
"use_z", toggles_flag,
nullptr, ICON_NONE);
void BKE_modifier_copydata_generic(const ModifierData *md, ModifierData *md_dst, int flag)
@ eModifierTypeFlag_AcceptsCVs
@ eModifierTypeFlag_SupportsEditmode
@ eModifierTypeFlag_AcceptsVertexCosOnly
void(*)(void *user_data, Object *ob, ID **idpoin, int cb_flag) IDWalkFunc
void mul_m4_m4m4(float R[4][4], const float A[4][4], const float B[4][4])
void mul_m4_v3(const float M[4][4], float r[3])
void mul_v3_m4v3(float r[3], const float mat[4][4], const float vec[3])
bool invert_m4_m4(float inverse[4][4], const float mat[4][4])
MINLINE float len_v3v3(const float a[3], const float b[3]) ATTR_WARN_UNUSED_RESULT
void minmax_v3v3_v3(float min[3], float max[3], const float vec[3])
MINLINE void sub_v3_v3(float r[3], const float a[3])
MINLINE void sub_v3_v3v3(float r[3], const float a[3], const float b[3])
MINLINE void copy_v3_v3(float r[3], const float a[3])
MINLINE void add_v3_v3(float r[3], const float a[3])
MINLINE float normalize_v3(float n[3])
MINLINE float len_v3(const float a[3]) ATTR_WARN_UNUSED_RESULT
#define INIT_MINMAX(min, max)
#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 CastModifierData CastModifierData
@ MOD_CAST_USE_OB_TRANSFORM
@ MOD_CAST_SIZE_FROM_RADIUS
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)
ModifierTypeInfo modifierType_Cast
static void panel_draw(const bContext *, Panel *panel)
static void required_data_mask(ModifierData *md, CustomData_MeshMasks *r_cddata_masks)
static void foreach_ID_link(ModifierData *md, Object *ob, IDWalkFunc walk, void *user_data)
static void cuboid_do(CastModifierData *cmd, const ModifierEvalContext *, Object *ob, Mesh *mesh, blender::MutableSpan< blender::float3 > positions)
static void update_depsgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx)
static void sphere_do(CastModifierData *cmd, const ModifierEvalContext *, Object *ob, Mesh *mesh, blender::MutableSpan< blender::float3 > positions)
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)
void uiItemR(uiLayout *layout, PointerRNA *ptr, const char *propname, eUI_Item_Flag flag, const char *name, int icon)
@ UI_ITEM_R_FORCE_BLANK_DECORATE
PointerRNA RNA_pointer_get(PointerRNA *ptr, const char *name)
bool RNA_pointer_is_null(const PointerRNA *ptr)
ObjectRuntimeHandle * runtime