i use this function to get the scissor region of a bounding box. i can then use this region like this:
glScissor( kScissor.m_iLeft, kScissor.m_iBottom, kScissor.m_iRight-kScissor.m_iLeft, kScissor.m_iTop-kScissor.m_iBottom );
it works pretty well, now i’d like to do the same for bounding spheres… i could of course create a bounding box from the sphere and then use the same function, but i’m sure there are much faster ways… i read tzhe section in eric’s article on stencil shadows about this issuse, but i have to admit that i’m not understanding all those formulas… and i’d like to understand what i’m doing. so how do i have to modify my function to support spheres? thanks in advance
struct WindowCoordinates
{
int x, y;
};
struct ScissorRegion
{
int m_iLeft, m_iBottom, m_iRight, m_iTop;
};
ScissorRegion BoundingBox::GetScissorRegion()
{
// get maxima/minima of bounding box
Vector3D kMinimum = m_kMinimum+m_kTranslation;
Vector3D kMaximum = m_kMaximum+m_kTranslation;
// get corners of bounding box
vector<Vector3D> vkCorners;
vkCorners.reserve( 8 );
vkCorners.push_back( Vector3D(kMinimum.x, kMinimum.y, kMinimum.z) );
vkCorners.push_back( Vector3D(kMaximum.x, kMinimum.y, kMinimum.z) );
vkCorners.push_back( Vector3D(kMaximum.x, kMinimum.y, kMaximum.z) );
vkCorners.push_back( Vector3D(kMinimum.x, kMinimum.y, kMaximum.z) );
vkCorners.push_back( Vector3D(kMinimum.x, kMaximum.y, kMinimum.z) );
vkCorners.push_back( Vector3D(kMinimum.x, kMaximum.y, kMaximum.z) );
vkCorners.push_back( Vector3D(kMaximum.x, kMaximum.y, kMaximum.z) );
vkCorners.push_back( Vector3D(kMaximum.x, kMaximum.y, kMinimum.z) );
// set initial values for scissor box
ScissorRegion kBox;
kBox.m_iLeft = Camera::GetActiveCamera()->GetViewport().m_uiWidth;
kBox.m_iBottom = Camera::GetActiveCamera()->GetViewport().m_uiHeight;
kBox.m_iRight = Camera::GetActiveCamera()->GetViewport().m_uiX;
kBox.m_iTop = Camera::GetActiveCamera()->GetViewport().m_uiY;
for( unsigned int i = 0; i < vkCorners.size(); i++ )
{
// get window coordinates of transformed point ( similar to gluProject() )
WindowCoordinates kCoordinates = Core::Get()->GetRenderer()->ProjectToScreen( vkCorners[i] );
// compare these to previous values
if( kCoordinates.x < kBox.m_iLeft )
kBox.m_iLeft = kCoordinates.x;
else if( kCoordinates.x > kBox.m_iRight )
kBox.m_iRight = kCoordinates.x;
if( kCoordinates.y < kBox.m_iBottom )
kBox.m_iBottom = kCoordinates.y;
else if( kCoordinates.y > kBox.m_iTop )
kBox.m_iTop = kCoordinates.y;
}
vkCorners.clear();
return kBox;
}
ps: can i only have one scissor region per frame or could i also do:
ScissorRegion kScissor;
glEnable( GL_SCISSOR_TEST );
kScissor = kMesh1->GetBoundingBox().GetScissorRegion();
glScissor( kScissor.m_iLeft, kScissor.m_iBottom, kScissor.m_iRight-kScissor.m_iLeft, kScissor.m_iTop-kScissor.m_iBottom );
kMesh1->Render();
kScissor = kMesh2->GetBoundingBox().GetScissorRegion();
glScissor( kScissor.m_iLeft, kScissor.m_iBottom, kScissor.m_iRight-kScissor.m_iLeft, kScissor.m_iTop-kScissor.m_iBottom );
kMesh2->Render();
...
glDisable( GL_SCISSOR_TEST );