示例#1
0
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);
}
示例#2
0
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;
}
示例#3
0
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;
}