RayMarching  0.0.1
Simple 3D engine based on a ray marching rendering
Camera.h
1 #ifndef RAYMARCHING_CAMERA_H
2 #define RAYMARCHING_CAMERA_H
3 
4 #include <cmath>
5 #include "memory"
6 #include "scene.h"
7 #include "models3.h"
8 #include "const.h"
9 #include "algebra.h"
10 #include "syncqueue.h"
11 #include "controlnum.h"
12 #include "settings.h"
13 #include <thread>
14 #include <utility>
15 #include <vector>
16 #include <Eigen/Dense>
17 
18 namespace RayMarching {
19 
20  using pixel = unsigned char;
25  class Camera {
26  protected:
30  enum class CameraCommands {
31  GENERATE,
32  DRAW
33  };
34  const static color_t BACKGROUND;
35  private:
36  using command_pair = std::pair<Camera::CameraCommands, unsigned int>;
37  const Settings_t _settings;
38  const unsigned int _awaitFor;
39  const unsigned int _jumpDist;
40  bool _terminate = false;
41  bool _evenFrame;
42  pixel *_buffer;
43  Eigen::Vector3d _localization;
44  Eigen::Vector3d _forward;
45  Eigen::Vector3d _upward;
46  Eigen::Vector3d _right;
47  Line **_rays;
48  std::shared_ptr<Scene> _scene;
49  std::vector<std::thread> _drones;
51  ControlNum _cn;
52 
53  public:
60  Camera(const Eigen::Vector3d &localization, const Eigen::Vector3d &direction, const Eigen::Vector3d &up)
61  : Camera(localization, direction, up, Settings_t()) {}
62 
70  Camera(const Eigen::Vector3d &localization, const Eigen::Vector3d &direction, const Eigen::Vector3d &up, Settings_t set);
71 
75  ~Camera();
76 
81  std::shared_ptr<Scene> getScene() { return _scene; }
82 
87  pixel *takePhoto();
88 
95  void setCamera(const Eigen::Vector3d &localization, const Eigen::Vector3d &direction, const Eigen::Vector3d &up);
96 
97  private:
98 
102  [[noreturn]] void threadHandler();
103 
110  [[nodiscard]] Line generateRay(unsigned int x, unsigned int y) const;
111 
119  [[nodiscard]] color_t handleRay(Line& ray, color_t color = BLACK, unsigned int reflection = 0) const;
120 
121  inline
122  void applyColor(const unsigned int &x, const unsigned int &y, const color_t &c);
123  protected:
129  };
130 }
131 
132 
133 #endif //RAYMARCHING_CAMERA_H
Class representing camera object.
Definition: Camera.h:25
std::shared_ptr< Scene > getScene()
Definition: Camera.h:81
Camera(const Eigen::Vector3d &localization, const Eigen::Vector3d &direction, const Eigen::Vector3d &up, Settings_t set)
~Camera()
Definition: Camera.cpp:28
CameraCommands
Definition: Camera.h:30
pixel * takePhoto()
Definition: Camera.cpp:105
void applyCommand(Camera::CameraCommands cmd)
Definition: Camera.cpp:121
static const color_t BACKGROUND
Definition: Camera.h:34
void setCamera(const Eigen::Vector3d &localization, const Eigen::Vector3d &direction, const Eigen::Vector3d &up)
Definition: Camera.cpp:110
Camera(const Eigen::Vector3d &localization, const Eigen::Vector3d &direction, const Eigen::Vector3d &up)
Definition: Camera.h:60
Atomic unsigned int with condition variable waiter.
Definition: controlnum.h:13
Marching Ray implementation.
Definition: algebra.h:14
Namespace containing all tools implemented within RayMarching package.
Definition: algebra.h:9
constexpr color_t BLACK
Definition: colors.h:32
Container for const Camera Settings.
Definition: settings.h:13
3 byte color representation structure
Definition: colors.h:11