[Racer-svn] SF.net SVN: racer:[19] trunk/racer_editor
Status: Alpha
Brought to you by:
jlegg
From: <jl...@us...> - 2009-09-16 21:18:11
|
Revision: 19 http://racer.svn.sourceforge.net/racer/?rev=19&view=rev Author: jlegg Date: 2009-09-16 21:18:05 +0000 (Wed, 16 Sep 2009) Log Message: ----------- Implement zoom controls in the editor. Modified Paths: -------------- trunk/racer_editor/EditorWindow.cpp trunk/racer_editor/View.cpp trunk/racer_editor/View.h trunk/racer_editor/Viewport.cpp trunk/racer_editor/Viewport.h Modified: trunk/racer_editor/EditorWindow.cpp =================================================================== --- trunk/racer_editor/EditorWindow.cpp 2009-09-16 13:44:22 UTC (rev 18) +++ trunk/racer_editor/EditorWindow.cpp 2009-09-16 21:18:05 UTC (rev 19) @@ -358,17 +358,20 @@ void EditorWindow::on_action_view_zoom_in() { - PRINT_STUB_MESSAGE; + m_viewport_top.zoom_in(); + m_viewport_side.zoom_in(); } void EditorWindow::on_action_view_zoom_out() { - PRINT_STUB_MESSAGE; + m_viewport_top.zoom_out(); + m_viewport_side.zoom_out(); } void EditorWindow::on_action_view_zoom_to_fit() { - PRINT_STUB_MESSAGE; + m_viewport_top.scale_to_fit(); + m_viewport_side.scale_to_fit(); } void EditorWindow::on_action_help_about() Modified: trunk/racer_editor/View.cpp =================================================================== --- trunk/racer_editor/View.cpp 2009-09-16 13:44:22 UTC (rev 18) +++ trunk/racer_editor/View.cpp 2009-09-16 21:18:05 UTC (rev 19) @@ -20,9 +20,8 @@ Gdk::GL::MODE_DEPTH | Gdk::GL::MODE_DOUBLE)) , document(0) - , scale(8) - , centre_x(0) - , centre_y(0) + , scale(8.0) + , centre(0.0, 0.0, 0.0) , view_angle(VIEW_TOP) { if (!m_gl_config) @@ -45,8 +44,35 @@ void View::set_angle(const ViewAngle angle_in) { view_angle = angle_in; + needs_recentre = true; } +View::ViewAngle View::get_angle() const +{ + return view_angle; +} + +void View::set_scale(const float scale_in) +{ + scale = scale_in; + needs_recentre = true; +} + +float View::get_scale() const +{ + return scale; +} + +void View::set_centre(const btVector3 centre_in) +{ + centre = centre_in; +} + +btVector3 View::get_centre() const +{ + return centre; +} + void View::on_realize() { Gtk::GL::DrawingArea::on_realize(); @@ -72,15 +98,16 @@ gluOrtho2D(-get_width() / 2.0 + 0.5, get_width() / 2.0 + 0.5, -get_height() / 2.0 + 0.5, get_height() / 2.0 + 0.5); glMatrixMode(GL_MODELVIEW); - recenter_view(); + recentre_view(); gldrawable->gl_end(); return true; } -void View::recenter_view() +void View::recentre_view() { + glLoadIdentity(); + glTranslatef(centre.x(), centre.y(), centre.z()); // rotations - glLoadIdentity(); switch (view_angle) { case VIEW_TOP: @@ -98,7 +125,7 @@ break; } glScalef(scale, scale, scale); - /// @todo translate centre. + needs_recentre = false; } bool View::on_expose_event(GdkEventExpose* event) @@ -109,6 +136,12 @@ { return false; } + + if (needs_recentre) + { + recentre_view(); + } + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // get the track to draw. Modified: trunk/racer_editor/View.h =================================================================== --- trunk/racer_editor/View.h 2009-09-16 13:44:22 UTC (rev 18) +++ trunk/racer_editor/View.h 2009-09-16 21:18:05 UTC (rev 19) @@ -48,16 +48,37 @@ * @param The ViewAngle to use for the perspective. */ void set_angle(const ViewAngle angle); + + /// Get the perspective of the view. @see set_angle() + ViewAngle get_angle() const; + + /** Set the scale to display the track at. A scale of 1 means 1 pixel is + * one spatial unit. + */ + void set_scale(const float scale); + + /// get the scale. @see set_scale() + float get_scale() const; + + /** Set the centre of the view. + * @param centre The position to have in the middle of the screen. + */ + void set_centre(btVector3 centre); + + /// Get the centre of the view. @see set_centre() + btVector3 get_centre() const; protected: // signal handlers: virtual void on_realize(); virtual bool on_configure_event(GdkEventConfigure* event); virtual bool on_expose_event(GdkEventExpose* event); - // move the view into the centre - void recenter_view(); + /** Set the OpenGL modelview matrix so we can draw the scene with the + * correct orientation, scale, and centre. + */ + void recentre_view(); - // Draw the path of the track. + /// Draw the path of the track. void draw_path(const Track::Path & path); Glib::RefPtr<Gdk::GL::Config> m_gl_config; @@ -69,12 +90,12 @@ float scale; /// The x coordinate in the middle of the display. - float centre_x; - /// The y coordinate in the middle of the display. - float centre_y; + btVector3 centre; /// Which perspective of the scene to use. ViewAngle view_angle; + + bool needs_recentre; }; #endif /*VIEW_H_*/ Modified: trunk/racer_editor/Viewport.cpp =================================================================== --- trunk/racer_editor/Viewport.cpp 2009-09-16 13:44:22 UTC (rev 18) +++ trunk/racer_editor/Viewport.cpp 2009-09-16 21:18:05 UTC (rev 19) @@ -10,13 +10,15 @@ */ #include "Viewport.h" +#include <Debug.h> + Viewport::Viewport() - : - Gtk::Table(2, 2), - m_h_scroll_adjustment(49.5, 0.0, 101.0, 0.1, 1.0, 1.0), - m_h_scroll_bar(m_h_scroll_adjustment), - m_v_scroll_adjustment(49.5, 0.0, 101.0, 0.1, 1.0, 1.0), - m_v_scroll_bar(m_v_scroll_adjustment) + : Gtk::Table(2, 2) + , m_h_scroll_adjustment(49.5, 0.0, 101.0, 0.1, 1.0, 1.0) + , m_h_scroll_bar(m_h_scroll_adjustment) + , m_v_scroll_adjustment(49.5, 0.0, 101.0, 0.1, 1.0, 1.0) + , m_v_scroll_bar(m_v_scroll_adjustment) + , document(0) { attach(m_h_scroll_bar, 0, 1, 1, 2, Gtk::FILL | Gtk::EXPAND, Gtk::SHRINK); @@ -33,14 +35,16 @@ { } -void Viewport::set_document(Document::Document & document) +void Viewport::set_document(Document::Document & document_in) { - m_view.set_document(document); + document = &document_in; + m_view.set_document(document_in); + resize_adjustments(); } void Viewport::update() { - /// @todo Change scrollbar range to fit. + resize_adjustments(); // Redraw the view to reflect the changed track. m_view.queue_draw(); } @@ -48,5 +52,99 @@ void Viewport::set_angle(const ViewAngle angle) { m_view.set_angle(angle); - /// @todo update bounds, recentre. + resize_adjustments(); } + +void Viewport::zoom_in() +{ + m_view.set_scale(m_view.get_scale() * 1.25); + resize_adjustments(); +} + +void Viewport::zoom_out() +{ + m_view.set_scale(m_view.get_scale() * 0.8); + resize_adjustments(); +} + +void Viewport::scale_to_fit() +{ + // find the scale to fit in each direction. + float scale_x = double(m_view.get_width()) / + ( m_h_scroll_adjustment.get_upper() - + m_h_scroll_adjustment.get_lower()); + float scale_y = double(m_view.get_height()) / + ( m_v_scroll_adjustment.get_upper() - + m_v_scroll_adjustment.get_lower()); + // now use the largest scale so they both fit. + if (scale_x < scale_y) + { + m_view.set_scale(scale_x); + } + else + { + m_view.set_scale(scale_y); + } + resize_adjustments(); +} + +void Viewport::resize_adjustments() +{ + // don't adjust before a document is assigned. + if (!document) + { + DEBUG_MESSAGE(" No track to use to set scrollbar adjustments"); + return; + } + const Track::AxisAlignedBoundingBox box(document->get_track().get_path().get_bounding_box()); + if (box.valid()) + { + switch (m_view.get_angle()) + { + case View::VIEW_TOP: + m_h_scroll_adjustment.set_lower(box.get_min_x()); + m_h_scroll_adjustment.set_upper(box.get_max_x()); + m_v_scroll_adjustment.set_lower(box.get_min_y()); + m_v_scroll_adjustment.set_upper(box.get_max_y()); + m_h_scroll_adjustment.set_value(m_view.get_centre().x()); + m_v_scroll_adjustment.set_value(m_view.get_centre().y()); + break; + case View::VIEW_SIDE: + m_h_scroll_adjustment.set_lower(box.get_min_y()); + m_h_scroll_adjustment.set_upper(box.get_max_y()); + m_v_scroll_adjustment.set_lower(box.get_min_z()); + m_v_scroll_adjustment.set_upper(box.get_max_z()); + m_h_scroll_adjustment.set_value(m_view.get_centre().y()); + m_v_scroll_adjustment.set_value(m_view.get_centre().z()); + break; + case View::VIEW_FRONT: + m_h_scroll_adjustment.set_lower(box.get_min_x()); + m_h_scroll_adjustment.set_upper(box.get_max_x()); + m_v_scroll_adjustment.set_lower(box.get_min_z()); + m_v_scroll_adjustment.set_upper(box.get_max_z()); + m_h_scroll_adjustment.set_value(m_view.get_centre().x()); + m_v_scroll_adjustment.set_value(m_view.get_centre().z()); + break; + } + } else { + m_h_scroll_adjustment.set_lower(-30.0); + m_h_scroll_adjustment.set_upper(30.0); + m_v_scroll_adjustment.set_lower(-30.0); + m_v_scroll_adjustment.set_upper(30.0); + DEBUG_MESSAGE(" No valid bounding box for track!"); + } + const float scale = m_view.get_scale(); + // set the page size of the adjustments to the amount shown on the screen. + m_h_scroll_adjustment.set_page_size(double(m_view.get_width()) / scale); + m_v_scroll_adjustment.set_page_size(double(m_view.get_height()) / scale); + // gtk expects the value to be the lower bound of the visible range, but + // we've given it the middle. Correct fot this: + m_h_scroll_adjustment.set_value(m_h_scroll_adjustment.get_value() - + double(m_view.get_width()) / scale / 2.0); + m_v_scroll_adjustment.set_value(m_v_scroll_adjustment.get_value() - + double(m_view.get_height()) / scale / 2.0); + // now Update the scrollbar for the display and to emit notify signals. + m_h_scroll_bar.set_adjustment(m_h_scroll_adjustment); + m_v_scroll_bar.set_adjustment(m_v_scroll_adjustment); + m_view.queue_draw(); +} Modified: trunk/racer_editor/Viewport.h =================================================================== --- trunk/racer_editor/Viewport.h 2009-09-16 13:44:22 UTC (rev 18) +++ trunk/racer_editor/Viewport.h 2009-09-16 21:18:05 UTC (rev 19) @@ -38,7 +38,13 @@ /// Set which perspective the view displays. void set_angle(const ViewAngle angle); + + void zoom_in(); + void zoom_out(); + + void scale_to_fit(); private: + void resize_adjustments(); // scrollbars Gtk::Adjustment m_h_scroll_adjustment; Gtk::HScrollbar m_h_scroll_bar; @@ -46,6 +52,9 @@ Gtk::VScrollbar m_v_scroll_bar; /// 3-d track view View m_view; + + // The document to display + Document::Document * document; }; #endif /*VIEWPORT_H_*/ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |