fb:porticula NoPaste
TFrustum
Uploader: | Eternal_Pain |
Datum/Zeit: | 23.05.2012 09:24:11 |
#include once "gl/gl.bi"
#IfnDef TRUE
#Define TRUE 1
#DEFINE FALSE 0
#EndIf
enum E_FRUSTUM_SIDE
E_RIGHT = 0 '' The RIGHT side of the frustum
E_LEFT = 1 '' The LEFT side of the frustum
E_BOTTOM = 2 '' The BOTTOM side of the frustum
E_TOP = 3 '' The TOP side of the frustum
E_BACK = 4 '' The BACK side of the frustum
E_FRONT = 5 '' The FRONT side of the frustum
end enum
enum E_PLANE_DATA
A = 0 '' The X value of the plane's normal
B = 1 '' The Y value of the plane's normal
C = 2 '' The Z value of the plane's normal
D = 3 '' The distance the plane is from the origin
end enum
Sub NormalizePlane(frustum() as single, byval side as integer)
dim as single magnitude = sqr( frustum(side,A) * frustum(side,A) +_
frustum(side,B) * frustum(side,B) +_
frustum(side,C) * frustum(side,C) )
frustum(side,A) /= magnitude
frustum(side,B) /= magnitude
frustum(side,C) /= magnitude
frustum(side,D) /= magnitude
end sub
Type Frustum
public:
Declare Sub Update()
Declare Function PointIn(byval x as single, byval y as single,byval z as single) as integer
Declare Function QuadIn(byval x as single, byval z as single, byval sizex as single, byval sizez as single) as integer
private:
Planes(6,4) as single
end type
Sub Frustum.Update()
dim as single proj(0 to 15) '' This will hold our projection matrix
dim as single modl(0 to 15) '' This will hold our modelview matrix
dim as single clip(0 to 15) '' This will hold the clipping planes
glGetFloatv( GL_PROJECTION_MATRIX, @proj(0) )
glGetFloatv( GL_MODELVIEW_MATRIX, @modl(0) )
clip( 0) = modl( 0) * proj( 0) + modl( 1) * proj( 4) + modl( 2) * proj( 8) + modl( 3) * proj(12)
clip( 1) = modl( 0) * proj( 1) + modl( 1) * proj( 5) + modl( 2) * proj( 9) + modl( 3) * proj(13)
clip( 2) = modl( 0) * proj( 2) + modl( 1) * proj( 6) + modl( 2) * proj(10) + modl( 3) * proj(14)
clip( 3) = modl( 0) * proj( 3) + modl( 1) * proj( 7) + modl( 2) * proj(11) + modl( 3) * proj(15)
clip( 4) = modl( 4) * proj( 0) + modl( 5) * proj( 4) + modl( 6) * proj( 8) + modl( 7) * proj(12)
clip( 5) = modl( 4) * proj( 1) + modl( 5) * proj( 5) + modl( 6) * proj( 9) + modl( 7) * proj(13)
clip( 6) = modl( 4) * proj( 2) + modl( 5) * proj( 6) + modl( 6) * proj(10) + modl( 7) * proj(14)
clip( 7) = modl( 4) * proj( 3) + modl( 5) * proj( 7) + modl( 6) * proj(11) + modl( 7) * proj(15)
clip( 8) = modl( 8) * proj( 0) + modl( 9) * proj( 4) + modl(10) * proj( 8) + modl(11) * proj(12)
clip( 9) = modl( 8) * proj( 1) + modl( 9) * proj( 5) + modl(10) * proj( 9) + modl(11) * proj(13)
clip(10) = modl( 8) * proj( 2) + modl( 9) * proj( 6) + modl(10) * proj(10) + modl(11) * proj(14)
clip(11) = modl( 8) * proj( 3) + modl( 9) * proj( 7) + modl(10) * proj(11) + modl(11) * proj(15)
clip(12) = modl(12) * proj( 0) + modl(13) * proj( 4) + modl(14) * proj( 8) + modl(15) * proj(12)
clip(13) = modl(12) * proj( 1) + modl(13) * proj( 5) + modl(14) * proj( 9) + modl(15) * proj(13)
clip(14) = modl(12) * proj( 2) + modl(13) * proj( 6) + modl(14) * proj(10) + modl(15) * proj(14)
clip(15) = modl(12) * proj( 3) + modl(13) * proj( 7) + modl(14) * proj(11) + modl(15) * proj(15)
Planes(E_RIGHT,A) = clip( 3) - clip( 0) : Planes(E_RIGHT,B) = clip( 7) - clip( 4)
Planes(E_RIGHT,C) = clip(11) - clip( 8) : Planes(E_RIGHT,D) = clip(15) - clip(12)
NormalizePlane(Planes(), E_RIGHT)
Planes(E_LEFT,A) = clip( 3) + clip( 0) : Planes(E_LEFT,B) = clip( 7) + clip( 4)
Planes(E_LEFT,C) = clip(11) + clip( 8) : Planes(E_LEFT,D) = clip(15) + clip(12)
NormalizePlane(Planes(), E_LEFT)
Planes(E_BOTTOM,A) = clip( 3) + clip( 1) : Planes(E_BOTTOM,B) = clip( 7) + clip( 5)
Planes(E_BOTTOM,C) = clip(11) + clip( 9) : Planes(E_BOTTOM,D) = clip(15) + clip(13)
NormalizePlane(Planes(), E_BOTTOM)
Planes(E_TOP,A) = clip( 3) - clip( 1) : Planes(E_TOP,B) = clip( 7) - clip( 5)
Planes(E_TOP,C) = clip(11) - clip( 9) : Planes(E_TOP,D) = clip(15) - clip(13)
NormalizePlane(Planes(), E_TOP)
Planes(E_BACK,A) = clip( 3) - clip( 2) : Planes(E_BACK,B) = clip( 7) - clip( 6)
Planes(E_BACK,C) = clip(11) - clip(10) : Planes(E_BACK,D) = clip(15) - clip(14)
NormalizePlane(Planes(), E_BACK)
Planes(E_FRONT,A) = clip( 3) + clip( 2) : Planes(E_FRONT,B) = clip( 7) + clip( 6)
Planes(E_FRONT,C) = clip(11) + clip(10) : Planes(E_FRONT,D) = clip(15) + clip(14)
NormalizePlane(Planes(), E_FRONT)
End Sub
function Frustum.PointIn( byval x as single, byval y as single, byval z as single ) as integer
for i as integer = 0 to 5
if (Planes(i,A) * x + Planes(i,B) * y + Planes(i,C) * z + Planes(i,D) <= 0) then
return FALSE
end if
next i
return TRUE
End Function
Function Frustum.QuadIn(byval x as single, byval z as single, byval sizex as single, byval sizez as single) as integer
Dim as single xx,yy,zz
For i as integer = 0 to 5
'' E_TOP_RIGHT
xx = x + sizex
yy = 0
zz = z - sizez
if (Planes(i,A) * xx + Planes(i,B) * yy + Planes(i,C) * zz + Planes(i,D) > 0) then
continue for
end if
'' E_TOP_LEFT
xx = x - sizex
yy = 0
zz = z - sizez
if (Planes(i,A) * xx + Planes(i,B) * yy + Planes(i,C) * zz + Planes(i,D) > 0) then
continue for
end if
'' E_BOTTOM_RIGHT
xx = x + sizex
yy = 0
zz = z + sizez
if (Planes(i,A) * xx + Planes(i,B) * yy + Planes(i,C) * zz + Planes(i,D) > 0) then
continue for
end if
'' E_BOTTOM_LEFT
xx = x - sizex
yy = 0
zz = z + sizez
if (Planes(i,A) * xx + Planes(i,B) * yy + Planes(i,C) * zz + Planes(i,D) > 0) then
continue for
end if
return false
next i
return TRUE
End Function