]> git.jsancho.org Git - lugaru.git/blob - Source/Frustum.cpp
2ec54a8b217cc48faf0fc4410e70c322ba506c1d
[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
7 modify it under the terms of the GNU General Public License
8 as published by the Free Software Foundation; either version 2
9 of the License, or (at your option) any later version.
10
11 This program 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.
14
15 See the GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
20 */
21
22 #include "Frustum.h"
23 #include <math.h>
24
25 #include "gamegl.h"
26
27
28 void FRUSTUM::
29 GetFrustum()
30 {
31     static float projmatrix[16];
32     static float mvmatrix[16];
33     static float clip[16];
34
35     glGetFloatv(GL_PROJECTION_MATRIX, projmatrix);
36     glGetFloatv(GL_MODELVIEW_MATRIX, mvmatrix);
37
38     // Combine the matrices
39     clip[0] = mvmatrix[0] * projmatrix[0] + mvmatrix[1] * projmatrix[4] + mvmatrix[2] * projmatrix[8] + mvmatrix[3] * projmatrix[12];
40     clip[1] = mvmatrix[0] * projmatrix[1] + mvmatrix[1] * projmatrix[5] + mvmatrix[2] * projmatrix[9] + mvmatrix[3] * projmatrix[13];
41     clip[2] = mvmatrix[0] * projmatrix[2] + mvmatrix[1] * projmatrix[6] + mvmatrix[2] * projmatrix[10] + mvmatrix[3] * projmatrix[14];
42     clip[3] = mvmatrix[0] * projmatrix[3] + mvmatrix[1] * projmatrix[7] + mvmatrix[2] * projmatrix[11] + mvmatrix[3] * projmatrix[15];
43
44     clip[4] = mvmatrix[4] * projmatrix[0] + mvmatrix[5] * projmatrix[4] + mvmatrix[6] * projmatrix[8] + mvmatrix[7] * projmatrix[12];
45     clip[5] = mvmatrix[4] * projmatrix[1] + mvmatrix[5] * projmatrix[5] + mvmatrix[6] * projmatrix[9] + mvmatrix[7] * projmatrix[13];
46     clip[6] = mvmatrix[4] * projmatrix[2] + mvmatrix[5] * projmatrix[6] + mvmatrix[6] * projmatrix[10] + mvmatrix[7] * projmatrix[14];
47     clip[7] = mvmatrix[4] * projmatrix[3] + mvmatrix[5] * projmatrix[7] + mvmatrix[6] * projmatrix[11] + mvmatrix[7] * projmatrix[15];
48
49     clip[8] = mvmatrix[8] * projmatrix[0] + mvmatrix[9] * projmatrix[4] + mvmatrix[10] * projmatrix[8] + mvmatrix[11] * projmatrix[12];
50     clip[9] = mvmatrix[8] * projmatrix[1] + mvmatrix[9] * projmatrix[5] + mvmatrix[10] * projmatrix[9] + mvmatrix[11] * projmatrix[13];
51     clip[10] = mvmatrix[8] * projmatrix[2] + mvmatrix[9] * projmatrix[6] + mvmatrix[10] * projmatrix[10] + mvmatrix[11] * projmatrix[14];
52     clip[11] = mvmatrix[8] * projmatrix[3] + mvmatrix[9] * projmatrix[7] + mvmatrix[10] * projmatrix[11] + mvmatrix[11] * projmatrix[15];
53
54     clip[12] = mvmatrix[12] * projmatrix[0] + mvmatrix[13] * projmatrix[4] + mvmatrix[14] * projmatrix[8] + mvmatrix[15] * projmatrix[12];
55     clip[13] = mvmatrix[12] * projmatrix[1] + mvmatrix[13] * projmatrix[5] + mvmatrix[14] * projmatrix[9] + mvmatrix[15] * projmatrix[13];
56     clip[14] = mvmatrix[12] * projmatrix[2] + mvmatrix[13] * projmatrix[6] + mvmatrix[14] * projmatrix[10] + mvmatrix[15] * projmatrix[14];
57     clip[15] = mvmatrix[12] * projmatrix[3] + mvmatrix[13] * projmatrix[7] + mvmatrix[14] * projmatrix[11] + mvmatrix[15] * projmatrix[15];
58
59     // Right plane
60     frustum[0][0] = clip[3] - clip[0];
61     frustum[0][1] = clip[7] - clip[4];
62     frustum[0][2] = clip[11] - clip[8];
63     frustum[0][3] = clip[15] - clip[12];
64
65     // Left plane
66     frustum[1][0] = clip[3] + clip[0];
67     frustum[1][1] = clip[7] + clip[4];
68     frustum[1][2] = clip[11] + clip[8];
69     frustum[1][3] = clip[15] + clip[12];
70
71     // Bottom plane
72     frustum[2][0] = clip[3] + clip[1];
73     frustum[2][1] = clip[7] + clip[5];
74     frustum[2][2] = clip[11] + clip[9];
75     frustum[2][3] = clip[15] + clip[13];
76
77     // Top plane
78     frustum[3][0] = clip[3] - clip[1];
79     frustum[3][1] = clip[7] - clip[5];
80     frustum[3][2] = clip[11] - clip[9];
81     frustum[3][3] = clip[15] - clip[13];
82
83     // Far plane
84     frustum[4][0] = clip[3] - clip[2];
85     frustum[4][1] = clip[7] - clip[6];
86     frustum[4][2] = clip[11] - clip[10];
87     frustum[4][3] = clip[15] - clip[14];
88
89     // Near plane
90     frustum[5][0] = clip[3] + clip[2];
91     frustum[5][1] = clip[7] + clip[6];
92     frustum[5][2] = clip[11] + clip[10];
93     frustum[5][3] = clip[15] + clip[14];
94 }
95
96 int FRUSTUM::
97 CubeInFrustum(float x, float y, float z, float size)
98 {
99     static int c, c2;
100
101     for (int i = 0; i < 6; i++) {
102         c = 0;
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 (frustum[i][0] * (x + size) + frustum[i][1] * (y + size) + frustum[i][2] * (z + size) + frustum[i][3] > 0)
118             c++;
119         if (c == 0)
120             return 0;
121         if (c == 8)
122             c2++;
123     }
124     if (c2 >= 6)
125         return 2;
126     else
127         return 1;
128 }
129
130 int FRUSTUM::
131 CubeInFrustum(float x, float y, float z, float size, float height)
132 {
133     static int c, c2;
134
135     for (int i = 0; i < 6; i++) {
136         c = 0;
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 (frustum[i][0] * (x + size) + frustum[i][1] * (y + height) + frustum[i][2] * (z + size) + frustum[i][3] > 0)
152             c++;
153         if (c == 0)
154             return 0;
155         if (c == 8)
156             c2++;
157     }
158     if (c2 >= 6)
159         return 2;
160     else
161         return 1;
162 }
163
164 int FRUSTUM::
165 SphereInFrustum(float x, float y, float z, float radius)
166 {
167     static int  c2;
168
169     for (int i = 0; i < 6; i++) {
170         if (frustum[i][0] * x + frustum[i][1] * y + frustum[i][2] * z + frustum[i][3] > -1 * radius)
171             c2++;
172         else
173             return 0;
174     }
175     if (c2 >= 6)
176         return 2;
177     else
178         return 1;
179 }