From 807f550386a1eac6f7306589a4e4a01e783e65df Mon Sep 17 00:00:00 2001 From: Alexander Olofsson Date: Thu, 13 Feb 2020 19:15:33 +0100 Subject: [PATCH 1/4] Fix building mwrender/sky with OSG 3.6.5 OSG commit aff574b completely replaces the method of doing user-defined query geometry, removing support for modifying the default geometry. --- apps/openmw/mwrender/sky.cpp | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/apps/openmw/mwrender/sky.cpp b/apps/openmw/mwrender/sky.cpp index 3996f472c2..e13f5a7b65 100644 --- a/apps/openmw/mwrender/sky.cpp +++ b/apps/openmw/mwrender/sky.cpp @@ -558,16 +558,22 @@ private: osg::ref_ptr oqn = new osg::OcclusionQueryNode; oqn->setQueriesEnabled(true); +#if OSG_VERSION_GREATER_OR_EQUAL(3, 6, 5) + // With OSG 3.6.5, the method of providing user defined query geometry has been completely replaced + osg::ref_ptr queryGeom = new osg::QueryGeometry(oqn->getName()); +#else + auto* queryGeom = oqn->getQueryGeometry(); +#endif + // Make it fast! A DYNAMIC query geometry means we can't break frame until the flare is rendered (which is rendered after all the other geometry, // so that would be pretty bad). STATIC should be safe, since our node's local bounds are static, thus computeBounds() which modifies the queryGeometry // is only called once. // Note the debug geometry setDebugDisplay(true) is always DYNAMIC and that can't be changed, not a big deal. - oqn->getQueryGeometry()->setDataVariance(osg::Object::STATIC); + queryGeom->setDataVariance(osg::Object::STATIC); // Set up the query geometry to match the actual sun's rendering shape. osg::OcclusionQueryNode wasn't originally intended to allow this, // normally it would automatically adjust the query geometry to match the sub graph's bounding box. The below hack is needed to // circumvent this. - osg::Geometry* queryGeom = oqn->getQueryGeometry(); queryGeom->setVertexArray(mGeom->getVertexArray()); queryGeom->setTexCoordArray(0, mGeom->getTexCoordArray(0), osg::Array::BIND_PER_VERTEX); queryGeom->removePrimitiveSet(0, oqn->getQueryGeometry()->getNumPrimitiveSets()); @@ -578,6 +584,10 @@ private: // Still need a proper bounding sphere. oqn->setInitialBound(queryGeom->getBound()); +#if OSG_VERSION_GREATER_OR_EQUAL(3, 6, 5) + oqn->setQueryGeometry(queryGeom.release()); +#endif + osg::StateSet* queryStateSet = new osg::StateSet; if (queryVisible) { From 7db58a893a1448b7229de5464696b3cc6eb7663c Mon Sep 17 00:00:00 2001 From: Alexander Olofsson Date: Thu, 13 Feb 2020 19:32:17 +0100 Subject: [PATCH 2/4] Ensure osg/Version is included --- apps/openmw/mwrender/sky.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/openmw/mwrender/sky.cpp b/apps/openmw/mwrender/sky.cpp index e13f5a7b65..7cf2af88d0 100644 --- a/apps/openmw/mwrender/sky.cpp +++ b/apps/openmw/mwrender/sky.cpp @@ -16,6 +16,7 @@ #include #include #include +#include #include #include From 5de1e0fb0cf45fd056da73e0d06e0c9b78dddd36 Mon Sep 17 00:00:00 2001 From: Alexander Olofsson Date: Sat, 15 Feb 2020 03:12:36 +0100 Subject: [PATCH 3/4] Use queryGeom for all query geometry accesses --- apps/openmw/mwrender/sky.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/openmw/mwrender/sky.cpp b/apps/openmw/mwrender/sky.cpp index 7cf2af88d0..84d1078151 100644 --- a/apps/openmw/mwrender/sky.cpp +++ b/apps/openmw/mwrender/sky.cpp @@ -577,7 +577,7 @@ private: // circumvent this. queryGeom->setVertexArray(mGeom->getVertexArray()); queryGeom->setTexCoordArray(0, mGeom->getTexCoordArray(0), osg::Array::BIND_PER_VERTEX); - queryGeom->removePrimitiveSet(0, oqn->getQueryGeometry()->getNumPrimitiveSets()); + queryGeom->removePrimitiveSet(0, queryGeom->getNumPrimitiveSets()); queryGeom->addPrimitiveSet(mGeom->getPrimitiveSet(0)); // Hack to disable unwanted awful code inside OcclusionQueryNode::computeBound. From 776c0857fabb4434bc9f29f9cb1dae8b10cb3f88 Mon Sep 17 00:00:00 2001 From: Alexander Olofsson Date: Fri, 21 Feb 2020 07:51:50 +0100 Subject: [PATCH 4/4] Always use ref_ptr for query geometry --- apps/openmw/mwrender/sky.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/openmw/mwrender/sky.cpp b/apps/openmw/mwrender/sky.cpp index 84d1078151..10fc630bdf 100644 --- a/apps/openmw/mwrender/sky.cpp +++ b/apps/openmw/mwrender/sky.cpp @@ -563,7 +563,7 @@ private: // With OSG 3.6.5, the method of providing user defined query geometry has been completely replaced osg::ref_ptr queryGeom = new osg::QueryGeometry(oqn->getName()); #else - auto* queryGeom = oqn->getQueryGeometry(); + osg::ref_ptr queryGeom = oqn->getQueryGeometry(); #endif // Make it fast! A DYNAMIC query geometry means we can't break frame until the flare is rendered (which is rendered after all the other geometry,