-/* $Id$
-
-This file is part of the MSP Märklin suite
-Copyright © 2006-2008 Mikkosoft Productions, Mikko Rasa
-Distributed under the GPL
-*/
-
#ifndef MANIPULATOR_H_
#define MANIPULATOR_H_
#include <sigc++/sigc++.h>
-#include "3d/track.h"
+#include "libr2c2/geometry.h"
class Designer;
class Selection;
NONE,
MOVE,
ROTATE,
- ELEVATE
+ ELEVATE,
+ EXTEND
};
- struct MTrack
+ struct MObject
{
- Marklin::Track *track;
- Marklin::Point pos;
- float rot;
+ R2C2::Object *object;
+ R2C2::Vector pos;
+ R2C2::Angle rot;
- MTrack(Marklin::Track *);
+ MObject(R2C2::Object *);
};
struct TrackOrder
{
- Marklin::Track *track;
+ R2C2::Track *track;
bool rev;
- TrackOrder(Marklin::Track *t, bool r): track(t), rev(r) { }
- };
-
- struct TrackWrap
- {
- Marklin::Point pos;
- float rot;
- float width;
- float height;
+ TrackOrder(R2C2::Track *t, bool r): track(t), rev(r) { }
};
public:
private:
Designer &designer;
+ Msp::Input::Mouse &mouse;
Selection &selection;
- std::vector<MTrack> tracks;
- Marklin::Point center;
-
- std::list<TrackWrap> wrap;
- Marklin::Point wrap_pos;
- float wrap_rot;
+ std::vector<MObject> objects;
+ R2C2::Vector center;
- Marklin::Point gpointer;
- int pointer_y;
+ R2C2::Vector pointer;
+ R2C2::Vector gpointer;
Mode mode;
- Marklin::Point move_origin;
- float angle;
- float rot_origin;
- int elev_origin;
- std::set<Marklin::Track *> neighbors;
+ R2C2::Vector move_origin;
+ R2C2::Angle angle;
+ R2C2::Angle rot_origin;
+ float elev_origin;
+ std::set<R2C2::Object *> neighbors;
+ std::vector<R2C2::Track *> extend_tracks;
public:
- Manipulator(Designer &, Selection &);
+ Manipulator(Designer &, Msp::Input::Mouse &, Selection &);
void start_move();
void start_rotate();
void start_elevate();
+ bool start_extend();
void duplicate();
void flatten();
void even_slope(bool =false);
+ void connect();
void cancel();
- void button_press(int, int, float, float, unsigned);
- void pointer_motion(int, int, float, float);
- void render();
private:
+ void button_press(unsigned);
+ void axis_motion(unsigned, float, float);
void selection_changed();
- void update_wrap();
+ void update_objects();
void update_neighbors();
void set_slope(TrackOrder &, float, float);
+ std::vector<R2C2::Track *> create_straight(const R2C2::Vector &, const R2C2::Angle &, float, float);
};
#endif