From ce5d81fac29439e5a00a8abe3caea20adb1c884a Mon Sep 17 00:00:00 2001 From: Remo E Date: Fri, 17 Oct 2025 21:42:51 +0200 Subject: [PATCH] new: osgEarthCesium ported to Cesium Native 0.52.1. --- src/osgEarthCesium/AssetAccessor | 5 +- src/osgEarthCesium/AssetAccessor.cpp | 6 +- src/osgEarthCesium/CesiumCreditsNode | 2 +- src/osgEarthCesium/CesiumCreditsNode.cpp | 132 +++++++++--------- src/osgEarthCesium/PrepareRenderResources | 2 +- src/osgEarthCesium/PrepareRenderResources.cpp | 8 +- 6 files changed, 79 insertions(+), 76 deletions(-) diff --git a/src/osgEarthCesium/AssetAccessor b/src/osgEarthCesium/AssetAccessor index e026b35050..d7da2b3caa 100644 --- a/src/osgEarthCesium/AssetAccessor +++ b/src/osgEarthCesium/AssetAccessor @@ -7,6 +7,7 @@ #include #include +#include #include #include @@ -24,7 +25,7 @@ namespace osgEarth { virtual const CesiumAsync::HttpHeaders& headers() const override; - virtual gsl::span data() const override; + virtual std::span data() const override; uint16_t _statusCode = 0; std::string _contentType; @@ -71,7 +72,7 @@ namespace osgEarth { const std::string& verb, const std::string& url, const std::vector& headers, - const gsl::span& contentPayload) override; + const std::span& contentPayload) override; virtual void tick() noexcept override; diff --git a/src/osgEarthCesium/AssetAccessor.cpp b/src/osgEarthCesium/AssetAccessor.cpp index 9aa341f370..ec16e86cb9 100644 --- a/src/osgEarthCesium/AssetAccessor.cpp +++ b/src/osgEarthCesium/AssetAccessor.cpp @@ -62,9 +62,9 @@ const CesiumAsync::HttpHeaders& AssetResponse::headers() const return _headers; } -gsl::span AssetResponse::data() const +std::span AssetResponse::data() const { - return gsl::span(_result.data(), _result.size()); + return std::span(_result.data(), _result.size()); } /**********************************************/ @@ -131,7 +131,7 @@ AssetAccessor::request( const std::string& verb, const std::string& url, const std::vector& headers, - const gsl::span& contentPayload) + const std::span& contentPayload) { auto request = std::make_shared(verb, url, headers); return asyncSystem.createFuture>( diff --git a/src/osgEarthCesium/CesiumCreditsNode b/src/osgEarthCesium/CesiumCreditsNode index c5c409a18d..f717749c92 100644 --- a/src/osgEarthCesium/CesiumCreditsNode +++ b/src/osgEarthCesium/CesiumCreditsNode @@ -26,7 +26,6 @@ namespace osgEarth { private: - void nextFrame(); void updateCredits(); osg::Texture2D* getOrCreateTexture(const std::string& url); @@ -34,6 +33,7 @@ namespace osgEarth { std::vector< std::string > _credits; + size_t _lastCreditsCount; osg::Camera* _camera; osg::observer_ptr< osg::View > _view; std::shared_ptr< CesiumUtility::CreditSystem > _creditSystem; diff --git a/src/osgEarthCesium/CesiumCreditsNode.cpp b/src/osgEarthCesium/CesiumCreditsNode.cpp index 11d41194ed..f0edf6473a 100644 --- a/src/osgEarthCesium/CesiumCreditsNode.cpp +++ b/src/osgEarthCesium/CesiumCreditsNode.cpp @@ -128,6 +128,7 @@ namespace } CesiumCreditsNode::CesiumCreditsNode(osg::View* view, CesiumUtility::CreditSystem* creditSystem) + : _lastCreditsCount(0) { setNumChildrenRequiringUpdateTraversal(1); @@ -147,84 +148,87 @@ CesiumCreditsNode::CesiumCreditsNode(osg::View* view, CesiumUtility::CreditSyste addChild(_camera); } -void CesiumCreditsNode::nextFrame() -{ - _creditSystem->startNextFrame(); -} - void CesiumCreditsNode::updateCredits() { std::vector< ParsedCredit > parsedCredits; auto creditSystem = _creditSystem; - auto credits = creditSystem->getCreditsToShowThisFrame(); - for (auto& credit : credits) - { - if (creditSystem->shouldBeShownOnScreen(credit)) - { - auto html = creditSystem->getHtml(credit); - parseCredit(html, parsedCredits); - } - } + auto credits = _creditSystem->getSnapshot(); - _camera->removeChildren(0, _camera->getNumChildren()); + auto creditsToShowThisFrame = credits.currentCredits; - osg::Geode* geode = new osg::Geode(); - _camera->addChild(geode); + auto updated = creditsToShowThisFrame.size() != _lastCreditsCount || credits.removedCredits.size() > 0; - float margin = 4.0f; - osg::Vec3 position(5, 5, 0); - for (unsigned int i = 0; i < parsedCredits.size(); ++i) - { - auto& c = parsedCredits[i]; - if (!c.text.empty()) - { - osgText::Text* text = new osgText::Text; - text->setFont(osgEarth::Registry::instance()->getDefaultFont()); - text->setPosition(position); - text->setText(c.text); - geode->addDrawable(text); - position.x() += (text->getBoundingBox().xMax() - text->getBoundingBox().xMin()) + margin; + if (updated) { + _lastCreditsCount = creditsToShowThisFrame.size(); + + for (auto& credit : creditsToShowThisFrame) { + if (creditSystem->shouldBeShownOnScreen(credit)) + { + auto html = creditSystem->getHtml(credit); + parseCredit(html, parsedCredits); + } } + _camera->removeChildren(0, _camera->getNumChildren()); + + osg::Geode* geode = new osg::Geode(); + _camera->addChild(geode); - if (!c.image.empty()) + float margin = 4.0f; + osg::Vec3 position(5, 5, 0); + for (unsigned int i = 0; i < parsedCredits.size(); ++i) { - osg::Texture2D* texture = getOrCreateTexture(c.image); - if (texture) + auto& c = parsedCredits[i]; + if (!c.text.empty()) { - osg::Geometry* geometry = new osg::Geometry; - osg::Vec3Array* verts = new osg::Vec3Array; - geometry->setVertexArray(verts); - verts->push_back(osg::Vec3(0, 0, 0)); - verts->push_back(osg::Vec3(texture->getImage()->s(), 0, 0)); - verts->push_back(osg::Vec3(texture->getImage()->s(), texture->getImage()->t(), 0)); - verts->push_back(osg::Vec3(0, texture->getImage()->t(), 0)); - - osg::Vec2Array* texCoords = new osg::Vec2Array; - geometry->setTexCoordArray(0, texCoords); - texCoords->push_back(osg::Vec2(0, 0)); - texCoords->push_back(osg::Vec2(1, 0)); - texCoords->push_back(osg::Vec2(1, 1)); - texCoords->push_back(osg::Vec2(0, 1)); - - osg::Vec4Array* colors = new osg::Vec4Array; - colors->push_back(osg::Vec4(1, 1, 1, 1)); - geometry->setColorArray(colors, osg::Array::BIND_OVERALL); - - geometry->getOrCreateStateSet()->setTextureAttributeAndModes(0, texture, osg::StateAttribute::ON); - osg::DrawElementsUByte* de = new osg::DrawElementsUByte(GL_TRIANGLES); - de->push_back(0); de->push_back(1); de->push_back(2); - de->push_back(0); de->push_back(2); de->push_back(3); - - geometry->addPrimitiveSet(de); - - osgEarth::Registry::shaderGenerator().run(geometry); - geode->addDrawable(geometry); - - position.x() += texture->getImage()->s() + margin; + osgText::Text* text = new osgText::Text; + text->setFont(osgEarth::Registry::instance()->getDefaultFont()); + text->setPosition(position); + text->setText(c.text); + geode->addDrawable(text); + position.x() += (text->getBoundingBox().xMax() - text->getBoundingBox().xMin()) + margin; + } + + if (!c.image.empty()) + { + osg::Texture2D* texture = getOrCreateTexture(c.image); + if (texture) + { + osg::Geometry* geometry = new osg::Geometry; + osg::Vec3Array* verts = new osg::Vec3Array; + geometry->setVertexArray(verts); + verts->push_back(osg::Vec3(0, 0, 0)); + verts->push_back(osg::Vec3(texture->getImage()->s(), 0, 0)); + verts->push_back(osg::Vec3(texture->getImage()->s(), texture->getImage()->t(), 0)); + verts->push_back(osg::Vec3(0, texture->getImage()->t(), 0)); + + osg::Vec2Array* texCoords = new osg::Vec2Array; + geometry->setTexCoordArray(0, texCoords); + texCoords->push_back(osg::Vec2(0, 0)); + texCoords->push_back(osg::Vec2(1, 0)); + texCoords->push_back(osg::Vec2(1, 1)); + texCoords->push_back(osg::Vec2(0, 1)); + + osg::Vec4Array* colors = new osg::Vec4Array; + colors->push_back(osg::Vec4(1, 1, 1, 1)); + geometry->setColorArray(colors, osg::Array::BIND_OVERALL); + + geometry->getOrCreateStateSet()->setTextureAttributeAndModes(0, texture, osg::StateAttribute::ON); + osg::DrawElementsUByte* de = new osg::DrawElementsUByte(GL_TRIANGLES); + de->push_back(0); de->push_back(1); de->push_back(2); + de->push_back(0); de->push_back(2); de->push_back(3); + + geometry->addPrimitiveSet(de); + + osgEarth::Registry::shaderGenerator().run(geometry); + geode->addDrawable(geometry); + + position.x() += texture->getImage()->s() + margin; + } } } } + } osg::Texture2D* CesiumCreditsNode::getOrCreateTexture(const std::string& url) @@ -254,8 +258,6 @@ void CesiumCreditsNode::traverse(osg::NodeVisitor& nv) { // Get the credits from the previous frame. updateCredits(); - // Tell Cesium to start collecting new credits - nextFrame(); auto vp = _view->getCamera()->getViewport(); if (vp) { diff --git a/src/osgEarthCesium/PrepareRenderResources b/src/osgEarthCesium/PrepareRenderResources index 31e5e0f0b9..b0708353dc 100644 --- a/src/osgEarthCesium/PrepareRenderResources +++ b/src/osgEarthCesium/PrepareRenderResources @@ -67,7 +67,7 @@ namespace osgEarth { void* pMainThreadResult) noexcept; virtual void* prepareRasterInLoadThread( - CesiumGltf::ImageCesium& image, + CesiumGltf::ImageAsset& image, const std::any& rendererOptions); virtual void* prepareRasterInMainThread( diff --git a/src/osgEarthCesium/PrepareRenderResources.cpp b/src/osgEarthCesium/PrepareRenderResources.cpp index eaeea9241d..f7547bc075 100644 --- a/src/osgEarthCesium/PrepareRenderResources.cpp +++ b/src/osgEarthCesium/PrepareRenderResources.cpp @@ -25,7 +25,7 @@ namespace const GLenum redFormat = GL_RED; #endif - osg::Image* getOsgImage(CesiumGltf::ImageCesium& image) + osg::Image* getOsgImage(CesiumGltf::ImageAsset& image) { GLenum format = GL_RGB; GLenum texFormat = GL_RGB8; @@ -386,9 +386,9 @@ namespace { } // Load the image - auto& image = _model->images[texture.source].cesium; + auto image = _model->images[texture.source].pAsset; - osg::Image* osgImage = getOsgImage(image); + osg::Image* osgImage = getOsgImage(*image); if (osgImage) { @@ -628,7 +628,7 @@ void PrepareRendererResources::free( } void* PrepareRendererResources::prepareRasterInLoadThread( - CesiumGltf::ImageCesium& image, + CesiumGltf::ImageAsset& image, const std::any& rendererOptions) { osg::Image* osgImage = getOsgImage(image);