/*
QGLView
Ivan Pelipenko peri4ko@yandex.ru
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with this program. If not, see .
*/
#ifndef QGLVIEW_H
#define QGLVIEW_H
#include "glcamera.h"
#include "glframebuffer.h"
#include "glprimitives.h"
#include "glscene.h"
#include "mouse_controller.h"
#include "openglwindow.h"
#include "qglengine_core_export.h"
#include "qglview_settings.h"
#include "renderer.h"
#include
#include
class QGLENGINE_CORE_EXPORT QGLView
: public OpenGLWindow
, public ParameteredObject {
friend class Renderer;
friend class RendererSelection;
Q_OBJECT
Q_PROPERTY(float lineWidth READ lineWidth WRITE setLineWidth)
Q_PROPERTY(float FOV READ FOV WRITE setFOV)
Q_PROPERTY(float depthStart READ depthStart WRITE setDepthStart)
Q_PROPERTY(float gamma READ gamma WRITE setGamma)
Q_PROPERTY(bool autoExposure READ autoExposure WRITE setAutoExposure)
Q_PROPERTY(QColor fogColor READ fogColor WRITE setFogColor)
Q_PROPERTY(float fogDensity READ fogDensity WRITE setFogDensity)
Q_PROPERTY(float fogDecay READ fogDecay WRITE setFogDecay)
Q_PROPERTY(int renderMode READ renderMode WRITE setRenderMode)
Q_PROPERTY(bool grabMouse READ isGrabMouseEnabled WRITE setGrabMouseEnabled)
Q_PROPERTY(bool mouseRotate READ isMouseRotateEnabled WRITE setMouseRotateEnabled)
Q_PROPERTY(bool mouseSelection READ isMouseSelectionEnabled WRITE setMouseSelectionEnabled)
Q_PROPERTY(bool cameraOrbit READ isCameraOrbit WRITE setCameraOrbit)
Q_PROPERTY(bool hoverHalo READ isHoverHaloEnabled WRITE setHoverHaloEnabled)
Q_PROPERTY(QColor hoverHaloColor READ hoverHaloColor WRITE setHoverHaloColor)
Q_PROPERTY(float hoverHaloFillAlpha READ hoverHaloFillAlpha WRITE setHoverHaloFillAlpha)
Q_PROPERTY(bool selectionHalo READ isSelectionHaloEnabled WRITE setSelectionHaloEnabled)
Q_PROPERTY(QColor selectionHaloColor READ selectionHaloColor WRITE setSelectionHaloColor)
Q_PROPERTY(float selectionHaloFillAlpha READ selectionHaloFillAlpha WRITE setSelectionHaloFillAlpha)
Q_PROPERTY(Qt::MouseButton selectionButton READ selectionButton WRITE setSelectionButton)
Q_PROPERTY(Qt::KeyboardModifier selectionModifier READ selectionModifier WRITE setSelectionModifier)
Q_PROPERTY(Scene::SelectionMode selectionMode READ selectionMode WRITE setSelectionMode)
Q_PROPERTY(QSize textureMapSize READ textureMapSize WRITE setTextureMapSize)
Q_PROPERTY(QSize shadowMapSize READ shadowMapSize WRITE setShadowMapSize)
Q_PROPERTY(int softShadowsSamples READ softShadowsSamples WRITE setSoftShadowsSamples)
Q_PROPERTY(float softShadowsQuality READ softShadowsQuality WRITE setSoftShadowsQuality)
Q_PROPERTY(bool softShadows READ softShadows WRITE setSoftShadows)
public:
QGLView();
virtual ~QGLView();
enum CameraLightMode {
clmOff,
clmAuto,
clmOn,
};
enum RenderMode {
rmPoint = GL_POINT,
rmLine = GL_LINE,
rmFill = GL_FILL
};
Q_ENUM(CameraLightMode)
void stop();
void start(float freq = 0.);
float lineWidth() const { return settings.lineWidth; }
float FOV() const { return settings.FOV; }
float depthStart() const { return settings.depthStart; }
float currentFPS() const { return fps_; }
float gamma() const { return settings.gamma; }
bool autoExposure() const { return settings.autoExposure; }
int maxAnisotropicLevel() const { return max_anisotropic; }
QString environmentMapFile() const { return renderer_.tex_env.fileHDR(); }
bool FXAA() const { return settings.FXAA; }
void setFXAA(bool on) { settings.FXAA = on; }
QColor fogColor() const { return settings.fogColor; }
float fogDensity() const { return settings.fogDensity; }
float fogDecay() const { return settings.fogDecay; }
bool isGrabMouseEnabled() const { return mouse.isGrabMouseEnabled(); }
bool isMouseRotateEnabled() const { return mouse.isMouseRotateEnabled(); }
bool isMouseSelectionEnabled() const { return mouse.isMouseSelectionEnabled(); }
bool isCameraOrbit() const { return mouse.isCameraOrbit(); }
bool isHoverHaloEnabled() const { return settings.hoverHalo; }
QColor hoverHaloColor() const { return settings.hoverHaloColor; }
float hoverHaloFillAlpha() const { return settings.hoverHaloFill; }
bool isSelectionHaloEnabled() const { return settings.selectionHalo; }
QColor selectionHaloColor() const { return settings.selectionHaloColor; }
float selectionHaloFillAlpha() const { return settings.selectionHaloFill; }
int renderMode() const { return settings.render_mode; }
void setRenderMode(int mode) { settings.render_mode = mode; }
bool isServiceMode() const { return renderer_.edit_mode; }
void setServiceMode(bool yes) { renderer_.edit_mode = yes; }
Scene::SelectionMode selectionMode() const { return scene_->selectionMode(); }
Qt::MouseButton selectionButton() const { return mouse.selectionButton(); }
Qt::KeyboardModifier selectionModifier() const { return mouse.selectionModifier(); }
void setSelectionMode(Scene::SelectionMode m) { scene_->setSelectionMode(m); }
void setSelectionButton(Qt::MouseButton v) { mouse.setSelectionButton(v); }
void setSelectionModifier(Qt::KeyboardModifier v) { mouse.setSelectionModifier(v); }
void selectObject(ObjectBase * o, bool add_to_selection = false) { scene_->selectObject(o, add_to_selection); }
void clearSelection() { scene_->clearSelection(); }
ObjectBaseList selectedObjects(bool top_only = false) const { return scene_->selectedObjects(top_only); }
QList selectedLights() const;
QList selectedCameras() const;
ObjectBase * selectedObject() const { return scene_->selectedObject(); }
TextureManager * textureManager() { return renderer_.textures_manager; }
void reloadTextures();
Scene * scene() { return scene_; }
void focusOn(const Box3D & bb);
void setCameraLightMode(CameraLightMode m) { renderer_.setCameraLightMode(m); }
CameraLightMode cameraLightMode() const { return (CameraLightMode)renderer_.cameraLightMode(); }
Camera * camera() { return camera_; }
const Camera * camera() const { return camera_; }
void setCamera(Camera * camera) { camera_ = camera; }
void setDefaultCamera() { camera_ = default_camera; }
bool isDefaultCamera() const { return camera_ == default_camera; }
QByteArray saveCamera();
void restoreCamera(const QByteArray & ba);
QImage materialThumbnail(Material * m) { return renderer_.materialThumbnail(m); }
void setCurrentAction(RendererService::HandleAction ha) { renderer_.rend_service.setCurrentAction(ha); }
void setContextActions(QList al) {
context_menu.clear();
context_menu.addActions(al);
}
void popupMenu(const QPoint & pos, QAction * at = nullptr) { context_menu.popup(pos, at); }
void setGrabImage(bool on) { grab_formats.setFlag(Renderer::gfImage, on); }
void setGrabImageF(bool on) { grab_formats.setFlag(Renderer::gfFloat, on); }
QFlags grabFormats() const { return grab_formats; }
void setGrabFormats(QFlags f) { grab_formats = f; }
QImage getImage() const { return renderer_.getImage(); }
QVector getImageF() const { return renderer_.getImageF(); }
void setGrabImageMipmap(int level) { renderer_.grab_mipmap = level; }
void setGrabImageFMipmap(int level) { renderer_.grab_mipmap_f = level; }
void setShadowMapSize(QSize sz) { shadow_map_size = sz; }
void setTextureMapSize(QSize sz);
QSize shadowMapSize() const { return shadow_map_size; }
QSize textureMapSize() const { return renderer_.maps_size; }
void setFramebufferSize(QSize sz) { framebuffer_size = sz; }
void resetFramebufferSize() { framebuffer_size = QSize(); }
QSize framebufferSize() const { return framebuffer_size; }
QSize actualFramebufferSize() const;
int softShadowsSamples() const { return settings.soft_shadows_samples; }
void setSoftShadowsSamples(int s) { settings.soft_shadows_samples = s; }
float softShadowsQuality() const { return settings.soft_shadows_quality; }
void setSoftShadowsQuality(float s) { settings.soft_shadows_quality = s; }
bool softShadows() const { return settings.soft_shadows; }
void setSoftShadows(bool on) { settings.soft_shadows = on; }
bool shadows() const { return settings.shadows; }
void setShadows(bool on) { settings.shadows = on; }
QByteArray saveSetting() const;
void loadSetting(QByteArray data);
GLfloat aspect, iaspect;
Renderer renderer_;
protected:
void render();
void resizeEvent(QResizeEvent * e);
void timerEvent(QTimerEvent *);
void initialize();
void resizeGL(int width, int height);
void mousePressEvent(QMouseEvent * e) { mouse.mousePressEvent(e); }
void mouseMoveEvent(QMouseEvent * e) { mouse.mouseMoveEvent(e); }
void mouseReleaseEvent(QMouseEvent * e) { mouse.mouseReleaseEvent(e); }
void wheelEvent(QWheelEvent * e) { mouse.wheelEvent(e); }
void mouseDoubleClickEvent(QMouseEvent * e) { mouse.mouseDoubleClickEvent(e); }
void leaveEvent(QEvent *);
void keyPressEvent(QKeyEvent * e);
void keyReleaseEvent(QKeyEvent * e);
void focusOutEvent(QFocusEvent *);
void checkCaps();
private:
void processKeys();
bool setupViewport();
Scene * scene_;
Camera *camera_, *default_camera;
MouseController mouse;
QMenu context_menu;
QSet keys_;
QElapsedTimer time;
GLint max_anisotropic = 1, max_texture_chanels = 8;
QFlags grab_formats;
QSize prev_size, shadow_map_size, framebuffer_size;
QGLViewSettings settings;
float fps_ = 0.f, fps_tm = 0.f;
float m_motionBlurFactor = 1.f;
int timer = 0, fps_cnt = 0, sh_id_loc = 0;
bool shaders_bind = false;
bool is_init = false;
private slots:
void __destroyed();
void __objectDeleted(ObjectBase * o);
public slots:
void setLineWidth(const float & arg) { settings.lineWidth = arg; }
void setFOV(const float & arg) { settings.FOV = arg; }
void setDepthStart(const float & arg) { settings.depthStart = arg; }
void setGamma(const float & arg) { settings.gamma = arg; }
void setAutoExposure(bool arg) { settings.autoExposure = arg; }
void setEnvironmentMapFile(QString file) {
renderer_.tex_env.setFileHDR(file);
renderer_.recreateMaterialThumbnails(true);
}
void setFogColor(const QColor & arg) { settings.fogColor = arg; }
void setFogDensity(const float & arg) { settings.fogDensity = arg; }
void setFogDecay(const float & arg) { settings.fogDecay = arg; }
void setGrabMouseEnabled(const bool & arg) { mouse.setGrabMouseEnabled(arg); }
void setMouseRotateEnabled(const bool & arg) { mouse.setMouseRotateEnabled(arg); }
void setMouseSelectionEnabled(const bool & arg) { mouse.setMouseSelectionEnabled(arg); }
void setCustomMouseMove(const bool & arg) { mouse.setCustomMouseMove(arg); }
void setCameraOrbit(const bool & arg) { mouse.setCameraOrbit(arg); }
void setHoverHaloEnabled(const bool & arg) { settings.hoverHalo = arg; }
void setHoverHaloColor(const QColor & arg) { settings.hoverHaloColor = arg; }
void setHoverHaloFillAlpha(const float & arg) { settings.hoverHaloFill = arg; }
void setSelectionHaloEnabled(const bool & arg) { settings.selectionHalo = arg; }
void setSelectionHaloColor(const QColor & arg) { settings.selectionHaloColor = arg; }
void setSelectionHaloFillAlpha(const float & arg) { settings.selectionHaloFill = arg; }
void reloadShaders() { renderer_.reloadShaders(); }
signals:
void glBeginPaint();
void glEndPaint();
void glKeyPressEvent(QKeyEvent * e);
void glKeyReleaseEvent(QKeyEvent * e);
void glMousePressEvent(QMouseEvent * e);
void glMouseMoveEvent(QMouseEvent * e);
void glMouseReleaseEvent(QMouseEvent * e);
void glWheelEvent(QWheelEvent * e);
void glResize(int, int);
void glInitializeDone();
void cameraPosChanged(QVector3D pos);
void keyEvent(Qt::Key key, Qt::KeyboardModifiers mod);
void customMouseMoveEvent(QPoint curpos, QPoint lastpos, Qt::MouseButtons buttons);
void hoverChanged(ObjectBase * cur, ObjectBase * prev);
void selectionChanged();
void objectsPositionChanged();
void materialsChanged();
void materialThumbnailCreated(Material *);
void doubleClick();
void settingsLoaded();
};
#endif // QGLVIEW_H