From 218b5f5196614eb73c4db7601b1f71956359afef Mon Sep 17 00:00:00 2001 From: Gideon Date: Fri, 22 Mar 2019 14:39:54 +0100 Subject: [PATCH] UI-QT: added settings for cardinal axis of the colormap. A righthanded cross is created from the axis and the colormaps are now relative to said cardinal axis instead of the z-axis. --- ui-cpp/include/SpinWidget.hpp | 426 +++++++++--------- .../include/VisualisationSettingsWidget.hpp | 1 + ui-cpp/src/SpinWidget.cpp | 137 ++++-- ui-cpp/src/VisualisationSettingsWidget.cpp | 71 ++- ui-cpp/ui/VisualisationSettingsWidget.ui | 123 ++++- 5 files changed, 482 insertions(+), 276 deletions(-) diff --git a/ui-cpp/include/SpinWidget.hpp b/ui-cpp/include/SpinWidget.hpp index f502f8c29..ffd48f16f 100644 --- a/ui-cpp/include/SpinWidget.hpp +++ b/ui-cpp/include/SpinWidget.hpp @@ -25,7 +25,7 @@ struct State; class SpinWidget : public QOpenGLWidget { - Q_OBJECT + Q_OBJECT public: @@ -70,7 +70,7 @@ class SpinWidget : public QOpenGLWidget DRAG, DEFECT, PIN - }; + }; enum class SystemMode { CUSTOM, @@ -80,227 +80,233 @@ class SpinWidget : public QOpenGLWidget SLAB_Z }; - SpinWidget(std::shared_ptr state, QWidget *parent = 0); - void setSuspended(bool suspended); - void updateData(); - void updateVectorFieldDirections(); - void updateVectorFieldGeometry(); - void initializeGL(); - void resizeGL(int width, int height); - void paintGL(); - void screenShot(std::string filename); - float getFramesPerSecond() const; - - void setVisualisationSource(int source); - int m_source; - - const VFRendering::View * view(); - const VFRendering::VectorField * vectorfield(); - - void addIsosurface(std::shared_ptr renderer); - void removeIsosurface(std::shared_ptr); - - // --- Mode - int visualisationNCellSteps(); - void setVisualisationNCellSteps(int n_cell_steps); - void setVisualizationMode(SpinWidget::VisualizationMode visualization_mode); - SpinWidget::VisualizationMode visualizationMode(); - SpinWidget::VisualizationMode visMode; - void setInteractionMode(SpinWidget::InteractionMode mode); - SpinWidget::InteractionMode interactionMode(); - bool show_miniview, show_coordinatesystem; - // --- MiniView - void setVisualizationMiniview(bool show, SpinWidget::WidgetLocation location); - bool isMiniviewEnabled() const; - void enableMiniview(bool enabled); - WidgetLocation miniviewPosition() const; - void setMiniviewPosition(WidgetLocation position); - // --- Coordinate System - void setVisualizationCoordinatesystem(bool show, SpinWidget::WidgetLocation location); - bool isCoordinateSystemEnabled() const; - void enableCoordinateSystem(bool enabled); - WidgetLocation coordinateSystemPosition() const; - void setCoordinateSystemPosition(WidgetLocation position); - - // --- System - void enableSystem(bool arrows, bool boundingbox, bool surface, bool isosurface); - void cycleSystem(bool forward=true); - void cycleSystem(SystemMode mode); - SystemMode systemCycle(); - void moveSlab(int amount); - bool show_arrows, show_boundingbox, show_surface, show_isosurface; - // Arrows - void setArrows(float size=1, int lod=20); - float arrowSize() const; - int arrowLOD() const; - glm::vec2 xRangeDirection() const; - glm::vec2 yRangeDirection() const; - glm::vec2 zRangeDirection() const; - void setOverallDirectionRange(glm::vec2 x_range, glm::vec2 y_range, glm::vec2 z_range); - glm::vec2 xRangePosition() const; - glm::vec2 yRangePosition() const; - glm::vec2 zRangePosition() const; - void setOverallPositionRange(glm::vec2 x_range, glm::vec2 y_range, glm::vec2 z_range); - void updateIsVisibleImplementation(); - // Bounding Box - bool isBoundingBoxEnabled() const; - void enableBoundingBox(bool enabled); - // Surface - void setSurface(glm::vec2 x_range, glm::vec2 y_range, glm::vec2 z_range); - glm::vec2 surfaceXRange() const; - glm::vec2 surfaceYRange() const; - glm::vec2 surfaceZRange() const; - - // --- Sphere - glm::vec2 spherePointSizeRange() const; - void setSpherePointSizeRange(glm::vec2 sphere_point_size_range); - - // --- Colors - Colormap colormap_general() const; - Colormap colormap_arrows() const; - void setColormapGeneral(Colormap colormap); - void setColormapArrows(Colormap colormap); - float colormap_rotation(); - std::array colormap_inverted(); - void setColormapRotationInverted(int phi, bool invert_z, bool invert_xy); - std::string getColormapRotationInverted(Colormap colormap, int phi=0, bool invert_z=false, bool invert_xy=false); - Color backgroundColor() const; - void setBackgroundColor(Color background_color); - Color boundingBoxColor() const; - void setBoundingBoxColor(Color bounding_box_color); - void updateBoundingBoxIndicators(); - - // --- Camera - void cycleCamera(); - void setCameraToDefault(); - void setCameraToX(bool inverted=false); - void setCameraToY(bool inverted=false); - void setCameraToZ(bool inverted=false); - void setCameraPosition(const glm::vec3& camera_position); - void setCameraFocus(const glm::vec3& center_position); - void setCameraUpVector(const glm::vec3& up_vector); - glm::vec3 getCameraPositon(); - glm::vec3 getCameraFocus(); - glm::vec3 getCameraUpVector(); - float verticalFieldOfView() const; - void setVerticalFieldOfView(float vertical_field_of_view); - bool cameraProjection(); - void setCameraProjection(bool perspective); - // --- Move Camera - void moveCamera(float backforth, float rightleft, float updown); - void rotateCamera(float theta, float phi); - bool getCameraRotationType(); - void setCameraRotationType(bool free); - - // --- Light - void setLightPosition(float theta, float phi); - std::array getLightPosition(); - - void setPasteAtomType(int type); + SpinWidget(std::shared_ptr state, QWidget *parent = 0); + void setSuspended(bool suspended); + void updateData(); + void updateVectorFieldDirections(); + void updateVectorFieldGeometry(); + void initializeGL(); + void resizeGL(int width, int height); + void paintGL(); + void screenShot(std::string filename); + float getFramesPerSecond() const; + + void setVisualisationSource(int source); + int m_source; + + const VFRendering::View * view(); + const VFRendering::VectorField * vectorfield(); + + void addIsosurface(std::shared_ptr renderer); + void removeIsosurface(std::shared_ptr); + + // --- Mode + int visualisationNCellSteps(); + void setVisualisationNCellSteps(int n_cell_steps); + void setVisualizationMode(SpinWidget::VisualizationMode visualization_mode); + SpinWidget::VisualizationMode visualizationMode(); + SpinWidget::VisualizationMode visMode; + void setInteractionMode(SpinWidget::InteractionMode mode); + SpinWidget::InteractionMode interactionMode(); + bool show_miniview, show_coordinatesystem; + // --- MiniView + void setVisualizationMiniview(bool show, SpinWidget::WidgetLocation location); + bool isMiniviewEnabled() const; + void enableMiniview(bool enabled); + WidgetLocation miniviewPosition() const; + void setMiniviewPosition(WidgetLocation position); + // --- Coordinate System + void setVisualizationCoordinatesystem(bool show, SpinWidget::WidgetLocation location); + bool isCoordinateSystemEnabled() const; + void enableCoordinateSystem(bool enabled); + WidgetLocation coordinateSystemPosition() const; + void setCoordinateSystemPosition(WidgetLocation position); + + // --- System + void enableSystem(bool arrows, bool boundingbox, bool surface, bool isosurface); + void cycleSystem(bool forward=true); + void cycleSystem(SystemMode mode); + SystemMode systemCycle(); + void moveSlab(int amount); + bool show_arrows, show_boundingbox, show_surface, show_isosurface; + // Arrows + void setArrows(float size=1, int lod=20); + float arrowSize() const; + int arrowLOD() const; + glm::vec2 xRangeDirection() const; + glm::vec2 yRangeDirection() const; + glm::vec2 zRangeDirection() const; + void setOverallDirectionRange(glm::vec2 x_range, glm::vec2 y_range, glm::vec2 z_range); + glm::vec2 xRangePosition() const; + glm::vec2 yRangePosition() const; + glm::vec2 zRangePosition() const; + void setOverallPositionRange(glm::vec2 x_range, glm::vec2 y_range, glm::vec2 z_range); + void updateIsVisibleImplementation(); + // Bounding Box + bool isBoundingBoxEnabled() const; + void enableBoundingBox(bool enabled); + // Surface + void setSurface(glm::vec2 x_range, glm::vec2 y_range, glm::vec2 z_range); + glm::vec2 surfaceXRange() const; + glm::vec2 surfaceYRange() const; + glm::vec2 surfaceZRange() const; + + // --- Sphere + glm::vec2 spherePointSizeRange() const; + void setSpherePointSizeRange(glm::vec2 sphere_point_size_range); + + // --- Colors + Colormap colormap_general() const; + Colormap colormap_arrows() const; + void setColormapGeneral(Colormap colormap); + void setColormapArrows(Colormap colormap); + float colormap_rotation(); + std::array colormap_inverted(); + glm::vec3 colormap_cardinal_a(); + glm::vec3 colormap_cardinal_b(); + glm::vec3 colormap_cardinal_c(); + void setColormapRotationInverted(int phi, bool invert_z, bool invert_xy, + glm::vec3 cardinal_a={1,0,0}, glm::vec3 cardinal_b={0,1,0}, glm::vec3 cardinal_c={0,0,1}); + std::string getColormapRotationInverted(Colormap colormap, int phi=0, bool invert_z=false, bool invert_xy=false, + glm::vec3 cardinal_a={1,0,0}, glm::vec3 cardinal_b={0,1,0}, glm::vec3 cardinal_c={0,0,1}); + Color backgroundColor() const; + void setBackgroundColor(Color background_color); + Color boundingBoxColor() const; + void setBoundingBoxColor(Color bounding_box_color); + void updateBoundingBoxIndicators(); + + // --- Camera + void cycleCamera(); + void setCameraToDefault(); + void setCameraToX(bool inverted=false); + void setCameraToY(bool inverted=false); + void setCameraToZ(bool inverted=false); + void setCameraPosition(const glm::vec3& camera_position); + void setCameraFocus(const glm::vec3& center_position); + void setCameraUpVector(const glm::vec3& up_vector); + glm::vec3 getCameraPositon(); + glm::vec3 getCameraFocus(); + glm::vec3 getCameraUpVector(); + float verticalFieldOfView() const; + void setVerticalFieldOfView(float vertical_field_of_view); + bool cameraProjection(); + void setCameraProjection(bool perspective); + // --- Move Camera + void moveCamera(float backforth, float rightleft, float updown); + void rotateCamera(float theta, float phi); + bool getCameraRotationType(); + void setCameraRotationType(bool free); + + // --- Light + void setLightPosition(float theta, float phi); + std::array getLightPosition(); + + void setPasteAtomType(int type); protected: - virtual void mouseMoveEvent(QMouseEvent *event); - virtual void mousePressEvent(QMouseEvent *event); - virtual void mouseReleaseEvent(QMouseEvent *event); - virtual void wheelEvent(QWheelEvent *event); + virtual void mouseMoveEvent(QMouseEvent *event); + virtual void mousePressEvent(QMouseEvent *event); + virtual void mouseReleaseEvent(QMouseEvent *event); + virtual void wheelEvent(QWheelEvent *event); + void closeEvent(QCloseEvent *event); - protected slots: - void teardownGL(); +protected slots: + void teardownGL(); private: - std::shared_ptr state; - QPoint m_previous_mouse_position; - bool _reset_camera; - bool m_camera_rotate_free; - bool m_camera_projection_perspective; - float m_light_theta, m_light_phi; - int paste_atom_type; - - // temporaries for system cycle - void setSystemCycle(SystemMode mode); - void setSlabRanges(); - int idx_cycle; - bool user_show_arrows, user_show_boundingbox, user_show_surface, user_show_isosurface; - float user_fov; - glm::vec3 slab_displacements; - - // Renderers - std::shared_ptr m_mainview; - std::shared_ptr m_miniview; - WidgetLocation m_location_miniview; - std::shared_ptr m_coordinatesystem; - WidgetLocation m_location_coordinatesystem; - std::shared_ptr m_sphere; - - std::shared_ptr m_system; - std::shared_ptr m_renderer_arrows; - std::shared_ptr m_renderer_boundingbox; - std::shared_ptr m_renderer_surface; - std::shared_ptr m_renderer_surface_3D; - std::shared_ptr m_renderer_surface_2D; - std::set> m_renderers_isosurface; - - void setupRenderers(); - bool m_gl_initialized; - bool m_suspended; - - int n_cell_step; - int n_basis_atoms; - - const VFRendering::Options& options() const; - - // Parameters - Colormap m_colormap_general; - Colormap m_colormap_arrows; - int m_colormap_rotation; - bool m_colormap_invert_z; - bool m_colormap_invert_xy; - glm::vec2 m_x_range_direction; - glm::vec2 m_y_range_direction; - glm::vec2 m_z_range_direction; - glm::vec2 m_x_range_position; - glm::vec2 m_y_range_position; - glm::vec2 m_z_range_position; - glm::vec2 m_surface_x_range; - glm::vec2 m_surface_y_range; - glm::vec2 m_surface_z_range; - - // Visualisation - VFRendering::View m_view; - VFRendering::VectorField m_vf; - VFRendering::VectorField m_vf_surf2D; - - // Interaction mode - InteractionMode m_interactionmode; + std::shared_ptr state; + QPoint m_previous_mouse_position; + bool _reset_camera; + bool m_camera_rotate_free; + bool m_camera_projection_perspective; + float m_light_theta, m_light_phi; + int paste_atom_type; + + // temporaries for system cycle + void setSystemCycle(SystemMode mode); + void setSlabRanges(); + int idx_cycle; + bool user_show_arrows, user_show_boundingbox, user_show_surface, user_show_isosurface; + float user_fov; + glm::vec3 slab_displacements; + + // Renderers + std::shared_ptr m_mainview; + std::shared_ptr m_miniview; + WidgetLocation m_location_miniview; + std::shared_ptr m_coordinatesystem; + WidgetLocation m_location_coordinatesystem; + std::shared_ptr m_sphere; + + std::shared_ptr m_system; + std::shared_ptr m_renderer_arrows; + std::shared_ptr m_renderer_boundingbox; + std::shared_ptr m_renderer_surface; + std::shared_ptr m_renderer_surface_3D; + std::shared_ptr m_renderer_surface_2D; + std::set> m_renderers_isosurface; + + void setupRenderers(); + bool m_gl_initialized; + bool m_suspended; + + int n_cell_step; + int n_basis_atoms; + + const VFRendering::Options& options() const; + + // Parameters + Colormap m_colormap_general; + Colormap m_colormap_arrows; + int m_colormap_rotation; + bool m_colormap_invert_z; + bool m_colormap_invert_xy; + glm::vec3 m_colormap_cardinal_a; + glm::vec3 m_colormap_cardinal_b; + glm::vec3 m_colormap_cardinal_c; + glm::vec2 m_x_range_direction; + glm::vec2 m_y_range_direction; + glm::vec2 m_z_range_direction; + glm::vec2 m_x_range_position; + glm::vec2 m_y_range_position; + glm::vec2 m_z_range_position; + glm::vec2 m_surface_x_range; + glm::vec2 m_surface_y_range; + glm::vec2 m_surface_z_range; + + // Visualisation + VFRendering::View m_view; + VFRendering::VectorField m_vf; + VFRendering::VectorField m_vf_surf2D; + + // Interaction mode + InteractionMode m_interactionmode; bool regular_mode_perspective; glm::vec3 regular_mode_cam_pos; glm::vec3 regular_mode_cam_focus; glm::vec3 regular_mode_cam_up; - // Calculate coordinates relative to the system center from QT device pixel coordinates - // This assumes that mouse_pos is relative to the top left corner of the widget. - // winsize should be the device pixel size of the widget. - // This function also assumes an orthogonal z-projection. - glm::vec2 system_coords_from_mouse(glm::vec2 mouse_pos, glm::vec2 winsize); - float system_radius_from_relative(float radius, glm::vec2 winsize); - QTimer * m_timer_drag; - QTimer * m_timer_drag_decoration; - void dragpaste(); - void defectpaste(); - void pinningpaste(); - bool m_dragging; - glm::vec2 last_drag_coords; - - // mouse decoration - void updateMouseDecoration(); - MouseDecoratorWidget * mouse_decoration; - float drag_radius; + // Calculate coordinates relative to the system center from QT device pixel coordinates + // This assumes that mouse_pos is relative to the top left corner of the widget. + // winsize should be the device pixel size of the widget. + // This function also assumes an orthogonal z-projection. + glm::vec2 system_coords_from_mouse(glm::vec2 mouse_pos, glm::vec2 winsize); + float system_radius_from_relative(float radius, glm::vec2 winsize); + QTimer * m_timer_drag; + QTimer * m_timer_drag_decoration; + void dragpaste(); + void defectpaste(); + void pinningpaste(); + bool m_dragging; + glm::vec2 last_drag_coords; + + // mouse decoration + void updateMouseDecoration(); + MouseDecoratorWidget * mouse_decoration; + float drag_radius; // Persistent Settings void writeSettings(); void readSettings(); - -protected: - void closeEvent(QCloseEvent *event); }; #endif diff --git a/ui-cpp/include/VisualisationSettingsWidget.hpp b/ui-cpp/include/VisualisationSettingsWidget.hpp index a1c450fcb..d022e1de1 100644 --- a/ui-cpp/include/VisualisationSettingsWidget.hpp +++ b/ui-cpp/include/VisualisationSettingsWidget.hpp @@ -53,6 +53,7 @@ private slots: void set_visualization_colormap(); void set_visualization_colormap_rotation_slider(); void set_visualization_colormap_rotation_lineEdit(); + void set_visualization_colormap_axis(); void set_visualization_background(); // Visualisation - Camera diff --git a/ui-cpp/src/SpinWidget.cpp b/ui-cpp/src/SpinWidget.cpp index a2cac72bb..954a8a6b8 100644 --- a/ui-cpp/src/SpinWidget.cpp +++ b/ui-cpp/src/SpinWidget.cpp @@ -45,7 +45,7 @@ SpinWidget::SpinWidget(std::shared_ptr state, QWidget *parent) : QOpenGLW setColormapGeneral(Colormap::HSV); setColormapArrows(Colormap::HSV); - setColormapRotationInverted(0, false, false); + setColormapRotationInverted(0, false, false, glm::vec3{1,0,0}, glm::vec3{0,1,0}, glm::vec3{0,0,1}); m_view.setOption(0.125f); m_view.setOption(0.3f); @@ -1552,7 +1552,9 @@ SpinWidget::Colormap SpinWidget::colormap_arrows() const void SpinWidget::setColormapGeneral(Colormap colormap) { m_colormap_general = colormap; - auto colormap_implementation = getColormapRotationInverted(m_colormap_general, colormap_rotation(), m_colormap_invert_z, m_colormap_invert_xy); + auto colormap_implementation = getColormapRotationInverted( + m_colormap_general, m_colormap_rotation, m_colormap_invert_z, m_colormap_invert_xy, + m_colormap_cardinal_a, m_colormap_cardinal_b, m_colormap_cardinal_c); // Set overall colormap makeCurrent(); @@ -1567,7 +1569,9 @@ void SpinWidget::setColormapGeneral(Colormap colormap) void SpinWidget::setColormapArrows(Colormap colormap) { m_colormap_arrows = colormap; - auto colormap_implementation = getColormapRotationInverted(m_colormap_arrows, colormap_rotation(), m_colormap_invert_z, m_colormap_invert_xy); + auto colormap_implementation = getColormapRotationInverted( + m_colormap_arrows, m_colormap_rotation, m_colormap_invert_z, m_colormap_invert_xy, + m_colormap_cardinal_a, m_colormap_cardinal_b, m_colormap_cardinal_c); // Set arrows colormap makeCurrent(); @@ -1588,11 +1592,30 @@ std::array SpinWidget::colormap_inverted() return std::array{this->m_colormap_invert_z, this->m_colormap_invert_xy}; } -void SpinWidget::setColormapRotationInverted(int phi, bool invert_z, bool invert_xy) +glm::vec3 SpinWidget::colormap_cardinal_a() +{ + return this->m_colormap_cardinal_a; +} + +glm::vec3 SpinWidget::colormap_cardinal_b() +{ + return this->m_colormap_cardinal_b; +} + +glm::vec3 SpinWidget::colormap_cardinal_c() +{ + return this->m_colormap_cardinal_c; +} + +void SpinWidget::setColormapRotationInverted(int phi, bool invert_z, bool invert_xy, + glm::vec3 cardinal_a, glm::vec3 cardinal_b, glm::vec3 cardinal_c) { this->m_colormap_rotation = phi; this->m_colormap_invert_z = invert_z; this->m_colormap_invert_xy = invert_xy; + this->m_colormap_cardinal_a = cardinal_a; + this->m_colormap_cardinal_b = cardinal_b; + this->m_colormap_cardinal_c = cardinal_c; this->setColormapGeneral(this->colormap_general()); this->setColormapArrows(this->colormap_arrows()); @@ -1600,41 +1623,32 @@ void SpinWidget::setColormapRotationInverted(int phi, bool invert_z, bool invert QTimer::singleShot(1, this, SLOT(update())); } -std::string SpinWidget::getColormapRotationInverted(Colormap colormap, int phi, bool invert_z, bool invert_xy) +std::string SpinWidget::getColormapRotationInverted(Colormap colormap, int phi, bool invert_z, bool invert_xy, + glm::vec3 cardinal_a, glm::vec3 cardinal_b, glm::vec3 cardinal_c) { int sign_z = 1 - 2 * (int)invert_z; int sign_xy = 1 - 2 * (int)invert_xy; float P = glm::radians((float)phi) / 3.14159; - // Get strings from floats - For some reason the locale is messed up... - auto old = std::locale::global(std::locale::classic()); - std::locale::global(old); - // setlocale(LC_ALL, "en_US"); - char s_phi[50]; - sprintf (s_phi, "%f", P); - char s_sign_z[50]; - sprintf (s_sign_z, "%i", sign_z); - char s_sign_xy[50]; - sprintf (s_sign_xy, "%i", sign_xy); std::string colormap_implementation; switch (colormap) { - case Colormap::WHITE: - colormap_implementation = VFRendering::Utilities::getColormapImplementation(VFRendering::Utilities::Colormap::WHITE); - break; - case Colormap::GRAY: - colormap_implementation = R"( - vec3 colormap(vec3 direction) { - return vec3(0.5, 0.5, 0.5); - } - )"; - break; - case Colormap::BLACK: + case Colormap::WHITE: + colormap_implementation = VFRendering::Utilities::getColormapImplementation(VFRendering::Utilities::Colormap::WHITE); + break; + case Colormap::GRAY: + colormap_implementation = R"( + vec3 colormap(vec3 direction) { + return vec3(0.5, 0.5, 0.5); + } + )"; + break; + case Colormap::BLACK: colormap_implementation = VFRendering::Utilities::getColormapImplementation(VFRendering::Utilities::Colormap::BLACK); break; - // Custom color maps not included in VFRendering: - case Colormap::HSV: + // Custom color maps not included in VFRendering: + case Colormap::HSV: colormap_implementation = R"( float atan2(float y, float x) { return x == 0.0 ? sign(y)*3.14159/2.0 : atan(y, x); @@ -1645,9 +1659,12 @@ std::string SpinWidget::getColormapRotationInverted(Colormap colormap, int phi, return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y); } vec3 colormap(vec3 direction) { - vec2 xy = normalize(direction.xy); - float hue = atan2()" + std::string(s_sign_xy) + R"(*xy.x, xy.y) / 3.14159 / 2.0 + )" + std::string(s_phi) + R"(/2.0; - float saturation = direction.z * )" + std::string(s_sign_z) + R"(; + vec3 cardinal_a = vec3()" + std::to_string(cardinal_a.x) + ", " + std::to_string(cardinal_a.y) + ", " + std::to_string(cardinal_a.z) + R"(); + vec3 cardinal_b = vec3()" + std::to_string(cardinal_b.x) + ", " + std::to_string(cardinal_b.y) + ", " + std::to_string(cardinal_b.z) + R"(); + vec3 cardinal_c = vec3()" + std::to_string(cardinal_c.x) + ", " + std::to_string(cardinal_c.y) + ", " + std::to_string(cardinal_c.z) + R"(); + vec3 projection = vec3( dot(direction, cardinal_a), dot(direction, cardinal_b), dot(direction, cardinal_c) ); + float hue = atan2()" + std::to_string(sign_xy) + R"(*projection.x, projection.y) / 3.14159 / 2.0 + )" + std::to_string(P) + R"(/2.0; + float saturation = projection.z * )" + std::to_string(sign_z) + R"(; if (saturation > 0.0) { return hsv2rgb(vec3(hue, 1.0-saturation, 1.0)); } else { @@ -1667,8 +1684,11 @@ std::string SpinWidget::getColormapRotationInverted(Colormap colormap, int phi, return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y); } vec3 colormap(vec3 direction) { - vec2 xy = normalize(direction.xy); - float hue = atan2()" + std::string(s_sign_xy) + R"(*xy.x, xy.y) / 3.14159 / 2.0 + )" + std::string(s_phi) + R"(; + vec3 cardinal_a = vec3()" + std::to_string(cardinal_a.x) + ", " + std::to_string(cardinal_a.y) + ", " + std::to_string(cardinal_a.z) + R"(); + vec3 cardinal_b = vec3()" + std::to_string(cardinal_b.x) + ", " + std::to_string(cardinal_b.y) + ", " + std::to_string(cardinal_b.z) + R"(); + vec3 cardinal_c = vec3()" + std::to_string(cardinal_c.x) + ", " + std::to_string(cardinal_c.y) + ", " + std::to_string(cardinal_c.z) + R"(); + vec3 projection = vec3( dot(direction, cardinal_a), dot(direction, cardinal_b), dot(direction, cardinal_c) ); + float hue = atan2()" + std::to_string(sign_xy) + R"(*projection.x, projection.y) / 3.14159 / 2.0 + )" + std::to_string(P) + R"(; return hsv2rgb(vec3(hue, 1.0, 1.0)); } )"; @@ -1676,7 +1696,11 @@ std::string SpinWidget::getColormapRotationInverted(Colormap colormap, int phi, case Colormap::BLUE_RED: colormap_implementation = R"( vec3 colormap(vec3 direction) { - float z_sign = direction.z * )" + std::string(s_sign_z) + R"(; + vec3 cardinal_a = vec3()" + std::to_string(cardinal_a.x) + ", " + std::to_string(cardinal_a.y) + ", " + std::to_string(cardinal_a.z) + R"(); + vec3 cardinal_b = vec3()" + std::to_string(cardinal_b.x) + ", " + std::to_string(cardinal_b.y) + ", " + std::to_string(cardinal_b.z) + R"(); + vec3 cardinal_c = vec3()" + std::to_string(cardinal_c.x) + ", " + std::to_string(cardinal_c.y) + ", " + std::to_string(cardinal_c.z) + R"(); + vec3 projection = vec3( dot(direction, cardinal_a), dot(direction, cardinal_b), dot(direction, cardinal_c) ); + float z_sign = projection.z * )" + std::to_string(sign_z) + R"(; vec3 color_down = vec3(0.0, 0.0, 1.0); vec3 color_up = vec3(1.0, 0.0, 0.0); return mix(color_down, color_up, z_sign*0.5+0.5); @@ -1693,9 +1717,12 @@ std::string SpinWidget::getColormapRotationInverted(Colormap colormap, int phi, vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www); return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y); } - vec3 colormap(vec3 direction) { - float hue = 1.0/3.0-normalize(direction).z/3.0* )" + std::string(s_sign_z) + R"(; + vec3 cardinal_a = vec3()" + std::to_string(cardinal_a.x) + ", " + std::to_string(cardinal_a.y) + ", " + std::to_string(cardinal_a.z) + R"(); + vec3 cardinal_b = vec3()" + std::to_string(cardinal_b.x) + ", " + std::to_string(cardinal_b.y) + ", " + std::to_string(cardinal_b.z) + R"(); + vec3 cardinal_c = vec3()" + std::to_string(cardinal_c.x) + ", " + std::to_string(cardinal_c.y) + ", " + std::to_string(cardinal_c.z) + R"(); + vec3 projection = vec3( dot(direction, cardinal_a), dot(direction, cardinal_b), dot(direction, cardinal_c) ); + float hue = 1.0/3.0-normalize(projection).z/3.0* )" + std::to_string(sign_z) + R"(; return hsv2rgb(vec3(hue, 1.0, 1.0)); } )"; @@ -1703,7 +1730,11 @@ std::string SpinWidget::getColormapRotationInverted(Colormap colormap, int phi, case Colormap::BLUE_WHITE_RED: colormap_implementation = R"( vec3 colormap(vec3 direction) { - float z_sign = direction.z * )" + std::string(s_sign_z) + R"(; + vec3 cardinal_a = vec3()" + std::to_string(cardinal_a.x) + ", " + std::to_string(cardinal_a.y) + ", " + std::to_string(cardinal_a.z) + R"(); + vec3 cardinal_b = vec3()" + std::to_string(cardinal_b.x) + ", " + std::to_string(cardinal_b.y) + ", " + std::to_string(cardinal_b.z) + R"(); + vec3 cardinal_c = vec3()" + std::to_string(cardinal_c.x) + ", " + std::to_string(cardinal_c.y) + ", " + std::to_string(cardinal_c.z) + R"(); + vec3 projection = vec3( dot(direction, cardinal_a), dot(direction, cardinal_b), dot(direction, cardinal_c) ); + float z_sign = projection.z * )" + std::to_string(sign_z) + R"(; if (z_sign < 0) { vec3 color_down = vec3(0.0, 0.0, 1.0); vec3 color_up = vec3(1.0, 1.0, 1.0); @@ -1728,9 +1759,12 @@ std::string SpinWidget::getColormapRotationInverted(Colormap colormap, int phi, return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y); } vec3 colormap(vec3 direction) { - vec2 xy = normalize(direction.xy); - float hue = atan2()" + std::string(s_sign_xy) + R"(*xy.x, xy.y) / 3.14159 / 2.0 + )" + std::string(s_phi) + R"(/2.0; - float saturation = direction.z * )" + std::string(s_sign_z) + R"(; + vec3 cardinal_a = vec3()" + std::to_string(cardinal_a.x) + ", " + std::to_string(cardinal_a.y) + ", " + std::to_string(cardinal_a.z) + R"(); + vec3 cardinal_b = vec3()" + std::to_string(cardinal_b.x) + ", " + std::to_string(cardinal_b.y) + ", " + std::to_string(cardinal_b.z) + R"(); + vec3 cardinal_c = vec3()" + std::to_string(cardinal_c.x) + ", " + std::to_string(cardinal_c.y) + ", " + std::to_string(cardinal_c.z) + R"(); + vec3 projection = vec3( dot(direction, cardinal_a), dot(direction, cardinal_b), dot(direction, cardinal_c) ); + float hue = atan2()" + std::to_string(sign_xy) + R"(*projection.x, projection.y) / 3.14159 / 2.0 + )" + std::to_string(P) + R"(/2.0; + float saturation = projection.z * )" + std::to_string(sign_z) + R"(; if (saturation > 0.0) { return hsv2rgb(vec3(hue, 1.0-saturation, 1.0)); } else { @@ -2103,7 +2137,16 @@ void SpinWidget::writeSettings() settings.setValue("Colormap Arrows", (int)colormap_arrows()); settings.setValue("Colormap_invert_z", m_colormap_invert_z); settings.setValue("Colormap_invert_xy", m_colormap_invert_xy); - settings.setValue("Colormap_rotation", m_colormap_rotation); + settings.setValue("Colormap_rotation", m_colormap_rotation); + settings.setValue("Colormap_cardinal_a_x", m_colormap_cardinal_a.x); + settings.setValue("Colormap_cardinal_a_y", m_colormap_cardinal_a.y); + settings.setValue("Colormap_cardinal_a_z", m_colormap_cardinal_a.z); + settings.setValue("Colormap_cardinal_b_x", m_colormap_cardinal_b.x); + settings.setValue("Colormap_cardinal_b_y", m_colormap_cardinal_b.y); + settings.setValue("Colormap_cardinal_b_z", m_colormap_cardinal_b.z); + settings.setValue("Colormap_cardinal_c_x", m_colormap_cardinal_c.x); + settings.setValue("Colormap_cardinal_c_y", m_colormap_cardinal_c.y); + settings.setValue("Colormap_cardinal_c_z", m_colormap_cardinal_c.z); settings.endGroup(); // Camera @@ -2207,7 +2250,17 @@ void SpinWidget::readSettings() bool invert_z = settings.value("Colormap_invert_z").toInt(); bool invert_xy = settings.value("Colormap_invert_xy").toInt(); int phi = settings.value("Colormap_rotation").toInt(); - this->setColormapRotationInverted(phi, invert_z, invert_xy); + glm::vec3 cardinal_a{1, 0, 0}, cardinal_b{0, 1, 0}, cardinal_c{0, 0, 1}; + cardinal_a.x = settings.value("Colormap_cardinal_a_x").toFloat(); + cardinal_a.y = settings.value("Colormap_cardinal_a_y").toFloat(); + cardinal_a.z = settings.value("Colormap_cardinal_a_z").toFloat(); + cardinal_b.x = settings.value("Colormap_cardinal_b_x").toFloat(); + cardinal_b.y = settings.value("Colormap_cardinal_b_y").toFloat(); + cardinal_b.z = settings.value("Colormap_cardinal_b_z").toFloat(); + cardinal_c.x = settings.value("Colormap_cardinal_c_x").toFloat(); + cardinal_c.y = settings.value("Colormap_cardinal_c_y").toFloat(); + cardinal_c.z = settings.value("Colormap_cardinal_c_z").toFloat(); + this->setColormapRotationInverted(phi, invert_z, invert_xy, cardinal_a, cardinal_b, cardinal_c); settings.endGroup(); } diff --git a/ui-cpp/src/VisualisationSettingsWidget.cpp b/ui-cpp/src/VisualisationSettingsWidget.cpp index b3bc9ebe7..3e7a3d096 100644 --- a/ui-cpp/src/VisualisationSettingsWidget.cpp +++ b/ui-cpp/src/VisualisationSettingsWidget.cpp @@ -68,6 +68,9 @@ void VisualisationSettingsWidget::Setup_Input_Validators() // Arrows this->lineEdit_arrows_lod->setValidator(this->number_validator_int_unsigned); // Colormap + this->lineEdit_cm_axis_x->setValidator(this->number_validator); + this->lineEdit_cm_axis_y->setValidator(this->number_validator); + this->lineEdit_cm_axis_z->setValidator(this->number_validator); this->lineEdit_colormap_rotate_phi->setValidator(this->number_validator_int_unsigned); // Camera this->lineEdit_camera_pos_x->setValidator(this->number_validator); @@ -235,6 +238,10 @@ void VisualisationSettingsWidget::Load_Visualization_Contents() comboBox_colormap_arrows->setCurrentIndex(idx_cma + 1); float cm_rotation = spinWidget->colormap_rotation(); auto cm_inverted = spinWidget->colormap_inverted(); + glm::vec3 cm_cardinal_c = spinWidget->colormap_cardinal_c(); + lineEdit_cm_axis_x->setText(QString::number(cm_cardinal_c.x)); + lineEdit_cm_axis_y->setText(QString::number(cm_cardinal_c.y)); + lineEdit_cm_axis_z->setText(QString::number(cm_cardinal_c.z)); horizontalSlider_colormap_rotate_phi->setRange(0, 360); horizontalSlider_colormap_rotate_phi->setValue(cm_rotation); lineEdit_colormap_rotate_phi->setText(QString::number(cm_rotation)); @@ -666,7 +673,6 @@ void VisualisationSettingsWidget::set_visualization_colormap() spinWidget->setColormapArrows(colormap_arrows); } - void VisualisationSettingsWidget::set_visualization_colormap_rotation_slider() { int phi = this->horizontalSlider_colormap_rotate_phi->value(); @@ -675,18 +681,68 @@ void VisualisationSettingsWidget::set_visualization_colormap_rotation_slider() this->lineEdit_colormap_rotate_phi->setText(QString::number(phi)); - this->spinWidget->setColormapRotationInverted(phi, invert_z, invert_xy); + this->set_visualization_colormap_axis(); } void VisualisationSettingsWidget::set_visualization_colormap_rotation_lineEdit() { int phi = this->lineEdit_colormap_rotate_phi->text().toInt(); - bool invert_z = this->checkBox_colormap_invert_z->isChecked(); - bool invert_xy = this->checkBox_colormap_invert_xy->isChecked(); - this->horizontalSlider_colormap_rotate_phi->setValue(phi); - this->spinWidget->setColormapRotationInverted(phi, invert_z, invert_xy); + this->set_visualization_colormap_axis(); +} + +void VisualisationSettingsWidget::set_visualization_colormap_axis() +{ + const float epsilon = 1e-5; + + const glm::vec3 ex{1,0,0}; + const glm::vec3 ey{0,1,0}; + const glm::vec3 ez{0,0,1}; + + glm::vec3 temp1{1,0,0}; + glm::vec3 temp2{0,1,0}; + glm::vec3 cardinal_c{0,0,1}; + cardinal_c.x = this->lineEdit_cm_axis_x->text().toFloat(); + cardinal_c.y = this->lineEdit_cm_axis_y->text().toFloat(); + cardinal_c.z = this->lineEdit_cm_axis_z->text().toFloat(); + if( glm::length(cardinal_c) > 0 ) + cardinal_c = glm::normalize(cardinal_c); + + if( cardinal_c[2] == 0 ) + { + temp1 = ez; + temp2 = glm::cross(cardinal_c, ez); + } + // Else its either above or below the xy-plane. + // if its above the xy-plane, it points in z-direction + // the vectors should be: cardinal_c, ex, -ey + else if( cardinal_c[2] > 0 ) + { + temp1 = ex; + temp2 = -ey; + } + // if its below the xy-plane, it points in -z-direction + // the vectors should be: cardinal_c, ex, ey + else + { + temp1 = ex; + temp2 = ey; + } + + // First vector: orthogonalize temp1 w.r.t. cardinal_c + glm::vec3 cardinal_a = temp1 - glm::dot(temp1, cardinal_c) * cardinal_c; + cardinal_a = glm::normalize(cardinal_a); + + // Second vector: orthogonalize temp2 w.r.t. cardinal_c and cardinal_a + glm::vec3 cardinal_b = temp2 - glm::dot(temp2, cardinal_c)*cardinal_c - glm::dot(temp2, cardinal_a)*cardinal_a; + cardinal_b = glm::normalize(cardinal_b); + + // Set + int phi = this->lineEdit_colormap_rotate_phi->text().toInt(); + bool invert_z = this->checkBox_colormap_invert_z->isChecked(); + bool invert_xy = this->checkBox_colormap_invert_xy->isChecked(); + this->spinWidget->setColormapRotationInverted(phi, invert_z, invert_xy, cardinal_a, cardinal_b, cardinal_c); } void VisualisationSettingsWidget::set_visualization_background() @@ -918,6 +974,9 @@ void VisualisationSettingsWidget::Setup_Visualization_Slots() connect(comboBox_colormap_general, SIGNAL(currentIndexChanged(int)), this, SLOT(set_visualization_colormap())); connect(comboBox_colormap_arrows, SIGNAL(currentIndexChanged(int)), this, SLOT(set_visualization_colormap())); connect(horizontalSlider_colormap_rotate_phi, SIGNAL(valueChanged(int)), this, SLOT(set_visualization_colormap_rotation_slider())); + connect(this->lineEdit_cm_axis_x, SIGNAL(returnPressed()), this, SLOT(set_visualization_colormap_axis())); + connect(this->lineEdit_cm_axis_y, SIGNAL(returnPressed()), this, SLOT(set_visualization_colormap_axis())); + connect(this->lineEdit_cm_axis_z, SIGNAL(returnPressed()), this, SLOT(set_visualization_colormap_axis())); connect(this->lineEdit_colormap_rotate_phi, SIGNAL(returnPressed()), this, SLOT(set_visualization_colormap_rotation_lineEdit())); connect(this->checkBox_colormap_invert_z, SIGNAL(stateChanged(int)), this, SLOT(set_visualization_colormap_rotation_lineEdit())); connect(this->checkBox_colormap_invert_xy, SIGNAL(stateChanged(int)), this, SLOT(set_visualization_colormap_rotation_slider())); diff --git a/ui-cpp/ui/VisualisationSettingsWidget.ui b/ui-cpp/ui/VisualisationSettingsWidget.ui index 271e14513..816543055 100644 --- a/ui-cpp/ui/VisualisationSettingsWidget.ui +++ b/ui-cpp/ui/VisualisationSettingsWidget.ui @@ -59,7 +59,7 @@ - 0 + 4 @@ -67,7 +67,7 @@ 0 0 468 - 1019 + 984 @@ -1437,7 +1437,7 @@ 0 - 180 + 220 @@ -1460,6 +1460,25 @@ + + + + + 90 + 0 + + + + + 100 + 16777215 + + + + Qt::Horizontal + + + @@ -1479,18 +1498,18 @@ - - - - - 100 - 16777215 - - + + Qt::Horizontal - + + + 40 + 20 + + + @@ -1504,7 +1523,7 @@ - Invert xy-component + Invert phi component @@ -1518,7 +1537,7 @@ - Invert z-component + Invert theta component @@ -1677,6 +1696,69 @@ + + + + Cardinal Axis + + + + + + + + + + 40 + 24 + + + + 1 + + + + + + + + 40 + 24 + + + + 0 + + + + + + + + 40 + 24 + + + + 0 + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + @@ -1899,16 +1981,21 @@ lineEdit_camera_upvector_y lineEdit_camera_upvector_z lineEdit_camera_fov + lineEdit_cm_axis_x + lineEdit_cm_axis_y + lineEdit_cm_axis_z lineEdit_colormap_rotate_phi - horizontalSlider_colormap_rotate_phi - checkBox_colormap_invert_xy checkBox_colormap_invert_z + checkBox_colormap_invert_xy + lineEdit_arrows_lod + comboBox_colormap_general + comboBox_colormap_arrows + horizontalSlider_colormap_rotate_phi comboBox_backgroundColor + horizontalSlider_arrowsize horizontalSlider_spherePointSize horizontalSlider_light_theta horizontalSlider_light_phi - horizontalSlider_arrowsize - lineEdit_arrows_lod