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: 206386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet The following functions manipulate quaternions. 21c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletend: 22c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 23c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletfunction: rsQuaternionAdd 24336fc4b3fb2df22623d51d9bbb996d11cd69f16cVerena Beckhamversion: 9 23 25c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletret: void 2620b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouilletarg: rs_quaternion* q, "Destination quaternion to add to." 2720b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouilletarg: const rs_quaternion* rhs, "Quaternion to add." 2820b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouilletsummary: Add two quaternions 29c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletdescription: 3020b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouillet Adds two quaternions, i.e. <code>*q += *rhs;</code> 31c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletinline: 32e7fd36a8ed1cdaf939852c08835d5c6b8e0eca01Yang Ni q->w += rhs->w; 33e7fd36a8ed1cdaf939852c08835d5c6b8e0eca01Yang Ni q->x += rhs->x; 34e7fd36a8ed1cdaf939852c08835d5c6b8e0eca01Yang Ni q->y += rhs->y; 35e7fd36a8ed1cdaf939852c08835d5c6b8e0eca01Yang Ni q->z += rhs->z; 36c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillettest: none 37c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletend: 38c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 39c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletfunction: rsQuaternionConjugate 40336fc4b3fb2df22623d51d9bbb996d11cd69f16cVerena Beckhamversion: 9 23 41c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletret: void 4220b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouilletarg: rs_quaternion* q, "Quaternion to modify." 4320b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouilletsummary: Conjugate a quaternion 44c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletdescription: 4520b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouillet Conjugates the quaternion. 46c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletinline: 47c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet q->x = -q->x; 48c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet q->y = -q->y; 49c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet q->z = -q->z; 50c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillettest: none 51c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletend: 52c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 53c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletfunction: rsQuaternionDot 54336fc4b3fb2df22623d51d9bbb996d11cd69f16cVerena Beckhamversion: 9 23 5520b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouilletret: float 5620b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouilletarg: const rs_quaternion* q0, "First quaternion." 5720b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouilletarg: const rs_quaternion* q1, "Second quaternion." 5820b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouilletsummary: Dot product of two quaternions 59c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletdescription: 6020b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouillet Returns the dot product of two quaternions. 61c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletinline: 62c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet return q0->w*q1->w + q0->x*q1->x + q0->y*q1->y + q0->z*q1->z; 63c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillettest: none 64c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletend: 65c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 66c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletfunction: rsQuaternionGetMatrixUnit 67336fc4b3fb2df22623d51d9bbb996d11cd69f16cVerena Beckhamversion: 9 23 68c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletret: void 6920b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouilletarg: rs_matrix4x4* m, "Resulting matrix." 7020b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouilletarg: const rs_quaternion* q, "Normalized quaternion." 7120b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouilletsummary: Get a rotation matrix from a quaternion 72c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletdescription: 7320b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouillet Computes a rotation matrix from the normalized quaternion. 74c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletinline: 75c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet float xx = q->x * q->x; 76c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet float xy = q->x * q->y; 77c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet float xz = q->x * q->z; 78c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet float xw = q->x * q->w; 79c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet float yy = q->y * q->y; 80c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet float yz = q->y * q->z; 81c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet float yw = q->y * q->w; 82c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet float zz = q->z * q->z; 83c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet float zw = q->z * q->w; 84c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 85c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet m->m[0] = 1.0f - 2.0f * ( yy + zz ); 86c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet m->m[4] = 2.0f * ( xy - zw ); 87c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet m->m[8] = 2.0f * ( xz + yw ); 88c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet m->m[1] = 2.0f * ( xy + zw ); 89c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet m->m[5] = 1.0f - 2.0f * ( xx + zz ); 90c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet m->m[9] = 2.0f * ( yz - xw ); 91c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet m->m[2] = 2.0f * ( xz - yw ); 92c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet m->m[6] = 2.0f * ( yz + xw ); 93c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet m->m[10] = 1.0f - 2.0f * ( xx + yy ); 94c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet m->m[3] = m->m[7] = m->m[11] = m->m[12] = m->m[13] = m->m[14] = 0.0f; 95c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet m->m[15] = 1.0f; 96c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillettest: none 97c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletend: 98c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 99c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletfunction: rsQuaternionLoadRotateUnit 100336fc4b3fb2df22623d51d9bbb996d11cd69f16cVerena Beckhamversion: 9 23 101c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletret: void 10220b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouilletarg: rs_quaternion* q, "Destination quaternion." 10320b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouilletarg: float rot, "Angle to rotate by, in radians." 10420b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouilletarg: float x, "X component of the vector." 10520b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouilletarg: float y, "Y component of the vector." 10620b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouilletarg: float z, "Z component of the vector." 10720b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouilletsummary: Quaternion that represents a rotation about an arbitrary unit vector 108c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletdescription: 10920b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouillet Loads a quaternion that represents a rotation about an arbitrary unit vector. 110c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletinline: 111c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet rot *= (float)(M_PI / 180.0f) * 0.5f; 112c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet float c = cos(rot); 113c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet float s = sin(rot); 114c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 115c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet q->w = c; 116c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet q->x = x * s; 117c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet q->y = y * s; 118c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet q->z = z * s; 119c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillettest: none 120c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletend: 121c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 122c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletfunction: rsQuaternionSet 123336fc4b3fb2df22623d51d9bbb996d11cd69f16cVerena Beckhamversion: 9 23 124c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletret: void 12520b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouilletarg: rs_quaternion* q, "Destination quaternion." 12620b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouilletarg: float w, "W component." 12720b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouilletarg: float x, "X component." 12820b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouilletarg: float y, "Y component." 12920b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouilletarg: float z, "Z component." 1306386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouilletsummary: Create a quaternion 131c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletdescription: 13220b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouillet Creates a quaternion from its four components or from another quaternion. 133c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletinline: 134c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet q->w = w; 135c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet q->x = x; 136c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet q->y = y; 137c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet q->z = z; 138c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillettest: none 139c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletend: 140c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 141c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletfunction: rsQuaternionSet 142336fc4b3fb2df22623d51d9bbb996d11cd69f16cVerena Beckhamversion: 9 23 143c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletret: void 144c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletarg: rs_quaternion* q 14520b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouilletarg: const rs_quaternion* rhs, "Source quaternion." 146c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletinline: 147c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet q->w = rhs->w; 148c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet q->x = rhs->x; 149c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet q->y = rhs->y; 150c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet q->z = rhs->z; 151c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillettest: none 152c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletend: 153c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 154c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet# NOTE: The following inline definitions depend on each other. The order must be preserved 155c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet# for the compilation to work. 156c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 157c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletfunction: rsQuaternionLoadRotate 158336fc4b3fb2df22623d51d9bbb996d11cd69f16cVerena Beckhamversion: 9 23 159c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletret: void 16020b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouilletarg: rs_quaternion* q, "Destination quaternion." 16120b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouilletarg: float rot, "Angle to rotate by." 16220b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouilletarg: float x, "X component of a vector." 16320b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouilletarg: float y, "Y component of a vector." 16420b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouilletarg: float z, "Z component of a vector." 16520b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouilletsummary: Create a rotation quaternion 166c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletdescription: 167c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet Loads a quaternion that represents a rotation about an arbitrary vector 168c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet (doesn't have to be unit) 169c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletinline: 170c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet const float len = x*x + y*y + z*z; 171c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (len != 1) { 172c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet const float recipLen = 1.f / sqrt(len); 173c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet x *= recipLen; 174c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet y *= recipLen; 175c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet z *= recipLen; 176c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 177c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet rsQuaternionLoadRotateUnit(q, rot, x, y, z); 178c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillettest: none 179c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletend: 180c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 181c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletfunction: rsQuaternionNormalize 182336fc4b3fb2df22623d51d9bbb996d11cd69f16cVerena Beckhamversion: 9 23 183c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletret: void 18420b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouilletarg: rs_quaternion* q, "Quaternion to normalize." 18520b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouilletsummary: Normalize a quaternion 186c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletdescription: 18720b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouillet Normalizes the quaternion. 188c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletinline: 189c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet const float len = rsQuaternionDot(q, q); 190c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (len != 1) { 191c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet const float recipLen = 1.f / sqrt(len); 192c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet q->w *= recipLen; 193c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet q->x *= recipLen; 194c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet q->y *= recipLen; 195c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet q->z *= recipLen; 196c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 197c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillettest: none 198c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletend: 199c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 200c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletfunction: rsQuaternionMultiply 201336fc4b3fb2df22623d51d9bbb996d11cd69f16cVerena Beckhamversion: 9 23 202c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletret: void 20320b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouilletarg: rs_quaternion* q, "Destination quaternion." 2046386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouilletarg: float scalar, "Scalar to multiply the quaternion by." 20520b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouilletsummary: Multiply a quaternion by a scalar or another quaternion 206c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletdescription: 20720b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouillet Multiplies a quaternion by a scalar or by another quaternion, e.g 20820b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouillet <code>*q = *q * scalar;</code> or <code>*q = *q * *rhs;</code>. 209c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletinline: 21020b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouillet q->w *= scalar; 21120b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouillet q->x *= scalar; 21220b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouillet q->y *= scalar; 21320b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouillet q->z *= scalar; 214c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillettest: none 215c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletend: 216c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 217c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletfunction: rsQuaternionMultiply 218336fc4b3fb2df22623d51d9bbb996d11cd69f16cVerena Beckhamversion: 9 23 219c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletret: void 220c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletarg: rs_quaternion* q 2216386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouilletarg: const rs_quaternion* rhs, "Quaternion to multiply the destination quaternion by." 222c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletinline: 223c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet rs_quaternion qtmp; 224c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet rsQuaternionSet(&qtmp, q); 225c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 226c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet q->w = qtmp.w*rhs->w - qtmp.x*rhs->x - qtmp.y*rhs->y - qtmp.z*rhs->z; 227c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet q->x = qtmp.w*rhs->x + qtmp.x*rhs->w + qtmp.y*rhs->z - qtmp.z*rhs->y; 228c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet q->y = qtmp.w*rhs->y + qtmp.y*rhs->w + qtmp.z*rhs->x - qtmp.x*rhs->z; 229c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet q->z = qtmp.w*rhs->z + qtmp.z*rhs->w + qtmp.x*rhs->y - qtmp.y*rhs->x; 230c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet rsQuaternionNormalize(q); 231c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillettest: none 232c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletend: 233c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 234c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletfunction: rsQuaternionSlerp 235336fc4b3fb2df22623d51d9bbb996d11cd69f16cVerena Beckhamversion: 9 23 236c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletret: void 23720b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouilletarg: rs_quaternion* q, "Result quaternion from the interpolation." 23820b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouilletarg: const rs_quaternion* q0, "First input quaternion." 23920b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouilletarg: const rs_quaternion* q1, "Second input quaternion." 24020b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouilletarg: float t, "How much to interpolate by." 24120b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouilletsummary: Spherical linear interpolation between two quaternions 242c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletdescription: 24320b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouillet Performs spherical linear interpolation between two quaternions. 244c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletinline: 245c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (t <= 0.0f) { 246c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet rsQuaternionSet(q, q0); 247c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet return; 248c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 249c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (t >= 1.0f) { 250c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet rsQuaternionSet(q, q1); 251c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet return; 252c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 253c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 254c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet rs_quaternion tempq0, tempq1; 255c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet rsQuaternionSet(&tempq0, q0); 256c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet rsQuaternionSet(&tempq1, q1); 257c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 258c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet float angle = rsQuaternionDot(q0, q1); 259c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (angle < 0) { 260c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet rsQuaternionMultiply(&tempq0, -1.0f); 261c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet angle *= -1.0f; 262c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 263c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 264c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet float scale, invScale; 265c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (angle + 1.0f > 0.05f) { 266c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (1.0f - angle >= 0.05f) { 267c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet float theta = acos(angle); 268c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet float invSinTheta = 1.0f / sin(theta); 269c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet scale = sin(theta * (1.0f - t)) * invSinTheta; 270c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet invScale = sin(theta * t) * invSinTheta; 271c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } else { 272c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet scale = 1.0f - t; 273c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet invScale = t; 274c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 275c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } else { 276c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet rsQuaternionSet(&tempq1, tempq0.z, -tempq0.y, tempq0.x, -tempq0.w); 277c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet scale = sin(M_PI * (0.5f - t)); 278c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet invScale = sin(M_PI * t); 279c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 280c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 281c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet rsQuaternionSet(q, tempq0.w*scale + tempq1.w*invScale, tempq0.x*scale + tempq1.x*invScale, 282c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet tempq0.y*scale + tempq1.y*invScale, tempq0.z*scale + tempq1.z*invScale); 283c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillettest: none 284c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletend: 285336fc4b3fb2df22623d51d9bbb996d11cd69f16cVerena Beckham 286336fc4b3fb2df22623d51d9bbb996d11cd69f16cVerena Beckham# New versions. Same signatures but don't contain a body. 287336fc4b3fb2df22623d51d9bbb996d11cd69f16cVerena Beckhamfunction: rsQuaternionAdd 288b1bc853f19a2db925edbcfdd393b3a7def42604eStephen Hinesversion: 24 289336fc4b3fb2df22623d51d9bbb996d11cd69f16cVerena Beckhamret: void 290336fc4b3fb2df22623d51d9bbb996d11cd69f16cVerena Beckhamarg: rs_quaternion* q 291336fc4b3fb2df22623d51d9bbb996d11cd69f16cVerena Beckhamarg: const rs_quaternion* rhs 292336fc4b3fb2df22623d51d9bbb996d11cd69f16cVerena Beckhamtest: none 293336fc4b3fb2df22623d51d9bbb996d11cd69f16cVerena Beckhamend: 294336fc4b3fb2df22623d51d9bbb996d11cd69f16cVerena Beckham 295336fc4b3fb2df22623d51d9bbb996d11cd69f16cVerena Beckhamfunction: rsQuaternionConjugate 296b1bc853f19a2db925edbcfdd393b3a7def42604eStephen Hinesversion: 24 297336fc4b3fb2df22623d51d9bbb996d11cd69f16cVerena Beckhamret: void 298336fc4b3fb2df22623d51d9bbb996d11cd69f16cVerena Beckhamarg: rs_quaternion* q 299336fc4b3fb2df22623d51d9bbb996d11cd69f16cVerena Beckhamtest: none 300336fc4b3fb2df22623d51d9bbb996d11cd69f16cVerena Beckhamend: 301336fc4b3fb2df22623d51d9bbb996d11cd69f16cVerena Beckham 302336fc4b3fb2df22623d51d9bbb996d11cd69f16cVerena Beckhamfunction: rsQuaternionDot 303b1bc853f19a2db925edbcfdd393b3a7def42604eStephen Hinesversion: 24 304336fc4b3fb2df22623d51d9bbb996d11cd69f16cVerena Beckhamret: float 305336fc4b3fb2df22623d51d9bbb996d11cd69f16cVerena Beckhamarg: const rs_quaternion* q0 306336fc4b3fb2df22623d51d9bbb996d11cd69f16cVerena Beckhamarg: const rs_quaternion* q1 307336fc4b3fb2df22623d51d9bbb996d11cd69f16cVerena Beckhamtest: none 308336fc4b3fb2df22623d51d9bbb996d11cd69f16cVerena Beckhamend: 309336fc4b3fb2df22623d51d9bbb996d11cd69f16cVerena Beckham 310336fc4b3fb2df22623d51d9bbb996d11cd69f16cVerena Beckhamfunction: rsQuaternionGetMatrixUnit 311b1bc853f19a2db925edbcfdd393b3a7def42604eStephen Hinesversion: 24 312336fc4b3fb2df22623d51d9bbb996d11cd69f16cVerena Beckhamret: void 313336fc4b3fb2df22623d51d9bbb996d11cd69f16cVerena Beckhamarg: rs_matrix4x4* m 314336fc4b3fb2df22623d51d9bbb996d11cd69f16cVerena Beckhamarg: const rs_quaternion* q 315336fc4b3fb2df22623d51d9bbb996d11cd69f16cVerena Beckhamtest: none 316336fc4b3fb2df22623d51d9bbb996d11cd69f16cVerena Beckhamend: 317336fc4b3fb2df22623d51d9bbb996d11cd69f16cVerena Beckham 318336fc4b3fb2df22623d51d9bbb996d11cd69f16cVerena Beckhamfunction: rsQuaternionLoadRotateUnit 319b1bc853f19a2db925edbcfdd393b3a7def42604eStephen Hinesversion: 24 320336fc4b3fb2df22623d51d9bbb996d11cd69f16cVerena Beckhamret: void 321336fc4b3fb2df22623d51d9bbb996d11cd69f16cVerena Beckhamarg: rs_quaternion* q 322336fc4b3fb2df22623d51d9bbb996d11cd69f16cVerena Beckhamarg: float rot 323336fc4b3fb2df22623d51d9bbb996d11cd69f16cVerena Beckhamarg: float x 324336fc4b3fb2df22623d51d9bbb996d11cd69f16cVerena Beckhamarg: float y 325336fc4b3fb2df22623d51d9bbb996d11cd69f16cVerena Beckhamarg: float z 326336fc4b3fb2df22623d51d9bbb996d11cd69f16cVerena Beckhamtest: none 327336fc4b3fb2df22623d51d9bbb996d11cd69f16cVerena Beckhamend: 328336fc4b3fb2df22623d51d9bbb996d11cd69f16cVerena Beckham 329336fc4b3fb2df22623d51d9bbb996d11cd69f16cVerena Beckhamfunction: rsQuaternionSet 330b1bc853f19a2db925edbcfdd393b3a7def42604eStephen Hinesversion: 24 331336fc4b3fb2df22623d51d9bbb996d11cd69f16cVerena Beckhamret: void 332336fc4b3fb2df22623d51d9bbb996d11cd69f16cVerena Beckhamarg: rs_quaternion* q 333336fc4b3fb2df22623d51d9bbb996d11cd69f16cVerena Beckhamarg: float w 334336fc4b3fb2df22623d51d9bbb996d11cd69f16cVerena Beckhamarg: float x 335336fc4b3fb2df22623d51d9bbb996d11cd69f16cVerena Beckhamarg: float y 336336fc4b3fb2df22623d51d9bbb996d11cd69f16cVerena Beckhamarg: float z 337336fc4b3fb2df22623d51d9bbb996d11cd69f16cVerena Beckhamtest: none 338336fc4b3fb2df22623d51d9bbb996d11cd69f16cVerena Beckhamend: 339336fc4b3fb2df22623d51d9bbb996d11cd69f16cVerena Beckham 340336fc4b3fb2df22623d51d9bbb996d11cd69f16cVerena Beckhamfunction: rsQuaternionSet 341b1bc853f19a2db925edbcfdd393b3a7def42604eStephen Hinesversion: 24 342336fc4b3fb2df22623d51d9bbb996d11cd69f16cVerena Beckhamret: void 343336fc4b3fb2df22623d51d9bbb996d11cd69f16cVerena Beckhamarg: rs_quaternion* q 344336fc4b3fb2df22623d51d9bbb996d11cd69f16cVerena Beckhamarg: const rs_quaternion* rhs 345336fc4b3fb2df22623d51d9bbb996d11cd69f16cVerena Beckhamtest: none 346336fc4b3fb2df22623d51d9bbb996d11cd69f16cVerena Beckhamend: 347336fc4b3fb2df22623d51d9bbb996d11cd69f16cVerena Beckham 348336fc4b3fb2df22623d51d9bbb996d11cd69f16cVerena Beckham# NOTE: The following inline definitions depend on each other. The order must be preserved 349336fc4b3fb2df22623d51d9bbb996d11cd69f16cVerena Beckham# for the compilation to work. 350336fc4b3fb2df22623d51d9bbb996d11cd69f16cVerena Beckham 351336fc4b3fb2df22623d51d9bbb996d11cd69f16cVerena Beckhamfunction: rsQuaternionLoadRotate 352b1bc853f19a2db925edbcfdd393b3a7def42604eStephen Hinesversion: 24 353336fc4b3fb2df22623d51d9bbb996d11cd69f16cVerena Beckhamret: void 354336fc4b3fb2df22623d51d9bbb996d11cd69f16cVerena Beckhamarg: rs_quaternion* q 355336fc4b3fb2df22623d51d9bbb996d11cd69f16cVerena Beckhamarg: float rot 356336fc4b3fb2df22623d51d9bbb996d11cd69f16cVerena Beckhamarg: float x 357336fc4b3fb2df22623d51d9bbb996d11cd69f16cVerena Beckhamarg: float y 358336fc4b3fb2df22623d51d9bbb996d11cd69f16cVerena Beckhamarg: float z 359336fc4b3fb2df22623d51d9bbb996d11cd69f16cVerena Beckhamtest: none 360336fc4b3fb2df22623d51d9bbb996d11cd69f16cVerena Beckhamend: 361336fc4b3fb2df22623d51d9bbb996d11cd69f16cVerena Beckham 362336fc4b3fb2df22623d51d9bbb996d11cd69f16cVerena Beckhamfunction: rsQuaternionNormalize 363b1bc853f19a2db925edbcfdd393b3a7def42604eStephen Hinesversion: 24 364336fc4b3fb2df22623d51d9bbb996d11cd69f16cVerena Beckhamret: void 365336fc4b3fb2df22623d51d9bbb996d11cd69f16cVerena Beckhamarg: rs_quaternion* q 366336fc4b3fb2df22623d51d9bbb996d11cd69f16cVerena Beckhamtest: none 367336fc4b3fb2df22623d51d9bbb996d11cd69f16cVerena Beckhamend: 368336fc4b3fb2df22623d51d9bbb996d11cd69f16cVerena Beckham 369336fc4b3fb2df22623d51d9bbb996d11cd69f16cVerena Beckhamfunction: rsQuaternionMultiply 370b1bc853f19a2db925edbcfdd393b3a7def42604eStephen Hinesversion: 24 371336fc4b3fb2df22623d51d9bbb996d11cd69f16cVerena Beckhamret: void 372336fc4b3fb2df22623d51d9bbb996d11cd69f16cVerena Beckhamarg: rs_quaternion* q 373336fc4b3fb2df22623d51d9bbb996d11cd69f16cVerena Beckhamarg: float scalar 374336fc4b3fb2df22623d51d9bbb996d11cd69f16cVerena Beckhamtest: none 375336fc4b3fb2df22623d51d9bbb996d11cd69f16cVerena Beckhamend: 376336fc4b3fb2df22623d51d9bbb996d11cd69f16cVerena Beckham 377336fc4b3fb2df22623d51d9bbb996d11cd69f16cVerena Beckhamfunction: rsQuaternionMultiply 378b1bc853f19a2db925edbcfdd393b3a7def42604eStephen Hinesversion: 24 379336fc4b3fb2df22623d51d9bbb996d11cd69f16cVerena Beckhamret: void 380336fc4b3fb2df22623d51d9bbb996d11cd69f16cVerena Beckhamarg: rs_quaternion* q 381336fc4b3fb2df22623d51d9bbb996d11cd69f16cVerena Beckhamarg: const rs_quaternion* rhs 382336fc4b3fb2df22623d51d9bbb996d11cd69f16cVerena Beckhamtest: none 383336fc4b3fb2df22623d51d9bbb996d11cd69f16cVerena Beckhamend: 384336fc4b3fb2df22623d51d9bbb996d11cd69f16cVerena Beckham 385336fc4b3fb2df22623d51d9bbb996d11cd69f16cVerena Beckhamfunction: rsQuaternionSlerp 386b1bc853f19a2db925edbcfdd393b3a7def42604eStephen Hinesversion: 24 387336fc4b3fb2df22623d51d9bbb996d11cd69f16cVerena Beckhamret: void 388336fc4b3fb2df22623d51d9bbb996d11cd69f16cVerena Beckhamarg: rs_quaternion* q 389336fc4b3fb2df22623d51d9bbb996d11cd69f16cVerena Beckhamarg: const rs_quaternion* q0 390336fc4b3fb2df22623d51d9bbb996d11cd69f16cVerena Beckhamarg: const rs_quaternion* q1 391336fc4b3fb2df22623d51d9bbb996d11cd69f16cVerena Beckhamarg: float t 392336fc4b3fb2df22623d51d9bbb996d11cd69f16cVerena Beckhamtest: none 393336fc4b3fb2df22623d51d9bbb996d11cd69f16cVerena Beckhamend: 394