1 
2 // vmath.cpp [pengine]
3 
4 // Copyright 2004-2006 Jasmine Langridge, jas@jareiko.net
5 // License: GPL version 2 (see included gpl.txt)
6 
7 
8 #include "pengine.h"
9 
10 
11 
12 template <class T>
construct(const mat44<T> & mat)13 frustum<T> &frustum<T>::construct(const mat44<T> &mat)
14 {
15     side[SideRight] = plane<T>(
16         mat.row[0][3] - mat.row[0][0],
17         mat.row[1][3] - mat.row[1][0],
18         mat.row[2][3] - mat.row[2][0],
19         mat.row[3][3] - mat.row[3][0]);
20     side[SideRight].normalize();
21 
22     side[SideLeft] = plane<T>(
23         mat.row[0][3] + mat.row[0][0],
24         mat.row[1][3] + mat.row[1][0],
25         mat.row[2][3] + mat.row[2][0],
26         mat.row[3][3] + mat.row[3][0]);
27     side[SideLeft].normalize();
28 
29     side[SideTop] = plane<T>(
30         mat.row[0][3] - mat.row[0][1],
31         mat.row[1][3] - mat.row[1][1],
32         mat.row[2][3] - mat.row[2][1],
33         mat.row[3][3] - mat.row[3][1]);
34     side[SideTop].normalize();
35 
36     side[SideBottom] = plane<T>(
37         mat.row[0][3] + mat.row[0][1],
38         mat.row[1][3] + mat.row[1][1],
39         mat.row[2][3] + mat.row[2][1],
40         mat.row[3][3] + mat.row[3][1]);
41     side[SideBottom].normalize();
42 
43     side[SideNear] = plane<T>(
44         mat.row[0][3] - mat.row[0][2],
45         mat.row[1][3] - mat.row[1][2],
46         mat.row[2][3] - mat.row[2][2],
47         mat.row[3][3] - mat.row[3][2]);
48     side[SideNear].normalize();
49 
50     side[SideFar] = plane<T>(
51         mat.row[0][3] + mat.row[0][2],
52         mat.row[1][3] + mat.row[1][2],
53         mat.row[2][3] + mat.row[2][2],
54         mat.row[3][3] + mat.row[3][2]);
55     side[SideFar].normalize();
56 
57     return *this;
58 }
59 template frustum<float> &frustum<float>::construct(const mat44<float> &mat);
60 template frustum<double> &frustum<double>::construct(const mat44<double> &mat);
61 
62 template <class T>
isAABBOutside(const vec3<T> & mins,const vec3<T> & maxs) const63 bool frustum<T>::isAABBOutside(const vec3<T> &mins, const vec3<T> &maxs) const
64 {
65     vec3<T> pts[8] = {
66         vec3<T>(mins.x, mins.y, mins.z),
67         vec3<T>(maxs.x, mins.y, mins.z),
68         vec3<T>(mins.x, maxs.y, mins.z),
69         vec3<T>(maxs.x, maxs.y, mins.z),
70         vec3<T>(mins.x, mins.y, maxs.z),
71         vec3<T>(maxs.x, mins.y, maxs.z),
72         vec3<T>(mins.x, maxs.y, maxs.z),
73         vec3<T>(maxs.x, maxs.y, maxs.z)
74     };
75     for (int s = 0; s < 1; ++s) {
76         bool outside = true;
77         for (int p = 0; p < 8; ++p) {
78             //if (side[s].normal * pts[p] + side[s].offset >= 0.0) {
79             if (side[s].normal * pts[p] >= 0.0) {
80                 outside = false;
81                 break;
82             }
83         }
84         if (outside) return true;
85     }
86 
87     return false;
88 }
89 template bool frustum<float>::isAABBOutside(const vec3<float> &mins, const vec3<float> &maxs) const;
90 template bool frustum<double>::isAABBOutside(const vec3<double> &mins, const vec3<double> &maxs) const;
91 
92 
93 
94 
95