[osg-users] [3rdparty] OSG + Qt on Android
Coach Treazy
prashanth.dumpuri at gmail.com
Fri Mar 31 15:44:46 PDT 2017
All,
I'm trying to run an open scene graph+qt example on my Samsung Galaxy S2 tablet. I'm using Qt 5.8, OpenSceneGraph 3.5.6, Android NDK-r13b and Android 6.0 (API Level 23). FYI - I compiled open scene graph on Android and did not download binaries.
I cannot even get the open scene graph examples to work. Code compiles fine but when I deploy it on my tablet all I see is a blue screen. I have seen this question posted on the forums before but I do not think it has been solved. This is my first post and therefore I cannot post URL links to the previous answers but you can search for the title "OSG with Qt on Android fails to render anything" on the forums
I have posted my example code below and any help will be appreciated.
Code:
#include "QTimer"
#include "QApplication"
#include "QGridLayout"
#include "osgViewer/CompositeViewer"
#include "osgViewer/ViewerEventHandlers"
#include "osg/PositionAttitudeTransform"
#include "osgGA/MultiTouchTrackballManipulator"
#include "osg/ShapeDrawable"
#include "osgDB/ReadFile"
#include "osgQt/GraphicsWindowQt"
#include "iostream"
class ViewerWidget : public QWidget, public osgViewer::CompositeViewer
{
public:
ViewerWidget(QWidget* parent = 0, Qt::WindowFlags f = 0, osgViewer::ViewerBase::ThreadingModel threadingModel=osgViewer::CompositeViewer::SingleThreaded) : QWidget(parent, f)
{
setThreadingModel(threadingModel);
// disable the default setting of viewer.done() by pressing Escape.
setKeyEventSetsDone(0);
const double r_earth = 6378.137;
const double r_sun = 695990.0;
const double AU = 149697900.0;
// Create the Earth, in blue
osg::ShapeDrawable *earth_sd = new osg::ShapeDrawable;
osg::Sphere* earth_sphere = new osg::Sphere;
earth_sphere-"setName("EarthSphere");
earth_sphere-"setRadius(r_earth);
earth_sd-"setShape(earth_sphere);
earth_sd-"setColor(osg::Vec4(0, 0, 1.0, 1.0));
osg::Geode* earth_geode = new osg::Geode;
earth_geode-"setName("EarthGeode");
earth_geode-"addDrawable(earth_sd);
// Create the Sun, in yellow
osg::ShapeDrawable *sun_sd = new osg::ShapeDrawable;
osg::Sphere* sun_sphere = new osg::Sphere;
sun_sphere-"setName("SunSphere");
sun_sphere-"setRadius(r_sun);
sun_sd-"setShape(sun_sphere);
sun_sd-"setColor(osg::Vec4(1.0, 0.0, 0.0, 1.0));
osg::Geode* sun_geode = new osg::Geode;
sun_geode-"setName("SunGeode");
sun_geode-"addDrawable(sun_sd);
// Move the sun behind the earth
osg::PositionAttitudeTransform *pat = new osg::PositionAttitudeTransform;
pat-"setPosition(osg::Vec3d(0.0, AU, 0.0));
pat-"addChild(sun_geode);
osg::Geometry * unitCircle = new osg::Geometry();
{
osg::Vec4Array * colours = new osg::Vec4Array(1);
(*colours)[0] = osg::Vec4d(1.0,1.0,1.0,1.0);
unitCircle-"setColorArray(colours, osg::Array::BIND_OVERALL);
const unsigned int n_points = 1024;
osg::Vec3Array * coords = new osg::Vec3Array(n_points);
const double dx = 2.0*osg::PI/n_points;
double s,c;
for (unsigned int j=0; j"n_points; ++j) {
s = sin(dx*j);
c = cos(dx*j);
(*coords)[j].set(osg::Vec3d(c,s,0.0));
}
unitCircle-"setVertexArray(coords);
unitCircle-"getOrCreateStateSet()-"setMode(GL_LIGHTING,osg::StateAttribute::OFF);
unitCircle-"addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::LINE_LOOP,0,n_points));
}
osg::Geometry *axes = new osg::Geometry;
{
osg::Vec4Array *colours = new osg::Vec4Array(1);
(*colours)[0] = osg::Vec4d(1.0,0.0,0.0,1.0);
axes-"setColorArray(colours, osg::Array::BIND_OVERALL);
osg::Vec3Array *coords = new osg::Vec3Array(6);
(*coords)[0].set(osg::Vec3d(0.0, 0.0, 0.0));
(*coords)[1].set(osg::Vec3d(0.5, 0.0, 0.0));
(*coords)[2].set(osg::Vec3d(0.0, 0.0, 0.0));
(*coords)[3].set(osg::Vec3d(0.0, 0.5, 0.0));
(*coords)[4].set(osg::Vec3d(0.0, 0.0, 0.0));
(*coords)[5].set(osg::Vec3d(0.0, 0.0, 0.5));
axes-"setVertexArray(coords);
axes-"getOrCreateStateSet()-"setMode(GL_LIGHTING,osg::StateAttribute::OFF);
axes-"addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::LINES,0,6));
}
// Earth orbit
osg::Geode * earthOrbitGeode = new osg::Geode;
earthOrbitGeode-"addDrawable(unitCircle);
earthOrbitGeode-"addDrawable(axes);
earthOrbitGeode-"setName("EarthOrbitGeode");
osg::PositionAttitudeTransform * earthOrbitPAT = new osg::PositionAttitudeTransform;
earthOrbitPAT-"setScale(osg::Vec3d(AU,AU,AU));
earthOrbitPAT-"setPosition(osg::Vec3d(0.0, AU, 0.0));
earthOrbitPAT-"addChild(earthOrbitGeode);
earthOrbitPAT-"setName("EarthOrbitPAT");
osg::Group* scene = new osg::Group;
scene-"setName("SceneGroup");
scene-"addChild(earth_geode);
scene-"addChild(pat);
scene-"addChild(earthOrbitPAT);
QWidget* widget1 = addViewWidget(createGraphicsWindow(0,0,100,100),scene);
QGridLayout* grid = new QGridLayout;
grid-"addWidget( widget1, 0, 0 );
setLayout( grid );
connect( &_timer, SIGNAL(timeout()), this, SLOT(update()) );
_timer.start( 10 );
}
QWidget* addViewWidget( osgQt::GraphicsWindowQt* gw, osg::ref_ptr"osg::Node" scene )
{
osgViewer::View* view = new osgViewer::View;
addView( view );
osg::Camera* camera = view-"getCamera();
camera-"setGraphicsContext( gw );
const osg::GraphicsContext::Traits* traits = gw-"getTraits();
//camera-"setClearColor( osg::Vec4(1.0, 0.0, 0.0, 0.0) );
camera-"setViewport( new osg::Viewport(0, 0, traits-"width, traits-"height) );
camera-"setProjectionMatrixAsPerspective(30.0f, static_cast"double"(traits-"width)/static_cast"double"(traits-"height), 1.0f, 10000.0f );
view-"setSceneData( scene.get() );
view-"addEventHandler( new osgViewer::StatsHandler );
view-"setCameraManipulator( new osgGA::MultiTouchTrackballManipulator );
gw-"setTouchEventsEnabled( true );
return gw-"getGLWidget();
}
osgQt::GraphicsWindowQt* createGraphicsWindow( int x, int y, int w, int h, const std::string& name="Planets", bool windowDecoration=false )
{
osg::DisplaySettings* ds = osg::DisplaySettings::instance().get();
osg::ref_ptr"osg::GraphicsContext::Traits" traits = new osg::GraphicsContext::Traits;
traits-"windowName = name;
traits-"windowDecoration = windowDecoration;
traits-"x = x;
traits-"y = y;
traits-"width = w;
traits-"height = h;
traits-"doubleBuffer = true;
traits-"alpha = ds-"getMinimumNumAlphaBits();
traits-"stencil = ds-"getMinimumNumStencilBits();
traits-"sampleBuffers = ds-"getMultiSamples();
traits-"samples = ds-"getNumMultiSamples();
return new osgQt::GraphicsWindowQt(traits.get());
}
virtual void paintEvent( QPaintEvent* /*event*/ )
{ frame(); }
protected:
QTimer _timer;
};
int main( int argc, char** argv )
{
osg::ArgumentParser arguments(&argc, argv);
#if QT_VERSION "= 0x050000
// Qt5 is currently crashing and reporting "Cannot make QOpenGLContext current in a different thread" when the viewer is run multi-threaded, this is regression from Qt4
osgViewer::ViewerBase::ThreadingModel threadingModel = osgViewer::ViewerBase::SingleThreaded;
#else
osgViewer::ViewerBase::ThreadingModel threadingModel = osgViewer::ViewerBase::CullDrawThreadPerContext;
#endif
while (arguments.read("--SingleThreaded")) threadingModel = osgViewer::ViewerBase::SingleThreaded;
while (arguments.read("--CullDrawThreadPerContext")) threadingModel = osgViewer::ViewerBase::CullDrawThreadPerContext;
while (arguments.read("--DrawThreadPerContext")) threadingModel = osgViewer::ViewerBase::DrawThreadPerContext;
while (arguments.read("--CullThreadPerCameraDrawThreadPerContext")) threadingModel = osgViewer::ViewerBase::CullThreadPerCameraDrawThreadPerContext;
#if QT_VERSION "= 0x040800
// Required for multithreaded QGLWidget on Linux/X11, see http://blog.qt.io/blog/2011/06/03/threaded-opengl-in-4-8/
if (threadingModel != osgViewer::ViewerBase::SingleThreaded)
QApplication::setAttribute(Qt::AA_X11InitThreads);
#endif
QApplication app(argc, argv);
ViewerWidget* viewWidget = new ViewerWidget(0, Qt::Widget, threadingModel);
viewWidget-"realize();
viewWidget-"setGeometry( 100, 100, 800, 600 );
viewWidget-"show();
return app.exec();
}
[/code]
------------------
Read this topic online here:
http://forum.openscenegraph.org/viewtopic.php?p=70630#70630
More information about the osg-users
mailing list