[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