Files
noggit-red/src/noggit/ui/tools/PreviewRenderer/PreviewRenderer.hpp

129 lines
3.5 KiB
C++

#ifndef NOGGIT_PREVIEWRENDERER_HPP
#define NOGGIT_PREVIEWRENDERER_HPP
#include <noggit/Camera.hpp>
#include <noggit/WMOInstance.h>
#include <noggit/ModelInstance.h>
#include <noggit/WMO.h>
#include <noggit/Model.h>
#include <noggit/ContextObject.hpp>
#include <noggit/BoolToggleProperty.hpp>
#include <noggit/ui/tools/ViewportManager/ViewportManager.hpp>
#include <noggit/rendering/Primitives.hpp>
#include "noggit/rendering/LiquidTextureManager.hpp"
#include <QOpenGLWidget>
#include <QSettings>
#include <QOpenGLContext>
#include <QOpenGLFramebufferObjectFormat>
#include <QOffscreenSurface>
#include <QPixmap>
#include <vector>
namespace Noggit::Ui::Tools
{
class PreviewRenderer : public Noggit::Ui::Tools::ViewportManager::Viewport
{
Q_OBJECT
public:
explicit PreviewRenderer(int width, int height, Noggit::NoggitRenderContext context, QWidget* parent = nullptr);
void resetCamera(float x = 0.f, float y = 0.f, float z = 0.f, float roll = 0.f, float yaw = 120.f, float pitch = 20.f);
QPixmap* renderToPixmap();
virtual void setModel(std::string const& filename);
void setModelOffscreen(std::string const& filename);
virtual void setPrefab(std::string const& filename) {};
void setLightDirection(float y, float z);
BoolToggleProperty _draw_models = {true};
BoolToggleProperty _draw_wmo = {true};
BoolToggleProperty _draw_particles = {true};
BoolToggleProperty _draw_animated = {true};
BoolToggleProperty _draw_boxes = {false};
BoolToggleProperty _draw_grid = {false};
~PreviewRenderer();
protected:
bool _offscreen_mode = true;
Noggit::Camera _camera;
QSettings* _settings;
std::string _filename;
std::unique_ptr<OpenGL::program> _m2_program;
std::unique_ptr<OpenGL::program> _m2_instanced_program;
std::unique_ptr<OpenGL::program> _m2_particles_program;
std::unique_ptr<OpenGL::program> _m2_ribbons_program;
std::unique_ptr<OpenGL::program> _m2_box_program;
std::unique_ptr<OpenGL::program> _wmo_program;
std::unique_ptr<OpenGL::program> _liquid_program;
std::vector<ModelInstance> _model_instances;
std::vector<WMOInstance> _wmo_instances;
Noggit::Rendering::Primitives::Grid _grid;
float _animtime = 0.f;
bool _destroying = false;
std::vector<glm::vec3> calcSceneExtents();
virtual void draw();
virtual void tick(float dt);
virtual glm::mat4x4 model_view() const;
virtual glm::mat4x4 projection() const;
virtual float aspect_ratio() const;
void update_emitters(float dt);
void upload();
void unload();
void unloadOpenglData() override;
void updateLightingUniformBlock();
void updateMVPUniformBlock(const glm::mat4x4& model_view, const glm::mat4x4& projection);
private:
int _width;
int _height;
std::map<std::tuple<std::string, int, int>, QPixmap> _cache;
QOpenGLContext _offscreen_context;
QOpenGLFramebufferObjectFormat _fmt;
QOffscreenSurface _offscreen_surface;
glm::vec3 _background_color;
glm::vec3 _diffuse_light;
glm::vec3 _ambient_light;
glm::vec3 _light_dir;
OpenGL::Scoped::deferred_upload_buffers<2> _buffers;
GLuint const& _mvp_ubo = _buffers[0];
GLuint const& _lighting_ubo = _buffers[1];
OpenGL::MVPUniformBlock _mvp_ubo_data;
OpenGL::LightingUniformBlock _lighting_ubo_data;
Noggit::Rendering::LiquidTextureManager _liquid_texture_manager;
bool _uploaded = false;
bool _lighting_needs_update = true;
};
}
#endif //NOGGIT_PREVIEWRENDERER_HPP