00001
00002
00003
00004
00005
00006
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef TA_COLLISIONOBJECTCACHEDPOLYDATA_H
00018 #define TA_COLLISIONOBJECTCACHEDPOLYDATA_H
00019
00020 #ifndef TA_ARRAY_H
00021 #include "../Common/Array.h"
00022 #endif // TA_ARRAY_H
00023
00024 #ifndef TA_AABBTREE_H
00025 #include "../Common/AABBTree.h"
00026 #endif // TA_AABBTREE_H
00027
00028 #ifndef TA_COLLISIONCONSTANTS_H
00029 #include "CollisionConstants.h"
00030 #endif // TA_COLLISIONCONSTANTS_H
00031
00032 #ifndef TA_COLLISION_H
00033 #include "Collision.h"
00034 #endif // TA_COLLISION_H
00035
00036 #ifndef TA_COLLISIONOBJECT_H
00037 #include "CollisionObject.h"
00038 #endif // TA_COLLISIONOBJECT_H
00039
00040 TA_OBFUSCATION_SKIP_PASS_2
00041
00042 namespace TA
00043 {
00044
00045 struct AABB;
00046 class CollisionObjectSimple;
00047
00048 class CollisionObjectCachedPolyData : public CollisionObject
00049 {
00050 public:
00051 TA_OBFUSCATION_RESERVED_ON
00052 struct Vertex
00053 {
00054 const Vec3& GetPosition();
00055 void SetPosition(const Vec3& v3Position);
00056 const Vec3& GetEdgeNormal();
00057 void SetEdgeNormal(const Vec3& v3EdgeNormal);
00058 TA_OBFUSCATION_RESERVED_OFF
00059 #ifndef TA_COLLISION_FRIEND
00060 private:
00061 #endif // TA_COLLISION_FRIEND
00062 Vec3 v3Position;
00063 Vec3 v3EdgeNormal;
00064 };
00065 TA_OBFUSCATION_RESERVED_ON
00066 struct Polygon
00067 {
00068 const Vec3& GetNormal();
00069 void SetNormal(const Vec3& v3Normal);
00070 int GetAttribute() const;
00071 void SetAttribute(int nAttribute);
00072 int GetNumVertices() const;
00073 void SetCollisionID(u32 nCollisionID);
00074 u32 GetCollisionID() const;
00075
00076 Vertex& GetVertex(int nIndex);
00077 const Vertex& GetVertex(int nIndex) const;
00078 void GenerateEdgeNormals();
00079 TA_OBFUSCATION_RESERVED_OFF
00080 #ifndef TA_COLLISION_FRIEND
00081 private:
00082 #endif // TA_COLLISION_FRIEND
00083 Vec3 v3Normal;
00084 int nAttribute;
00085 int nNumVertices;
00086 u32 nCollisionID;
00087 u32 nPadd1;
00088 Vertex pVertexList[k_nMaxNumVerticesInPolygon];
00089 };
00090
00091 void Initialise();
00092 void Finalise();
00093
00094 TA_OBFUSCATION_RESERVED_ON
00095 void Clear();
00096 Polygon* GetNewPolygon(int nNumVertices);
00097 TA_OBFUSCATION_RESERVED_OFF
00098
00099
00100 #ifndef DOXYGEN
00101 const u8* GetData() const { return &m_data[0]; }
00102 const u8* GetDataPtrAt(int nIndex) const { return &m_data[nIndex]; }
00103 int GetDataSize() const { return m_data.GetSize(); }
00104 static int TAC_CALL CalculatePolygonSize(int nNumVertices) { return sizeof (Vec3) + sizeof (int) * 4 + sizeof (Vertex) * nNumVertices; }
00105 #endif // DOXYGEN
00106
00107 #ifndef DOXYGEN
00108 virtual bool TestLineForCollision(
00109 const Vec3& v3Start,
00110 const Vec3& v3Normal,
00111 float fLength,
00112 Collision& collision) const { return false; }
00113
00114 CollisionObject* GetCachedFrom() { return m_pCachedFrom; }
00115 void SetCachedFrom(CollisionObject* pCachedFrom) { m_pCachedFrom = pCachedFrom; }
00116
00117 TA_DEFINE_FRIEND_SIMPLE_VS_COMPLEX_COLLISION(TestConvexObjectAgainstCachedPolyData)
00118
00119 #endif
00120
00121 static CollisionObjectCachedPolyData* TAC_CALL CreateNew();
00122
00123 protected:
00124 CollisionObjectCachedPolyData();
00125 ~CollisionObjectCachedPolyData();
00126
00127 private:
00128 Array<u8, false> m_data;
00129
00130 virtual const AABB& GetAABB() const { return NoGetAABB(); }
00131
00132 static void TAC_CALL AABBTreeCallback(AABBTree::Item* pItem, void* pData);
00133 CollisionObject* m_pCachedFrom;
00134 };
00135
00136 inline const Vec3& CollisionObjectCachedPolyData::Vertex::GetPosition() { return v3Position; }
00137 inline void CollisionObjectCachedPolyData::Vertex::SetPosition(const Vec3& v3Position) { this->v3Position = v3Position; }
00138 inline const Vec3& CollisionObjectCachedPolyData::Vertex::GetEdgeNormal() { return v3EdgeNormal; }
00139 inline void CollisionObjectCachedPolyData::Vertex::SetEdgeNormal(const Vec3& v3EdgeNormal) { this->v3EdgeNormal = v3EdgeNormal; }
00140 inline const Vec3& CollisionObjectCachedPolyData::Polygon::GetNormal() { return v3Normal; }
00141 inline void CollisionObjectCachedPolyData::Polygon::SetNormal(const Vec3& v3Normal) { this->v3Normal = v3Normal; }
00142 inline int CollisionObjectCachedPolyData::Polygon::GetAttribute() const { return nAttribute; }
00143 inline void CollisionObjectCachedPolyData::Polygon::SetCollisionID(u32 nCollisionID) { this->nCollisionID = nCollisionID; }
00144 inline u32 CollisionObjectCachedPolyData::Polygon::GetCollisionID() const { return nCollisionID; }
00145 inline void CollisionObjectCachedPolyData::Polygon::SetAttribute(int nAttribute) { this->nAttribute = nAttribute; }
00146 inline int CollisionObjectCachedPolyData::Polygon::GetNumVertices() const { return nNumVertices; }
00147
00148 inline CollisionObjectCachedPolyData::Vertex& CollisionObjectCachedPolyData::Polygon::GetVertex(int nIndex) { TA_ASSERT(nIndex >= 0); TA_ASSERT(nIndex < nNumVertices); return pVertexList[nIndex]; }
00149 inline const CollisionObjectCachedPolyData::Vertex& CollisionObjectCachedPolyData::Polygon::GetVertex(int nIndex) const { return pVertexList[nIndex]; }
00150 inline void CollisionObjectCachedPolyData::Clear() { m_data.Clear(); }
00151
00152 #ifndef DOXYGEN
00153
00154 void TAC_CALL CollisionObjectCachedPolyData_InitialisePointAndEdgeCollisions();
00155
00156 void TAC_CALL CollisionObjectCachedPolyData_ProcessPointAndEdgeCollisions(CollisionCallData* pCollisionCallData);
00157
00158 void TAC_CALL CollisionObjectCachedPolyData_AddPointCollision(
00159 float fTime,
00160 float fIntersectingDepth,
00161 const CollisionObjectCachedPolyData::Polygon* pPolygon,
00162 int nVertex,
00163 bool bConstrain,
00164 const Vec3& v3PointPosition,
00165 const Vec3& v3CollisionPosition,
00166 const Vec3& v3Normal);
00167
00168 void TAC_CALL CollisionObjectCachedPolyData_DisallowPointCollision(
00169 const Vec3& v3PointCollision,
00170 const Vec3& v3EdgeDir);
00171
00172 enum
00173 {
00174 DISALLOW_POINT_COLLISION_CONSTRAINED_TO_FACE = 0,
00175 DISALLOW_POINT_COLLISION_CONSTRAINED_TO_EDGE,
00176 };
00177
00178 void TAC_CALL CollisionObjectCachedPolyData_DisallowPointCollision(
00179 const Vec3& v3PointCollision,
00180 int nType);
00181
00182 void TAC_CALL CollisionObjectCachedPolyData_AddEdgeCollision(
00183 float fTime,
00184 float fIntersectingDepth,
00185 u32 nAttribute,
00186 const Vec3& v3EdgePosA,
00187 const Vec3& v3EdgePosB,
00188 const Vec3& v3CollisionPosition,
00189 const Vec3& v3Normal,
00190 int nType);
00191
00192 void TAC_CALL CollisionObjectCachedPolyData_DisallowEdgeCollision(
00193 const Vec3& v3EdgePosA,
00194 const Vec3& v3EdgePosB,
00195 int nType);
00196
00197 #endif // DOXYGEN
00198
00199 };
00200
00201
00202 #endif // TA_COLLISIONOBJECTCACHEDPOLYDATA_H
© Copyright 2004-2006 TRUE AXIS PTY LTD Australia. All rights reserved.