44#include "RNA_prototypes.hh"
67#define OUT_OF_MEMORY() (void)printf("WeightVGProximity: Out of memory.\n")
107 copy_v3_v3(tmp_co, data->positions[data->indices ? data->indices[iter] : iter]);
110 for (i = 0; i <
ARRAY_SIZE(data->dist); i++) {
130 data->treeData[i]->nearest_callback,
132 data->dist[i][iter] =
sqrtf(nearest.dist_sq);
134 if (nearest.index != -1) {
164 if (treeData_v.
tree ==
nullptr) {
172 if (treeData_e.
tree ==
nullptr) {
180 if (treeData_f.
tree ==
nullptr) {
186 data.positions = positions;
188 data.loc2trgt = loc2trgt;
189 data.treeData[0] = &treeData_v;
190 data.treeData[1] = &treeData_e;
191 data.treeData[2] = &treeData_f;
192 data.dist[0] = dist_v;
193 data.dist[1] = dist_e;
194 data.dist[2] = dist_f;
198 settings.use_threading = (verts_num > 10000);
199 settings.userdata_chunk = &data_chunk;
200 settings.userdata_chunk_size =
sizeof(data_chunk);
231 mul_v3_m4v3(v_wco, ob->object_to_world().ptr(), positions[indices ? indices[i] : i]);
233 dist[i] =
len_v3v3(v_wco, obr->object_to_world().location());
243 return len_v3v3(ob->object_to_world().location(), obr->object_to_world().location());
255 const bool do_invert_mapping,
258 const float range_inv = 1.0f / (max_d - min_d);
260 if (max_d == min_d) {
262 weights[i] = (weights[i] >= max_d) ? 1.0f : 0.0f;
265 else if (max_d > min_d) {
267 if (weights[i] >= max_d) {
270 else if (weights[i] <= min_d) {
274 weights[i] = (weights[i] - min_d) * range_inv;
280 if (weights[i] <= max_d) {
283 else if (weights[i] >= min_d) {
287 weights[i] = (weights[i] - min_d) * range_inv;
374 walk(user_data, ob, md, &
ptr, prop);
380 bool need_transform_relation =
false;
391 need_transform_relation =
true;
400 need_transform_relation =
true;
403 need_transform_relation =
true;
407 if (need_transform_relation) {
433 float *org_w =
nullptr;
434 float *new_w =
nullptr;
435 int *tidx, *indices =
nullptr;
443 const bool do_prev = (wmd->
modifier.
mode & eModifierMode_DoWeightPreview) != 0;
451 const int verts_num = mesh->verts_num;
462 if (obr ==
nullptr) {
468 if (defgrp_index == -1) {
478 MDeformVert *dvert = mesh->deform_verts_for_write().data();
486 tw =
static_cast<float *
>(
MEM_malloc_arrayN(verts_num,
sizeof(
float), __func__));
489 for (i = 0; i < verts_num; i++) {
493 tw[index_num] = _dw->
weight;
494 tdw[index_num++] = _dw;
498 if (index_num == 0) {
504 if (index_num != verts_num) {
505 indices =
static_cast<int *
>(
MEM_malloc_arrayN(index_num,
sizeof(
int), __func__));
506 memcpy(indices, tidx,
sizeof(
int) * index_num);
507 org_w =
static_cast<float *
>(
MEM_malloc_arrayN(index_num,
sizeof(
float), __func__));
508 memcpy(org_w, tw,
sizeof(
float) * index_num);
519 new_w =
static_cast<float *
>(
MEM_malloc_arrayN(index_num,
sizeof(
float), __func__));
527 for (i = 0; i < index_num; i++) {
536 if (use_trgt_verts || use_trgt_edges || use_trgt_faces) {
540 if (target_mesh !=
nullptr) {
548 index_num,
sizeof(
float), __func__)) :
551 index_num,
sizeof(
float), __func__)) :
554 index_num,
sizeof(
float), __func__)) :
559 index_num, positions, indices, dists_v, dists_e, dists_f, target_mesh, &loc2trgt);
560 for (i = 0; i < index_num; i++) {
561 new_w[i] = dists_v ? dists_v[i] :
FLT_MAX;
563 new_w[i] =
min_ff(dists_e[i], new_w[i]);
566 new_w[i] =
min_ff(dists_f[i], new_w[i]);
616 dvert, defgrp_index, dw, index_num, indices, org_w,
false, 0.0f,
false, 0.0f, do_normalize);
621 DM_update_weight_mcol(ob, dm, 0, org_w, index_num, indices);
635 mesh->runtime->is_original_bmesh =
false;
652 layout,
ptr,
"vertex_group", &ob_ptr,
"vertex_groups",
nullptr, ICON_GROUP_VERTEX);
733 "VertexWeightProximity",
734 N_(
"VertexWeightProximity"),
735 "WeightVGProximityModifierData",
737 &RNA_VertexWeightProximityModifier,
741 ICON_MOD_VERTEX_WEIGHT,
void free_bvhtree_from_mesh(BVHTreeFromMesh *data)
BVHTree * BKE_bvhtree_from_mesh_get(BVHTreeFromMesh *data, const Mesh *mesh, BVHCacheType bvh_cache_type, int tree_type)
@ BVHTREE_FROM_CORNER_TRIS
CustomData interface, see also DNA_customdata_types.h.
bool CustomData_has_layer(const CustomData *data, eCustomDataType type)
void BKE_mesh_wrapper_ensure_mdata(Mesh *mesh)
Mesh * BKE_modifier_get_evaluated_mesh_from_evaluated_object(Object *ob_eval)
void BKE_modifier_copydata_generic(const ModifierData *md, ModifierData *md_dst, int flag)
void(*)(void *user_data, Object *ob, ModifierData *md, const PointerRNA *ptr, PropertyRNA *texture_prop) TexWalkFunc
@ eModifierTypeFlag_SupportsMapping
@ eModifierTypeFlag_SupportsEditmode
@ eModifierTypeFlag_AcceptsMesh
void(*)(void *user_data, Object *ob, ID **idpoin, int cb_flag) IDWalkFunc
bool BKE_texture_dependsOnTime(const struct Tex *texture)
#define BLI_ghashutil_strhash(key)
int BLI_bvhtree_find_nearest(const BVHTree *tree, const float co[3], BVHTreeNearest *nearest, BVHTree_NearestPointCallback callback, void *userdata)
BLI_INLINE bool BLI_listbase_is_empty(const struct ListBase *lb)
MINLINE float min_ff(float a, float b)
void BLI_space_transform_apply(const struct SpaceTransform *data, float co[3])
void mul_v3_m4v3(float r[3], const float mat[4][4], const float vec[3])
#define BLI_SPACE_TRANSFORM_SETUP(data, local, target)
MINLINE float len_v3v3(const float a[3], const float b[3]) ATTR_WARN_UNUSED_RESULT
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 BLI_rng_free(struct RNG *rng) ATTR_NONNULL(1)
struct RNG * BLI_rng_new_srandom(unsigned int seed)
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)
Platform independent time functions.
Utility defines for timing/benchmarks.
#define TIMEIT_START(var)
#define MEMCMP_STRUCT_AFTER_IS_ZERO(struct_var, member)
#define MEMCPY_STRUCT_AFTER(struct_dst, struct_src, member)
#define BLO_write_struct(writer, struct_name, data_ptr)
#define BLO_read_struct(reader, struct_name, ptr_p)
void DEG_add_generic_id_relation(DepsNodeHandle *node_handle, ID *id, const char *description)
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)
Scene * DEG_get_evaluated_scene(const Depsgraph *graph)
#define CD_MASK_MDEFORMVERT
#define DNA_struct_default_get(struct_name)
@ MOD_WVG_PROXIMITY_OBJECT
@ MOD_WVG_PROXIMITY_GEOMETRY
struct WeightVGProximityModifierData WeightVGProximityModifierData
@ MOD_WVG_PROXIMITY_WEIGHTS_NORMALIZE
@ MOD_WVG_PROXIMITY_INVERT_VGROUP_MASK
@ MOD_WVG_PROXIMITY_GEOM_VERTS
@ MOD_WVG_PROXIMITY_INVERT_FALLOFF
@ MOD_WVG_PROXIMITY_GEOM_EDGES
@ MOD_WVG_PROXIMITY_GEOM_FACES
@ eModifierType_WeightVGProximity
Object is a sort of wrapper for general info.
Read Guarded memory(de)allocation.
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 MOD_depsgraph_update_object_bone_relation(DepsNodeHandle *node, Object *object, const char *bonename, const char *description)
void weightvg_do_map(int num, float *new_w, short falloff_type, const bool do_invert, CurveMapping *cmap, RNG *rng)
void weightvg_update_vg(MDeformVert *dvert, int defgrp_idx, MDeformWeight **dws, int num, const int *indices, const float *weights, const bool do_add, const float add_thresh, const bool do_rem, const float rem_thresh, const bool do_normalize)
void weightvg_ui_common(const bContext *C, PointerRNA *ob_ptr, PointerRNA *ptr, uiLayout *layout)
void weightvg_do_mask(const ModifierEvalContext *ctx, const int num, const int *indices, float *org_w, const float *new_w, Object *ob, Mesh *mesh, const float fact, const char defgrp_name[MAX_VGROUP_NAME], Scene *, Tex *texture, const int tex_use_channel, const int tex_mapping, Object *tex_map_object, const char *text_map_bone, const char *tex_uvlayer_name, const bool invert_vgroup_mask)
static void influence_panel_draw(const bContext *C, Panel *panel)
static void init_data(ModifierData *md)
static void falloff_panel_draw(const bContext *, Panel *panel)
static void vert2geom_task_cb_ex(void *__restrict userdata, const int iter, const TaskParallelTLS *__restrict tls)
static void panel_register(ARegionType *region_type)
ModifierTypeInfo modifierType_WeightVGProximity
static Mesh * modify_mesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh)
static void free_data(ModifierData *md)
static void blend_read(BlendDataReader *reader, ModifierData *md)
static bool depends_on_time(Scene *, ModifierData *md)
static float get_ob2ob_distance(const Object *ob, const Object *obr)
static void panel_draw(const bContext *, Panel *panel)
static void foreach_tex_link(ModifierData *md, Object *ob, TexWalkFunc walk, void *user_data)
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 blend_write(BlendWriter *writer, const ID *, const ModifierData *md)
static void get_vert2geom_distance(int verts_num, const blender::Span< blender::float3 > positions, const int *indices, float *dist_v, float *dist_e, float *dist_f, Mesh *target, const SpaceTransform *loc2trgt)
static void get_vert2ob_distance(int verts_num, const blender::Span< blender::float3 > positions, const int *indices, float *dist, Object *ob, Object *obr)
static void update_depsgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx)
static void copy_data(const ModifierData *md, ModifierData *target, const int flag)
static void do_map(Object *ob, float *weights, const int nidx, const float min_d, const float max_d, short mode, const bool do_invert_mapping, CurveMapping *cmap)
void uiTemplateCurveMapping(uiLayout *layout, PointerRNA *ptr, const char *propname, int type, bool levels, bool brush, bool neg_slope, bool tone)
uiLayout * uiLayoutRow(uiLayout *layout, bool align)
void uiLayoutSetPropSep(uiLayout *layout, bool is_sep)
void uiItemS(uiLayout *layout)
void uiItemPointerR(uiLayout *layout, PointerRNA *ptr, const char *propname, PointerRNA *searchptr, const char *searchpropname, const char *name, int icon)
uiLayout * uiLayoutColumn(uiLayout *layout, bool align)
void uiItemR(uiLayout *layout, PointerRNA *ptr, const char *propname, eUI_Item_Flag flag, const char *name, int icon)
void *(* MEM_malloc_arrayN)(size_t len, size_t size, const char *str)
void MEM_freeN(void *vmemh)
PropertyRNA * RNA_struct_find_property(PointerRNA *ptr, const char *identifier)
PointerRNA RNA_pointer_create(ID *id, StructRNA *type, void *data)
int RNA_enum_get(PointerRNA *ptr, const char *name)
BVHTreeFromMesh * treeData[3]
const SpaceTransform * loc2trgt
blender::Span< blender::float3 > positions
char mask_defgrp_name[64]
char mask_tex_uvlayer_name[68]
struct Object * mask_tex_map_obj
struct Object * proximity_ob_target
struct Tex * mask_texture
char mask_tex_map_bone[64]
struct CurveMapping * cmap_curve