Allolib  1.0
C++ Components For Interactive Multimedia
al_OmniRendererDomain.hpp
1 #ifndef INCLUDE_OMNIRENDER_HPP
2 #define INCLUDE_OMNIRENDER_HPP
3 
4 #include <iostream>
5 
6 #include "al/app/al_OpenGLGraphicsDomain.hpp"
7 #include "al/graphics/al_Graphics.hpp"
8 #include "al/sphere/al_PerProjection.hpp"
9 #include "al/sphere/al_SphereUtils.hpp"
10 
11 namespace al {
12 
20 public:
22  // Domain functions
23  bool init(ComputationDomain *parent = nullptr) override;
24 
25  bool tick() override;
26 
27  bool cleanup(ComputationDomain *parent = nullptr) override;
28 
29  std::function<void()> preOnDraw = [this]() {
30  mGraphics->framebuffer(FBO::DEFAULT);
31  mGraphics->viewport(0, 0, mWindow->fbWidth(), mWindow->fbHeight());
32  mGraphics->resetMatrixStack();
33  mGraphics->camera(mView);
34  mGraphics->color(1, 1, 1);
35  };
36 
37  virtual void onNewFrame() {
38  mNav.smooth(std::pow(0.0001, mTimeDrift));
39  mNav.step(mTimeDrift * mParent->fps());
40  }
41 
42  std::function<void(Graphics &)> onDraw = [](Graphics &) {};
43 
44  std::function<void()> postOnDraw = []() {};
45 
46  Viewpoint &view() { return mView; }
47  const Viewpoint &view() const { return mView; }
48 
49  Nav &nav() { return mNav; }
50  // Nav& nav() { return mNav; }
51  const Nav &nav() const { return mNav; }
52 
53  NavInputControl &navControl() { return mNavControl; }
54 
55  Window &window() { return *mWindow; }
56 
57  Graphics &graphics() { return *mGraphics; }
58 
59  // omni-stereo related functions
60  void stereo(bool b);
61 
62  void toggleStereo() { stereo(!render_stereo); }
63  void omniResolution(int res) { pp_render.update_resolution(res); }
64  int omniResolution() { return pp_render.res_; }
65 
66  // only for testing with desktop mode, loops (mono -> left -> right)
67  void loopEyeForDesktopMode();
68 
69  // only for testing with desktop mode, -1 for mono, 0: left, 1: right
70  void setEyeToRenderForDesktopMode(int eye);
71 
72  // omni functionality, impl below out-of-line
73  void spanAllDesktop();
74  void loadPerProjectionConfiguration(bool desktop = true);
75  void drawUsingPerProjectionCapture();
76 
77  // OmniRenderer
78  PerProjectionRender pp_render;
79  bool render_stereo = true;
80  bool running_in_sphere_renderer = false;
81  bool window_is_stereo_buffered = false;
82  int eye_to_render = -1; // -1 for mono, 0: left, 1: right
83 
85  bool drawOmni{true};
86  Lens mLens;
87  // Pose mPose;
88 
89 private:
90  std::unique_ptr<Window> mWindow;
91 
92  std::unique_ptr<Graphics> mGraphics;
93 
94  OpenGLGraphicsDomain *mParent;
95 
96  Nav mNav; // is a Pose itself and also handles manipulation of pose
97  Viewpoint mView{mNav.transformed()}; // Pose with Lens and acts as camera
98  NavInputControl mNavControl{mNav}; // interaction with keyboard and mouse
99 };
100 } // namespace al
101 
102 #endif
ComputationDomain class.
GLFWOpenGLOmniRendererDomain class.
bool cleanup(ComputationDomain *parent=nullptr) override
cleanup
bool init(ComputationDomain *parent=nullptr) override
initialize
bool tick() override
Execute a pass of the domain.
bool drawOmni
Set this to false to render a regular view instead of omni.
Pose & transformed()
Get transformed pose.
void step(double dt=1)
Accumulate pose based on velocity.
double smooth() const
Get smoothing amount.
OpenGLGraphicsDomain class.
Viewpoint within a scene.
Definition: al_App.hpp:23