rs_quaternion.spec revision 20b27d602a4778ed50a83df2147416a35b7c92be
1c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet# 2c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet# Copyright (C) 2015 The Android Open Source Project 3c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet# 4c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet# Licensed under the Apache License, Version 2.0 (the "License"); 5c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet# you may not use this file except in compliance with the License. 6c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet# You may obtain a copy of the License at 7c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet# 8c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet# http://www.apache.org/licenses/LICENSE-2.0 9c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet# 10c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet# Unless required by applicable law or agreed to in writing, software 11c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet# distributed under the License is distributed on an "AS IS" BASIS, 12c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet# See the License for the specific language governing permissions and 14c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet# limitations under the License. 15c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet# 16c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 17c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletheader: 1820b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouilletsummary: Quaternion Functions 19c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletdescription: 20c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletend: 21c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 22c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletfunction: rsQuaternionAdd 23c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletret: void 2420b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouilletarg: rs_quaternion* q, "Destination quaternion to add to." 2520b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouilletarg: const rs_quaternion* rhs, "Quaternion to add." 2620b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouilletsummary: Add two quaternions 27c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletdescription: 2820b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouillet Adds two quaternions, i.e. <code>*q += *rhs;</code> 29c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletinline: 30c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet q->w *= rhs->w; 31c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet q->x *= rhs->x; 32c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet q->y *= rhs->y; 33c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet q->z *= rhs->z; 34c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillettest: none 35c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletend: 36c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 37c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletfunction: rsQuaternionConjugate 38c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletret: void 3920b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouilletarg: rs_quaternion* q, "Quaternion to modify." 4020b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouilletsummary: Conjugate a quaternion 41c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletdescription: 4220b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouillet Conjugates the quaternion. 43c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletinline: 44c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet q->x = -q->x; 45c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet q->y = -q->y; 46c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet q->z = -q->z; 47c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillettest: none 48c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletend: 49c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 50c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletfunction: rsQuaternionDot 5120b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouilletret: float 5220b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouilletarg: const rs_quaternion* q0, "First quaternion." 5320b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouilletarg: const rs_quaternion* q1, "Second quaternion." 5420b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouilletsummary: Dot product of two quaternions 55c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletdescription: 5620b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouillet Returns the dot product of two quaternions. 57c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletinline: 58c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet return q0->w*q1->w + q0->x*q1->x + q0->y*q1->y + q0->z*q1->z; 59c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillettest: none 60c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletend: 61c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 62c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletfunction: rsQuaternionGetMatrixUnit 63c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletret: void 6420b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouilletarg: rs_matrix4x4* m, "Resulting matrix." 6520b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouilletarg: const rs_quaternion* q, "Normalized quaternion." 6620b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouilletsummary: Get a rotation matrix from a quaternion 67c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletdescription: 6820b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouillet Computes a rotation matrix from the normalized quaternion. 69c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletinline: 70c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet float xx = q->x * q->x; 71c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet float xy = q->x * q->y; 72c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet float xz = q->x * q->z; 73c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet float xw = q->x * q->w; 74c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet float yy = q->y * q->y; 75c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet float yz = q->y * q->z; 76c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet float yw = q->y * q->w; 77c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet float zz = q->z * q->z; 78c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet float zw = q->z * q->w; 79c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 80c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet m->m[0] = 1.0f - 2.0f * ( yy + zz ); 81c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet m->m[4] = 2.0f * ( xy - zw ); 82c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet m->m[8] = 2.0f * ( xz + yw ); 83c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet m->m[1] = 2.0f * ( xy + zw ); 84c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet m->m[5] = 1.0f - 2.0f * ( xx + zz ); 85c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet m->m[9] = 2.0f * ( yz - xw ); 86c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet m->m[2] = 2.0f * ( xz - yw ); 87c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet m->m[6] = 2.0f * ( yz + xw ); 88c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet m->m[10] = 1.0f - 2.0f * ( xx + yy ); 89c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet m->m[3] = m->m[7] = m->m[11] = m->m[12] = m->m[13] = m->m[14] = 0.0f; 90c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet m->m[15] = 1.0f; 91c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillettest: none 92c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletend: 93c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 94c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletfunction: rsQuaternionLoadRotateUnit 95c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletret: void 9620b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouilletarg: rs_quaternion* q, "Destination quaternion." 9720b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouilletarg: float rot, "Angle to rotate by, in radians." 9820b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouilletarg: float x, "X component of the vector." 9920b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouilletarg: float y, "Y component of the vector." 10020b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouilletarg: float z, "Z component of the vector." 10120b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouilletsummary: Quaternion that represents a rotation about an arbitrary unit vector 102c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletdescription: 10320b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouillet Loads a quaternion that represents a rotation about an arbitrary unit vector. 104c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletinline: 105c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet rot *= (float)(M_PI / 180.0f) * 0.5f; 106c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet float c = cos(rot); 107c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet float s = sin(rot); 108c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 109c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet q->w = c; 110c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet q->x = x * s; 111c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet q->y = y * s; 112c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet q->z = z * s; 113c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillettest: none 114c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletend: 115c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 116c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletfunction: rsQuaternionSet 117c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletret: void 11820b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouilletarg: rs_quaternion* q, "Destination quaternion." 11920b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouilletarg: float w, "W component." 12020b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouilletarg: float x, "X component." 12120b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouilletarg: float y, "Y component." 12220b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouilletarg: float z, "Z component." 12320b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouilletsummary: Create a quarternion 124c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletdescription: 12520b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouillet Creates a quaternion from its four components or from another quaternion. 126c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletinline: 127c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet q->w = w; 128c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet q->x = x; 129c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet q->y = y; 130c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet q->z = z; 131c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillettest: none 132c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletend: 133c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 134c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletfunction: rsQuaternionSet 135c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletret: void 136c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletarg: rs_quaternion* q 13720b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouilletarg: const rs_quaternion* rhs, "Source quaternion." 138c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletinline: 139c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet q->w = rhs->w; 140c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet q->x = rhs->x; 141c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet q->y = rhs->y; 142c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet q->z = rhs->z; 143c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillettest: none 144c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletend: 145c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 146c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet# NOTE: The following inline definitions depend on each other. The order must be preserved 147c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet# for the compilation to work. 148c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 149c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletfunction: rsQuaternionLoadRotate 150c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletret: void 15120b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouilletarg: rs_quaternion* q, "Destination quaternion." 15220b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouilletarg: float rot, "Angle to rotate by." 15320b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouilletarg: float x, "X component of a vector." 15420b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouilletarg: float y, "Y component of a vector." 15520b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouilletarg: float z, "Z component of a vector." 15620b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouilletsummary: Create a rotation quaternion 157c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletdescription: 158c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet Loads a quaternion that represents a rotation about an arbitrary vector 159c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet (doesn't have to be unit) 160c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletinline: 161c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet const float len = x*x + y*y + z*z; 162c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (len != 1) { 163c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet const float recipLen = 1.f / sqrt(len); 164c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet x *= recipLen; 165c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet y *= recipLen; 166c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet z *= recipLen; 167c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 168c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet rsQuaternionLoadRotateUnit(q, rot, x, y, z); 169c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillettest: none 170c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletend: 171c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 172c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletfunction: rsQuaternionNormalize 173c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletret: void 17420b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouilletarg: rs_quaternion* q, "Quaternion to normalize." 17520b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouilletsummary: Normalize a quaternion 176c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletdescription: 17720b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouillet Normalizes the quaternion. 178c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletinline: 179c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet const float len = rsQuaternionDot(q, q); 180c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (len != 1) { 181c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet const float recipLen = 1.f / sqrt(len); 182c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet q->w *= recipLen; 183c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet q->x *= recipLen; 184c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet q->y *= recipLen; 185c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet q->z *= recipLen; 186c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 187c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillettest: none 188c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletend: 189c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 190c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletfunction: rsQuaternionMultiply 191c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletret: void 19220b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouilletarg: rs_quaternion* q, "Destination quaternion." 19320b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouilletarg: float scalar, "Scalar to multiply the quarternion by." 19420b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouilletsummary: Multiply a quaternion by a scalar or another quaternion 195c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletdescription: 19620b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouillet Multiplies a quaternion by a scalar or by another quaternion, e.g 19720b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouillet <code>*q = *q * scalar;</code> or <code>*q = *q * *rhs;</code>. 198c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletinline: 19920b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouillet q->w *= scalar; 20020b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouillet q->x *= scalar; 20120b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouillet q->y *= scalar; 20220b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouillet q->z *= scalar; 203c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillettest: none 204c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletend: 205c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 206c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletfunction: rsQuaternionMultiply 207c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletret: void 208c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletarg: rs_quaternion* q 20920b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouilletarg: const rs_quaternion* rhs, "Quarternion to multiply the destination quaternion by." 210c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletinline: 211c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet rs_quaternion qtmp; 212c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet rsQuaternionSet(&qtmp, q); 213c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 214c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet q->w = qtmp.w*rhs->w - qtmp.x*rhs->x - qtmp.y*rhs->y - qtmp.z*rhs->z; 215c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet q->x = qtmp.w*rhs->x + qtmp.x*rhs->w + qtmp.y*rhs->z - qtmp.z*rhs->y; 216c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet q->y = qtmp.w*rhs->y + qtmp.y*rhs->w + qtmp.z*rhs->x - qtmp.x*rhs->z; 217c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet q->z = qtmp.w*rhs->z + qtmp.z*rhs->w + qtmp.x*rhs->y - qtmp.y*rhs->x; 218c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet rsQuaternionNormalize(q); 219c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillettest: none 220c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletend: 221c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 222c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletfunction: rsQuaternionSlerp 223c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletret: void 22420b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouilletarg: rs_quaternion* q, "Result quaternion from the interpolation." 22520b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouilletarg: const rs_quaternion* q0, "First input quaternion." 22620b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouilletarg: const rs_quaternion* q1, "Second input quaternion." 22720b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouilletarg: float t, "How much to interpolate by." 22820b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouilletsummary: Spherical linear interpolation between two quaternions 229c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletdescription: 23020b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouillet Performs spherical linear interpolation between two quaternions. 231c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletinline: 232c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (t <= 0.0f) { 233c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet rsQuaternionSet(q, q0); 234c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet return; 235c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 236c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (t >= 1.0f) { 237c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet rsQuaternionSet(q, q1); 238c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet return; 239c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 240c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 241c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet rs_quaternion tempq0, tempq1; 242c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet rsQuaternionSet(&tempq0, q0); 243c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet rsQuaternionSet(&tempq1, q1); 244c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 245c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet float angle = rsQuaternionDot(q0, q1); 246c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (angle < 0) { 247c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet rsQuaternionMultiply(&tempq0, -1.0f); 248c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet angle *= -1.0f; 249c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 250c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 251c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet float scale, invScale; 252c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (angle + 1.0f > 0.05f) { 253c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (1.0f - angle >= 0.05f) { 254c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet float theta = acos(angle); 255c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet float invSinTheta = 1.0f / sin(theta); 256c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet scale = sin(theta * (1.0f - t)) * invSinTheta; 257c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet invScale = sin(theta * t) * invSinTheta; 258c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } else { 259c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet scale = 1.0f - t; 260c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet invScale = t; 261c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 262c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } else { 263c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet rsQuaternionSet(&tempq1, tempq0.z, -tempq0.y, tempq0.x, -tempq0.w); 264c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet scale = sin(M_PI * (0.5f - t)); 265c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet invScale = sin(M_PI * t); 266c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 267c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 268c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet rsQuaternionSet(q, tempq0.w*scale + tempq1.w*invScale, tempq0.x*scale + tempq1.x*invScale, 269c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet tempq0.y*scale + tempq1.y*invScale, tempq0.z*scale + tempq1.z*invScale); 270c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillettest: none 271c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletend: 272