1 /* Copyright (C) 2021 Wildfire Games.
2 * This file is part of 0 A.D.
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.
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.
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/>.
19 * CFrustum is a collection of planes which define a viewing space.
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.
28 #ifndef INCLUDED_FRUSTUM
29 #define INCLUDED_FRUSTUM
31 #include "maths/Plane.h"
33 class CBoundingBoxAligned
;
42 // Set the number of planes to use for calculations. This is clamped to
43 // [0, MAX_NUM_FRUSTUM_PLANES].
44 void SetNumPlanes(size_t num
);
46 size_t GetNumPlanes() const { return m_NumPlanes
; }
48 void AddPlane(const CPlane
& plane
);
50 void Transform(const CMatrix3D
& m
);
52 // The following methods return true if the shape is
53 // partially or completely in front of the frustum planes.
54 bool IsPointVisible(const CVector3D
& point
) const;
55 bool DoesSegmentIntersect(const CVector3D
& start
, const CVector3D
& end
) const;
56 bool IsSphereVisible(const CVector3D
& center
, float radius
) const;
57 bool IsBoxVisible(const CVector3D
& position
, const CBoundingBoxAligned
& bounds
) const;
58 bool IsBoxVisible(const CBoundingBoxAligned
& bounds
) const;
60 CPlane
& operator[](size_t idx
) { return m_Planes
[idx
]; }
61 const CPlane
& operator[](size_t idx
) const { return m_Planes
[idx
]; }
64 static const size_t MAX_NUM_FRUSTUM_PLANES
= 10;
66 CPlane m_Planes
[MAX_NUM_FRUSTUM_PLANES
];
70 #endif // INCLUDED_FRUSTUM