34 #include "RNA_prototypes.h"
49 static float mix_weight(
float weight,
float weight2,
char mix_mode)
58 return (weight + weight2);
60 return (weight - weight2);
62 return (weight * weight2);
71 return (weight / weight2);
73 return (weight < weight2 ? weight2 - weight : weight - weight2);
75 return (weight + weight2) / 2.0;
85 return (weight + weight2);
88 return (weight - weight2);
91 return (weight * weight2);
101 return (weight / weight2);
104 return (weight < weight2 ? weight2 - weight : weight - weight2);
107 return (weight + weight2) * 0.5f;
110 return (weight < weight2 ? weight : weight2);
113 return (weight > weight2 ? weight : weight2);
168 walk(userData, ob, md,
"mask_texture");
174 bool need_transform_relation =
false;
182 need_transform_relation =
true;
185 need_transform_relation =
true;
189 if (need_transform_relation) {
196 bool UNUSED(useRenderParams))
230 const bool do_prev = (wmd->
modifier.
mode & eModifierMode_DoWeightPreview) != 0;
245 if (defgrp_index == -1) {
249 int defgrp_index_other = -1;
252 if (defgrp_index_other == -1) {
286 for (i = 0; i < verts_num; i++) {
289 tdw1[index_num] = dw;
290 tdw2[index_num] = (defgrp_index_other >= 0) ?
293 tidx[index_num++] = i;
299 for (i = 0; i < verts_num; i++) {
305 tdw2[index_num] = dw;
306 tidx[index_num++] = i;
312 for (i = 0; i < verts_num; i++) {
318 tdw1[index_num] = adw;
319 tdw2[index_num] = bdw;
320 tidx[index_num++] = i;
326 for (i = 0; i < verts_num; i++) {
332 tdw1[index_num] = adw;
333 tdw2[index_num] = bdw;
334 tidx[index_num++] = i;
341 for (i = 0; i < verts_num; i++) {
343 tdw2[i] = (defgrp_index_other >= 0) ?
350 if (index_num == 0) {
357 if (index_num != -1) {
359 memcpy(
indices, tidx,
sizeof(
int) * index_num);
369 index_num = verts_num;
376 org_w =
MEM_malloc_arrayN(index_num,
sizeof(
float),
"WeightVGMix Modifier, org_w");
377 new_w =
MEM_malloc_arrayN(index_num,
sizeof(
float),
"WeightVGMix Modifier, new_w");
380 for (i = 0; i < index_num; i++) {
382 if (invert_vgroup_a) {
388 if (invert_vgroup_b) {
436 DM_update_weight_mcol(ob, dm, 0, org_w, index_num,
indices);
499 N_(
"VertexWeightMix"),
500 "WeightVGMixModifierData",
502 &RNA_VertexWeightMixModifier,
506 ICON_MOD_VERTEX_WEIGHT,
CustomData interface, see also DNA_customdata_types.h.
bool CustomData_has_layer(const struct CustomData *data, int type)
void * CustomData_add_layer(struct CustomData *data, int type, eCDAllocType alloctype, void *layer, int totelem)
void * CustomData_duplicate_referenced_layer(struct CustomData *data, int type, int totelem)
void(* IDWalkFunc)(void *userData, struct Object *ob, struct ID **idpoin, int cb_flag)
@ eModifierTypeFlag_SupportsMapping
@ eModifierTypeFlag_UsesPreview
@ eModifierTypeFlag_SupportsEditmode
@ eModifierTypeFlag_AcceptsMesh
void(* TexWalkFunc)(void *userData, struct Object *ob, struct ModifierData *md, const char *propname)
void BKE_modifier_copydata_generic(const struct ModifierData *md, struct ModifierData *md_dst, int flag)
@ eModifierTypeType_NonGeometrical
bool BKE_texture_dependsOnTime(const struct Tex *texture)
BLI_INLINE bool BLI_listbase_is_empty(const struct ListBase *lb)
#define MEMCMP_STRUCT_AFTER_IS_ZERO(struct_var, member)
#define MEMCPY_STRUCT_AFTER(struct_dst, struct_src, member)
void DEG_add_modifier_to_transform_relation(struct DepsNodeHandle *node_handle, const char *description)
void DEG_add_generic_id_relation(struct DepsNodeHandle *node_handle, struct ID *id, const char *description)
struct Scene * DEG_get_evaluated_scene(const struct Depsgraph *graph)
#define CD_MASK_MDEFORMVERT
#define DNA_struct_default_get(struct_name)
@ MOD_WVG_MIX_INVERT_VGROUP_MASK
@ MOD_WVG_MIX_INVERT_VGROUP_B
@ MOD_WVG_MIX_WEIGHTS_NORMALIZE
@ MOD_WVG_MIX_INVERT_VGROUP_A
@ eModifierType_WeightVGMix
struct WeightVGMixModifierData WeightVGMixModifierData
Object is a sort of wrapper for general info.
Read Guarded memory(de)allocation.
PointerRNA * modifier_panel_get_property_pointers(Panel *panel, PointerRNA *r_ob_ptr)
void modifier_panel_end(uiLayout *layout, PointerRNA *ptr)
PanelType * modifier_panel_register(ARegionType *region_type, ModifierType type, PanelDrawFn draw)
void modifier_vgroup_ui(uiLayout *layout, PointerRNA *ptr, PointerRNA *ob_ptr, const char *vgroup_prop, const char *invert_vgroup_prop, const char *text)
PanelType * modifier_subpanel_register(ARegionType *region_type, const char *name, const char *label, PanelDrawFn draw_header, PanelDrawFn draw, PanelType *parent)
void MOD_depsgraph_update_object_bone_relation(struct 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_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 *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)
void weightvg_ui_common(const bContext *C, PointerRNA *ob_ptr, PointerRNA *ptr, uiLayout *layout)
#define MOD_WVG_ZEROFLOOR
static void influence_panel_draw(const bContext *C, Panel *panel)
static Mesh * modifyMesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh)
static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx)
static bool dependsOnTime(struct Scene *UNUSED(scene), ModifierData *md)
static bool isDisabled(const struct Scene *UNUSED(scene), ModifierData *md, bool UNUSED(useRenderParams))
static float mix_weight(float weight, float weight2, char mix_mode)
static void foreachIDLink(ModifierData *md, Object *ob, IDWalkFunc walk, void *userData)
ModifierTypeInfo modifierType_WeightVGMix
static void panel_draw(const bContext *UNUSED(C), Panel *panel)
static void initData(ModifierData *md)
static void panelRegister(ARegionType *region_type)
static void foreachTexLink(ModifierData *md, Object *ob, TexWalkFunc walk, void *userData)
static void requiredDataMask(Object *UNUSED(ob), ModifierData *md, CustomData_MeshMasks *r_cddata_masks)
void uiLayoutSetPropSep(uiLayout *layout, bool is_sep)
void uiItemS(uiLayout *layout)
void uiItemR(uiLayout *layout, struct PointerRNA *ptr, const char *propname, int flag, const char *name, int icon)
ccl_gpu_kernel_postfix int ccl_global int * indices
void *(* MEM_malloc_arrayN)(size_t len, size_t size, const char *str)
void(* MEM_freeN)(void *vmemh)
struct MDeformVert * dvert
ListBase vertex_group_names
struct Depsgraph * depsgraph
struct DepsNodeHandle * node
char mask_tex_uvlayer_name[64]
char mask_tex_map_bone[64]
struct Tex * mask_texture
char mask_defgrp_name[64]
struct Object * mask_tex_map_obj