modiyf osg renderer
This commit is contained in:
parent
1eb2e44f26
commit
a4969a8aba
@ -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设置都是控制界面的放到同一个栏目
|
||||||
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
|
||||||
|
@ -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) {
|
||||||
|
@ -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);
|
||||||
|
@ -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>
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
@ -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();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
14
src/viewer/OSGRendererImpl.cpp
Normal file
14
src/viewer/OSGRendererImpl.cpp
Normal 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();
|
||||||
|
}
|
||||||
|
}
|
20
src/viewer/OSGRendererImpl.h
Normal file
20
src/viewer/OSGRendererImpl.h
Normal 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};
|
||||||
|
};
|
@ -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
71
src/viewer/OsgWidget.cpp
Normal 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
30
src/viewer/OsgWidget.h
Normal 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_;
|
||||||
|
};
|
@ -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());
|
|
||||||
}
|
|
@ -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
|
|
@ -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);
|
|
||||||
}
|
|
@ -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
|
|
Loading…
Reference in New Issue
Block a user