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:
authorAlexander Gavrilov <angavrilov@gmail.com>2019-08-31 20:27:19 +0300
committerAlexander Gavrilov <angavrilov@gmail.com>2019-08-31 20:53:32 +0300
commit883706395ee37188900e3ac2c00070c9a43246d2 (patch)
tree82032ccdfc7e845ccc63ecce80b85efc071b6e64 /source/blender/blenkernel/intern/fcurve.c
parenta5b1231de790e4cbf0d4dd62e30afcbc5d8a95f5 (diff)
Drivers: support accessing Quaternion rotation channels.
After adding the Euler order option, it's an easy addition to the enum. The list of channels had of course to be expanded too.
Diffstat (limited to 'source/blender/blenkernel/intern/fcurve.c')
-rw-r--r--source/blender/blenkernel/intern/fcurve.c23
1 files changed, 20 insertions, 3 deletions
diff --git a/source/blender/blenkernel/intern/fcurve.c b/source/blender/blenkernel/intern/fcurve.c
index dec410c8192..ef53c926daa 100644
--- a/source/blender/blenkernel/intern/fcurve.c
+++ b/source/blender/blenkernel/intern/fcurve.c
@@ -1714,7 +1714,10 @@ static float dvar_eval_transChan(ChannelDriver *driver, DriverVar *dvar)
* of scale over all three axes unless the matrix includes shear. */
return cbrtf(mat4_to_volume_scale(mat));
}
- else if (dtar->transChan >= DTAR_TRANSCHAN_SCALEX) {
+ else if (ELEM(dtar->transChan,
+ DTAR_TRANSCHAN_SCALEX,
+ DTAR_TRANSCHAN_SCALEY,
+ DTAR_TRANSCHAN_SCALEZ)) {
/* Extract scale, and choose the right axis,
* inline 'mat4_to_size'. */
return len_v3(mat[dtar->transChan - DTAR_TRANSCHAN_SCALEX]);
@@ -1728,7 +1731,18 @@ static float dvar_eval_transChan(ChannelDriver *driver, DriverVar *dvar)
* b) [NOT USED] directly use the original values (no decomposition)
* - only an option for "transform space", if quality is really bad with a)
*/
- float eul[3];
+ float quat[4];
+ float *const eul = quat + 1;
+ int channel;
+
+ if (dtar->transChan == DTAR_TRANSCHAN_ROTW) {
+ channel = 0;
+ quat[0] = 0.0f;
+ }
+ else {
+ channel = 1 + dtar->transChan - DTAR_TRANSCHAN_ROTX;
+ BLI_assert(channel < 4);
+ }
if (dtar->rotation_mode == DTAR_ROTMODE_AUTO) {
mat4_to_eulO(eul, rot_order, mat);
@@ -1741,12 +1755,15 @@ static float dvar_eval_transChan(ChannelDriver *driver, DriverVar *dvar)
dtar->rotation_mode <= DTAR_ROTMODE_EULER_MAX) {
mat4_to_eulO(eul, dtar->rotation_mode, mat);
}
+ else if (dtar->rotation_mode == DTAR_ROTMODE_QUATERNION) {
+ mat4_to_quat(quat, mat);
+ }
else {
BLI_assert(false);
zero_v3(eul);
}
- return eul[dtar->transChan - DTAR_TRANSCHAN_ROTX];
+ return quat[channel];
}
else {
/* extract location and choose right axis */