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

其他游戏

开发平台:

Visual C++

  1. #ifndef AF_PLANE
  2. #define AF_PLANE
  3. #include "afVec3.h"
  4. #include "afVec3n.h"
  5. #include <d3dx9.h>
  6. /// This class implements a plane
  7. class afPlane
  8. {
  9. public:
  10.     float x, y, z, d;
  11.     afPlane()  { x=y=z=d=0.0f; }
  12.     afPlane(float nX, float nY, float nZ, float nD)  { x=nX; y=nY; z=nZ; d=nD;  normalize(); }
  13. afPlane(const afPlane& tocopy)  { *this =  tocopy;}
  14. afPlane(const float *nVec)  { set(nVec); }
  15. afPlane(const afVec3& nVec1, const afVec3& nVec2, const afVec3& nVec3)  {  set(nVec1, nVec2, nVec3);  }
  16. afPlane(const afVec3& nPos, const afVec3& nNormal)  {  x = nNormal.x;  y = nNormal.y;  z = nNormal.z;
  17.    d = x*nPos.x + y*nPos.y + z*nPos.z;  normalize();  }
  18. afPlane(const afVec3& nPos, const afVec3n& nNormal)  {  x = nNormal.x;  y = nNormal.y;  z = nNormal.z;
  19. d = x*nPos.x + y*nPos.y + z*nPos.z;  }
  20. D3DXPLANE*
  21. getD3DPlane()  {  return reinterpret_cast<D3DXPLANE*>(this);  }
  22. const D3DXPLANE*
  23. getD3DPlane() const  {  return reinterpret_cast<const D3DXPLANE*>(this);  }
  24. void
  25. set(D3DXPLANE* nPlane)  {  *reinterpret_cast<D3DXPLANE*>(this) = *nPlane;  }
  26. void
  27. set(const float *nVec)  { x = nVec[0];  y = nVec[1];  z = nVec[2];  d = nVec[3]; }
  28. void
  29. set(float nX, float nY, float nZ, float nD)  { x = nX;  y = nY;  z = nZ;  d = nD;  normalize(); }
  30. inline void
  31. set(const afVec3& nVec1, const afVec3& nVec2, const afVec3& nVec3);
  32.     const float& 
  33. getX() const { return x; }
  34.     const float& 
  35. getY() const { return y; }
  36.     const float& 
  37. getZ() const { return z; }
  38.     const float& 
  39. getD() const { return d; }
  40. inline void
  41. normalize();
  42. inline afPlane& 
  43. operator=(const afPlane&);
  44. friend inline bool 
  45. operator==(const afPlane& left, const afPlane& right);
  46.     const float& 
  47. operator[](unsigned index) const  { return (&x)[index]; }
  48.     float& 
  49. operator[](unsigned index)  { return (&x)[index]; }
  50. };
  51. inline afPlane& afPlane::operator=(const afPlane& other)
  52. {
  53. x = other.x;
  54. y = other.y;
  55. z = other.z;
  56. d = other.d;
  57. return *this;
  58. }
  59. inline void afPlane::normalize()
  60. {
  61. float l = x*x + y*y + z*z;
  62. if(l==1.0f || l==0.0f)
  63. return;
  64. l = (float)sqrt(l);
  65. float il = 1.0f/l;
  66. x *= il; // normalize without
  67. y *= il; // moving the plane
  68. z *= il;
  69. d *= l;
  70. }
  71. inline bool 
  72. operator==(const afPlane& left, const afPlane& right)
  73. {
  74.     return (left.x==right.x && left.y==right.y && left.z==right.z && left.d==right.d);
  75. }
  76. // pass in the vertices clockwise order
  77. //
  78. inline void afPlane::set(const afVec3& nVec1, const afVec3& nVec2, const afVec3& nVec3)
  79. {
  80. afVec3 v12 = nVec2-nVec1,
  81. v13 = nVec3-nVec1,
  82. normal;
  83. normal.cross(v13, v12);
  84. normal.normalize();
  85. x = normal.x;
  86. y = normal.y;
  87. z = normal.z;
  88. d = normal * nVec1;
  89. }
  90. #endif