Hi,
I'm new to OSG, but found it handling 3D scenes several magnitudes faster than
I did :)
So I jumped on integrating it with our existing Qt4.5 based application which
already
has very complicated UI based on QGraphicsScene with a 3D earth rendered in the
background. 'osgEarth' plugin is just perfect for that job.
However I can't just change everything to OSG, I need to use our original GL
textures
as well. So I learned from other posts how to save the states for OSG/Qt
rendering.
I want to draw a texture still in OSG's 3D scene, but that is incorrect.
Texture coordinates and quad coordinates are not the ones I expect.
It's visible especially when resizing the window.
Here's a short example:
Code:
#include QApplication
#include QGLWidget
#include osgViewer/Viewer
#include osgDB/ReadFile
static const double _R = 6378137.; // Earth radius
class OsgAdapterWidget : public QGLWidget, public osgViewer::Viewer
{
osg::ref_ptrosgViewer::GraphicsWindowEmbedded _gw;
osg::ref_ptrosg::Node _model;
osg::ref_ptrosg::StateSet _lastStateSet;
GLuint _textureID;
public:
OsgAdapterWidget(QWidget* parent = 0);
void paintGL();
void resizeGL(int, int);
};
OsgAdapterWidget::OsgAdapterWidget(QWidget *parent)
: QGLWidget(QGLFormat(QGL::Rgba | QGL::AlphaChannel |
QGL::SampleBuffers | QGL::DoubleBuffer), parent),
_lastStateSet(new osg::StateSet)
{
_gw = new osgViewer::GraphicsWindowEmbedded(0, 0, width(), height());
getCamera()-setGraphicsContext(_gw.get());
getCamera()-setClearColor(osg::Vec4f(0., 0., 0., 1.));
getCamera()-setClearMask(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
_model = osgDB::readNodeFile(model.earth);
setSceneData(_model.get());
QGLWidget::makeCurrent();
QImage image(image.png);
glEnable(GL_TEXTURE_2D);
glGenTextures(1, _textureID);
glBindTexture(GL_TEXTURE_2D, _textureID);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, image.width(), image.height(), 0,
GL_BGRA, GL_UNSIGNED_BYTE, image.bits());
}
void OsgAdapterWidget::resizeGL(int w, int h)
{
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(-w/2, w/2, h/2, -h/2);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
_gw-getEventQueue()-windowResize(0, 0, w, h);
_gw-resized(0, 0, w, h);
getCamera()-setViewport(new osg::Viewport(0, 0, double(w), double(h)));
getCamera()-setProjectionMatrixAsPerspective(35., double(w)/double(h), 1.,
4*_R);
getCamera()-setViewMatrixAsLookAt(osg::Vec3d(3*_R, 0., 0.), osg::Vec3d(0.,
0., 0.), osg::Vec3d(0., 0., 1.));
update();
}
void OsgAdapterWidget::paintGL()
{
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
glPushAttrib(GL_ALL_ATTRIB_BITS);
glPushClientAttrib(GL_CLIENT_ALL_ATTRIB_BITS);
glMatrixMode(GL_TEXTURE);
glPushMatrix();
glLoadIdentity();
glShadeModel(GL_SMOOTH);
osg::State *state = getCamera()-getGraphicsContext()-getState();
state-reset();
state-apply(_lastStateSet.get());
frame();
glMatrixMode(GL_TEXTURE); glPopMatrix();
// This is not working, texture coordinates are not in 0-1 range
// and quad seems to be in incorrect position as well.
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, _textureID);
glBegin(GL_QUADS);
glTexCoord2d(0., 0.); glVertex3d(-_R, -_R, _R);
glTexCoord2d(1., 0.); glVertex3d(_R, -_R, _R);
glTexCoord2d(1., 1.); glVertex3d(_R, _R, -_R);
glTexCoord2d(0., 1.); glVertex3d(-_R, _R, -_R);
glEnd();
getCamera()-getGraphicsContext()-getState()-captureCurrentState(*_lastStateSet);
glPopAttrib();
glPopClientAttrib();
glMatrixMode(GL_PROJECTION); glPopMatrix();
glMatrixMode(GL_MODELVIEW); glPopMatrix();
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, _textureID);
glBegin(GL_QUADS);
glTexCoord2d(0., 0.); glVertex2d(-50., -50.);
glTexCoord2d(1., 0.); glVertex2d(50., -50.);
glTexCoord2d(1., 1.); glVertex2d(50., 50.);
glTexCoord2d(0., 1.); glVertex2d(-50., 50.);
glEnd();
}
int main(int ac, char* av[])
{
QApplication app(ac, av);
app.setGraphicsSystem(opengl);
OsgAdapterWidget mainWindow;
mainWindow.show();
return app.exec();
}
You'll need an image.png for the texture and for model.earth you can use
this:
Code:
map name=TMS Example type=geocentric
image name=metacarta blue marble driver=tms
urlhttp://labs.metacarta.com/wms-c/Basic.py/1.0.0/satellite//url
/image
/map
I'd appreciate some suggestions.
Thank you.
--
Read this topic online here:
http://forum.openscenegraph.org/viewtopic.php?p=10619#10619
___
osg-users mailing list
osg-users@lists.openscenegraph.org
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org