Pyrogenesis  trunk
Frustum.h
Go to the documentation of this file.
1 /* Copyright (C) 2009 Wildfire Games.
2  * This file is part of 0 A.D.
3  *
4  * 0 A.D. is free software: you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation, either version 2 of the License, or
7  * (at your option) any later version.
8  *
9  * 0 A.D. is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with 0 A.D. If not, see <http://www.gnu.org/licenses/>.
16  */
17 
18 /*
19  * CFrustum is a collection of planes which define a viewing space.
20  */
21 
22 /*
23 Usually associated with the camera, there are 6 planes which define the
24 view pyramid. But we allow more planes per frustum which may be used for
25 portal rendering, where a portal may have 3 or more edges.
26 */
27 
28 #ifndef INCLUDED_FRUSTUM
29 #define INCLUDED_FRUSTUM
30 
31 #include "maths/Plane.h"
32 
33 //10 planes should be enough
34 #define MAX_NUM_FRUSTUM_PLANES (10)
35 
37 class CMatrix3D;
38 
39 class CFrustum
40 {
41 public:
42  CFrustum ();
43  ~CFrustum ();
44 
45  //Set the number of planes to use for
46  //calculations. This is clipped to
47  //[0,MAX_NUM_FRUSTUM_PLANES]
48  void SetNumPlanes (size_t num);
49 
50  size_t GetNumPlanes() const { return m_NumPlanes; }
51 
52  void AddPlane (const CPlane& plane);
53 
54  void Transform(CMatrix3D& m);
55 
56  //The following methods return true if the shape is
57  //partially or completely in front of the frustum planes
58  bool IsPointVisible(const CVector3D& point) const;
59  bool DoesSegmentIntersect(const CVector3D& start, const CVector3D& end) const;
60  bool IsSphereVisible(const CVector3D& center, float radius) const;
61  bool IsBoxVisible(const CVector3D& position, const CBoundingBoxAligned& bounds) const;
62  bool IsBoxVisible(const CBoundingBoxAligned& bounds) const;
63 
64  CPlane& operator[](size_t idx) { return m_aPlanes[idx]; }
65  const CPlane& operator[](size_t idx) const { return m_aPlanes[idx]; }
66 
67 public:
68  //make the planes public for ease of use
70 
71 private:
72  size_t m_NumPlanes;
73 };
74 
75 #endif
bool IsSphereVisible(const CVector3D &center, float radius) const
Definition: Frustum.cpp:109
CFrustum()
Definition: Frustum.cpp:35
Definition: Vector3D.h:28
bool IsBoxVisible(const CVector3D &position, const CBoundingBoxAligned &bounds) const
Definition: Frustum.cpp:122
Definition: Frustum.h:39
bool IsPointVisible(const CVector3D &point) const
Definition: Frustum.cpp:78
Definition: Matrix3D.h:33
CPlane & operator[](size_t idx)
Definition: Frustum.h:64
size_t m_NumPlanes
Definition: Frustum.h:72
#define MAX_NUM_FRUSTUM_PLANES
Definition: Frustum.h:34
void AddPlane(const CPlane &plane)
Definition: Frustum.cpp:56
~CFrustum()
Definition: Frustum.cpp:40
CPlane m_aPlanes[MAX_NUM_FRUSTUM_PLANES]
Definition: Frustum.h:69
bool DoesSegmentIntersect(const CVector3D &start, const CVector3D &end) const
Definition: Frustum.cpp:89
Definition: BoundingBoxAligned.h:35
size_t GetNumPlanes() const
Definition: Frustum.h:50
void SetNumPlanes(size_t num)
Definition: Frustum.cpp:44
Definition: Plane.h:38
const CPlane & operator[](size_t idx) const
Definition: Frustum.h:65
void Transform(CMatrix3D &m)
Definition: Frustum.cpp:67