]> git.jsancho.org Git - lugaru.git/blob - Source/Frustum.cpp
1d1b14dda53af4b5dc8ef8115cfaf1f535717052
[lugaru.git] / Source / Frustum.cpp
1 #include "Frustum.h"
2 #include <math.h>
3
4 #include "gamegl.h"
5
6
7 void FRUSTUM::
8         GetFrustum() {
9         static float projmatrix[16];
10         static float mvmatrix[16];
11         static float clip[16];
12         static float t;
13         
14         glGetFloatv(GL_PROJECTION_MATRIX, projmatrix);
15         glGetFloatv(GL_MODELVIEW_MATRIX, mvmatrix);
16         
17         // Combine the matrices
18         clip[0] = mvmatrix[0] * projmatrix[0] + mvmatrix[1] * projmatrix[4] + mvmatrix[2] * projmatrix[8] + mvmatrix[3] * projmatrix[12];
19         clip[1] = mvmatrix[0] * projmatrix[1] + mvmatrix[1] * projmatrix[5] + mvmatrix[2] * projmatrix[9] + mvmatrix[3] * projmatrix[13];
20         clip[2] = mvmatrix[0] * projmatrix[2] + mvmatrix[1] * projmatrix[6] + mvmatrix[2] * projmatrix[10] + mvmatrix[3] * projmatrix[14];
21         clip[3] = mvmatrix[0] * projmatrix[3] + mvmatrix[1] * projmatrix[7] + mvmatrix[2] * projmatrix[11] + mvmatrix[3] * projmatrix[15];
22         
23         clip[4] = mvmatrix[4] * projmatrix[0] + mvmatrix[5] * projmatrix[4] + mvmatrix[6] * projmatrix[8] + mvmatrix[7] * projmatrix[12];
24         clip[5] = mvmatrix[4] * projmatrix[1] + mvmatrix[5] * projmatrix[5] + mvmatrix[6] * projmatrix[9] + mvmatrix[7] * projmatrix[13];
25         clip[6] = mvmatrix[4] * projmatrix[2] + mvmatrix[5] * projmatrix[6] + mvmatrix[6] * projmatrix[10] + mvmatrix[7] * projmatrix[14];
26         clip[7] = mvmatrix[4] * projmatrix[3] + mvmatrix[5] * projmatrix[7] + mvmatrix[6] * projmatrix[11] + mvmatrix[7] * projmatrix[15];
27         
28         clip[8] = mvmatrix[8] * projmatrix[0] + mvmatrix[9] * projmatrix[4] + mvmatrix[10] * projmatrix[8] + mvmatrix[11] * projmatrix[12];
29         clip[9] = mvmatrix[8] * projmatrix[1] + mvmatrix[9] * projmatrix[5] + mvmatrix[10] * projmatrix[9] + mvmatrix[11] * projmatrix[13];
30         clip[10] = mvmatrix[8] * projmatrix[2] + mvmatrix[9] * projmatrix[6] + mvmatrix[10] * projmatrix[10] + mvmatrix[11] * projmatrix[14];
31         clip[11] = mvmatrix[8] * projmatrix[3] + mvmatrix[9] * projmatrix[7] + mvmatrix[10] * projmatrix[11] + mvmatrix[11] * projmatrix[15];
32         
33         clip[12] = mvmatrix[12] * projmatrix[0] + mvmatrix[13] * projmatrix[4] + mvmatrix[14] * projmatrix[8] + mvmatrix[15] * projmatrix[12];
34         clip[13] = mvmatrix[12] * projmatrix[1] + mvmatrix[13] * projmatrix[5] + mvmatrix[14] * projmatrix[9] + mvmatrix[15] * projmatrix[13];
35         clip[14] = mvmatrix[12] * projmatrix[2] + mvmatrix[13] * projmatrix[6] + mvmatrix[14] * projmatrix[10] + mvmatrix[15] * projmatrix[14];
36         clip[15] = mvmatrix[12] * projmatrix[3] + mvmatrix[13] * projmatrix[7] + mvmatrix[14] * projmatrix[11] + mvmatrix[15] * projmatrix[15];
37         
38         // Right plane
39         frustum[0][0] = clip[3] - clip[0];
40         frustum[0][1] = clip[7] - clip[4];
41         frustum[0][2] = clip[11] - clip[8];
42         frustum[0][3] = clip[15] - clip[12];
43         
44         // Left plane
45         frustum[1][0] = clip[3] + clip[0];
46         frustum[1][1] = clip[7] + clip[4];
47         frustum[1][2] = clip[11] + clip[8];
48         frustum[1][3] = clip[15] + clip[12];
49         
50         // Bottom plane
51         frustum[2][0] = clip[3] + clip[1];
52         frustum[2][1] = clip[7] + clip[5];
53         frustum[2][2] = clip[11] + clip[9];
54         frustum[2][3] = clip[15] + clip[13];
55         
56         // Top plane
57         frustum[3][0] = clip[3] - clip[1];
58         frustum[3][1] = clip[7] - clip[5];
59         frustum[3][2] = clip[11] - clip[9];
60         frustum[3][3] = clip[15] - clip[13];
61         
62         // Far plane
63         frustum[4][0] = clip[3] - clip[2];
64         frustum[4][1] = clip[7] - clip[6];
65         frustum[4][2] = clip[11] - clip[10];
66         frustum[4][3] = clip[15] - clip[14];
67         
68         // Near plane
69         frustum[5][0] = clip[3] + clip[2];
70         frustum[5][1] = clip[7] + clip[6];
71         frustum[5][2] = clip[11] + clip[10];
72         frustum[5][3] = clip[15] + clip[14];
73 }
74
75 int FRUSTUM::
76         CubeInFrustum(float x, float y, float z, float size) {
77         static int c, c2;
78         
79         for(int i=0; i<6; i++) {
80                 c=0;
81                 if(frustum[i][0] * (x-size) + frustum[i][1] * (y-size) + frustum[i][2] * (z-size) + frustum[i][3] > 0)
82                         c++;
83                 if(frustum[i][0] * (x+size) + frustum[i][1] * (y-size) + frustum[i][2] * (z-size) + frustum[i][3] > 0)
84                         c++;
85                 if(frustum[i][0] * (x-size) + frustum[i][1] * (y+size) + frustum[i][2] * (z-size) + frustum[i][3] > 0)
86                         c++;
87                 if(frustum[i][0] * (x+size) + frustum[i][1] * (y+size) + frustum[i][2] * (z-size) + frustum[i][3] > 0)
88                         c++;
89                 if(frustum[i][0] * (x-size) + frustum[i][1] * (y-size) + frustum[i][2] * (z+size) + frustum[i][3] > 0)
90                         c++;
91                 if(frustum[i][0] * (x+size) + frustum[i][1] * (y-size) + frustum[i][2] * (z+size) + frustum[i][3] > 0)
92                         c++;
93                 if(frustum[i][0] * (x-size) + frustum[i][1] * (y+size) + frustum[i][2] * (z+size) + frustum[i][3] > 0)
94                         c++;
95                 if(frustum[i][0] * (x+size) + frustum[i][1] * (y+size) + frustum[i][2] * (z+size) + frustum[i][3] > 0)
96                         c++;
97                 if(c==0)
98                         return 0;
99                 if(c==8)
100                         c2++;
101         }
102         if(c2>=6)
103                 return 2;
104         else
105                 return 1;
106 }
107
108 int FRUSTUM::
109         CubeInFrustum(float x, float y, float z, float size, float height) {
110         static int c, c2;
111         
112         for(int i=0; i<6; i++) {
113                 c=0;
114                 if(frustum[i][0] * (x-size) + frustum[i][1] * (y-height) + frustum[i][2] * (z-size) + frustum[i][3] > 0)
115                         c++;
116                 if(frustum[i][0] * (x+size) + frustum[i][1] * (y-height) + frustum[i][2] * (z-size) + frustum[i][3] > 0)
117                         c++;
118                 if(frustum[i][0] * (x-size) + frustum[i][1] * (y+height) + frustum[i][2] * (z-size) + frustum[i][3] > 0)
119                         c++;
120                 if(frustum[i][0] * (x+size) + frustum[i][1] * (y+height) + frustum[i][2] * (z-size) + frustum[i][3] > 0)
121                         c++;
122                 if(frustum[i][0] * (x-size) + frustum[i][1] * (y-height) + frustum[i][2] * (z+size) + frustum[i][3] > 0)
123                         c++;
124                 if(frustum[i][0] * (x+size) + frustum[i][1] * (y-height) + frustum[i][2] * (z+size) + frustum[i][3] > 0)
125                         c++;
126                 if(frustum[i][0] * (x-size) + frustum[i][1] * (y+height) + frustum[i][2] * (z+size) + frustum[i][3] > 0)
127                         c++;
128                 if(frustum[i][0] * (x+size) + frustum[i][1] * (y+height) + frustum[i][2] * (z+size) + frustum[i][3] > 0)
129                         c++;
130                 if(c==0)
131                         return 0;
132                 if(c==8)
133                         c2++;
134         }
135         if(c2>=6)
136                 return 2;
137         else
138                 return 1;
139 }
140
141 int FRUSTUM::
142         SphereInFrustum(float x, float y, float z, float radius) {
143         static int  c2;
144         
145         for(int i=0; i<6; i++) {
146                 if(frustum[i][0] * x + frustum[i][1] * y + frustum[i][2] * z + frustum[i][3] > -1*radius)
147                         c2++;
148                 else
149                         return 0;
150         }
151         if(c2>=6)
152                 return 2;
153         else
154                 return 1;
155 }