Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source/blender/blenkernel/BKE_lattice.h72
-rw-r--r--source/blender/blenkernel/intern/armature.c264
-rw-r--r--source/blender/blenkernel/intern/lattice.c148
-rw-r--r--source/blender/draw/intern/draw_cache_impl_lattice.c2
-rw-r--r--source/blender/gpencil_modifiers/intern/MOD_gpencilarmature.c19
-rw-r--r--source/blender/modifiers/intern/MOD_armature.c76
-rw-r--r--source/blender/modifiers/intern/MOD_lattice.c16
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);