#include "scene/OEScene.h" #include #include #include #include #include #include #include #include #include #include #include #include "common/SpdLogger.h" #include "common/RecourceHelper.h" #include "scene/ScopedTimer.h" #include "viewer/OsgView.h" 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/"); 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_); } } void OEScene::InitEventHandle(class OsgView* view) { if (nullptr == view) { LOG_WARN("view is nullptr"); return; } view->GetView()->addEventHandler(new osgEarth::Util::EarthManipulator()); view->GetView()->addEventHandler(new osgViewer::HelpHandler); } void OEScene::AttachView(OsgView* view) { if (nullptr == view) { LOG_WARN("view is nullptr"); return; } //osg::Node* node1 = osgDB::readNodeFile("chaff_bombs.osg"); //node1->getOrCreateStateSet()->setMode(GL_LIGHTING, osg::StateAttribute::OFF); //osg::MatrixTransform* mt = new osg::MatrixTransform; //mt->addChild(node1); ////GetOceanScene()->addChild(mt); //entityRoot_->addChild(mt); //osg::Vec3 eye(0.0f, 60.f, 50.0f); //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"); // } //} } void OEScene::DetachView(OsgView* view) { if (nullptr != earthRootNode_) { std::vector parents = earthRootNode_->getParents(); for (const auto& parent : parents) { parent->removeChild(earthRootNode_); } } view->GetView()->setSceneData(nullptr); } #define USE_CUSTOM_SHADER osg::ref_ptr OEScene::LoadCubeMapTextures(const std::string& dir) { enum { POS_X, NEG_X, POS_Y, NEG_Y, POS_Z, NEG_Z }; std::string filenames[6]; std::string basePath = RecourceHelper::Get().GetBasePath().toStdString(); filenames[POS_X] = basePath + "/resources/textures/" + dir + "/east.png"; filenames[NEG_X] = basePath + "/resources/textures/" + dir + "/west.png"; filenames[POS_Z] = basePath + "/resources/textures/" + dir + "/north.png"; filenames[NEG_Z] = basePath + "/resources/textures/" + dir + "/south.png"; filenames[POS_Y] = basePath + "/resources/textures/" + dir + "/down.png"; filenames[NEG_Y] = basePath + "/resources/textures/" + dir + "/up.png"; osg::ref_ptr cubeMap = new osg::TextureCubeMap; cubeMap->setInternalFormat(GL_RGBA); cubeMap->setFilter(osg::Texture::MIN_FILTER, osg::Texture::LINEAR_MIPMAP_LINEAR); cubeMap->setFilter(osg::Texture::MAG_FILTER, osg::Texture::LINEAR); cubeMap->setWrap(osg::Texture::WRAP_S, osg::Texture::CLAMP_TO_EDGE); cubeMap->setWrap(osg::Texture::WRAP_T, osg::Texture::CLAMP_TO_EDGE); cubeMap->setImage(osg::TextureCubeMap::NEGATIVE_X, osgDB::readImageFile(filenames[NEG_X])); cubeMap->setImage(osg::TextureCubeMap::POSITIVE_X, osgDB::readImageFile(filenames[POS_X])); cubeMap->setImage(osg::TextureCubeMap::NEGATIVE_Y, osgDB::readImageFile(filenames[NEG_Y])); cubeMap->setImage(osg::TextureCubeMap::POSITIVE_Y, osgDB::readImageFile(filenames[POS_Y])); cubeMap->setImage(osg::TextureCubeMap::NEGATIVE_Z, osgDB::readImageFile(filenames[NEG_Z])); cubeMap->setImage(osg::TextureCubeMap::POSITIVE_Z, osgDB::readImageFile(filenames[POS_Z])); return cubeMap; } osg::Group* OEScene::GetData() { return earthMapNode_; } void OEScene::AddToScene(osg::Node* node) { assert(nullptr != entityRoot_); entityRoot_->addChild(node); /* osgOcean::OceanScene* oceanScene = GetOceanScene(); if (nullptr == oceanScene) { LOG_WARN("oceanScene is nullptr"); return; } node->setNodeMask(oceanScene->getNormalSceneMask() | oceanScene->getReflectedSceneMask() | oceanScene->getRefractedSceneMask() | CAST_SHADOW | RECEIVE_SHADOW); oceanScene->addChild(node);*/ /* osg::Group* root = GetScene(); root->addChild(node);*/ }