Blender V5.0
MOD_hook.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2005 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
8
9#include "BLI_utildefines.h"
10
11#include "BLI_bitmap.h"
12#include "BLI_math_matrix.h"
13#include "BLI_math_vector.h"
14
15#include "BLT_translation.hh"
16
17#include "DNA_defaults.h"
18#include "DNA_mesh_types.h"
19#include "DNA_meshdata_types.h"
20#include "DNA_object_types.h"
21#include "DNA_screen_types.h"
22
23#include "BKE_action.hh"
24#include "BKE_colortools.hh"
25#include "BKE_deform.hh"
26#include "BKE_editmesh.hh"
27#include "BKE_lib_query.hh"
28#include "BKE_mesh.hh"
29#include "BKE_modifier.hh"
30#include "BKE_object_types.hh"
31
32#include "UI_interface.hh"
34#include "UI_resources.hh"
35
36#include "BLO_read_write.hh"
37
38#include "RNA_access.hh"
39#include "RNA_prototypes.hh"
40
41#include "MEM_guardedalloc.h"
42
43#include "MOD_ui_common.hh"
44#include "MOD_util.hh"
45
46static void init_data(ModifierData *md)
47{
49
51
53
54 hmd->curfalloff = BKE_curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f);
55}
56
57static void copy_data(const ModifierData *md, ModifierData *target, const int flag)
58{
59 const HookModifierData *hmd = (const HookModifierData *)md;
60 HookModifierData *thmd = (HookModifierData *)target;
61
63
65
66 thmd->indexar = static_cast<int *>(MEM_dupallocN(hmd->indexar));
67}
68
69static void required_data_mask(ModifierData *md, CustomData_MeshMasks *r_cddata_masks)
70{
72
73 /* Ask for vertex-groups if we need them. */
74 if (hmd->name[0] != '\0') {
75 r_cddata_masks->vmask |= CD_MASK_MDEFORMVERT;
76 }
77 if (hmd->indexar != nullptr) {
78 /* TODO: check which origindex are actually needed? */
79 r_cddata_masks->vmask |= CD_MASK_ORIGINDEX;
80 r_cddata_masks->emask |= CD_MASK_ORIGINDEX;
81 r_cddata_masks->pmask |= CD_MASK_ORIGINDEX;
82 }
83}
84
85static void free_data(ModifierData *md)
86{
88
90
92}
93
94static bool is_disabled(const Scene * /*scene*/, ModifierData *md, bool /*use_render_params*/)
95{
97
98 return !hmd->object;
99}
100
101static void foreach_ID_link(ModifierData *md, Object *ob, IDWalkFunc walk, void *user_data)
102{
104
105 walk(user_data, ob, (ID **)&hmd->object, IDWALK_CB_NOP);
106}
107
109{
111 if (hmd->object != nullptr) {
112 if (hmd->subtarget[0]) {
114 ctx->node, hmd->object, hmd->subtarget, DEG_OB_COMP_BONE, "Hook Modifier");
115 }
116 DEG_add_object_relation(ctx->node, hmd->object, DEG_OB_COMP_TRANSFORM, "Hook Modifier");
117 }
118 /* We need our own transformation as well. */
119 DEG_add_depends_on_transform_relation(ctx->node, "Hook Modifier");
120}
121
148
150{
151 BLI_bitmap *indexar_used = BLI_BITMAP_NEW(verts_num, __func__);
152 int i;
153 int *index_pt;
154 for (i = 0, index_pt = hmd->indexar; i < hmd->indexar_num; i++, index_pt++) {
155 const int j = *index_pt;
156 if (j < verts_num) {
157 BLI_BITMAP_ENABLE(indexar_used, i);
158 }
159 }
160 return indexar_used;
161}
162
163static float hook_falloff(const HookData_cb *hd, const float len_sq)
164{
166 if (len_sq > hd->falloff_sq) {
167 return 0.0f;
168 }
169 if (len_sq > 0.0f) {
170 float fac;
171
173 fac = 1.0f;
174 goto finally;
175 }
176 else if (hd->falloff_type == eHook_Falloff_InvSquare) {
177 /* Avoid `sqrt` below. */
178 fac = 1.0f - (len_sq / hd->falloff_sq);
179 goto finally;
180 }
181
182 fac = 1.0f - (sqrtf(len_sq) / hd->falloff);
183
184 /* closely match PROP_SMOOTH and similar */
185 switch (hd->falloff_type) {
186#if 0
188 fac = 1.0f;
189 break;
190#endif
192 fac = BKE_curvemapping_evaluateF(hd->curfalloff, 0, fac);
193 break;
195 fac = fac * fac;
196 break;
198 fac = 3.0f * fac * fac - 2.0f * fac * fac * fac;
199 break;
201 fac = sqrtf(fac);
202 break;
204 /* pass */
205 break;
206#if 0
208 fac = 1.0f;
209 break;
210#endif
212 fac = sqrtf(2 * fac - fac * fac);
213 break;
214#if 0
216 fac = fac * (2.0f - fac);
217 break;
218#endif
219 }
220
221 finally:
222 return fac * hd->fac_orig;
223 }
224 else {
225 return hd->fac_orig;
226 }
227}
228
229static void hook_co_apply(HookData_cb *hd, int j, const MDeformVert *dv)
230{
231 float *co = hd->positions[j];
232 float fac;
233
234 if (hd->use_falloff) {
235 float len_sq;
236
237 if (hd->use_uniform) {
238 float co_uniform[3];
239 mul_v3_m3v3(co_uniform, hd->mat_uniform, co);
240 len_sq = len_squared_v3v3(hd->cent, co_uniform);
241 }
242 else {
243 len_sq = len_squared_v3v3(hd->cent, co);
244 }
245
246 fac = hook_falloff(hd, len_sq);
247 }
248 else {
249 fac = hd->fac_orig;
250 }
251
252 if (fac) {
253 if (dv != nullptr) {
254 fac *= hd->invert_vgroup ? 1.0f - BKE_defvert_find_weight(dv, hd->defgrp_index) :
256 }
257
258 if (fac) {
259 float co_tmp[3];
260 mul_v3_m4v3(co_tmp, hd->mat, co);
261 interp_v3_v3v3(co, co, co_tmp, fac);
262 }
263 }
264}
265
267 const ModifierEvalContext * /*ctx*/,
268 Object *ob,
269 Mesh *mesh,
270 const BMEditMesh *em,
272{
273 Object *ob_target = hmd->object;
274 bPoseChannel *pchan = BKE_pose_channel_find_name(ob_target->pose, hmd->subtarget);
275 float dmat[4][4];
276 int i, *index_pt;
277 const MDeformVert *dvert;
278 HookData_cb hd;
279 const bool invert_vgroup = (hmd->flag & MOD_HOOK_INVERT_VGROUP) != 0;
280
281 if (hmd->curfalloff == nullptr) {
282 /* should never happen, but bad lib linking could cause it */
283 hmd->curfalloff = BKE_curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f);
284 }
285
286 if (hmd->curfalloff) {
288 }
289
290 /* Generic data needed for applying per-vertex calculations (initialize all members) */
291 hd.positions = positions;
292
293 MOD_get_vgroup(ob, mesh, hmd->name, &dvert, &hd.defgrp_index);
294 int cd_dvert_offset = -1;
295
296 if (hd.defgrp_index != -1) {
297 /* Edit-mesh. */
298 if (em != nullptr) {
299 cd_dvert_offset = CustomData_get_offset(&em->bm->vdata, CD_MDEFORMVERT);
300 if (cd_dvert_offset == -1) {
301 hd.defgrp_index = -1;
302 }
303 }
304 else {
305 /* Regular mesh. */
306 if (dvert == nullptr) {
307 hd.defgrp_index = -1;
308 }
309 }
310 }
311
312 hd.curfalloff = hmd->curfalloff;
313
314 hd.falloff_type = hmd->falloff_type;
315 hd.falloff = (hmd->falloff_type == eHook_Falloff_None) ? 0.0f : hmd->falloff;
316 hd.falloff_sq = square_f(hd.falloff);
317 hd.fac_orig = hmd->force;
318
319 hd.use_falloff = (hd.falloff_sq != 0.0f);
320 hd.use_uniform = (hmd->flag & MOD_HOOK_UNIFORM_SPACE) != 0;
321
322 hd.invert_vgroup = invert_vgroup;
323
324 if (hd.use_uniform) {
326 mul_v3_m3v3(hd.cent, hd.mat_uniform, hmd->cent);
327 }
328 else {
329 unit_m3(hd.mat_uniform); /* unused */
330 copy_v3_v3(hd.cent, hmd->cent);
331 }
332
333 /* get world-space matrix of target, corrected for the space the verts are in */
334 if (hmd->subtarget[0] && pchan) {
335 /* bone target if there's a matching pose-channel */
336 mul_m4_m4m4(dmat, ob_target->object_to_world().ptr(), pchan->pose_mat);
337 }
338 else {
339 /* just object target */
340 copy_m4_m4(dmat, ob_target->object_to_world().ptr());
341 }
342 invert_m4_m4(ob->runtime->world_to_object.ptr(), ob->object_to_world().ptr());
343 mul_m4_series(hd.mat, ob->world_to_object().ptr(), dmat, hmd->parentinv);
344 /* --- done with 'hd' init --- */
345
346 /* Regarding index range checking below.
347 *
348 * This should always be true and I don't generally like
349 * "paranoid" style code like this, but old files can have
350 * indices that are out of range because old blender did
351 * not correct them on exit edit-mode. - zr
352 */
353
354 if (hmd->force == 0.0f) {
355 /* do nothing, avoid annoying checks in the loop */
356 }
357 else if (hmd->indexar) { /* vertex indices? */
358 const int *origindex_ar;
359 /* if mesh is present and has original index data, use it */
360 if (mesh && (origindex_ar = static_cast<const int *>(
362 {
363 int verts_orig_num = positions.size();
364 if (ob->type == OB_MESH) {
365 const Mesh *me_orig = static_cast<const Mesh *>(ob->data);
366 verts_orig_num = me_orig->verts_num;
367 }
368 BLI_bitmap *indexar_used = hook_index_array_to_bitmap(hmd, verts_orig_num);
369 for (i = 0; i < positions.size(); i++) {
370 int i_orig = origindex_ar[i];
371 BLI_assert(i_orig < verts_orig_num);
372 if (BLI_BITMAP_TEST(indexar_used, i_orig)) {
373 hook_co_apply(&hd, i, dvert ? &dvert[i] : nullptr);
374 }
375 }
376 MEM_freeN(indexar_used);
377 }
378 else { /* missing mesh or ORIGINDEX */
379 if ((em != nullptr) && (hd.defgrp_index != -1)) {
380 BLI_assert(em->bm->totvert == positions.size());
381 BLI_bitmap *indexar_used = hook_index_array_to_bitmap(hmd, positions.size());
382 BMIter iter;
383 BMVert *v;
384 BM_ITER_MESH_INDEX (v, &iter, em->bm, BM_VERTS_OF_MESH, i) {
385 if (BLI_BITMAP_TEST(indexar_used, i)) {
386 const MDeformVert *dv = static_cast<const MDeformVert *>(
387 BM_ELEM_CD_GET_VOID_P(v, cd_dvert_offset));
388 hook_co_apply(&hd, i, dv);
389 }
390 }
391 MEM_freeN(indexar_used);
392 }
393 else {
394 for (i = 0, index_pt = hmd->indexar; i < hmd->indexar_num; i++, index_pt++) {
395 const int j = *index_pt;
396 if (j < positions.size()) {
397 hook_co_apply(&hd, j, dvert ? &dvert[j] : nullptr);
398 }
399 }
400 }
401 }
402 }
403 else if (hd.defgrp_index != -1) { /* vertex group hook */
404 if (em != nullptr) {
405 BLI_assert(em->bm->totvert == positions.size());
406 BMIter iter;
407 BMVert *v;
408 BM_ITER_MESH_INDEX (v, &iter, em->bm, BM_VERTS_OF_MESH, i) {
409 const MDeformVert *dv = static_cast<const MDeformVert *>(
410 BM_ELEM_CD_GET_VOID_P(v, cd_dvert_offset));
411 hook_co_apply(&hd, i, dv);
412 }
413 }
414 else {
415 BLI_assert(dvert != nullptr);
416 for (i = 0; i < positions.size(); i++) {
417 hook_co_apply(&hd, i, &dvert[i]);
418 }
419 }
420 }
421}
422
424 const ModifierEvalContext *ctx,
425 Mesh *mesh,
427{
429 deformVerts_do(hmd, ctx, ctx->object, mesh, nullptr, positions);
430}
431
433 const ModifierEvalContext *ctx,
434 const BMEditMesh *em,
435 Mesh *mesh,
437{
439
440 deformVerts_do(hmd,
441 ctx,
442 ctx->object,
443 mesh,
444 mesh->runtime->wrapper_type == ME_WRAPPER_TYPE_BMESH ? em : nullptr,
445 positions);
446}
447
448static void panel_draw(const bContext * /*C*/, Panel *panel)
449{
450 uiLayout *row, *col;
451 uiLayout *layout = panel->layout;
452
453 PointerRNA ob_ptr;
455
456 PointerRNA hook_object_ptr = RNA_pointer_get(ptr, "object");
457
458 layout->use_property_split_set(true);
459
460 col = &layout->column(false);
461 col->prop(ptr, "object", UI_ITEM_NONE, std::nullopt, ICON_NONE);
462 if (!RNA_pointer_is_null(&hook_object_ptr) &&
463 RNA_enum_get(&hook_object_ptr, "type") == OB_ARMATURE)
464 {
465 PointerRNA hook_object_data_ptr = RNA_pointer_get(&hook_object_ptr, "data");
466 col->prop_search(ptr, "subtarget", &hook_object_data_ptr, "bones", IFACE_("Bone"), ICON_NONE);
467 }
468 modifier_vgroup_ui(layout, ptr, &ob_ptr, "vertex_group", "invert_vertex_group", std::nullopt);
469
470 layout->prop(ptr, "strength", UI_ITEM_R_SLIDER, std::nullopt, ICON_NONE);
471
472 if (RNA_enum_get(&ob_ptr, "mode") == OB_MODE_EDIT) {
473 row = &layout->row(true);
474 row->op("OBJECT_OT_hook_reset", IFACE_("Reset"), ICON_NONE);
475 row->op("OBJECT_OT_hook_recenter", IFACE_("Recenter"), ICON_NONE);
476 row = &layout->row(true);
477 row->op("OBJECT_OT_hook_select", IFACE_("Select"), ICON_NONE);
478 row->op("OBJECT_OT_hook_assign", IFACE_("Assign"), ICON_NONE);
479 }
480
482}
483
484static void falloff_panel_draw(const bContext * /*C*/, Panel *panel)
485{
486 uiLayout *row;
487 uiLayout *layout = panel->layout;
488
490
491 bool use_falloff = RNA_enum_get(ptr, "falloff_type") != eWarp_Falloff_None;
492
493 layout->use_property_split_set(true);
494
495 layout->prop(ptr, "falloff_type", UI_ITEM_NONE, IFACE_("Type"), ICON_NONE);
496
497 row = &layout->row(false);
498 row->active_set(use_falloff);
499 row->prop(ptr, "falloff_radius", UI_ITEM_NONE, std::nullopt, ICON_NONE);
500
501 layout->prop(ptr, "use_falloff_uniform", UI_ITEM_NONE, std::nullopt, ICON_NONE);
502
503 if (RNA_enum_get(ptr, "falloff_type") == eWarp_Falloff_Curve) {
504 uiTemplateCurveMapping(layout, ptr, "falloff_curve", 0, false, false, false, false, false);
505 }
506}
507
508static void panel_register(ARegionType *region_type)
509{
512 region_type, "falloff", "Falloff", nullptr, falloff_panel_draw, panel_type);
513}
514
515static void blend_write(BlendWriter *writer, const ID * /*id_owner*/, const ModifierData *md)
516{
517 const HookModifierData *hmd = (const HookModifierData *)md;
518
520
521 if (hmd->curfalloff) {
523 }
524
525 BLO_write_int32_array(writer, hmd->indexar_num, hmd->indexar);
526}
527
528static void blend_read(BlendDataReader *reader, ModifierData *md)
529{
531
533 if (hmd->curfalloff) {
535 }
536
537 BLO_read_int32_array(reader, hmd->indexar_num, &hmd->indexar);
538}
539
541 /*idname*/ "Hook",
542 /*name*/ N_("Hook"),
543 /*struct_name*/ "HookModifierData",
544 /*struct_size*/ sizeof(HookModifierData),
545 /*srna*/ &RNA_HookModifier,
549 /*icon*/ ICON_HOOK,
550 /*copy_data*/ copy_data,
551
552 /*deform_verts*/ deform_verts,
553 /*deform_matrices*/ nullptr,
554 /*deform_verts_EM*/ deform_verts_EM,
555 /*deform_matrices_EM*/ nullptr,
556 /*modify_mesh*/ nullptr,
557 /*modify_geometry_set*/ nullptr,
558
559 /*init_data*/ init_data,
560 /*required_data_mask*/ required_data_mask,
561 /*free_data*/ free_data,
562 /*is_disabled*/ is_disabled,
563 /*update_depsgraph*/ update_depsgraph,
564 /*depends_on_time*/ nullptr,
565 /*depends_on_normals*/ nullptr,
566 /*foreach_ID_link*/ foreach_ID_link,
567 /*foreach_tex_link*/ nullptr,
568 /*free_runtime_data*/ nullptr,
569 /*panel_register*/ panel_register,
570 /*blend_write*/ blend_write,
571 /*blend_read*/ blend_read,
572 /*foreach_cache*/ nullptr,
573 /*foreach_working_space_color*/ nullptr,
574};
Blender kernel action and pose functionality.
bPoseChannel * BKE_pose_channel_find_name(const bPose *pose, const char *name)
float BKE_curvemapping_evaluateF(const CurveMapping *cumap, int cur, float value)
void BKE_curvemapping_blend_read(BlendDataReader *reader, CurveMapping *cumap)
CurveMapping * BKE_curvemapping_copy(const CurveMapping *cumap)
void BKE_curvemapping_init(CurveMapping *cumap)
CurveMapping * BKE_curvemapping_add(int tot, float minx, float miny, float maxx, float maxy)
Definition colortools.cc:89
void BKE_curvemapping_free(CurveMapping *cumap)
void BKE_curvemapping_blend_write(BlendWriter *writer, const CurveMapping *cumap)
int CustomData_get_offset(const CustomData *data, eCustomDataType type)
const void * CustomData_get_layer(const CustomData *data, eCustomDataType type)
support for deformation groups and hooks.
float BKE_defvert_find_weight(const MDeformVert *dvert, int defgroup)
Definition deform.cc:774
@ IDWALK_CB_NOP
@ ME_WRAPPER_TYPE_BMESH
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_SupportsEditmode
@ eModifierTypeFlag_AcceptsVertexCosOnly
#define BLI_assert(a)
Definition BLI_assert.h:46
#define BLI_BITMAP_NEW(_num, _alloc_string)
Definition BLI_bitmap.h:37
#define BLI_BITMAP_TEST(_bitmap, _index)
Definition BLI_bitmap.h:61
#define BLI_BITMAP_ENABLE(_bitmap, _index)
Definition BLI_bitmap.h:78
unsigned int BLI_bitmap
Definition BLI_bitmap.h:13
MINLINE float square_f(float a)
void mul_m4_m4m4(float R[4][4], const float A[4][4], const float B[4][4])
void unit_m3(float m[3][3])
void copy_m3_m4(float m1[3][3], const float m2[4][4])
#define mul_m4_series(...)
void copy_m4_m4(float m1[4][4], const float m2[4][4])
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])
void mul_v3_m3v3(float r[3], const float M[3][3], const float a[3])
MINLINE float len_squared_v3v3(const float a[3], const float b[3]) ATTR_WARN_UNUSED_RESULT
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)
unsigned int uint
#define MEMCMP_STRUCT_AFTER_IS_ZERO(struct_var, member)
#define MEMCPY_STRUCT_AFTER(struct_dst, struct_src, member)
void BLO_write_int32_array(BlendWriter *writer, int64_t num, const int32_t *data_ptr)
void BLO_read_int32_array(BlendDataReader *reader, int64_t array_size, int32_t **ptr_p)
Definition readfile.cc:5795
#define BLO_write_struct(writer, struct_name, data_ptr)
#define BLO_read_struct(reader, struct_name, ptr_p)
#define IFACE_(msgid)
void DEG_add_depends_on_transform_relation(DepsNodeHandle *node_handle, const char *description)
void DEG_add_bone_relation(DepsNodeHandle *handle, Object *object, const char *bone_name, eDepsObjectComponentType component, const char *description)
void DEG_add_object_relation(DepsNodeHandle *node_handle, Object *object, eDepsObjectComponentType component, const char *description)
@ DEG_OB_COMP_TRANSFORM
@ DEG_OB_COMP_BONE
#define CD_MASK_ORIGINDEX
#define CD_MASK_MDEFORMVERT
@ CD_MDEFORMVERT
#define DNA_struct_default_get(struct_name)
@ eWarp_Falloff_Curve
@ eWarp_Falloff_None
@ MOD_HOOK_UNIFORM_SPACE
@ MOD_HOOK_INVERT_VGROUP
@ eModifierType_Hook
@ eHook_Falloff_Curve
@ eHook_Falloff_Sharp
@ eHook_Falloff_Smooth
@ eHook_Falloff_Sphere
@ eHook_Falloff_Root
@ eHook_Falloff_None
@ eHook_Falloff_InvSquare
@ eHook_Falloff_Const
@ eHook_Falloff_Linear
@ OB_MODE_EDIT
Object is a sort of wrapper for general info.
@ OB_ARMATURE
@ OB_MESH
static bool is_disabled
Read Guarded memory(de)allocation.
#define MEM_SAFE_FREE(v)
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 deform_verts_EM(ModifierData *md, const ModifierEvalContext *ctx, const BMEditMesh *em, Mesh *mesh, blender::MutableSpan< blender::float3 > positions)
static void blend_read(BlendDataReader *, ModifierData *md)
static void panel_draw(const bContext *, Panel *panel)
static void foreach_ID_link(ModifierData *md, Object *ob, IDWalkFunc walk, void *user_data)
static void copy_data(const ModifierData *md, ModifierData *target, const int flag)
static void free_data(ModifierData *md)
Definition MOD_bevel.cc:272
static void blend_write(BlendWriter *writer, const ID *, const ModifierData *md)
Definition MOD_bevel.cc:433
static void init_data(ModifierData *md)
Definition MOD_hook.cc:46
static void deform_verts(ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh, blender::MutableSpan< blender::float3 > positions)
Definition MOD_hook.cc:423
static void falloff_panel_draw(const bContext *, Panel *panel)
Definition MOD_hook.cc:484
static void panel_register(ARegionType *region_type)
Definition MOD_hook.cc:508
static void hook_co_apply(HookData_cb *hd, int j, const MDeformVert *dv)
Definition MOD_hook.cc:229
static BLI_bitmap * hook_index_array_to_bitmap(HookModifierData *hmd, const int verts_num)
Definition MOD_hook.cc:149
static void deform_verts_EM(ModifierData *md, const ModifierEvalContext *ctx, const BMEditMesh *em, Mesh *mesh, blender::MutableSpan< blender::float3 > positions)
Definition MOD_hook.cc:432
static void free_data(ModifierData *md)
Definition MOD_hook.cc:85
ModifierTypeInfo modifierType_Hook
Definition MOD_hook.cc:540
static void blend_read(BlendDataReader *reader, ModifierData *md)
Definition MOD_hook.cc:528
static void panel_draw(const bContext *, Panel *panel)
Definition MOD_hook.cc:448
static void required_data_mask(ModifierData *md, CustomData_MeshMasks *r_cddata_masks)
Definition MOD_hook.cc:69
static void foreach_ID_link(ModifierData *md, Object *ob, IDWalkFunc walk, void *user_data)
Definition MOD_hook.cc:101
static void blend_write(BlendWriter *writer, const ID *, const ModifierData *md)
Definition MOD_hook.cc:515
static void update_depsgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx)
Definition MOD_hook.cc:108
static void copy_data(const ModifierData *md, ModifierData *target, const int flag)
Definition MOD_hook.cc:57
static void deformVerts_do(HookModifierData *hmd, const ModifierEvalContext *, Object *ob, Mesh *mesh, const BMEditMesh *em, blender::MutableSpan< blender::float3 > positions)
Definition MOD_hook.cc:266
static float hook_falloff(const HookData_cb *hd, const float len_sq)
Definition MOD_hook.cc:163
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)
Definition MOD_util.cc:156
void uiTemplateCurveMapping(uiLayout *layout, PointerRNA *ptr, blender::StringRefNull propname, int type, bool levels, bool brush, bool neg_slope, bool tone, bool presets)
@ UI_ITEM_R_SLIDER
#define UI_ITEM_NONE
#define BM_ELEM_CD_GET_VOID_P(ele, offset)
#define BM_ITER_MESH_INDEX(ele, iter, bm, itype, indexvar)
@ BM_VERTS_OF_MESH
ATTR_WARN_UNUSED_RESULT const BMVert * v
constexpr int64_t size() const
Definition BLI_span.hh:493
uint col
static void update_depsgraph(tGraphSliderOp *gso)
void * MEM_dupallocN(const void *vmemh)
Definition mallocn.cc:143
void MEM_freeN(void *vmemh)
Definition mallocn.cc:113
#define sqrtf
PointerRNA RNA_pointer_get(PointerRNA *ptr, const char *name)
bool RNA_pointer_is_null(const PointerRNA *ptr)
int RNA_enum_get(PointerRNA *ptr, const char *name)
int totvert
CustomData vdata
char falloff_type
Definition MOD_hook.cc:133
uint use_uniform
Definition MOD_hook.cc:139
blender::MutableSpan< blender::float3 > positions
Definition MOD_hook.cc:123
float mat_uniform[3][3]
Definition MOD_hook.cc:143
CurveMapping * curfalloff
Definition MOD_hook.cc:131
float cent[3]
Definition MOD_hook.cc:141
bool invert_vgroup
Definition MOD_hook.cc:146
float fac_orig
Definition MOD_hook.cc:136
float falloff_sq
Definition MOD_hook.cc:135
float mat[4][4]
Definition MOD_hook.cc:144
uint use_falloff
Definition MOD_hook.cc:138
float falloff
Definition MOD_hook.cc:134
int defgrp_index
Definition MOD_hook.cc:129
struct CurveMapping * curfalloff
struct Object * object
Definition DNA_ID.h:414
MeshRuntimeHandle * runtime
CustomData vert_data
int verts_num
struct bPose * pose
ObjectRuntimeHandle * runtime
struct uiLayout * layout
float pose_mat[4][4]
uiLayout & column(bool align)
void active_set(bool active)
uiLayout & row(bool align)
PointerRNA op(wmOperatorType *ot, std::optional< blender::StringRef > name, int icon, blender::wm::OpCallContext context, eUI_Item_Flag flag)
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)
i
Definition text_draw.cc:230
#define N_(msgid)
PointerRNA * ptr
Definition wm_files.cc:4238
uint8_t flag
Definition wm_window.cc:145