]> git.jsancho.org Git - lugaru.git/blob - Source/Frustum.cpp
f8fb2f51758380d9e169cd464a27715d9c087c80
[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         static float projmatrix[16];
31         static float mvmatrix[16];
32         static float clip[16];
33         
34         glGetFloatv(GL_PROJECTION_MATRIX, projmatrix);
35         glGetFloatv(GL_MODELVIEW_MATRIX, mvmatrix);
36         
37         // Combine the matrices
38         clip[0] = mvmatrix[0] * projmatrix[0] + mvmatrix[1] * projmatrix[4] + mvmatrix[2] * projmatrix[8] + mvmatrix[3] * projmatrix[12];
39         clip[1] = mvmatrix[0] * projmatrix[1] + mvmatrix[1] * projmatrix[5] + mvmatrix[2] * projmatrix[9] + mvmatrix[3] * projmatrix[13];
40         clip[2] = mvmatrix[0] * projmatrix[2] + mvmatrix[1] * projmatrix[6] + mvmatrix[2] * projmatrix[10] + mvmatrix[3] * projmatrix[14];
41         clip[3] = mvmatrix[0] * projmatrix[3] + mvmatrix[1] * projmatrix[7] + mvmatrix[2] * projmatrix[11] + mvmatrix[3] * projmatrix[15];
42         
43         clip[4] = mvmatrix[4] * projmatrix[0] + mvmatrix[5] * projmatrix[4] + mvmatrix[6] * projmatrix[8] + mvmatrix[7] * projmatrix[12];
44         clip[5] = mvmatrix[4] * projmatrix[1] + mvmatrix[5] * projmatrix[5] + mvmatrix[6] * projmatrix[9] + mvmatrix[7] * projmatrix[13];
45         clip[6] = mvmatrix[4] * projmatrix[2] + mvmatrix[5] * projmatrix[6] + mvmatrix[6] * projmatrix[10] + mvmatrix[7] * projmatrix[14];
46         clip[7] = mvmatrix[4] * projmatrix[3] + mvmatrix[5] * projmatrix[7] + mvmatrix[6] * projmatrix[11] + mvmatrix[7] * projmatrix[15];
47         
48         clip[8] = mvmatrix[8] * projmatrix[0] + mvmatrix[9] * projmatrix[4] + mvmatrix[10] * projmatrix[8] + mvmatrix[11] * projmatrix[12];
49         clip[9] = mvmatrix[8] * projmatrix[1] + mvmatrix[9] * projmatrix[5] + mvmatrix[10] * projmatrix[9] + mvmatrix[11] * projmatrix[13];
50         clip[10] = mvmatrix[8] * projmatrix[2] + mvmatrix[9] * projmatrix[6] + mvmatrix[10] * projmatrix[10] + mvmatrix[11] * projmatrix[14];
51         clip[11] = mvmatrix[8] * projmatrix[3] + mvmatrix[9] * projmatrix[7] + mvmatrix[10] * projmatrix[11] + mvmatrix[11] * projmatrix[15];
52         
53         clip[12] = mvmatrix[12] * projmatrix[0] + mvmatrix[13] * projmatrix[4] + mvmatrix[14] * projmatrix[8] + mvmatrix[15] * projmatrix[12];
54         clip[13] = mvmatrix[12] * projmatrix[1] + mvmatrix[13] * projmatrix[5] + mvmatrix[14] * projmatrix[9] + mvmatrix[15] * projmatrix[13];
55         clip[14] = mvmatrix[12] * projmatrix[2] + mvmatrix[13] * projmatrix[6] + mvmatrix[14] * projmatrix[10] + mvmatrix[15] * projmatrix[14];
56         clip[15] = mvmatrix[12] * projmatrix[3] + mvmatrix[13] * projmatrix[7] + mvmatrix[14] * projmatrix[11] + mvmatrix[15] * projmatrix[15];
57         
58         // Right plane
59         frustum[0][0] = clip[3] - clip[0];
60         frustum[0][1] = clip[7] - clip[4];
61         frustum[0][2] = clip[11] - clip[8];
62         frustum[0][3] = clip[15] - clip[12];
63         
64         // Left plane
65         frustum[1][0] = clip[3] + clip[0];
66         frustum[1][1] = clip[7] + clip[4];
67         frustum[1][2] = clip[11] + clip[8];
68         frustum[1][3] = clip[15] + clip[12];
69         
70         // Bottom plane
71         frustum[2][0] = clip[3] + clip[1];
72         frustum[2][1] = clip[7] + clip[5];
73         frustum[2][2] = clip[11] + clip[9];
74         frustum[2][3] = clip[15] + clip[13];
75         
76         // Top plane
77         frustum[3][0] = clip[3] - clip[1];
78         frustum[3][1] = clip[7] - clip[5];
79         frustum[3][2] = clip[11] - clip[9];
80         frustum[3][3] = clip[15] - clip[13];
81         
82         // Far plane
83         frustum[4][0] = clip[3] - clip[2];
84         frustum[4][1] = clip[7] - clip[6];
85         frustum[4][2] = clip[11] - clip[10];
86         frustum[4][3] = clip[15] - clip[14];
87         
88         // Near plane
89         frustum[5][0] = clip[3] + clip[2];
90         frustum[5][1] = clip[7] + clip[6];
91         frustum[5][2] = clip[11] + clip[10];
92         frustum[5][3] = clip[15] + clip[14];
93 }
94
95 int FRUSTUM::
96         CubeInFrustum(float x, float y, float z, float size) {
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         static int c, c2;
131         
132         for(int i=0; i<6; i++) {
133                 c=0;
134                 if(frustum[i][0] * (x-size) + frustum[i][1] * (y-height) + frustum[i][2] * (z-size) + frustum[i][3] > 0)
135                         c++;
136                 if(frustum[i][0] * (x+size) + frustum[i][1] * (y-height) + frustum[i][2] * (z-size) + frustum[i][3] > 0)
137                         c++;
138                 if(frustum[i][0] * (x-size) + frustum[i][1] * (y+height) + frustum[i][2] * (z-size) + frustum[i][3] > 0)
139                         c++;
140                 if(frustum[i][0] * (x+size) + frustum[i][1] * (y+height) + frustum[i][2] * (z-size) + frustum[i][3] > 0)
141                         c++;
142                 if(frustum[i][0] * (x-size) + frustum[i][1] * (y-height) + frustum[i][2] * (z+size) + frustum[i][3] > 0)
143                         c++;
144                 if(frustum[i][0] * (x+size) + frustum[i][1] * (y-height) + frustum[i][2] * (z+size) + frustum[i][3] > 0)
145                         c++;
146                 if(frustum[i][0] * (x-size) + frustum[i][1] * (y+height) + frustum[i][2] * (z+size) + frustum[i][3] > 0)
147                         c++;
148                 if(frustum[i][0] * (x+size) + frustum[i][1] * (y+height) + frustum[i][2] * (z+size) + frustum[i][3] > 0)
149                         c++;
150                 if(c==0)
151                         return 0;
152                 if(c==8)
153                         c2++;
154         }
155         if(c2>=6)
156                 return 2;
157         else
158                 return 1;
159 }
160
161 int FRUSTUM::
162         SphereInFrustum(float x, float y, float z, float radius) {
163         static int  c2;
164         
165         for(int i=0; i<6; i++) {
166                 if(frustum[i][0] * x + frustum[i][1] * y + frustum[i][2] * z + frustum[i][3] > -1*radius)
167                         c2++;
168                 else
169                         return 0;
170         }
171         if(c2>=6)
172                 return 2;
173         else
174                 return 1;
175 }