OpenGTA/coldet/coldet_bld.cpp
Anonymous Maarten 78c27f03c8 2006-12-10
2015-12-03 01:37:02 +01:00

75 lines
2.3 KiB
C++

/* ColDet - C++ 3D Collision Detection Library
* Copyright (C) 2000 Amir Geva
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*
* Any comments, questions and bug reports send to:
* photon@photoneffect.com
*
* Or visit the home page: http://photoneffect.com/coldet/
*/
#include "sysdep.h"
#include "coldetimpl.h"
__CD__BEGIN
CollisionModel3D* newCollisionModel3D(bool Static)
{
return new CollisionModel3DImpl(Static);
}
CollisionModel3DImpl::CollisionModel3DImpl(bool Static)
: m_Root(Vector3D::Zero, Vector3D::Zero,0),
m_Transform(Matrix3D::Identity),
m_InvTransform(Matrix3D::Identity),
m_ColTri1(Vector3D::Zero,Vector3D::Zero,Vector3D::Zero),
m_ColTri2(Vector3D::Zero,Vector3D::Zero,Vector3D::Zero),
m_iColTri1(0),
m_iColTri2(0),
m_Final(false),
m_Static(Static)
{}
void CollisionModel3DImpl::addTriangle(const Vector3D& v1, const Vector3D& v2, const Vector3D& v3)
{
if (m_Final) throw Inconsistency();
m_Triangles.push_back(BoxedTriangle(v1,v2,v3));
}
void CollisionModel3DImpl::setTransform(const Matrix3D& m)
{
m_Transform=m;
if (m_Static) m_InvTransform=m_Transform.Inverse();
}
void CollisionModel3DImpl::finalize()
{
if (m_Final) throw Inconsistency();
// Prepare initial triangle list
m_Final=true;
for(unsigned i=0;i<m_Triangles.size();i++)
{
BoxedTriangle& bt=m_Triangles[i];
m_Root.m_Boxes.push_back(&bt);
}
int logdepth=0;
for(int num=m_Triangles.size();num>0;num>>=1,logdepth++);
m_Root.m_logdepth=int(logdepth*1.5f);
m_Root.divide(0);
}
__CD__END