I am trying to use a gui library (guichan) with osg.
I have derived an osgViewer widget from its Container class.
The gui works fine when I don't invoke the viewer, but if I do, then I get
the 3D view as the background of the widget but the children of the widget
won't display on top of the view.
I thought it had to do with osg not restoring the OpenGL state and I tried
pushing everything at the start and popping it before the gui draw calls... No
luck.
Can someone help me out here? I have attached the relevant code that does
all the drawing for the gui.
Thanks,
Gerald
---------------------------------
Catch up on fall's hot new shows on Yahoo! TV. Watch previews, get listings,
and more!
/* _______ __ __ __ ______ __ __ _______ __ __
* / _____/\ / /\ / /\ / /\ / ____/\ / /\ / /\ / ___ /\ / |\/ /\
* / /\____\// / // / // / // /\___\// /_// / // /\_/ / // , |/ / /
* / / /__ / / // / // / // / / / ___ / // ___ / // /| ' / /
* / /_// /\ / /_// / // / // /_/_ / / // / // /\_/ / // / | / /
* /______/ //______/ //_/ //_____/\ /_/ //_/ //_/ //_/ //_/ /|_/ /
* \______\/ \______\/ \_\/ \_____\/ \_\/ \_\/ \_\/ \_\/ \_\/ \_\/
*
* Copyright (c) 2004, 2005, 2006, 2007 Olof Naessén and Per Larsson
*
* Js_./
* Per Larsson a.k.a finalman _RqZ{a<^_aa
* Olof Naessén a.k.a jansem/yakslem _asww7!uY`> )\a//
* _Qhm`] _f "'c 1!5m
* Visit: http://guichan.darkbits.org )Qk<P ` _: :+' .' "{[
* .)j(] .d_/ '-( P . S
* License: (BSD) <Td/Z <fP"5(\"??"\a. .L
* Redistribution and use in source and _dV>ws?a-?' ._/L #'
* binary forms, with or without )4d[#7r, . ' )d`)[
* modification, are permitted provided _Q-5'5W..j/?' -?!\)cam'
* that the following conditions are met: j<<WP+k/);. _W=j f
* 1. Redistributions of source code must .$%w\/]Q . ."' . mj$
* retain the above copyright notice, ]E.pYY(Q]>. a [EMAIL
PROTECTED]
* this list of conditions and the j(]1u<sE"L,. . ./^ ]{a
* following disclaimer. 4'_uomm\. )L);-4 (3=
* 2. Redistributions in binary form must )_]X{Z('a_"a7'<a"a, ]"[
* reproduce the above copyright notice, #}<]m7`Za??4,P-"'7. ).m
* this list of conditions and the ]d2e)Q(<Q( ?94 b- LQ/
* following disclaimer in the <B!</]C)d_, '(<' .f. =C+m
* documentation and/or other materials .Z!=J ]e []('-4f _ ) -.)m]'
* provided with the distribution. .w[5]' _[ /.)_-"+? _/ <W"
* 3. Neither the name of Guichan nor the :$we` _! + _/ . j?
* names of its contributors may be used =3)= _f (_yQmWW$#( "
* to endorse or promote products derived - W, sQQQQmZQ#Wwa]..
* from this software without specific (js, \[QQW$QWW#?!V"".
* prior written permission. ]y:.<\.. .
* -]n w/ ' [.
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT )/ )/ !
* HOLDERS AND CONTRIBUTORS "AS IS" AND ANY < (; sac , '
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, ]^ .- %
* BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF c < r
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR aga< <La
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 5% )P'-3L
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR _bQf` y`..)a
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, ,J?4P'.P"_(\?d'.,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES _Pa,)!f/<[]/ ?"
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT _2-..:. .r+_,.. .
* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ?a.<%"' " -'.a_ _,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) ^
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
/*
* For comments regarding functions please see the header file.
*/
#include "guichan/opengl/openglgraphics.hpp"
#if defined (_WIN32)
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#endif
#if defined (__amigaos4__)
#include <mgl/gl.h>
#define glVertex3i glVertex3f
#elif defined(__APPLE__)
#include <OpenGL/gl.h>
#else
#include <GL/gl.h>
#endif
#include "guichan/exception.hpp"
#include "guichan/image.hpp"
#include "guichan/opengl/openglimage.hpp"
namespace gcn
{
OpenGLGraphics::OpenGLGraphics()
{
setTargetPlane(640, 480);
mAlpha = false;
}
OpenGLGraphics::OpenGLGraphics(int width, int height)
{
setTargetPlane(width, height);
}
OpenGLGraphics::~OpenGLGraphics()
{
}
void OpenGLGraphics::_beginDraw()
{
glPushAttrib(
GL_COLOR_BUFFER_BIT |
GL_CURRENT_BIT |
GL_DEPTH_BUFFER_BIT |
GL_ENABLE_BIT |
GL_FOG_BIT |
GL_LIGHTING_BIT |
GL_LINE_BIT |
GL_POINT_BIT |
GL_POLYGON_BIT |
GL_SCISSOR_BIT |
GL_STENCIL_BUFFER_BIT |
GL_TEXTURE_BIT |
GL_TRANSFORM_BIT |
GL_POINT_BIT |
GL_LINE_BIT
);
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
glMatrixMode(GL_TEXTURE);
glPushMatrix();
glLoadIdentity();
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
glOrtho(0.0,
(double)mWidth,
(double)mHeight,
0.0,
-1.0,
1.0);
glDisable(GL_LIGHTING);
glDisable(GL_CULL_FACE);
glDisable(GL_DEPTH_TEST);
glDisable(GL_TEXTURE_2D);
glEnable(GL_SCISSOR_TEST);
glPointSize(1.0);
glLineWidth(1.0);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
pushClipArea(Rectangle(0, 0, mWidth, mHeight));
}
void OpenGLGraphics::_endDraw()
{
glMatrixMode(GL_MODELVIEW);
glPopMatrix();
glMatrixMode(GL_TEXTURE);
glPopMatrix();
glMatrixMode(GL_PROJECTION);
glPopMatrix();
glPopAttrib();
popClipArea();
}
bool OpenGLGraphics::pushClipArea(Rectangle area)
{
bool result = Graphics::pushClipArea(area);
glScissor(mClipStack.top().x,
mHeight - mClipStack.top().y - mClipStack.top().height,
mClipStack.top().width,
mClipStack.top().height);
return result;
}
void OpenGLGraphics::popClipArea()
{
Graphics::popClipArea();
if (mClipStack.empty())
{
return;
}
glScissor(mClipStack.top().x,
mHeight - mClipStack.top().y - mClipStack.top().height,
mClipStack.top().width,
mClipStack.top().height);
}
void OpenGLGraphics::setTargetPlane(int width, int height)
{
mWidth = width;
mHeight = height;
}
void OpenGLGraphics::drawImage(const Image* image,
int srcX,
int srcY,
int dstX,
int dstY,
int width,
int height)
{
const OpenGLImage* srcImage = dynamic_cast<const
OpenGLImage*>(image);
if (srcImage == NULL)
{
throw GCN_EXCEPTION("Trying to draw an image of unknown format,
must be an OpenGLImage.");
}
if (mClipStack.empty())
{
throw GCN_EXCEPTION("Clip stack is empty, perhaps you called a draw
funtion outside of _beginDraw() and _endDraw()?");
}
const ClipRectangle& top = mClipStack.top();
dstX += top.xOffset;
dstY += top.yOffset;
// Find OpenGL texture coordinates
float texX1 = srcX / (float)srcImage->getTextureWidth();
float texY1 = srcY / (float)srcImage->getTextureHeight();
float texX2 = (srcX+width) / (float)srcImage->getTextureWidth();
float texY2 = (srcY+height) / (float)srcImage->getTextureHeight();
glBindTexture(GL_TEXTURE_2D, srcImage->getTextureHandle());
glEnable(GL_TEXTURE_2D);
// Check if blending already is enabled
if (!mAlpha)
{
glEnable(GL_BLEND);
}
// Draw a textured quad -- the image
glBegin(GL_QUADS);
glTexCoord2f(texX1, texY1);
glVertex3i(dstX, dstY, 0);
glTexCoord2f(texX1, texY2);
glVertex3i(dstX, dstY + height, 0);
glTexCoord2f(texX2, texY2);
glVertex3i(dstX + width, dstY + height, 0);
glTexCoord2f(texX2, texY1);
glVertex3i(dstX + width, dstY, 0);
glEnd();
glDisable(GL_TEXTURE_2D);
// Don't disable blending if the color has alpha
if (!mAlpha)
{
glDisable(GL_BLEND);
}
}
void OpenGLGraphics::drawPoint(int x, int y)
{
if (mClipStack.empty())
{
throw GCN_EXCEPTION("Clip stack is empty, perhaps you called a draw
funtion outside of _beginDraw() and _endDraw()?");
}
const ClipRectangle& top = mClipStack.top();
x += top.xOffset;
y += top.yOffset;
glBegin(GL_POINTS);
glVertex2i(x, y);
glEnd();
}
void OpenGLGraphics::drawLine(int x1, int y1, int x2, int y2)
{
if (mClipStack.empty())
{
throw GCN_EXCEPTION("Clip stack is empty, perhaps you called a draw
funtion outside of _beginDraw() and _endDraw()?");
}
const ClipRectangle& top = mClipStack.top();
x1 += top.xOffset;
y1 += top.yOffset;
x2 += top.xOffset;
y2 += top.yOffset;
glBegin(GL_LINES);
glVertex2f(x1 + 0.375f,
y1 + 0.375f);
glVertex2f(x2 + 1.0f - 0.375f,
y2 + 1.0f - 0.375f);
glEnd();
glBegin(GL_POINTS);
glVertex2f(x2 + 1.0f - 0.375f,
y2 + 1.0f - 0.375f);
glEnd();
glBegin(GL_POINTS);
glVertex2f(x1 + 0.375f,
y1 + 0.375f);
glEnd();
}
void OpenGLGraphics::drawRectangle(const Rectangle& rectangle)
{
if (mClipStack.empty())
{
throw GCN_EXCEPTION("Clip stack is empty, perhaps you called a draw
funtion outside of _beginDraw() and _endDraw()?");
}
const ClipRectangle& top = mClipStack.top();
glBegin(GL_LINE_LOOP);
glVertex2f(rectangle.x + top.xOffset,
rectangle.y + top.yOffset);
glVertex2f(rectangle.x + rectangle.width + top.xOffset - 1.0f,
rectangle.y + top.yOffset + 0.375f);
glVertex2f(rectangle.x + rectangle.width + top.xOffset - 1.0f,
rectangle.y + rectangle.height + top.yOffset);
glVertex2f(rectangle.x + top.xOffset,
rectangle.y + rectangle.height + top.yOffset);
glEnd();
}
void OpenGLGraphics::fillRectangle(const Rectangle& rectangle)
{
if (mClipStack.empty())
{
throw GCN_EXCEPTION("Clip stack is empty, perhaps you called a draw
funtion outside of _beginDraw() and _endDraw()?");
}
const ClipRectangle& top = mClipStack.top();
glBegin(GL_QUADS);
glVertex2i(rectangle.x + top.xOffset,
rectangle.y + top.yOffset);
glVertex2i(rectangle.x + rectangle.width + top.xOffset,
rectangle.y + top.yOffset);
glVertex2i(rectangle.x + rectangle.width + top.xOffset,
rectangle.y + rectangle.height + top.yOffset);
glVertex2i(rectangle.x + top.xOffset,
rectangle.y + rectangle.height + top.yOffset);
glEnd();
}
void OpenGLGraphics::setColor(const Color& color)
{
mColor = color;
glColor4ub(color.r, color.g, color.b, color.a);
mAlpha = color.a != 255;
if (mAlpha)
{
glEnable(GL_BLEND);
}
}
const Color& OpenGLGraphics::getColor() const
{
return mColor;
}
}
_______________________________________________
osg-users mailing list
osg-users@lists.openscenegraph.org
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org