modiyf osg renderer

This commit is contained in:
jiegeaiai 2025-02-22 23:16:54 +08:00
parent 1eb2e44f26
commit a4969a8aba
20 changed files with 731 additions and 991 deletions

View File

@ -10,7 +10,7 @@
a、保留窗口2的Report Table (解决) a、保留窗口2的Report Table (解决)
b、窗口2中的Report Table, 可以拖动变成dock模式添加到其他的窗口中 b、窗口2中的Report Table, 可以拖动变成dock模式添加到其他的窗口中
c、有缩放属性的控件鼠标都显示为双箭头 (解决) c、有缩放属性的控件鼠标都显示为双箭头 (解决)
d、所有的窗口表头可以采用拖动的形式调整列的位置 d、所有的窗口表头可以采用拖动的形式调整列的位置 (解决)
4.需要连续用到的操作、功能类似的放到一个大界面。这些不知道具体怎么分就需要讨论细分一下比如: 4.需要连续用到的操作、功能类似的放到一个大界面。这些不知道具体怎么分就需要讨论细分一下比如:
功能控制一样的窗口管理和ui设置都是控制界面的放到同一个栏目 功能控制一样的窗口管理和ui设置都是控制界面的放到同一个栏目

View File

@ -1,5 +1,5 @@
#include "effects/ConeWave.h" #include "effects/ConeWave.h"
/*
#include <osg/BlendFunc> #include <osg/BlendFunc>
#include <osg/Material> #include <osg/Material>
#include <osg/Texture2D> #include <osg/Texture2D>
@ -13,6 +13,43 @@
#include <osg/Depth> #include <osg/Depth>
#include <osgEarth/Registry> #include <osgEarth/Registry>
class WaveSurfaceCallback : public osg::NodeCallback {
public:
WaveSurfaceCallback() : timeElapsed(0.0f) {}
virtual void operator()(osg::Node* node, osg::NodeVisitor* nv) {
timeElapsed += (nv->getFrameStamp()->getSimulationTime() - SimulationTime);
// 获取并更新geometry的顶点
osg::Geode* geode = dynamic_cast<osg::Geode*>(node);
if (geode) {
osg::Geometry* geometry = dynamic_cast<osg::Geometry*>(geode->getDrawable(0));
if (geometry) {
osg::Vec3Array* vertices = dynamic_cast<osg::Vec3Array*>(geometry->getVertexArray());
if (vertices) {
// 更新顶点位置来模拟波动
float amplitude = 2.0f;
float frequency = 1.0f;
for (unsigned int i = 0; i < vertices->size(); ++i) {
osg::Vec3f& vertex = (*vertices)[i];
vertex.z() = amplitude * sin(frequency * (vertex.x() + timeElapsed));
}
geometry->setVertexArray(vertices);
geometry->dirtyBound(); // 更新几何体边界
}
}
}
// 继续遍历场景图
traverse(node, nv);
SimulationTime = nv->getFrameStamp()->getSimulationTime();
}
private:
float timeElapsed;
double SimulationTime;
};
ConeWave::ConeWave() { ConeWave::ConeWave() {
osgEarth::Registry::shaderGenerator().run(this); osgEarth::Registry::shaderGenerator().run(this);
@ -44,7 +81,7 @@ void ConeWave::SetHeight(float height) {
if (cone_) { if (cone_) {
cone_->setHeight(height_); cone_->setHeight(height_);
} }
coneDrawable_->build(); // coneDrawable_->build();
} }
void ConeWave::SetRadius(float radius) { void ConeWave::SetRadius(float radius) {
@ -52,7 +89,7 @@ void ConeWave::SetRadius(float radius) {
if (cone_) { if (cone_) {
cone_->setRadius(radius); cone_->setRadius(radius);
} }
coneDrawable_->build(); // coneDrawable_->build();
} }
void ConeWave::SetBaseColor(const osg::Vec4& color) { void ConeWave::SetBaseColor(const osg::Vec4& color) {
@ -77,20 +114,66 @@ void ConeWave::SetLevelHeight(float height) {
} }
void ConeWave::CreateTexturedCone(osg::Geode* geode) { void ConeWave::CreateTexturedCone(osg::Geode* geode) {
cone_ = new osg::Cone(osg::Vec3(0, 0, 0.), radius_, height_); // cone_ = new osg::Cone(osg::Vec3(0, 0, 0.), radius_, height_);
osg::TessellationHints* tesselate = new osg::TessellationHints; // osg::TessellationHints* tesselate = new osg::TessellationHints;
tesselate->setCreateBottom(false); // tesselate->setCreateBottom(false);
tesselate->setCreateBackFace(false); // tesselate->setCreateBackFace(false);
coneDrawable_ = new osg::ShapeDrawable(cone_, tesselate); // coneDrawable_ = new osg::ShapeDrawable(cone_, tesselate);
geode->addDrawable(coneDrawable_); // geode->addDrawable(coneDrawable_);
//coneDrawable_->setColor(baseColor_); // coneDrawable_->setColor(baseColor_);
//osg::StateSet* ss = coneDrawable_->getOrCreateStateSet(); // osg::StateSet* ss = coneDrawable_->getOrCreateStateSet();
////stateset->setRenderBinDetails(120, "OSGEARTH_SCREEN_SPACE_LAYOUT_BIN"); // //stateset->setRenderBinDetails(120, "OSGEARTH_SCREEN_SPACE_LAYOUT_BIN");
//ss->setRenderBinDetails(120, "RenderBin"); // ss->setRenderBinDetails(120, "RenderBin");
//osg::ref_ptr<osg::BlendFunc> bf = new osg::BlendFunc(); // osg::ref_ptr<osg::BlendFunc> bf = new osg::BlendFunc();
//ss->setAttributeAndModes(bf, osg::StateAttribute::ON); // ss->setAttributeAndModes(bf, osg::StateAttribute::ON);
//ss->setMode(GL_CULL_FACE, osg::StateAttribute::ON); // ss->setMode(GL_CULL_FACE, osg::StateAttribute::ON);
//return;
osg::ref_ptr<osg::Geometry> geometry = new osg::Geometry();
// 创建顶点数组
osg::ref_ptr<osg::Vec3Array> vertices = new osg::Vec3Array;
int rows = 20, cols=20;
for (unsigned int i = 0; i < rows; ++i) {
for (unsigned int j = 0; j < cols; ++j) {
// 坐标
float x = (float)i / (rows - 1) * 100;
float y = (float)j / (cols - 1) * 100;
vertices->push_back(osg::Vec3f(x, y, 0.0f));
}
}
geometry->setVertexArray(vertices);
// 生成索引来连接顶点
osg::ref_ptr<osg::DrawElementsUShort> indices = new osg::DrawElementsUShort(osg::PrimitiveSet::QUADS);
for (unsigned int i = 0; i < rows - 1; ++i) {
for (unsigned int j = 0; j < cols - 1; ++j) {
unsigned short bottomLeft = i * cols + j;
unsigned short bottomRight = bottomLeft + 1;
unsigned short topLeft = (i + 1) * cols + j;
unsigned short topRight = topLeft + 1;
indices->push_back(bottomLeft);
indices->push_back(bottomRight);
indices->push_back(topRight);
indices->push_back(topLeft);
}
}
geometry->addPrimitiveSet(indices);
// 创建表面颜色
osg::ref_ptr<osg::Vec4Array> colors = new osg::Vec4Array;
colors->push_back(osg::Vec4(0.0f, 0.0f, 1.0f, 1.0f)); // 蓝色
geometry->setColorArray(colors);
geometry->setColorBinding(osg::Geometry::BIND_OVERALL);
// 添加geometry到geode
geode->addDrawable(geometry);
geode->setUpdateCallback(new WaveSurfaceCallback());
return;
static const char* vertSource = { static const char* vertSource = {
"#version 330\n" "#version 330\n"
@ -132,27 +215,309 @@ void ConeWave::CreateTexturedCone(osg::Geode* geode) {
fragmentShader->setShaderSource(fragSource); fragmentShader->setShaderSource(fragSource);
osg::StateSet* stateset = coneDrawable_->getOrCreateStateSet(); osg::StateSet* stateset = coneDrawable_->getOrCreateStateSet();
//stateset->setRenderBinDetails(120, "OSGEARTH_SCREEN_SPACE_LAYOUT_BIN"); // osg::ref_ptr<osg::Material> mat = new osg::Material;
stateset->setRenderBinDetails(120, "RenderBin"); // //设置正面散射颜色
osg::ref_ptr<osg::BlendFunc> blendFunc = new osg::BlendFunc(); // mat->setDiffuse(osg::Material::FRONT, osg::Vec4(1.0, 0.0, 0.0, 0.3));//1.0, 0.0, 0.0, 0.3
stateset->setAttributeAndModes(blendFunc, osg::StateAttribute::ON); // //设置正面镜面颜色
osg::ref_ptr<osg::Program> program = new osg::Program(); // mat->setSpecular(osg::Material::FRONT, osg::Vec4(1.0, 0.0, 0.0, 0.3));//1.0, 0.0, 0.0, 0.3
program->addShader(vertexShader); //
program->addShader(fragmentShader); // geode->getOrCreateStateSet()->setAttribute(mat);
//VirtualProgram* vp = VirtualProgram::getOrCreate(outlineSS); stateset->setMode(GL_BLEND, osg::StateAttribute::ON);
//vp->setFunction("VS", VS, ShaderComp::LOCATION_VERTEX_CLIP); stateset->setMode(GL_RESCALE_NORMAL, osg::StateAttribute::ON);
//vp->setFunction("FS", FS, ShaderComp::LOCATION_FRAGMENT_COLORING); // stateset->setMode(GL_DEPTH_TEST, osg::StateAttribute::ON);
//outline->addChild(node); stateset->setMode(GL_LIGHTING, osg::StateAttribute::OFF);
baseColorUniform_ = new osg::Uniform("baseColor", baseColor_); //设置渲染顺序 仿真模型被波束遮盖 ,1000000-指的是若有1000000个Node 则此节点最后一个被渲染
stateset->setMode(GL_CULL_FACE, osg::StateAttribute::ON); // //stateset->setRenderBinDetails(120, "OSGEARTH_SCREEN_SPACE_LAYOUT_BIN");
stateset->addUniform(baseColorUniform_); stateset->setRenderBinDetails(10, "RenderBin");
stateset->setAttributeAndModes(program, osg::StateAttribute::ON); // osg::ref_ptr<osg::BlendFunc> blendFunc = new osg::BlendFunc();
stateset->setAttributeAndModes(new osg::Depth(osg::Depth::LESS, 0.0, 1.0, false)); // stateset->setAttributeAndModes(blendFunc, osg::StateAttribute::ON);
// osg::ref_ptr<osg::Program> program = new osg::Program();
// program->addShader(vertexShader);
// program->addShader(fragmentShader);
//
// baseColorUniform_ = new osg::Uniform("baseColor", baseColor_);
// stateset->setMode(GL_CULL_FACE, osg::StateAttribute::ON);
// stateset->addUniform(baseColorUniform_);
// // stateset->setAttributeAndModes(program, osg::StateAttribute::ON);
// // stateset->setAttributeAndModes(new osg::Depth(osg::Depth::LESS, 0.0, 1.0, false));
//
// levelCountUniform_ = new osg::Uniform("num", float(levelCount_));
// levelHeightUniform_ = new osg::Uniform("height", levelHeight_);
levelCountUniform_ = new osg::Uniform("num", float(levelCount_)); // stateset->addUniform(levelCountUniform_);
levelHeightUniform_ = new osg::Uniform("height", levelHeight_); // stateset->addUniform(levelHeightUniform_.get());
stateset->addUniform(levelCountUniform_);
stateset->addUniform(levelHeightUniform_.get());
} }
*/
#include <osg/Geode>
#include <osg/Geometry>
#include <osg/Material>
#include <osgFX/Outline>
#include <osgFX/Scribe>
#include <osg/MatrixTransform>
#include <osgEarth/Ellipsoid>
#include "scene/SceneContent.h"
class WaveBeamConeCallBack : public osg::NodeCallback {
public:
WaveBeamConeCallBack();
~WaveBeamConeCallBack();
virtual void operator() (osg::Node *node, osg::NodeVisitor *nv);
public:
double m_latitude;
double m_longitude;
double m_height;
bool m_ifDynamic;
double m_angle;
double m_length;
osg::Vec4 m_color;
osg::Vec4 m_lineColor;
double m_lineWidth;
osg::ref_ptr<osg::Geode> m_geode;
osg::ref_ptr<osg::Geometry> m_geom;
osg::ref_ptr<osg::Vec4Array> m_colorArray;
osg::ref_ptr<osg::Vec3Array> m_pointVector;
osg::ref_ptr<osgFX::Scribe> m_nodeFX;
};
WaveBeamConeCallBack::WaveBeamConeCallBack() {
m_latitude = 0.0;
m_longitude = 0.0;
m_height = -6371000;
m_ifDynamic = false;
m_angle = 20.0;
m_length = 100000;
m_color = osg::Vec4(1, 0, 0, 0.5);
m_lineColor = osg::Vec4(1.0, 0.0, 0.0, 1.0);
m_lineWidth = 1.0;
}
WaveBeamConeCallBack::~WaveBeamConeCallBack() {
}
void WaveBeamConeCallBack::operator()(osg::Node *node, osg::NodeVisitor *nv) {
if (m_ifDynamic == false)
return;
//std::cout << "WaveBeamConeCallBack info=" << m_latitude << "," << m_longitude << "," << m_height << std::endl;
osg::MatrixTransform* mtCone = dynamic_cast<osg::MatrixTransform*>(node);
if (mtCone != NULL) {
osg::MatrixTransform* mtR = dynamic_cast<osg::MatrixTransform*>(mtCone->getParent(0));
osg::MatrixTransform* mt = dynamic_cast<osg::MatrixTransform*>(mtR->getParent(0));
//osg::Matrix m = osg::computeWorldToLocal(mtCone->getParentalNodePaths().at(0));
osg::Matrix m = osg::Matrix::inverse(mt->getMatrix()*mtR->getMatrix());
osg::Matrix mTarget;
double x, y, z;
osg::EllipsoidModel em;
em.convertLatLongHeightToXYZ(osg::DegreesToRadians(m_latitude),
osg::DegreesToRadians(m_longitude),
m_height, x, y, z);
mTarget.setTrans(x, y, z);
osg::Matrix mConeRate = osg::Matrix::rotate(osg::Vec3d(0, 1, 0), (mTarget*m).getTrans());
mtCone->setMatrix(mConeRate);//mTarget*m
//更改cone的形状----------------------------------------
double length = (mTarget*m).getTrans().length();
double angle = osg::DegreesToRadians(m_angle);
double radius = std::tan(angle*0.5) * length;
int splitCount = 20;
double angleStep = osg::PI * 2.0 / splitCount;
//侧面
for (int i = 1; i <= splitCount + 1; i++) {
double tempAngle = (i - 1)*angleStep;
osg::Vec3 pos(radius * cos(tempAngle), length, radius * sin(tempAngle) + 3);
m_pointVector->at(i) = pos;
}
m_pointVector->at(splitCount + 2) = osg::Vec3(0, length, 0);
//底面
for (int i = splitCount + 3; i <= splitCount + 3 + splitCount; i++) {
double tempAngle = (i - splitCount - 3) *angleStep;
osg::Vec3 pos(radius * cos(tempAngle), length, radius * sin(tempAngle) + 3);
m_pointVector->at(i) = pos;
}
m_geom->dirtyBound();
m_geom->dirtyDisplayList();
}
}
ConeWave::ConeWave() {
}
ConeWave::~ConeWave() {
}
void ConeWave::clearSelf() {
}
void ConeWave::Render(double dt)
{
}
void ConeWave::createWaveBeamCone(osg::MatrixTransform* node, double angle, double length,
osg::Vec4 color, osg::Vec4 lineColor, double lineWidth) {
double angleD = osg::DegreesToRadians(angle);
double radius = std::tan(angleD*0.5) * length;
int splitCount = 20;
double angleStep = osg::PI * 2.0 / splitCount;
osg::ref_ptr<osg::Geode> geode = new osg::Geode();
osg::ref_ptr<osg::Geometry> geom = new osg::Geometry;
osg::ref_ptr<osg::Vec3Array> vertex = new osg::Vec3Array;
osg::ref_ptr<osg::Vec3Array> normal = new osg::Vec3Array;
osg::ref_ptr<osg::DrawElementsUInt> drawElemUInt = new osg::DrawElementsUInt(GL_TRIANGLE_FAN);
osg::ref_ptr<osg::DrawElementsUInt> drawElemUInt2 = new osg::DrawElementsUInt(GL_TRIANGLE_FAN);
geom->setVertexArray(vertex);
geom->setNormalArray(normal);
geode->addDrawable(geom);
vertex->push_back(osg::Vec3(0, 0, 0));
drawElemUInt->push_back(0);
normal->push_back(osg::Vec3(0, -1, 0));
//侧面
for (int i = 0; i <= splitCount; i++) {
double tempAngle = i*angleStep;
osg::Vec3 pos(radius * cos(tempAngle), length, radius * sin(tempAngle) + 3);
vertex->push_back(osg::Vec3(pos));
pos.normalize();
normal->push_back(pos);
drawElemUInt->push_back(i + 1);
}
//底面
int indexBegin = vertex->size();
vertex->push_back(osg::Vec3(0, length, 0));
drawElemUInt2->push_back(indexBegin);
normal->push_back(osg::Vec3(0, 1, 0));
for (int i = 0; i <= splitCount; i++) {
double tempAngle = i*angleStep;
osg::Vec3 pos(radius * cos(tempAngle), length, radius * sin(tempAngle) + 3);
vertex->push_back(osg::Vec3(pos));
normal->push_back(osg::Vec3(0, 1, 0));
drawElemUInt2->push_back(indexBegin + i + 1);
}
geom->setNormalBinding(osg::Geometry::BIND_PER_VERTEX);
geom->addPrimitiveSet(drawElemUInt);
geom->addPrimitiveSet(drawElemUInt2);
//创建材质对象
osg::ref_ptr<osg::Material> mat = new osg::Material;
//设置正面散射颜色
mat->setDiffuse(osg::Material::FRONT, osg::Vec4(1.0, 1.0, 0.0, 0.3));//1.0, 0.0, 0.0, 0.3
//设置正面镜面颜色
mat->setSpecular(osg::Material::FRONT, osg::Vec4(1.0, 0.0, 0.0, 0.3));//1.0, 0.0, 0.0, 0.3
geode->getOrCreateStateSet()->setAttribute(mat.get());
geode->getOrCreateStateSet()->setMode(GL_RESCALE_NORMAL, osg::StateAttribute::ON);
//设置透明效果
geode->getOrCreateStateSet()->setMode(GL_BLEND, osg::StateAttribute::ON);
geode->getOrCreateStateSet()->setMode(GL_DEPTH_TEST, osg::StateAttribute::ON);
geode->getOrCreateStateSet()->setMode(GL_LIGHTING, osg::StateAttribute::OFF);
//设置渲染顺序 仿真模型被波束遮盖 ,1000000-指的是若有1000000个Node 则此节点最后一个被渲染
geode->getOrCreateStateSet()->setRenderBinDetails(12, "RenderBin");
osg::ref_ptr<osg::MatrixTransform> mtCone = new osg::MatrixTransform;
// mtCone->addChild(nodeFX);
//给callback中赋值
WaveBeamConeCallBack* coneCallBack = new WaveBeamConeCallBack;
coneCallBack->m_angle = angle;
coneCallBack->m_length = length;
coneCallBack->m_color = color;
coneCallBack->m_lineColor = lineColor;
coneCallBack->m_lineWidth = lineWidth;
coneCallBack->m_geode = geode;
coneCallBack->m_geom = geom;
coneCallBack->m_pointVector = vertex;
//添加到模型中
// osg::MatrixTransform* mtR = dynamic_cast<osg::MatrixTransform*>(node->getChild(0));
// osg::MatrixTransform* mtS = dynamic_cast<osg::MatrixTransform*>(mtR->getChild(0));
// mtR->addChild(mtCone);
_waveBeamCone = mtCone;
}
void ConeWave::changeWaveBeamConeTarget(double latitude, double longitude, double height, bool ifDynamic) {
WaveBeamConeCallBack* coneCallBack = dynamic_cast<WaveBeamConeCallBack*>(_waveBeamCone->getUpdateCallback());
if (coneCallBack != NULL) {
coneCallBack->m_ifDynamic = ifDynamic;
coneCallBack->m_latitude = latitude;
coneCallBack->m_longitude = longitude;
coneCallBack->m_height = height;
if (ifDynamic == false) {
osg::MatrixTransform* mtCone = _waveBeamCone;
osg::MatrixTransform* mtR = dynamic_cast<osg::MatrixTransform*>(mtCone->getParent(0));
osg::MatrixTransform* mt = dynamic_cast<osg::MatrixTransform*>(mtR->getParent(0));
//osg::Matrix m = osg::computeWorldToLocal(mtCone->getParentalNodePaths().at(0));
osg::Matrix m = osg::Matrix::inverse(mt->getMatrix()*mtR->getMatrix());
osg::Matrix mTarget;
double x, y, z;
osg::EllipsoidModel em;
em.convertLatLongHeightToXYZ(osg::DegreesToRadians(latitude),
osg::DegreesToRadians(longitude),
height, x, y, z);
mTarget.setTrans(x, y, z);
osg::Matrix mConeRate = osg::Matrix::rotate(osg::Vec3d(0, 1, 0), (mTarget*m).getTrans());
mtCone->setMatrix(mConeRate);
}
}
}
void ConeWave::changeWaveBeamConeAppearance( osg::Vec4 color, osg::Vec4 lineColor, double lineWidth) {
WaveBeamConeCallBack* coneCallBack = dynamic_cast<WaveBeamConeCallBack*>(_waveBeamCone->getUpdateCallback());
if (coneCallBack != NULL) {
coneCallBack->m_color = color;
coneCallBack->m_lineColor = lineColor;
coneCallBack->m_lineWidth = lineWidth;
//创建材质对象
osg::ref_ptr<osg::Material> mat = new osg::Material;
//设置正面散射颜色
mat->setDiffuse(osg::Material::FRONT, color);//1.0, 0.0, 0.0, 0.3
//设置正面镜面颜色
mat->setSpecular(osg::Material::FRONT, color);//1.0, 0.0, 0.0, 0.3
coneCallBack->m_geode->getOrCreateStateSet()->setAttribute(mat.get());
if (lineWidth < 0.1) {
_waveBeamCone->addChild(coneCallBack->m_geode);
_waveBeamCone->removeChild(coneCallBack->m_nodeFX);
} else {
_waveBeamCone->removeChild(coneCallBack->m_geode);
_waveBeamCone->addChild(coneCallBack->m_nodeFX);
coneCallBack->m_nodeFX->setWireframeColor(lineColor);
coneCallBack->m_nodeFX->setWireframeLineWidth(lineWidth);
}
}
}

