#ifndef MAGNUM_RENDER_H #define MAGNUM_RENDER_H #include #include #include #include #include #include #include #include #include #include #include #include "arc_ball_camera.h" using namespace Magnum; using Object3D = SceneGraph::Object; using Scene3D = SceneGraph::Scene; class GridDrawable : public SceneGraph::Drawable3D { public: explicit GridDrawable(Object3D &object, Shaders::Flat3D &shader, GL::Mesh &mesh, SceneGraph::DrawableGroup3D &drawables) : SceneGraph::Drawable3D{object, &drawables}, m_shader(shader), m_mesh(mesh) {} void draw(const Matrix4 &transformation, SceneGraph::Camera3D &camera); private: Shaders::Flat3D &m_shader; GL::Mesh &m_mesh; }; class SubjectDrawable : public SceneGraph::Drawable3D { public: explicit SubjectDrawable(Object3D &object, Shaders::Phong &shader, GL::Mesh &mesh, SceneGraph::DrawableGroup3D &drawables, int count, float hue, float t) : SceneGraph::Drawable3D{object, &drawables}, m_shader(shader), m_mesh(mesh), m_count(count), m_hue(hue), m_t(t) {} void draw(const Matrix4 &transformation, SceneGraph::Camera3D &camera); void count(int count); void hue(float hue); void t(float t); private: Shaders::Phong &m_shader; GL::Mesh &m_mesh; int m_count; float m_hue; float m_t; }; class MagnumRenderer { public: MagnumRenderer(); ~MagnumRenderer(); /** * @brief Called when Qt needs to resize/re-create FBO. */ void reset(Platform::GLContext *ctx, GL::Framebuffer fbo, Vector2i windowSize, Vector2i viewportSize); void render(); void t(float t); void hue(float hue); void count(int count); Containers::Optional& camera(); void lagging(float lagging); float lagging(); private: /** * @brief We need to delay initialization until we have valid OpenGL context. */ void lazyInitialize(); /** * @brief Reset OpenGL state to our desired state. */ void prepGLState(); bool m_init; Platform::GLContext *m_ctx{nullptr}; GL::Framebuffer m_FBO{NoCreate}; Scene3D m_scene; SceneGraph::DrawableGroup3D m_drawables; Containers::Optional m_camera; GL::Mesh m_subject{NoCreate}; Shaders::Phong m_subjectShader{NoCreate}; Object3D* m_subjectObject{nullptr}; SubjectDrawable* m_subjectDrawable{nullptr}; GL::Mesh m_grid{NoCreate}; Shaders::Flat3D m_gridShader{NoCreate}; Object3D* m_gridObject{nullptr}; GridDrawable* m_gridDrawable{nullptr}; }; #endif // MAGNUM_RENDER_H