91 psys->vgroup[a] = map[psys->vgroup[a]];
124 return ((
Mesh *)
id)->deform_verts_for_write().data();
147 bool changed =
false;
152 if (
BMEditMesh *em = mesh->runtime->edit_mesh.get()) {
155 if (cd_dvert_offset != -1) {
171 if (mesh->deform_verts().data()) {
176 dv = mesh->deform_verts_for_write().data();
178 for (i = 0; i < mesh->verts_num; i++, dv++) {
179 if (dv->
dw && (!use_selection || (select_vert && select_vert[i]))) {
195 for (i = 0, bp = lt->
def; i < tot; i++, bp++) {
196 if (!use_selection || (bp->
f1 &
SELECT)) {
214 bool changed =
false;
236 int *map =
static_cast<int *
>(
MEM_mallocN(
sizeof(
int) * defbase_tot,
"vgroup del"));
238 map[idx] = map[0] = 0;
239 for (i = 1; i < idx; i++) {
242 for (i = idx + 1; i < defbase_tot; i++) {
261 if (active_index > def_nr) {
301 for (i = 0, dv = dvert_array; i < dvert_tot; i++, dv++) {
336 BMEditMesh *em = mesh->runtime->edit_mesh.get();
363 for (a = 0, bp = lt->
def; a < tot; a++, bp++, dvert++) {
453 int *vgroup_index_map =
static_cast<int *
>(
454 MEM_malloc_arrayN(*r_map_len,
sizeof(*vgroup_index_map),
"defgroup index map create"));
455 bool is_vgroup_remap_needed =
false;
459 dg_src = dg_src->
next, i++)
462 is_vgroup_remap_needed = is_vgroup_remap_needed || (vgroup_index_map[i] != i);
465 if (!is_vgroup_remap_needed) {
467 vgroup_index_map =
nullptr;
471 return vgroup_index_map;
479 if (map ==
nullptr || map_len == 0) {
484 for (
int i = 0; i < dvert_len; i++, dv++) {
486 for (
int j = 0; j < totweight; j++) {
488 if (
uint(def_nr) <
uint(map_len) && map[def_nr] != -1) {
493 dv->
dw[j] = dv->
dw[totweight];
512 switch (
GS(id->name)) {
515 *dvert_arr = mesh->deform_verts_for_write().data();
516 *dvert_tot = mesh->verts_num;
521 *dvert_arr = lt->
dvert;
534 *dvert_arr =
nullptr;
545 bool is_locked =
false;
548 bool *lock_flags =
static_cast<bool *
>(
MEM_mallocN(defbase_tot *
sizeof(
bool),
"defflags"));
551 for (i = 0, defgroup =
static_cast<bDeformGroup *
>(defbase->
first); i < defbase_tot && defgroup;
552 defgroup = defgroup->
next, i++)
555 is_locked |= lock_flags[i];
569 bool *defgroup_validmap;
590 md = !md->
next && step1 ? (step1 = 0),
619 defgroup_validmap =
static_cast<bool *
>(
620 MEM_mallocN(
sizeof(*defgroup_validmap) * defbase_tot,
"wpaint valid map"));
631 return defgroup_validmap;
636 bool *dg_selection =
static_cast<bool *
>(
MEM_mallocN(defbase_tot *
sizeof(
bool), __func__));
640 (*r_dg_flags_sel_tot) = 0;
647 i < defbase_tot && defgroup;
648 defgroup = defgroup->
next, i++)
652 dg_selection[i] =
true;
653 (*r_dg_flags_sel_tot) += 1;
656 dg_selection[i] =
false;
661 memset(dg_selection,
false,
sizeof(*dg_selection) * defbase_tot);
668 const bool *validmap,
671 return validmap && validmap[index] && !(lock_flags && lock_flags[index]);
675 const bool *lock_flags,
676 const bool *selected,
679 if (lock_flags ==
nullptr) {
683 if (selected ==
nullptr || sel_tot <= 1) {
687 for (
int i = 0; i < defbase_tot; i++) {
688 if (selected[i] && lock_flags[i]) {
709 BLI_findlink(&mesh->vertex_group_names, mesh->vertex_group_active_index - 1));
717 int defbase_tot,
const bool *locked,
const bool *deform,
bool *r_locked,
bool *r_unlocked)
720 if (r_unlocked != deform) {
721 memcpy(r_unlocked, deform,
sizeof(
bool) * defbase_tot);
724 memset(r_locked, 0,
sizeof(
bool) * defbase_tot);
729 for (
int i = 0; i < defbase_tot; i++) {
730 bool is_locked = locked[i];
731 bool is_deform = deform[i];
733 r_locked[i] = is_deform && is_locked;
734 r_unlocked[i] = is_deform && !is_locked;
740 const bool *dg_selection,
742 int *r_dg_flags_sel_tot)
750 for (i = 0, defgroup =
static_cast<bDeformGroup *
>(defbase->
first); i < defbase_tot && defgroup;
751 defgroup = defgroup->
next, i++)
753 if (dg_selection[i]) {
757 i_mirr =
STREQ(name_flip, defgroup->
name) ? i :
760 if ((i_mirr >= 0 && i_mirr < defbase_tot) && (dg_flags_sel[i_mirr] ==
false)) {
761 dg_flags_sel[i_mirr] =
true;
762 (*r_dg_flags_sel_tot) += 1;
773 bool *defgroup_validmap =
nullptr;
777 switch (subset_type) {
780 defgroup_validmap =
static_cast<bool *
>(
781 MEM_mallocN(*r_defgroup_tot *
sizeof(*defgroup_validmap), __func__));
782 memset(defgroup_validmap,
false, *r_defgroup_tot *
sizeof(*defgroup_validmap));
783 if ((def_nr_active >= 0) && (def_nr_active < *r_defgroup_tot)) {
785 defgroup_validmap[def_nr_active] =
true;
800 for (i = 0; i < *r_defgroup_tot; i++) {
801 if (defgroup_validmap[i] ==
true) {
802 *r_subset_count += 1;
811 for (i = 0; i < *r_defgroup_tot; i++) {
812 defgroup_validmap[i] = !defgroup_validmap[i];
813 if (defgroup_validmap[i] ==
true) {
814 *r_subset_count += 1;
821 defgroup_validmap =
static_cast<bool *
>(
822 MEM_mallocN(*r_defgroup_tot *
sizeof(*defgroup_validmap), __func__));
823 memset(defgroup_validmap,
true, *r_defgroup_tot *
sizeof(*defgroup_validmap));
824 *r_subset_count = *r_defgroup_tot;
829 return defgroup_validmap;
833 const int defgroup_tot,
834 int *r_defgroup_subset_map)
837 for (i = 0; i < defgroup_tot; i++) {
838 if (defgroup_validmap[i]) {
839 r_defgroup_subset_map[j++] = i;
Blender kernel action and pose functionality.
bPoseChannel * BKE_pose_channel_find_name(const bPose *pose, const char *name)
int CustomData_get_offset(const CustomData *data, eCustomDataType type)
const void * CustomData_get_layer_named(const CustomData *data, eCustomDataType type, blender::StringRef name)
bool CustomData_free_layer_active(CustomData *data, eCustomDataType type, int totelem)
Utility functions for vertex groups in grease pencil objects.
ModifierData * BKE_modifiers_get_virtual_modifierlist(const Object *ob, VirtualModifierData *data)
General operations, lookup, etc. for blender objects.
void BKE_object_batch_cache_dirty_tag(Object *ob)
Object * BKE_object_pose_armature_get(Object *ob)
bool BKE_object_is_in_editmode_vgroup(const Object *ob)
#define BLI_assert_unreachable()
void ** BLI_ghash_lookup_p(GHash *gh, const void *key) ATTR_WARN_UNUSED_RESULT
unsigned int BLI_ghash_len(const GHash *gh) ATTR_WARN_UNUSED_RESULT
GHash * BLI_ghash_str_new_ex(const char *info, unsigned int nentries_reserve) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT
void * BLI_ghash_lookup(const GHash *gh, const void *key) ATTR_WARN_UNUSED_RESULT
void BLI_ghash_insert(GHash *gh, void *key, void *val)
void BLI_ghash_free(GHash *gh, GHashKeyFreeFP keyfreefp, GHashValFreeFP valfreefp)
BLI_INLINE bool BLI_listbase_is_empty(const struct ListBase *lb)
#define LISTBASE_FOREACH(type, var, list)
void BLI_freelinkN(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
void * BLI_findlink(const struct ListBase *listbase, int number) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
int BLI_findindex(const struct ListBase *listbase, const void *vlink) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
int BLI_listbase_count(const struct ListBase *listbase) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
size_t BLI_string_flip_side_name(char *name_dst, const char *name_src, bool strip_number, size_t name_dst_maxncpy) ATTR_NONNULL(1
#define POINTER_FROM_INT(i)
Object is a sort of wrapper for general info.
#define OB_TYPE_SUPPORT_VGROUP(_type)
@ WT_VGROUP_BONE_DEFORM_OFF
Read Guarded memory(de)allocation.
#define MEM_reallocN(vmemh, len)
#define BM_ELEM_CD_GET_VOID_P(ele, offset)
#define BM_elem_flag_test(ele, hflag)
#define BM_ITER_MESH(ele, iter, bm, itype)
void *(* MEM_mallocN)(size_t len, const char *str)
void *(* MEM_malloc_arrayN)(size_t len, size_t size, const char *str)
void MEM_freeN(void *vmemh)
void *(* MEM_callocN)(size_t len, const char *str)
void clear_vertex_groups(GreasePencil &grease_pencil)
void validate_drawing_vertex_groups(GreasePencil &grease_pencil)
struct ClothSimSettings * sim_parms
struct ClothCollSettings * coll_parms
int vertex_group_active_index
ListBase vertex_group_names
struct MDeformVert * dvert
struct EditLatt * editlatt
struct ModifierData * next