36#include "RNA_prototypes.hh"
50static float mix_weight(
float weight,
float weight2,
char mix_mode)
59 return (weight + weight2);
61 return (weight - weight2);
63 return (weight * weight2);
72 return (weight / weight2);
74 return (weight < weight2 ? weight2 - weight : weight - weight2);
76 return (weight + weight2) / 2.0;
86 return (weight + weight2);
89 return (weight - weight2);
92 return (weight * weight2);
102 return (weight / weight2);
105 return (weight < weight2 ? weight2 - weight : weight - weight2);
108 return (weight + weight2) * 0.5f;
111 return (weight < weight2 ? weight : weight2);
114 return (weight > weight2 ? weight : weight2);
167 walk(user_data, ob, md, &
ptr, prop);
173 bool need_transform_relation =
false;
181 need_transform_relation =
true;
184 need_transform_relation =
true;
188 if (need_transform_relation) {
226 const bool do_prev = (wmd->
modifier.
mode & eModifierMode_DoWeightPreview) != 0;
241 if (defgrp_index == -1) {
245 int defgrp_index_other = -1;
248 if (defgrp_index_other == -1) {
253 const bool has_mdef = !mesh->deform_verts().is_empty();
262 MDeformVert *dvert = mesh->deform_verts_for_write().data();
276 for (
i = 0;
i < verts_num;
i++) {
279 tdw1[index_num] = dw;
280 tdw2[index_num] = (defgrp_index_other >= 0) ?
283 tidx[index_num++] =
i;
289 for (
i = 0;
i < verts_num;
i++) {
295 tdw2[index_num] = dw;
296 tidx[index_num++] =
i;
302 for (
i = 0;
i < verts_num;
i++) {
308 tdw1[index_num] = adw;
309 tdw2[index_num] = bdw;
310 tidx[index_num++] =
i;
316 for (
i = 0;
i < verts_num;
i++) {
322 tdw1[index_num] = adw;
323 tdw2[index_num] = bdw;
324 tidx[index_num++] =
i;
331 for (
i = 0;
i < verts_num;
i++) {
333 tdw2[
i] = (defgrp_index_other >= 0) ?
340 if (index_num == 0) {
347 if (index_num != -1) {
349 memcpy(
indices, tidx,
sizeof(
int) * index_num);
359 index_num = verts_num;
370 for (
i = 0;
i < index_num;
i++) {
372 if (invert_vgroup_a) {
378 if (invert_vgroup_b) {
426 DM_update_weight_mcol(ob, dm, 0, org_w, index_num,
indices);
437 mesh->
runtime->is_original_bmesh =
false;
453 layout,
ptr, &ob_ptr,
"vertex_group_a",
"invert_vertex_group_a", std::nullopt);
491 N_(
"VertexWeightMix"),
492 "WeightVGMixModifierData",
494 &RNA_VertexWeightMixModifier,
498 ICON_MOD_VERTEX_WEIGHT,
CustomData interface, see also DNA_customdata_types.h.
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_SupportsMapping
@ eModifierTypeFlag_SupportsEditmode
@ eModifierTypeFlag_AcceptsMesh
void(*)(void *user_data, Object *ob, ModifierData *md, const PointerRNA *ptr, PropertyRNA *texture_prop) TexWalkFunc
bool BKE_texture_dependsOnTime(const struct Tex *texture)
BLI_INLINE bool BLI_listbase_is_empty(const ListBase *lb)
#define MEMCMP_STRUCT_AFTER_IS_ZERO(struct_var, member)
#define MEMCPY_STRUCT_AFTER(struct_dst, struct_src, member)
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)
Scene * DEG_get_evaluated_scene(const Depsgraph *graph)
#define CD_MASK_MDEFORMVERT
#define DNA_struct_default_get(struct_name)
@ eModifierType_WeightVGMix
@ MOD_WVG_MIX_INVERT_VGROUP_MASK
@ MOD_WVG_MIX_INVERT_VGROUP_B
@ MOD_WVG_MIX_WEIGHTS_NORMALIZE
@ MOD_WVG_MIX_INVERT_VGROUP_A
Object is a sort of wrapper for general info.
Read Guarded memory(de)allocation.
static void init_data(ModifierData *md)
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)
static Mesh * modify_mesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh)
static bool depends_on_time(Scene *, ModifierData *)
static void foreach_tex_link(ModifierData *md, Object *ob, TexWalkFunc 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_depsgraph_update_object_bone_relation(DepsNodeHandle *node, Object *object, const char *bonename, const char *description)
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)
#define MOD_WVG_ZEROFLOOR
static void influence_panel_draw(const bContext *C, Panel *panel)
static void influence_panel_draw(const bContext *C, Panel *panel)
static void init_data(ModifierData *md)
static void panel_register(ARegionType *region_type)
static Mesh * modify_mesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh)
static float mix_weight(float weight, float weight2, char mix_mode)
static bool depends_on_time(Scene *, ModifierData *md)
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)
ModifierTypeInfo modifierType_WeightVGMix
static void update_depsgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx)
static void update_depsgraph(tGraphSliderOp *gso)
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_discrete(ID *id, StructRNA *type, void *data)
MeshRuntimeHandle * runtime
ListBase vertex_group_names
char mask_tex_map_bone[64]
struct Tex * mask_texture
char mask_tex_uvlayer_name[68]
char mask_defgrp_name[64]
struct Object * mask_tex_map_obj
void separator(float factor=1.0f, LayoutSeparatorType type=LayoutSeparatorType::Auto)
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)