afVec4.h
上传用户:kaiguan
上传日期:2007-10-28
资源大小:1074k
文件大小:4k
源码类别:

其他游戏

开发平台:

Visual C++

  1. #ifndef AF_VEC4
  2. #define AF_VEC4
  3. /// 4D vector class
  4. class afVec4
  5. {
  6. public:
  7.     float x, y, z, w;
  8.     typedef float float4[4];
  9.     afVec4() { x=y=z=w=0.0f;  }
  10.     afVec4( float nX, float nY, float nZ , float nW ) { x=nX; y=nY; z=nZ;w = nW; }              
  11.     afVec4(const float4& xyzw) { x = xyzw[0]; y = xyzw[1]; z = xyzw[2]; w = xyzw[3]; }
  12.     afVec4& operator/=(float div)      { x /= div; y /= div; z /= div; w /= div; return *this; }
  13.     afVec4& operator*=(float scale)    { x *= scale; y *= scale; z *= scale; w *= scale; return *this; }
  14.     const float& getX() const { return x; }
  15.     const float& getR() const { return x; }
  16.     const float& getY() const { return y; }
  17. const float& getG() const { return y; }
  18.     const float& getZ() const { return z; }
  19. const float& getB() const { return z; }
  20.     const float& getW() const { return w; }
  21. const float& getA() const { return w; }
  22.     float length();
  23.     float sqrLength()  {  return x*x + y*y + z*z + w*w;  }
  24.     friend afVec4 operator*(const afVec4& vec, float scale);
  25.     friend afVec4 operator*(float scale, const afVec4& vec);
  26. static float afVec4::distance(const afVec4& left, const afVec4& right);
  27.     void makeHomogen();
  28.     const float& 
  29. operator[](unsigned index) const { return (&x)[index]; }
  30.     float& 
  31. operator[](unsigned index) { return (&x)[index]; }
  32. inline afVec4&
  33. operator=( const afVec4& );
  34.     inline afVec4& 
  35. operator+=( const afVec4& );
  36.     inline afVec4& 
  37. operator-=( const afVec4& );
  38.     inline afVec4& 
  39. operator*=( const afVec4&  );
  40. friend inline bool 
  41. operator==(const afVec4& left, const afVec4& right);
  42.     friend inline const afVec4
  43. operator+(const afVec4& left, const afVec4& right);
  44.     friend inline const afVec4 
  45. operator-(const afVec4& left, const afVec4& right);
  46.     friend inline const afVec4
  47. operator*(const afVec4& left, const afVec4& right);
  48.     friend inline const afVec4 
  49. operator/(const afVec4& left, const afVec4& right);
  50.     friend inline const afVec4 
  51. operator+(const afVec4& right);
  52.     friend inline const afVec4 
  53. operator-(const afVec4& right);
  54. };
  55. /// Color defined by quadruple of [0.0-1.0] float values
  56. typedef afVec4 afColor;
  57. typedef afVec4 *afVec4Ptr;
  58. inline
  59. afVec4 operator*(const afVec4& vec, float scale)
  60. {
  61.     return afVec4(vec.x*scale, vec.y*scale, vec.z*scale, vec.w*scale);
  62. }
  63. inline
  64. afVec4 operator*(float scale, const afVec4& vec)
  65. {
  66.     return afVec4(scale*vec.x, scale*vec.y, scale*vec.z, scale*vec.w);
  67. }
  68. inline afVec4& 
  69. afVec4::operator+=( const afVec4& other)
  70. {
  71. x += other.x;
  72. y += other.y;
  73. z += other.z;
  74. w += other.w;
  75. return *this;
  76. }
  77. inline afVec4& 
  78. afVec4::operator-=( const afVec4& other)
  79. {
  80. x -= other.x;
  81. y -= other.y;
  82. z -= other.z;
  83. w -= other.w;
  84. return *this;
  85. }
  86. inline afVec4& 
  87. afVec4::operator*=( const afVec4&  other)
  88. {
  89. x *= other.x;
  90. y *= other.y;
  91. z *= other.z;
  92. w *= other.w;
  93. return *this;
  94. }
  95. inline bool 
  96. operator==(const afVec4& left, const afVec4& right)
  97. {
  98.     return ( left.x == right.x
  99.           && left.y == right.y
  100.   && left.z == right.z
  101.           && left.w == right.w );
  102. }
  103. inline const afVec4
  104. operator+(const afVec4& left, const afVec4& right)
  105. {
  106. return afVec4(left.x+right.x,left.y+right.y,left.z+right.z,left.w+right.w);
  107. }
  108. inline const afVec4
  109. operator-(const afVec4& left, const afVec4& right)
  110. {
  111. return afVec4(left.x-right.x,left.y-right.y,left.z-right.z,left.w-right.w);
  112. }
  113. inline const afVec4
  114. operator*(const afVec4& left, const afVec4& right)
  115. {
  116. return afVec4(left.x*right.x,left.y*right.y,left.z*right.z,left.w*right.w);
  117. }
  118. inline const afVec4
  119. operator/(const afVec4& left, const afVec4& right)
  120. {
  121. return afVec4(left.x/right.x,left.y/right.y,left.z/right.z,left.w/right.w);
  122. }
  123. inline const afVec4
  124. operator+(const afVec4& right)
  125. {
  126. return afVec4(right.x,right.y,right.z,right.w);
  127. }
  128. inline const afVec4
  129. operator-(const afVec4& right)
  130. {
  131. return afVec4(-right.x,-right.y,-right.z,-right.w);
  132. }
  133. inline afVec4&
  134. afVec4::operator=(const afVec4& vec)
  135. {
  136.     x = vec.x;
  137.     y = vec.y;
  138. z = vec.z;
  139. w = vec.w;
  140.     return *this;
  141. }
  142. #endif