60    if( !
m_bbox.Intersect( aRay, &tBBoxStart, &tBBoxEnd ) )
 
   63    if( tBBoxStart >= aHitInfo.
m_tHit )
 
   66    if( fabs( tBBoxStart - tBBoxEnd ) <= FLT_EPSILON )
 
   78        if( (
float) fabs( aRay.
m_Dir.z ) > FLT_EPSILON )
 
   83            float tBBoxStartAdjusted = 
NextFloatUp( tBBoxStart );
 
   85            if( tBot > FLT_EPSILON )
 
   87                hit_bot = tBot <= tBBoxStartAdjusted;
 
   91            if( tTop > FLT_EPSILON )
 
   93                hit_top = tTop <= tBBoxStartAdjusted;
 
  109        if( hit_top && hit_bot )
 
  113                if( 
m_object2d->IsPointInside( botHitPoint2d ) )
 
  115                    if( tBot < aHitInfo.
m_tHit )
 
  132                if( 
m_object2d->IsPointInside( topHitPoint2d ) )
 
  134                    if( tTop < aHitInfo.
m_tHit )
 
  156                    if( 
m_object2d->IsPointInside( topHitPoint2d ) )
 
  158                        if( tTop < aHitInfo.
m_tHit )
 
  180                        if( 
m_object2d->IsPointInside( botHitPoint2d ) )
 
  182                            if( tBot < aHitInfo.
m_tHit )
 
  207        SFVEC3F boxHitPointStart = aRay.
at( tBBoxStart );
 
  208        SFVEC3F boxHitPointEnd = aRay.
at( tBBoxEnd );
 
  210        SFVEC2F boxHitPointStart2D( boxHitPointStart.x, boxHitPointStart.y );
 
  211        SFVEC2F boxHitPointEnd2D( boxHitPointEnd.x, boxHitPointEnd.y );
 
  215        RAYSEG2D raySeg( boxHitPointStart2D, boxHitPointEnd2D );
 
  217        if( 
m_object2d->Intersect( raySeg, &tOut, &outNormal ) )
 
  222            SFVEC3F hitPoint = boxHitPointStart + ( boxHitPointEnd - boxHitPointStart ) * tOut;
 
  224            const float t = glm::length( hitPoint - aRay.
m_Origin );
 
  232                const float zNormalDir = hit_top?1.0f:hit_bot?-1.0f:0.0f;
 
  234                if( ( outNormal.x == 0.0f ) && ( outNormal.y == 0.0f ) )
 
  243                    if( hit_top || hit_bot )
 
  245                        float zDistanceToTopOrBot;
 
  250                            zDistanceToTopOrBot = ( 
m_bbox.Max().z - hitPoint.z );
 
  254                            zDistanceToTopOrBot = ( hitPoint.z - 
m_bbox.Min().z );
 
  260                        const float bevelThickness = glm::max(
 
  265                        if( ( zDistanceToTopOrBot > 0.0f )
 
  266                          && ( zDistanceToTopOrBot < bevelThickness ) )
 
  269                            zBend = ( bevelThickness - zDistanceToTopOrBot ) / bevelThickness;
 
  273                    const SFVEC3F normalLateral = 
SFVEC3F( outNormal.x, outNormal.y, 0.0f );
 
  277                    aHitInfo.
m_HitNormal = glm::mix( normalLateral, normalTopBot, zBend );
 
  295        const SFVEC3F boxHitPointStart = aRay.
at( tBBoxStart );
 
  296        const SFVEC3F boxHitPointEnd = aRay.
at( tBBoxEnd );
 
  298        const SFVEC2F boxHitPointStart2D( boxHitPointStart.x, boxHitPointStart.y );
 
  300        const SFVEC2F boxHitPointEnd2D( boxHitPointEnd.x, boxHitPointEnd.y );
 
  302        if( !( 
m_object2d->IsPointInside( boxHitPointStart2D ) &&
 
  303               m_object2d->IsPointInside( boxHitPointEnd2D ) ) )
 
  308        RAYSEG2D raySeg( boxHitPointStart2D, boxHitPointEnd2D );
 
  310        if( ( 
m_object2d->IsPointInside( boxHitPointStart2D )
 
  311            && 
m_object2d->IsPointInside( boxHitPointEnd2D ) ) )
 
  313            if( tBBoxEnd < aHitInfo.
m_tHit )
 
  315                aHitInfo.
m_tHit = tBBoxEnd;
 
  319                if( aRay.
m_Dir.z > 0.0f )
 
  331            if( 
m_object2d->Intersect( raySeg, &tOut, &outNormal ) )
 
  336                const SFVEC3F hitPoint = boxHitPointStart +
 
  337                                         ( boxHitPointEnd - boxHitPointStart ) * tOut;
 
  339                const float t = glm::length( hitPoint - aRay.
m_Origin );
 
 
  366    if( !
m_bbox.Intersect( aRay, &tBBoxStart, &tBBoxEnd ) )
 
  369    if( ( tBBoxStart > aMaxDistance ) || ( fabs( tBBoxStart - tBBoxEnd ) < FLT_EPSILON ) )
 
  372    float tTop = FLT_MAX;
 
  373    float tBot = FLT_MAX;
 
  374    bool hit_top = 
false;
 
  375    bool hit_bot = 
false;
 
  377    if( (
float)fabs( aRay.
m_Dir.z ) > FLT_EPSILON )
 
  382        const float tBBoxStartAdjusted = 
NextFloatUp( tBBoxStart );
 
  384        if( tBot > FLT_EPSILON )
 
  386            hit_bot = tBot <= tBBoxStartAdjusted;
 
  390        if( tTop > FLT_EPSILON )
 
  392            hit_top = tTop <= tBBoxStartAdjusted;
 
  411    if( hit_top && hit_bot )
 
  415            if( 
m_object2d->IsPointInside( botHitPoint2d ) )
 
  417                if( tBot < aMaxDistance )
 
  425            if( 
m_object2d->IsPointInside( topHitPoint2d ) )
 
  427                if( tTop < aMaxDistance )
 
  440                if( 
m_object2d->IsPointInside( topHitPoint2d ) )
 
  442                    if( tTop < aMaxDistance )
 
  455                    if( 
m_object2d->IsPointInside( botHitPoint2d ) )
 
  457                        if( tBot < aMaxDistance )
 
  473    SFVEC3F boxHitPointStart = aRay.
at( tBBoxStart );
 
  474    SFVEC3F boxHitPointEnd = aRay.
at( tBBoxEnd );
 
  476    SFVEC2F boxHitPointStart2D( boxHitPointStart.x, boxHitPointStart.y );
 
  478    SFVEC2F boxHitPointEnd2D( boxHitPointEnd.x, boxHitPointEnd.y );
 
  482    RAYSEG2D raySeg( boxHitPointStart2D, boxHitPointEnd2D );
 
  484    if( 
m_object2d->Intersect( raySeg, &tOut, &outNormal ) )
 
  491            const SFVEC3F hitPoint = boxHitPointStart +
 
  492                                     ( boxHitPointEnd - boxHitPointStart ) * tOut;
 
  493            const float t = glm::length( hitPoint - aRay.
m_Origin );
 
  495            if( ( t < aMaxDistance ) && ( t > FLT_EPSILON ) )