00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027 #ifndef __NECAPSULE_H
00028 #define __NECAPSULE_H
00029
00030
00031
00032 #include "base.h"
00033 #include "boundingvolume.h"
00034
00035
00042 namespace NeoEngine
00043 {
00044
00045
00046
00051 class NEOENGINE_API Capsule : public BoundingVolume
00052 {
00053 public:
00054
00056 float m_fLength;
00057
00058
00059 float m_fRadius;
00060
00061
00062
00067 Capsule( float fLength = 0.0f, float fRadius = 0.0f );
00068
00072 Capsule( const Capsule &rkCapsule ) : BoundingVolume( rkCapsule ), m_fLength( rkCapsule.m_fLength ), m_fRadius( m_fRadius ) {}
00073
00081 inline virtual bool Intersection( BoundingVolume *pkObj, ContactSet *pkContactSet = 0, bool bInvertNormal = false )
00082 {
00083 BOUNDINGVOLUMETYPE eType = pkObj->GetType();
00084
00085 if( eType == BV_AABB )
00086 return NeoEngine::Intersection( (AABB*)pkObj, this, pkContactSet, !bInvertNormal );
00087 else if( eType == BV_OBB )
00088 return NeoEngine::Intersection( (OBB*)pkObj, this, pkContactSet, !bInvertNormal );
00089 else if( eType == BV_SPHERE )
00090 return NeoEngine::Intersection( (Sphere*)pkObj, this, pkContactSet, !bInvertNormal );
00091 else
00092 return NeoEngine::Intersection( this, (Capsule*)pkObj, pkContactSet, bInvertNormal );
00093 }
00094
00102 inline virtual bool Intersection( AABB *pkAABB, ContactSet *pkContactSet = 0, bool bInvertNormal = false ) { return NeoEngine::Intersection( pkAABB, this, pkContactSet, !bInvertNormal ); }
00103
00111 inline virtual bool Intersection( OBB *pkOBB, ContactSet *pkContactSet = 0, bool bInvertNormal = false ) { return NeoEngine::Intersection( pkOBB, this, pkContactSet, bInvertNormal ); }
00112
00120 inline virtual bool Intersection( Sphere *pkSphere, ContactSet *pkContactSet = 0, bool bInvertNormal = false ) { return NeoEngine::Intersection( pkSphere, this, pkContactSet, !bInvertNormal ); }
00121
00129 inline virtual bool Intersection( Capsule *pkCapsule, ContactSet *pkContactSet = 0, bool bInvertNormal = false ) { return NeoEngine::Intersection( this, pkCapsule, pkContactSet, bInvertNormal ); }
00130
00136 inline virtual bool Intersection( Frustum *pkFrustum ) { return NeoEngine::Intersection( this, pkFrustum ); }
00137
00148 virtual bool Intersection( const Vector3d &rkV0, const Vector3d &rkV1, const Vector3d &rkV2, ContactSet *pkContactSet = 0, bool bForceTriNormal = true, const Vector3d &rkNormal = Vector3d::ZERO );
00149
00155 virtual bool Intersection( const Vector3d &rkPoint );
00156
00163 virtual bool Intersection( const Ray &rkRay, ContactSet *pkContactSet = 0 );
00164
00170 virtual bool Intersection( const Line &rkLine );
00171
00177 virtual bool Intersection( const Plane &rkPlane );
00178
00183 virtual void Generate( AABB *pkAABB );
00184
00189 virtual void Generate( OBB *pkOBB );
00190
00195 virtual void Generate( Sphere *pkSphere );
00196
00201 virtual void Generate( Capsule *pkCapsule );
00202
00207 virtual void Generate( VertexBufferPtr &pkVertexBuffer );
00208
00213 virtual void Merge( AABB *pkAABB );
00214
00219 virtual void Merge( OBB *pkOBB );
00220
00225 virtual void Merge( Sphere *pkSphere );
00226
00231 virtual void Merge( Capsule *pkCapsule );
00232
00236 inline virtual BOUNDINGVOLUMETYPE GetType() { return BV_CAPSULE; }
00237
00241 virtual BoundingVolume *Duplicate() const;
00242
00247 virtual void RenderOutlines( const Color &rkColor = Color::GREEN ) const;
00248 };
00249
00250
00251 };
00252
00253
00254
00255 #endif
00256