[cogl] quaternion: fix init_from_array and get_rotation_axis
- From: Robert Bragg <rbragg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [cogl] quaternion: fix init_from_array and get_rotation_axis
- Date: Wed, 27 Jul 2011 17:23:35 +0000 (UTC)
commit b8b37f6c41a7685f202278cba76fc85b0e2225b1
Author: Robert Bragg <robert linux intel com>
Date: Wed Jul 27 16:23:38 2011 +0100
quaternion: fix init_from_array and get_rotation_axis
In cogl_quaternion_init_from_array we were passing the address of the x
component as the destination for memcpy, but that was wrong at least
because w is actually the first member in the structure. Another
concern raised was whether it was safe to assume that there was no
padding within the CoglQuaternion struct with some compilers so we also
switch to explicitly indexing each element of the array we want to copy.
In practice I think it's pretty safe to assume that padding will only be
introduced to ensure members are naturally aligned, but being explicit
is readable and it can't hurt to be extra cautious.
Another good catch in bug #655228 was that in
cogl_quaternion_get_rotation_axis we had a copy and paste error at the
end where we finally extract the axis and we were repeatedly calculating
just the x component. Now we calculate the y and z components too.
Thanks to Bug #655228 for identifying these issues.
https://bugzilla.gnome.org/show_bug.cgi?id=655228
Reviewed-by: Neil Roberts <neil linux intel com>
cogl/cogl-quaternion.c | 9 ++++++---
1 files changed, 6 insertions(+), 3 deletions(-)
---
diff --git a/cogl/cogl-quaternion.c b/cogl/cogl-quaternion.c
index ff59720..9403fc7 100644
--- a/cogl/cogl-quaternion.c
+++ b/cogl/cogl-quaternion.c
@@ -121,7 +121,10 @@ void
cogl_quaternion_init_from_array (CoglQuaternion *quaternion,
const float *array)
{
- memcpy (&quaternion->x, array, sizeof (float) * 4);
+ quaternion->w = array[0];
+ quaternion->x = array[1];
+ quaternion->y = array[2];
+ quaternion->z = array[3];
}
void
@@ -389,8 +392,8 @@ cogl_quaternion_get_rotation_axis (const CoglQuaternion *quaternion,
one_over_sin_angle_over_2 = 1.0f / sqrtf (sin_half_angle_sqr);
vector->x = quaternion->x * one_over_sin_angle_over_2;
- vector->x = quaternion->x * one_over_sin_angle_over_2;
- vector->x = quaternion->x * one_over_sin_angle_over_2;
+ vector->y = quaternion->y * one_over_sin_angle_over_2;
+ vector->z = quaternion->z * one_over_sin_angle_over_2;
}
void
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]