Vec4.h
上传用户:chinafayin
上传日期:2022-04-05
资源大小:153k
文件大小:7k
源码类别:

并行计算

开发平台:

Visual C++

  1. /*
  2.     Linear Algebra / Math library
  3.     Copyright (C) 2003-2009, Marek Olsak (maraeo@gmail.com), All Rights Reserved.
  4.     Copyright (C) 2003-2005, Tomas Pastorek (tomas@tomaspastorek.cz), All Rights Reserved.
  5.     This program is free software; you can redistribute it and/or
  6.     modify it under the terms of the GNU General Public License
  7.     as published by the Free Software Foundation; either version 2
  8.     of the License, or (at your option) any later version.
  9.     This program is distributed in the hope that it will be useful,
  10.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12.     GNU General Public License for more details.
  13.     You should have received a copy of the GNU General Public License
  14.     along with this program; if not, write to the Free Software
  15.     Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  16. */
  17. #pragma once
  18. namespace Rune
  19. {
  20.     /**
  21.         Ctyrrozmerny vektor
  22.     **************************************************************************************************/
  23.     template<typename T>
  24.     class Vec4
  25.     {
  26.     public:
  27.         typedef Rune::Vec2<T> Vec2;
  28.         typedef Rune::Vec3<T> Vec3;
  29.         T x, y, z, w;
  30.         operator Vec3() const                           { return Vec3(x, y, z); } // This implicit conversion should not be allowed!
  31.         Vec4()                                          {}
  32.         Vec4(T f)                                       { x = f; y = f; z = f; w = f; }
  33.         Vec4(T X, T Y, T Z, T W)                        { x = X; y = Y; z = Z; w = W; }
  34.         Vec4(T X, T Y, const Vec2 &v)                   { x = X; y = Y; z = v.x; w = v.y; }
  35.         Vec4(T X, const Vec2 &v, T W)                   { x = X; y = v.x; z = v.y; w = W; }
  36.         Vec4(const Vec2 &v, T Z, T W)                   { x = v.x; y = v.y; z = Z; w = W; }
  37.         Vec4(const Vec2 &v1, const Vec2 &v2)            { x = v1.x; y = v1.y; z = v2.x; w = v2.y; }
  38.         Vec4(const Vec3 &v, T W)                        { x = v.x; y = v.y; z = v.z; w = W; }
  39.         Vec4(T X, const Vec3 &v)                        { x = X; y = v.x; z = v.y; w = v.z; }
  40.         template<typename U>
  41.         explicit Vec4(const Vec4<U> &v)                 { x = T(v.x); y = T(v.y); z = T(v.z); w = T(v.w); }
  42.         bool operator == (const Vec4 &v) const          { return x == v.x && y == v.y && z == v.z && w == v.w; }
  43.         bool operator != (const Vec4 &v) const          { return x != v.x && y != v.y && z != v.z && w != v.w; }
  44.         bool operator <(const Vec4 &v) const            { return x < v.x && y < v.y && z < v.z && w < v.w; }
  45.         bool operator >(const Vec4 &v) const            { return x > v.x && y > v.y && z > v.z && w > v.w; }
  46.         bool operator <=(const Vec4 &v) const           { return x <= v.x && y <= v.y && z <= v.z && w <= v.w; }
  47.         bool operator >=(const Vec4 &v) const           { return x >= v.x && y >= v.y && z >= v.z && w >= v.w; }
  48.         bool operator ==(T f) const                     { return x == f && y == f && z == f && w == f; }
  49.         bool operator !=(T f) const                     { return x != f && y != f && z != f && w != f; }
  50.         bool operator <(T f) const                      { return x < f && y < f && z < f && w < f; }
  51.         bool operator >(T f) const                      { return x > f && y > f && z > f && w > f; }
  52.         bool operator <=(T f) const                     { return x <= f && y <= f && z <= f && w <= f; }
  53.         bool operator >=(T f) const                     { return x >= f && y >= f && z >= f && w >= f; }
  54.         void operator = (const Vec4 &v)                 { x = v.x; y = v.y; z = v.z; w = v.w; }
  55.         void operator +=(const Vec4 &v)                 { x += v.x; y += v.y; z += v.z; w += v.w; }
  56.         void operator +=(T f)                           { x += f; y += f; z += f; w += f; }
  57.         void operator -=(const Vec4 &v)                 { x -= v.x; y -= v.y; z -= v.z; w -= v.w; }
  58.         void operator -=(T f)                           { x -= f; y -= f; z -= f; w -= f; }
  59.         void operator *=(const Vec4 &v)                 { x *= v.x; y *= v.y; z *= v.z; w *= v.w; }
  60.         void operator *=(T f)                           { x *= f; y *= f; z *= f; w *= f; }
  61.         void operator /=(T f)                           { x /= f; y /= f; z /= f; w /= f; }
  62.         Vec4 operator +(const Vec4 &v) const            { return Vec4(x+v.x, y+v.y, z+v.z, w+v.w); }
  63.         Vec4 operator +(T f) const                      { return Vec4(x+f, y+f, z+f, w+f); }
  64.         Vec4 operator -(const Vec4 &v) const            { return Vec4(x-v.x, y-v.y, z-v.z, w-v.w); }
  65.         Vec4 operator -(T f) const                      { return Vec4(x-f, y-f, z-f, w-f); }
  66.         Vec4 operator *(const Vec4 &v) const            { return Vec4(x*v.x, y*v.y, z*v.z, w*v.w); }
  67.         Vec4 operator *(T f) const                      { return Vec4(x*f, y*f, z*f, w*f); }
  68.         Vec4 operator /(T f) const                      { return Vec4(x/f, y/f, z/f, w/f); }
  69.         Vec4 operator -() const                         { return Vec4(-x, -y, -z, -w); }
  70.         T& operator[] (int i)                           { return (&x)[i]; }
  71.         T operator[] (int i) const                      { return (&x)[i]; }
  72.         Vec4 GetAbs() const                             { return Vec4(Math<T>::Abs(x), Math<T>::Abs(y), Math<T>::Abs(z), Math<T>::Abs(w)); }
  73.         Vec4 GetNormalized() const                      { T f = MagnitudeInv(); return Vec4(x*f, y*f, z*f, w*f); }
  74.         T Magnitude() const                             { return Math<T>::Sqrt(MagnitudeSqr()); }
  75.         T MagnitudeInv() const                          { return Math<T>::Rsqrt(MagnitudeSqr()); }
  76.         T MagnitudeSqr() const                          { return x*x + y*y + z*z + w*w; }
  77.         void Normalize()                                { operator *=(MagnitudeInv()); }
  78.         bool IsEmpty() const                            { return x == 0 && y == 0 && z == 0 && w == 0; }
  79.         void PackTo01()                                 { operator *=(0.5f); operator +=(0.5f); }
  80.         void PackBack()                                 { operator -=(0.5f); operator *=(2); }
  81.         void Set(const T X, const T Y, const T Z, const T W) { x = X; y = Y; z = Z; w = W; }
  82.         void Inverse()                                  { x = 1/x; y = 1/y; z = 1/z; w = 1/w; }
  83.         Vec4 Frac() const                               { return Vec4(Math<T>::Frac(x), Math<T>::Frac(y), Math<T>::Frac(z), Math<T>::Frac(w)); }
  84.         RUNEMATH_API bool SafeIsEqual(const Vec4 &v) const;
  85.         RUNEMATH_API static T Dot(const Vec4 &v1, const Vec4 &v2);
  86.         RUNEMATH_API static Vec4 Cross(const Vec4 &a, const Vec4 &b, const Vec4 &c);
  87.     };
  88.     template<typename T>
  89.     std::ostream& operator <<(std::ostream &stream, const Vec4<T> &v)
  90.     {
  91.         return stream << ("(" + tostrf(v.x) + ", " + tostrf(v.y) + ", " + tostrf(v.z) + ", " + tostrf(v.w) + ")");
  92.     }
  93.     template<typename T>
  94.     std::istream& operator >>(std::istream &stream, Vec4<T> &v)
  95.     {
  96.         char tmp;
  97.         return stream >> tmp >> v.x >> tmp >> v.y >> tmp >> v.z >> tmp >> v.w >> tmp;
  98.     }
  99.     typedef Vec4<float> Vec4f;
  100.     typedef Vec4<double> Vec4d;
  101.     typedef Vec4<int32> Vec4i;
  102.     typedef Vec4<bool> Vec4b;
  103. }