Game Development Reference
In-Depth Information
i n s i d e
=
f a l s e
;
zn
=
−
1.0 f ;
}
e l s e
i f
( r a y O r g . z
>
max . z )
{
z t
=
max . z
−
r a y O r g . z ;
i f
( z t
<
r a y D e l t a . z )
r e t u r n
k N o I n t e r s e c t i o n ;
z t
/ =
r a y D e l t a . z ;
i n s i d e
=
f a l s e
;
zn
=
1 . 0 f ;
}
e l s e
{
z t
=
−
1.0 f ;
}
/ /
Ray
o r i g i n
i n s i d e
box ?
i f
( i n s i d e )
{
( r e t u r n N o r m a l ! = NULL )
{
∗
r e t u r n N o r m a l =
−
r a y D e l t a ;
r e t u r n N o r m a l
−>
n o r m a l i z e ( ) ;
i f
}
r e t u r n
0 . 0 f ;
}
/ /
S e l e c t
f a r t h e s t
p l a n e
−
t h i s
i s
/ /
t h e
p l a n e
o f
i n t e r s e c t i o n .
i n t
which
=
0 ;
f l o a t
t
=
x t ;
i f
( y t
>
t )
{
which
=
1 ;
t
=
y t ;
}
i f
( z t
>
t )
{
which
=
2 ;
t
=
z t ;
}
s w i t c h
( which )
{
c a s e
0 :
/ /
i n t e r s e c t
w i t h
yz
p l a n e
{
f l o a t
y
=
r a y O r g . y
+
r a y D e l t a . y
∗
t ;
i f
( y
<
min . y
| |
y
>
max . y )
r e t u r n
k N o I n t e r s e c t i o n ;
f l o a t
z
=
r a y O r g . z
+
r a y D e l t a . z
∗
t ;
i f
( z
<
min . z
| |
z
>
max . z )
r e t u r n
k N o I n t e r s e c t i o n ;
i f
( r e t u r n N o r m a l
! =
NULL )
{
r e t u r n N o r m a l
−>
x
=
xn ;
r e t u r n N o r m a l
−>
y
=
0 . 0 f ;
r e t u r n N o r m a l
−>
z
=
0 . 0 f ;
}
}
br ea k
;
c a s e
1 :
/ /
i n t e r s e c t
w i t h
xz
p l a n e
{
f l o a t
x
=
r a y O r g . x
+
r a y D e l t a . x
∗
t ;
i f
( x
<
min . x
| |
x
>
max . x )
r e t u r n
k N o I n t e r s e c t i o n ;
f l o a t
z
=
r a y O r g . z
+
r a y D e l t a . z
∗
t ;
i f
( z
<
min . z
| |
z
>
max . z )
r e t u r n
k N o I n t e r s e c t i o n ;
i f
( r e t u r n N o r m a l
! =
NULL )
{
r e t u r n N o r m a l
−>
x
=
0 . 0 f ;
r e t u r n N o r m a l
−>
y
=
yn ;
r e t u r n N o r m a l
−>
z
=
0 . 0 f ;
}
}
br ea k
;
Search WWH ::
Custom Search