1*35238bceSAndroid Build Coastguard Worker #ifndef _TCUVECTORUTIL_HPP
2*35238bceSAndroid Build Coastguard Worker #define _TCUVECTORUTIL_HPP
3*35238bceSAndroid Build Coastguard Worker /*-------------------------------------------------------------------------
4*35238bceSAndroid Build Coastguard Worker * drawElements Quality Program Tester Core
5*35238bceSAndroid Build Coastguard Worker * ----------------------------------------
6*35238bceSAndroid Build Coastguard Worker *
7*35238bceSAndroid Build Coastguard Worker * Copyright 2014 The Android Open Source Project
8*35238bceSAndroid Build Coastguard Worker *
9*35238bceSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
10*35238bceSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
11*35238bceSAndroid Build Coastguard Worker * You may obtain a copy of the License at
12*35238bceSAndroid Build Coastguard Worker *
13*35238bceSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
14*35238bceSAndroid Build Coastguard Worker *
15*35238bceSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
16*35238bceSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
17*35238bceSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18*35238bceSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
19*35238bceSAndroid Build Coastguard Worker * limitations under the License.
20*35238bceSAndroid Build Coastguard Worker *
21*35238bceSAndroid Build Coastguard Worker *//*!
22*35238bceSAndroid Build Coastguard Worker * \file
23*35238bceSAndroid Build Coastguard Worker * \brief Vector utility functions.
24*35238bceSAndroid Build Coastguard Worker *//*--------------------------------------------------------------------*/
25*35238bceSAndroid Build Coastguard Worker
26*35238bceSAndroid Build Coastguard Worker #include "tcuDefs.hpp"
27*35238bceSAndroid Build Coastguard Worker #include "tcuVector.hpp"
28*35238bceSAndroid Build Coastguard Worker #include "deRandom.hpp"
29*35238bceSAndroid Build Coastguard Worker #include "deMeta.hpp"
30*35238bceSAndroid Build Coastguard Worker #include "deMath.h"
31*35238bceSAndroid Build Coastguard Worker #include "deInt32.h"
32*35238bceSAndroid Build Coastguard Worker
33*35238bceSAndroid Build Coastguard Worker #include <ostream>
34*35238bceSAndroid Build Coastguard Worker #include <math.h>
35*35238bceSAndroid Build Coastguard Worker
36*35238bceSAndroid Build Coastguard Worker namespace tcu
37*35238bceSAndroid Build Coastguard Worker {
38*35238bceSAndroid Build Coastguard Worker
39*35238bceSAndroid Build Coastguard Worker static const float PI = 3.141592653589793238f;
40*35238bceSAndroid Build Coastguard Worker
41*35238bceSAndroid Build Coastguard Worker #if (DE_OS == DE_OS_ANDROID) || (DE_OS == DE_OS_UNIX) || (DE_OS == DE_OS_QNX) || \
42*35238bceSAndroid Build Coastguard Worker (DE_OS == DE_OS_WIN32 && DE_COMPILER == DE_COMPILER_CLANG)
abs(float f)43*35238bceSAndroid Build Coastguard Worker inline float abs(float f)
44*35238bceSAndroid Build Coastguard Worker {
45*35238bceSAndroid Build Coastguard Worker return deFloatAbs(f);
46*35238bceSAndroid Build Coastguard Worker }
47*35238bceSAndroid Build Coastguard Worker #endif
48*35238bceSAndroid Build Coastguard Worker
49*35238bceSAndroid Build Coastguard Worker template <typename T>
add(T a,T b)50*35238bceSAndroid Build Coastguard Worker inline T add(T a, T b)
51*35238bceSAndroid Build Coastguard Worker {
52*35238bceSAndroid Build Coastguard Worker return a + b;
53*35238bceSAndroid Build Coastguard Worker }
54*35238bceSAndroid Build Coastguard Worker template <typename T>
sub(T a,T b)55*35238bceSAndroid Build Coastguard Worker inline T sub(T a, T b)
56*35238bceSAndroid Build Coastguard Worker {
57*35238bceSAndroid Build Coastguard Worker return a - b;
58*35238bceSAndroid Build Coastguard Worker }
59*35238bceSAndroid Build Coastguard Worker template <typename T>
mul(T a,T b)60*35238bceSAndroid Build Coastguard Worker inline T mul(T a, T b)
61*35238bceSAndroid Build Coastguard Worker {
62*35238bceSAndroid Build Coastguard Worker return a * b;
63*35238bceSAndroid Build Coastguard Worker }
64*35238bceSAndroid Build Coastguard Worker template <typename T>
div(T a,T b)65*35238bceSAndroid Build Coastguard Worker inline T div(T a, T b)
66*35238bceSAndroid Build Coastguard Worker {
67*35238bceSAndroid Build Coastguard Worker return a / b;
68*35238bceSAndroid Build Coastguard Worker }
69*35238bceSAndroid Build Coastguard Worker
70*35238bceSAndroid Build Coastguard Worker template <typename T>
bitwiseNot(T a)71*35238bceSAndroid Build Coastguard Worker inline T bitwiseNot(T a)
72*35238bceSAndroid Build Coastguard Worker {
73*35238bceSAndroid Build Coastguard Worker return ~a;
74*35238bceSAndroid Build Coastguard Worker }
75*35238bceSAndroid Build Coastguard Worker template <typename T>
bitwiseAnd(T a,T b)76*35238bceSAndroid Build Coastguard Worker inline T bitwiseAnd(T a, T b)
77*35238bceSAndroid Build Coastguard Worker {
78*35238bceSAndroid Build Coastguard Worker return a & b;
79*35238bceSAndroid Build Coastguard Worker }
80*35238bceSAndroid Build Coastguard Worker template <typename T>
bitwiseOr(T a,T b)81*35238bceSAndroid Build Coastguard Worker inline T bitwiseOr(T a, T b)
82*35238bceSAndroid Build Coastguard Worker {
83*35238bceSAndroid Build Coastguard Worker return a | b;
84*35238bceSAndroid Build Coastguard Worker }
85*35238bceSAndroid Build Coastguard Worker template <typename T>
bitwiseXor(T a,T b)86*35238bceSAndroid Build Coastguard Worker inline T bitwiseXor(T a, T b)
87*35238bceSAndroid Build Coastguard Worker {
88*35238bceSAndroid Build Coastguard Worker return a ^ b;
89*35238bceSAndroid Build Coastguard Worker }
90*35238bceSAndroid Build Coastguard Worker
91*35238bceSAndroid Build Coastguard Worker template <typename T>
logicalNot(T a)92*35238bceSAndroid Build Coastguard Worker inline T logicalNot(T a)
93*35238bceSAndroid Build Coastguard Worker {
94*35238bceSAndroid Build Coastguard Worker return !a;
95*35238bceSAndroid Build Coastguard Worker }
96*35238bceSAndroid Build Coastguard Worker template <typename T>
logicalAnd(T a,T b)97*35238bceSAndroid Build Coastguard Worker inline T logicalAnd(T a, T b)
98*35238bceSAndroid Build Coastguard Worker {
99*35238bceSAndroid Build Coastguard Worker return a && b;
100*35238bceSAndroid Build Coastguard Worker }
101*35238bceSAndroid Build Coastguard Worker template <typename T>
logicalOr(T a,T b)102*35238bceSAndroid Build Coastguard Worker inline T logicalOr(T a, T b)
103*35238bceSAndroid Build Coastguard Worker {
104*35238bceSAndroid Build Coastguard Worker return a || b;
105*35238bceSAndroid Build Coastguard Worker }
106*35238bceSAndroid Build Coastguard Worker
107*35238bceSAndroid Build Coastguard Worker template <typename T>
mod(T a,T b)108*35238bceSAndroid Build Coastguard Worker inline T mod(T a, T b)
109*35238bceSAndroid Build Coastguard Worker {
110*35238bceSAndroid Build Coastguard Worker return a % b;
111*35238bceSAndroid Build Coastguard Worker }
112*35238bceSAndroid Build Coastguard Worker template <>
mod(float x,float y)113*35238bceSAndroid Build Coastguard Worker inline float mod(float x, float y)
114*35238bceSAndroid Build Coastguard Worker {
115*35238bceSAndroid Build Coastguard Worker return x - y * deFloatFloor(x / y);
116*35238bceSAndroid Build Coastguard Worker }
117*35238bceSAndroid Build Coastguard Worker
118*35238bceSAndroid Build Coastguard Worker template <typename T>
negate(T f)119*35238bceSAndroid Build Coastguard Worker inline T negate(T f)
120*35238bceSAndroid Build Coastguard Worker {
121*35238bceSAndroid Build Coastguard Worker return -f;
122*35238bceSAndroid Build Coastguard Worker }
123*35238bceSAndroid Build Coastguard Worker template <>
negate(uint32_t f)124*35238bceSAndroid Build Coastguard Worker inline uint32_t negate<uint32_t>(uint32_t f)
125*35238bceSAndroid Build Coastguard Worker {
126*35238bceSAndroid Build Coastguard Worker return (uint32_t) - (int)f;
127*35238bceSAndroid Build Coastguard Worker }
128*35238bceSAndroid Build Coastguard Worker
radians(float f)129*35238bceSAndroid Build Coastguard Worker inline float radians(float f)
130*35238bceSAndroid Build Coastguard Worker {
131*35238bceSAndroid Build Coastguard Worker return deFloatRadians(f);
132*35238bceSAndroid Build Coastguard Worker }
degrees(float f)133*35238bceSAndroid Build Coastguard Worker inline float degrees(float f)
134*35238bceSAndroid Build Coastguard Worker {
135*35238bceSAndroid Build Coastguard Worker return deFloatDegrees(f);
136*35238bceSAndroid Build Coastguard Worker }
inverseSqrt(float f)137*35238bceSAndroid Build Coastguard Worker inline float inverseSqrt(float f)
138*35238bceSAndroid Build Coastguard Worker {
139*35238bceSAndroid Build Coastguard Worker return deFloatRsq(f);
140*35238bceSAndroid Build Coastguard Worker }
sign(float f)141*35238bceSAndroid Build Coastguard Worker inline float sign(float f)
142*35238bceSAndroid Build Coastguard Worker {
143*35238bceSAndroid Build Coastguard Worker return (f < 0.0f) ? -1.0f : ((f > 0.0f) ? +1.0f : 0.0f);
144*35238bceSAndroid Build Coastguard Worker }
fract(float f)145*35238bceSAndroid Build Coastguard Worker inline float fract(float f)
146*35238bceSAndroid Build Coastguard Worker {
147*35238bceSAndroid Build Coastguard Worker return f - deFloatFloor(f);
148*35238bceSAndroid Build Coastguard Worker }
mix(float x,float y,float a)149*35238bceSAndroid Build Coastguard Worker inline float mix(float x, float y, float a)
150*35238bceSAndroid Build Coastguard Worker {
151*35238bceSAndroid Build Coastguard Worker return x * (1.0f - a) + y * a;
152*35238bceSAndroid Build Coastguard Worker }
step(float edge,float x)153*35238bceSAndroid Build Coastguard Worker inline float step(float edge, float x)
154*35238bceSAndroid Build Coastguard Worker {
155*35238bceSAndroid Build Coastguard Worker return (x < edge) ? 0.0f : 1.0f;
156*35238bceSAndroid Build Coastguard Worker }
smoothStep(float edge0,float edge1,float x)157*35238bceSAndroid Build Coastguard Worker inline float smoothStep(float edge0, float edge1, float x)
158*35238bceSAndroid Build Coastguard Worker {
159*35238bceSAndroid Build Coastguard Worker if (x <= edge0)
160*35238bceSAndroid Build Coastguard Worker return 0.0f;
161*35238bceSAndroid Build Coastguard Worker if (x >= edge1)
162*35238bceSAndroid Build Coastguard Worker return 1.0f;
163*35238bceSAndroid Build Coastguard Worker float t = de::clamp((x - edge0) / (edge1 - edge0), 0.0f, 1.0f);
164*35238bceSAndroid Build Coastguard Worker return t * t * (3.0f - 2.0f * t);
165*35238bceSAndroid Build Coastguard Worker }
166*35238bceSAndroid Build Coastguard Worker
mix(double x,double y,double a)167*35238bceSAndroid Build Coastguard Worker inline double mix(double x, double y, double a)
168*35238bceSAndroid Build Coastguard Worker {
169*35238bceSAndroid Build Coastguard Worker return x * (1.0 - a) + y * a;
170*35238bceSAndroid Build Coastguard Worker }
step(double edge,double x)171*35238bceSAndroid Build Coastguard Worker inline double step(double edge, double x)
172*35238bceSAndroid Build Coastguard Worker {
173*35238bceSAndroid Build Coastguard Worker return (x < edge) ? 0.0 : 1.0;
174*35238bceSAndroid Build Coastguard Worker }
175*35238bceSAndroid Build Coastguard Worker
length(float f)176*35238bceSAndroid Build Coastguard Worker inline float length(float f)
177*35238bceSAndroid Build Coastguard Worker {
178*35238bceSAndroid Build Coastguard Worker return deFloatAbs(f);
179*35238bceSAndroid Build Coastguard Worker }
distance(float x,float y)180*35238bceSAndroid Build Coastguard Worker inline float distance(float x, float y)
181*35238bceSAndroid Build Coastguard Worker {
182*35238bceSAndroid Build Coastguard Worker return deFloatAbs(x - y);
183*35238bceSAndroid Build Coastguard Worker }
dot(float x,float y)184*35238bceSAndroid Build Coastguard Worker inline float dot(float x, float y)
185*35238bceSAndroid Build Coastguard Worker {
186*35238bceSAndroid Build Coastguard Worker return (x * y);
187*35238bceSAndroid Build Coastguard Worker }
188*35238bceSAndroid Build Coastguard Worker
normalize(float f)189*35238bceSAndroid Build Coastguard Worker inline float normalize(float f)
190*35238bceSAndroid Build Coastguard Worker {
191*35238bceSAndroid Build Coastguard Worker return sign(f);
192*35238bceSAndroid Build Coastguard Worker }
faceForward(float n,float i,float ref)193*35238bceSAndroid Build Coastguard Worker inline float faceForward(float n, float i, float ref)
194*35238bceSAndroid Build Coastguard Worker {
195*35238bceSAndroid Build Coastguard Worker return ((ref * i) < 0.0f) ? n : -n;
196*35238bceSAndroid Build Coastguard Worker }
reflect(float i,float n)197*35238bceSAndroid Build Coastguard Worker inline float reflect(float i, float n)
198*35238bceSAndroid Build Coastguard Worker {
199*35238bceSAndroid Build Coastguard Worker return i - 2.0f * (n * i) * n;
200*35238bceSAndroid Build Coastguard Worker }
refract(float i,float n,float eta)201*35238bceSAndroid Build Coastguard Worker inline float refract(float i, float n, float eta)
202*35238bceSAndroid Build Coastguard Worker {
203*35238bceSAndroid Build Coastguard Worker float cosAngle = (n * i);
204*35238bceSAndroid Build Coastguard Worker float k = 1.0f - eta * eta * (1.0f - cosAngle * cosAngle);
205*35238bceSAndroid Build Coastguard Worker if (k < 0.0f)
206*35238bceSAndroid Build Coastguard Worker return 0.0f;
207*35238bceSAndroid Build Coastguard Worker else
208*35238bceSAndroid Build Coastguard Worker return eta * i - (eta * cosAngle + deFloatSqrt(k)) * n;
209*35238bceSAndroid Build Coastguard Worker }
210*35238bceSAndroid Build Coastguard Worker
211*35238bceSAndroid Build Coastguard Worker template <typename T>
lessThan(T a,T b)212*35238bceSAndroid Build Coastguard Worker inline bool lessThan(T a, T b)
213*35238bceSAndroid Build Coastguard Worker {
214*35238bceSAndroid Build Coastguard Worker return (a < b);
215*35238bceSAndroid Build Coastguard Worker }
216*35238bceSAndroid Build Coastguard Worker template <typename T>
lessThanEqual(T a,T b)217*35238bceSAndroid Build Coastguard Worker inline bool lessThanEqual(T a, T b)
218*35238bceSAndroid Build Coastguard Worker {
219*35238bceSAndroid Build Coastguard Worker return (a <= b);
220*35238bceSAndroid Build Coastguard Worker }
221*35238bceSAndroid Build Coastguard Worker template <typename T>
greaterThan(T a,T b)222*35238bceSAndroid Build Coastguard Worker inline bool greaterThan(T a, T b)
223*35238bceSAndroid Build Coastguard Worker {
224*35238bceSAndroid Build Coastguard Worker return (a > b);
225*35238bceSAndroid Build Coastguard Worker }
226*35238bceSAndroid Build Coastguard Worker template <typename T>
greaterThanEqual(T a,T b)227*35238bceSAndroid Build Coastguard Worker inline bool greaterThanEqual(T a, T b)
228*35238bceSAndroid Build Coastguard Worker {
229*35238bceSAndroid Build Coastguard Worker return (a >= b);
230*35238bceSAndroid Build Coastguard Worker }
231*35238bceSAndroid Build Coastguard Worker template <typename T>
equal(T a,T b)232*35238bceSAndroid Build Coastguard Worker inline bool equal(T a, T b)
233*35238bceSAndroid Build Coastguard Worker {
234*35238bceSAndroid Build Coastguard Worker return (a == b);
235*35238bceSAndroid Build Coastguard Worker }
236*35238bceSAndroid Build Coastguard Worker template <typename T>
notEqual(T a,T b)237*35238bceSAndroid Build Coastguard Worker inline bool notEqual(T a, T b)
238*35238bceSAndroid Build Coastguard Worker {
239*35238bceSAndroid Build Coastguard Worker return (a != b);
240*35238bceSAndroid Build Coastguard Worker }
241*35238bceSAndroid Build Coastguard Worker template <typename T>
allEqual(T a,T b)242*35238bceSAndroid Build Coastguard Worker inline bool allEqual(T a, T b)
243*35238bceSAndroid Build Coastguard Worker {
244*35238bceSAndroid Build Coastguard Worker return (a == b);
245*35238bceSAndroid Build Coastguard Worker }
246*35238bceSAndroid Build Coastguard Worker template <typename T>
anyNotEqual(T a,T b)247*35238bceSAndroid Build Coastguard Worker inline bool anyNotEqual(T a, T b)
248*35238bceSAndroid Build Coastguard Worker {
249*35238bceSAndroid Build Coastguard Worker return (a != b);
250*35238bceSAndroid Build Coastguard Worker }
251*35238bceSAndroid Build Coastguard Worker
boolNot(bool a)252*35238bceSAndroid Build Coastguard Worker inline bool boolNot(bool a)
253*35238bceSAndroid Build Coastguard Worker {
254*35238bceSAndroid Build Coastguard Worker return !a;
255*35238bceSAndroid Build Coastguard Worker }
256*35238bceSAndroid Build Coastguard Worker
chopToInt(float a)257*35238bceSAndroid Build Coastguard Worker inline int chopToInt(float a)
258*35238bceSAndroid Build Coastguard Worker {
259*35238bceSAndroid Build Coastguard Worker return deChopFloatToInt32(a);
260*35238bceSAndroid Build Coastguard Worker }
261*35238bceSAndroid Build Coastguard Worker
roundToEven(float a)262*35238bceSAndroid Build Coastguard Worker inline float roundToEven(float a)
263*35238bceSAndroid Build Coastguard Worker {
264*35238bceSAndroid Build Coastguard Worker float q = deFloatFrac(a);
265*35238bceSAndroid Build Coastguard Worker float r = a - q;
266*35238bceSAndroid Build Coastguard Worker
267*35238bceSAndroid Build Coastguard Worker if (q > 0.5f)
268*35238bceSAndroid Build Coastguard Worker r += 1.0f;
269*35238bceSAndroid Build Coastguard Worker else if (q == 0.5 && (((int)r) % 2 != 0))
270*35238bceSAndroid Build Coastguard Worker r += 1.0f;
271*35238bceSAndroid Build Coastguard Worker
272*35238bceSAndroid Build Coastguard Worker return r;
273*35238bceSAndroid Build Coastguard Worker }
274*35238bceSAndroid Build Coastguard Worker
275*35238bceSAndroid Build Coastguard Worker template <typename T, int Size>
dot(const Vector<T,Size> & a,const Vector<T,Size> & b)276*35238bceSAndroid Build Coastguard Worker inline T dot(const Vector<T, Size> &a, const Vector<T, Size> &b)
277*35238bceSAndroid Build Coastguard Worker {
278*35238bceSAndroid Build Coastguard Worker T res = T();
279*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < Size; i++)
280*35238bceSAndroid Build Coastguard Worker res += a.m_data[i] * b.m_data[i];
281*35238bceSAndroid Build Coastguard Worker return res;
282*35238bceSAndroid Build Coastguard Worker }
283*35238bceSAndroid Build Coastguard Worker
284*35238bceSAndroid Build Coastguard Worker template <typename T, int Size>
lengthSquared(const Vector<T,Size> & a)285*35238bceSAndroid Build Coastguard Worker inline T lengthSquared(const Vector<T, Size> &a)
286*35238bceSAndroid Build Coastguard Worker {
287*35238bceSAndroid Build Coastguard Worker T sqSum = T();
288*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < Size; i++)
289*35238bceSAndroid Build Coastguard Worker sqSum += a.m_data[i] * a.m_data[i];
290*35238bceSAndroid Build Coastguard Worker return sqSum;
291*35238bceSAndroid Build Coastguard Worker }
292*35238bceSAndroid Build Coastguard Worker
293*35238bceSAndroid Build Coastguard Worker template <typename T, int Size>
length(const Vector<T,Size> & a)294*35238bceSAndroid Build Coastguard Worker inline typename de::meta::EnableIf<T, de::meta::TypesSame<T, double>::Value>::Type length(const Vector<T, Size> &a)
295*35238bceSAndroid Build Coastguard Worker {
296*35238bceSAndroid Build Coastguard Worker return ::sqrt(lengthSquared(a));
297*35238bceSAndroid Build Coastguard Worker }
298*35238bceSAndroid Build Coastguard Worker
299*35238bceSAndroid Build Coastguard Worker template <typename T, int Size>
length(const Vector<T,Size> & a)300*35238bceSAndroid Build Coastguard Worker inline typename de::meta::EnableIf<T, de::meta::TypesSame<T, float>::Value>::Type length(const Vector<T, Size> &a)
301*35238bceSAndroid Build Coastguard Worker {
302*35238bceSAndroid Build Coastguard Worker return deFloatSqrt(lengthSquared(a));
303*35238bceSAndroid Build Coastguard Worker }
304*35238bceSAndroid Build Coastguard Worker
305*35238bceSAndroid Build Coastguard Worker template <typename T, int Size>
distance(const Vector<T,Size> & a,const Vector<T,Size> & b)306*35238bceSAndroid Build Coastguard Worker inline T distance(const Vector<T, Size> &a, const Vector<T, Size> &b)
307*35238bceSAndroid Build Coastguard Worker {
308*35238bceSAndroid Build Coastguard Worker return length(a - b);
309*35238bceSAndroid Build Coastguard Worker }
310*35238bceSAndroid Build Coastguard Worker
311*35238bceSAndroid Build Coastguard Worker template <typename T, int Size>
cross(const Vector<T,Size> & a,const Vector<T,Size> & b)312*35238bceSAndroid Build Coastguard Worker inline Vector<T, Size> cross(const Vector<T, Size> &a, const Vector<T, Size> &b)
313*35238bceSAndroid Build Coastguard Worker {
314*35238bceSAndroid Build Coastguard Worker DE_STATIC_ASSERT(Size == 3);
315*35238bceSAndroid Build Coastguard Worker return Vector<T, Size>(a.y() * b.z() - b.y() * a.z(), a.z() * b.x() - b.z() * a.x(), a.x() * b.y() - b.x() * a.y());
316*35238bceSAndroid Build Coastguard Worker }
317*35238bceSAndroid Build Coastguard Worker
318*35238bceSAndroid Build Coastguard Worker template <typename T, int Size>
normalize(const Vector<T,Size> & a)319*35238bceSAndroid Build Coastguard Worker inline Vector<T, Size> normalize(const Vector<T, Size> &a)
320*35238bceSAndroid Build Coastguard Worker {
321*35238bceSAndroid Build Coastguard Worker T ooLen = T(1) / length(a);
322*35238bceSAndroid Build Coastguard Worker Vector<T, Size> res;
323*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < Size; i++)
324*35238bceSAndroid Build Coastguard Worker res.m_data[i] = ooLen * a.m_data[i];
325*35238bceSAndroid Build Coastguard Worker return res;
326*35238bceSAndroid Build Coastguard Worker }
327*35238bceSAndroid Build Coastguard Worker
328*35238bceSAndroid Build Coastguard Worker template <typename T, int Size>
faceForward(const Vector<T,Size> & n,const Vector<T,Size> & i,const Vector<T,Size> & ref)329*35238bceSAndroid Build Coastguard Worker inline Vector<T, Size> faceForward(const Vector<T, Size> &n, const Vector<T, Size> &i, const Vector<T, Size> &ref)
330*35238bceSAndroid Build Coastguard Worker {
331*35238bceSAndroid Build Coastguard Worker return (dot(ref, i) < T(0)) ? n : -n;
332*35238bceSAndroid Build Coastguard Worker }
333*35238bceSAndroid Build Coastguard Worker
334*35238bceSAndroid Build Coastguard Worker template <typename T, int Size>
reflect(const Vector<T,Size> & i,const Vector<T,Size> & n)335*35238bceSAndroid Build Coastguard Worker inline Vector<T, Size> reflect(const Vector<T, Size> &i, const Vector<T, Size> &n)
336*35238bceSAndroid Build Coastguard Worker {
337*35238bceSAndroid Build Coastguard Worker return i - T(2) * dot(n, i) * n;
338*35238bceSAndroid Build Coastguard Worker }
339*35238bceSAndroid Build Coastguard Worker
340*35238bceSAndroid Build Coastguard Worker template <typename T, int Size>
refract(const Vector<T,Size> & i,const Vector<T,Size> & n,T eta)341*35238bceSAndroid Build Coastguard Worker inline Vector<T, Size> refract(const Vector<T, Size> &i, const Vector<T, Size> &n, T eta)
342*35238bceSAndroid Build Coastguard Worker {
343*35238bceSAndroid Build Coastguard Worker T cosAngle = dot(n, i);
344*35238bceSAndroid Build Coastguard Worker T k = T(1) - eta * eta * (T(1) - cosAngle * cosAngle);
345*35238bceSAndroid Build Coastguard Worker if (k < T(0))
346*35238bceSAndroid Build Coastguard Worker return Vector<T, Size>(T(0));
347*35238bceSAndroid Build Coastguard Worker else
348*35238bceSAndroid Build Coastguard Worker return i * eta - n * T(eta * cosAngle + ::sqrt(k));
349*35238bceSAndroid Build Coastguard Worker }
350*35238bceSAndroid Build Coastguard Worker
351*35238bceSAndroid Build Coastguard Worker template <int Size>
mix(const Vector<float,Size> & x,const Vector<float,Size> & y,float a)352*35238bceSAndroid Build Coastguard Worker Vector<float, Size> mix(const Vector<float, Size> &x, const Vector<float, Size> &y, float a)
353*35238bceSAndroid Build Coastguard Worker {
354*35238bceSAndroid Build Coastguard Worker Vector<float, Size> res;
355*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < Size; i++)
356*35238bceSAndroid Build Coastguard Worker res.m_data[i] = deFloatMix(x.m_data[i], y.m_data[i], a);
357*35238bceSAndroid Build Coastguard Worker return res;
358*35238bceSAndroid Build Coastguard Worker }
359*35238bceSAndroid Build Coastguard Worker
360*35238bceSAndroid Build Coastguard Worker template <int Size>
mix(const Vector<double,Size> & x,const Vector<double,Size> & y,double a)361*35238bceSAndroid Build Coastguard Worker Vector<double, Size> mix(const Vector<double, Size> &x, const Vector<double, Size> &y, double a)
362*35238bceSAndroid Build Coastguard Worker {
363*35238bceSAndroid Build Coastguard Worker Vector<double, Size> res;
364*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < Size; i++)
365*35238bceSAndroid Build Coastguard Worker res.m_data[i] = deMix(x.m_data[i], y.m_data[i], a);
366*35238bceSAndroid Build Coastguard Worker return res;
367*35238bceSAndroid Build Coastguard Worker }
368*35238bceSAndroid Build Coastguard Worker
369*35238bceSAndroid Build Coastguard Worker // Piece-wise compare operators.
370*35238bceSAndroid Build Coastguard Worker
371*35238bceSAndroid Build Coastguard Worker template <typename T, int Size>
equal(const Vector<T,Size> & a,const Vector<T,Size> & b)372*35238bceSAndroid Build Coastguard Worker inline Vector<bool, Size> equal(const Vector<T, Size> &a, const Vector<T, Size> &b)
373*35238bceSAndroid Build Coastguard Worker {
374*35238bceSAndroid Build Coastguard Worker Vector<bool, Size> res;
375*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < Size; i++)
376*35238bceSAndroid Build Coastguard Worker res.m_data[i] = a.m_data[i] == b.m_data[i];
377*35238bceSAndroid Build Coastguard Worker return res;
378*35238bceSAndroid Build Coastguard Worker }
379*35238bceSAndroid Build Coastguard Worker
380*35238bceSAndroid Build Coastguard Worker template <typename T, int Size>
notEqual(const Vector<T,Size> & a,const Vector<T,Size> & b)381*35238bceSAndroid Build Coastguard Worker inline Vector<bool, Size> notEqual(const Vector<T, Size> &a, const Vector<T, Size> &b)
382*35238bceSAndroid Build Coastguard Worker {
383*35238bceSAndroid Build Coastguard Worker Vector<bool, Size> res;
384*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < Size; i++)
385*35238bceSAndroid Build Coastguard Worker res.m_data[i] = a.m_data[i] != b.m_data[i];
386*35238bceSAndroid Build Coastguard Worker return res;
387*35238bceSAndroid Build Coastguard Worker }
388*35238bceSAndroid Build Coastguard Worker
389*35238bceSAndroid Build Coastguard Worker template <typename T, int Size>
lessThan(const Vector<T,Size> & a,const Vector<T,Size> & b)390*35238bceSAndroid Build Coastguard Worker inline Vector<bool, Size> lessThan(const Vector<T, Size> &a, const Vector<T, Size> &b)
391*35238bceSAndroid Build Coastguard Worker {
392*35238bceSAndroid Build Coastguard Worker Vector<bool, Size> res;
393*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < Size; i++)
394*35238bceSAndroid Build Coastguard Worker res.m_data[i] = a.m_data[i] < b.m_data[i];
395*35238bceSAndroid Build Coastguard Worker return res;
396*35238bceSAndroid Build Coastguard Worker }
397*35238bceSAndroid Build Coastguard Worker
398*35238bceSAndroid Build Coastguard Worker template <typename T, int Size>
lessThanEqual(const Vector<T,Size> & a,const Vector<T,Size> & b)399*35238bceSAndroid Build Coastguard Worker inline Vector<bool, Size> lessThanEqual(const Vector<T, Size> &a, const Vector<T, Size> &b)
400*35238bceSAndroid Build Coastguard Worker {
401*35238bceSAndroid Build Coastguard Worker Vector<bool, Size> res;
402*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < Size; i++)
403*35238bceSAndroid Build Coastguard Worker res.m_data[i] = a.m_data[i] <= b.m_data[i];
404*35238bceSAndroid Build Coastguard Worker return res;
405*35238bceSAndroid Build Coastguard Worker }
406*35238bceSAndroid Build Coastguard Worker
407*35238bceSAndroid Build Coastguard Worker template <typename T, int Size>
greaterThan(const Vector<T,Size> & a,const Vector<T,Size> & b)408*35238bceSAndroid Build Coastguard Worker inline Vector<bool, Size> greaterThan(const Vector<T, Size> &a, const Vector<T, Size> &b)
409*35238bceSAndroid Build Coastguard Worker {
410*35238bceSAndroid Build Coastguard Worker Vector<bool, Size> res;
411*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < Size; i++)
412*35238bceSAndroid Build Coastguard Worker res.m_data[i] = a.m_data[i] > b.m_data[i];
413*35238bceSAndroid Build Coastguard Worker return res;
414*35238bceSAndroid Build Coastguard Worker }
415*35238bceSAndroid Build Coastguard Worker
416*35238bceSAndroid Build Coastguard Worker template <typename T, int Size>
greaterThanEqual(const Vector<T,Size> & a,const Vector<T,Size> & b)417*35238bceSAndroid Build Coastguard Worker inline Vector<bool, Size> greaterThanEqual(const Vector<T, Size> &a, const Vector<T, Size> &b)
418*35238bceSAndroid Build Coastguard Worker {
419*35238bceSAndroid Build Coastguard Worker Vector<bool, Size> res;
420*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < Size; i++)
421*35238bceSAndroid Build Coastguard Worker res.m_data[i] = a.m_data[i] >= b.m_data[i];
422*35238bceSAndroid Build Coastguard Worker return res;
423*35238bceSAndroid Build Coastguard Worker }
424*35238bceSAndroid Build Coastguard Worker
425*35238bceSAndroid Build Coastguard Worker // Equality comparison operators.
426*35238bceSAndroid Build Coastguard Worker
427*35238bceSAndroid Build Coastguard Worker template <typename T, int Size>
allEqual(const Vector<T,Size> & a,const Vector<T,Size> & b)428*35238bceSAndroid Build Coastguard Worker inline bool allEqual(const Vector<T, Size> &a, const Vector<T, Size> &b)
429*35238bceSAndroid Build Coastguard Worker {
430*35238bceSAndroid Build Coastguard Worker bool res = true;
431*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < Size; i++)
432*35238bceSAndroid Build Coastguard Worker res = res && a.m_data[i] == b.m_data[i];
433*35238bceSAndroid Build Coastguard Worker return res;
434*35238bceSAndroid Build Coastguard Worker }
435*35238bceSAndroid Build Coastguard Worker
436*35238bceSAndroid Build Coastguard Worker template <typename T, int Size>
anyNotEqual(const Vector<T,Size> & a,const Vector<T,Size> & b)437*35238bceSAndroid Build Coastguard Worker inline bool anyNotEqual(const Vector<T, Size> &a, const Vector<T, Size> &b)
438*35238bceSAndroid Build Coastguard Worker {
439*35238bceSAndroid Build Coastguard Worker bool res = false;
440*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < Size; i++)
441*35238bceSAndroid Build Coastguard Worker res = res || a.m_data[i] != b.m_data[i];
442*35238bceSAndroid Build Coastguard Worker return res;
443*35238bceSAndroid Build Coastguard Worker }
444*35238bceSAndroid Build Coastguard Worker
445*35238bceSAndroid Build Coastguard Worker // Boolean built-ins.
446*35238bceSAndroid Build Coastguard Worker
447*35238bceSAndroid Build Coastguard Worker template <int Size>
boolNot(const Vector<bool,Size> & a)448*35238bceSAndroid Build Coastguard Worker inline Vector<bool, Size> boolNot(const Vector<bool, Size> &a)
449*35238bceSAndroid Build Coastguard Worker {
450*35238bceSAndroid Build Coastguard Worker Vector<bool, Size> res;
451*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < Size; i++)
452*35238bceSAndroid Build Coastguard Worker res.m_data[i] = !a.m_data[i];
453*35238bceSAndroid Build Coastguard Worker return res;
454*35238bceSAndroid Build Coastguard Worker }
455*35238bceSAndroid Build Coastguard Worker
456*35238bceSAndroid Build Coastguard Worker template <int Size>
boolAny(const Vector<bool,Size> & a)457*35238bceSAndroid Build Coastguard Worker inline bool boolAny(const Vector<bool, Size> &a)
458*35238bceSAndroid Build Coastguard Worker {
459*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < Size; i++)
460*35238bceSAndroid Build Coastguard Worker if (a.m_data[i] == true)
461*35238bceSAndroid Build Coastguard Worker return true;
462*35238bceSAndroid Build Coastguard Worker return false;
463*35238bceSAndroid Build Coastguard Worker }
464*35238bceSAndroid Build Coastguard Worker
465*35238bceSAndroid Build Coastguard Worker template <int Size>
boolAll(const Vector<bool,Size> & a)466*35238bceSAndroid Build Coastguard Worker inline bool boolAll(const Vector<bool, Size> &a)
467*35238bceSAndroid Build Coastguard Worker {
468*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < Size; i++)
469*35238bceSAndroid Build Coastguard Worker if (a.m_data[i] == false)
470*35238bceSAndroid Build Coastguard Worker return false;
471*35238bceSAndroid Build Coastguard Worker return true;
472*35238bceSAndroid Build Coastguard Worker }
473*35238bceSAndroid Build Coastguard Worker
474*35238bceSAndroid Build Coastguard Worker template <int Size>
chopToInt(const Vector<float,Size> & v)475*35238bceSAndroid Build Coastguard Worker Vector<int, Size> chopToInt(const Vector<float, Size> &v)
476*35238bceSAndroid Build Coastguard Worker {
477*35238bceSAndroid Build Coastguard Worker Vector<int, Size> res;
478*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < Size; i++)
479*35238bceSAndroid Build Coastguard Worker res.m_data[i] = chopToInt(v.m_data[i]);
480*35238bceSAndroid Build Coastguard Worker return res;
481*35238bceSAndroid Build Coastguard Worker }
482*35238bceSAndroid Build Coastguard Worker
483*35238bceSAndroid Build Coastguard Worker // Vector construction using selection based on boolean vector.
484*35238bceSAndroid Build Coastguard Worker
485*35238bceSAndroid Build Coastguard Worker template <typename T, int Size>
select(T trueVal,T falseVal,const Vector<bool,Size> & cond)486*35238bceSAndroid Build Coastguard Worker inline Vector<T, Size> select(T trueVal, T falseVal, const Vector<bool, Size> &cond)
487*35238bceSAndroid Build Coastguard Worker {
488*35238bceSAndroid Build Coastguard Worker Vector<T, Size> res;
489*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < Size; i++)
490*35238bceSAndroid Build Coastguard Worker res[i] = cond[i] ? trueVal : falseVal;
491*35238bceSAndroid Build Coastguard Worker return res;
492*35238bceSAndroid Build Coastguard Worker }
493*35238bceSAndroid Build Coastguard Worker
494*35238bceSAndroid Build Coastguard Worker // Component-wise selection.
495*35238bceSAndroid Build Coastguard Worker
496*35238bceSAndroid Build Coastguard Worker template <typename T, int Size>
select(const Vector<T,Size> & trueVal,const Vector<T,Size> & falseVal,const Vector<bool,Size> & cond)497*35238bceSAndroid Build Coastguard Worker inline Vector<T, Size> select(const Vector<T, Size> &trueVal, const Vector<T, Size> &falseVal,
498*35238bceSAndroid Build Coastguard Worker const Vector<bool, Size> &cond)
499*35238bceSAndroid Build Coastguard Worker {
500*35238bceSAndroid Build Coastguard Worker Vector<T, Size> res;
501*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < Size; i++)
502*35238bceSAndroid Build Coastguard Worker res[i] = cond[i] ? trueVal[i] : falseVal[i];
503*35238bceSAndroid Build Coastguard Worker return res;
504*35238bceSAndroid Build Coastguard Worker }
505*35238bceSAndroid Build Coastguard Worker
506*35238bceSAndroid Build Coastguard Worker // Absolute difference (abs(a - b))
507*35238bceSAndroid Build Coastguard Worker
508*35238bceSAndroid Build Coastguard Worker template <typename T, int Size>
absDiff(const Vector<T,Size> & a,const Vector<T,Size> & b)509*35238bceSAndroid Build Coastguard Worker static inline Vector<T, Size> absDiff(const Vector<T, Size> &a, const Vector<T, Size> &b)
510*35238bceSAndroid Build Coastguard Worker {
511*35238bceSAndroid Build Coastguard Worker Vector<T, Size> res;
512*35238bceSAndroid Build Coastguard Worker
513*35238bceSAndroid Build Coastguard Worker for (int ndx = 0; ndx < Size; ndx++)
514*35238bceSAndroid Build Coastguard Worker res[ndx] = (a[ndx] > b[ndx]) ? (a[ndx] - b[ndx]) : (b[ndx] - a[ndx]);
515*35238bceSAndroid Build Coastguard Worker
516*35238bceSAndroid Build Coastguard Worker return res;
517*35238bceSAndroid Build Coastguard Worker }
518*35238bceSAndroid Build Coastguard Worker
519*35238bceSAndroid Build Coastguard Worker template <typename T, int Size>
randomVector(de::Random & rnd,const tcu::Vector<T,Size> & minValue,const tcu::Vector<T,Size> & maxValue)520*35238bceSAndroid Build Coastguard Worker inline tcu::Vector<T, Size> randomVector(de::Random &rnd, const tcu::Vector<T, Size> &minValue,
521*35238bceSAndroid Build Coastguard Worker const tcu::Vector<T, Size> &maxValue)
522*35238bceSAndroid Build Coastguard Worker {
523*35238bceSAndroid Build Coastguard Worker tcu::Vector<T, Size> res;
524*35238bceSAndroid Build Coastguard Worker
525*35238bceSAndroid Build Coastguard Worker for (int ndx = 0; ndx < Size; ndx++)
526*35238bceSAndroid Build Coastguard Worker res[ndx] = de::randomScalar<T>(rnd, minValue[ndx], maxValue[ndx]);
527*35238bceSAndroid Build Coastguard Worker
528*35238bceSAndroid Build Coastguard Worker return res;
529*35238bceSAndroid Build Coastguard Worker }
530*35238bceSAndroid Build Coastguard Worker
randomVec2(de::Random & rnd)531*35238bceSAndroid Build Coastguard Worker inline Vector<float, 2> randomVec2(de::Random &rnd)
532*35238bceSAndroid Build Coastguard Worker {
533*35238bceSAndroid Build Coastguard Worker return randomVector<float, 2>(rnd, tcu::Vector<float, 2>(0.0f), tcu::Vector<float, 2>(1.0f));
534*35238bceSAndroid Build Coastguard Worker }
535*35238bceSAndroid Build Coastguard Worker
randomVec3(de::Random & rnd)536*35238bceSAndroid Build Coastguard Worker inline Vector<float, 3> randomVec3(de::Random &rnd)
537*35238bceSAndroid Build Coastguard Worker {
538*35238bceSAndroid Build Coastguard Worker return randomVector<float, 3>(rnd, tcu::Vector<float, 3>(0.0f), tcu::Vector<float, 3>(1.0f));
539*35238bceSAndroid Build Coastguard Worker }
540*35238bceSAndroid Build Coastguard Worker
randomVec4(de::Random & rnd)541*35238bceSAndroid Build Coastguard Worker inline Vector<float, 4> randomVec4(de::Random &rnd)
542*35238bceSAndroid Build Coastguard Worker {
543*35238bceSAndroid Build Coastguard Worker return randomVector<float, 4>(rnd, tcu::Vector<float, 4>(0.0f), tcu::Vector<float, 4>(1.0f));
544*35238bceSAndroid Build Coastguard Worker }
545*35238bceSAndroid Build Coastguard Worker
546*35238bceSAndroid Build Coastguard Worker // Macros for component-wise ops.
547*35238bceSAndroid Build Coastguard Worker
548*35238bceSAndroid Build Coastguard Worker #define TCU_DECLARE_VECTOR_UNARY_FUNC(FUNC_NAME, OP_NAME) \
549*35238bceSAndroid Build Coastguard Worker template <typename T, int Size> \
550*35238bceSAndroid Build Coastguard Worker Vector<T, Size> FUNC_NAME(const Vector<T, Size> &v) \
551*35238bceSAndroid Build Coastguard Worker { \
552*35238bceSAndroid Build Coastguard Worker Vector<T, Size> res; \
553*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < Size; i++) \
554*35238bceSAndroid Build Coastguard Worker res.m_data[i] = OP_NAME(v.m_data[i]); \
555*35238bceSAndroid Build Coastguard Worker return res; \
556*35238bceSAndroid Build Coastguard Worker }
557*35238bceSAndroid Build Coastguard Worker
558*35238bceSAndroid Build Coastguard Worker #define TCU_DECLARE_VECTOR_BINARY_FUNC(FUNC_NAME, OP_NAME) \
559*35238bceSAndroid Build Coastguard Worker template <typename T, int Size> \
560*35238bceSAndroid Build Coastguard Worker Vector<T, Size> FUNC_NAME(const Vector<T, Size> &a, const Vector<T, Size> &b) \
561*35238bceSAndroid Build Coastguard Worker { \
562*35238bceSAndroid Build Coastguard Worker Vector<T, Size> res; \
563*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < Size; i++) \
564*35238bceSAndroid Build Coastguard Worker res.m_data[i] = OP_NAME(a.m_data[i], b.m_data[i]); \
565*35238bceSAndroid Build Coastguard Worker return res; \
566*35238bceSAndroid Build Coastguard Worker }
567*35238bceSAndroid Build Coastguard Worker
568*35238bceSAndroid Build Coastguard Worker #define TCU_DECLARE_VECTOR_TERNARY_FUNC(FUNC_NAME, OP_NAME) \
569*35238bceSAndroid Build Coastguard Worker template <typename T, int Size> \
570*35238bceSAndroid Build Coastguard Worker Vector<T, Size> FUNC_NAME(const Vector<T, Size> &a, const Vector<T, Size> &b, const Vector<T, Size> &c) \
571*35238bceSAndroid Build Coastguard Worker { \
572*35238bceSAndroid Build Coastguard Worker Vector<T, Size> res; \
573*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < Size; i++) \
574*35238bceSAndroid Build Coastguard Worker res.m_data[i] = OP_NAME(a.m_data[i], b.m_data[i], c.m_data[i]); \
575*35238bceSAndroid Build Coastguard Worker return res; \
576*35238bceSAndroid Build Coastguard Worker }
577*35238bceSAndroid Build Coastguard Worker
578*35238bceSAndroid Build Coastguard Worker // \todo [2011-07-01 pyry] Add some prefix to vector funcs and remove this hack.
579*35238bceSAndroid Build Coastguard Worker #if defined(min)
580*35238bceSAndroid Build Coastguard Worker #undef min
581*35238bceSAndroid Build Coastguard Worker #endif
582*35238bceSAndroid Build Coastguard Worker #if defined(max)
583*35238bceSAndroid Build Coastguard Worker #undef max
584*35238bceSAndroid Build Coastguard Worker #endif
585*35238bceSAndroid Build Coastguard Worker
586*35238bceSAndroid Build Coastguard Worker TCU_DECLARE_VECTOR_UNARY_FUNC(negate, negate)
587*35238bceSAndroid Build Coastguard Worker TCU_DECLARE_VECTOR_UNARY_FUNC(bitwiseNot, bitwiseNot)
588*35238bceSAndroid Build Coastguard Worker TCU_DECLARE_VECTOR_BINARY_FUNC(add, add)
589*35238bceSAndroid Build Coastguard Worker TCU_DECLARE_VECTOR_BINARY_FUNC(sub, sub)
590*35238bceSAndroid Build Coastguard Worker TCU_DECLARE_VECTOR_BINARY_FUNC(mul, mul)
591*35238bceSAndroid Build Coastguard Worker TCU_DECLARE_VECTOR_BINARY_FUNC(div, div)
592*35238bceSAndroid Build Coastguard Worker TCU_DECLARE_VECTOR_BINARY_FUNC(mod, mod)
593*35238bceSAndroid Build Coastguard Worker TCU_DECLARE_VECTOR_BINARY_FUNC(bitwiseAnd, bitwiseAnd)
594*35238bceSAndroid Build Coastguard Worker TCU_DECLARE_VECTOR_BINARY_FUNC(bitwiseOr, bitwiseOr)
595*35238bceSAndroid Build Coastguard Worker TCU_DECLARE_VECTOR_BINARY_FUNC(bitwiseXor, bitwiseXor)
596*35238bceSAndroid Build Coastguard Worker TCU_DECLARE_VECTOR_UNARY_FUNC(logicalNot, logicalNot)
597*35238bceSAndroid Build Coastguard Worker TCU_DECLARE_VECTOR_BINARY_FUNC(logicalAnd, logicalAnd)
598*35238bceSAndroid Build Coastguard Worker TCU_DECLARE_VECTOR_BINARY_FUNC(logicalOr, logicalOr)
599*35238bceSAndroid Build Coastguard Worker
600*35238bceSAndroid Build Coastguard Worker TCU_DECLARE_VECTOR_UNARY_FUNC(radians, deFloatRadians)
601*35238bceSAndroid Build Coastguard Worker TCU_DECLARE_VECTOR_UNARY_FUNC(degrees, deFloatDegrees)
602*35238bceSAndroid Build Coastguard Worker TCU_DECLARE_VECTOR_UNARY_FUNC(sin, deFloatSin)
603*35238bceSAndroid Build Coastguard Worker TCU_DECLARE_VECTOR_UNARY_FUNC(cos, deFloatCos)
604*35238bceSAndroid Build Coastguard Worker TCU_DECLARE_VECTOR_UNARY_FUNC(tan, deFloatTan)
605*35238bceSAndroid Build Coastguard Worker TCU_DECLARE_VECTOR_UNARY_FUNC(asin, deFloatAsin)
606*35238bceSAndroid Build Coastguard Worker TCU_DECLARE_VECTOR_UNARY_FUNC(acos, deFloatAcos)
607*35238bceSAndroid Build Coastguard Worker TCU_DECLARE_VECTOR_UNARY_FUNC(atan, deFloatAtanOver)
608*35238bceSAndroid Build Coastguard Worker TCU_DECLARE_VECTOR_BINARY_FUNC(atan2, deFloatAtan2)
609*35238bceSAndroid Build Coastguard Worker TCU_DECLARE_VECTOR_UNARY_FUNC(sinh, deFloatSinh)
610*35238bceSAndroid Build Coastguard Worker TCU_DECLARE_VECTOR_UNARY_FUNC(cosh, deFloatCosh)
611*35238bceSAndroid Build Coastguard Worker TCU_DECLARE_VECTOR_UNARY_FUNC(tanh, deFloatTanh)
612*35238bceSAndroid Build Coastguard Worker TCU_DECLARE_VECTOR_UNARY_FUNC(asinh, deFloatAsinh)
613*35238bceSAndroid Build Coastguard Worker TCU_DECLARE_VECTOR_UNARY_FUNC(acosh, deFloatAcosh)
614*35238bceSAndroid Build Coastguard Worker TCU_DECLARE_VECTOR_UNARY_FUNC(atanh, deFloatAtanh)
615*35238bceSAndroid Build Coastguard Worker
616*35238bceSAndroid Build Coastguard Worker TCU_DECLARE_VECTOR_BINARY_FUNC(pow, deFloatPow)
617*35238bceSAndroid Build Coastguard Worker TCU_DECLARE_VECTOR_UNARY_FUNC(exp, deFloatExp)
618*35238bceSAndroid Build Coastguard Worker TCU_DECLARE_VECTOR_UNARY_FUNC(log, deFloatLog)
619*35238bceSAndroid Build Coastguard Worker TCU_DECLARE_VECTOR_UNARY_FUNC(exp2, deFloatExp2)
620*35238bceSAndroid Build Coastguard Worker TCU_DECLARE_VECTOR_UNARY_FUNC(log2, deFloatLog2)
621*35238bceSAndroid Build Coastguard Worker TCU_DECLARE_VECTOR_UNARY_FUNC(sqrt, deFloatSqrt)
622*35238bceSAndroid Build Coastguard Worker TCU_DECLARE_VECTOR_UNARY_FUNC(inverseSqrt, deFloatRsq)
623*35238bceSAndroid Build Coastguard Worker
624*35238bceSAndroid Build Coastguard Worker TCU_DECLARE_VECTOR_UNARY_FUNC(abs, de::abs)
625*35238bceSAndroid Build Coastguard Worker TCU_DECLARE_VECTOR_UNARY_FUNC(sign, deFloatSign)
626*35238bceSAndroid Build Coastguard Worker TCU_DECLARE_VECTOR_UNARY_FUNC(floor, deFloatFloor)
627*35238bceSAndroid Build Coastguard Worker TCU_DECLARE_VECTOR_UNARY_FUNC(trunc, deFloatTrunc)
628*35238bceSAndroid Build Coastguard Worker TCU_DECLARE_VECTOR_UNARY_FUNC(roundToEven, roundToEven)
629*35238bceSAndroid Build Coastguard Worker TCU_DECLARE_VECTOR_UNARY_FUNC(ceil, deFloatCeil)
630*35238bceSAndroid Build Coastguard Worker TCU_DECLARE_VECTOR_UNARY_FUNC(fract, deFloatFrac)
631*35238bceSAndroid Build Coastguard Worker TCU_DECLARE_VECTOR_BINARY_FUNC(min, de::min)
632*35238bceSAndroid Build Coastguard Worker TCU_DECLARE_VECTOR_BINARY_FUNC(max, de::max)
633*35238bceSAndroid Build Coastguard Worker TCU_DECLARE_VECTOR_TERNARY_FUNC(clamp, de::clamp)
634*35238bceSAndroid Build Coastguard Worker TCU_DECLARE_VECTOR_TERNARY_FUNC(mix, deFloatMix)
635*35238bceSAndroid Build Coastguard Worker TCU_DECLARE_VECTOR_BINARY_FUNC(step, deFloatStep)
636*35238bceSAndroid Build Coastguard Worker TCU_DECLARE_VECTOR_TERNARY_FUNC(smoothStep, deFloatSmoothStep)
637*35238bceSAndroid Build Coastguard Worker
638*35238bceSAndroid Build Coastguard Worker } // namespace tcu
639*35238bceSAndroid Build Coastguard Worker
640*35238bceSAndroid Build Coastguard Worker #endif // _TCUVECTORUTIL_HPP
641