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

CollisionObjectConvex.h

Go to the documentation of this file.
00001 //---------------------------------------------------------------------------------
00002 // File Name: CollisionObjectConvex.h
00003 // Description:
00006 //
00007 // Copyright (C) 2004 - 2006 True Axis Pty Ltd, Australia. 
00008 // All Rights Reserved.
00009 //
00010 // History:
00011 //      Created File.
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 //#define TA_DEBUG_LAST_POLY_COLLIDED
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 // DOXYGEN
00156 
00157 }
00158 
00159 #endif // TA_COLLISIONOBJECTCONVEX_H


© Copyright 2004-2006 TRUE AXIS PTY LTD Australia. All rights reserved.