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;
}
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;
}