void CClientLeafSystem::ProjectShadow( ClientLeafShadowHandle_t handle, const Vector& origin, const Vector& dir, const Vector2D& size, float maxDist ) { // Remove the shadow from any leaves it current exists in RemoveShadowFromLeaves( handle ); RemoveShadowFromRenderables( handle ); Assert( ( m_Shadows[handle].m_Flags & SHADOW_FLAGS_PROJECTED_TEXTURE_TYPE_MASK ) == SHADOW_FLAGS_SHADOW ); // This will help us to avoid adding the shadow multiple times to a renderable ++m_ShadowEnum; // Create a ray starting at the origin, with a boxsize == to the // maximum size, and cast it along the direction of the shadow // Then mark each leaf that the ray hits with the shadow Ray_t ray; VectorCopy( origin, ray.m_Start ); VectorMultiply( dir, maxDist, ray.m_Delta ); ray.m_StartOffset.Init( 0, 0, 0 ); float maxsize = max( size.x, size.y ) * 0.5f; ray.m_Extents.Init( maxsize, maxsize, maxsize ); ray.m_IsRay = false; ray.m_IsSwept = true; CShadowLeafEnum leafEnum; ISpatialQuery* pQuery = engine->GetBSPTreeQuery(); pQuery->EnumerateLeavesAlongRay( ray, &leafEnum, handle ); }
bool CBSPTreeData::EnumerateLeavesAlongRay( Ray_t const& ray, ISpatialLeafEnumerator* pEnum, int context ) { return m_pBSPTree->EnumerateLeavesAlongRay( ray, pEnum, context ); }