2 // Open Service Platform
3 // Copyright (c) 2012-2013 Samsung Electronics Co., Ltd.
5 // Licensed under the Flora License, Version 1.0 (the License);
6 // you may not use this file except in compliance with the License.
7 // You may obtain a copy of the License at
9 // http://floralicense.org/license/
11 // Unless required by applicable law or agreed to in writing, software
12 // distributed under the License is distributed on an AS IS BASIS,
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 // See the License for the specific language governing permissions and
15 // limitations under the License.
19 * @file FUiEffects_RendererMathVector.h
20 * @brief The Vector class
24 #ifndef _FUI_EFFECTS_INTERNAL_RENDERER_MATH_VECTOR_H_
25 #define _FUI_EFFECTS_INTERNAL_RENDERER_MATH_VECTOR_H_
27 #include <renderer/system/FUiEffects_RendererSystemStaticAssert.h>
29 #include <renderer/math/FUiEffects_RendererMathVector1Traits.h>
30 #include <renderer/math/FUiEffects_RendererMathVector2Traits.h>
31 #include <renderer/math/FUiEffects_RendererMathVector3Traits.h>
32 #include <renderer/math/FUiEffects_RendererMathCommon.h>
33 #include <renderer/math/FUiEffects_RendererMathAdapterFunctions.h>
35 namespace Tizen { namespace Ui { namespace Effects { namespace _Renderer { namespace Math
38 template<typename T, int Dimension>
40 public VectorTraits<T, Dimension>
43 typedef Vector<T, Dimension> VectorType;
44 typedef VectorTraitsBase<T, Dimension> VectorTraitsBaseType;
45 typedef typename VectorTraitsBaseType::TypeReference TypeReference;
47 using VectorTraitsBaseType::data;
48 using VectorTraits<T, Dimension>::Set;
51 inline explicit Vector(const TypeReference value);
52 inline Vector(const TypeReference x, const TypeReference y);
53 inline Vector(const TypeReference x, const TypeReference y, const TypeReference z);
54 inline Vector(const TypeReference x, const TypeReference y, const TypeReference z, const TypeReference w);
55 inline Vector(const VectorType& other);
57 inline VectorType& operator = (const VectorType& rhv);
59 inline VectorType& Set(const VectorType& other);
60 inline VectorType& Set(const TypeReference value);
62 inline VectorType& FillFromArray(const T* array);
63 static inline VectorType MakeFromArray(const T* array);
65 inline VectorType operator - (void) const;
66 inline VectorType& Inverse(void);
67 inline VectorType GetInversed(void) const;
69 inline VectorType& operator += (const VectorType& rhv);
70 inline VectorType& operator += (const TypeReference rhv);
71 inline VectorType& operator -= (const VectorType& rhv);
72 inline VectorType& operator -= (const TypeReference rhv);
73 inline VectorType& operator *= (const VectorType& rhv);
74 inline VectorType& operator *= (const TypeReference rhv);
75 inline VectorType& operator /= (const VectorType& rhv);
76 inline VectorType& operator /= (const TypeReference rhv);
78 inline T* GetPointer(void);
79 inline const T* GetPointer(void) const;
81 inline VectorType& Normalize(void);
82 inline VectorType GetNormalized(void) const;
84 inline VectorType& Lerp(const VectorType& to, const TypeReference coeff);
85 inline VectorType GetLerped(const VectorType& to, const TypeReference) const;
86 inline VectorType& MakeLerped(const VectorType& from, const VectorType& to, const TypeReference);
87 static inline VectorType CreateLerped(const VectorType& from, const VectorType& to, const TypeReference);
89 inline T Dot(const VectorType& other) const;
91 inline T LengthSqr(void) const;
92 inline T Length(void) const;
93 inline T DistanceSqr(const VectorType& other) const;
94 inline T Distance(const VectorType& other) const;
96 inline Vector<T, 2> Swizzle(unsigned int x, unsigned int y) const;
97 inline Vector<T, 3> Swizzle(unsigned int x, unsigned int y, unsigned int z) const;
98 inline Vector<T, 4> Swizzle(unsigned int x, unsigned int y, unsigned int z, unsigned int w) const;
100 inline bool IsEqual(const Vector<T, Dimension>& rhv, const TypeReference epsilon = EffectsEpsilon<T>::epsilon()) const;
103 template<typename T, int Dimension>
104 inline bool IsEqual(const Vector<T, Dimension>& lhv, const Vector<T, Dimension>& rhv, const typename Vector<T, Dimension>::TypeReference epsilon);
106 template<typename T, int Dimension> inline Vector<T, Dimension> operator + (const Vector<T, Dimension>& lhv, const Vector<T, Dimension>& rhv);
107 template<typename T, int Dimension> inline Vector<T, Dimension> operator + (const Vector<T, Dimension>& lhv, const typename Vector<T, Dimension>::TypeReference rhv);
108 template<typename T, int Dimension> inline Vector<T, Dimension> operator + (const typename Vector<T, Dimension>::TypeReference lhv, const Vector<T, Dimension>& rhv);
109 template<typename T, int Dimension> inline Vector<T, Dimension> operator - (const Vector<T, Dimension>& lhv, const Vector<T, Dimension>& rhv);
110 template<typename T, int Dimension> inline Vector<T, Dimension> operator - (const Vector<T, Dimension>& lhv, const typename Vector<T, Dimension>::TypeReference rhv);
111 template<typename T, int Dimension> inline Vector<T, Dimension> operator - (const typename Vector<T, Dimension>::TypeReference lhv, const Vector<T, Dimension>& rhv);
112 template<typename T, int Dimension> inline Vector<T, Dimension> operator * (const Vector<T, Dimension>& lhv, const Vector<T, Dimension>& rhv);
113 template<typename T, int Dimension> inline Vector<T, Dimension> operator * (const Vector<T, Dimension>& lhv, const typename Vector<T, Dimension>::TypeReference rhv);
114 template<typename T, int Dimension> inline Vector<T, Dimension> operator * (const typename Vector<T, Dimension>::TypeReference lhv, const Vector<T, Dimension>& rhv);
115 template<typename T, int Dimension> inline Vector<T, Dimension> operator / (const Vector<T, Dimension>& lhv, const Vector<T, Dimension>& rhv);
116 template<typename T, int Dimension> inline Vector<T, Dimension> operator / (const Vector<T, Dimension>& lhv, const typename Vector<T, Dimension>::TypeReference rhv);
117 template<typename T, int Dimension> inline Vector<T, Dimension> operator / (const typename Vector<T, Dimension>::TypeReference lhv, const Vector<T, Dimension>& rhv);
118 template<typename T, int Dimension> inline bool operator == (const Vector<T, Dimension>& lhv, const Vector<T, Dimension>& rhv);
119 template<typename T, int Dimension> inline bool operator == (const Vector<T, Dimension>& lhv, const typename Vector<T, Dimension>::TypeReference rhv);
120 template<typename T, int Dimension> inline bool operator == (const typename Vector<T, Dimension>::TypeReference lhv, const Vector<T, Dimension>& rhv);
121 template<typename T, int Dimension> inline bool operator != (const Vector<T, Dimension>& lhv, const Vector<T, Dimension>& rhv);
122 template<typename T, int Dimension> inline bool operator != (const Vector<T, Dimension>& lhv, const typename Vector<T, Dimension>::TypeReference rhv);
123 template<typename T, int Dimension> inline bool operator != (const typename Vector<T, Dimension>::TypeReference lhv, const Vector<T, Dimension>& rhv);
125 typedef Vector<float, 1> Vector1f;
126 typedef Vector<double, 1> Vector1d;
127 typedef Vector<float, 2> Vector2f;
128 typedef Vector<double, 2> Vector2d;
129 typedef Vector<float, 3> Vector3f;
130 typedef Vector<double, 3> Vector3d;
131 typedef Vector<float, 4> Vector4f;
132 typedef Vector<double, 4> Vector4d;
134 template<typename T, int Dimension>
135 Vector<T, Dimension>::Vector(void)
139 template<typename T, int Dimension>
140 Vector<T, Dimension>::Vector(const TypeReference value)
142 for (int i = 0; i < Dimension; i++)
148 template<typename T, int Dimension>
149 Vector<T, Dimension>::Vector(const TypeReference x, const TypeReference y)
151 EffectsStaticAssert(Dimension >= 2);
156 template<typename T, int Dimension>
157 Vector<T, Dimension>::Vector(const TypeReference x, const TypeReference y, const TypeReference z)
159 EffectsStaticAssert(Dimension >= 3);
165 template<typename T, int Dimension>
166 Vector<T, Dimension>::Vector(const TypeReference x, const TypeReference y, const TypeReference z, const TypeReference w)
168 EffectsStaticAssert(Dimension >= 4);
175 template<typename T, int Dimension>
176 Vector<T, Dimension>::Vector(const VectorType& other)
178 for (int i = 0; i < Dimension; i++)
180 data[i] = other.data[i];
184 template<typename T, int Dimension>
185 Vector<T, Dimension>& Vector<T, Dimension>::operator=(const VectorType& rhv)
189 for (int i = 0; i < Dimension; i++)
191 data[i] = rhv.data[i];
197 template<typename T, int Dimension>
198 typename Vector<T, Dimension>::VectorType& Vector<T, Dimension>::Set(const VectorType& other)
200 for (int i = 0; i < Dimension; i++)
202 data[i] = other.data[i];
207 template<typename T, int Dimension>
208 typename Vector<T, Dimension>::VectorType& Vector<T, Dimension>::Set(const TypeReference value)
210 for (int i = 0; i < Dimension; i++)
217 template<typename T, int Dimension>
218 typename Vector<T, Dimension>::VectorType& Vector<T, Dimension>::FillFromArray(const T* value)
220 for (int i = 0; i < Dimension; i++)
227 template<typename T, int Dimension>
228 typename Vector<T, Dimension>::VectorType Vector<T, Dimension>::MakeFromArray(const T* value)
231 result.FillFromArray(value);
236 template<typename T, int Dimension>
237 Vector<T, Dimension> Vector<T, Dimension>::operator - (void) const
239 return GetInversed();
242 template<typename T, int Dimension>
243 Vector<T, Dimension>& Vector<T, Dimension>::Inverse(void)
245 for (int i = 0; i < Dimension; i++)
252 template<typename T, int Dimension>
253 Vector<T, Dimension> Vector<T, Dimension>::GetInversed(void) const
256 for (int i = 0; i < Dimension; i++)
258 result.data[i] = -data[i];
263 template<typename T, int Dimension>
264 Vector<T, Dimension>& Vector<T, Dimension>::operator += (const Vector<T, Dimension>& rhv)
266 for (int i = 0; i < Dimension; i++)
268 data[i] += rhv.data[i];
273 template<typename T, int Dimension>
274 Vector<T, Dimension>& Vector<T, Dimension>::operator += (const TypeReference rhv)
276 for (int i = 0; i < Dimension; i++)
283 template<typename T, int Dimension>
284 Vector<T, Dimension>& Vector<T, Dimension>::operator -= (const VectorType& rhv)
286 for (int i = 0; i < Dimension; i++)
288 data[i] -= rhv.data[i];
293 template<typename T, int Dimension>
294 Vector<T, Dimension>& Vector<T, Dimension>::operator -= (const TypeReference rhv)
296 for (int i = 0; i < Dimension; i++)
301 template<typename T, int Dimension>
302 Vector<T, Dimension>& Vector<T, Dimension>::operator *= (const VectorType& rhv)
304 for (int i = 0; i < Dimension; i++)
306 data[i] *= rhv.data[i];
311 template<typename T, int Dimension>
312 Vector<T, Dimension>& Vector<T, Dimension>::operator *= (const TypeReference rhv)
314 for (int i = 0; i < Dimension; i++)
321 template<typename T, int Dimension>
322 Vector<T, Dimension>& Vector<T, Dimension>::operator /= (const VectorType& rhv)
324 for (int i = 0; i < Dimension; i++)
326 data[i] /= rhv.data[i];
331 template<typename T, int Dimension>
332 Vector<T, Dimension>& Vector<T, Dimension>::operator /= (const TypeReference rhv)
334 for (int i = 0; i < Dimension; i++)
341 template<typename T, int Dimension>
342 T* Vector<T, Dimension>::GetPointer(void)
347 template<typename T, int Dimension>
348 const T* Vector<T, Dimension>::GetPointer(void) const
353 template<typename T, int Dimension>
354 Vector<T, Dimension>& Vector<T, Dimension>::Normalize(void)
356 const static T t0(0.0f);
358 const TypeReference dist = Length();
359 if (EffectsEqual(t0, dist))
364 return operator /= (dist);
367 template<typename T, int Dimension>
368 Vector<T, Dimension> Vector<T, Dimension>::GetNormalized(void) const
370 const static T t0(0.0f);
372 const T dist = Length();
373 if (EffectsEqual(t0, dist))
381 template<typename T, int Dimension>
382 Vector<T, Dimension>& Vector<T, Dimension>::Lerp(const VectorType& to, const TypeReference coeff)
384 for (int i = 0; i < Dimension; i++)
386 data[i] += (to.data[i] - data[i]) * coeff;
391 template<typename T, int Dimension>
392 Vector<T, Dimension> Vector<T, Dimension>::GetLerped(const VectorType& to, const TypeReference coeff) const
394 VectorType result(*this);
395 return result.Lerp(to, coeff);
398 template<typename T, int Dimension>
399 Vector<T, Dimension>& Vector<T, Dimension>::MakeLerped(const VectorType& from, const VectorType& to, const TypeReference coeff)
402 return Lerp(to, coeff);
405 template<typename T, int Dimension>
406 Vector<T, Dimension> Vector<T, Dimension>::CreateLerped(const VectorType& from, const VectorType& to, const TypeReference coeff)
408 return VectorType().MakeLerped(from, to, coeff);
411 template<typename T, int Dimension>
412 T Vector<T, Dimension>::Dot(const VectorType& other) const
415 for (int i = 0; i < Dimension; i++)
417 result += data[i] * other.data[i];
422 template<typename T, int Dimension>
423 T Vector<T, Dimension>::LengthSqr(void) const
426 for (int i = 0; i < Dimension; i++)
428 result += data[i] * data[i];
433 template<typename T, int Dimension>
434 T Vector<T, Dimension>::Length(void) const
436 return EffectsSqrt(LengthSqr());
439 template<typename T, int Dimension>
440 T Vector<T, Dimension>::DistanceSqr(const VectorType& other) const
443 for (int i = 0; i < Dimension; i++)
445 T t = data[i] - other.data[i];
451 template<typename T, int Dimension>
452 T Vector<T, Dimension>::Distance(const VectorType& other) const
454 return effects_sqrt(DistanceSqr(other));
457 template<typename T, int Dimension>
458 Vector<T, 2> Vector<T, Dimension>::Swizzle(unsigned int x, unsigned int y) const
460 return Vector<T, 2>(data[x], data[y]);
463 template<typename T, int Dimension>
464 Vector<T, 3> Vector<T, Dimension>::Swizzle(unsigned int x, unsigned int y, unsigned int z) const
466 return Vector<T, 3>(data[x], data[y], data[z]);
469 template<typename T, int Dimension>
470 Vector<T, 4> Vector<T, Dimension>::Swizzle(unsigned int x, unsigned int y, unsigned int z, unsigned int w) const
472 return Vector<T, 4>(data[x], data[y], data[z], data[w]);
475 template<typename T, int Dimension>
476 bool Vector<T, Dimension>::IsEqual(const Vector<T, Dimension>& rhv, const TypeReference epsilon) const
478 for (int i = 0; i < Dimension; i++)
480 if (!EffectsEqual(data[i], rhv.data[i], epsilon))
489 template<typename T, int Dimension>
490 bool IsEqual(const Vector<T, Dimension>& lhv, const Vector<T, Dimension>& rhv, const typename Vector<T, Dimension>::TypeReference epsilon)
492 return lhv.IsEqual(rhv, epsilon);
495 template<typename T, int Dimension>
496 Vector<T, Dimension> operator + (const Vector<T, Dimension>& lhv, const Vector<T, Dimension>& rhv)
498 Vector<T, Dimension> result;
499 for (int i = 0; i < Dimension; i++)
501 result.data[i] = lhv.data[i] + rhv.data[i];
506 template<typename T, int Dimension>
507 Vector<T, Dimension> operator + (const Vector<T, Dimension>& lhv, const typename Vector<T, Dimension>::TypeReference rhv)
509 Vector<T, Dimension> result;
510 for (int i = 0; i < Dimension; i++)
512 result.data[i] = lhv.data[i] + rhv;
517 template<typename T, int Dimension>
518 Vector<T, Dimension> operator + (const typename Vector<T, Dimension>::TypeReference lhv, const Vector<T, Dimension>& rhv)
520 Vector<T, Dimension> result;
521 for (int i = 0; i < Dimension; i++)
523 result.data[i] = lhv + rhv.data[i];
528 template<typename T, int Dimension>
529 Vector<T, Dimension> operator - (const Vector<T, Dimension>& lhv, const Vector<T, Dimension>& rhv)
531 Vector<T, Dimension> result;
532 for (int i = 0; i < Dimension; i++)
534 result.data[i] = lhv.data[i] - rhv.data[i];
539 template<typename T, int Dimension>
540 Vector<T, Dimension> operator - (const Vector<T, Dimension>& lhv, const typename Vector<T, Dimension>::TypeReference rhv)
542 Vector<T, Dimension> result;
543 for (int i = 0; i < Dimension; i++)
545 result.data[i] = lhv.data[i] - rhv;
550 template<typename T, int Dimension>
551 Vector<T, Dimension> operator - (const typename Vector<T, Dimension>::TypeReference lhv, const Vector<T, Dimension>& rhv)
553 Vector<T, Dimension> result;
554 for (int i = 0; i < Dimension; i++)
556 result.data[i] = lhv - rhv.data[i];
561 template<typename T, int Dimension>
562 Vector<T, Dimension> operator * (const Vector<T, Dimension>& lhv, const Vector<T, Dimension>& rhv)
564 Vector<T, Dimension> result;
565 for (int i = 0; i < Dimension; i++)
567 result.data[i] = lhv.data[i] * rhv.data[i];
572 template<typename T, int Dimension>
573 Vector<T, Dimension> operator * (const Vector<T, Dimension>& lhv, const typename Vector<T, Dimension>::TypeReference rhv)
575 Vector<T, Dimension> result;
576 for (int i = 0; i < Dimension; i++)
578 result.data[i] = lhv.data[i] * rhv;
583 template<typename T, int Dimension>
584 Vector<T, Dimension> operator * (const typename Vector<T, Dimension>::TypeReference lhv, const Vector<T, Dimension>& rhv)
586 Vector<T, Dimension> result;
587 for (int i = 0; i < Dimension; i++)
589 result.data[i] = lhv * rhv.data[i];
594 template<typename T, int Dimension>
595 Vector<T, Dimension> operator / (const Vector<T, Dimension>& lhv, const Vector<T, Dimension>& rhv)
597 Vector<T, Dimension> result;
598 for (int i = 0; i < Dimension; i++)
600 result.data[i] = lhv.data[i] / rhv.data[i];
605 template<typename T, int Dimension>
606 Vector<T, Dimension> operator / (const Vector<T, Dimension>& lhv, const typename Vector<T, Dimension>::TypeReference rhv)
608 Vector<T, Dimension> result;
609 for (int i = 0; i < Dimension; i++)
611 result.data[i] = lhv.data[i] / rhv;
616 template<typename T, int Dimension>
617 inline Vector<T, Dimension> operator / (const typename Vector<T, Dimension>::TypeReference lhv, const Vector<T, Dimension>& rhv)
619 Vector<T, Dimension> result;
620 for (int i = 0; i < Dimension; i++)
622 result.data[i] = lhv / rhv.data[i];
627 template<typename T, int Dimension>
628 bool operator == (const Vector<T, Dimension>& lhv, const Vector<T, Dimension>& rhv)
630 for (int i = 0; i < Dimension; i++)
632 if (!EffectsEqual(lhv.data[i], rhv.data[i]))
640 template<typename T, int Dimension>
641 bool operator == (const Vector<T, Dimension>& lhv, const typename Vector<T, Dimension>::TypeReference rhv)
643 for (int i = 0; i < Dimension; i++)
645 if (!EffectsEqual(lhv.data[i], rhv))
653 template<typename T, int Dimension>
654 bool operator == (const typename Vector<T, Dimension>::TypeReference lhv, const Vector<T, Dimension>& rhv)
656 for (int i = 0; i < Dimension; i++)
658 if (!EffectsEqual(lhv, rhv.data[i]))
666 template<typename T, int Dimension>
667 inline bool operator != (const Vector<T, Dimension>& lhv, const Vector<T, Dimension>& rhv)
669 return !(lhv == rhv);
672 template<typename T, int Dimension>
673 bool operator != (const Vector<T, Dimension>& lhv, const typename Vector<T, Dimension>::TypeReference rhv)
675 return !(lhv == rhv);
678 template<typename T, int Dimension>
679 bool operator != (const typename Vector<T, Dimension>::TypeReference lhv, const Vector<T, Dimension>& rhv)
681 return !(lhv == rhv);
684 }}}}} //Tizen::Ui::Effects::_Renderer::Math
686 #endif //_FUI_EFFECTS_INTERNAL_RENDERER_MATH_VECTOR_H_