From: <hug...@li...> - 2011-09-28 16:42:38
|
branch: details: http://hugin.hg.sourceforge.net/hgweb/hugin/hugin/hgrepo/h/hu/hugin/hugin/rev/231abc663cf1 changeset: 5593:231abc663cf1 user: tmodes date: Wed Sep 28 17:43:27 2011 +0200 description: Added guide lines to fast preview diffstat: src/hugin1/hugin/CMakeLists.txt | 4 +- src/hugin1/hugin/GLPreviewFrame.cpp | 26 +++++- src/hugin1/hugin/GLPreviewFrame.h | 7 + src/hugin1/hugin/PreviewCropTool.cpp | 1 - src/hugin1/hugin/PreviewGuideTool.cpp | 161 +++++++++++++++++++++++++++++++++ src/hugin1/hugin/PreviewGuideTool.h | 60 ++++++++++++ src/hugin1/hugin/xrc/preview_frame.xrc | 70 ++++++++++++++ 7 files changed, 325 insertions(+), 4 deletions(-) diffs (483 lines): diff -r c1a3cf06612c -r 231abc663cf1 src/hugin1/hugin/CMakeLists.txt --- a/src/hugin1/hugin/CMakeLists.txt Mon Sep 26 18:36:31 2011 +0200 +++ b/src/hugin1/hugin/CMakeLists.txt Wed Sep 28 17:43:27 2011 +0200 @@ -33,7 +33,7 @@ OutputProjectionInfo.cpp ToolHelper.cpp Tool.cpp OverviewCameraTool.cpp ProjectionGridTool.cpp OverviewOutlinesTool.cpp PreviewCropTool.cpp DragTool.cpp PreviewIdentifyTool.cpp PanosphereSphereTool.cpp PreviewDifferenceTool.cpp PreviewPanoMaskTool.cpp PreviewControlPointTool.cpp -GreatCircles.cpp AboutDialog.cpp LayoutRemapper.cpp PreviewLayoutLinesTool.cpp PreviewColorPickerTool.cpp +GreatCircles.cpp AboutDialog.cpp LayoutRemapper.cpp PreviewLayoutLinesTool.cpp PreviewColorPickerTool.cpp PreviewGuideTool.cpp MaskEditorPanel.cpp MaskImageCtrl.cpp MaskLoadDialog.cpp HtmlWindow.cpp) set(hugin_HEADERS @@ -48,7 +48,7 @@ OutputProjectionInfo.h ToolHelper.h Tool.h OverviewCameraTool.h ProjectionGridTool.h OverviewOutlinesTool.h PreviewCropTool.h DragTool.h PreviewIdentifyTool.h PanosphereSphereTool.h PreviewDifferenceTool.h PreviewPanoMaskTool.h PreviewControlPointTool.h -GreatCircles.h AboutDialog.h LayoutRemapper.h PreviewLayoutLinesTool.h PreviewColorPickerTool.h +GreatCircles.h AboutDialog.h LayoutRemapper.h PreviewLayoutLinesTool.h PreviewColorPickerTool.h PreviewGuideTool.h MaskEditorPanel.h MaskImageCtrl.h MaskLoadDialog.h HtmlWindow.h) IF(BUILD_HSI) diff -r c1a3cf06612c -r 231abc663cf1 src/hugin1/hugin/GLPreviewFrame.cpp --- a/src/hugin1/hugin/GLPreviewFrame.cpp Mon Sep 26 18:36:31 2011 +0200 +++ b/src/hugin1/hugin/GLPreviewFrame.cpp Wed Sep 28 17:43:27 2011 +0200 @@ -68,6 +68,7 @@ #include "PreviewControlPointTool.h" #include "PreviewLayoutLinesTool.h" #include "PreviewColorPickerTool.h" +#include "PreviewGuideTool.h" #include "ProjectionGridTool.h" #include "PanosphereSphereTool.h" @@ -139,6 +140,7 @@ EVT_CHOICE(XRCID("drag_mode_choice"), GLPreviewFrame::OnDragChoice) EVT_CHOICE(XRCID("projection_choice"), GLPreviewFrame::OnProjectionChoice) EVT_CHOICE(XRCID("overview_mode_choice"), GLPreviewFrame::OnOverviewModeChoice) + EVT_CHOICE(XRCID("preview_guide_choice"), GLPreviewFrame::OnGuideChanged) EVT_TOGGLEBUTTON(XRCID("overview_toggle"), GLPreviewFrame::OnOverviewToggle) EVT_CHECKBOX(XRCID("preview_show_grid"), GLPreviewFrame::OnSwitchPreviewGrid) #ifndef __WXMAC__ @@ -301,6 +303,7 @@ plane_difference_tool = NULL; panosphere_difference_tool = NULL; pano_mask_tool = NULL; + preview_guide_tool = NULL; #ifdef __WXGTK__ loadedLayout=false; #endif @@ -493,6 +496,9 @@ DEBUG_ASSERT(m_ROIBottomTxt); m_ROIBottomTxt->PushEventHandler(new TextKillFocusHandler(this)); + m_GuideChoice = XRCCTRL(*this, "preview_guide_choice", wxChoice); + int guide=cfg->Read(wxT("/GLPreviewFrame/guide"),0l); + m_GuideChoice->SetSelection(guide); flexSizer->Add(m_HFOVSlider, 0, wxEXPAND); @@ -749,6 +755,7 @@ cfg->Write(wxT("/GLPreviewFrame/overview_hidden"), !(m_OverviewToggle->GetValue())); cfg->Write(wxT("/GLPreviewFrame/showPreviewGrid"), m_previewGrid->GetValue()); cfg->Write(wxT("/GLPreviewFrame/individualDragMode"), individualDragging()); + cfg->Write(wxT("/GLPreviewFrame/guide"),m_GuideChoice->GetSelection()); // delete all of the tools. When the preview is never used we never get an // OpenGL context and therefore don't create the tools. @@ -775,6 +782,10 @@ plane_overview_helper->DeactivateTool(plane_overview_identify_tool); delete plane_overview_identify_tool; plane_overview_helper->DeactivateTool(plane_difference_tool); delete plane_difference_tool; } + if (preview_guide_tool) { + preview_helper->DeactivateTool(preview_guide_tool); + delete preview_guide_tool; + }; m_HFOVText->PopEventHandler(true); m_VFOVText->PopEventHandler(true); m_ROILeftTxt->PopEventHandler(true); @@ -1866,8 +1877,9 @@ { preview_helper->ActivateTool(preview_projection_grid); }; + preview_guide_tool = new PreviewGuideTool(preview_helper); + preview_guide_tool->SetGuideStyle((PreviewGuideTool::Guides)m_GuideChoice->GetSelection()); -// // activate tools that are always active. preview_helper->ActivateTool(pano_mask_tool); // update the blend mode which activates some tools @@ -2393,6 +2405,7 @@ } break; case mode_crop: + preview_helper->DeactivateTool(preview_guide_tool); preview_helper->DeactivateTool(crop_tool); break; }; @@ -2434,6 +2447,7 @@ break; case mode_crop: TurnOffTools(preview_helper->ActivateTool(crop_tool)); + preview_helper->ActivateTool(preview_guide_tool); break; }; //enable group checkboxes only for drag mode tab @@ -2704,3 +2718,13 @@ wxColor GLPreviewFrame::GetPreviewBackgroundColor() { return m_preview_background_color; } + +void GLPreviewFrame::OnGuideChanged(wxCommandEvent &e) +{ + if(preview_guide_tool) + { + preview_guide_tool->SetGuideStyle((PreviewGuideTool::Guides)m_GuideChoice->GetSelection()); + redrawPreview(); + }; +}; + diff -r c1a3cf06612c -r 231abc663cf1 src/hugin1/hugin/GLPreviewFrame.h --- a/src/hugin1/hugin/GLPreviewFrame.h Mon Sep 26 18:36:31 2011 +0200 +++ b/src/hugin1/hugin/GLPreviewFrame.h Wed Sep 28 17:43:27 2011 +0200 @@ -76,6 +76,8 @@ class PanosphereOverviewOutlinesTool; class PlaneOverviewOutlinesTool; +class PreviewGuideTool; + class GLPreviewFrame; class GLwxAuiManager; @@ -317,6 +319,8 @@ void OnColorPicker(wxCommandEvent &e); /** event handler when user changes background color */ void OnPreviewBackgroundColorChanged(wxColourPickerEvent & e); + /** event handler when user selects different guide */ + void OnGuideChanged(wxCommandEvent &e); private: /** changes the visibility of the group check boxes @@ -356,6 +360,7 @@ wxChoice * m_DragModeChoice; wxChoice * m_ProjectionChoice; wxChoice * m_OverviewModeChoice; + wxChoice * m_GuideChoice; // No HDR display yet. // wxChoice * m_outputModeChoice; wxTextCtrl * m_exposureTextCtrl; @@ -444,6 +449,8 @@ PanosphereOverviewOutlinesTool *overview_outlines_tool; PlaneOverviewOutlinesTool *plane_overview_outlines_tool; + PreviewGuideTool *preview_guide_tool; + void TurnOffTools(std::set<Tool*> tools); #ifdef __WXGTK__ diff -r c1a3cf06612c -r 231abc663cf1 src/hugin1/hugin/PreviewCropTool.cpp --- a/src/hugin1/hugin/PreviewCropTool.cpp Mon Sep 26 18:36:31 2011 +0200 +++ b/src/hugin1/hugin/PreviewCropTool.cpp Wed Sep 28 17:43:27 2011 +0200 @@ -111,7 +111,6 @@ // tries to redraw the preview with the panorama's real ROI. opts->setROI(new_roi); helper->GetViewStatePtr()->SetOptions(opts); - helper->GetViewStatePtr()->Redraw(); } } diff -r c1a3cf06612c -r 231abc663cf1 src/hugin1/hugin/PreviewGuideTool.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/hugin1/hugin/PreviewGuideTool.cpp Wed Sep 28 17:43:27 2011 +0200 @@ -0,0 +1,161 @@ +// -*- c-basic-offset: 4 -*- + +/** @file PreviewGuideTool.cpp + * + * @author T. Modes + * + * @brief implementation of ToolHelper for drawing guide lines over pano + * + */ + +/* This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This software 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 + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this software; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include "PreviewGuideTool.h" +#ifdef __WXMAC__ +#include <OpenGL/gl.h> +#else +#include <GL/gl.h> +#endif + +PreviewGuideTool::PreviewGuideTool(PreviewToolHelper *helper) : PreviewTool(helper) +{ +} + +void PreviewGuideTool::Activate() +{ + helper->NotifyMe(PreviewToolHelper::REALLY_DRAW_OVER_IMAGES, this); +} + +void DrawThirds(const vigra::Rect2D roi) +{ + double width3 = (double) roi.width()/3.0; + double height3 = (double) roi.height()/3.0; + glBegin(GL_LINES); + glVertex2f((double)roi.left()+width3,roi.top()); + glVertex2f((double)roi.left()+width3,roi.bottom()); + glVertex2f((double)roi.left()+2.0*width3,roi.top()); + glVertex2f((double)roi.left()+2.0*width3,roi.bottom()); + glVertex2f(roi.left(), (double)roi.top()+height3); + glVertex2f(roi.right(),(double)roi.top()+height3); + glVertex2f(roi.left(), (double)roi.top()+2.0*height3); + glVertex2f(roi.right(),(double)roi.top()+2.0*height3); + glEnd(); +}; + +void DrawGoldenRatio(const vigra::Rect2D roi) +{ + double width = (double) roi.width(); + double height = (double) roi.height(); + glBegin(GL_LINES); + glVertex2f((double)roi.left()+width*0.382,roi.top()); + glVertex2f((double)roi.left()+width*0.382,roi.bottom()); + glVertex2f((double)roi.left()+width*0.618,roi.top()); + glVertex2f((double)roi.left()+width*0.618,roi.bottom()); + glVertex2f(roi.left(), (double)roi.top()+height*0.382); + glVertex2f(roi.right(),(double)roi.top()+height*0.382); + glVertex2f(roi.left(), (double)roi.top()+height*0.618); + glVertex2f(roi.right(),(double)roi.top()+height*0.618); + glEnd(); +}; + +void DrawDiagonal(const vigra::Rect2D roi) +{ + glBegin(GL_LINES); + glVertex2f(roi.left(), roi.top()); + glVertex2f(roi.right(), roi.bottom()); + glVertex2f(roi.left(), roi.bottom()); + glVertex2f(roi.right(), roi.top()); + glVertex2f(roi.left(), roi.top()+roi.height()/2.0); + glVertex2f(roi.right(), roi.top()+roi.height()/2.0); + glVertex2f(roi.left()+roi.width()/2.0, roi.top()); + glVertex2f(roi.left()+roi.width()/2.0, roi.bottom()); + glEnd(); +}; + +void DrawTriangle(const vigra::Rect2D roi, const bool up) +{ + double w=roi.width(); + double h=roi.height(); + double x=w/(1+pow(w/h,2)); + double y=h/(1+pow(w/h,2)); + glBegin(GL_LINES); + if(up) + { + glVertex2f(roi.left(), roi.bottom()); + glVertex2f(roi.right(), roi.top()); + glVertex2f(roi.right()-x, roi.top()+y); + glVertex2f(roi.right(), roi.bottom()); + glVertex2f(roi.left()+x, roi.bottom()-y); + glVertex2f(roi.left(), roi.top()); + } + else + { + glVertex2f(roi.left(), roi.top()); + glVertex2f(roi.right(), roi.bottom()); + glVertex2f(roi.right()-x, roi.bottom()-y); + glVertex2f(roi.right(), roi.top()); + glVertex2f(roi.left()+x, roi.top()+y); + glVertex2f(roi.left(), roi.bottom()); + } + glEnd(); + +}; + +void PreviewGuideTool::ReallyAfterDrawImagesEvent() +{ + if(m_guide==NONE) + { + return; + }; + HuginBase::PanoramaOptions *opts = helper->GetViewStatePtr()->GetOptions(); + vigra::Rect2D roi = opts->getROI(); + glEnable(GL_BLEND); + glDisable(GL_TEXTURE_2D); + glColor3f(1,1,0); + switch(m_guide) + { + case THIRDS: + DrawThirds(roi); + break; + case GOLDENRATIO: + DrawGoldenRatio(roi); + break; + case DIAGONAL: + DrawDiagonal(roi); + break; + case TRIANGLE_DOWN: + DrawTriangle(roi,false); + break; + case TRIANGLE_UP: + DrawTriangle(roi,true); + break; + }; + glDisable(GL_BLEND); + glEnable(GL_TEXTURE_2D); +} + +void PreviewGuideTool::SetGuideStyle(const Guides newGuideStyle) +{ + m_guide=newGuideStyle; + helper->GetViewStatePtr()->Redraw(); +}; + +const PreviewGuideTool::Guides PreviewGuideTool::GetGuideStyle() const +{ + return m_guide; +}; + diff -r c1a3cf06612c -r 231abc663cf1 src/hugin1/hugin/PreviewGuideTool.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/hugin1/hugin/PreviewGuideTool.h Wed Sep 28 17:43:27 2011 +0200 @@ -0,0 +1,60 @@ +// -*- c-basic-offset: 4 -*- + +/** @file PreviewGuideTool.h + * + * @author T. Modes + * + * @brief interface to ToolHelper for drawing guide lines over pano + * + */ + +/* This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This software 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 + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this software; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef _PREVIEWGUIDETOOL_H +#define _PREVIEWGUIDETOOL_H + +#include "Tool.h" + +/** Draws guide lines over the panorama in fast preview window + */ +class PreviewGuideTool : public PreviewTool +{ +public: + enum Guides + { + NONE=0, + THIRDS=1, + GOLDENRATIO=2, + DIAGONAL=3, + TRIANGLE_DOWN=4, + TRIANGLE_UP=5 + }; + /** constructor */ + PreviewGuideTool(PreviewToolHelper *helper); + /** activate the tool */ + void Activate(); + /** draws the lines */ + void ReallyAfterDrawImagesEvent(); + /** sets the guide style to the given style */ + void SetGuideStyle(const Guides newGuideStyle); + /** returns the current guide style */ + const Guides GetGuideStyle() const; +private: + Guides m_guide; +}; + +#endif diff -r c1a3cf06612c -r 231abc663cf1 src/hugin1/hugin/xrc/preview_frame.xrc --- a/src/hugin1/hugin/xrc/preview_frame.xrc Mon Sep 26 18:36:31 2011 +0200 +++ b/src/hugin1/hugin/xrc/preview_frame.xrc Wed Sep 28 17:43:27 2011 +0200 @@ -708,6 +708,41 @@ <object class="wxBoxSizer"> <object class="sizeritem"> <object class="wxStaticText"> + <label>Guides:</label> + </object> + <flag>wxALL</flag> + <border>5</border> + </object> + <object class="sizeritem"> + <object class="wxChoice" name="preview_guide_choice"> + <content> + <item>None</item> + <item>Rule of third</item> + <item>Golden ratio</item> + <item>Diagonal</item> + <item>Golden triangle (down)</item> + <item>Golden triangle (up)</item> + </content> + <selection>0</selection> + </object> + <flag>wxLEFT|wxBOTTOM|wxRIGHT</flag> + <border>5</border> + </object> + <orient>wxVERTICAL</orient> + </object> + <flag>wxALL|wxALIGN_CENTRE_VERTICAL</flag> + <border>5</border> + </object> + <object class="sizeritem"> + <object class="wxStaticLine"> + <size>2,-1</size> + </object> + <flag>wxEXPAND|wxALIGN_CENTRE_VERTICAL</flag> + </object> + <object class="sizeritem"> + <object class="wxBoxSizer"> + <object class="sizeritem"> + <object class="wxStaticText"> <label>left:</label> </object> <flag>wxLEFT|wxRIGHT|wxALIGN_CENTRE_VERTICAL</flag> @@ -1347,6 +1382,41 @@ <object class="wxBoxSizer"> <object class="sizeritem"> <object class="wxStaticText"> + <label>Guides:</label> + </object> + <flag>wxALL</flag> + <border>5</border> + </object> + <object class="sizeritem"> + <object class="wxChoice" name="preview_guide_choice"> + <content> + <item>None</item> + <item>Rule of third</item> + <item>Golden ratio</item> + <item>Diagonal</item> + <item>Golden triangle (down)</item> + <item>Golden triangle (up)</item> + </content> + <selection>0</selection> + </object> + <flag>wxLEFT|wxBOTTOM|wxRIGHT</flag> + <border>5</border> + </object> + <orient>wxVERTICAL</orient> + </object> + <flag>wxALL|wxALIGN_CENTRE_VERTICAL</flag> + <border>5</border> + </object> + <object class="sizeritem"> + <object class="wxStaticLine"> + <size>2,-1</size> + </object> + <flag>wxEXPAND|wxALIGN_CENTRE_VERTICAL</flag> + </object> + <object class="sizeritem"> + <object class="wxBoxSizer"> + <object class="sizeritem"> + <object class="wxStaticText"> <label>left:</label> </object> <flag>wxLEFT|wxRIGHT|wxALIGN_CENTRE_VERTICAL</flag> |