00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef __CS_OBB_H__
00021 #define __CS_OBB_H__
00022
00029 #include "csgeom/box.h"
00030 #include "csgeom/matrix3.h"
00031
00032 class csVector3;
00033 class csReversibleTransform;
00034
00039 class csOBB : public csBox3
00040 {
00041 private:
00042 csMatrix3 mMat;
00043
00044 public:
00048 csOBB () {}
00049
00053 csOBB (const csOBB &b) : csBox3 (b), mMat (b.mMat) { }
00054
00058 csOBB (const csBox3 &b) : csBox3 (b) { }
00059
00067 csOBB (const csVector3 &dir1, const csVector3 &dir2,
00068 const csVector3 &dir3);
00069
00070 void AddBoundingVertex (const csVector3 &v);
00071 csVector3 GetCorner (int corner) const;
00072 const csMatrix3 &GetMatrix () const { return mMat; }
00073
00077 float Diameter ();
00078
00082 float Volume ();
00083
00089 void FindOBB (const csVector3 *vertex_table, int num, float eps = 0.0);
00090
00096 void FindOBBAccurate (const csVector3 *vertex_table, int num);
00097 };
00098
00102 class csOBBFrozen
00103 {
00104 private:
00105 csVector3 corners[8];
00106
00107 public:
00111 void Copy (const csOBB& obb)
00112 {
00113 for (int i = 0 ; i < 8 ; i++)
00114 {
00115 corners[i] = obb.GetCorner (i);
00116 }
00117 }
00118
00122 csOBBFrozen (const csOBB& obb)
00123 {
00124 Copy (obb);
00125 }
00126
00133 csOBBFrozen (const csOBB& obb, const csReversibleTransform& trans);
00134
00138 const csVector3& GetCorner (int corner) const
00139 {
00140 CS_ASSERT (corner >= 0 && corner < 8);
00141 return corners[corner];
00142 }
00143
00148 bool ProjectOBB (float fov, float sx, float sy, csBox2& sbox,
00149 float& min_z, float& max_z);
00150 };
00151
00154 #endif // __CS_OBB_H__
00155