ps_2_0
// intersect a tunnel
// tunnel is given as:       (z - axis)
//   c2.x - radius
//   c2.y - object id
// tex0,tex1 - ray orig,dir
dcl t0
dcl_2d s0
dcl_2d s1
def c8,256,-128,-2,4
def c9,-4,2,1000,0.01
def c10,0,0,0,0
def c11,1,0,0,0
texld r0,t0,s0
mov r0.z,c10.x
texld r1,t0,s1
mov r1.z,c10.x
dp3 r2.x,r0,r1                // (dp)
mul r2.x,r2.x,c8.z            // -2dp
mul r2.y,r2.x,r2.x            // 4(dp)^2
dp3 r2.z,r1,r1
mul r2.w,r2.z,c8.w            // 4dd
mul r2.z,r2.z,c9.y            // 2dd
dp3 r3.x,r0,r0                // pp
sub r3.x,r3.x,c2.x            // pp - rr
mul r2.w,r2.w,r3.x            // 4dd(pp - rr)
sub r2.y,r2.y,r2.w            // disc = 4(dp)^2 - 4dd(pp - rr)
mov r4,r2.y
abs r2.y,r2.y
rsq r3.x,r2.y
rcp r2.y,r3.x                 // sqrt(disc)
add r3.x,r2.x,r2.y            // -2dp + sqrt(disc)
rcp r2.z,r2.z
mul r3.x,r3.x,r2.z            // t1 = (-2dp + sqrt(disc))/2dd
sub r3.y,r2.x,r2.y
mul r3.y,r3.y,r2.z            // t2 = (-2dp - sqrt(disc))/2dd
sub r3.z,r3.x,r3.y
cmp r3.x,r3.z,r3.x,r3.y       // choose the greater
mul r3.x,r3.x,c9.w
mov r0.g,r3.x
mov r0.b,c2.y
cmp r3,r4,r3.x,c11            //kill negative discr
cmp r3,r3.x,r3,c11            //kill negative distance
mov oC0,r0
mov oDepth,r3.x
