/* 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 "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(bool fogEnabled READ isFogEnabled WRITE setFogEnabled) 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 lineWidth_; } float FOV() const { return camera()->FOV(); } float depthStart() const { return camera()->depthStart(); } float currentFPS() const { return fps_; } float gamma() const { return renderer_.gamma_; } bool autoExposure() const { return renderer_.tone_proc.enabled; } int maxAnisotropicLevel() const { return max_anisotropic; } QString environmentMapFile() const { return renderer_.tex_env.fileHDR(); } bool FXAA() const { return FXAA_; } void setFXAA(bool on) { FXAA_ = on; } QColor fogColor() const { return fogColor_; } float fogDensity() const { return fogDensity_; } float fogDecay() const { return fogDecay_; } bool isFogEnabled() const { return fogEnabled_; } bool isLightEnabled() const { return lightEnabled_; } 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 hoverHalo_; } QColor hoverHaloColor() const { return hoverHaloColor_; } float hoverHaloFillAlpha() const { return hoverHaloFill_; } bool isSelectionHaloEnabled() const { return selectionHalo_; } QColor selectionHaloColor() const { return selectionHaloColor_; } float selectionHaloFillAlpha() const { return selectionHaloFill_; } int renderMode() const { return (int)render_mode; } void setRenderMode(int mode) { render_mode = (RenderMode)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); void setGrabImageFMipmap(int level); void setShadowMapSize(QSize sz); void setTextureMapSize(QSize sz); QSize shadowMapSize() const; QSize textureMapSize() const; 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 soft_shadows_samples; } void setSoftShadowsSamples(int s) { soft_shadows_samples = s; } float softShadowsQuality() const { return soft_shadows_quality; } void setSoftShadowsQuality(float s) { soft_shadows_quality = s; } bool softShadows() const { return soft_shadows; } void setSoftShadows(bool on) { soft_shadows = on; } bool shadows() const { return shadows_; } void setShadows(bool on) { shadows_ = on; } 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_; QColor fogColor_, hoverHaloColor_, selectionHaloColor_; QElapsedTimer time; GLint max_anisotropic, max_texture_chanels; RenderMode render_mode; QFlags grab_formats; QSize prev_size, shadow_map_size, framebuffer_size; float lineWidth_, soft_shadows_quality; float fps_, fps_tm, fogDensity_, fogDecay_; float hoverHaloFill_, selectionHaloFill_, m_motionBlurFactor; int timer, fps_cnt, sh_id_loc, soft_shadows_samples; bool fogEnabled_, lightEnabled_, FXAA_; bool shaders_supported, shaders_bind; bool hoverHalo_, selectionHalo_; bool is_init, shadows_, soft_shadows; private slots: void __destroyed(); void __objectDeleted(ObjectBase * o); public slots: void setLineWidth(const float & arg) { lineWidth_ = arg; } void setFOV(const float & arg) { camera()->setFOV(arg); } void setDepthStart(const float & arg) { camera()->setDepthStart(arg); } void setGamma(const float & arg) { renderer_.gamma_ = arg; } void setAutoExposure(bool arg) { renderer_.tone_proc.enabled = arg; } void setEnvironmentMapFile(QString file) { renderer_.tex_env.setFileHDR(file); renderer_.recreateMaterialThumbnails(true); } void setFogColor(const QColor & arg) { fogColor_ = arg; } void setFogDensity(const float & arg) { fogDensity_ = arg; } void setFogDecay(const float & arg) { fogDecay_ = arg; } void setFogEnabled(const bool & arg) { fogEnabled_ = arg; } void setLightEnabled(const bool & arg) { lightEnabled_ = 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) { hoverHalo_ = arg; } void setHoverHaloColor(const QColor & arg) { hoverHaloColor_ = arg; } void setHoverHaloFillAlpha(const float & arg) { hoverHaloFill_ = arg; } void setSelectionHaloEnabled(const bool & arg) { selectionHalo_ = arg; } void setSelectionHaloColor(const QColor & arg) { selectionHaloColor_ = arg; } void setSelectionHaloFillAlpha(const float & arg) { 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(); }; #endif // QGLVIEW_H