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