89 psys->vgroup[a] = map[psys->vgroup[a]];
122 return ((
Mesh *)
id)->deform_verts_for_write().data();
127 size_t(lt->
pntsu) *
size_t(lt->
pntsv) *
size_t(lt->
pntsw),
"lattice deformVert");
147 bool changed =
false;
155 if (cd_dvert_offset != -1) {
171 if (
mesh->deform_verts().data()) {
177 dv =
mesh->deform_verts_for_write().data();
179 for (
i = 0;
i <
mesh->verts_num;
i++, dv++) {
180 if (dv->
dw && (!use_selection || select_vert[
i])) {
196 for (
i = 0, bp = lt->
def;
i < tot;
i++, bp++) {
197 if (!use_selection || (bp->
f1 &
SELECT)) {
215 bool changed =
false;
239 map[idx] = map[0] = 0;
240 for (
i = 1;
i < idx;
i++) {
243 for (
i = idx + 1;
i < defbase_tot;
i++) {
262 if (active_index > def_nr) {
302 for (
i = 0, dv = dvert_array;
i < dvert_tot;
i++, dv++) {
364 for (a = 0, bp = lt->
def; a < tot; a++, bp++, dvert++) {
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;
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),
602 if (
object &&
object->pose) {
603 bPose *pose =
object->pose;
631 return defgroup_validmap;
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]) {
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) {
781 memset(defgroup_validmap,
false, *r_defgroup_tot *
sizeof(*defgroup_validmap));
782 if ((def_nr_active >= 0) && (def_nr_active < *r_defgroup_tot)) {
784 defgroup_validmap[def_nr_active] =
true;
799 for (
i = 0;
i < *r_defgroup_tot;
i++) {
800 if (defgroup_validmap[
i] ==
true) {
801 *r_subset_count += 1;
810 for (
i = 0;
i < *r_defgroup_tot;
i++) {
811 defgroup_validmap[
i] = !defgroup_validmap[
i];
812 if (defgroup_validmap[
i] ==
true) {
813 *r_subset_count += 1;
821 memset(defgroup_validmap,
true, *r_defgroup_tot *
sizeof(*defgroup_validmap));
822 *r_subset_count = *r_defgroup_tot;
827 return defgroup_validmap;
831 const int defgroup_tot,
832 int *r_defgroup_subset_map)
835 for (
i = 0;
i < defgroup_tot;
i++) {
836 if (defgroup_validmap[
i]) {
837 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)
bool CustomData_free_layer_active(CustomData *data, eCustomDataType type)
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)
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)
int BLI_findindex(const ListBase *listbase, const void *vlink) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
void * BLI_findlink(const ListBase *listbase, int number) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
#define LISTBASE_FOREACH(type, var, list)
BLI_INLINE bool BLI_listbase_is_empty(const ListBase *lb)
void BLI_freelinkN(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
int BLI_listbase_count(const 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)
@ eModifierType_GreasePencilArmature
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)
GAttributeReader lookup_or_default(StringRef attribute_id, AttrDomain domain, AttrType data_type, const void *default_value=nullptr) const
void * MEM_calloc_arrayN(size_t len, size_t size, const char *str)
void * MEM_malloc_arrayN(size_t len, size_t size, const char *str)
void MEM_freeN(void *vmemh)
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