View File

@ -1,5 +1,5 @@
#pragma once #pragma once
/*
#include <osg/Matrix> #include <osg/Matrix>
#include <osg/Array> #include <osg/Array>
#include <osg/Geometry> #include <osg/Geometry>
@ -62,3 +62,36 @@ private:
float radius_{ 10.0f }; float radius_{ 10.0f };
}; };
*/
#pragma once
#include <osg/Node>
#include <osg/Geode>
#include <osg/MatrixTransform>
#include "viewer/UpdateRenderStd.h"
//三维实体的圆锥波束
class ConeWave : public osg::Geode
, public UpdateRenderStd {
public:
ConeWave();
~ConeWave();
void clearSelf() ;
void Render(double dt) override;
void createWaveBeamCone(osg::MatrixTransform* node,double angle, double length, osg::Vec4 color, osg::Vec4 lineColor, double lineWidth);
void changeWaveBeamConeTarget(/*osg::MatrixTransform* mt,*/ double latitude, double longitude, double height, bool ifDynamic);
void changeWaveBeamConeAppearance(osg::Vec4 color, osg::Vec4 lineColor, double lineWidth);
osg::ref_ptr<osg::MatrixTransform> getWaveBeamCone() {
return _waveBeamCone;
}
private:
osg::ref_ptr<osg::MatrixTransform> _waveBeamCone;
};

