eiBool eiTriangle::intersect(eiRay *ray, eiObject *po, eiFloat & oldt,
eiPrimitive* & ret_pri, eiFloat *cust_data, HitParam *hparam)
  {
if ( clip == EI_BSP_PRIMITIVE &&
( oldt == 0.0f || ray_box( ray->src, hparam->hitPoint ) )
)
 {
//compute intersecting point

eiFloat vnd = dot(normal , ray->dir);

if(ray->type == RAY_SHADOW)
vnd = - vnd;
if( vnd < 0.0f || po->material->doubleSide )
 {
eiFloat t,td1,td2,td3;
eiVector tmpIntersection;

if(ray->type == RAY_SHADOW)
t = ( dot( normal , ray->src) + d ) / vnd;
else
t = -( dot( normal , ray->src) + d ) / vnd;

if(t < 0.0f)
return false;

tmpIntersection = add(ray->src, mulvf(ray->dir,t));

//make sure intersection in bound box

if(!is_pos_in_box(tmpIntersection, box))
return false;

//near and far clipping

if(ray->type == RAY_EYE && !near_far_clip(tmpIntersection))
return false;

//is in triangular area

td1 = dot(tmpIntersection , la) + d1;

if(td1 < 0.0f || td1 > 1.0f)
return false;

td2 = dot(tmpIntersection , lb) + d2;

if(td2 < 0.0f || td2 > 1.0f)
return false;

td3 = dot(tmpIntersection , lc) + d3;

if(td3 < 0.0f || td3 > 1.0f)
return false;

//affect shadow factor

if(ray->type == RAY_SHADOW)
hparam->shadow_factor *= 1.0f - po->material->opacity;

//find nearest hit point

if(oldt == 0.0f || t < oldt)
 {
hparam->hitPoint = tmpIntersection;
hparam->hitObj = po;
ret_pri = this;
oldt = t;

//fill custom data

cust_data[0] = td1;
cust_data[1] = td2;
cust_data[2] = td3;

return true;
}
}
}

return false;
}
|