eiBool eiTriangle::intersect(eiRay *ray, eiObject *po, eiFloat & oldt,
eiPrimitive* & ret_pri, eiFloat *cust_data, HitParam *hparam)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif) ![](/Images/OutliningIndicators/ContractedBlock.gif) {
if ( clip == EI_BSP_PRIMITIVE &&
( oldt == 0.0f || ray_box( ray->src, hparam->hitPoint ) )
)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
//compute intersecting point![](/Images/dot.gif)
![](/Images/OutliningIndicators/InBlock.gif)
eiFloat vnd = dot(normal , ray->dir);
![](/Images/OutliningIndicators/InBlock.gif)
if(ray->type == RAY_SHADOW)
vnd = - vnd;
if( vnd < 0.0f || po->material->doubleSide )
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
eiFloat t,td1,td2,td3;
eiVector tmpIntersection;
![](/Images/OutliningIndicators/InBlock.gif)
if(ray->type == RAY_SHADOW)
t = ( dot( normal , ray->src) + d ) / vnd;
else
t = -( dot( normal , ray->src) + d ) / vnd;
![](/Images/OutliningIndicators/InBlock.gif)
if(t < 0.0f)
return false;
![](/Images/OutliningIndicators/InBlock.gif)
tmpIntersection = add(ray->src, mulvf(ray->dir,t));
![](/Images/OutliningIndicators/InBlock.gif)
//make sure intersection in bound box
![](/Images/OutliningIndicators/InBlock.gif)
if(!is_pos_in_box(tmpIntersection, box))
return false;
![](/Images/OutliningIndicators/InBlock.gif)
//near and far clipping![](/Images/dot.gif)
![](/Images/OutliningIndicators/InBlock.gif)
if(ray->type == RAY_EYE && !near_far_clip(tmpIntersection))
return false;
![](/Images/OutliningIndicators/InBlock.gif)
//is in triangular area![](/Images/dot.gif)
![](/Images/OutliningIndicators/InBlock.gif)
td1 = dot(tmpIntersection , la) + d1;
![](/Images/OutliningIndicators/InBlock.gif)
if(td1 < 0.0f || td1 > 1.0f)
return false;
![](/Images/OutliningIndicators/InBlock.gif)
td2 = dot(tmpIntersection , lb) + d2;
![](/Images/OutliningIndicators/InBlock.gif)
if(td2 < 0.0f || td2 > 1.0f)
return false;
![](/Images/OutliningIndicators/InBlock.gif)
td3 = dot(tmpIntersection , lc) + d3;
![](/Images/OutliningIndicators/InBlock.gif)
if(td3 < 0.0f || td3 > 1.0f)
return false;
![](/Images/OutliningIndicators/InBlock.gif)
//affect shadow factor![](/Images/dot.gif)
![](/Images/OutliningIndicators/InBlock.gif)
if(ray->type == RAY_SHADOW)
hparam->shadow_factor *= 1.0f - po->material->opacity;
![](/Images/OutliningIndicators/InBlock.gif)
//find nearest hit point![](/Images/dot.gif)
![](/Images/OutliningIndicators/InBlock.gif)
if(oldt == 0.0f || t < oldt)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
hparam->hitPoint = tmpIntersection;
hparam->hitObj = po;
ret_pri = this;
oldt = t;
![](/Images/OutliningIndicators/InBlock.gif)
//fill custom data![](/Images/dot.gif)
![](/Images/OutliningIndicators/InBlock.gif)
cust_data[0] = td1;
cust_data[1] = td2;
cust_data[2] = td3;
![](/Images/OutliningIndicators/InBlock.gif)
return true;
}
}
}
![](/Images/OutliningIndicators/InBlock.gif)
return false;
}
|