From: <gko...@us...> - 2009-05-08 16:59:55
|
Revision: 3839 http://hugin.svn.sourceforge.net/hugin/?rev=3839&view=rev Author: gkohlmeyer Date: 2009-05-08 16:59:47 +0000 (Fri, 08 May 2009) Log Message: ----------- [FIX] Better handling of OpenGL difference tool and OpenGL capabilities detection Modified Paths: -------------- hugin/trunk/src/hugin1/hugin/GLPreviewFrame.cpp hugin/trunk/src/hugin1/hugin/GLPreviewFrame.h hugin/trunk/src/hugin1/hugin/PreviewDifferenceTool.cpp Modified: hugin/trunk/src/hugin1/hugin/GLPreviewFrame.cpp =================================================================== --- hugin/trunk/src/hugin1/hugin/GLPreviewFrame.cpp 2009-05-08 13:57:49 UTC (rev 3838) +++ hugin/trunk/src/hugin1/hugin/GLPreviewFrame.cpp 2009-05-08 16:59:47 UTC (rev 3839) @@ -31,6 +31,9 @@ #include <config.h> +#define GLEW_STATIC +#include <GL/glew.h> + #include "panoinc_WX.h" #include "panoinc.h" @@ -129,8 +132,16 @@ PF_STYLE), m_pano(pano) { - DEBUG_TRACE(""); + DEBUG_TRACE(""); + // initialize pointer + helper = NULL; + crop_tool = NULL; + drag_tool = NULL; + identify_tool = NULL ; + difference_tool = NULL; + pano_mask_tool = NULL; + m_oldProjFormat = -1; m_ToolBar = wxXmlResource::Get()->LoadToolBar(this, wxT("fast_preview_toolbar")); DEBUG_ASSERT(m_ToolBar); @@ -142,12 +153,6 @@ DEBUG_ASSERT(crop_tool_id != -2); identify_tool_id = wxXmlResource::Get()->GetXRCID(wxT("preview_identify_tool")); DEBUG_ASSERT(identify_tool_id != -2); - - /* We zero this pointer as it is used to check if the tool objects were ever - * created when the GLPreviewFrame is deleted, and therefore if the tools - * need freeing. The tools are created only when the preview is used. - */ - crop_tool = 0; m_topsizer = new wxBoxSizer( wxVERTICAL ); @@ -269,14 +274,30 @@ wxALL | wxALIGN_CENTER_VERTICAL, // draw border all around 5); // border width - m_choices[0] = _("normal"); - m_choices[1] = _("difference"); - - int oldMode = wxConfigBase::Get()->Read(wxT("/GLPreviewFrame/blendMode"), 0l); - if (oldMode > 1) oldMode = 0; + // prepare choice item for blend selection + int numBlendChoices = 0; + m_choices[numBlendChoices++] = _("normal"); + // test of OpenGL extension GL_ARB_imaging for difference blend + GLenum err = glewInit(); + if (GLEW_OK != err) + { + if (glewIsSupported("GL_ARB_imaging")) + { + // GL_ARB_imaging available, add difference mode to choice + m_choices[numBlendChoices++] = _("difference"); + } + } + // create choice item m_BlendModeChoice = new wxChoice(this, ID_BLEND_CHOICE, wxDefaultPosition, wxDefaultSize, - 2, m_choices); + numBlendChoices, m_choices); + // get blend mode last state + int oldMode = wxConfigBase::Get()->Read(wxT("/GLPreviewFrame/blendMode"), 0l); + // limit old state to max available states + if (oldMode >= numBlendChoices) + { + oldMode = 0; + } m_BlendModeChoice->SetSelection(oldMode); blendModeSizer->Add(m_BlendModeChoice, @@ -401,9 +422,6 @@ RestoreFramePosition(this, wxT("GLPreviewFrame")); - // TODO tell renderer - // m_PreviewPanel->SetBlendMode((PreviewPanel::BlendMode)oldMode ); - #ifdef __WXMSW__ // wxFrame does have a strange background color on Windows.. this->SetBackgroundColour(m_GLViewer->GetBackgroundColour()); @@ -412,6 +430,7 @@ if (config->Read(wxT("/GLPreviewFrame/isShown"), 0l) != 0) { Show(); } + crop_tool = 0; } GLPreviewFrame::~GLPreviewFrame() @@ -444,6 +463,42 @@ DEBUG_TRACE("dtor end"); } +/** +* Update tools and GUI elements according to blend mode choice +*/ +void GLPreviewFrame::updateBlendMode() +{ + if (m_BlendModeChoice != NULL) + { + switch (m_BlendModeChoice->GetSelection()) + { + case 0: + // normal node + if (helper != NULL + && difference_tool != NULL) + { + helper->DeactivateTool(difference_tool); + } + break; + case 1: + // difference mode + if (helper != NULL + && identify_tool != NULL + && difference_tool != NULL + && m_ToolBar != NULL) + { + helper->DeactivateTool(identify_tool); + m_ToolBar->ToggleTool(identify_tool_id, false); + helper->ActivateTool(difference_tool); + CleanButtonColours(); + } + break; + default: + DEBUG_WARN("Unknown blend mode selected"); + } + } +} + void GLPreviewFrame::panoramaChanged(Panorama &pano) { const PanoramaOptions & opts = pano.getOptions(); @@ -858,22 +913,12 @@ void GLPreviewFrame::OnBlendChoice(wxCommandEvent & e) { - if (e.GetEventObject() == m_BlendModeChoice) { - int sel = e.GetSelection(); - switch (sel) { - case 0: - helper->DeactivateTool(difference_tool); - break; - case 1: - helper->DeactivateTool(identify_tool); - m_ToolBar->ToggleTool(identify_tool_id, false); - helper->ActivateTool(difference_tool); - CleanButtonColours(); - break; - default: - DEBUG_WARN("Unknown blend mode selected"); - } - } else { + if (e.GetEventObject() == m_BlendModeChoice) + { + updateBlendMode(); + } + else + { // FIXME DEBUG_WARN("wxChoice event from unknown object received"); } } @@ -919,7 +964,7 @@ new PT::SetPanoOptionsCmd( m_pano, opt ) ); DEBUG_DEBUG ("Projection changed: " << lt); - Refresh(); + } else { // FIXME DEBUG_WARN("wxChoice event from unknown object received"); } @@ -1007,10 +1052,8 @@ // activate tools that are always active. helper->ActivateTool(pano_mask_tool); - // activate difference tool, when selected difference mode at last use - int blendMode = wxConfigBase::Get()->Read(wxT("/GLPreviewFrame/blendMode"), 0l); - if(blendMode==1) - helper->ActivateTool(difference_tool); + // update the blend mode which activates some tools + updateBlendMode(); } void GLPreviewFrame::OnCrop(wxCommandEvent & e) Modified: hugin/trunk/src/hugin1/hugin/GLPreviewFrame.h =================================================================== --- hugin/trunk/src/hugin1/hugin/GLPreviewFrame.h 2009-05-08 13:57:49 UTC (rev 3838) +++ hugin/trunk/src/hugin1/hugin/GLPreviewFrame.h 2009-05-08 16:59:47 UTC (rev 3839) @@ -126,7 +126,8 @@ void OnProjectionChoice(wxCommandEvent & e); // No HDR display yet // void OnOutputChoice(wxCommandEvent & e); - + // update tools according to blend mode choice + void updateBlendMode(); // update the panorama display void updatePano(); private: Modified: hugin/trunk/src/hugin1/hugin/PreviewDifferenceTool.cpp =================================================================== --- hugin/trunk/src/hugin1/hugin/PreviewDifferenceTool.cpp 2009-05-08 13:57:49 UTC (rev 3838) +++ hugin/trunk/src/hugin1/hugin/PreviewDifferenceTool.cpp 2009-05-08 16:59:47 UTC (rev 3839) @@ -44,10 +44,12 @@ void PreviewDifferenceTool::Activate() { over_image = false; - // activate only if OpenGL extension GL_ARB_imaging is available + // Activate difference tool only if OpenGL extension GL_ARB_imaging is available // cause the extension contains required functions like glBlendEquation - std::string result((char*)glGetString(GL_EXTENSIONS)); - if (result.find("GL_ARB_imaging", 0) != std::string::npos || result.find("GL_EXT_blend_subtract",0)!=std::string::npos) + // In general this check should be superfluous, due to the fact that the preview frame + // must check the OpenGL capabilities and never call this method if differencing is + // not supported, but check twice is saver. + if (glewIsSupported("GL_ARB_imaging")) { helper->NotifyMe(PreviewToolHelper::IMAGES_UNDER_MOUSE_CHANGE, this); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |