iMSTK
Interactive Medical Simulation Toolkit
RenderingHeadExample.cpp
1 /*
2 ** This file is part of the Interactive Medical Simulation Toolkit (iMSTK)
3 ** iMSTK is distributed under the Apache License, Version 2.0.
4 ** See accompanying NOTICE for details.
5 */
6 
7 #include "imstkCamera.h"
8 #include "imstkDirectionalLight.h"
9 #include "imstkKeyboardDeviceClient.h"
10 #include "imstkKeyboardSceneControl.h"
11 #include "imstkLogger.h"
12 #include "imstkMeshIO.h"
13 #include "imstkMouseDeviceClient.h"
14 #include "imstkMouseSceneControl.h"
15 #include "imstkNew.h"
16 #include "imstkRenderMaterial.h"
17 #include "imstkScene.h"
18 #include "imstkSceneManager.h"
19 #include "imstkSceneObject.h"
20 #include "imstkSimulationManager.h"
21 #include "imstkSimulationUtils.h"
22 #include "imstkSurfaceMesh.h"
23 #include "imstkVisualModel.h"
24 #include "imstkVTKViewer.h"
25 
26 using namespace imstk;
27 
31 int
32 main()
33 {
34  // Write log to stdout and file
36 
37  imstkNew<Scene> scene("RenderingHead");
38  {
39  // Head mesh
40  auto surfaceMesh = MeshIO::read<SurfaceMesh>(iMSTK_DATA_ROOT "/head/head_revised.obj");
41 
42  imstkNew<RenderMaterial> material;
43  material->setDisplayMode(RenderMaterial::DisplayMode::Surface);
44  material->setShadingModel(RenderMaterial::ShadingModel::PBR);
45  material->addTexture(std::make_shared<Texture>(iMSTK_DATA_ROOT "head/HeadTexture_BaseColor.png", Texture::Type::Diffuse));
46  material->addTexture(std::make_shared<Texture>(iMSTK_DATA_ROOT "head/HeadTexture_Normal.png", Texture::Type::Normal));
47  material->addTexture(std::make_shared<Texture>(iMSTK_DATA_ROOT "head/HeadTexture_AO.png", Texture::Type::AmbientOcclusion));
48  material->setRecomputeVertexNormals(false);
49 
50  imstkNew<VisualModel> surfMeshModel;
51  surfMeshModel->setGeometry(surfaceMesh);
52  surfMeshModel->setRenderMaterial(material);
53 
54  imstkNew<SceneObject> headObject("head");
55  headObject->addVisualModel(surfMeshModel);
56 
57  scene->addSceneObject(headObject);
58 
59  // Position camera
60  scene->getActiveCamera()->setPosition(0.0, 0.25, 0.6);
61  scene->getActiveCamera()->setFocalPoint(0.0, 0.25, 0.0);
62 
63  // Lights
65  dirLight->setIntensity(10.0);
66  dirLight->setColor(Color(1.0, 0.95, 0.8));
67  scene->addLight("directionalLight", dirLight);
68  }
69 
70  // Run the simulation
71  {
72  // Setup a viewer to render in its own thread
73  imstkNew<VTKViewer> viewer;
74  viewer->setVtkLoggerMode(AbstractVTKViewer::VTKLoggerMode::MUTE);
75  viewer->setActiveScene(scene);
76 
77  // Setup a scene manager to advance the scene in its own thread
78  imstkNew<SceneManager> sceneManager;
79  sceneManager->setActiveScene(scene);
80  sceneManager->pause(); // Start simulation paused
81 
83  driver->addModule(viewer);
84  driver->addModule(sceneManager);
85 
86  // Add default mouse and keyboard controls to the viewer
87  std::shared_ptr<Entity> mouseAndKeyControls =
88  SimulationUtils::createDefaultSceneControl(driver);
89  scene->addSceneObject(mouseAndKeyControls);
90 
91  // Enable SSAO
92  Vec3d l, u;
93  scene->computeBoundingBox(l, u);
94  const double sceneSize = (u - l).norm();
95 
96  auto rendConfig = std::make_shared<RendererConfig>();
97  rendConfig->m_ssaoConfig.m_enableSSAO = true;
98  rendConfig->m_ssaoConfig.m_SSAOBlur = true;
99  rendConfig->m_ssaoConfig.m_SSAORadius = 10.0 * sceneSize;
100  rendConfig->m_ssaoConfig.m_SSAOBias = 0.01 * sceneSize;
101  rendConfig->m_ssaoConfig.m_KernelSize = 128;
102 
103  viewer->getActiveRenderer()->setConfig(rendConfig);
104 
105  driver->start();
106  }
107 
108  return 0;
109 }
void setActiveScene(std::shared_ptr< Scene > scene) override
Set scene to be rendered.
void setColor(const Color &c)
Set the light color.
Definition: imstkLight.h:61
Compound Geometry.
void addModule(std::shared_ptr< Module > module) override
Add a module to run.
void setIntensity(const double intensity)
Set the light intensity. This value is unbounded.
Definition: imstkLight.h:71
std::shared_ptr<T> obj = std::make_shared<T>(); equivalent, convenience class for STL shared allocati...
Definition: imstkNew.h:29
std::shared_ptr< Renderer > getActiveRenderer() const
Retrieve the renderer associated with the current scene.
Definition: imstkViewer.cpp:38
void setRenderMaterial(std::shared_ptr< RenderMaterial > renderMaterial)
Set/Get render material.
Color in RGB space.
Definition: imstkColor.h:24
void setActiveScene(std::string newSceneName)
Sets the currently updating scene.
Physically based rendering.
void setVtkLoggerMode(VTKLoggerMode loggerMode)
Set the logger mode.
static LoggerG3 & startLogger()
Starts logger with default sinks, use getInstance to create a logger with no sinks.