void VideoDriver::pushClip( Rect &rect )
{
//mClipStack.push( rect );
glScissor( rect.x, rect.y, rect.width, rect.height);
}
void VideoDriver::popClip()
{
/*mClipStack.pop();
if( mClipStack.empty() )
return;*/
glScissor( 0, 0, mWidth, mHeight);
}
void Container::drawChildren( VideoDriver *video )
{
std::list<Widget*>::iterator itr;
video->pushClip( mSize );
for(itr = mWidgetList.begin(); itr != mWidgetList.end(); ++itr )
{
if( (*itr)->getEnabled() == true && (*itr)->getVisible() == true )
{
//video->pushClip( (*itr)->getSize() );
(*itr)->draw( video );
//video->popClip();
}
}
video->popClip();
}
Rect Widget::getRelativeSize()
{
Rect size;
if( getParent() != NULL )
{
size.x = mSize.x + getParent()->getSize().x;
size.y = mSize.y + getParent()->getSize().y;
size.width = mSize.width;
size.height = mSize.height;
return size;
}
return mSize;
}
glScissor [ FIXED]
EDIT: I fixed the problem. I wasn't calculation the glScissor rect correctly. Thanks for the help!
Ok, I'm trying to scissor the current widget of my gui when I draw them.
The way I have it setup is I have a top container, then have another container as a sub window, with a widget inside the window.
top->draw(),drawChildren()->
window->draw(),drawChildren()->
button->draw()
If I only scissor just before I loop through the widgets, the top and window renders.
If I scissor in the loop through the widgets and before I loop through the widgets, only top draws.
If I scissor only for each widget in the loop, only the top draws.
I have no idea how to fix it. I have two functions for widgets(containers are based off of widgets):
getSize()
getRelativeSize()
these get the x/y/width/height values. Relative gets the relative location from the parent widget.
[Edited by - Stormtrooper on July 8, 2007 11:54:49 PM]
Here is the gui draw code, if you need it
void Gui::draw(){ mVideoDriver->beginRendering(); if( mTop != NULL ) { Rect size; size.x = 0; size.y = 0; size.width = mVideoDriver->getWidth(); size.height = mVideoDriver->getHeight(); mVideoDriver->pushClip( size ); mTop->draw( mVideoDriver ); mVideoDriver->popClip(); } mVideoDriver->endRendering();}
I am not sure I understood the entire gist of you question(screenshots?) but here are some ideals to mitigate problems you may or may not have.
0) Make sure glScissor() gets the absolute screen position of the widget and not the relative position.
1) Here's a way to adjust the scissor area when going through widgets
The method assumes children should be contained at least partially within the parent region. Before setting the scissor rect, clip the widget's rect with the previous rect in clip stack. This ensure the children is clipped to the parent.
2) Check to make sure the coordinates to glScissor are correct. In the case where the viewpoint is setup so that the origin is in the upper-left of the screen, glScissor will still assume the origin is in the lower-left corner of the screen. So in that case you would need to perform transformation on the coordinates before passing them to glScissor.
0) Make sure glScissor() gets the absolute screen position of the widget and not the relative position.
1) Here's a way to adjust the scissor area when going through widgets
The method assumes children should be contained at least partially within the parent region. Before setting the scissor rect, clip the widget's rect with the previous rect in clip stack. This ensure the children is clipped to the parent.
//This is verbose pseudo codePushClip(Rect r){ if(stack.empty()){ stack.push(r); glEnable(GL_SCISSOR_TEST); }else{ //clip r with previous rect push on the stack if(!ClipRect2Rect(r,stack.peek()){ //r has been fully clip (Entirely outside the previous clipping rect) stack.push(stack.peek()); //just use the previous clipping rect? }else{ stack.push(r);//r contain the newly clipped rect(it will be partially or entirely inside the previous clipping rect) } } glScissor(r.x,r.y,r.h,r.w)}PopClip(){ stack.pop() if(!stack.empty()){ Rect r= stack.peek() //restore previous clip rect glScissor(r.x,r.y,r.w,r.h) }else glDisable(GL_SCISSOR_TEST)}
2) Check to make sure the coordinates to glScissor are correct. In the case where the viewpoint is setup so that the origin is in the upper-left of the screen, glScissor will still assume the origin is in the lower-left corner of the screen. So in that case you would need to perform transformation on the coordinates before passing them to glScissor.
Ok, thanks for your help I'll try it out.
My problem is that its not drawing a button that is within the window container. It might be because that area is already clipped and does not need to be re-clipped? The reason why I clip the containers is so if a widget goes out of the parent, it won't get drawn. I wonder if I shouldn't clip the actual widget.
My problem is that its not drawing a button that is within the window container. It might be because that area is already clipped and does not need to be re-clipped? The reason why I clip the containers is so if a widget goes out of the parent, it won't get drawn. I wonder if I shouldn't clip the actual widget.
This topic is closed to new replies.
Advertisement
Popular Topics
Advertisement