[Racer-svn] SF.net SVN: racer:[17] trunk
Status: Alpha
Brought to you by:
jlegg
From: <jl...@us...> - 2009-09-14 23:11:26
|
Revision: 17 http://racer.svn.sourceforge.net/racer/?rev=17&view=rev Author: jlegg Date: 2009-09-14 23:11:12 +0000 (Mon, 14 Sep 2009) Log Message: ----------- Basic path drawing in the editor. Path initalises with a big loop consisting of two vertices. Modified Paths: -------------- trunk/libtrack/Path.cpp 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/libtrack/Path.cpp =================================================================== --- trunk/libtrack/Path.cpp 2009-09-14 12:54:18 UTC (rev 16) +++ trunk/libtrack/Path.cpp 2009-09-14 23:11:12 UTC (rev 17) @@ -107,7 +107,7 @@ vertex_range.first != vertex_range.second; vertex_range.first++) { - graph[*(vertex_range.first)] = PathVertex(source, theme);; + graph[*(vertex_range.first)] = PathVertex(source, theme); } // now on to the edges @@ -135,7 +135,24 @@ Path::Path(const Theme & theme) : theme(theme) { - + // add two vertices and two edges connecting them in a loop. + PathEdge edge_1(theme), edge_2(theme); + edge_1.start.gradient_strength = 60.0; + edge_1.finish.gradient_strength = 60.0; + edge_2.start = edge_1.finish; + edge_2.finish = edge_1.start; + add_edge(1, 0, edge_1, graph); + add_edge(0, 1, edge_2, graph); + typedef boost::graph_traits<Path::Graph>::vertex_iterator VertexIterator; + VertexIterator vertex_iterator_1 = vertices(graph).first; + VertexIterator vertex_iterator_2 = vertex_iterator_1; + vertex_iterator_2++; + PathVertex & vertex_1 = graph[*(vertex_iterator_1)]; + PathVertex & vertex_2 = graph[*(vertex_iterator_2)]; + vertex_1.position = btVector3(15.0, 0.0, 0.0); + vertex_2.position = btVector3(-15.0, 0.0, 0.0); + vertex_1.gradient = btVector3 (0.0, 1.0, 0.0); + vertex_2.gradient = btVector3 (0.0, -1.0, 0.0); } Path::~Path() Modified: trunk/racer_editor/EditorWindow.cpp =================================================================== --- trunk/racer_editor/EditorWindow.cpp 2009-09-14 12:54:18 UTC (rev 16) +++ trunk/racer_editor/EditorWindow.cpp 2009-09-14 23:11:12 UTC (rev 17) @@ -154,12 +154,14 @@ m_viewport_top_frame.add(m_viewport_top); m_viewport_top_frame.set_shadow_type(Gtk::SHADOW_IN); m_panes.pack1(m_viewport_top_frame); + m_viewport_top.set_angle(View::VIEW_TOP); m_viewport_top.show(); m_viewport_top_frame.show(); m_viewport_side_frame.add(m_viewport_side); m_viewport_side_frame.set_shadow_type(Gtk::SHADOW_IN); m_panes.pack2(m_viewport_side_frame); + m_viewport_side.set_angle(View::VIEW_SIDE); m_viewport_side.show(); m_viewport_side_frame.show(); @@ -420,8 +422,8 @@ m_document->get_undo_avaliable()); m_ref_action_group->get_action("Redo")->set_sensitive( m_document->get_redo_avaliable()); - m_viewport_top.update(m_document->get_track()); - m_viewport_side.update(m_document->get_track()); + m_viewport_top.update(); + m_viewport_side.update(); } bool EditorWindow::check_clear_document() @@ -484,5 +486,7 @@ m_ref_action_group->get_action("ZoomToFit")->set_sensitive(true); m_new_form.hide(); + m_viewport_top.set_document(*m_document); + m_viewport_side.set_document(*m_document); m_panes.show(); } Modified: trunk/racer_editor/View.cpp =================================================================== --- trunk/racer_editor/View.cpp 2009-09-14 12:54:18 UTC (rev 16) +++ trunk/racer_editor/View.cpp 2009-09-14 23:11:12 UTC (rev 17) @@ -19,6 +19,11 @@ : m_gl_config(Gdk::GL::Config::create(Gdk::GL::MODE_RGB | Gdk::GL::MODE_DEPTH | Gdk::GL::MODE_DOUBLE)) + , document(0) + , scale(8) + , centre_x(0) + , centre_y(0) + , view_angle(VIEW_TOP) { if (!m_gl_config) { @@ -26,13 +31,22 @@ throw; } set_gl_capability(m_gl_config); - } View::~View() { } +void View::set_document(Document::Document & document_in) +{ + document = &document_in; +} + +void View::set_angle(const ViewAngle angle_in) +{ + view_angle = angle_in; +} + void View::on_realize() { Gtk::GL::DrawingArea::on_realize(); @@ -43,8 +57,6 @@ } gldrawable->gl_end(); - - } bool View::on_configure_event(GdkEventConfigure* event) @@ -57,22 +69,53 @@ glViewport(0, 0, get_width(), get_height()); glMatrixMode(GL_PROJECTION); glLoadIdentity(); - gluOrtho2D(0, get_width(), 0, get_height()); + 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(); gldrawable->gl_end(); return true; } +void View::recenter_view() +{ + // rotations + glLoadIdentity(); + switch (view_angle) + { + case VIEW_TOP: + // xy plane is already in view. + break; + case VIEW_SIDE: + // rotate 90 degrees along the y axis to get xy plane in view. + glRotatef(90.0, 1.0, 0.0, 0.0); + // Then rotate about the user to get z up the screen. + glRotatef(-90.0, 0.0, 0.0, 1.0); + break; + case VIEW_FRONT: + // rotate 90 degrees along the x axis to get yz plane in view. + glRotatef(90.0, 1.0, 0.0, 0.0); + break; + } + glScalef(scale, scale, scale); + /// @todo translate centre. +} + bool View::on_expose_event(GdkEventExpose* event) { + assert(document); Glib::RefPtr<Gdk::GL::Drawable> gldrawable = get_gl_drawable(); if (!gldrawable->gl_begin(get_gl_context())) { return false; } glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - ///@todo draw stuff + // get the track to draw. + const Track::Track & track = document->get_track(); + + draw_path(track.get_path()); + // Swap buffers. if (gldrawable->is_double_buffered()) { @@ -87,3 +130,68 @@ return true; } +void View::draw_path(const Track::Path & path) +{ + // draw lines between the vertices. + glColor3ub(255, 255, 255); + typedef boost::graph_traits<Track::Path::Graph>::edge_iterator EdgeIterator; + //typedef boost::graph_traits<Track::Path::Graph>::vertex_descriptor VertexDescriptor; + std::pair<EdgeIterator, EdgeIterator> edge_range; + for (edge_range = boost::edges(path.graph); + edge_range.first != edge_range.second; + edge_range.first++) + { + Track::PathVertex vertex_1 = path.graph[source(*(edge_range.first), path.graph)]; + Track::PathVertex vertex_2 = path.graph[target(*(edge_range.first), path.graph)]; + Track::PathEdge edge = path.graph[*(edge_range.first)]; + + const btVector3 & position_1 = vertex_1.position; + const btVector3 & position_2 = vertex_2.position; + const btScalar & gradient_strength_1 = edge.start.gradient_strength; + const btScalar & gradient_strength_2 = edge.finish.gradient_strength; + btVector3 gradient_1 = vertex_1.gradient * gradient_strength_1; + btVector3 gradient_2 = vertex_2.gradient * gradient_strength_2; + + glBegin(GL_LINE_STRIP); + for (float t = 0.0; t <= 1.0; t += 0.015625) + { + float t2 = t * t; + float t3 = t2 * t; + btVector3 position( (2 * t3 - 3 * t2 + 1) * position_1 + + (t3 - 2 * t2 + t ) * gradient_1 + + (-2 * t3 + 3 * t2 ) * position_2 + + (t3 - t2 ) * gradient_2 + ); + glVertex3f(position.x(), position.y(), position.z()); + } + glEnd(); + } + + // draw markers at the vertices. + glClear(GL_DEPTH_BUFFER_BIT); + glColor3ub(255, 255, 0); + glPointSize(5.0); + glBegin(GL_POINTS); + /** @todo use marker size to draw a square around the point regardless + * of hardware maximum point size. glPointSize is not guranteed to + * support sizes other than 1, which is too small. + */ + //const float marker_size = 3.0; + // float offset = scale * marker_size; + + typedef boost::graph_traits<Track::Path::Graph>::vertex_iterator VertexIterator; + std::pair<VertexIterator, VertexIterator> vertex_range; + for (vertex_range = boost::vertices(path.graph); + vertex_range.first != vertex_range.second; + vertex_range.first++) + { + Track::PathVertex vertex = path.graph[*(vertex_range.first)]; + btVector3 & position = vertex.position; + float x = position.x(); + float y = position.y(); + float z = position.y(); + glVertex3f(x, y, z); + } + glEnd(); + +} Modified: trunk/racer_editor/View.h =================================================================== --- trunk/racer_editor/View.h 2009-09-14 12:54:18 UTC (rev 16) +++ trunk/racer_editor/View.h 2009-09-14 23:11:12 UTC (rev 17) @@ -13,21 +13,68 @@ #include <gtkglmm.h> +#include <document/Document.h> + /** A widget that shows a view of the track. */ class View : public Gtk::GL::DrawingArea { public: - View(); - virtual ~View(); + View(); + virtual ~View(); + + /// The set of perspectives to draw from + enum ViewAngle { + /// Draw the map in the xy plane. + VIEW_TOP, + + /// Draw the map in the yz plane. + VIEW_SIDE, + + /// Draw the map in the xz plane. + VIEW_FRONT}; + + /** Set the document that the area is to represent. The document must valid + * as long as the widget can be drawn. It may be switched to another one at + * any time, however. + * + * This should be called before any draw events occur. + * @param document The document the view should draw and try to change if + * manipulated. + */ + void set_document(Document::Document & document); + + /** Set the perspective the view has on the stage. + * @param The ViewAngle to use for the perspective. + */ + void set_angle(const ViewAngle angle); protected: - // signal handlers: - virtual void on_realize(); - virtual bool on_configure_event(GdkEventConfigure* event); - virtual bool on_expose_event(GdkEventExpose* event); - - Glib::RefPtr<Gdk::GL::Config> m_gl_config; - + // 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(); + + // Draw the path of the track. + void draw_path(const Track::Path & path); + + Glib::RefPtr<Gdk::GL::Config> m_gl_config; + + /// The document to show and edit + Document::Document * document; + + /// The scale of the drawing. Scale is in pixels per distance unit. + 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; + + /// Which perspective of the scene to use. + ViewAngle view_angle; }; #endif /*VIEW_H_*/ Modified: trunk/racer_editor/Viewport.cpp =================================================================== --- trunk/racer_editor/Viewport.cpp 2009-09-14 12:54:18 UTC (rev 16) +++ trunk/racer_editor/Viewport.cpp 2009-09-14 23:11:12 UTC (rev 17) @@ -33,9 +33,20 @@ { } -void Viewport::update(const Track::Track &track) +void Viewport::set_document(Document::Document & document) { + m_view.set_document(document); +} + +void Viewport::update() +{ /// @todo Change scrollbar range to fit. // Redraw the view to reflect the changed track. m_view.queue_draw(); } + +void Viewport::set_angle(const ViewAngle angle) +{ + m_view.set_angle(angle); + /// @todo update bounds, recentre. +} Modified: trunk/racer_editor/Viewport.h =================================================================== --- trunk/racer_editor/Viewport.h 2009-09-14 12:54:18 UTC (rev 16) +++ trunk/racer_editor/Viewport.h 2009-09-14 23:11:12 UTC (rev 17) @@ -15,7 +15,7 @@ #include <gtkmm/scrollbar.h> #include <gtkmm/adjustment.h> -#include <libtrack/Track.h> +#include <document/Document.h> #include "View.h" @@ -27,11 +27,17 @@ public: Viewport(); virtual ~Viewport(); + typedef View::ViewAngle ViewAngle; + void set_document(Document::Document & document); + /** Update the Viewport to reflect changes in the track. * @param track The track to draw. */ - void update(const Track::Track & track); + void update(); + + /// Set which perspective the view displays. + void set_angle(const ViewAngle angle); private: // scrollbars Gtk::Adjustment m_h_scroll_adjustment; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |