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