56 if( !
m_bbox.Intersect( aRay, &tBBoxStart, &tBBoxEnd ) )
59 if( tBBoxStart >= aHitInfo.
m_tHit )
62 if( fabs( tBBoxStart - tBBoxEnd ) <= FLT_EPSILON )
74 if( (
float) fabs( aRay.
m_Dir.z ) > FLT_EPSILON )
79 float tBBoxStartAdjusted =
NextFloatUp( tBBoxStart );
81 if( tBot > FLT_EPSILON )
83 hit_bot = tBot <= tBBoxStartAdjusted;
87 if( tTop > FLT_EPSILON )
89 hit_top = tTop <= tBBoxStartAdjusted;
105 if( hit_top && hit_bot )
109 if(
m_object2d->IsPointInside( botHitPoint2d ) )
111 if( tBot < aHitInfo.
m_tHit )
128 if(
m_object2d->IsPointInside( topHitPoint2d ) )
130 if( tTop < aHitInfo.
m_tHit )
152 if(
m_object2d->IsPointInside( topHitPoint2d ) )
154 if( tTop < aHitInfo.
m_tHit )
176 if(
m_object2d->IsPointInside( botHitPoint2d ) )
178 if( tBot < aHitInfo.
m_tHit )
203 SFVEC3F boxHitPointStart = aRay.
at( tBBoxStart );
204 SFVEC3F boxHitPointEnd = aRay.
at( tBBoxEnd );
206 SFVEC2F boxHitPointStart2D( boxHitPointStart.x, boxHitPointStart.y );
207 SFVEC2F boxHitPointEnd2D( boxHitPointEnd.x, boxHitPointEnd.y );
211 RAYSEG2D raySeg( boxHitPointStart2D, boxHitPointEnd2D );
213 if(
m_object2d->Intersect( raySeg, &tOut, &outNormal ) )
218 SFVEC3F hitPoint = boxHitPointStart + ( boxHitPointEnd - boxHitPointStart ) * tOut;
220 const float t = glm::length( hitPoint - aRay.
m_Origin );
228 const float zNormalDir = hit_top?1.0f:hit_bot?-1.0f:0.0f;
230 if( ( outNormal.x == 0.0f ) && ( outNormal.y == 0.0f ) )
239 if( hit_top || hit_bot )
241 float zDistanceToTopOrBot;
246 zDistanceToTopOrBot = (
m_bbox.Max().z - hitPoint.z );
250 zDistanceToTopOrBot = ( hitPoint.z -
m_bbox.Min().z );
256 const float bevelThickness = glm::max(
261 if( ( zDistanceToTopOrBot > 0.0f )
262 && ( zDistanceToTopOrBot < bevelThickness ) )
265 zBend = ( bevelThickness - zDistanceToTopOrBot ) / bevelThickness;
269 const SFVEC3F normalLateral =
SFVEC3F( outNormal.x, outNormal.y, 0.0f );
273 aHitInfo.
m_HitNormal = glm::mix( normalLateral, normalTopBot, zBend );
291 const SFVEC3F boxHitPointStart = aRay.
at( tBBoxStart );
292 const SFVEC3F boxHitPointEnd = aRay.
at( tBBoxEnd );
294 const SFVEC2F boxHitPointStart2D( boxHitPointStart.x, boxHitPointStart.y );
296 const SFVEC2F boxHitPointEnd2D( boxHitPointEnd.x, boxHitPointEnd.y );
298 if( !(
m_object2d->IsPointInside( boxHitPointStart2D ) &&
299 m_object2d->IsPointInside( boxHitPointEnd2D ) ) )
304 RAYSEG2D raySeg( boxHitPointStart2D, boxHitPointEnd2D );
306 if( (
m_object2d->IsPointInside( boxHitPointStart2D )
307 &&
m_object2d->IsPointInside( boxHitPointEnd2D ) ) )
309 if( tBBoxEnd < aHitInfo.
m_tHit )
311 aHitInfo.
m_tHit = tBBoxEnd;
315 if( aRay.
m_Dir.z > 0.0f )
327 if(
m_object2d->Intersect( raySeg, &tOut, &outNormal ) )
332 const SFVEC3F hitPoint = boxHitPointStart +
333 ( boxHitPointEnd - boxHitPointStart ) * tOut;
335 const float t = glm::length( hitPoint - aRay.
m_Origin );
362 if( !
m_bbox.Intersect( aRay, &tBBoxStart, &tBBoxEnd ) )
365 if( ( tBBoxStart > aMaxDistance ) || ( fabs( tBBoxStart - tBBoxEnd ) < FLT_EPSILON ) )
368 float tTop = FLT_MAX;
369 float tBot = FLT_MAX;
370 bool hit_top =
false;
371 bool hit_bot =
false;
373 if( (
float)fabs( aRay.
m_Dir.z ) > FLT_EPSILON )
378 const float tBBoxStartAdjusted =
NextFloatUp( tBBoxStart );
380 if( tBot > FLT_EPSILON )
382 hit_bot = tBot <= tBBoxStartAdjusted;
386 if( tTop > FLT_EPSILON )
388 hit_top = tTop <= tBBoxStartAdjusted;
407 if( hit_top && hit_bot )
411 if(
m_object2d->IsPointInside( botHitPoint2d ) )
413 if( tBot < aMaxDistance )
421 if(
m_object2d->IsPointInside( topHitPoint2d ) )
423 if( tTop < aMaxDistance )
436 if(
m_object2d->IsPointInside( topHitPoint2d ) )
438 if( tTop < aMaxDistance )
451 if(
m_object2d->IsPointInside( botHitPoint2d ) )
453 if( tBot < aMaxDistance )
469 SFVEC3F boxHitPointStart = aRay.
at( tBBoxStart );
470 SFVEC3F boxHitPointEnd = aRay.
at( tBBoxEnd );
472 SFVEC2F boxHitPointStart2D( boxHitPointStart.x, boxHitPointStart.y );
474 SFVEC2F boxHitPointEnd2D( boxHitPointEnd.x, boxHitPointEnd.y );
478 RAYSEG2D raySeg( boxHitPointStart2D, boxHitPointEnd2D );
480 if(
m_object2d->Intersect( raySeg, &tOut, &outNormal ) )
487 const SFVEC3F hitPoint = boxHitPointStart +
488 ( boxHitPointEnd - boxHitPointStart ) * tOut;
489 const float t = glm::length( hitPoint - aRay.
m_Origin );
491 if( ( t < aMaxDistance ) && ( t > FLT_EPSILON ) )