153 "lattice deformVert");
175 bool changed =
false;
184 if (cd_dvert_offset != -1) {
207 for (i = 0; i < me->
totvert; i++,
mv++, dv++) {
208 if (dv->
dw && (!use_selection || (
mv->flag &
SELECT))) {
224 for (i = 0, bp = lt->
def; i < tot; i++, bp++) {
225 if (!use_selection || (bp->
f1 &
SELECT)) {
250 bool changed =
false;
269 int *map =
MEM_mallocN(
sizeof(
int) * defbase_tot,
"vgroup del");
271 map[idx] = map[0] = 0;
272 for (i = 1; i < idx; i++) {
275 for (i = idx + 1; i < defbase_tot; i++) {
291 if (ob->
actdef > def_nr) {
310 else if (ob->
actdef < 1) {
328 for (i = 0, dv = dvert_array; i < dvert_tot; i++, dv++) {
389 for (
a = 0, bp = lt->
def;
a < tot;
a++, bp++, dvert++) {
390 for (i = 0; i < dvert->totweight; i++) {
391 if (dvert->dw[i].def_nr > def_nr) {
392 dvert->dw[i].def_nr--;
490 *r_map_len,
sizeof(*vgroup_index_map),
"defgroup index map create");
491 bool is_vgroup_remap_needed =
false;
494 for (dg_src = ob_src->
defbase.
first, i = 0; dg_src; dg_src = dg_src->
next, i++) {
496 is_vgroup_remap_needed = is_vgroup_remap_needed || (vgroup_index_map[i] != i);
499 if (!is_vgroup_remap_needed) {
501 vgroup_index_map =
NULL;
505 return vgroup_index_map;
513 if (map ==
NULL || map_len == 0) {
518 for (
int i = 0; i < dvert_len; i++, dv++) {
520 for (
int j = 0; j < totweight; j++) {
522 if ((
uint)def_nr < (
uint)map_len && map[def_nr] != -1) {
527 dv->
dw[j] = dv->
dw[totweight];
554 *dvert_arr = me->
dvert;
560 *dvert_arr = lt->
dvert;
583 bool is_locked =
false;
586 bool *lock_flags =
MEM_mallocN(defbase_tot *
sizeof(
bool),
"defflags");
589 for (i = 0, defgroup = ob->
defbase.
first; i < defbase_tot && defgroup;
590 defgroup = defgroup->
next, i++) {
592 is_locked |= lock_flags[i];
606 bool *defgroup_validmap;
655 defgroup_validmap =
MEM_mallocN(
sizeof(*defgroup_validmap) * defbase_tot,
"wpaint valid map");
666 return defgroup_validmap;
673 bool *dg_selection =
MEM_mallocN(defbase_tot *
sizeof(
bool), __func__);
677 (*r_dg_flags_sel_tot) = 0;
681 for (i = 0, defgroup = ob->
defbase.
first; i < defbase_tot && defgroup;
682 defgroup = defgroup->
next, i++) {
685 dg_selection[i] =
true;
686 (*r_dg_flags_sel_tot) += 1;
689 dg_selection[i] =
false;
694 memset(dg_selection,
false,
sizeof(*dg_selection) * defbase_tot);
706 const bool *validmap,
709 return validmap && validmap[index] && !(lock_flags && lock_flags[index]);
718 const bool *lock_flags,
719 const bool *selected,
722 if (lock_flags ==
NULL) {
726 if (selected ==
NULL || sel_tot <= 1) {
730 for (
int i = 0; i < defbase_tot; i++) {
731 if (selected[i] && lock_flags[i]) {
745 int defbase_tot,
const bool *locked,
const bool *deform,
bool *r_locked,
bool *r_unlocked)
748 if (r_unlocked != deform) {
749 memcpy(r_unlocked, deform,
sizeof(
bool) * defbase_tot);
752 memset(r_locked, 0,
sizeof(
bool) * defbase_tot);
757 for (
int i = 0; i < defbase_tot; i++) {
758 bool is_locked = locked[i];
759 bool is_deform = deform[i];
761 r_locked[i] = is_deform && is_locked;
762 r_unlocked[i] = is_deform && !is_locked;
773 const bool *dg_selection,
775 int *r_dg_flags_sel_tot)
781 for (i = 0, defgroup = ob->
defbase.
first; i < defbase_tot && defgroup;
782 defgroup = defgroup->
next, i++) {
783 if (dg_selection[i]) {
787 i_mirr =
STREQ(name_flip, defgroup->
name) ? i :
790 if ((i_mirr >= 0 && i_mirr < defbase_tot) && (dg_flags_sel[i_mirr] ==
false)) {
791 dg_flags_sel[i_mirr] =
true;
792 (*r_dg_flags_sel_tot) += 1;
806 bool *defgroup_validmap =
NULL;
809 switch (subset_type) {
811 const int def_nr_active = ob->
actdef - 1;
812 defgroup_validmap =
MEM_mallocN(*r_defgroup_tot *
sizeof(*defgroup_validmap), __func__);
813 memset(defgroup_validmap,
false, *r_defgroup_tot *
sizeof(*defgroup_validmap));
814 if ((def_nr_active >= 0) && (def_nr_active < *r_defgroup_tot)) {
816 defgroup_validmap[def_nr_active] =
true;
831 for (i = 0; i < *r_defgroup_tot; i++) {
832 if (defgroup_validmap[i] ==
true) {
833 *r_subset_count += 1;
842 for (i = 0; i < *r_defgroup_tot; i++) {
843 defgroup_validmap[i] = !defgroup_validmap[i];
844 if (defgroup_validmap[i] ==
true) {
845 *r_subset_count += 1;
852 defgroup_validmap =
MEM_mallocN(*r_defgroup_tot *
sizeof(*defgroup_validmap), __func__);
853 memset(defgroup_validmap,
true, *r_defgroup_tot *
sizeof(*defgroup_validmap));
854 *r_subset_count = *r_defgroup_tot;
859 return defgroup_validmap;
866 const int defgroup_tot,
867 int *r_defgroup_subset_map)
870 for (i = 0; i < defgroup_tot; i++) {
871 if (defgroup_validmap[i]) {
872 r_defgroup_subset_map[j++] = i;
Blender kernel action and pose functionality.
struct bPoseChannel * BKE_pose_channel_find_name(const struct bPose *pose, const char *name)
bool CustomData_free_layer_active(struct CustomData *data, int type, int totelem)
void * CustomData_add_layer(struct CustomData *data, int type, eCDAllocType alloctype, void *layer, int totelem)
int CustomData_get_offset(const struct CustomData *data, int type)
void BKE_gpencil_vgroup_remove(struct Object *ob, struct bDeformGroup *defgroup)
struct ModifierData * BKE_modifiers_get_virtual_modifierlist(const struct Object *ob, struct VirtualModifierData *data)
General operations, lookup, etc. for blender objects.
void BKE_object_batch_cache_dirty_tag(struct Object *ob)
struct Object * BKE_object_pose_armature_get(struct Object *ob)
bool BKE_object_is_in_editmode_vgroup(const struct Object *ob)
unsigned int BLI_ghash_len(GHash *gh) ATTR_WARN_UNUSED_RESULT
GHash * BLI_ghash_str_new_ex(const char *info, const unsigned int nentries_reserve) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT
void BLI_ghash_insert(GHash *gh, void *key, void *val)
void ** BLI_ghash_lookup_p(GHash *gh, const void *key) ATTR_WARN_UNUSED_RESULT
void BLI_ghash_free(GHash *gh, GHashKeyFreeFP keyfreefp, GHashValFreeFP valfreefp)
void * BLI_ghash_lookup(GHash *gh, const void *key) ATTR_WARN_UNUSED_RESULT
BLI_INLINE bool BLI_listbase_is_empty(const struct ListBase *lb)
void BLI_freelinkN(struct ListBase *listbase, void *vlink) 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)
void BLI_string_flip_side_name(char *r_name, const char *from_name, const bool strip_number, const size_t name_len)
#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_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 *(* MEM_mallocN)(size_t len, const char *str)
struct ClothSimSettings * sim_parms
struct MDeformVert * dvert
struct EditLatt * editlatt
struct BMEditMesh * edit_mesh
struct MDeformVert * dvert
struct ModifierData * next
struct ParticleSystem * next
struct bPoseChannel * next