91 psys->vgroup[a] = map[psys->vgroup[a]];
124 return ((
Mesh *)
id)->deform_verts_for_write().data();
129 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()) {
176 dv = mesh->deform_verts_for_write().data();
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;
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++) {
363 for (a = 0, bp = lt->
def; a < tot; a++, bp++, dvert++) {
454 bool is_vgroup_remap_needed =
false;
458 dg_src = dg_src->
next,
i++)
461 is_vgroup_remap_needed = is_vgroup_remap_needed || (vgroup_index_map[
i] !=
i);
464 if (!is_vgroup_remap_needed) {
466 vgroup_index_map =
nullptr;
470 return vgroup_index_map;
478 if (map ==
nullptr || map_len == 0) {
483 for (
int i = 0;
i < dvert_len;
i++, dv++) {
485 for (
int j = 0; j < totweight; j++) {
487 if (
uint(def_nr) <
uint(map_len) && map[def_nr] != -1) {
492 dv->
dw[j] = dv->
dw[totweight];
514 *dvert_arr = mesh->deform_verts_for_write().data();
520 *dvert_arr = lt->
dvert;
533 *dvert_arr =
nullptr;
544 bool is_locked =
false;
550 for (
i = 0, defgroup =
static_cast<bDeformGroup *
>(defbase->
first);
i < defbase_tot && defgroup;
551 defgroup = defgroup->
next,
i++)
554 is_locked |= lock_flags[
i];
568 bool *defgroup_validmap;
589 md = !md->
next && step1 ? (step1 = 0),
601 if (
object && object->
pose) {
602 bPose *pose =
object->pose;
630 return defgroup_validmap;
639 (*r_dg_flags_sel_tot) = 0;
646 i < defbase_tot && defgroup;
647 defgroup = defgroup->
next,
i++)
651 dg_selection[
i] =
true;
652 (*r_dg_flags_sel_tot) += 1;
655 dg_selection[
i] =
false;
660 memset(dg_selection,
false,
sizeof(*dg_selection) * defbase_tot);
667 const bool *validmap,
670 return validmap && validmap[index] && !(lock_flags && lock_flags[index]);
674 const bool *lock_flags,
675 const bool *selected,
678 if (lock_flags ==
nullptr) {
682 if (selected ==
nullptr || sel_tot <= 1) {
686 for (
int i = 0;
i < defbase_tot;
i++) {
687 if (selected[
i] && lock_flags[
i]) {
716 int defbase_tot,
const bool *locked,
const bool *deform,
bool *r_locked,
bool *r_unlocked)
719 if (r_unlocked != deform) {
720 memcpy(r_unlocked, deform,
sizeof(
bool) * defbase_tot);
723 memset(r_locked, 0,
sizeof(
bool) * defbase_tot);
728 for (
int i = 0;
i < defbase_tot;
i++) {
729 bool is_locked = locked[
i];
730 bool is_deform = deform[
i];
732 r_locked[
i] = is_deform && is_locked;
733 r_unlocked[
i] = is_deform && !is_locked;
739 const bool *dg_selection,
741 int *r_dg_flags_sel_tot)
749 for (
i = 0, defgroup =
static_cast<bDeformGroup *
>(defbase->
first);
i < defbase_tot && defgroup;
750 defgroup = defgroup->
next,
i++)
752 if (dg_selection[
i]) {
756 i_mirr =
STREQ(name_flip, defgroup->
name) ?
i :
759 if ((i_mirr >= 0 && i_mirr < defbase_tot) && (dg_flags_sel[i_mirr] ==
false)) {
760 dg_flags_sel[i_mirr] =
true;
761 (*r_dg_flags_sel_tot) += 1;
772 bool *defgroup_validmap =
nullptr;
776 switch (subset_type) {
780 memset(defgroup_validmap,
false, *r_defgroup_tot *
sizeof(*defgroup_validmap));
781 if ((def_nr_active >= 0) && (def_nr_active < *r_defgroup_tot)) {
783 defgroup_validmap[def_nr_active] =
true;
798 for (
i = 0;
i < *r_defgroup_tot;
i++) {
799 if (defgroup_validmap[
i] ==
true) {
800 *r_subset_count += 1;
809 for (
i = 0;
i < *r_defgroup_tot;
i++) {
810 defgroup_validmap[
i] = !defgroup_validmap[
i];
811 if (defgroup_validmap[
i] ==
true) {
812 *r_subset_count += 1;
820 memset(defgroup_validmap,
true, *r_defgroup_tot *
sizeof(*defgroup_validmap));
821 *r_subset_count = *r_defgroup_tot;
826 return defgroup_validmap;
830 const int defgroup_tot,
831 int *r_defgroup_subset_map)
834 for (
i = 0;
i < defgroup_tot;
i++) {
835 if (defgroup_validmap[
i]) {
836 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)
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 BM_ELEM_CD_GET_VOID_P(ele, offset)
#define BM_elem_flag_test(ele, hflag)
#define BM_ITER_MESH(ele, iter, bm, itype)
#define MEM_reallocN(vmemh, len)
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
MeshRuntimeHandle * runtime
ListBase vertex_group_names
int vertex_group_active_index
struct ModifierData * next