00001 #include "sysdep.h"
00002 #include "coldetimpl.h"
00003
00004 __CD__BEGIN
00005
00006 CollisionModel3D* newCollisionModel3D(bool Static)
00007 {
00008 return new CollisionModel3DImpl(Static);
00009 }
00010
00011 CollisionModel3DImpl::CollisionModel3DImpl(bool Static)
00012 : m_Root(Vector3D::Zero, Vector3D::Zero,0),
00013 m_Transform(Matrix3D::Identity),
00014 m_InvTransform(Matrix3D::Identity),
00015 m_ColTri1(Vector3D::Zero,Vector3D::Zero,Vector3D::Zero),
00016 m_ColTri2(Vector3D::Zero,Vector3D::Zero,Vector3D::Zero),
00017 m_iColTri1(0),
00018 m_iColTri2(0),
00019 m_Final(false),
00020 m_Static(Static)
00021 {}
00022
00023 void CollisionModel3DImpl::addTriangle(const Vector3D& v1, const Vector3D& v2, const Vector3D& v3)
00024 {
00025 if (m_Final) throw Inconsistency();
00026 m_Triangles.push_back(BoxedTriangle(v1,v2,v3));
00027 }
00028
00029 void CollisionModel3DImpl::setTransform(const Matrix3D& m)
00030 {
00031 m_Transform=m;
00032 if (m_Static) m_InvTransform=m_Transform.Inverse();
00033 }
00034
00035 void CollisionModel3DImpl::finalize()
00036 {
00037 if (m_Final) throw Inconsistency();
00038
00039 m_Final=true;
00040 for(unsigned i=0;i<m_Triangles.size();i++)
00041 {
00042 BoxedTriangle& bt=m_Triangles[i];
00043 m_Root.m_Boxes.push_back(&bt);
00044 }
00045 int logdepth=0;
00046 for(int num=m_Triangles.size();num>0;num>>=1,logdepth++);
00047 m_Root.m_logdepth=int(logdepth*1.5f);
00048 m_Root.divide(0);
00049 }
00050
00051 __CD__END