00001
00002
00003
00006
00007
00008
00009
00010
00011
00012
00013
00014 #ifndef TA_COLLISIONOBJECTCONVEX_H
00015 #define TA_COLLISIONOBJECTCONVEX_H
00016
00017 #ifndef TA_REFCOUNT_H
00018 #include "../Common/RefCount.h"
00019 #endif // TA_REFCOUNT_H
00020
00021 #ifndef TA_AABB_H
00022 #include "../Common/AABB.h"
00023 #endif // TA_AABB_H
00024
00025 #ifndef TA_COLLISION_H
00026 #include "Collision.h"
00027 #endif // TA_COLLISION_H
00028
00029 #ifndef TA_COLLISIONOBJECTSIMPLE_H
00030 #include "CollisionObjectSimple.h"
00031 #endif // TA_COLLISIONOBJECTSIMPLE_H
00032
00033 TA_OBFUSCATION_SKIP_PASS_2
00034
00035 namespace TA
00036 {
00037
00038
00039
00040 struct MFrame;
00041 struct AABB;
00042 class ConvexHull;
00043 class CollisionObjectCachedPolyData;
00044
00045 class TAPHYSICS_CLASS CollisionObjectConvex : public CollisionObjectSimple
00046 {
00047 public:
00048 struct Data;
00049 struct PolygonVertex;
00050 struct Polygon;
00051 struct Edge;
00052 struct Vertex;
00053
00054 TA_OBFUSCATION_RESERVED_ON
00055 void Initialise();
00056 void InitialiseAsABox(float fSizeX, float fSizeY, float fSizeZ);
00057 void InitialiseAsABox(const AABB& aabb);
00058 void InitialiseAsAnOrientedBox(const AABB& aabb, const MFrame& mFrame);
00059 bool InitialiseFromPointList(const Vec3* pv3PointList, int nNumPoints);
00060 void InitialiseFromPlaneList(
00061 const Vec3* pv3PlaneNormalList,
00062 const Vec3* pv3PlanePointList,
00063 int nNumPlanes);
00064 void InitialiseFromConvexHull(ConvexHull& convexHull);
00065 void Finalise();
00067
00068 #ifndef TA_WRAPPER
00069 void Serialise(Serialiser& serialiser, const Version& version);
00070 #endif // TA_WRAPPER
00071
00072 bool Serialisable() const { return true; }
00073
00074 AABB CalculateBoundingBox() const;
00075 void CalculateMass(float fDensity, float& fMass, Vec3& v3CenterOfMass, Mat33& m33Inertia) const;
00076
00077 void Transform(const MFrame& frame);
00078 void Render(const MFrame& mFrame);
00079
00080 virtual bool TestLineForCollision(
00081 const Vec3& v3Start,
00082 const Vec3& v3Normal,
00083 float fLength,
00084 Collision& collision) const;
00085
00086 static CollisionObjectConvex* TAC_CALL CreateNew();
00087
00088 TA_OBFUSCATION_RESERVED_OFF
00089
00090 #ifndef DOXYGEN
00091 TA_DEFINE_FRIEND_SIMPLE_VS_SIMPLE_COLLISION(TestConvexObjectMovementAgainstConvexObject)
00092 TA_DEFINE_FRIEND_SIMPLE_VS_SIMPLE_COLLISION(TestCapsuleAgainstConvexObject)
00093 TA_DEFINE_FRIEND_SIMPLE_VS_SIMPLE_COLLISION(TestCylinderAgainstConvexObject)
00094 TA_DEFINE_FRIEND_SIMPLE_VS_SIMPLE_COLLISION(TestSphereAgainstConvexObject)
00095 TA_DEFINE_FRIEND_SIMPLE_VS_SIMPLE_COLLISION(TestLineListAgainstConvexObject)
00096
00097 TA_DEFINE_FRIEND_SIMPLE_VS_COMPLEX_COLLISION(TestConvexObjectAgainstCachedPolyData)
00098
00099 const Data* GetData() const { return m_pData; }
00100 #endif // DOXYGEN
00101
00102
00103
00104 private:
00105 Data* m_pData;
00106 #ifdef TA_DEBUG_LAST_POLY_COLLIDED
00107 mutable Polygon* m_pLastCollidedPolygon;
00108 #endif // TA_DEBUG_LAST_POLY_COLLIDED
00109
00110 CollisionObjectConvex();
00111 ~CollisionObjectConvex();
00112 void InitialiseCommon();
00113 void InitialiseAsABoxInternal(const AABB& aabb, const MFrame* pFrame);
00114
00115 virtual const char* GetFileHeaderString() const { return "TAColObjConvex"; }
00116
00117 void CalculateCenter();
00118 void CalculateNormals();
00119
00120 void FindClosestPolygonToPointList(
00121 int nNumPositions,
00122 const Vec3* pv3PositionList,
00123 int& nClosestPolygon,
00124 int& nClosestVertex,
00125 float& fClosestDistance) const;
00126
00127 void TestPointListAgainstPolygon(
00128 int nNumPositions,
00129 const Vec3* pv3PositionStartList,
00130 const Vec3* pv3PositionEndList,
00131 Polygon& polygon,
00132 CollisionCallData* pCollisionCallData,
00133 const MFrame& mFrame,
00134 float fNormalSign) const;
00135
00136 float UpdateClosestPolygonAndVertex(
00137 const Vec3* pv3TransformedPositionListB,
00138 const CollisionObjectConvex& objectB,
00139 int& nClosestPolygonA,
00140 int& nClosestVertexB) const;
00141
00142 int UpdateClosestVertex(
00143 int nClosestVertex,
00144 const Vec3& v3SeparatingVector) const;
00145
00146 int FindClosestVertexInDirection(const Vec3& v3SeparatingVector) const;
00147 };
00148
00149 #ifndef DOXYGEN
00150 TA_DEFINE_SIMPLE_VS_SIMPLE_COLLISION(TestConvexObjectMovementAgainstConvexObject)
00151 TA_DEFINE_SIMPLE_VS_SIMPLE_COLLISION(TestCapsuleAgainstConvexObject)
00152 TA_DEFINE_SIMPLE_VS_SIMPLE_COLLISION(TestCylinderAgainstConvexObject)
00153 TA_DEFINE_SIMPLE_VS_SIMPLE_COLLISION(TestCapsuleAgainstConvexSphere)
00154 TA_DEFINE_SIMPLE_VS_SIMPLE_COLLISION(TestLineListAgainstConvexObject)
00155 #endif
00156
00157 }
00158
00159 #endif
© Copyright 2004-2006 TRUE AXIS PTY LTD Australia. All rights reserved.