bool CPicoSurface::TestRay (const ray_t *ray, vec_t *dist) const { int i; vec_t start_dist = *dist; vec_t local_dist = *dist; if (aabb_intersect_ray(&m_BBox, ray, &local_dist)) { switch( PicoGetSurfaceType(m_pSurface) ) { case PICO_TRIANGLES: for (i=0; i<PicoGetSurfaceNumIndexes(m_pSurface); i+=3) { local_dist = ray_intersect_triangle(ray, true, PicoGetSurfaceXYZ(m_pSurface,PicoGetSurfaceIndex(m_pSurface,i+2)), PicoGetSurfaceXYZ(m_pSurface,PicoGetSurfaceIndex(m_pSurface,i+1)), PicoGetSurfaceXYZ(m_pSurface,PicoGetSurfaceIndex(m_pSurface,i))); if (local_dist < *dist) *dist = local_dist; } break; default: Sys_Printf( "ERROR: Unsupported Pico Surface Type: %i", PicoGetSurfaceType(m_pSurface) ); break; } } return (*dist < start_dist); }
bool CEntityEclassModel::TestRay(const ray_t *ray, vec_t *dist) const { vec_t dist_start = *dist; vec_t dist_local = *dist; ray_t ray_local = *ray; if (aabb_intersect_ray(&m_BBox, &ray_local, &dist_local)) *dist = dist_local; return *dist < dist_start; }
bool CPicoModel::TestRay( const ray_t *ray, vec_t *dist ) const { vec_t dist_start = *dist; vec_t dist_local = *dist; ray_t ray_local = *ray; if ( !m_pModel ) { return false; } if ( !aabb_intersect_ray( &m_BBox, &ray_local, &dist_local ) ) { return false; } dist_local = dist_start; for ( unsigned int i = 0; i < m_children->len; i++ ) { if ( ( (CPicoSurface*)m_children->pdata[i] )->TestRay( &ray_local, &dist_local ) ) { *dist = dist_local; } } return *dist < dist_start; }