add osg earth

This commit is contained in:
jiegeaiai 2024-12-28 00:51:30 +08:00
parent 7331f4f1fd
commit a89e078a1a
4 changed files with 78 additions and 30 deletions

View File

@ -23,21 +23,10 @@ OEScene::OEScene() {
osgDB::FilePathList& pathList = osgDB::Registry::instance()->getDataFilePathList();
const std::string& basePath = RecourceHelper::Get().GetBasePath().toStdString();
pathList.push_back(basePath + "/resources/earth/");
pathList.push_back(basePath + "resources/textures/");
pathList.push_back(basePath + "/resources/textures/");
earthRootNode_ = osgDB::readNodeFile("triton.earth");
if (!earthRootNode_) {
LOG_ERROR("read earth node(triton.earth) failed");
return;
}
earthMapNode_ = osgEarth::MapNode::get(earthRootNode_);
LOG_INFO("earth map node get success: {}", earthMapNode_.valid());
entityRoot_ = new osg::Group;
if (earthMapNode_) {
earthMapNode_->addChild(entityRoot_);
}
logarithmicDepthBuffer_ = std::make_unique<osgEarth::Util::LogarithmicDepthBuffer>();
}
@ -68,19 +57,66 @@ void OEScene::AttachView(OsgView* view) {
//mt->setMatrix(osg::Matrix::translate(eye)/* * osg::Matrix::scale(osg::Vec3(10, 10, 10))*/);
//////mt->getOrCreateStateSet()-
//osg::Node* node = view->GetView()->getSceneData();
//if (nullptr == node) {
// LOG_INFO("view scene data is nullptr, root valid:{}", scene_.valid());
// view->GetView()->setSceneData(scene_);
//} else {
// osg::Group* group = node->asGroup();
// if (nullptr != group) {
// LOG_INFO("node is group");
// group->addChild(scene_);
// } else {
// LOG_INFO("node is not group");
// }
//}
earthRootNode_ = osgDB::readNodeFile("triton.earth");
if (!earthRootNode_) {
LOG_ERROR("read earth node(triton.earth) failed");
return;
}
earthMapNode_ = osgEarth::MapNode::get(earthRootNode_);
LOG_INFO("earth map node get success: {}", earthMapNode_.valid());
entityRoot_ = new osg::Group;
if (earthMapNode_) {
earthMapNode_->addChild(entityRoot_);
}
skyDome_ = osgEarth::SkyNode::create();
if (!earthMapNode_) {
LOG_WARN("eart map node is nullptr");
return;
}
skyDome_->addChild(earthMapNode_);
osg::Node* node = view->GetView()->getSceneData();
if (nullptr == node) {
LOG_INFO("view scene data is nullptr, root valid:{}", skyDome_.valid());
view->GetView()->setSceneData(earthRootNode_);
} else {
osg::Group* group = node->asGroup();
if (nullptr != group) {
LOG_INFO("node is group");
group->addChild(skyDome_);
} else {
LOG_INFO("node is not group");
}
}
//osg::Group* parent = earthMapNode_->getParent(0);
/*osg::Group* parent = earthMapNode_->getParent(0);
if (nullptr == parent) {
skyDome_->addChild(earthMapNode_);
parent->addChild(skyDome_);
parent->removeChild(earthMapNode_);
} else {
}*/
/* skyDome_->attach(view->GetView());
skyDome_->setAtmosphereVisible(true);
skyDome_->setSunVisible(true);
skyDome_->setMoonVisible(true);
skyDome_->setStarsVisible(true);
skyDome_->setDateTime(osgEarth::DateTime(2024, 12, 24, 12));
skyDome_->setSimulationTimeTracksDateTime(true);*/
logarithmicDepthBuffer_->install(view->GetView()->getCamera());
//view->GetView()->setRealizeOperation(new osgEarth::GL3RealizeOperation());
}
void OEScene::DetachView(OsgView* view) {
@ -90,7 +126,9 @@ void OEScene::DetachView(OsgView* view) {
parent->removeChild(earthRootNode_);
}
}
logarithmicDepthBuffer_->uninstall(view->GetView()->getCamera());
view->GetView()->setSceneData(nullptr);
}
#define USE_CUSTOM_SHADER

View File

@ -5,8 +5,10 @@
#include <osgText/Text>
#include <osgEarth/ModelNode>
#include <osgEarth/Sky>
#include <osgEarth/LogarithmicDepthBuffer>
#include "scene/SkyDome.h"
//#include "scene/SkyDome.h"
class OsgView;
@ -36,4 +38,6 @@ private:
osg::ref_ptr<osg::Node> earthRootNode_;
osg::ref_ptr<osgEarth::MapNode> earthMapNode_;
osg::ref_ptr<osg::Group> entityRoot_;
osg::ref_ptr<osgEarth::SkyNode> skyDome_;
std::unique_ptr<osgEarth::Util::LogarithmicDepthBuffer> logarithmicDepthBuffer_;
};

View File

@ -4,6 +4,7 @@
#include <QApplication>
#include <osg/BlendFunc>
#include <osgEarth/GLUtils>
#include "common/SpdLogger.h"
#include "viewer/OsgView.h"
@ -55,6 +56,7 @@ OsgView* OsgViewer::CreateView(int x, int y, int width, int height, void* winHan
view->InitGraphiceWindow(x, y, width, height, reinterpret_cast<WId>(winHandle), "dytView");
OnAddView(view, x, y, width, height);
//compositeViewer_->setRealizeOperation(new osgEarth::GL3RealizeOperation());
return view;
}
@ -81,7 +83,11 @@ OsgView* OsgViewer::GetView() const {
}
bool OsgViewer::Initialize(void) {
if (initalized_) {
return initalized_;
}
initalized_ = true;
compositeViewer_->setRealizeOperation(new osgEarth::GL3RealizeOperation());
return initalized_;
}

View File

@ -59,9 +59,9 @@ bool WorkSpace::CreateScene(const std::string& scene) {
activeScene_->InitEventHandle(view_);
#else
activeScene_ = new OEScene;
activeScene_->UseShadows(false);
//activeScene_->UseShadows(false);
activeScene_->ChangeScene(OsgScene::CLOUDY);
//activeScene_->ChangeScene(OsgScene::CLOUDY);
activeScene_->AttachView(view_);
activeScene_->InitEventHandle(view_);