True Axis Physics SDK 1.2.0.1 Beta Documentation
www.trueaxis.com

CollisionObjectCachedPolyData.h

Go to the documentation of this file.
00001 //---------------------------------------------------------------------------------
00002 // File Name: CollisionObjectCachedPolyData.h
00003 // Description: 
00004 //      Used to put polygon data into on the fly for collision detection against
00005 //      other collision object types. Used for collision detection against
00006 //      CollisionObjectAABBMesh which uses an AABB tree.
00009 //
00010 // Copyright (C) 2004 - 2006 True Axis Pty Ltd, Australia. 
00011 // All Rights Reserved.
00012 //
00013 // History:
00014 //      Created File.
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" // would be nice if this header file could be avoided here
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 // Pseudo polygon structure
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         //void SetNumVertices(int nNumVertices);
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     //void CacheLocalPolygonOfMesh(const CollisionObjectComplex& collisionObjectComplex, const AABB& aabb);
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 // DOXYGEN
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 //inline void CollisionObjectCachedPolyData::Polygon::SetNumVertices(int nNumVertices) { this->nNumVertices = nNumVertices; }
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.