-
Notifications
You must be signed in to change notification settings - Fork 16
/
Copy pathquickosgrenderer.cpp
123 lines (103 loc) · 4.41 KB
/
quickosgrenderer.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
#include "quickosgrenderer.h"
#include "quickosgviewer.h"
#include <QtDebug>
#include <QQuickWindow>
#include <QOpenGLFunctions>
#include <QOpenGLContext>
#include <osg/MatrixTransform>
#include <osg/ShapeDrawable>
#include <osg/LineWidth>
#include <osgViewer/GraphicsWindow>
#include <osgDB/ReadFile>
#include <osgGA/TrackballManipulator>
#include <QtMath>
#include<osgShadow/SoftShadowMap>
#include <osg/LineWidth>
#include <osgText/Text>
#include <osg/BoundingSphere>
#include <osg/AutoTransform>
#include <osgViewer/Viewer>
#include "viewerdatum.h"
QuickOSGRenderer::QuickOSGRenderer(QuickOSGViewer* viewer)
: m_quickViewer(viewer)
{
m_eventQueue = viewer->m_eventQueue;
m_operationQueue = viewer->m_operationQueue;
initOSG();
viewer->m_camera = m_osgViewer->getCamera();
viewer->m_viewer = m_osgViewer.get();
}
QuickOSGRenderer::~QuickOSGRenderer()
{
qDebug()<<"Renderer destroyed.";
}
void QuickOSGRenderer::initOSG()
{
m_osgViewer = new osgViewer::Viewer();
auto manipulator = new osgGA::TrackballManipulator;
manipulator->setAllowThrow(false);
m_osgViewer->setCameraManipulator(manipulator);
osg::ref_ptr<osg::Camera> camera = m_osgViewer->getCamera();
camera->setComputeNearFarMode(osg::CullSettings::DO_NOT_COMPUTE_NEAR_FAR);
//camera->setCullingMode(osg::CullSettings::NO_CULLING);
camera->setProjectionMatrixAsOrtho(0.0, 1.0, 0.0, 1.0, 0.1, 10000);
camera->setClearMask(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
m_osgViewer->setUpViewerAsEmbeddedInWindow(0, 0, 300, 300);
m_quickViewer->resetWidth(); // 触发geometryChanged,改变渲染窗口大小
m_quickViewer->setCamera(camera);
//camera->setClearColor(QColor2OSGColor(m_clearColor));
camera->setClearColor(osg::Vec4(0.0f, 0.0f, 0.0f, 0.0f));
camera->setClearDepth(1);
m_graphicsWindow = dynamic_cast<osgViewer::GraphicsWindow*>(m_osgViewer->getCamera()->getGraphicsContext());
//auto gc = m_osgViewer->getCamera()->getGraphicsContext();
osg::State* state = m_graphicsWindow->getState();
state->setUseModelViewAndProjectionUniforms(true);
//state->setUseVertexAttributeAliasing(true);
m_graphicsWindow->setEventQueue(m_eventQueue);
m_osgViewer->setUpdateOperations(m_operationQueue);
m_rootNode = new osg::Group;
m_osgViewer->setSceneData(m_rootNode.get());
auto viewerDatum = new ViewerDatum(2, camera.get());
viewerDatum->setViewport(30.0, 0.0, 170.0, 170.0);
viewerDatum->setProjectionMatrixAsPerspective(45, 1.0, 0.001, 100000);
viewerDatum->setComputeNearFarMode(osg::CullSettings::COMPUTE_NEAR_FAR_USING_BOUNDING_VOLUMES);
viewerDatum->setViewMatrixAsLookAt(osg::Vec3d(0, 0, 20), osg::Vec3d(0, 0, 0), osg::Vec3d(0, 1, 0));
viewerDatum->setRenderOrder(osg::Camera::POST_RENDER, 1000);
viewerDatum->setAllowEventFocus(false);
viewerDatum->setReferenceFrame(osg::Transform::ABSOLUTE_RF);
viewerDatum->getOrCreateStateSet()->setMode(GL_LIGHTING,
osg::StateAttribute::OFF);
viewerDatum->getOrCreateStateSet()->setMode(GL_BLEND,
osg::StateAttribute::ON);
viewerDatum->setClearMask(GL_DEPTH_BUFFER_BIT);
m_rootNode->addChild(viewerDatum);
osg::ref_ptr<osg::Camera> leftCamera = new osg::Camera;
}
// 此处不做互斥同步处理是因为Qt保证在调用该sync函数时GUI线程是阻塞的
// 看Qt源代码也可以发现,在进入该函数之前,renderer线程使用mutex进行了互斥操作
void QuickOSGRenderer::synchronize(QQuickFramebufferObject* item)
{
m_quickViewer = qobject_cast<QuickOSGViewer*>(item);
if(m_sceneNode != m_quickViewer->scene()){
if(m_sceneNode.valid())
m_rootNode->replaceChild(m_sceneNode.get(), m_quickViewer->scene());
else
m_rootNode->addChild(m_quickViewer->scene());
m_sceneNode = m_quickViewer->scene();
}
}
void QuickOSGRenderer::render()
{
QOpenGLContext::currentContext()->functions()->glUseProgram(0);
m_osgViewer->frame();
m_quickViewer->window()->resetOpenGLState();
}
QOpenGLFramebufferObject* QuickOSGRenderer::createFramebufferObject(const QSize& size)
{
QOpenGLFramebufferObjectFormat format;
format.setAttachment(QOpenGLFramebufferObject::CombinedDepthStencil);
format.setSamples(4);
auto fbo = new QOpenGLFramebufferObject(size, format);
m_quickViewer->setDefaultFbo(fbo);
return fbo;
}