len3d

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

 

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;
}
posted on 2005-09-03 01:20  Len3d  阅读(404)  评论(0编辑  收藏  举报