109 lines
3.7 KiB
C++
109 lines
3.7 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/
|
|
*/
|
|
#ifndef H_COLDET_IMPL
|
|
#define H_COLDET_IMPL
|
|
|
|
#include "coldet.h"
|
|
#include "box.h"
|
|
#include "math3d.h"
|
|
#include <vector>
|
|
|
|
__CD__BEGIN
|
|
|
|
class CollisionModel3DImpl : public CollisionModel3D
|
|
{
|
|
public:
|
|
CollisionModel3DImpl(bool Static);
|
|
void setTriangleNumber(int num) { if (!m_Final) m_Triangles.reserve(num); }
|
|
|
|
void addTriangle(float x1, float y1, float z1,
|
|
float x2, float y2, float z2,
|
|
float x3, float y3, float z3)
|
|
{
|
|
addTriangle(Vector3D(x1,y1,z1),
|
|
Vector3D(x2,y2,z2),
|
|
Vector3D(x3,y3,z3));
|
|
}
|
|
void addTriangle(float v1[3], float v2[3], float v3[3])
|
|
{
|
|
addTriangle(Vector3D(v1[0],v1[1],v1[2]),
|
|
Vector3D(v2[0],v2[1],v2[2]),
|
|
Vector3D(v3[0],v3[1],v3[2]));
|
|
}
|
|
void addTriangle(const Vector3D& v1, const Vector3D& v2, const Vector3D& v3);
|
|
void finalize();
|
|
|
|
void setTransform(float m[16]) { setTransform(*(Matrix3D*)m); }
|
|
void setTransform(const Matrix3D& m);
|
|
|
|
bool collision(CollisionModel3D* other,
|
|
int AccuracyDepth,
|
|
int MaxProcessingTime,
|
|
float* other_transform);
|
|
|
|
bool rayCollision(float origin[3], float direction[3], bool closest,
|
|
float segmin, float segmax);
|
|
bool sphereCollision(float origin[3], float radius);
|
|
|
|
bool getCollidingTriangles(float t1[9], float t2[9], bool ModelSpace);
|
|
bool getCollidingTriangles(int& t1, int& t2);
|
|
bool getCollisionPoint(float p[3], bool ModelSpace);
|
|
|
|
|
|
int getTriangleIndex(BoxedTriangle* bt)
|
|
{
|
|
//return int(bt-m_Triangles.begin());
|
|
return int(bt-&(*m_Triangles.begin()));
|
|
}
|
|
|
|
/** Stores all the actual triangles. Other objects will use
|
|
pointers into this array.
|
|
*/
|
|
std::vector<BoxedTriangle> m_Triangles;
|
|
/** Root of the hierarchy tree */
|
|
BoxTreeInnerNode m_Root;
|
|
/** The current transform and its inverse */
|
|
Matrix3D m_Transform,m_InvTransform;
|
|
/** The triangles that last collided */
|
|
Triangle m_ColTri1,m_ColTri2;
|
|
/** The indices of the triangles that last collided */
|
|
int m_iColTri1,m_iColTri2;
|
|
/** The collision point of the last test */
|
|
Vector3D m_ColPoint;
|
|
|
|
/** Type of the last collision test */
|
|
enum { Models, Ray, Sphere }
|
|
m_ColType;
|
|
/** Flag for indicating the model is finalized. */
|
|
bool m_Final;
|
|
/** Static models will maintain the same transform for a while
|
|
so the inverse transform is calculated each set instead
|
|
of in the collision test. */
|
|
bool m_Static;
|
|
};
|
|
|
|
__CD__BEGIN
|
|
|
|
#endif // H_COLDET_IMPL
|