diff options
-rw-r--r-- | source/blender/blenkernel/BKE_lattice.h | 72 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/armature.c | 264 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/lattice.c | 148 | ||||
-rw-r--r-- | source/blender/draw/intern/draw_cache_impl_lattice.c | 2 | ||||
-rw-r--r-- | source/blender/gpencil_modifiers/intern/MOD_gpencilarmature.c | 19 | ||||
-rw-r--r-- | source/blender/modifiers/intern/MOD_armature.c | 76 | ||||
-rw-r--r-- | source/blender/modifiers/intern/MOD_lattice.c | 16 |
7 files changed, 360 insertions, 237 deletions
diff --git a/source/blender/blenkernel/BKE_lattice.h b/source/blender/blenkernel/BKE_lattice.h index 9679d105363..19cb4f5c4e1 100644 --- a/source/blender/blenkernel/BKE_lattice.h +++ b/source/blender/blenkernel/BKE_lattice.h @@ -59,40 +59,60 @@ void outside_lattice(struct Lattice *lt); * Used by modifiers (odd location for this API, for now keep these related functions together). * \{ */ -void BKE_curve_deform_coords(struct Object *cuOb, - struct Object *target, +void BKE_curve_deform_coords(struct Object *ob_curve, + struct Object *ob_target, float (*vert_coords)[3], - int numVerts, - struct MDeformVert *dvert, + const int vert_coords_len, + const struct MDeformVert *dvert, const int defgrp_index, - short flag, - short defaxis); -void BKE_curve_deform_co(struct Object *cuOb, - struct Object *target, - float orco[3], + const short flag, + const short defaxis); +void BKE_curve_deform_co(struct Object *ob_curve, + struct Object *ob_target, + const float orco[3], float vec[3], float mat[3][3], - int no_rot_axis); + const int no_rot_axis); -void BKE_lattice_deform_coords(struct Object *laOb, - struct Object *target, - struct Mesh *mesh, +void BKE_lattice_deform_coords(struct Object *ob_lattice, + struct Object *ob_target, float (*vert_coords)[3], - int numVerts, - short flag, - const char *vgroup, + const int vert_coords_len, + const short flag, + const char *defgrp_name, float influence); -void BKE_armature_deform_coords(struct Object *armOb, - struct Object *target, - const struct Mesh *mesh, - float (*vert_coords)[3], - float (*defMats)[3][3], - int numVerts, - int deformflag, - float (*prevCos)[3], - const char *defgrp_name, - struct bGPDstroke *gps); +void BKE_lattice_deform_coords_with_mesh(struct Object *ob_lattice, + struct Object *ob_target, + float (*vert_coords)[3], + const int vert_coords_len, + const short flag, + const char *defgrp_name, + const float influence, + const struct Mesh *me_target); + +/* Note that we could have a 'BKE_armature_deform_coords' that doesn't take object data + * currently there are no callers for this though. */ + +void BKE_armature_deform_coords_with_gpencil_stroke(struct Object *ob_arm, + struct Object *ob_target, + float (*vert_coords)[3], + float (*vert_deform_mats)[3][3], + int vert_coords_len, + int deformflag, + float (*vert_coords_prev)[3], + const char *defgrp_name, + struct bGPDstroke *gps_target); + +void BKE_armature_deform_coords_with_mesh(struct Object *ob_arm, + struct Object *ob_target, + float (*vert_coords)[3], + float (*vert_deform_mats)[3][3], + int vert_coords_len, + int deformflag, + float (*vert_coords_prev)[3], + const char *defgrp_name, + const struct Mesh *me_target); /** \} */ diff --git a/source/blender/blenkernel/intern/armature.c b/source/blender/blenkernel/intern/armature.c index b382426d11c..becb78bd6fe 100644 --- a/source/blender/blenkernel/intern/armature.c +++ b/source/blender/blenkernel/intern/armature.c @@ -1331,6 +1331,10 @@ void BKE_pchan_bbone_deform_segment_index(const bPoseChannel *pchan, *r_blend_next = blend; } +/* -------------------------------------------------------------------- */ +/** \name Armature Deform Internal Utilities + * \{ */ + /* Add the effect of one bone or B-Bone segment to the accumulated result. */ static void pchan_deform_accumulate(const DualQuat *deform_dq, const float deform_mat[4][4], @@ -1501,13 +1505,21 @@ static void pchan_bone_deform(bPoseChannel *pchan, (*contrib) += weight; } +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Armature Deform #BKE_armature_deform_coords API + * + * #BKE_armature_deform_coords and related functions. + * \{ */ + typedef struct ArmatureUserdata { - Object *armOb; - Object *target; - const Mesh *mesh; - float (*vertexCos)[3]; - float (*defMats)[3][3]; - float (*prevCos)[3]; + Object *ob_arm; + Object *ob_target; + const Mesh *me_target; + float (*vert_coords)[3]; + float (*vert_deform_mats)[3][3]; + float (*vert_coords_prev)[3]; bool use_envelope; bool use_quaternion; @@ -1516,11 +1528,11 @@ typedef struct ArmatureUserdata { int armature_def_nr; - int target_totvert; - MDeformVert *dverts; + const MDeformVert *dverts; + int dverts_len; - int defbase_tot; - bPoseChannel **defnrToPC; + bPoseChannel **pchan_from_defbase; + int defbase_len; float premat[4][4]; float postmat[4][4]; @@ -1531,15 +1543,15 @@ static void armature_vert_task(void *__restrict userdata, const TaskParallelTLS *__restrict UNUSED(tls)) { const ArmatureUserdata *data = userdata; - float(*const vertexCos)[3] = data->vertexCos; - float(*const defMats)[3][3] = data->defMats; - float(*const prevCos)[3] = data->prevCos; + float(*const vert_coords)[3] = data->vert_coords; + float(*const vert_deform_mats)[3][3] = data->vert_deform_mats; + float(*const vert_coords_prev)[3] = data->vert_coords_prev; const bool use_envelope = data->use_envelope; const bool use_quaternion = data->use_quaternion; const bool use_dverts = data->use_dverts; const int armature_def_nr = data->armature_def_nr; - MDeformVert *dvert; + const MDeformVert *dvert; DualQuat sumdq, *dq = NULL; bPoseChannel *pchan; float *co, dco[3]; @@ -1557,23 +1569,23 @@ static void armature_vert_task(void *__restrict userdata, sumvec[0] = sumvec[1] = sumvec[2] = 0.0f; vec = sumvec; - if (defMats) { + if (vert_deform_mats) { zero_m3(summat); smat = summat; } } if (use_dverts || armature_def_nr != -1) { - if (data->mesh) { - BLI_assert(i < data->mesh->totvert); - if (data->mesh->dvert != NULL) { - dvert = data->mesh->dvert + i; + if (data->me_target) { + BLI_assert(i < data->me_target->totvert); + if (data->me_target->dvert != NULL) { + dvert = data->me_target->dvert + i; } else { dvert = NULL; } } - else if (data->dverts && i < data->target_totvert) { + else if (data->dverts && i < data->dverts_len) { dvert = data->dverts + i; } else { @@ -1591,8 +1603,8 @@ static void armature_vert_task(void *__restrict userdata, armature_weight = 1.0f - armature_weight; } - /* hackish: the blending factor can be used for blending with prevCos too */ - if (prevCos) { + /* hackish: the blending factor can be used for blending with vert_coords_prev too */ + if (vert_coords_prev) { prevco_weight = armature_weight; armature_weight = 1.0f; } @@ -1604,7 +1616,7 @@ static void armature_vert_task(void *__restrict userdata, } /* get the coord we work on */ - co = prevCos ? prevCos[i] : vertexCos[i]; + co = vert_coords_prev ? vert_coords_prev[i] : vert_coords[i]; /* Apply the object's matrix */ mul_m4_v3(data->premat, co); @@ -1615,7 +1627,7 @@ static void armature_vert_task(void *__restrict userdata, unsigned int j; for (j = dvert->totweight; j != 0; j--, dw++) { const uint index = dw->def_nr; - if (index < data->defbase_tot && (pchan = data->defnrToPC[index])) { + if (index < data->defbase_len && (pchan = data->pchan_from_defbase[index])) { float weight = dw->weight; Bone *bone = pchan->bone; @@ -1632,7 +1644,7 @@ static void armature_vert_task(void *__restrict userdata, /* if there are vertexgroups but not groups with bones * (like for softbody groups) */ if (deformed == 0 && use_envelope) { - for (pchan = data->armOb->pose->chanbase.first; pchan; pchan = pchan->next) { + for (pchan = data->ob_arm->pose->chanbase.first; pchan; pchan = pchan->next) { if (!(pchan->bone->flag & BONE_NO_DEFORM)) { contrib += dist_bone_deform(pchan, vec, dq, smat, co); } @@ -1640,7 +1652,7 @@ static void armature_vert_task(void *__restrict userdata, } } else if (use_envelope) { - for (pchan = data->armOb->pose->chanbase.first; pchan; pchan = pchan->next) { + for (pchan = data->ob_arm->pose->chanbase.first; pchan; pchan = pchan->next) { if (!(pchan->bone->flag & BONE_NO_DEFORM)) { contrib += dist_bone_deform(pchan, vec, dq, smat, co); } @@ -1654,13 +1666,13 @@ static void armature_vert_task(void *__restrict userdata, if (armature_weight != 1.0f) { copy_v3_v3(dco, co); - mul_v3m3_dq(dco, (defMats) ? summat : NULL, dq); + mul_v3m3_dq(dco, (vert_deform_mats) ? summat : NULL, dq); sub_v3_v3(dco, co); mul_v3_fl(dco, armature_weight); add_v3_v3(co, dco); } else { - mul_v3m3_dq(co, (defMats) ? summat : NULL, dq); + mul_v3m3_dq(co, (vert_deform_mats) ? summat : NULL, dq); } smat = summat; @@ -1670,18 +1682,18 @@ static void armature_vert_task(void *__restrict userdata, add_v3_v3v3(co, vec, co); } - if (defMats) { + if (vert_deform_mats) { float pre[3][3], post[3][3], tmpmat[3][3]; copy_m3_m4(pre, data->premat); copy_m3_m4(post, data->postmat); - copy_m3_m3(tmpmat, defMats[i]); + copy_m3_m3(tmpmat, vert_deform_mats[i]); if (!use_quaternion) { /* quaternion already is scale corrected */ mul_m3_fl(smat, armature_weight / contrib); } - mul_m3_series(defMats[i], post, smat, pre, tmpmat); + mul_m3_series(vert_deform_mats[i], post, smat, pre, tmpmat); } } @@ -1689,100 +1701,100 @@ static void armature_vert_task(void *__restrict userdata, mul_m4_v3(data->postmat, co); /* interpolate with previous modifier position using weight group */ - if (prevCos) { + if (vert_coords_prev) { float mw = 1.0f - prevco_weight; - vertexCos[i][0] = prevco_weight * vertexCos[i][0] + mw * co[0]; - vertexCos[i][1] = prevco_weight * vertexCos[i][1] + mw * co[1]; - vertexCos[i][2] = prevco_weight * vertexCos[i][2] + mw * co[2]; - } -} - -void BKE_armature_deform_coords(Object *armOb, - Object *target, - const Mesh *mesh, - float (*vertexCos)[3], - float (*defMats)[3][3], - int numVerts, - int deformflag, - float (*prevCos)[3], - const char *defgrp_name, - bGPDstroke *gps) -{ - bArmature *arm = armOb->data; - bPoseChannel **defnrToPC = NULL; - MDeformVert *dverts = NULL; + vert_coords[i][0] = prevco_weight * vert_coords[i][0] + mw * co[0]; + vert_coords[i][1] = prevco_weight * vert_coords[i][1] + mw * co[1]; + vert_coords[i][2] = prevco_weight * vert_coords[i][2] + mw * co[2]; + } +} + +static void armature_deform_coords_impl(Object *ob_arm, + Object *ob_target, + float (*vert_coords)[3], + float (*vert_deform_mats)[3][3], + const int vert_coords_len, + const int deformflag, + float (*vert_coords_prev)[3], + const char *defgrp_name, + const Mesh *me_target, + bGPDstroke *gps_target) +{ + 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_tot = 0; /* safety for vertexgroup index overflow */ - int i, target_totvert = 0; /* safety for vertexgroup overflow */ + int defbase_len = 0; /* safety for vertexgroup index overflow */ + int i, dverts_len = 0; /* safety for vertexgroup overflow */ bool use_dverts = false; int armature_def_nr; /* in editmode, or not an armature */ - if (arm->edbo || (armOb->pose == NULL)) { + if (arm->edbo || (ob_arm->pose == NULL)) { return; } - if ((armOb->pose->flag & POSE_RECALC) != 0) { + if ((ob_arm->pose->flag & POSE_RECALC) != 0) { CLOG_ERROR(&LOG, "Trying to evaluate influence of armature '%s' which needs Pose recalc!", - armOb->id.name); + ob_arm->id.name); BLI_assert(0); } /* get the def_nr for the overall armature vertex group if present */ - armature_def_nr = BKE_object_defgroup_name_index(target, defgrp_name); + armature_def_nr = BKE_object_defgroup_name_index(ob_target, defgrp_name); - if (ELEM(target->type, OB_MESH, OB_LATTICE, OB_GPENCIL)) { - defbase_tot = BLI_listbase_count(&target->defbase); + if (ELEM(ob_target->type, OB_MESH, OB_LATTICE, OB_GPENCIL)) { + defbase_len = BLI_listbase_count(&ob_target->defbase); - if (target->type == OB_MESH) { - Mesh *me = target->data; + if (ob_target->type == OB_MESH) { + Mesh *me = ob_target->data; dverts = me->dvert; if (dverts) { - target_totvert = me->totvert; + dverts_len = me->totvert; } } - else if (target->type == OB_LATTICE) { - Lattice *lt = target->data; + else if (ob_target->type == OB_LATTICE) { + Lattice *lt = ob_target->data; dverts = lt->dvert; if (dverts) { - target_totvert = lt->pntsu * lt->pntsv * lt->pntsw; + dverts_len = lt->pntsu * lt->pntsv * lt->pntsw; } } - else if (target->type == OB_GPENCIL) { - dverts = gps->dvert; + else if (ob_target->type == OB_GPENCIL) { + dverts = gps_target->dvert; if (dverts) { - target_totvert = gps->totpoints; + dverts_len = gps_target->totpoints; } } } /* get a vertex-deform-index to posechannel array */ if (deformflag & ARM_DEF_VGROUP) { - if (ELEM(target->type, OB_MESH, OB_LATTICE, OB_GPENCIL)) { + if (ELEM(ob_target->type, OB_MESH, OB_LATTICE, OB_GPENCIL)) { /* if we have a Mesh, only use dverts if it has them */ - if (mesh) { - use_dverts = (mesh->dvert != NULL); + if (me_target) { + use_dverts = (me_target->dvert != NULL); } else if (dverts) { use_dverts = true; } if (use_dverts) { - defnrToPC = MEM_callocN(sizeof(*defnrToPC) * defbase_tot, "defnrToBone"); + pchan_from_defbase = MEM_callocN(sizeof(*pchan_from_defbase) * defbase_len, "defnrToBone"); /* TODO(sergey): Some considerations here: * * - Check whether keeping this consistent across frames gives speedup. */ - for (i = 0, dg = target->defbase.first; dg; i++, dg = dg->next) { - defnrToPC[i] = BKE_pose_channel_find_name(armOb->pose, dg->name); + for (i = 0, dg = ob_target->defbase.first; dg; i++, dg = dg->next) { + pchan_from_defbase[i] = BKE_pose_channel_find_name(ob_arm->pose, dg->name); /* exclude non-deforming bones */ - if (defnrToPC[i]) { - if (defnrToPC[i]->bone->flag & BONE_NO_DEFORM) { - defnrToPC[i] = NULL; + if (pchan_from_defbase[i]) { + if (pchan_from_defbase[i]->bone->flag & BONE_NO_DEFORM) { + pchan_from_defbase[i] = NULL; } } } @@ -1790,39 +1802,85 @@ void BKE_armature_deform_coords(Object *armOb, } } - ArmatureUserdata data = {.armOb = armOb, - .target = target, - .mesh = mesh, - .vertexCos = vertexCos, - .defMats = defMats, - .prevCos = prevCos, - .use_envelope = use_envelope, - .use_quaternion = use_quaternion, - .invert_vgroup = invert_vgroup, - .use_dverts = use_dverts, - .armature_def_nr = armature_def_nr, - .target_totvert = target_totvert, - .dverts = dverts, - .defbase_tot = defbase_tot, - .defnrToPC = defnrToPC}; + ArmatureUserdata data = { + .ob_arm = ob_arm, + .ob_target = ob_target, + .me_target = me_target, + .vert_coords = vert_coords, + .vert_deform_mats = vert_deform_mats, + .vert_coords_prev = vert_coords_prev, + .use_envelope = use_envelope, + .use_quaternion = use_quaternion, + .invert_vgroup = invert_vgroup, + .use_dverts = use_dverts, + .armature_def_nr = armature_def_nr, + .dverts = dverts, + .dverts_len = dverts_len, + .pchan_from_defbase = pchan_from_defbase, + .defbase_len = defbase_len, + }; float obinv[4][4]; - invert_m4_m4(obinv, target->obmat); + invert_m4_m4(obinv, ob_target->obmat); - mul_m4_m4m4(data.postmat, obinv, armOb->obmat); + mul_m4_m4m4(data.postmat, obinv, ob_arm->obmat); invert_m4_m4(data.premat, data.postmat); TaskParallelSettings settings; BLI_parallel_range_settings_defaults(&settings); settings.min_iter_per_thread = 32; - BLI_task_parallel_range(0, numVerts, &data, armature_vert_task, &settings); - - if (defnrToPC) { - MEM_freeN(defnrToPC); - } -} - -/* ************ END Armature Deform ******************* */ + BLI_task_parallel_range(0, vert_coords_len, &data, armature_vert_task, &settings); + + if (pchan_from_defbase) { + MEM_freeN(pchan_from_defbase); + } +} + +void BKE_armature_deform_coords_with_gpencil_stroke(Object *ob_arm, + Object *ob_target, + float (*vert_coords)[3], + float (*vert_deform_mats)[3][3], + int vert_coords_len, + int deformflag, + float (*vert_coords_prev)[3], + const char *defgrp_name, + bGPDstroke *gps_target) +{ + armature_deform_coords_impl(ob_arm, + ob_target, + vert_coords, + vert_deform_mats, + vert_coords_len, + deformflag, + vert_coords_prev, + defgrp_name, + NULL, + gps_target); +} + +void BKE_armature_deform_coords_with_mesh(Object *ob_arm, + Object *ob_target, + float (*vert_coords)[3], + float (*vert_deform_mats)[3][3], + int vert_coords_len, + int deformflag, + float (*vert_coords_prev)[3], + const char *defgrp_name, + const Mesh *me_target) +{ + armature_deform_coords_impl(ob_arm, + ob_target, + vert_coords, + vert_deform_mats, + vert_coords_len, + deformflag, + vert_coords_prev, + defgrp_name, + me_target, + NULL); +} + +/** \} */ void get_objectspace_bone_matrix(struct Bone *bone, float M_accumulatedMatrix[4][4], diff --git a/source/blender/blenkernel/intern/lattice.c b/source/blender/blenkernel/intern/lattice.c index 4e0e3baff57..666eb16c75f 100644 --- a/source/blender/blenkernel/intern/lattice.c +++ b/source/blender/blenkernel/intern/lattice.c @@ -299,7 +299,7 @@ void BKE_lattice_resize(Lattice *lt, int uNew, int vNew, int wNew, Object *ltOb) copy_m4_m4(mat, ltOb->obmat); unit_m4(ltOb->obmat); - BKE_lattice_deform_coords(ltOb, NULL, NULL, vert_coords, uNew * vNew * wNew, 0, NULL, 1.0f); + BKE_lattice_deform_coords(ltOb, NULL, vert_coords, uNew * vNew * wNew, 0, NULL, 1.0f); copy_m4_m4(ltOb->obmat, mat); lt->typeu = typeu; @@ -565,6 +565,10 @@ void end_latt_deform(LatticeDeformData *lattice_deform_data) MEM_freeN(lattice_deform_data); } +/* -------------------------------------------------------------------- */ +/** \name Curve Deform Internal Utilities + * \{ */ + /* calculations is in local space of deformed object * so we store in latmat transform from path coord inside object */ @@ -759,14 +763,22 @@ static bool calc_curve_deform( return false; } -void BKE_curve_deform_coords(Object *cuOb, - Object *target, +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Curve Deform #BKE_curve_deform_coords API + * + * #BKE_curve_deform and related functions. + * \{ */ + +void BKE_curve_deform_coords(Object *ob_curve, + Object *ob_target, float (*vert_coords)[3], - int numVerts, - MDeformVert *dvert, + const int vert_coords_len, + const MDeformVert *dvert, const int defgrp_index, - short flag, - short defaxis) + const short flag, + const short defaxis) { Curve *cu; int a; @@ -774,13 +786,13 @@ void BKE_curve_deform_coords(Object *cuOb, const bool is_neg_axis = (defaxis > 2); const bool invert_vgroup = (flag & MOD_CURVE_INVERT_VGROUP) != 0; - if (cuOb->type != OB_CURVE) { + if (ob_curve->type != OB_CURVE) { return; } - cu = cuOb->data; + cu = ob_curve->data; - init_curve_deform(cuOb, target, &cd); + init_curve_deform(ob_curve, ob_target, &cd); /* dummy bounds, keep if CU_DEFORM_BOUNDS_OFF is set */ if (is_neg_axis == false) { @@ -794,11 +806,11 @@ void BKE_curve_deform_coords(Object *cuOb, } if (dvert) { - MDeformVert *dvert_iter; + const MDeformVert *dvert_iter; float vec[3]; if (cu->flag & CU_DEFORM_BOUNDS_OFF) { - for (a = 0, dvert_iter = dvert; a < numVerts; a++, dvert_iter++) { + for (a = 0, dvert_iter = dvert; a < vert_coords_len; a++, dvert_iter++) { const float weight = invert_vgroup ? 1.0f - BKE_defvert_find_weight(dvert_iter, defgrp_index) : BKE_defvert_find_weight(dvert_iter, defgrp_index); @@ -806,7 +818,7 @@ void BKE_curve_deform_coords(Object *cuOb, if (weight > 0.0f) { mul_m4_v3(cd.curvespace, vert_coords[a]); copy_v3_v3(vec, vert_coords[a]); - calc_curve_deform(cuOb, vec, defaxis, &cd, NULL); + calc_curve_deform(ob_curve, vec, defaxis, &cd, NULL); interp_v3_v3v3(vert_coords[a], vert_coords[a], vec, weight); mul_m4_v3(cd.objectspace, vert_coords[a]); } @@ -816,7 +828,7 @@ void BKE_curve_deform_coords(Object *cuOb, /* set mesh min/max bounds */ INIT_MINMAX(cd.dmin, cd.dmax); - for (a = 0, dvert_iter = dvert; a < numVerts; a++, dvert_iter++) { + for (a = 0, dvert_iter = dvert; a < vert_coords_len; a++, dvert_iter++) { const float weight = invert_vgroup ? 1.0f - BKE_defvert_find_weight(dvert_iter, defgrp_index) : BKE_defvert_find_weight(dvert_iter, defgrp_index); @@ -826,7 +838,7 @@ void BKE_curve_deform_coords(Object *cuOb, } } - for (a = 0, dvert_iter = dvert; a < numVerts; a++, dvert_iter++) { + for (a = 0, dvert_iter = dvert; a < vert_coords_len; a++, dvert_iter++) { const float weight = invert_vgroup ? 1.0f - BKE_defvert_find_weight(dvert_iter, defgrp_index) : BKE_defvert_find_weight(dvert_iter, defgrp_index); @@ -834,7 +846,7 @@ void BKE_curve_deform_coords(Object *cuOb, if (weight > 0.0f) { /* already in 'cd.curvespace', prev for loop */ copy_v3_v3(vec, vert_coords[a]); - calc_curve_deform(cuOb, vec, defaxis, &cd, NULL); + calc_curve_deform(ob_curve, vec, defaxis, &cd, NULL); interp_v3_v3v3(vert_coords[a], vert_coords[a], vec, weight); mul_m4_v3(cd.objectspace, vert_coords[a]); } @@ -843,9 +855,9 @@ void BKE_curve_deform_coords(Object *cuOb, } else { if (cu->flag & CU_DEFORM_BOUNDS_OFF) { - for (a = 0; a < numVerts; a++) { + for (a = 0; a < vert_coords_len; a++) { mul_m4_v3(cd.curvespace, vert_coords[a]); - calc_curve_deform(cuOb, vert_coords[a], defaxis, &cd, NULL); + calc_curve_deform(ob_curve, vert_coords[a], defaxis, &cd, NULL); mul_m4_v3(cd.objectspace, vert_coords[a]); } } @@ -853,14 +865,14 @@ void BKE_curve_deform_coords(Object *cuOb, /* set mesh min max bounds */ INIT_MINMAX(cd.dmin, cd.dmax); - for (a = 0; a < numVerts; a++) { + for (a = 0; a < vert_coords_len; a++) { mul_m4_v3(cd.curvespace, vert_coords[a]); minmax_v3v3_v3(cd.dmin, cd.dmax, vert_coords[a]); } - for (a = 0; a < numVerts; a++) { + for (a = 0; a < vert_coords_len; a++) { /* already in 'cd.curvespace', prev for loop */ - calc_curve_deform(cuOb, vert_coords[a], defaxis, &cd, NULL); + calc_curve_deform(ob_curve, vert_coords[a], defaxis, &cd, NULL); mul_m4_v3(cd.objectspace, vert_coords[a]); } } @@ -870,18 +882,22 @@ void BKE_curve_deform_coords(Object *cuOb, /* input vec and orco = local coord in armature space */ /* orco is original not-animated or deformed reference point */ /* result written in vec and mat */ -void BKE_curve_deform_co( - Object *cuOb, Object *target, float orco[3], float vec[3], float mat[3][3], int no_rot_axis) +void BKE_curve_deform_co(Object *ob_curve, + Object *ob_target, + const float orco[3], + float vec[3], + float mat[3][3], + const int no_rot_axis) { CurveDeform cd; float quat[4]; - if (cuOb->type != OB_CURVE) { + if (ob_curve->type != OB_CURVE) { unit_m3(mat); return; } - init_curve_deform(cuOb, target, &cd); + init_curve_deform(ob_curve, ob_target, &cd); cd.no_rot_axis = no_rot_axis; /* option to only rotate for XY, for example */ copy_v3_v3(cd.dmin, orco); @@ -889,7 +905,7 @@ void BKE_curve_deform_co( mul_m4_v3(cd.curvespace, vec); - if (calc_curve_deform(cuOb, vec, target->trackflag, &cd, quat)) { + if (calc_curve_deform(ob_curve, vec, ob_target->trackflag, &cd, quat)) { float qmat[3][3]; quat_to_mat3(qmat, quat); @@ -902,10 +918,18 @@ void BKE_curve_deform_co( mul_m4_v3(cd.objectspace, vec); } +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Lattice Deform #BKE_lattice_deform_coords API + * + * #BKE_lattice_deform_coords and related functions. + * \{ */ + typedef struct LatticeDeformUserdata { LatticeDeformData *lattice_deform_data; float (*vert_coords)[3]; - MDeformVert *dvert; + const MDeformVert *dvert; int defgrp_index; float fac; bool invert_vgroup; @@ -931,41 +955,41 @@ static void lattice_deform_vert_task(void *__restrict userdata, } } -void BKE_lattice_deform_coords(Object *laOb, - Object *target, - Mesh *mesh, - float (*vert_coords)[3], - int numVerts, - short flag, - const char *vgroup, - float fac) +static void lattice_deform_coords_impl(Object *ob_lattice, + Object *ob_target, + float (*vert_coords)[3], + const int vert_coords_len, + const short flag, + const char *defgrp_name, + const float fac, + const Mesh *me_target) { LatticeDeformData *lattice_deform_data; - MDeformVert *dvert = NULL; + const MDeformVert *dvert = NULL; int defgrp_index = -1; - if (laOb->type != OB_LATTICE) { + if (ob_lattice->type != OB_LATTICE) { return; } - lattice_deform_data = init_latt_deform(laOb, target); + lattice_deform_data = init_latt_deform(ob_lattice, ob_target); - /* Check whether to use vertex groups (only possible if target is a Mesh or Lattice). + /* Check whether to use vertex groups (only possible if ob_target is a Mesh or Lattice). * We want either a Mesh/Lattice with no derived data, or derived data with deformverts. */ - if (vgroup && vgroup[0] && target && ELEM(target->type, OB_MESH, OB_LATTICE)) { - defgrp_index = BKE_object_defgroup_name_index(target, vgroup); + if (defgrp_name && defgrp_name[0] && ob_target && ELEM(ob_target->type, OB_MESH, OB_LATTICE)) { + defgrp_index = BKE_object_defgroup_name_index(ob_target, defgrp_name); if (defgrp_index != -1) { /* if there's derived data without deformverts, don't use vgroups */ - if (mesh) { - dvert = CustomData_get_layer(&mesh->vdata, CD_MDEFORMVERT); + if (me_target) { + dvert = CustomData_get_layer(&me_target->vdata, CD_MDEFORMVERT); } - else if (target->type == OB_LATTICE) { - dvert = ((Lattice *)target->data)->dvert; + else if (ob_target->type == OB_LATTICE) { + dvert = ((Lattice *)ob_target->data)->dvert; } else { - dvert = ((Mesh *)target->data)->dvert; + dvert = ((Mesh *)ob_target->data)->dvert; } } } @@ -982,19 +1006,45 @@ void BKE_lattice_deform_coords(Object *laOb, TaskParallelSettings settings; BLI_parallel_range_settings_defaults(&settings); settings.min_iter_per_thread = 32; - BLI_task_parallel_range(0, numVerts, &data, lattice_deform_vert_task, &settings); + BLI_task_parallel_range(0, vert_coords_len, &data, lattice_deform_vert_task, &settings); end_latt_deform(lattice_deform_data); } +void BKE_lattice_deform_coords(Object *ob_lattice, + Object *ob_target, + float (*vert_coords)[3], + int vert_coords_len, + short flag, + const char *defgrp_name, + float fac) +{ + lattice_deform_coords_impl( + ob_lattice, ob_target, vert_coords, vert_coords_len, flag, defgrp_name, fac, NULL); +} + +void BKE_lattice_deform_coords_with_mesh(Object *ob_lattice, + Object *ob_target, + float (*vert_coords)[3], + const int vert_coords_len, + const short flag, + const char *defgrp_name, + const float fac, + const Mesh *me_target) +{ + lattice_deform_coords_impl( + ob_lattice, ob_target, vert_coords, vert_coords_len, flag, defgrp_name, fac, me_target); +} + +/** \} */ + bool object_deform_mball(Object *ob, ListBase *dispbase) { if (ob->parent && ob->parent->type == OB_LATTICE && ob->partype == PARSKEL) { DispList *dl; for (dl = dispbase->first; dl; dl = dl->next) { - BKE_lattice_deform_coords( - ob->parent, ob, NULL, (float(*)[3])dl->verts, dl->nr, 0, NULL, 1.0f); + BKE_lattice_deform_coords(ob->parent, ob, (float(*)[3])dl->verts, dl->nr, 0, NULL, 1.0f); } return true; diff --git a/source/blender/draw/intern/draw_cache_impl_lattice.c b/source/blender/draw/intern/draw_cache_impl_lattice.c index bb313b31deb..66a67d6b8fe 100644 --- a/source/blender/draw/intern/draw_cache_impl_lattice.c +++ b/source/blender/draw/intern/draw_cache_impl_lattice.c @@ -127,7 +127,7 @@ typedef struct LatticeRenderData { int actbp; - struct MDeformVert *dvert; + const struct MDeformVert *dvert; } LatticeRenderData; enum { diff --git a/source/blender/gpencil_modifiers/intern/MOD_gpencilarmature.c b/source/blender/gpencil_modifiers/intern/MOD_gpencilarmature.c index a6c071e7103..8e7fe872358 100644 --- a/source/blender/gpencil_modifiers/intern/MOD_gpencilarmature.c +++ b/source/blender/gpencil_modifiers/intern/MOD_gpencilarmature.c @@ -83,16 +83,15 @@ static void gpencil_deform_verts(ArmatureGpencilModifierData *mmd, Object *targe } /* deform verts */ - BKE_armature_deform_coords(mmd->object, - target, - NULL, - (float(*)[3])all_vert_coords, - NULL, - gps->totpoints, - mmd->deformflag, - (float(*)[3])mmd->prevCos, - mmd->vgname, - gps); + BKE_armature_deform_coords_with_gpencil_stroke(mmd->object, + target, + (float(*)[3])all_vert_coords, + NULL, + gps->totpoints, + mmd->deformflag, + (float(*)[3])mmd->prevCos, + mmd->vgname, + gps); /* Apply deformed coordinates */ pt = gps->points; diff --git a/source/blender/modifiers/intern/MOD_armature.c b/source/blender/modifiers/intern/MOD_armature.c index e394c30bbb8..214c6dbe9dc 100644 --- a/source/blender/modifiers/intern/MOD_armature.c +++ b/source/blender/modifiers/intern/MOD_armature.c @@ -146,16 +146,15 @@ static void deformVerts(ModifierData *md, MOD_previous_vcos_store(md, vertexCos); /* if next modifier needs original vertices */ - BKE_armature_deform_coords(amd->object, - ctx->object, - mesh, - vertexCos, - NULL, - numVerts, - amd->deformflag, - (float(*)[3])amd->prevCos, - amd->defgrp_name, - NULL); + BKE_armature_deform_coords_with_mesh(amd->object, + ctx->object, + vertexCos, + NULL, + numVerts, + amd->deformflag, + (float(*)[3])amd->prevCos, + amd->defgrp_name, + mesh); /* free cache */ if (amd->prevCos) { @@ -181,16 +180,15 @@ static void deformVertsEM(ModifierData *md, MOD_previous_vcos_store(md, vertexCos); /* if next modifier needs original vertices */ - BKE_armature_deform_coords(amd->object, - ctx->object, - mesh_src, - vertexCos, - NULL, - numVerts, - amd->deformflag, - (float(*)[3])amd->prevCos, - amd->defgrp_name, - NULL); + BKE_armature_deform_coords_with_mesh(amd->object, + ctx->object, + vertexCos, + NULL, + numVerts, + amd->deformflag, + (float(*)[3])amd->prevCos, + amd->defgrp_name, + mesh_src); /* free cache */ if (amd->prevCos) { @@ -214,16 +212,15 @@ static void deformMatricesEM(ModifierData *md, ArmatureModifierData *amd = (ArmatureModifierData *)md; Mesh *mesh_src = MOD_deform_mesh_eval_get(ctx->object, em, mesh, NULL, numVerts, false, false); - BKE_armature_deform_coords(amd->object, - ctx->object, - mesh_src, - vertexCos, - defMats, - numVerts, - amd->deformflag, - NULL, - amd->defgrp_name, - NULL); + BKE_armature_deform_coords_with_mesh(amd->object, + ctx->object, + vertexCos, + defMats, + numVerts, + amd->deformflag, + NULL, + amd->defgrp_name, + mesh_src); if (mesh_src != mesh) { BKE_id_free(NULL, mesh_src); @@ -240,16 +237,15 @@ static void deformMatrices(ModifierData *md, ArmatureModifierData *amd = (ArmatureModifierData *)md; Mesh *mesh_src = MOD_deform_mesh_eval_get(ctx->object, NULL, mesh, NULL, numVerts, false, false); - BKE_armature_deform_coords(amd->object, - ctx->object, - mesh_src, - vertexCos, - defMats, - numVerts, - amd->deformflag, - NULL, - amd->defgrp_name, - NULL); + BKE_armature_deform_coords_with_mesh(amd->object, + ctx->object, + vertexCos, + defMats, + numVerts, + amd->deformflag, + NULL, + amd->defgrp_name, + mesh_src); if (!ELEM(mesh_src, NULL, mesh)) { BKE_id_free(NULL, mesh_src); diff --git a/source/blender/modifiers/intern/MOD_lattice.c b/source/blender/modifiers/intern/MOD_lattice.c index 27f556397be..a6eaf7e78aa 100644 --- a/source/blender/modifiers/intern/MOD_lattice.c +++ b/source/blender/modifiers/intern/MOD_lattice.c @@ -113,14 +113,14 @@ static void deformVerts(ModifierData *md, MOD_previous_vcos_store(md, vertexCos); /* if next modifier needs original vertices */ - BKE_lattice_deform_coords(lmd->object, - ctx->object, - mesh_src, - vertexCos, - numVerts, - lmd->flag, - lmd->name, - lmd->strength); + BKE_lattice_deform_coords_with_mesh(lmd->object, + ctx->object, + vertexCos, + numVerts, + lmd->flag, + lmd->name, + lmd->strength, + mesh_src); if (!ELEM(mesh_src, NULL, mesh)) { BKE_id_free(NULL, mesh_src); |