len3d

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
//-------------------------------------------------------------------------
eiBool eiSphere::intersect(eiRay *ray, eiObject *po, eiFloat & oldt,
                            eiPrimitive
* & ret_pri, eiFloat *cust_data,
                            HitParam 
*hparam)
{
    
if( oldt == 0.0f || ray_box( ray->src, hparam->hitPoint )
    
{
        
//compute intersecting point

        eiVector    oc 
= add( ray->src, - center );
        eiFloat        oc_len 
= dist( oc );
            
        
if( oc_len > radius || po->material->doubleSide )
        
{
            eiFloat    a 
= dot( ray->dir, ray->dir );
            eiFloat    b 
= 2.0f * dot( oc, ray->dir);
            eiFloat    c 
= dot( oc, oc ) - RR;
            eiFloat    dt 
= b * b - 4.0f * a * c;

            eiFloat    t;

            
if(a == 0.0f || dt < 0.0f)
                
return false;
            
else if(dt == 0.0f)
            
{
                t 
= - b / a * 0.5f;

                
if(t < 0.0f)
                    
return false;
            }

            
else
            
{
                a 
= 0.5f / a;
                eiFloat t1 
= (- b + sqrtf( dt )) * a;
                eiFloat t2 
= (- b - sqrtf( dt )) * a;

                
if(t1 > 0.0f && t2 < 0.0f)
                    t 
= t1;
                
else if(t1 < 0.0f && t2 > 0.0f)
                    t 
= t2;
                
else if(t1 > 0.0f && t2 > 0.0f)
                    t 
= (t1 < t2) ? t1 : t2;
                
else
                    
return false;
            }


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

            
//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

                
return true;
            }

        }

    }


    
return false;
}
posted on 2005-07-28 22:16  Len3d  阅读(637)  评论(1编辑  收藏  举报