View File

@ -13,8 +13,8 @@
ConeWaveComponent::ConeWaveComponent(SceneComponent* parent) ConeWaveComponent::ConeWaveComponent(SceneComponent* parent)
: SceneComponent(parent) { : SceneComponent(parent) {
coneWave_ = new ConeWave(); // coneWave_ = new ConeWave();
coneWave_->InitGeode(); // coneWave_->InitGeode();
colorMap_[1] = osg::Vec4(1.0f, 1.0f, 1.0f, 1.0f); colorMap_[1] = osg::Vec4(1.0f, 1.0f, 1.0f, 1.0f);
colorMap_[2] = osg::Vec4(1.0f, 1.0f, 1.0f, 1.0f); colorMap_[2] = osg::Vec4(1.0f, 1.0f, 1.0f, 1.0f);
@ -22,7 +22,7 @@ ConeWaveComponent::ConeWaveComponent(SceneComponent* parent)
} }
ConeWaveComponent::~ConeWaveComponent() { ConeWaveComponent::~ConeWaveComponent() {
coneWave_->Destory(); // coneWave_->Destory();
} }
std::string ConeWaveComponent::GetTypeName() { std::string ConeWaveComponent::GetTypeName() {
@ -84,46 +84,48 @@ void ConeWaveComponent::Update(double dt) {
} }
void ConeWaveComponent::SetHeight(float height) { void ConeWaveComponent::SetHeight(float height) {
coneWave_->SetHeight(height); // coneWave_->SetHeight(height);
if (nullptr != mt_) { // if (nullptr != mt_) {
mt_->setMatrix(osg::Matrix::translate(osg::Vec3(0.0f, 0.0f, -coneWave_->GetHeght() * 0.75f))); // mt_->setMatrix(osg::Matrix::translate(osg::Vec3(0.0f, 0.0f, -coneWave_->GetHeght() * 0.75f)));
} // }
} }
float ConeWaveComponent::GetHeight() const { float ConeWaveComponent::GetHeight() const {
return coneWave_->GetHeght(); return 0;// coneWave_->GetHeght();
} }
void ConeWaveComponent::SetRadius(float radius) { void ConeWaveComponent::SetRadius(float radius) {
coneWave_->SetRadius(radius); // coneWave_->SetRadius(radius);
} }
float ConeWaveComponent::GetRadius() const { float ConeWaveComponent::GetRadius() const {
return coneWave_->GetRadius(); return 0;// return coneWave_->GetRadius();
} }
void ConeWaveComponent::SetLevelCount(int count) { void ConeWaveComponent::SetLevelCount(int count) {
coneWave_->SetLevelCount(count); // coneWave_->SetLevelCount(count);
} }
float ConeWaveComponent::GetLevelCount() const { float ConeWaveComponent::GetLevelCount() const {
return coneWave_->GetLevelCount(); return 0; // return coneWave_->GetLevelCount();
} }
void ConeWaveComponent::SetLevelHeight(float height) { void ConeWaveComponent::SetLevelHeight(float height) {
coneWave_->SetLevelHeight(height); // coneWave_->SetLevelHeight(height);
} }
float ConeWaveComponent::GetLevelHeight() const { float ConeWaveComponent::GetLevelHeight() const {
return coneWave_->GetLevelHeihgt(); // return coneWave_->GetLevelHeihgt();
return 0.0f;
} }
void ConeWaveComponent::SetBaseColor(const osg::Vec4& color) { void ConeWaveComponent::SetBaseColor(const osg::Vec4& color) {
coneWave_->SetBaseColor(color); // coneWave_->SetBaseColor(color);
} }
const osg::Vec4 ConeWaveComponent::GetBaseColor() const { const osg::Vec4 ConeWaveComponent::GetBaseColor() const {
return coneWave_->GetBaseColor(); // return coneWave_->GetBaseColor();
return osg::Vec4();
} }
void ConeWaveComponent::SetColor1(const osg::Vec4& color) { void ConeWaveComponent::SetColor1(const osg::Vec4& color) {
@ -170,7 +172,7 @@ void ConeWaveComponent::AddToRender() {
void ConeWaveComponent::Initialize() { void ConeWaveComponent::Initialize() {
mt_ = new osg::MatrixTransform; mt_ = new osg::MatrixTransform;
mt_->addChild(coneWave_); mt_->addChild(coneWave_);
mt_->setMatrix(osg::Matrix::translate(osg::Vec3(0.0f, 0.0f, -coneWave_->GetHeght() * 0.75f))); // mt_->setMatrix(osg::Matrix::translate(osg::Vec3(0.0f, 0.0f, -coneWave_->GetHeght() * 0.75f)));
} }
void ConeWaveComponent::UpdateEvent() { void ConeWaveComponent::UpdateEvent() {
@ -198,7 +200,7 @@ void ConeWaveComponent::UpdateEvent() {
} }
osg::Vec4& color = colorMap_[currentStatus_]; osg::Vec4& color = colorMap_[currentStatus_];
coneWave_->SetBaseColor(color); // coneWave_->SetBaseColor(color);
coneWave_->setNodeMask(0xff); coneWave_->setNodeMask(0xff);

View File

@ -21,6 +21,8 @@
#include "viewer/OsgCameraManipulator.h" #include "viewer/OsgCameraManipulator.h"
#include "scene/ScaleBarHandler.h" #include "scene/ScaleBarHandler.h"
#include "effects/ConeWave.h"
const osgEarth::SpatialReference* g_srs_{ nullptr }; const osgEarth::SpatialReference* g_srs_{ nullptr };
@ -93,6 +95,17 @@ void OEScene::AttachView(OsgView* view) {
logarithmicDepthBuffer_->install(view->GetView()->getCamera()); logarithmicDepthBuffer_->install(view->GetView()->getCamera());
ConeWave* coneWave = new ConeWave;
osgEarth::GeoTransform *geo = new osgEarth::GeoTransform;
entityRoot_->addChild(geo);
osgEarth::GeoPoint pos(g_srs_, 120.000000,25.000000,600.000000);
geo->setPosition(pos);
coneWave->createWaveBeamCone(geo, 45, 6000, osg::Vec4(1.0, 0.0, 0.0, 0.3),
osg::Vec4(1.0, 1.0, 0.0, 0.3), 30);
osg::MatrixTransform* mt =coneWave->getWaveBeamCone();
geo->addChild(mt);
} }
void OEScene::DetachView(OsgView* view) { void OEScene::DetachView(OsgView* view) {

View File

@ -28,9 +28,9 @@ void OESceneUI::InitUI(OsgViewUI* ui) {
} }
compositeWidgetManager_ = new CompositeWidgetManager(); compositeWidgetManager_ = new CompositeWidgetManager();
//compositeWidgetManager_->AttachViewUI(ui); compositeWidgetManager_->AttachViewUI(ui);
zoomManager_ = new ZoomManager(); zoomManager_ = new ZoomManager();
//zoomManager_->AttachViewUI(ui); zoomManager_->AttachViewUI(ui);
queryElevationWidget_ = new QueryElevationWidget(oeScene_); queryElevationWidget_ = new QueryElevationWidget(oeScene_);
queryElevationWidget_->AttachViewUI(ui); queryElevationWidget_->AttachViewUI(ui);

View File

@ -1770,22 +1770,4 @@
<translation></translation> <translation></translation>
</message> </message>
</context> </context>
<context>
<name>osgQOpenGLWidget</name>
<message>
<location filename="../viewer/osgQOpenGLWidget.cpp" line="104"/>
<source>Screen %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../viewer/osgQOpenGLWidget.cpp" line="114"/>
<source>Choose fullscreen target screen</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../viewer/osgQOpenGLWidget.cpp" line="114"/>
<source>Screen</source>
<translation type="unfinished"></translation>
</message>
</context>
</TS> </TS>

View File

@ -204,6 +204,7 @@ void MainWindow::InitDockLayout() {
QString strTabName = mapTab.value("Name").toString(); QString strTabName = mapTab.value("Name").toString();
QMainWindow* mainWindow_ = new QMainWindow; QMainWindow* mainWindow_ = new QMainWindow;
connect(mainWindow_, &QMainWindow::tabifiedDockWidgetActivated, this, &MainWindow::OnTabifiedDockWidgetActivated);
QVariantList listDocArea = mapTab.value("Widget").toList(); QVariantList listDocArea = mapTab.value("Widget").toList();
@ -329,6 +330,17 @@ void MainWindow::AddDockArea(const QString& strArea) {
resizeDocks(listAdd, listSpliter, orient); resizeDocks(listAdd, listSpliter, orient);
} }
void MainWindow::OnTabifiedDockWidgetActivated(QDockWidget* dockWidget) {
if (dockWidget) {
QMainWindow* mainWindow = qobject_cast<QMainWindow*>(dockWidget->parentWidget());
if (mainWindow) {
mainWindow->removeDockWidget(dockWidget);
}
// tabWidget_->setCurrentWidget(dockWidget->parentWidget());
}
}
void MainWindow::slotShowUISetting() { void MainWindow::slotShowUISetting() {
pSettingUI->show(); pSettingUI->show();
} }

View File

@ -47,7 +47,7 @@ private:
void AddDockArea(const QString& strArea); void AddDockArea(const QString& strArea);
protected: protected:
void OnTabifiedDockWidgetActivated(QDockWidget* dockWidget);
private: private:
Ui::MainWindow* ui; Ui::MainWindow* ui;

View File

@ -15,8 +15,6 @@
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#include "viewer/OSGRenderer.h" #include "viewer/OSGRenderer.h"
#include "viewer/osgQOpenGLWindow.h"
#include "viewer/osgQOpenGLWidget.h"
//#include <osgQOpenGL/CullVisitorEx> //#include <osgQOpenGL/CullVisitorEx>
//#include <osgQOpenGL/GraphicsWindowEx> //#include <osgQOpenGL/GraphicsWindowEx>
@ -115,398 +113,147 @@ namespace
static QtKeyboardMap s_QtKeyboardMap; static QtKeyboardMap s_QtKeyboardMap;
} // namespace } // namespace
OSGRenderer::OSGRenderer(QObject* parent)
: QObject(parent), osgViewer::Viewer() OSGRenderer::OSGRenderer(QObject *parent)
: QObject(parent)
, m_osgInitialized(false)
, m_windowScale(1.f)
, m_continuousUpdate(true)
{ {
// QObject::connect(QCoreApplication::instance(), &QCoreApplication::aboutToQuit,
// [this]()
// {
// _applicationAboutToQuit = true;
// killTimer(_timerId);
// _timerId = 0;
// });
} }
OSGRenderer::OSGRenderer(osg::ArgumentParser* arguments, QObject* parent) void OSGRenderer::render()
: QObject(parent), osgViewer::Viewer(*arguments)
{ {
// QObject::connect(QCoreApplication::instance(), &QCoreApplication::aboutToQuit, if (m_osgViewer.getSceneData())
// [this]() m_osgViewer.frame();
// { if (m_continuousUpdate)
// _applicationAboutToQuit = true; update();
// killTimer(_timerId);
// _timerId = 0;
// });
}
OSGRenderer::~OSGRenderer()
{
}
void OSGRenderer::update()
{
osgQOpenGLWindow* osgWidgetRendered = dynamic_cast<osgQOpenGLWindow*>(parent());
if(osgWidgetRendered != nullptr)
{
osgWidgetRendered->_osgWantsToRenderFrame = true;
osgWidgetRendered->update();
}
else
{
osgQOpenGLWidget* osgWidget = dynamic_cast<osgQOpenGLWidget*>(parent());
osgWidget->_osgWantsToRenderFrame = true;
osgWidget->update();
}
} }
void OSGRenderer::resize(int windowWidth, int windowHeight, float windowScale) void OSGRenderer::resize(int windowWidth, int windowHeight, float windowScale)
{ {
if(!m_osgInitialized) if (!m_osgInitialized)
return; return;
m_windowScale = windowScale; m_windowScale = windowScale;
m_osgViewer.getCamera()->setViewport(new osg::Viewport(0, 0, windowWidth * windowScale,
/* _camera->setViewport(new osg::Viewport(0, 0, windowWidth * windowScale, windowHeight * windowScale));
windowHeight * windowScale));*/ m_osgWinEmb->resized(0, 0, windowWidth * windowScale, windowHeight * windowScale);
m_osgWinEmb->getEventQueue()->windowResize( 0, 0, windowWidth * windowScale,
m_osgWinEmb->resized(0, 0, windowHeight * windowScale );
windowWidth * windowScale,
windowHeight * windowScale);
m_osgWinEmb->getEventQueue()->windowResize(0, 0,
windowWidth * windowScale,
windowHeight * windowScale);
update();
} }
void OSGRenderer::setupOSG(int windowWidth, int windowHeight, float windowScale) void OSGRenderer::setupOSG(int windowWidth, int windowHeight, float windowScale)
{ {
m_osgInitialized = true; m_osgInitialized = true;
m_windowScale = windowScale; m_windowScale = windowScale;
m_osgWinEmb = new osgViewer::GraphicsWindowEmbedded(0, 0,
windowWidth * windowScale, windowHeight * windowScale); m_osgWinEmb = new osgViewer::GraphicsWindowEmbedded(0, 0, windowWidth * windowScale, windowHeight * windowScale);
//m_osgWinEmb = new osgViewer::GraphicsWindowEmbedded(0, 0, windowWidth * windowScale, windowHeight * windowScale);
// make sure the event queue has the correct window rectangle size and input range // make sure the event queue has the correct window rectangle size and input range
m_osgWinEmb->getEventQueue()->syncWindowRectangleWithGraphicsContext(); m_osgWinEmb->getEventQueue()->syncWindowRectangleWithGraphicsContext();
_camera->setViewport(new osg::Viewport(0, 0, windowWidth * windowScale,
windowHeight * windowScale)); m_osgViewer.getCamera()->setViewport(new osg::Viewport(0, 0, windowWidth * windowScale, windowHeight * windowScale));
_camera->setGraphicsContext(m_osgWinEmb.get()); m_osgViewer.getCamera()->setGraphicsContext(m_osgWinEmb.get());
// disable key event (default is Escape key) that the viewer checks on each m_osgViewer.getCamera()->setClearColor(osg::Vec4(1., 1., 1., 1.));
// frame to see m_osgViewer.setThreadingModel(osgViewer::Viewer::SingleThreaded);
// if the viewer's done flag should be set to signal end of viewers main
// loop.
setKeyEventSetsDone(0);
setReleaseContextAtEndOfFrameHint(false);
setThreadingModel(osgViewer::Viewer::SingleThreaded);
osgViewer::Viewer::Windows windows; osgViewer::Viewer::Windows windows;
getWindows(windows); m_osgViewer.getWindows(windows);
for(osgViewer::Viewer::Windows::iterator itr = windows.begin(); itr != windows.end(); ++itr)
_timerId = startTimer(10, Qt::PreciseTimer); {
_lastFrameStartTime.setStartTick(0); (*itr)->getState()->setUseModelViewAndProjectionUniforms(true);
(*itr)->getState()->setUseVertexAttributeAliasing(true);
}
} }
void OSGRenderer::setKeyboardModifiers(QInputEvent* event) void OSGRenderer::setKeyboardModifiers( QInputEvent* event ) const
{ {
unsigned int modkey = event->modifiers() & (Qt::ShiftModifier | int modkey = event->modifiers() & (Qt::ShiftModifier | Qt::ControlModifier | Qt::AltModifier);
Qt::ControlModifier |
Qt::AltModifier);
unsigned int mask = 0; unsigned int mask = 0;
if ( modkey & Qt::ShiftModifier ) mask |= osgGA::GUIEventAdapter::MODKEY_SHIFT;
if(modkey & Qt::ShiftModifier) mask |= osgGA::GUIEventAdapter::MODKEY_SHIFT; if ( modkey & Qt::ControlModifier ) mask |= osgGA::GUIEventAdapter::MODKEY_CTRL;
if ( modkey & Qt::AltModifier ) mask |= osgGA::GUIEventAdapter::MODKEY_ALT;
if(modkey & Qt::ControlModifier) mask |= osgGA::GUIEventAdapter::MODKEY_CTRL; m_osgWinEmb->getEventQueue()->getCurrentEventState()->setModKeyMask( mask );
if(modkey & Qt::AltModifier) mask |= osgGA::GUIEventAdapter::MODKEY_ALT;
m_osgWinEmb->getEventQueue()->getCurrentEventState()->setModKeyMask(mask);
} }
void OSGRenderer::keyPressEvent(QKeyEvent* event) void OSGRenderer::keyPressEvent( QKeyEvent* event )
{ {
setKeyboardModifiers(event); setKeyboardModifiers( event );
int value = s_QtKeyboardMap.remapKey(event); int value = s_QtKeyboardMap.remapKey( event );
m_osgWinEmb->getEventQueue()->keyPress(value); m_osgWinEmb->getEventQueue()->keyPress( value );
} }
void OSGRenderer::keyReleaseEvent(QKeyEvent* event) void OSGRenderer::keyReleaseEvent( QKeyEvent* event )
{ {
if(event->isAutoRepeat()) if( event->isAutoRepeat() )
{ {
event->ignore(); event->ignore();
} }
else else
{ {
setKeyboardModifiers(event); setKeyboardModifiers( event );
int value = s_QtKeyboardMap.remapKey(event); int value = s_QtKeyboardMap.remapKey( event );
m_osgWinEmb->getEventQueue()->keyRelease(value); m_osgWinEmb->getEventQueue()->keyRelease( value );
} }
} }
void OSGRenderer::mousePressEvent(QMouseEvent* event) void OSGRenderer::mousePressEvent( QMouseEvent* event )
{ {
int button = 0; int button = 0;
switch ( event->button() )
switch(event->button())
{ {
case Qt::LeftButton: case Qt::LeftButton: button = 1; break;
button = 1; case Qt::MidButton: button = 2; break;
break; case Qt::RightButton: button = 3; break;
case Qt::NoButton: button = 0; break;
case Qt::MidButton: default: button = 0; break;
button = 2;
break;
case Qt::RightButton:
button = 3;
break;
case Qt::NoButton:
button = 0;
break;
default:
button = 0;
break;
} }
setKeyboardModifiers( event );
setKeyboardModifiers(event); m_osgWinEmb->getEventQueue()->mouseButtonPress( event->x() * m_windowScale, event->y() * m_windowScale, button );
m_osgWinEmb->getEventQueue()->mouseButtonPress(event->x() * m_windowScale,
event->y() * m_windowScale, button);
} }
void OSGRenderer::mouseReleaseEvent(QMouseEvent* event) void OSGRenderer::mouseReleaseEvent( QMouseEvent* event )
{ {
int button = 0; int button = 0;
switch ( event->button() )
switch(event->button())
{ {
case Qt::LeftButton: case Qt::LeftButton: button = 1; break;
button = 1; case Qt::MidButton: button = 2; break;
break; case Qt::RightButton: button = 3; break;
case Qt::NoButton: button = 0; break;
case Qt::MidButton: default: button = 0; break;
button = 2;
break;
case Qt::RightButton:
button = 3;
break;
case Qt::NoButton:
button = 0;
break;
default:
button = 0;
break;
} }
setKeyboardModifiers( event );
setKeyboardModifiers(event); m_osgWinEmb->getEventQueue()->mouseButtonRelease( event->x() * m_windowScale,
m_osgWinEmb->getEventQueue()->mouseButtonRelease(event->x() * m_windowScale, event->y() * m_windowScale, button );
event->y() * m_windowScale, button);
} }
void OSGRenderer::mouseDoubleClickEvent(QMouseEvent* event) void OSGRenderer::mouseDoubleClickEvent( QMouseEvent* event )
{ {
int button = 0; int button = 0;
switch ( event->button() )
switch(event->button())
{ {
case Qt::LeftButton: case Qt::LeftButton: button = 1; break;
button = 1; case Qt::MidButton: button = 2; break;
break; case Qt::RightButton: button = 3; break;
case Qt::NoButton: button = 0; break;
case Qt::MidButton: default: button = 0; break;
button = 2;
break;
case Qt::RightButton:
button = 3;
break;
case Qt::NoButton:
button = 0;
break;
default:
button = 0;
break;
} }
setKeyboardModifiers( event );
setKeyboardModifiers(event); m_osgWinEmb->getEventQueue()->mouseDoubleButtonPress( event->x() * m_windowScale, event->y() * m_windowScale, button );
m_osgWinEmb->getEventQueue()->mouseDoubleButtonPress(event->x() * m_windowScale,
event->y() * m_windowScale, button);
} }
void OSGRenderer::mouseMoveEvent(QMouseEvent* event) void OSGRenderer::mouseMoveEvent( QMouseEvent* event )
{ {
setKeyboardModifiers(event); setKeyboardModifiers( event );
m_osgWinEmb->getEventQueue()->mouseMotion(event->x() * m_windowScale, m_osgWinEmb->getEventQueue()->mouseMotion( event->x() * m_windowScale, event->y() * m_windowScale );
event->y() * m_windowScale);
} }
void OSGRenderer::wheelEvent(QWheelEvent* event) void OSGRenderer::wheelEvent( QWheelEvent* event )
{ {
setKeyboardModifiers(event); setKeyboardModifiers( event );
m_osgWinEmb->getEventQueue()->mouseMotion(event->x() * m_windowScale,
event->y() * m_windowScale);
m_osgWinEmb->getEventQueue()->mouseScroll( m_osgWinEmb->getEventQueue()->mouseScroll(
event->orientation() == Qt::Vertical ? event->orientation() == Qt::Vertical ?
(event->delta() > 0 ? osgGA::GUIEventAdapter::SCROLL_UP : (event->delta()>0 ? osgGA::GUIEventAdapter::SCROLL_UP : osgGA::GUIEventAdapter::SCROLL_DOWN) :
osgGA::GUIEventAdapter::SCROLL_DOWN) : (event->delta()>0 ? osgGA::GUIEventAdapter::SCROLL_LEFT : osgGA::GUIEventAdapter::SCROLL_RIGHT) );
(event->delta() > 0 ? osgGA::GUIEventAdapter::SCROLL_LEFT :
osgGA::GUIEventAdapter::SCROLL_RIGHT));
}
bool OSGRenderer::checkEvents()
{
// check events from any attached sources
for(Devices::iterator eitr = _eventSources.begin();
eitr != _eventSources.end();
++eitr)
{
osgGA::Device* es = eitr->get();
if(es->getCapabilities() & osgGA::Device::RECEIVE_EVENTS)
{
if(es->checkEvents())
return true;
}
}
// get events from all windows attached to Viewer.
Windows windows;
getWindows(windows);
for(Windows::iterator witr = windows.begin();
witr != windows.end();
++witr)
{
if((*witr)->checkEvents())
return true;
}
return false;
}
bool OSGRenderer::checkNeedToDoFrame()
{
// check if any event handler has prompted a redraw
if(_requestRedraw)
return true;
if(_requestContinousUpdate)
return true;
// check if the view needs to update the scene graph
// this check if camera has update callback and if scene requires to update scene graph
if(requiresUpdateSceneGraph())
return true;
// check if the database pager needs to update the scene
if(getDatabasePager()->requiresUpdateSceneGraph())
return true;
// check if the image pager needs to update the scene
if(getImagePager()->requiresUpdateSceneGraph())
return true;
// check if the scene needs to be redrawn
if(requiresRedraw())
return true;
// check if events are available and need processing
if(checkEvents())
return true;
// and check again if any event handler has prompted a redraw
if(_requestRedraw)
return true;
if(_requestContinousUpdate)
return true;
return false;
}
// called from ViewerWidget paintGL() method
void OSGRenderer::frame(double simulationTime)
{
// limit the frame rate
if(getRunMaxFrameRate() > 0.0)
{
double dt = _lastFrameStartTime.time_s();
double minFrameTime = 1.0 / getRunMaxFrameRate();
if(dt < minFrameTime)
QThread::usleep(static_cast<unsigned int>(1000000.0 * (minFrameTime - dt)));
}
// avoid excessive CPU loading when no frame is required in ON_DEMAND mode
if(getRunFrameScheme() == osgViewer::ViewerBase::ON_DEMAND)
{
double dt = _lastFrameStartTime.time_s();
if(dt < 0.01)
OpenThreads::Thread::microSleep(static_cast<unsigned int>(1000000.0 *
(0.01 - dt)));
}
// record start frame time
_lastFrameStartTime.setStartTick();
// make frame
#if 1
osgViewer::Viewer::frame(simulationTime);
#else
if(_done) return;
// OSG_NOTICE<<std::endl<<"CompositeViewer::frame()"<<std::endl<<std::endl;
if(_firstFrame)
{
viewerInit();
if(!isRealized())
{
realize();
}
_firstFrame = false;
}
advance(simulationTime);
eventTraversal();
updateTraversal();
// renderingTraversals();
#endif
}
void OSGRenderer::requestRedraw()
{
osgViewer::Viewer::requestRedraw();
}
void OSGRenderer::timerEvent(QTimerEvent* /*event*/)
{
// application is about to quit, just return
if(_applicationAboutToQuit)
{
return;
}
// ask ViewerWidget to update 3D view
if(getRunFrameScheme() != osgViewer::ViewerBase::ON_DEMAND ||
checkNeedToDoFrame())
{
update();
}
} }

View File

@ -25,71 +25,42 @@ class QInputEvent;
class QKeyEvent; class QKeyEvent;
class QMouseEvent; class QMouseEvent;
class QWheelEvent; class QWheelEvent;
namespace eveBIM
{
class ViewerWidget;
}
class OSGRenderer : public QObject, public osgViewer::Viewer
{
bool m_osgInitialized {false};
osg::ref_ptr<osgViewer::GraphicsWindow> m_osgWinEmb;
float m_windowScale {1.0f};
bool m_continuousUpdate {true};
int _timerId{0};
osg::Timer _lastFrameStartTime;
bool _applicationAboutToQuit {false};
bool _osgWantsToRenderFrame{true};
Q_OBJECT
friend class eveBIM::ViewerWidget;
class OSGRenderer : public QObject {
public: public:
explicit OSGRenderer(QObject* parent = nullptr); explicit OSGRenderer(QObject* parent = nullptr);
explicit OSGRenderer(osg::ArgumentParser* arguments, QObject* parent = nullptr);
~OSGRenderer() override; ~OSGRenderer() override = default;
bool continuousUpdate() const osgViewer::Viewer *viewer() { return &m_osgViewer; }
{
return m_continuousUpdate;
}
void setContinuousUpdate(bool continuousUpdate)
{
m_continuousUpdate = continuousUpdate;
}
virtual void keyPressEvent(QKeyEvent* event); bool continuousUpdate() const { return m_continuousUpdate; }
virtual void keyReleaseEvent(QKeyEvent* event); void setContinuousUpdate(bool continuousUpdate) { m_continuousUpdate = continuousUpdate; }
virtual void mousePressEvent(QMouseEvent* event);
virtual void mouseReleaseEvent(QMouseEvent* event);
virtual void mouseDoubleClickEvent(QMouseEvent* event);
virtual void mouseMoveEvent(QMouseEvent* event);
virtual void wheelEvent(QWheelEvent* event);
virtual void keyPressEvent( QKeyEvent* event );
virtual void keyReleaseEvent( QKeyEvent* event );
virtual void mousePressEvent( QMouseEvent* event );
virtual void mouseReleaseEvent( QMouseEvent* event );
virtual void mouseDoubleClickEvent( QMouseEvent* event );
virtual void mouseMoveEvent( QMouseEvent* event );
virtual void wheelEvent( QWheelEvent* event );
virtual void update() {}
virtual void render();
virtual void resize(int windowWidth, int windowHeight, float windowScale); virtual void resize(int windowWidth, int windowHeight, float windowScale);
void setupOSG(int windowWidth, int windowHeight, float windowScale); void setupOSG(int windowWidth, int windowHeight, float windowScale);
// overrided from osgViewer::Viewer protected:
virtual bool checkNeedToDoFrame() override; void setKeyboardModifiers( QInputEvent* event ) const;
// overrided from osgViewer::ViewerBase
void frame(double simulationTime = USE_REFERENCE_TIME) override;
// overrided from osgViewer::Viewer
void requestRedraw() override;
// overrided from osgViewer::Viewer
bool checkEvents() override;
void update();
protected: protected:
void timerEvent(QTimerEvent* event) override; bool m_osgInitialized;
osg::ref_ptr<osgViewer::GraphicsWindowEmbedded> m_osgWinEmb;
void setKeyboardModifiers(QInputEvent* event); osgViewer::Viewer m_osgViewer;
float m_windowScale;
bool m_continuousUpdate;
}; };

View File

@ -0,0 +1,14 @@
#include "viewer/OSGRendererImpl.h"
#include "OsgWidget.h"
OSGRendererImpl::OSGRendererImpl(QObject* parent)
: OSGRenderer(parent) {}
void OSGRendererImpl::update() {
OSGRenderer::update();
if (nullptr != widget_) {
widget_->update();
}
}

View File

@ -0,0 +1,20 @@
#pragma once
#include "viewer/OSGRenderer.h"
class OsgWidget;
class OSGRendererImpl : public OSGRenderer {
public:
explicit OSGRendererImpl(QObject *parent = 0);
~OSGRendererImpl() override = default;
void setup(OsgWidget* w) {
widget_ = w;
}
void update() override;
private:
OsgWidget* widget_{nullptr};
};

View File

@ -17,13 +17,16 @@ template<> OsgViewer* Singleton<OsgViewer>::instance_ = nullptr;
constexpr QEvent::Type sOsgViewUpdateEvent{ QEvent::Type(QEvent::User + 1) }; constexpr QEvent::Type sOsgViewUpdateEvent{ QEvent::Type(QEvent::User + 1) };
OsgViewer::OsgViewer(QObject* parent) noexcept OsgViewer::OsgViewer(QObject* parent) noexcept
: QObject(parent) : QObject(parent) {
, compositeViewer_(new osgViewer::CompositeViewer) {
LOG_INFO("actor, self={}", fmt::ptr(this)); LOG_INFO("actor, self={}", fmt::ptr(this));
compositeViewer_->setKeyEventSetsDone(0);
//compositeViewer_->getDatabasePager()->setUnrefImageDataAfterApplyPolicy(true, false); //compositeViewer_->getDatabasePager()->setUnrefImageDataAfterApplyPolicy(true, false);
osgEarth::initialize(); osgEarth::initialize();
compositeViewer_ = new osgViewer::CompositeViewer;
compositeViewer_->setReleaseContextAtEndOfFrameHint(false);
compositeViewer_->setKeyEventSetsDone(0);
osgDB::Registry::instance()->getObjectWrapperManager()->findWrapper("osg::Image"); osgDB::Registry::instance()->getObjectWrapperManager()->findWrapper("osg::Image");
// compositeViewer_->getDatabasePager()->setUnrefImageDataAfterApplyPolicy( true, false );
compositeViewer_->setThreadingModel(osgViewer::ViewerBase::ThreadingModel::SingleThreaded); compositeViewer_->setThreadingModel(osgViewer::ViewerBase::ThreadingModel::SingleThreaded);
} }

71
src/viewer/OsgWidget.cpp Normal file
View File

@ -0,0 +1,71 @@
#include "viewer/OsgWidget.h"
#include <QApplication>
#include <QWindow>
#include <QScreen>
#include "viewer/OSGRendererImpl.h"
OsgWidget::OsgWidget(QWidget* parent)
: QOpenGLWidget(parent)
, renderer_(nullptr)
{
}
void OsgWidget::initializeGL()
{
renderer_ = new OSGRendererImpl(this);
renderer_->setup(this);
QScreen *screen = windowHandle() && windowHandle()->screen() ? windowHandle()->screen() : qApp->screens().front();
renderer_->setupOSG(width(), height(), screen->devicePixelRatio());
emit initialized();
}
void OsgWidget::resizeGL(int w, int h)
{
QScreen *screen = windowHandle() && windowHandle()->screen() ? windowHandle()->screen() : qApp->screens().front();
renderer_->resize(w, h, screen->devicePixelRatio());
}
void OsgWidget::paintGL()
{
renderer_->render();
}
void OsgWidget::keyPressEvent(QKeyEvent *event)
{
renderer_->keyPressEvent(event);
}
void OsgWidget::keyReleaseEvent(QKeyEvent *event)
{
renderer_->keyReleaseEvent(event);
}
void OsgWidget::mousePressEvent(QMouseEvent *event)
{
renderer_->mousePressEvent(event);
}
void OsgWidget::mouseReleaseEvent(QMouseEvent *event)
{
renderer_->mouseReleaseEvent(event);
}
void OsgWidget::mouseDoubleClickEvent(QMouseEvent *event)
{
renderer_->mouseDoubleClickEvent(event);
}
void OsgWidget::mouseMoveEvent(QMouseEvent *event)
{
renderer_->mouseMoveEvent(event);
}
void OsgWidget::wheelEvent(QWheelEvent *event)
{
renderer_->wheelEvent(event);
}

30
src/viewer/OsgWidget.h Normal file
View File

@ -0,0 +1,30 @@
#pragma once
#include <QOpenGLWidget>
class OSGRendererImpl;
class OsgWidget : public QOpenGLWidget {
Q_OBJECT
public:
OsgWidget(QWidget *parent = nullptr);
signals:
void initialized();
protected:
void initializeGL() override;
void resizeGL(int w, int h) override;
void paintGL() override;
void keyPressEvent( QKeyEvent* event ) override;
void keyReleaseEvent( QKeyEvent* event ) override;
void mousePressEvent( QMouseEvent* event ) override;
void mouseReleaseEvent( QMouseEvent* event ) override;
void mouseDoubleClickEvent( QMouseEvent* event ) override;
void mouseMoveEvent( QMouseEvent* event ) override;
void wheelEvent( QWheelEvent* event ) override;
private:
OSGRendererImpl *renderer_;
};

View File

@ -1,223 +0,0 @@
#include "viewer/osgQOpenGLWidget.h"
#include "viewer/OSGRenderer.h"
#include <osgViewer/Viewer>
#include <osg/GL>
#include <QApplication>
#include <QKeyEvent>
#include <QInputDialog>
#include <QLayout>
#include <QMainWindow>
#include <QScreen>
#include <QWindow>
osgQOpenGLWidget::osgQOpenGLWidget(QWidget* parent)
: QOpenGLWidget(parent)
{
}
osgQOpenGLWidget::osgQOpenGLWidget(osg::ArgumentParser* arguments,
QWidget* parent) :
QOpenGLWidget(parent),
_arguments(arguments)
{
}
osgQOpenGLWidget::~osgQOpenGLWidget()
{
}
osgViewer::Viewer* osgQOpenGLWidget::getOsgViewer()
{
return m_renderer;
}
OpenThreads::ReadWriteMutex* osgQOpenGLWidget::mutex()
{
return &_osgMutex;
}
void osgQOpenGLWidget::initializeGL()
{
// Initializes OpenGL function resolution for the current context.
initializeOpenGLFunctions();
createRenderer();
emit initialized();
}
void osgQOpenGLWidget::resizeGL(int w, int h)
{
Q_ASSERT(m_renderer);
QScreen* screen = windowHandle()
&& windowHandle()->screen() ? windowHandle()->screen() :
qApp->screens().front();
m_renderer->resize(w, h, screen->devicePixelRatio());
}
void osgQOpenGLWidget::paintGL()
{
OpenThreads::ScopedReadLock locker(_osgMutex);
if (_isFirstFrame) {
_isFirstFrame = false;
m_renderer->getCamera()->getGraphicsContext()->setDefaultFboId(defaultFramebufferObject());
}
m_renderer->frame();
}
void osgQOpenGLWidget::keyPressEvent(QKeyEvent* event)
{
Q_ASSERT(m_renderer);
if(event->key() == Qt::Key_F)
{
static QSize g;
static QMargins sMargins;
if(parent() && parent()->isWidgetType())
{
QMainWindow* _mainwindow = dynamic_cast<QMainWindow*>(parent());
if(_mainwindow)
{
g = size();
if(layout())
sMargins = layout()->contentsMargins();
bool ok = true;
// select screen
if(qApp->screens().size() > 1)
{
QMap<QString, QScreen*> screens;
int screenNumber = 0;
for(QScreen* screen : qApp->screens())
{
QString name = screen->name();
if(name.isEmpty())
{
name = tr("Screen %1").arg(screenNumber);
}
name += " (" + QString::number(screen->size().width()) + "x" + QString::number(
screen->size().height()) + ")";
screens[name] = screen;
++screenNumber;
}
QString selected = QInputDialog::getItem(this,
tr("Choose fullscreen target screen"), tr("Screen"), screens.keys(), 0, false,
&ok);
if(ok && !selected.isEmpty())
{
context()->setScreen(screens[selected]);
move(screens[selected]->geometry().x(), screens[selected]->geometry().y());
resize(screens[selected]->geometry().width(),
screens[selected]->geometry().height());
}
}
if(ok)
{
// in fullscreen mode, a thiner (1px) border around
// viewer widget
if(layout())
layout()->setContentsMargins(1, 1, 1, 1);
setParent(0);
showFullScreen();
}
}
}
else
{
showNormal();
setMinimumSize(g);
QMainWindow* _mainwindow = dynamic_cast<QMainWindow*>(parent());
if(_mainwindow){
_mainwindow->setCentralWidget(this);
}
if(layout())
layout()->setContentsMargins(sMargins);
qApp->processEvents();
setMinimumSize(QSize(1, 1));
}
}
else // not 'F' key
{
// forward event to renderer
m_renderer->keyPressEvent(event);
}
}
void osgQOpenGLWidget::keyReleaseEvent(QKeyEvent* event)
{
Q_ASSERT(m_renderer);
// forward event to renderer
m_renderer->keyReleaseEvent(event);
}
void osgQOpenGLWidget::mousePressEvent(QMouseEvent* event)
{
Q_ASSERT(m_renderer);
// forward event to renderer
m_renderer->mousePressEvent(event);
}
void osgQOpenGLWidget::mouseReleaseEvent(QMouseEvent* event)
{
Q_ASSERT(m_renderer);
// forward event to renderer
m_renderer->mouseReleaseEvent(event);
}
void osgQOpenGLWidget::mouseDoubleClickEvent(QMouseEvent* event)
{
Q_ASSERT(m_renderer);
// forward event to renderer
m_renderer->mouseDoubleClickEvent(event);
}
void osgQOpenGLWidget::mouseMoveEvent(QMouseEvent* event)
{
Q_ASSERT(m_renderer);
// forward event to renderer
m_renderer->mouseMoveEvent(event);
}
void osgQOpenGLWidget::wheelEvent(QWheelEvent* event)
{
Q_ASSERT(m_renderer);
// forward event to renderer
m_renderer->wheelEvent(event);
}
void osgQOpenGLWidget::setDefaultDisplaySettings()
{
osg::DisplaySettings* ds = osg::DisplaySettings::instance().get();
ds->setNvOptimusEnablement(1);
ds->setStereo(false);
}
void osgQOpenGLWidget::createRenderer()
{
// call this before creating a View...
setDefaultDisplaySettings();
if (!_arguments) {
m_renderer = new OSGRenderer(this);
} else {
m_renderer = new OSGRenderer(_arguments, this);
}
QScreen* screen = windowHandle()
&& windowHandle()->screen() ? windowHandle()->screen() :
qApp->screens().front();
m_renderer->setupOSG(width(), height(), screen->devicePixelRatio());
}

View File

@ -1,88 +0,0 @@
#ifndef OSGQOPENGLWIDGET_H
#define OSGQOPENGLWIDGET_H
#ifdef __APPLE__
# define __glext_h_
# include <QtGui/qopengl.h>
# undef __glext_h_
# include <QtGui/qopenglext.h>
#endif
#include <OpenThreads/ReadWriteMutex>
#ifdef WIN32
//#define __gl_h_
#include <osg/GL>
#endif
#include <osg/ArgumentParser>
#include <QOpenGLWidget>
#include <QOpenGLFunctions>
#include <QReadWriteLock>
class OSGRenderer;
namespace osgViewer
{
class Viewer;
}
class osgQOpenGLWidget : public QOpenGLWidget,
protected QOpenGLFunctions
{
Q_OBJECT
protected:
OSGRenderer* m_renderer {nullptr};
bool _osgWantsToRenderFrame{true};
OpenThreads::ReadWriteMutex _osgMutex;
osg::ArgumentParser* _arguments {nullptr};
bool _isFirstFrame {true};
friend class OSGRenderer;
public:
osgQOpenGLWidget(QWidget* parent = nullptr);
osgQOpenGLWidget(osg::ArgumentParser* arguments, QWidget* parent = nullptr);
virtual ~osgQOpenGLWidget();
/** Get osgViewer View */
virtual osgViewer::Viewer* getOsgViewer();
//! get mutex
virtual OpenThreads::ReadWriteMutex* mutex();
//! override this to change default size or aspect ratio
QSize sizeHint() const override { return QSize(640,480); }
signals:
void initialized();
protected:
//! call createRender. If overloaded, this method must send initialized signal at end
void initializeGL() override;
void resizeGL(int w, int h) override;
//! lock scene graph and call osgViewer::frame()
void paintGL() override;
//! called before creating renderer
virtual void setDefaultDisplaySettings();
void keyPressEvent(QKeyEvent* event) override;
void keyReleaseEvent(QKeyEvent* event) override;
void mousePressEvent(QMouseEvent* event) override;
void mouseReleaseEvent(QMouseEvent* event) override;
void mouseDoubleClickEvent(QMouseEvent* event) override;
void mouseMoveEvent(QMouseEvent* event) override;
void wheelEvent(QWheelEvent* event) override;
void createRenderer();
private:
};
#endif // OSGQOPENGLWIDGET_H

View File

@ -1,126 +0,0 @@
#include "viewer/osgQOpenGLWindow.h"
#include "viewer/OSGRenderer.h"
#include <osgViewer/Viewer>
#include <osg/GL>
#include <QApplication>
#include <QKeyEvent>
#include <QInputDialog>
#include <QLayout>
#include <QMainWindow>
#include <QScreen>
#include <QWindow>
osgQOpenGLWindow::osgQOpenGLWindow(QWidget* parent)
: QOpenGLWindow(QOpenGLWindow::NoPartialUpdate, nullptr)
{
_widget = QWidget::createWindowContainer(this);
}
osgQOpenGLWindow::~osgQOpenGLWindow()
{
}
osgViewer::Viewer* osgQOpenGLWindow::getOsgViewer()
{
return m_renderer;
}
OpenThreads::ReadWriteMutex* osgQOpenGLWindow::mutex()
{
return &_osgMutex;
}
void osgQOpenGLWindow::initializeGL()
{
// Initializes OpenGL function resolution for the current context.
initializeOpenGLFunctions();
createRenderer();
emit initialized();
}
void osgQOpenGLWindow::resizeGL(int w, int h)
{
Q_ASSERT(m_renderer);
double pixelRatio = screen()->devicePixelRatio();
m_renderer->resize(w, h, pixelRatio);
}
void osgQOpenGLWindow::paintGL()
{
OpenThreads::ScopedReadLock locker(_osgMutex);
if (_isFirstFrame) {
_isFirstFrame = false;
m_renderer->getCamera()->getGraphicsContext()->setDefaultFboId(defaultFramebufferObject());
}
m_renderer->frame();
}
void osgQOpenGLWindow::keyPressEvent(QKeyEvent* event)
{
Q_ASSERT(m_renderer);
// forward event to renderer
m_renderer->keyPressEvent(event);
}
void osgQOpenGLWindow::keyReleaseEvent(QKeyEvent* event)
{
Q_ASSERT(m_renderer);
// forward event to renderer
m_renderer->keyReleaseEvent(event);
}
void osgQOpenGLWindow::mousePressEvent(QMouseEvent* event)
{
Q_ASSERT(m_renderer);
// forward event to renderer
m_renderer->mousePressEvent(event);
}
void osgQOpenGLWindow::mouseReleaseEvent(QMouseEvent* event)
{
Q_ASSERT(m_renderer);
// forward event to renderer
m_renderer->mouseReleaseEvent(event);
}
void osgQOpenGLWindow::mouseDoubleClickEvent(QMouseEvent* event)
{
Q_ASSERT(m_renderer);
// forward event to renderer
m_renderer->mouseDoubleClickEvent(event);
}
void osgQOpenGLWindow::mouseMoveEvent(QMouseEvent* event)
{
Q_ASSERT(m_renderer);
// forward event to renderer
m_renderer->mouseMoveEvent(event);
}
void osgQOpenGLWindow::wheelEvent(QWheelEvent* event)
{
Q_ASSERT(m_renderer);
// forward event to renderer
m_renderer->wheelEvent(event);
}
void osgQOpenGLWindow::setDefaultDisplaySettings()
{
osg::DisplaySettings* ds = osg::DisplaySettings::instance().get();
ds->setNvOptimusEnablement(1);
ds->setStereo(false);
}
void osgQOpenGLWindow::createRenderer()
{
// call this before creating a View...
setDefaultDisplaySettings();
m_renderer = new OSGRenderer(this);
double pixelRatio = screen()->devicePixelRatio();
m_renderer->setupOSG(width(), height(), pixelRatio);
}

View File

@ -1,86 +0,0 @@
#ifndef OSGQOPENGLWINDOW_H
#define OSGQOPENGLWINDOW_H
#ifdef __APPLE__
# define __glext_h_
# include <QtGui/qopengl.h>
# undef __glext_h_
# include <QtGui/qopenglext.h>
#endif
#include <OpenThreads/ReadWriteMutex>
#ifdef WIN32
//#define __gl_h_
#include <osg/GL>
#endif
#include <QOpenGLWindow>
#include <QOpenGLFunctions>
#include <QReadWriteLock>
class OSGRenderer;
class QWidget;
namespace osgViewer
{
class Viewer;
}
class osgQOpenGLWindow : public QOpenGLWindow,
protected QOpenGLFunctions
{
Q_OBJECT
protected:
OSGRenderer* m_renderer {nullptr};
bool _osgWantsToRenderFrame{true};
OpenThreads::ReadWriteMutex _osgMutex;
bool _isFirstFrame {true};
friend class OSGRenderer;
QWidget* _widget = nullptr;
public:
osgQOpenGLWindow(QWidget* parent = nullptr);
virtual ~osgQOpenGLWindow();
/** Get osgViewer View */
virtual osgViewer::Viewer* getOsgViewer();
//! get mutex
virtual OpenThreads::ReadWriteMutex* mutex();
QWidget* asWidget()
{
return _widget;
}
signals:
void initialized();
protected:
//! call createRender. If overloaded, this method must send initialized signal at end
void initializeGL() override;
void resizeGL(int w, int h) override;
//! lock scene graph and call osgViewer::frame()
void paintGL() override;
//! called before creating renderer
virtual void setDefaultDisplaySettings();
void keyPressEvent(QKeyEvent* event) override;
void keyReleaseEvent(QKeyEvent* event) override;
void mousePressEvent(QMouseEvent* event) override;
void mouseReleaseEvent(QMouseEvent* event) override;
void mouseDoubleClickEvent(QMouseEvent* event) override;
void mouseMoveEvent(QMouseEvent* event) override;
void wheelEvent(QWheelEvent* event) override;
void createRenderer();
};
#endif // OSGQOPENGLWINDOW_H