00001 #ifndef H_COLDET_IMPL
00002 #define H_COLDET_IMPL
00003
00004 #include "coldet.h"
00005 #include "box.h"
00006 #include "math3d.h"
00007 #include <vector>
00008
00009 __CD__BEGIN
00010
00011 class CollisionModel3DImpl : public CollisionModel3D
00012 {
00013 public:
00014 CollisionModel3DImpl(bool Static);
00015 void setTriangleNumber(int num) { if (!m_Final) m_Triangles.reserve(num); }
00016
00017 void addTriangle(float x1, float y1, float z1,
00018 float x2, float y2, float z2,
00019 float x3, float y3, float z3)
00020 {
00021 addTriangle(Vector3D(x1,y1,z1),
00022 Vector3D(x2,y2,z2),
00023 Vector3D(x3,y3,z3));
00024 }
00025 void addTriangle(float v1[3], float v2[3], float v3[3])
00026 {
00027 addTriangle(Vector3D(v1[0],v1[1],v1[2]),
00028 Vector3D(v2[0],v2[1],v2[2]),
00029 Vector3D(v3[0],v3[1],v3[2]));
00030 }
00031 void addTriangle(const Vector3D& v1, const Vector3D& v2, const Vector3D& v3);
00032 void finalize();
00033
00034 void setTransform(float m[16]) { setTransform(*(Matrix3D*)m); }
00035 void setTransform(const Matrix3D& m);
00036
00037 bool collision(CollisionModel3D* other,
00038 int AccuracyDepth,
00039 int MaxProcessingTime,
00040 float* other_transform);
00041
00042 bool rayCollision(float origin[3], float direction[3], bool closest,
00043 float segmin, float segmax);
00044 bool sphereCollision(float origin[3], float radius);
00045
00046 bool getCollidingTriangles(float t1[9], float t2[9], bool ModelSpace);
00047 bool getCollidingTriangles(int& t1, int& t2);
00048 bool getCollisionPoint(float p[3], bool ModelSpace);
00049
00050
00051 int getTriangleIndex(BoxedTriangle* bt)
00052 {
00053 return int(bt-m_Triangles.begin());
00054 }
00055
00059 std::vector<BoxedTriangle> m_Triangles;
00061 BoxTreeInnerNode m_Root;
00063 Matrix3D m_Transform,m_InvTransform;
00065 Triangle m_ColTri1,m_ColTri2;
00067 int m_iColTri1,m_iColTri2;
00069 Vector3D m_ColPoint;
00070
00072 enum { Models, Ray, Sphere }
00073 m_ColType;
00075 bool m_Final;
00079 bool m_Static;
00080 };
00081
00082 __CD__BEGIN
00083
00084 #endif // H_COLDET_IMPL