PeriDyno 1.0.0
Loading...
Searching...
No Matches
VtkRenderEngine.cpp
Go to the documentation of this file.
1#include "VtkRenderEngine.h"
2
3#include <iostream>
4
5#include <SceneGraph.h>
6#include <Action.h>
7
8#include <OrbitCamera.h>
9#include <TrackballCamera.h>
10
11#include <glm/gtc/type_ptr.hpp>
12
13#include <vtkPolyDataMapper.h>
14#include <vtkProperty.h>
15
16#include <vtkLight.h>
17#include <vtkLightActor.h>
18#include <vtkLightCollection.h>
19#include <vtkTextureObject.h>
20
21#include <vtkOpenGLFramebufferObject.h>
22#include <vtkOpenGLState.h>
23
24#include <vtk_glew.h>
25
26using namespace dyno;
27
29{
31 {
32 this->engine = engine;
33
34 this->engine->mVisualModules.clear();
35 // enqueue render content
36 if (scene != nullptr && !scene->isEmpty())
37 {
38 scene->traverseForward(this);
39 }
40 }
41
42 void process(Node* node) override
43 {
44 for (auto iter : node->graphicsPipeline()->activeModules())
45 {
46 auto m = dynamic_cast<VtkVisualModule*>(iter.get());
47 if (m)
48 {
49 this->engine->mVisualModules.push_back(m);
50 }
51 }
52 }
53
55};
56
58{
59 // initialize vtk window and renderer
60 mVtkRenderer->SetActiveCamera(mVtkCamera);
61 mVtkRenderer->SetPreserveDepthBuffer(false);
62 mVtkRenderer->SetPreserveColorBuffer(false);
63 mVtkRenderer->SetPreserveGLLights(false);
64 mVtkRenderer->SetPreserveGLCameraMatrices(false);
65 mVtkRenderer->SetGradientBackground(true);
66
67 mVtkWindow->AutomaticWindowPositionAndResizeOff();
68 mVtkWindow->SetUseExternalContent(false);
69 mVtkWindow->SetOffScreenRendering(m_useOffScreen);
70 mVtkWindow->SwapBuffersOff();
71 mVtkWindow->DoubleBufferOff();
72 mVtkWindow->SetMultiSamples(0);
73
74 // Toggle the line smoothing on, otherwise error occurs when calling the GetProperty()->SetLineWidth(1.5) function
75 mVtkWindow->LineSmoothingOn();
76
77 mVtkWindow->AddRenderer(mVtkRenderer);
78
79 // light
80 mVtkLight->SetLightTypeToSceneLight();
81 mVtkLight->PositionalOff();
82 mVtkRenderer->AddLight(mVtkLight);
83
84 // create a ground plane
85 {
86 float scale = 2.0;
87
88 mPlane->SetOrigin(-scale, 0.0, scale);
89 mPlane->SetPoint1( scale, 0.0, scale);
90 mPlane->SetPoint2(-scale, 0.0, -scale);
91 mPlane->SetResolution(100, 100);
92 mPlane->Update();
93
94 vtkNew<vtkPolyDataMapper> planeMapper;
95 planeMapper->SetInputData(mPlane->GetOutput());
96
97 mPlaneActor->SetMapper(planeMapper);
98 mPlaneActor->GetProperty()->SetEdgeVisibility(true);
99 mPlaneActor->GetProperty()->SetEdgeColor(0.4, 0.4, 0.4);
100 mPlaneActor->GetProperty()->SetColor(0.8, 0.8, 0.8);
101 mPlaneActor->GetProperty()->SetBackfaceCulling(true);
102 //m_planeActor->GetProperty()->SetOpacity(0.5);
103
104 mPlaneWireFrame->SetOrigin(-scale, 0.0, scale);
105 mPlaneWireFrame->SetPoint1(scale, 0.0, scale);
106 mPlaneWireFrame->SetPoint2(-scale, 0.0, -scale);
107 mPlaneWireFrame->SetResolution(5, 5);
108 mPlaneWireFrame->Update();
109
110 vtkNew<vtkPolyDataMapper> wireframeMapper;
111 wireframeMapper->SetInputData(mPlaneWireFrame->GetOutput());
112
113 mPlaneWireFrameActor->SetMapper(wireframeMapper);
114 mPlaneWireFrameActor->GetProperty()->SetEdgeVisibility(true);
115 mPlaneWireFrameActor->GetProperty()->SetEdgeColor(0.35, 0.35, 0.35);
116 mPlaneWireFrameActor->GetProperty()->SetColor(0.8, 0.8, 0.8);
117 mPlaneWireFrameActor->GetProperty()->SetBackfaceCulling(true);
118 mPlaneWireFrameActor->GetProperty()->SetFrontfaceCulling(true);
119 mPlaneWireFrameActor->GetProperty()->SetLineWidth(1.5);
120
121 mVtkRenderer->AddActor(mPlaneActor);
123 }
124
125 // create a scene bounding box
126 {
127 vtkNew<vtkPolyDataMapper> mapper;
128 mapper->SetInputData(mSceneCube->GetOutput());
129
130 // wireframe
131 mBoxActor->SetMapper(mapper);
132 mBoxActor->GetProperty()->SetRepresentationToWireframe();
133 mBoxActor->GetProperty()->SetColor(0.8, 0.8, 0.8);
134 mBoxActor->GetProperty()->SetOpacity(0.8);
135 // m_bboxActor->GetProperty()->SetLineWidth(2.0);
136 mBoxActor->GetProperty()->SetLighting(false);
137
138 mVtkRenderer->AddActor(mBoxActor);
139
140 }
141
142 // set axes
143 {
144 // NOT WORK!
145 //vtkNew<vtkRenderWindowInteractor> m_interactor;
146 //m_interactor->SetRenderWindow(m_vtkWindow);
147
149 //vtkNew<vtkAxesActor> axes;
150 //vtkNew<vtkOrientationMarkerWidget> widget;
151
152 //widget->SetOrientationMarker(axes);
154
155 //widget->SetInteractor(m_interactor);
156 //widget->SetEnabled(1);
157 //widget->InteractiveOn();
158 }
159
160 // set shadow pass
161 {
162 mRenderPasses.baker->SetResolution(4096);
163 mRenderPasses.shadow->SetShadowMapBakerPass(mRenderPasses.baker);
164
165 mRenderPasses.passes->AddItem(mRenderPasses.baker);
166 mRenderPasses.passes->AddItem(mRenderPasses.shadow);
167 //m_renderPasses.passes->AddItem(m_renderPasses.light);
168 mRenderPasses.passes->AddItem(mRenderPasses.translucent);
169 mRenderPasses.passes->AddItem(mRenderPasses.volume);
170 mRenderPasses.passes->AddItem(mRenderPasses.overlay);
171
172 mRenderPasses.seq->SetPasses(mRenderPasses.passes);
173 mRenderPasses.cameraPass->SetDelegatePass(mRenderPasses.seq);
174
175 // tell the renderer to use our render pass pipeline
176 //m_vtkRenderer->SetPass(m_renderPasses.cameraPass);
177
178 }
179}
180
182{
183// mCamera = std::make_shared<OrbitCamera>();
184//
185// mCamera->setWidth(width);
186// mCamera->setHeight(height);
187// mCamera->registerPoint(float(width) / 2, float(height) / 2);
188// mCamera->translateToPoint(0, 0);
189//
190// mCamera->zoom(3.0f);
191// mCamera->setClipNear(0.01f);
192// mCamera->setClipFar(10.0f);
193}
194
196{
197
198}
199
201{
202 mVtkWindow->GetState()->ResetFramebufferBindings();
203 mVtkWindow->GetState()->ResetGLViewportState();
204
206 setCamera(rparams);
207
208 // set light
209 {
210 glm::vec3 lightClr = rparams.light.mainLightColor;
211 glm::vec3 lightDir = rparams.light.mainLightDirection * 100.f;
212 glm::vec3 ambient = rparams.light.ambientColor * rparams.light.ambientScale;
213
214 mVtkLight->SetColor(lightClr.r, lightClr.g, lightClr.b);
215 mVtkLight->SetAmbientColor(ambient.r, ambient.g, ambient.b);
216 mVtkLight->SetPosition(lightDir.x, lightDir.y, lightDir.z);
217 //m_vtkLight->SetIntensity(m_rparams.light.mainLightScale);
218 }
219
220 // set bounding box
221 {
222 auto b0 = scene->getLowerBound();
223 auto b1 = scene->getUpperBound();
224 mSceneCube->SetBounds(b0[0], b1[0], b0[1], b1[1], b0[2], b1[2]);
225 mSceneCube->Update();
226 }
227
228 // background
229 {
230 glm::vec3 color0 = rparams.bgColor0;
231 glm::vec3 color1 = rparams.bgColor1;
232 mVtkRenderer->SetBackground(color0.x, color0.y, color0.b);
233 mVtkRenderer->SetBackground2(color1.x, color1.y, color1.b);
234 }
235
236 // update nodes
237 for (auto* item : mVisualModules)
238 {
239 if (item->isVisible())
240 item->updateRenderingContext();
241
242 if (item->getActor())
243 item->getActor()->SetVisibility(item->isVisible());
244 if (item->getVolume())
245 item->getVolume()->SetVisibility(item->isVisible());
246 }
247
248 mPlaneActor->SetVisibility(rparams.showGround);
249 mPlaneWireFrameActor->SetVisibility(rparams.showGround);
250
251 mBoxActor->SetVisibility(rparams.showSceneBounds);
252
253 // with vtk_glew.h, we directly use OpenGL functions here
254 GLint currFBO;
255 glGetIntegerv(GL_FRAMEBUFFER_BINDING, &currFBO);
256
257 mVtkWindow->Render();
258
259 // blit offscreen vtk framebuffer to screen
260 if(m_useOffScreen) {
261 vtkOpenGLFramebufferObject* offscreen = mVtkWindow->GetOffScreenFramebuffer();
262 glBindFramebuffer(GL_DRAW_FRAMEBUFFER, currFBO);
263 glBindFramebuffer(GL_READ_FRAMEBUFFER, offscreen->GetFBOIndex());
264 glReadBuffer(GL_COLOR_ATTACHMENT0);
265 // TODO: we should not rely on camera width/height
266
267 int w = rparams.viewport.w;
268 int h = rparams.viewport.h;
269 glBlitFramebuffer(
270 0, 0, w, h,
271 0, 0, w, h,
272 GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT, GL_NEAREST);
273 }
274
275}
276
277std::vector<dyno::SelectionItem> VtkRenderEngine::select(int x, int y, int w, int h)
278{
279 //TODO:...
280 std::vector<SelectionItem> items;
281
282 return items;
283}
284
285std::string VtkRenderEngine::name() const
286{
287 return std::string("VTK");
288}
289
291{
292 if (scene == m_scene)
293 return;
294
295 m_scene = scene;
296
297 // first clear existing actors
299 vtkActor* actor = item->getActor();
300 if (actor != NULL)
301 {
302 mVtkRenderer->RemoveActor(actor);
303 }
304
305 vtkVolume* volume = item->getVolume();
306 if (volume != NULL)
307 {
308 mVtkRenderer->RemoveVolume(volume);
309 }
310 }
311
312 // gather vtk actors and volumes
313 GatherVisualModuleAction action(this, scene);
314
315 // add to renderer...
317 {
318 vtkActor* actor = item->getActor();
319 if (actor != NULL)
320 {
321 mVtkRenderer->AddActor(actor);
322 }
323
324 vtkVolume* volume = item->getVolume();
325 if (volume != NULL)
326 {
327 mVtkRenderer->AddVolume(volume);
328 }
329 }
330}
331
332
334{
335 // setup camera
336 glm::dmat4 view = rparams.view;
337 glm::dmat4 proj = rparams.proj;
338
339 mVtkCamera->SetViewTransformMatrix(glm::value_ptr(view));
340 mVtkCamera->SetProjectionTransformMatrix(glm::value_ptr(proj));
341
342 // set window size..
343 mVtkWindow->SetSize(rparams.viewport.w, rparams.viewport.h);
344}
std::shared_ptr< GraphicsPipeline > graphicsPipeline()
Definition Node.cpp:320
vtkNew< vtkExternalOpenGLRenderWindow > mVtkWindow
vtkNew< vtkExternalOpenGLCamera > mVtkCamera
void setScene(dyno::SceneGraph *scene)
virtual std::string name() const override
vtkNew< vtkVolumetricPass > volume
vtkNew< vtkExternalOpenGLRenderer > mVtkRenderer
vtkNew< vtkActor > mPlaneActor
friend struct GatherVisualModuleAction
struct dyno::VtkRenderEngine::@340163273235376101235017354364217037303154346237 mRenderPasses
virtual void initialize() override
void setCamera(const RenderParams &rparams)
virtual std::vector< SelectionItem > select(int x, int y, int w, int h) override
virtual void draw(dyno::SceneGraph *scene, const RenderParams &rparams) override
vtkNew< vtkPlaneSource > mPlaneWireFrame
vtkNew< vtkLight > mVtkLight
vtkNew< vtkPlaneSource > mPlane
std::vector< VtkVisualModule * > mVisualModules
vtkNew< vtkActor > mBoxActor
vtkNew< vtkActor > mPlaneWireFrameActor
vtkNew< vtkCubeSource > mSceneCube
virtual void terminate() override
This is an implementation of AdditiveCCD based on peridyno.
Definition Array.h:25
int scene
Definition GltfFunc.h:20
void process(Node *node) override
GatherVisualModuleAction(VtkRenderEngine *engine, dyno::SceneGraph *scene)
struct dyno::RenderParams::Light light