]> git.jsancho.org Git - lugaru.git/blob - Source/Frustum.cpp
License: Update GPLv2+ header to match current FSF recommendation
[lugaru.git] / Source / Frustum.cpp
1 /*
2 Copyright (C) 2003, 2010 - Wolfire Games
3
4 This file is part of Lugaru.
5
6 Lugaru is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
10
11 Lugaru is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with Lugaru.  If not, see <http://www.gnu.org/licenses/>.
18 */
19
20 #include "Frustum.h"
21 #include <math.h>
22
23 #include "gamegl.h"
24
25
26 void FRUSTUM::
27 GetFrustum()
28 {
29     static float projmatrix[16];
30     static float mvmatrix[16];
31     static float clip[16];
32
33     glGetFloatv(GL_PROJECTION_MATRIX, projmatrix);
34     glGetFloatv(GL_MODELVIEW_MATRIX, mvmatrix);
35
36     // Combine the matrices
37     clip[0] = mvmatrix[0] * projmatrix[0] + mvmatrix[1] * projmatrix[4] + mvmatrix[2] * projmatrix[8] + mvmatrix[3] * projmatrix[12];
38     clip[1] = mvmatrix[0] * projmatrix[1] + mvmatrix[1] * projmatrix[5] + mvmatrix[2] * projmatrix[9] + mvmatrix[3] * projmatrix[13];
39     clip[2] = mvmatrix[0] * projmatrix[2] + mvmatrix[1] * projmatrix[6] + mvmatrix[2] * projmatrix[10] + mvmatrix[3] * projmatrix[14];
40     clip[3] = mvmatrix[0] * projmatrix[3] + mvmatrix[1] * projmatrix[7] + mvmatrix[2] * projmatrix[11] + mvmatrix[3] * projmatrix[15];
41
42     clip[4] = mvmatrix[4] * projmatrix[0] + mvmatrix[5] * projmatrix[4] + mvmatrix[6] * projmatrix[8] + mvmatrix[7] * projmatrix[12];
43     clip[5] = mvmatrix[4] * projmatrix[1] + mvmatrix[5] * projmatrix[5] + mvmatrix[6] * projmatrix[9] + mvmatrix[7] * projmatrix[13];
44     clip[6] = mvmatrix[4] * projmatrix[2] + mvmatrix[5] * projmatrix[6] + mvmatrix[6] * projmatrix[10] + mvmatrix[7] * projmatrix[14];
45     clip[7] = mvmatrix[4] * projmatrix[3] + mvmatrix[5] * projmatrix[7] + mvmatrix[6] * projmatrix[11] + mvmatrix[7] * projmatrix[15];
46
47     clip[8] = mvmatrix[8] * projmatrix[0] + mvmatrix[9] * projmatrix[4] + mvmatrix[10] * projmatrix[8] + mvmatrix[11] * projmatrix[12];
48     clip[9] = mvmatrix[8] * projmatrix[1] + mvmatrix[9] * projmatrix[5] + mvmatrix[10] * projmatrix[9] + mvmatrix[11] * projmatrix[13];
49     clip[10] = mvmatrix[8] * projmatrix[2] + mvmatrix[9] * projmatrix[6] + mvmatrix[10] * projmatrix[10] + mvmatrix[11] * projmatrix[14];
50     clip[11] = mvmatrix[8] * projmatrix[3] + mvmatrix[9] * projmatrix[7] + mvmatrix[10] * projmatrix[11] + mvmatrix[11] * projmatrix[15];
51
52     clip[12] = mvmatrix[12] * projmatrix[0] + mvmatrix[13] * projmatrix[4] + mvmatrix[14] * projmatrix[8] + mvmatrix[15] * projmatrix[12];
53     clip[13] = mvmatrix[12] * projmatrix[1] + mvmatrix[13] * projmatrix[5] + mvmatrix[14] * projmatrix[9] + mvmatrix[15] * projmatrix[13];
54     clip[14] = mvmatrix[12] * projmatrix[2] + mvmatrix[13] * projmatrix[6] + mvmatrix[14] * projmatrix[10] + mvmatrix[15] * projmatrix[14];
55     clip[15] = mvmatrix[12] * projmatrix[3] + mvmatrix[13] * projmatrix[7] + mvmatrix[14] * projmatrix[11] + mvmatrix[15] * projmatrix[15];
56
57     // Right plane
58     frustum[0][0] = clip[3] - clip[0];
59     frustum[0][1] = clip[7] - clip[4];
60     frustum[0][2] = clip[11] - clip[8];
61     frustum[0][3] = clip[15] - clip[12];
62
63     // Left plane
64     frustum[1][0] = clip[3] + clip[0];
65     frustum[1][1] = clip[7] + clip[4];
66     frustum[1][2] = clip[11] + clip[8];
67     frustum[1][3] = clip[15] + clip[12];
68
69     // Bottom plane
70     frustum[2][0] = clip[3] + clip[1];
71     frustum[2][1] = clip[7] + clip[5];
72     frustum[2][2] = clip[11] + clip[9];
73     frustum[2][3] = clip[15] + clip[13];
74
75     // Top plane
76     frustum[3][0] = clip[3] - clip[1];
77     frustum[3][1] = clip[7] - clip[5];
78     frustum[3][2] = clip[11] - clip[9];
79     frustum[3][3] = clip[15] - clip[13];
80
81     // Far plane
82     frustum[4][0] = clip[3] - clip[2];
83     frustum[4][1] = clip[7] - clip[6];
84     frustum[4][2] = clip[11] - clip[10];
85     frustum[4][3] = clip[15] - clip[14];
86
87     // Near plane
88     frustum[5][0] = clip[3] + clip[2];
89     frustum[5][1] = clip[7] + clip[6];
90     frustum[5][2] = clip[11] + clip[10];
91     frustum[5][3] = clip[15] + clip[14];
92 }
93
94 int FRUSTUM::
95 CubeInFrustum(float x, float y, float z, float size)
96 {
97     static int c, c2;
98
99     for (int i = 0; i < 6; i++) {
100         c = 0;
101         if (frustum[i][0] * (x - size) + frustum[i][1] * (y - size) + frustum[i][2] * (z - size) + frustum[i][3] > 0)
102             c++;
103         if (frustum[i][0] * (x + size) + frustum[i][1] * (y - size) + frustum[i][2] * (z - size) + frustum[i][3] > 0)
104             c++;
105         if (frustum[i][0] * (x - size) + frustum[i][1] * (y + size) + frustum[i][2] * (z - size) + frustum[i][3] > 0)
106             c++;
107         if (frustum[i][0] * (x + size) + frustum[i][1] * (y + size) + frustum[i][2] * (z - size) + frustum[i][3] > 0)
108             c++;
109         if (frustum[i][0] * (x - size) + frustum[i][1] * (y - size) + frustum[i][2] * (z + size) + frustum[i][3] > 0)
110             c++;
111         if (frustum[i][0] * (x + size) + frustum[i][1] * (y - size) + frustum[i][2] * (z + size) + frustum[i][3] > 0)
112             c++;
113         if (frustum[i][0] * (x - size) + frustum[i][1] * (y + size) + frustum[i][2] * (z + size) + frustum[i][3] > 0)
114             c++;
115         if (frustum[i][0] * (x + size) + frustum[i][1] * (y + size) + frustum[i][2] * (z + size) + frustum[i][3] > 0)
116             c++;
117         if (c == 0)
118             return 0;
119         if (c == 8)
120             c2++;
121     }
122     if (c2 >= 6)
123         return 2;
124     else
125         return 1;
126 }
127
128 int FRUSTUM::
129 CubeInFrustum(float x, float y, float z, float size, float height)
130 {
131     static int c, c2;
132
133     for (int i = 0; i < 6; i++) {
134         c = 0;
135         if (frustum[i][0] * (x - size) + frustum[i][1] * (y - height) + frustum[i][2] * (z - size) + frustum[i][3] > 0)
136             c++;
137         if (frustum[i][0] * (x + size) + frustum[i][1] * (y - height) + frustum[i][2] * (z - size) + frustum[i][3] > 0)
138             c++;
139         if (frustum[i][0] * (x - size) + frustum[i][1] * (y + height) + frustum[i][2] * (z - size) + frustum[i][3] > 0)
140             c++;
141         if (frustum[i][0] * (x + size) + frustum[i][1] * (y + height) + frustum[i][2] * (z - size) + frustum[i][3] > 0)
142             c++;
143         if (frustum[i][0] * (x - size) + frustum[i][1] * (y - height) + frustum[i][2] * (z + size) + frustum[i][3] > 0)
144             c++;
145         if (frustum[i][0] * (x + size) + frustum[i][1] * (y - height) + frustum[i][2] * (z + size) + frustum[i][3] > 0)
146             c++;
147         if (frustum[i][0] * (x - size) + frustum[i][1] * (y + height) + frustum[i][2] * (z + size) + frustum[i][3] > 0)
148             c++;
149         if (frustum[i][0] * (x + size) + frustum[i][1] * (y + height) + frustum[i][2] * (z + size) + frustum[i][3] > 0)
150             c++;
151         if (c == 0)
152             return 0;
153         if (c == 8)
154             c2++;
155     }
156     if (c2 >= 6)
157         return 2;
158     else
159         return 1;
160 }
161
162 int FRUSTUM::
163 SphereInFrustum(float x, float y, float z, float radius)
164 {
165     static int  c2;
166
167     for (int i = 0; i < 6; i++) {
168         if (frustum[i][0] * x + frustum[i][1] * y + frustum[i][2] * z + frustum[i][3] > -1 * radius)
169             c2++;
170         else
171             return 0;
172     }
173     if (c2 >= 6)
174         return 2;
175     else
176         return 1;
177 }