From: <jl...@us...> - 2008-07-26 03:14:01
|
Revision: 3240 http://hugin.svn.sourceforge.net/hugin/?rev=3240&view=rev Author: jlegg Date: 2008-07-26 03:13:58 +0000 (Sat, 26 Jul 2008) Log Message: ----------- Started Drag tool, fixed clipping corruption bug, and fixed aspect ratio of circular crop wrong bug. There is still some improvements needed in circular cropping. Modified Paths: -------------- hugin/branches/gsoc2008_opengl_preview/src/hugin1/hugin/CMakeLists.txt hugin/branches/gsoc2008_opengl_preview/src/hugin1/hugin/GLPreviewFrame.cpp hugin/branches/gsoc2008_opengl_preview/src/hugin1/hugin/MeshRemapper.cpp hugin/branches/gsoc2008_opengl_preview/src/hugin1/hugin/MeshRemapper.h hugin/branches/gsoc2008_opengl_preview/src/hugin1/hugin/OutputProjectionInfo.cpp hugin/branches/gsoc2008_opengl_preview/src/hugin1/hugin/OutputProjectionInfo.h hugin/branches/gsoc2008_opengl_preview/src/hugin1/hugin/PreviewToolHelper.cpp hugin/branches/gsoc2008_opengl_preview/src/hugin1/hugin/PreviewToolHelper.h hugin/branches/gsoc2008_opengl_preview/src/hugin1/hugin/TexCoordRemapper.cpp Added Paths: ----------- hugin/branches/gsoc2008_opengl_preview/src/hugin1/hugin/PreviewDragTool.cpp hugin/branches/gsoc2008_opengl_preview/src/hugin1/hugin/PreviewDragTool.h Modified: hugin/branches/gsoc2008_opengl_preview/src/hugin1/hugin/CMakeLists.txt =================================================================== --- hugin/branches/gsoc2008_opengl_preview/src/hugin1/hugin/CMakeLists.txt 2008-07-25 17:04:06 UTC (rev 3239) +++ hugin/branches/gsoc2008_opengl_preview/src/hugin1/hugin/CMakeLists.txt 2008-07-26 03:13:58 UTC (rev 3240) @@ -32,7 +32,7 @@ HFOVDialog.cpp TextureManager.cpp MeshRemapper.cpp VertexCoordRemapper.cpp TexCoordRemapper.cpp ChoosyRemapper.cpp MeshManager.cpp ViewState.cpp OutputProjectionInfo.cpp PreviewToolHelper.cpp PreviewTool.cpp -PreviewCropTool.cpp) +PreviewCropTool.cpp PreviewDragTool.cpp) IF(APPLE) if (MAC_SELF_CONTAINED_BUNDLE) Modified: hugin/branches/gsoc2008_opengl_preview/src/hugin1/hugin/GLPreviewFrame.cpp =================================================================== --- hugin/branches/gsoc2008_opengl_preview/src/hugin1/hugin/GLPreviewFrame.cpp 2008-07-25 17:04:06 UTC (rev 3239) +++ hugin/branches/gsoc2008_opengl_preview/src/hugin1/hugin/GLPreviewFrame.cpp 2008-07-26 03:13:58 UTC (rev 3240) @@ -963,14 +963,14 @@ void GLPreviewFrame::OnCrop(wxCommandEvent & e) { - // turn on or off the crop tool when it's button is pressed. + // turn on or off the crop tool when its button is pressed. if (e.IsChecked()) { helper->ActivateTool(crop_tool); } else { + helper->DeactivateTool(crop_tool); // the tool draws some extra guides that need covering up m_GLViewer->Refresh(); - helper->DeactivateTool(crop_tool); } } Modified: hugin/branches/gsoc2008_opengl_preview/src/hugin1/hugin/MeshRemapper.cpp =================================================================== --- hugin/branches/gsoc2008_opengl_preview/src/hugin1/hugin/MeshRemapper.cpp 2008-07-25 17:04:06 UTC (rev 3239) +++ hugin/branches/gsoc2008_opengl_preview/src/hugin1/hugin/MeshRemapper.cpp 2008-07-26 03:13:58 UTC (rev 3240) @@ -71,12 +71,13 @@ circle_crop = src->getCropMode() == HuginBase::SrcPanoImage::CROP_CIRCLE; if (circle_crop) { + circle_crop_aspect = height / width; + //circle_crop_aspect *= circle_crop_aspect; circle_crop_centre_x = (crop_x1 + crop_x2) / 2.0; circle_crop_centre_y = (crop_y1 + crop_y2) / 2.0; double width = crop_x2 - crop_x1, height = crop_y2 - crop_y1; - circle_crop_radius = width < height ? width : height; - circle_crop_radius /= 2.0; + circle_crop_radius = (width < height ? width : height) / 2.0; } // hugin allows negative cropping regions, but we are expected to only // output the regions that exist in the original image, so clamp the values: @@ -191,8 +192,8 @@ // now substitute t into the edge we are testing's line: x = dx * t + v1->tex_c[0], y = dy * t + v1->tex_c[1], - // move the vertex coordinates to match the texture ones. - // t = 0 would give v1, t = 1 would give v2; so we linearly interpolate by t: + // move the vertex coordinates to match the texture ones. + // t = 0 would give v1, t = 1 would give v2; so we linearly interpolate by t: td1 = 1.0 - t, xc = v1->vertex_c[0] * td1 + v2->vertex_c[0] * t, yc = v1->vertex_c[1] * td1 + v2->vertex_c[1] * t; @@ -327,14 +328,21 @@ * image is contained within the input face, but then the interpolation * there would make it well out of sync anyway, so it's no big deal. */ + /* Since the coordinates are scaled to between 0 and 1, we actually need to + * crop to a elipse to get the aspect ratio right. + */ if (circle_crop) { - for (unsigned int edge = 0; edge < circle_clip_detail; edge++) + for (unsigned int edge = 0; edge < /*4*/ circle_clip_detail; edge++) { + /*double angle =-M_PI / 2.0 - atan2(face->tex_c[edge % 2][edge / 2][0] + - circle_crop_centre_x, + face->tex_c[edge % 2][edge / 2][1] + - circle_crop_centre_y),*/ double angle = (double) edge * circle_clip_inc, - ac_x = sin(angle), - ac_y = cos(angle), - clip_line[3] = {ac_x, ac_y, circle_crop_radius + ac_x = sin(angle) / (circle_crop_radius * circle_crop_aspect), + ac_y = cos(angle) / circle_crop_radius, + clip_line[3] = {ac_x, ac_y, 1.0 - ac_x * circle_crop_centre_x - ac_y * circle_crop_centre_y}; poly = poly.Clip(clip_line); @@ -358,8 +366,8 @@ { for (unsigned short int c = 0; c < 2; c++) { - result->tex_c[x][y][0] = face_list.back().tex_c[x][y][0]; - result->vertex_c[x][y][0] = face_list.back().vertex_c[x][y][0]; + result->tex_c[x][y][c] = face_list.back().tex_c[x][y][c]; + result->vertex_c[x][y][c] = face_list.back().vertex_c[x][y][c]; } } } Modified: hugin/branches/gsoc2008_opengl_preview/src/hugin1/hugin/MeshRemapper.h =================================================================== --- hugin/branches/gsoc2008_opengl_preview/src/hugin1/hugin/MeshRemapper.h 2008-07-25 17:04:06 UTC (rev 3239) +++ hugin/branches/gsoc2008_opengl_preview/src/hugin1/hugin/MeshRemapper.h 2008-07-26 03:13:58 UTC (rev 3240) @@ -91,7 +91,8 @@ // cropping of the source image HuginBase::SrcPanoImage::CropMode crop_mode; double crop_x1, crop_x2, crop_y1, crop_y2, - circle_crop_centre_x, circle_crop_centre_y, circle_crop_radius; + circle_crop_centre_x, circle_crop_centre_y, circle_crop_radius, + circle_crop_aspect; bool circle_crop; void SetCrop(); // fill the above values // crop a face to the source image, return true if there is anything left. Modified: hugin/branches/gsoc2008_opengl_preview/src/hugin1/hugin/OutputProjectionInfo.cpp =================================================================== --- hugin/branches/gsoc2008_opengl_preview/src/hugin1/hugin/OutputProjectionInfo.cpp 2008-07-25 17:04:06 UTC (rev 3239) +++ hugin/branches/gsoc2008_opengl_preview/src/hugin1/hugin/OutputProjectionInfo.cpp 2008-07-26 03:13:58 UTC (rev 3240) @@ -122,3 +122,22 @@ return result * -2.0 + proj->getSize()->x; } + +// Use the transformations to get arbitary points. + +bool OutputProjectionInfo::AngularToImage(double &image_x, double &image_y, + double yaw, double pitch) +{ + return transform.transformImgCoord(image_x, image_y, + yaw + 180.0, pitch + 90.0); +} + +bool OutputProjectionInfo::ImageToAngular(double &yaw, double &pitch, + double image_x, double image_y) +{ + bool r = reverse_transform.transformImgCoord(yaw, pitch, image_x, image_y); + yaw -= 180.0; + pitch -= 90.0; + return r; +} + Modified: hugin/branches/gsoc2008_opengl_preview/src/hugin1/hugin/OutputProjectionInfo.h =================================================================== --- hugin/branches/gsoc2008_opengl_preview/src/hugin1/hugin/OutputProjectionInfo.h 2008-07-25 17:04:06 UTC (rev 3239) +++ hugin/branches/gsoc2008_opengl_preview/src/hugin1/hugin/OutputProjectionInfo.h 2008-07-26 03:13:58 UTC (rev 3240) @@ -73,6 +73,9 @@ {return south_pole_x;} const double GetSouthPoleY() const {return south_pole_y;} + // use the transformation for anything else + bool AngularToImage(double &image_x, double &image_y, double yaw, double pitch); + bool ImageToAngular(double &yaw, double &pitch, double image_x, double image_y); private: double lower_x, middle_x, upper_x, lower_y, middle_y, upper_y, Added: hugin/branches/gsoc2008_opengl_preview/src/hugin1/hugin/PreviewDragTool.cpp =================================================================== --- hugin/branches/gsoc2008_opengl_preview/src/hugin1/hugin/PreviewDragTool.cpp (rev 0) +++ hugin/branches/gsoc2008_opengl_preview/src/hugin1/hugin/PreviewDragTool.cpp 2008-07-26 03:13:58 UTC (rev 3240) @@ -0,0 +1,124 @@ +// -*- c-basic-offset: 4 -*- +/** @file PreviewDragTool.cpp + * + * @author James Legg + * + * 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 "PreviewDragTool.h" +#include <math.h> + +PreviewDragTool::PreviewDragTool(PreviewToolHelper *helper) + : PreviewTool(helper) +{ +} + +void PreviewDragTool::Activate() +{ + drag_yaw = false; drag_pitch = false; drag_roll = false; + shift = false; control = false; alt = false; + // register notifications + helper->NotifyMe(PreviewToolHelper::MOUSE_MOVE, this); + helper->NotifyMe(PreviewToolHelper::MOUSE_PRESS, this); + helper->NotifyMe(PreviewToolHelper::KEY_PRESS, this); +} + +void PreviewDragTool::MouseMoveEvent(double x, double y) +{ + if (drag_yaw || drag_pitch || drag_roll) + { + // move the selected images on the tempory copies. + // redraw + } +} + +void PreviewDragTool::MouseButtonEvent(unsigned short int button, bool pressed) +{ + if (pressed) + { + switch (button) + { + // primary button + case 0: + // different things depending on modifier keys. + if (!(alt && shift && control)) + { + // no keys + drag_yaw = true; drag_pitch = true; + } + else if (shift && !(control || alt)) + { + drag_pitch = true; + } + else if (control && !(alt || shift)) + { + drag_roll = true; + } + else if (alt && !(control || shift)) + { + drag_yaw = true; + } + break; + case 1: + if (!(alt && shift && control)) + { + drag_roll = true; + } + break; + } + if (drag_roll) + { + // set centre and angle + HuginBase::PanoramaOptions *opts + = helper->GetViewStatePtr()->GetOptions(); + centre.x = double (opts->getSize().width()) / 2.0; + centre.y = double (opts->getSize().height()) / 2.0; + hugin_utils::FDiff2D angular = centre - helper->GetMousePosition(); + start_angle = atan2(angular.y, angular.x); + } + if (drag_yaw || drag_pitch) + { + // set angles + hugin_utils::FDiff2D mouse_pos = helper->GetMousePosition(); + double yaw, pitch; + helper->GetViewStatePtr()->GetProjectionInfo()->ImageToAngular(yaw, + pitch, mouse_pos.x, mouse_pos.y); + start_coordinates.x = yaw; + start_coordinates.y = pitch; + } + if (drag_roll || drag_yaw || drag_pitch) + { + // record where the images are so we know what the difference is. + // TODO use the topmost drawn component instead of all of the images + // directly under the cursor. + dragging_images = helper->GetImageNumbersUnderMouse(); + // TODO record where they are. + } + } else { + // apply rotations permanently + // stop dragging + drag_yaw = false; drag_pitch = false; drag_roll = false; + } +} + +void PreviewDragTool::KeypressEvent(int keycode, bool pressed) +{ + if (keycode == WXK_SHIFT) shift = pressed; + if (keycode == WXK_CONTROL) control = pressed; + if (keycode == WXK_ALT) alt = pressed; +} + Added: hugin/branches/gsoc2008_opengl_preview/src/hugin1/hugin/PreviewDragTool.h =================================================================== --- hugin/branches/gsoc2008_opengl_preview/src/hugin1/hugin/PreviewDragTool.h (rev 0) +++ hugin/branches/gsoc2008_opengl_preview/src/hugin1/hugin/PreviewDragTool.h 2008-07-26 03:13:58 UTC (rev 3240) @@ -0,0 +1,67 @@ +// -*- c-basic-offset: 4 -*- +/** @file PreviewDragTool.h + * + * @author James Legg + * + * 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 + * + */ + +/* This tool allows the user to change the yaw, pitch and roll of a connected + * component of images by dragging them. + * If there are multiple components under the pointer when the user begins to + * drag, the lowest number one is chosen, since it is drawn on top. + * + * Modifiers | Variables changed + * none | yaw and pitch + * shift | pitch + * control | roll + * alt | yaw + * + * You can also change only pitch by using the secondary mouse button (if there + * is one). + * + *(Reasoning: control click on mac is equivalent right click on other platforms, + * no modifiers should be close to old behaviour, where modifiers were not used, + * shift and alt chosen arbitrarily but more portable than meta or the like.) + */ + +#ifndef _PREVIEWDRAGTOOL_H +#define _PREVIEWDRAGTOOL_H + +#include "PreviewTool.h" + +#include <set> + +class PreviewDragTool : public PreviewTool +{ +public: + PreviewDragTool(PreviewToolHelper *helper); + void Activate(); + void MouseMoveEvent(double x, double y); + void MouseButtonEvent(unsigned short int button, bool pressed); + void KeypressEvent(int keycode, bool pressed); +private: + std::set<unsigned int> dragging_images; + bool drag_yaw; + bool drag_pitch; + bool drag_roll; + double start_angle; + hugin_utils::FDiff2D centre; + hugin_utils::FDiff2D start_coordinates; + bool shift, control, alt; +}; + +#endif Modified: hugin/branches/gsoc2008_opengl_preview/src/hugin1/hugin/PreviewToolHelper.cpp =================================================================== --- hugin/branches/gsoc2008_opengl_preview/src/hugin1/hugin/PreviewToolHelper.cpp 2008-07-25 17:04:06 UTC (rev 3239) +++ hugin/branches/gsoc2008_opengl_preview/src/hugin1/hugin/PreviewToolHelper.cpp 2008-07-26 03:13:58 UTC (rev 3240) @@ -148,9 +148,9 @@ return images_under_mouse; } -std::pair<double, double> PreviewToolHelper::GetMousePosition() +hugin_utils::FDiff2D PreviewToolHelper::GetMousePosition() { - return std::pair<unsigned int, unsigned int>(mouse_x, mouse_y); + return hugin_utils::FDiff2D(mouse_x, mouse_y); } ViewState *PreviewToolHelper::GetViewStatePtr() Modified: hugin/branches/gsoc2008_opengl_preview/src/hugin1/hugin/PreviewToolHelper.h =================================================================== --- hugin/branches/gsoc2008_opengl_preview/src/hugin1/hugin/PreviewToolHelper.h 2008-07-25 17:04:06 UTC (rev 3239) +++ hugin/branches/gsoc2008_opengl_preview/src/hugin1/hugin/PreviewToolHelper.h 2008-07-26 03:13:58 UTC (rev 3240) @@ -55,6 +55,7 @@ #include <vector> #include <utility> +#include <hugin_math/hugin_math.h> #include "ViewState.h" #include "panoinc.h" @@ -93,7 +94,7 @@ // Get information std::set<unsigned int> GetImageNumbersUnderMouse(); - std::pair<double, double> GetMousePosition(); + hugin_utils::FDiff2D GetMousePosition(); ViewState *GetViewStatePtr(); PT::Panorama *GetPanoramaPtr(); Modified: hugin/branches/gsoc2008_opengl_preview/src/hugin1/hugin/TexCoordRemapper.cpp =================================================================== --- hugin/branches/gsoc2008_opengl_preview/src/hugin1/hugin/TexCoordRemapper.cpp 2008-07-25 17:04:06 UTC (rev 3239) +++ hugin/branches/gsoc2008_opengl_preview/src/hugin1/hugin/TexCoordRemapper.cpp 2008-07-26 03:13:58 UTC (rev 3240) @@ -113,7 +113,7 @@ /* Since we only crop to convex regions, having all four points inside the * wanted region implies we don't need to do any clipping. It should be * faster to test for this and skip full clipping in that case, as the vast - * majority of faces will not need any clipping. + * majority of faces will not need any clipping or fail the test above. */ HuginBase::SrcPanoImage *src_img = view_state->GetSrcImage(image_number); if ( src_img->isInside(vigra::Point2D(int(result->tex_c[0][0][0] * width), This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |