diff options
Diffstat (limited to 'source/blender/blenkernel/intern/armature_deform.c')
-rw-r--r-- | source/blender/blenkernel/intern/armature_deform.c | 54 |
1 files changed, 28 insertions, 26 deletions
diff --git a/source/blender/blenkernel/intern/armature_deform.c b/source/blender/blenkernel/intern/armature_deform.c index 0769049e9a9..84bb1af011a 100644 --- a/source/blender/blenkernel/intern/armature_deform.c +++ b/source/blender/blenkernel/intern/armature_deform.c @@ -35,6 +35,7 @@ #include "BKE_deform.h" #include "BKE_editmesh.h" #include "BKE_lattice.h" +#include "BKE_mesh.h" #include "DEG_depsgraph_build.h" @@ -159,9 +160,9 @@ float distfactor_to_bone( } static float dist_bone_deform( - bPoseChannel *pchan, float vec[3], DualQuat *dq, float mat[3][3], const float co[3]) + const bPoseChannel *pchan, float vec[3], DualQuat *dq, float mat[3][3], const float co[3]) { - Bone *bone = pchan->bone; + const Bone *bone = pchan->bone; float fac, contrib = 0.0; if (bone == NULL) { @@ -188,7 +189,7 @@ static float dist_bone_deform( return contrib; } -static void pchan_bone_deform(bPoseChannel *pchan, +static void pchan_bone_deform(const bPoseChannel *pchan, float weight, float vec[3], DualQuat *dq, @@ -196,7 +197,7 @@ static void pchan_bone_deform(bPoseChannel *pchan, const float co[3], float *contrib) { - Bone *bone = pchan->bone; + const Bone *bone = pchan->bone; if (!weight) { return; @@ -223,7 +224,6 @@ static void pchan_bone_deform(bPoseChannel *pchan, typedef struct ArmatureUserdata { const Object *ob_arm; - const Object *ob_target; const Mesh *me_target; float (*vert_coords)[3]; float (*vert_deform_mats)[3][3]; @@ -264,7 +264,7 @@ static void armature_vert_task_with_dvert(const ArmatureUserdata *data, const int armature_def_nr = data->armature_def_nr; DualQuat sumdq, *dq = NULL; - bPoseChannel *pchan; + const bPoseChannel *pchan; float *co, dco[3]; float sumvec[3], summat[3][3]; float *vec = NULL, (*smat)[3] = NULL; @@ -319,7 +319,7 @@ static void armature_vert_task_with_dvert(const ArmatureUserdata *data, const uint index = dw->def_nr; if (index < data->defbase_len && (pchan = data->pchan_from_defbase[index])) { float weight = dw->weight; - Bone *bone = pchan->bone; + const Bone *bone = pchan->bone; deformed = 1; @@ -407,8 +407,8 @@ static void armature_vert_task(void *__restrict userdata, if (data->use_dverts || data->armature_def_nr != -1) { if (data->me_target) { BLI_assert(i < data->me_target->totvert); - if (data->me_target->dvert != NULL) { - dvert = data->me_target->dvert + i; + if (data->dverts != NULL) { + dvert = data->dverts + i; } else { dvert = NULL; @@ -434,7 +434,7 @@ static void armature_vert_task_editmesh(void *__restrict userdata, { const ArmatureUserdata *data = userdata; BMVert *v = (BMVert *)iter; - MDeformVert *dvert = BM_ELEM_CD_GET_VOID_P(v, data->bmesh.cd_dvert_offset); + const MDeformVert *dvert = BM_ELEM_CD_GET_VOID_P(v, data->bmesh.cd_dvert_offset); armature_vert_task_with_dvert(data, BM_elem_index_get(v), dvert); } @@ -459,15 +459,14 @@ static void armature_deform_coords_impl(const Object *ob_arm, BMEditMesh *em_target, bGPDstroke *gps_target) { - bArmature *arm = ob_arm->data; + const bArmature *arm = ob_arm->data; bPoseChannel **pchan_from_defbase = NULL; const MDeformVert *dverts = NULL; - bDeformGroup *dg; const bool use_envelope = (deformflag & ARM_DEF_ENVELOPE) != 0; const bool use_quaternion = (deformflag & ARM_DEF_QUATERNION) != 0; const bool invert_vgroup = (deformflag & ARM_DEF_INVERT_VGROUP) != 0; - int defbase_len = 0; /* safety for vertexgroup index overflow */ - int i, dverts_len = 0; /* safety for vertexgroup overflow */ + int defbase_len = 0; /* safety for vertexgroup index overflow */ + int dverts_len = 0; /* safety for vertexgroup overflow */ bool use_dverts = false; int armature_def_nr = -1; int cd_dvert_offset = -1; @@ -485,34 +484,38 @@ static void armature_deform_coords_impl(const Object *ob_arm, } if (BKE_object_supports_vertex_groups(ob_target)) { - /* get the def_nr for the overall armature vertex group if present */ - armature_def_nr = BKE_object_defgroup_name_index(ob_target, defgrp_name); - - defbase_len = BKE_object_defgroup_count(ob_target); - + const ID *target_data_id = NULL; if (ob_target->type == OB_MESH) { + target_data_id = me_target == NULL ? (const ID *)ob_target->data : &me_target->id; if (em_target == NULL) { - Mesh *me = ob_target->data; - dverts = me->dvert; + const Mesh *me = (const Mesh *)target_data_id; + dverts = BKE_mesh_deform_verts(me); if (dverts) { dverts_len = me->totvert; } } } else if (ob_target->type == OB_LATTICE) { - Lattice *lt = ob_target->data; + const Lattice *lt = ob_target->data; + target_data_id = (const ID *)ob_target->data; dverts = lt->dvert; if (dverts) { dverts_len = lt->pntsu * lt->pntsv * lt->pntsw; } } else if (ob_target->type == OB_GPENCIL) { + target_data_id = (const ID *)ob_target->data; dverts = gps_target->dvert; if (dverts) { dverts_len = gps_target->totpoints; } } + /* Collect the vertex group names from the evaluated data. */ + armature_def_nr = BKE_id_defgroup_name_index(target_data_id, defgrp_name); + const ListBase *defbase = BKE_id_defgroup_list_get(target_data_id); + defbase_len = BLI_listbase_count(defbase); + /* get a vertex-deform-index to posechannel array */ if (deformflag & ARM_DEF_VGROUP) { /* if we have a Mesh, only use dverts if it has them */ @@ -521,7 +524,7 @@ static void armature_deform_coords_impl(const Object *ob_arm, use_dverts = (cd_dvert_offset != -1); } else if (me_target) { - use_dverts = (me_target->dvert != NULL); + use_dverts = (BKE_mesh_deform_verts(me_target) != NULL); } else if (dverts) { use_dverts = true; @@ -533,8 +536,8 @@ static void armature_deform_coords_impl(const Object *ob_arm, * * - Check whether keeping this consistent across frames gives speedup. */ - const ListBase *defbase = BKE_object_defgroup_list(ob_target); - for (i = 0, dg = defbase->first; dg; i++, dg = dg->next) { + int i; + LISTBASE_FOREACH_INDEX (bDeformGroup *, dg, defbase, i) { pchan_from_defbase[i] = BKE_pose_channel_find_name(ob_arm->pose, dg->name); /* exclude non-deforming bones */ if (pchan_from_defbase[i]) { @@ -549,7 +552,6 @@ static void armature_deform_coords_impl(const Object *ob_arm, ArmatureUserdata data = { .ob_arm = ob_arm, - .ob_target = ob_target, .me_target = me_target, .vert_coords = vert_coords, .vert_deform_mats = vert_deform_mats, |