VolViz
A volume visualization tool
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups
VisualizerImpl.h
Go to the documentation of this file.
1 #ifndef VolViz_VisualizerImpl_h
2 #define VolViz_VisualizerImpl_h
3 
4 #include "AtomicCache.h"
5 #include "GL/Binding.h"
6 #include "GL/Buffer.h"
7 #include "GL/Framebuffer.h"
8 #include "GL/GLFW.h"
9 #include "GL/Textures.h"
10 #include "GL/VertexArray.h"
11 #include "GeometryFactory.h"
12 #include "Shaders.h"
13 #include "Types.h"
14 
15 #include <Eigen/Core>
16 #include <Eigen/Geometry>
17 #include <VolViz/VolViz.h>
18 #include <concurrentqueue.h>
19 
20 #include <atomic>
21 #include <chrono>
22 #include <mutex>
23 #include <thread>
24 #include <unordered_map>
25 
26 namespace VolViz {
27 namespace Private_ {
28 
30  using InitQueueEntry =
31  std::pair<Visualizer::GeometryName, Geometry::UniquePtr>;
32  using GeometryList =
33  std::unordered_map<Visualizer::GeometryName, Geometry::UniquePtr>;
34  using GeometryInitQueue = moodycamel::ConcurrentQueue<InitQueueEntry>;
35 
36 public:
37  using Point2 = Eigen::Vector2f;
38  using Size2 = Eigen::Vector2f;
39  using Lights = std::unordered_map<Visualizer::LightName, Light>;
40 
42 
43  void start();
44 
45  void enableMultithreading() noexcept;
46 
47  void renderOneFrame(bool block = true);
48 
49  operator bool() const noexcept;
50 
51  void setVolume(VolumeDescriptor descriptor, span<float const> data);
52  void setVolume(VolumeDescriptor descriptor, span<Color const> data);
53 
54  Size3f volumeSize() const noexcept;
55 
56  template <class Descriptor,
57  typename = std::enable_if_t<std::is_base_of<
58  GeometryDescriptor, std::decay_t<Descriptor>>::value>>
59  inline void addGeometry(Visualizer::GeometryName name,
60  Descriptor const &descriptor) {
61  geometryInitQueue_.enqueue({name, geomFactory_.create(descriptor)});
62  }
63 
64  template <class Descriptor,
65  typename = std::enable_if_t<std::is_base_of<
66  GeometryDescriptor, std::decay_t<Descriptor>>::value>>
68  Descriptor &&descriptor) {
69  std::lock_guard<std::mutex> lock{geometriesMutex_};
70  auto search = geometries_.find(name);
71  if (search == geometries_.end()) {
72  // There are two reasons for not finding a geometry:
73  // 1. The geometry was not added (usage error). Nothing can be done to
74  // recover -> throw exception.
75  // 2. Multithreading is enabled, in this case the geometry might have
76  // been added but was not initialized, yet. In this case the user
77  // can repeat the update later -> return false.
78  if (multithreadingEnabled_) return false;
79  throw std::logic_error("Geometry " + name + " not found");
80  }
81 
82  search->second->enqueueUpdate(std::forward<Descriptor>(descriptor));
83  return true;
84  }
85 
87  inline Camera const &camera() const noexcept { return visualizer_->camera; }
88  inline Camera &camera() noexcept { return visualizer_->camera; }
89 
90  inline auto cameraClient() const noexcept { return camera().client(); }
91 
92  inline Shaders &shaders() noexcept { return shaders_; }
93 
95 
98  void drawSingleVertex() const noexcept;
99 
101  void bindVolume(GLuint unitIdx = 0) const noexcept;
102 
105  Eigen::Matrix4f textureTransformationMatrix() const noexcept;
106 
111  [this]() -> Length { return visualizer_->scale; }};
112 
119  [this]() -> Color { return visualizer_->backgroundColor; }};
120 
121 private:
122  friend class ::VolViz::Visualizer;
123 
124  using Clock = std::chrono::steady_clock;
125  using TimePoint = std::chrono::time_point<Clock>;
126  using GeometryNameAndPosition = struct {
129  float depth;
130  };
131 
133  enum class TextureID : std::size_t {
134  NormalsAndSpecular = 0,
135  Albedo = 1,
136  Depth = 2,
137  RenderedImage = 3,
138  FinalDepth = 4,
139  VolumeTexture = 5,
140  SelectionTexture = 6
141  };
142 
144  void setupFBOs();
145 
147  void setupSelectionBuffers();
148 
151  Position unproject(Position2 const &screenPoint, float depth) const noexcept;
152 
154  void handleKeyInput(int key, int scancode, int action, int mode);
155 
157  void renderGeometry();
158 
160  void updateGeometries();
161 
163  void renderGrid();
164 
166  void renderPoint(Position const &position, Color const &color, float size);
167 
169  void renderQuad(Point2 const &topLeft, Size2 const &size, TextureID texture,
170  GL::ShaderProgram &prog);
171 
174 
176  void renderLightingTextures();
177 
179  void renderLights();
180 
181  void renderAmbientLighting();
182  void renderDiffuseLighting();
183  void renderSpecularLighting();
184 
185  void renderLightDiffuse(Light const &light);
186 
187  void renderLightSpecular(Light const &light);
188 
190 
192 
193  void dragSelectedGeometry();
194 
196  void renderFinalPass();
197 
199  void renderBoundingBox(Position const &position,
200  Orientation const &orientation, Size3f const &size,
201  Color const &color);
202 
203  void renderVolumeBBox();
204 
205  void addLight(Visualizer::LightName name, Light const &light);
206 
209 
212 
213  struct DepthRange {
214  float near, far;
215  } depthRange_;
216 
218 
221 
223  struct TextureWrapper {
224  inline GLuint operator[](TextureID id) const noexcept {
225  return textures_.names[static_cast<std::size_t>(id)];
226  }
227 
228  private:
230  } textures_;
234 
237  using Buffers = std::array<GL::Buffer, 2>;
238  using Handle = Buffers::iterator;
239 
241  Handle readBuffer{buffers.begin()}, writeBuffer{buffers.begin() + 1};
242  inline void swap() noexcept {
243  using std::swap;
245  }
247 
251  std::mutex geometriesMutex_;
254 
257  struct SingleVertData {
261 
262  enum class ViewState {
263  Scene3D,
266  } viewState_{ViewState::Scene3D};
267 
268  bool inSelectionMode{false};
270  Position selectedPoint_{Position::Zero()};
271 
274  std::mutex lightMutex_;
275 
279  enum class MoveState {
280  None,
281  Rotating,
282  Dragging
284 
286  Position2 lastMousePos_ = Position2::Zero();
287  Position2 lastMouseDelta_ = Position2::Zero();
289 
291 
293 
295 };
296 
297 } // namespace Private_
298 } // namespace VolViz
299 
300 #endif // VolViz_VisualizerImpl_h
struct VolViz::Private_::VisualizerImpl::DepthRange depthRange_
enum VolViz::Private_::VisualizerImpl::MoveState moveState_
void start()
Definition: VisualizerImpl.cpp:334
GL::Textures< 7 > textures_
Definition: VisualizerImpl.h:229
MoveState
Definition: VisualizerImpl.h:279
void handleKeyInput(int key, int scancode, int action, int mode)
Key input handler.
Definition: VisualizerImpl.cpp:452
std::unordered_map< Visualizer::LightName, Light > Lights
Definition: VisualizerImpl.h:39
bool inSelectionMode
Definition: VisualizerImpl.h:268
std::pair< Visualizer::GeometryName, Geometry::UniquePtr > InitQueueEntry
Definition: VisualizerImpl.h:31
AtomicProperty< Color > backgroundColor
Definition: Visualizer.h:75
Lights lights_
Lights.
Definition: VisualizerImpl.h:273
void renderFullscreenQuad(TextureID texture, GL::ShaderProgram &quad)
Renders a textured fullscreen quad.
Definition: VisualizerImpl.cpp:815
GL::Framebuffer lightingFbo_
Definition: VisualizerImpl.h:233
GLboolean * data
Definition: glad.h:2184
Eigen::Quaternionf Orientation
6-DOF orientation, represented as a quaternion
Definition: Types.h:54
void renderLightSpecular(Light const &light)
GL::Framebuffer finalFbo_
Frabebuffer used for the deferred shading.
Definition: VisualizerImpl.h:232
GLsizei const GLfloat * value
Definition: glad.h:2544
void renderSpecularLighting()
Definition: VisualizerImpl.cpp:937
GLenum mode
Definition: glad.h:2088
void renderFinalPass()
Renders the final image to screen.
Definition: VisualizerImpl.cpp:667
GeometryList geometries_
Definition: VisualizerImpl.h:250
float far
Definition: VisualizerImpl.h:214
void swap() noexcept
Definition: VisualizerImpl.h:242
void addLight(Visualizer::LightName name, Light const &light)
Definition: VisualizerImpl.cpp:435
Position selectedPoint_
Definition: VisualizerImpl.h:270
GLint GLint GLsizei GLsizei GLsizei depth
Definition: glad.h:2276
Eigen::Matrix4f textureTransformationMatrix() const noexcept
Definition: VisualizerImpl.cpp:316
void renderGeometry()
Renders the geometry.
Definition: VisualizerImpl.cpp:551
void renderQuad(Point2 const &topLeft, Size2 const &size, TextureID texture, GL::ShaderProgram &prog)
Renderes a textured quad.
Definition: VisualizerImpl.cpp:821
unsigned int GLuint
Definition: glad.h:688
RAII wrapper for OpenGL framebuffer objects.
Definition: Framebuffer.h:11
RAII wrapper for OpenGL buffers.
Definition: Buffer.h:14
std::array< GL::Buffer, 2 > Buffers
Definition: VisualizerImpl.h:237
GeometryInitQueue geometryInitQueue_
Definition: VisualizerImpl.h:252
Shaders & shaders() noexcept
Definition: VisualizerImpl.h:92
Definition: VisualizerImpl.h:257
Definition: GeometryFactory.h:10
GLuint writeBuffer
Definition: glad.h:3899
struct VolViz::Private_::VisualizerImpl::SelectionBuffer selectionBuffer_
Eigen::Vector3f Position
Position in 3D euclidean space.
Definition: Types.h:21
std::uint16_t LightName
Definition: Visualizer.h:28
Shaders shaders_
Shader programs.
Definition: VisualizerImpl.h:220
struct VolViz::Private_::VisualizerImpl::TextureWrapper textures_
AtomicCache< Length > cachedScale
Definition: VisualizerImpl.h:110
GeometryPtr create(AxisAlignedPlaneDescriptor const &descriptor)
Definition: GeometryFactory.cpp:15
Private_::CameraClient client() const noexcept
Definition: Camera.cpp:5
GL::VertexArray vao
Definition: VisualizerImpl.h:259
RAII wrapper for OpenGL shader programs objects.
Definition: ShaderProgram.h:125
GLuint shader
Definition: glad.h:2427
Eigen::Vector3f Size3f
Definition: Types.h:31
void renderBoundingBox(Position const &position, Orientation const &orientation, Size3f const &size, Color const &color)
Renders a bounding box.
Definition: VisualizerImpl.cpp:682
Definition: Visualizer.h:23
std::chrono::steady_clock Clock
Definition: VisualizerImpl.h:124
Definition: Camera.h:20
Camera & camera() noexcept
Definition: VisualizerImpl.h:88
AtomicCache< Color > cachedBackgroundColor
Definition: VisualizerImpl.h:118
std::mutex geometriesMutex_
Definition: VisualizerImpl.h:251
GL::Buffer vBuff
Definition: VisualizerImpl.h:258
GLuint const GLchar * name
Definition: glad.h:2430
void updateGeometries()
Update the geometry.
Definition: VisualizerImpl.cpp:586
void attachVolumeToShader(GL::ShaderProgram &shader) const
Definition: VisualizerImpl.cpp:427
void setupFBOs()
Setup the required textures and frabebuffer objects for rendering.
Definition: VisualizerImpl.cpp:146
float near
Definition: VisualizerImpl.h:214
Handle readBuffer
Definition: VisualizerImpl.h:241
Position2 lastMouseDelta_
Definition: VisualizerImpl.h:287
Eigen::Vector3f Color
Normalized RGB color.
Definition: Types.h:40
moodycamel::ConcurrentQueue< InitQueueEntry > GeometryInitQueue
Definition: VisualizerImpl.h:34
void dragSelectedGeometry()
Definition: VisualizerImpl.cpp:788
Camera camera
The camera.
Definition: Visualizer.h:78
void addGeometry(Visualizer::GeometryName name, Descriptor const &descriptor)
Definition: VisualizerImpl.h:59
void renderLightDiffuse(Light const &light)
void setupSelectionBuffers()
Setup selection buffers.
Definition: VisualizerImpl.cpp:306
Definition: GeometryDescriptor.h:33
std::mutex lightMutex_
Definition: VisualizerImpl.h:274
void drawSingleVertex() const noexcept
Definition: VisualizerImpl.cpp:441
Visualizer * visualizer_
Definition: VisualizerImpl.h:210
Eigen::Vector2f Size2
Definition: VisualizerImpl.h:38
void renderLights()
Defferred shading lighing pass.
Definition: VisualizerImpl.cpp:849
GLenum GLuint id
Definition: glad.h:732
ViewState
Definition: VisualizerImpl.h:262
const GLuint * buffers
Definition: glad.h:2378
Eigen::Matrix< std::size_t, 2, 1 > Size2
Definition: Types.h:28
bool updateGeometry(Visualizer::GeometryName name, Descriptor &&descriptor)
Definition: VisualizerImpl.h:67
Definition: AtomicCache.h:22
VolumeDescriptor currentVolume_
Definition: VisualizerImpl.h:290
struct{Visualizer::GeometryName name GeometryNameAndPosition
Definition: VisualizerImpl.h:127
void setVolume(VolumeDescriptor descriptor, span< float const > data)
Definition: VisualizerImpl.cpp:343
float depth
Definition: VisualizerImpl.h:129
RAII wrapper for OpenGL vertex arrays.
Definition: VertexArray.h:11
GLuint color
Definition: glad.h:2834
Buffers buffers
Definition: VisualizerImpl.h:240
Definition: Volume.h:12
Size3f volumeSize() const noexcept
Definition: VisualizerImpl.cpp:405
void renderPoint(Position const &position, Color const &color, float size)
Renders a point.
Definition: VisualizerImpl.cpp:608
void enableMultithreading() noexcept
Definition: VisualizerImpl.cpp:336
void renderDiffuseLighting()
Definition: VisualizerImpl.cpp:895
GLuint texture
Definition: glad.h:2257
void renderAmbientLighting()
Definition: VisualizerImpl.cpp:876
Eigen::Vector2f Point2
Definition: VisualizerImpl.h:37
Definition: VisualizerImpl.h:29
GLsizeiptr size
Definition: glad.h:2387
phys::units::quantity< phys::units::length_d > Length
Definition: Types.h:64
Eigen::Vector2f Position2
Position in 2D space.
Definition: Types.h:26
VisualizerImpl(Visualizer *vis)
Definition: VisualizerImpl.cpp:22
GL::GLFW glfw_
Definition: VisualizerImpl.h:217
std::unordered_map< Visualizer::GeometryName, Geometry::UniquePtr > GeometryList
Definition: VisualizerImpl.h:33
bool multithreadingEnabled_
Definition: VisualizerImpl.h:292
auto cameraClient() const noexcept
Definition: VisualizerImpl.h:90
TextureID
IDs for the auxiliary textures used for the deferred rendering.
Definition: VisualizerImpl.h:133
Position unproject(Position2 const &screenPoint, float depth) const noexcept
GeometryNameAndPosition getGeometryUnderCursor()
Definition: VisualizerImpl.cpp:723
AtomicProperty< Length > scale
Definition: Visualizer.h:74
std::chrono::time_point< Clock > TimePoint
Definition: VisualizerImpl.h:125
void renderGrid()
Renders a grid.
Definition: VisualizerImpl.cpp:590
RAII wrapper for GLFW.
Definition: GLFW.h:25
Camera const & camera() const noexcept
Convenience method for easy camera access.
Definition: VisualizerImpl.h:87
Directional light.
Definition: Light.h:9
std::string GeometryName
Definition: Visualizer.h:29
void renderVolumeBBox()
Definition: VisualizerImpl.cpp:708
Visualizer::GeometryName selectedGeometry_
Definition: VisualizerImpl.h:269
struct VolViz::Private_::VisualizerImpl::SingleVertData singleVertexData_
void renderOneFrame(bool block=true)
Definition: VisualizerImpl.cpp:487
Definition: VisualizerImpl.h:213
void renderSelectionIndexTexture()
Definition: VisualizerImpl.cpp:653
GLenum GLenum GLsizei void GLsizei void void * span
Definition: glad.h:4220
void bindVolume(GLuint unitIdx=0) const noexcept
Bind the volume texture to texture unit i.
Definition: VisualizerImpl.cpp:447
Position2 lastMousePos_
Last position of the mouse cursor, used in the camera control code.
Definition: VisualizerImpl.h:286
Definition: Shaders.h:15
void renderLightingTextures()
Renders all textures of the deferred lighting pass.
Definition: VisualizerImpl.cpp:633
GeometryFactory geomFactory_
Definition: VisualizerImpl.h:211
std::array< GLuint, N > names
Definition: Textures.h:34
Position position
Definition: VisualizerImpl.h:128
Buffers::iterator Handle
Definition: VisualizerImpl.h:238
GLuint operator[](TextureID id) const noexcept
Definition: VisualizerImpl.h:224
Pixel buffers used for mouse picking.
Definition: VisualizerImpl.h:236
Auxiliary textures use in the deferred shading process.
Definition: VisualizerImpl.h:223