26 #ifndef UTIL_MATH_VECTOR4_INL_H__ 27 #define UTIL_MATH_VECTOR4_INL_H__ 29 #include "util/math/vector4.h" 38 #include "base/integral_types.h" 40 #include "base/type_traits.h" 41 #include "util/math/mathutil.h" 42 #include "util/math/vector2.h" 43 #include "util/math/vector3.h" 45 template <
typename VType>
50 template <
typename VType>
59 template <
typename VType>
67 template <
typename VType>
76 template <
typename VType>
84 template <
typename VType>
92 template <
typename VType>
template <
typename VType2>
94 return Self(static_cast<VType>(vb[0]),
95 static_cast<VType>(vb[1]),
96 static_cast<VType>(vb[2]),
97 static_cast<VType>(vb[3]));
100 template <
typename VType>
102 return (c_[0] == vb.c_[0])
103 && (c_[1] == vb.c_[1])
104 && (c_[2] == vb.c_[2])
105 && (c_[3] == vb.c_[3]);
108 template <
typename VType>
110 return (c_[0] != vb.c_[0])
111 || (c_[1] != vb.c_[1])
112 || (c_[2] != vb.c_[2])
113 || (c_[3] != vb.c_[3]);
116 template <
typename VType>
118 return (fabs(c_[0] - vb.c_[0]) < margin)
119 && (fabs(c_[1] - vb.c_[1]) < margin)
120 && (fabs(c_[2] - vb.c_[2]) < margin)
121 && (fabs(c_[3] - vb.c_[3]) < margin);
124 template <
typename VType>
126 if ( c_[0] < vb.c_[0] )
return true;
127 if ( vb.c_[0] < c_[0] )
return false;
128 if ( c_[1] < vb.c_[1] )
return true;
129 if ( vb.c_[1] < c_[1] )
return false;
130 if ( c_[2] < vb.c_[2] )
return true;
131 if ( vb.c_[2] < c_[2] )
return false;
132 if ( c_[3] < vb.c_[3] )
return true;
136 template <
typename VType>
138 return vb.operator<(*this);
141 template <
typename VType>
143 return !operator>(vb);
146 template <
typename VType>
148 return !operator<(vb);
151 template <
typename VType>
160 template <
typename VType>
169 template <
typename VType>
178 template <
typename VType>
187 template <
typename VType>
196 template <
typename VType>
205 template <
typename VType>
207 return Self(c_[0] * vb.c_[0], c_[1] * vb.c_[1],
208 c_[2] * vb.c_[2], c_[3] * vb.c_[3]);
211 template <
typename VType>
213 return Self(c_[0] / vb.c_[0], c_[1] / vb.c_[1],
214 c_[2] / vb.c_[2], c_[3] / vb.c_[3]);
217 template <
typename VType>
219 return Self(*
this) += vb;
222 template <
typename VType>
224 return Self(*
this) -= vb;
227 template <
typename VType>
229 return c_[0]*vb.c_[0] + c_[1]*vb.c_[1] + c_[2]*vb.c_[2] + c_[3]*vb.c_[3];
232 template <
typename VType>
234 return Self(*
this) *= k;
237 template <
typename VType>
239 return Self(*
this) /= k;
242 template <
typename VType>
249 template <
typename VType>
256 template <
typename VType>
261 template <
typename VType>
266 template <
typename VType>
271 template <
typename VType>
276 template <
typename VType>
281 template <
typename VType>
286 template <
typename VType>
291 template <
typename VType>
296 template <
typename VType>
298 return reinterpret_cast<VType*>(c_);
301 template <
typename VType>
303 return reinterpret_cast<const VType*>(c_);
306 template <
typename VType>
308 return c_[0]*c_[0] + c_[1]*c_[1] + c_[2]*c_[2] + c_[3]*c_[3];
311 template <
typename VType>
313 return sqrt(Norm2());
316 template <
typename VType>
318 COMPILE_ASSERT(!base::is_integral<VType>::value, must_be_floating_point);
323 return Self(*
this) *= n;
326 template <
typename VType>
328 return Self(sqrt(c_[0]), sqrt(c_[1]), sqrt(c_[2]), sqrt(c_[3]));
331 template <
typename VType>
333 return Self(fabs(c_[0]), fabs(c_[1]), fabs(c_[2]), fabs(c_[3]));
336 template <
typename VType>
338 COMPILE_ASSERT(base::is_integral<VType>::value, use_Fabs_for_float_types);
339 COMPILE_ASSERT(static_cast<VType>(-1) == -1, type_must_be_signed);
340 COMPILE_ASSERT(
sizeof(VType) <=
sizeof(
int), Abs_truncates_to_int);
341 return Self(abs(c_[0]), abs(c_[1]), abs(c_[2]), abs(c_[3]));
344 template <
typename VType>
346 return Self(floor(c_[0]),
352 template <
typename VType>
354 return Self(ceil(c_[0]), ceil(c_[1]), ceil(c_[2]), ceil(c_[3]));
357 template <
typename VType>
359 return Self(rint(c_[0]), rint(c_[1]),
360 rint(c_[2]), rint(c_[3]));
363 template <
typename VType>
366 lrint(c_[2]), lrint(c_[3]));
369 template <
typename VType>
371 c_[3] = c_[2] = c_[1] = c_[0] = VType();
374 template <
typename VType>
376 return isnan(c_[0]) || isnan(c_[1]) || isnan(c_[2]) || isnan(c_[3]);
379 template <
typename VType>
381 return Self(MathUtil::NaN(), MathUtil::NaN(),
382 MathUtil::NaN(), MathUtil::NaN());
385 template <
typename VType>
390 template <
typename ScalarType,
typename VType>
395 template <
typename ScalarType,
typename VType>
400 template <
typename VType>
408 template <
typename VType>
416 template <
typename VType>
417 std::ostream &operator <<(std::ostream &out,
const Vector4<VType> &va) {
429 PROPAGATE_POD_FROM_TEMPLATE_ARGUMENT(
Vector4);
431 #endif // UTIL_MATH_VECTOR4_INL_H__