/* 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 "glframebuffer.h" #include "glparticles_system.h" #include "glprimitives.h" #include "glrendererbase.h" #include "openglwindow.h" #include #include class QGLView : public OpenGLWindow , public QGLViewBase { friend class GLRendererBase; friend class GLObjectBase; Q_OBJECT Q_PROPERTY(QColor backColor READ backColor WRITE setBackColor) 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 depthEnd READ depthEnd WRITE setDepthEnd) Q_PROPERTY(QColor ambientColor READ ambientColor WRITE setAmbientColor) Q_PROPERTY(QColor fogColor READ fogColor WRITE setFogColor) Q_PROPERTY(float fogDensity READ fogDensity WRITE setFogDensity) Q_PROPERTY(float fogStart READ fogStart WRITE setFogStart) Q_PROPERTY(float fogEnd READ fogEnd WRITE setFogEnd) Q_PROPERTY(FogMode fogMode READ fogMode WRITE setFogMode) Q_PROPERTY(bool fogEnabled READ isFogEnabled WRITE setFogEnabled) 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(SelectionMode selectionMode READ selectionMode WRITE setSelectionMode) public: QGLView(); virtual ~QGLView(); enum FogMode { Linear = GL_LINEAR, Exp = GL_EXP, Exp2 = GL_EXP2 }; enum SelectionMode { NoSelection, SingleSelection, MultiSelection }; enum Feature { qglMSAA, qglFXAA, qglLinearFiltering, qglAnisotropicLevel, qglHDR, qglEyeAccomodationEnabled, qglEyeAccomodationTime, qglEyeAccomodationMaxSpeed, qglBloomEnabled, qglBloomThreshold, qglBloomFactor, qglBloomRadius, qglMotionBlurEnabled, qglMotionBlurFactor, qglMotionBlurSteps, qglShadowsEnabled, qglShadowsMapSize, qglShadowsSoftEnabled, qglReflectionsEnabled, qglReflectionsBlur, qglSSAOEnabled, qglSSAORadius, qglDepthOfFieldEnabled, qglDepthOfFieldAutoFocusEnabled, qglDepthOfFieldAutoFocusSpeed, qglDepthOfFieldFocus, qglDepthOfFieldDiaphragm }; Q_ENUMS(FogMode) Q_ENUMS(SelectionMode) void stop(); void start(float freq = 60.); GLRendererBase * renderer(); void setRenderer(GLRendererBase * r, GLRendererBase ** prev = nullptr); QColor backColor() const { return backColor_; } float lineWidth() const { return lineWidth_; } float FOV() const { return camera()->fov_; } float depthStart() const { return camera()->depth_start; } float depthEnd() const { return camera()->depth_end; } float currentFPS() const { return fps_; } int maxAnisotropicLevel() const { return max_anisotropic; } QColor ambientColor() const { return ambientColor_; } QColor fogColor() const { return fogColor_; } float fogDensity() const { return fogDensity_; } float fogStart() const { return fogStart_; } float fogEnd() const { return fogEnd_; } FogMode fogMode() const { return fogMode_; } bool isFogEnabled() const { return fogEnabled_; } bool isLightEnabled() const { return lightEnabled_; } bool isGrabMouseEnabled() const { return grabMouse_; } bool isMouseRotateEnabled() const { return mouseRotate_; } bool isMouseSelectionEnabled() const { return mouseSelect_; } bool isCameraOrbit() const { return cameraOrbit_; } 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_; } QVariant feature(Feature f) const { return features_.value(int(f)); } QVariant setFeature(Feature f, const QVariant & value) { QVariant ret = features_.value(int(f)); features_[int(f)] = value; return ret; } bool isFeatureEnabled(Feature f) const { return features_[int(f)].toBool(); } int renderMode() const { return (int)rmode; } void setRenderMode(int mode) { rmode = (GLObjectBase::RenderMode)mode; } void addObject(GLObjectBase * o); // void addObject(GLObjectBase & o) {addObject(&o);} int objectsCount(bool all = false); void removeObject(GLObjectBase * o, bool inChildren = true); void removeObject(GLObjectBase & o, bool inChildren = true); void clearObjects(bool deleteAll = false); QList objects(bool all = false); int lightsCount() const; void removeLight(int index); void removeLight(Light * l); void clearLights(bool deleteAll = false); QList lights() { return lights_; } void addTexture(const QString & path); void addAnimation(const QString & dir, const QString & name); const GLObjectBase & rootObject() { return objects_; } GLObjectBase * object(int index) { return objects_.child(index); } GLObjectBase * object(const QString & name) { return objects_.child(name); } Light * light(int index); Light * light(const QString & name); SelectionMode selectionMode() const { return sel_mode; } Qt::MouseButton selectionButton() const { return sel_button; } Qt::KeyboardModifier selectionModifier() const { return sel_mod; } void setSelectionMode(SelectionMode v) { sel_mode = v; } void setSelectionButton(Qt::MouseButton v) { sel_button = v; } void setSelectionModifier(Qt::KeyboardModifier v) { sel_mod = v; } void selectObject(GLObjectBase * o); GLObjectBase * selectedObject() const { return sel_obj; } void glReleaseTextures(int channels = 8); QByteArray saveCamera(); void restoreCamera(const QByteArray & ba); QByteArray saveFeatures(); void restoreFeatures(const QByteArray & ba); GLfloat aspect, iaspect; QMatrix4x4 cur_mvpm; protected: void render(); void resizeEvent(QResizeEvent * e); void timerEvent(QTimerEvent *); void initialize(); void resizeGL(int width, int height); void mousePressEvent(QMouseEvent * e); void mouseMoveEvent(QMouseEvent * e); void mouseReleaseEvent(QMouseEvent * e); void wheelEvent(QWheelEvent * e); void leaveEvent(QEvent *); void mouseDoubleClickEvent(QMouseEvent * e); void keyPressEvent(QKeyEvent * e); void keyReleaseEvent(QKeyEvent * e); void focusOutEvent(QFocusEvent *); void applyFog(); void renderSelection(); void checkCaps(); void collectLights(); private: void objectDeleted(GLObjectBase * o); void collectObjectLights(GLObjectBase * o); void objectsCountInternal(int * cnt, GLObjectBase * where); void removeObjectInternal(GLObjectBase * o, GLObjectBase * where); void renderSingleSelection(GLObjectBase & o); // void renderSingleShadow(GLObjectBase & o); void renderHalo(const GLObjectBase * obj, const uint iid, const QColor & color, const float & fill); void reloadThisShaders(); void processKeys(); bool setupViewport(); QPoint lastPos, downPos; GLObjectBase objects_; QList lights_; // uint cid; QHash ids; QSet keys_; FogMode fogMode_; QColor backColor_, fogColor_, ambientColor_, hoverHaloColor_, selectionHaloColor_; QElapsedTimer time, ktm_; GLint max_anisotropic, max_texture_chanels; GLObjectBase::RenderMode rmode; GLObjectBase *sel_obj, *hov_obj; GLFramebuffer fbo_selection; QOpenGLShaderProgram *shader_select, *shader_halo; GLRendererBase * renderer_; SelectionMode sel_mode; Qt::MouseButton sel_button; Qt::KeyboardModifier sel_mod; GLRendererBase::RenderingParameters start_rp; QHash features_; QSize prev_size; float lineWidth_; float fogDensity_, fogStart_, fogEnd_, fps_, fps_tm, hoverHaloFill_, selectionHaloFill_, m_motionBlurFactor; int timer, fps_cnt, sh_id_loc, deleting_; bool is_first_draw, is_init, fogEnabled_, lightEnabled_, grabMouse_, mouse_first, mouseRotate_, mouseSelect_, customMouseMove_; bool shaders_supported, changed_, cameraOrbit_, need_init_; bool hoverHalo_, selectionHalo_, shaders_bind, selecting_; public slots: void setBackColor(const QColor & arg) { backColor_ = arg; } void setLineWidth(const float & arg) { lineWidth_ = arg; } void setFOV(const float & arg) { camera()->fov_ = arg; } void setDepthStart(const float & arg) { camera()->depth_start = arg; } void setDepthEnd(const float & arg) { camera()->depth_end = arg; } void setAmbientColor(const QColor & arg) { ambientColor_ = arg; } void setFogColor(const QColor & arg) { fogColor_ = arg; } void setFogDensity(const float & arg) { fogDensity_ = arg; } void setFogStart(const float & arg) { fogStart_ = arg; } void setFogEnd(const float & arg) { fogEnd_ = arg; } void setFogMode(const FogMode & arg) { fogMode_ = arg; } void setFogEnabled(const bool & arg) { fogEnabled_ = arg; } void setLightEnabled(const bool & arg) { lightEnabled_ = arg; } void setGrabMouseEnabled(const bool & arg) { grabMouse_ = arg; mouse_first = true; } void setMouseRotateEnabled(const bool & arg) { mouseRotate_ = arg; } void setMouseSelectionEnabled(const bool & arg) { mouseSelect_ = arg; } void setCustomMouseMove(const bool & arg) { customMouseMove_ = arg; } void setCameraOrbit(const bool & arg) { cameraOrbit_ = 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() { if (renderer_ != nullptr) renderer_->reloadShaders(); reloadThisShaders(); } void deselect() { sel_obj = nullptr; } signals: void glBeforePaint(); void glBeginPaint(); void glPainting(); 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(GLObjectBase * cur, GLObjectBase * prev); void selectionChanged(GLObjectBase * cur, GLObjectBase * prev); void objectAdded(GLObjectBase *); void doubleClick(); }; #endif // QGLVIEW_H