Update.
[universe.git] / manipulator.h
1
2 // Written and (C) by Francois Fleuret
3 // Contact <francois.fleuret@idiap.ch> for comments & bug reports
4
5 #ifndef MANIPULATOR_CC
6 #define MANIPULATOR_CC
7
8 #include "misc.h"
9 #include "map.h"
10 #include "universe.h"
11 #include "task.h"
12
13 class Manipulator : public Map {
14   static const int sqsize = 16;
15
16   Polygon *_touching_polygon, *_current_polygon;
17   scalar_t _grab_relative_x, _grab_relative_y;
18   scalar_t _xmax, _ymax;
19   scalar_t _hand_x, _hand_y;
20   scalar_t _force_x, _force_y;
21   bool _grab, _release;
22   int _current_action;
23
24   enum { FEEL_TOUCHING_OBJECT, FEEL_GRABBING_OBJECT, NB_DISCRETE_PARAMETERS };
25
26   enum { MAP_LOCATION_X, MAP_LOCATION_Y, MAP_RESISTANCE_X, MAP_RESISTANCE_Y, NB_CONTINUOUS_MAPS };
27
28   static const int continuous_map_size = 25;
29
30   scalar_t _kernel_continuous_maps[continuous_map_size * 2 + 1];
31
32 public:
33
34   enum {
35     ACTION_IDLE,
36     ACTION_MOVE_UP, ACTION_MOVE_RIGHT, ACTION_MOVE_DOWN, ACTION_MOVE_LEFT,
37     ACTION_GRAB, ACTION_RELEASE,
38     NB_ACTIONS
39   };
40
41   Manipulator(Task *task);
42
43   inline scalar_t hand_x() { return _hand_x; }
44   inline scalar_t hand_y() { return _hand_y; }
45   inline Polygon *grabbing() { return _current_polygon; }
46
47   int nb_actions();
48   void do_action(int action);
49
50   void update_map();
51   void update(scalar_t dt, Universe *universe);
52
53   int parameter_width();
54   int parameter_height();
55   void draw_parameters(int x0, int y0, SimpleWindow *window);
56   void draw_on_universe(SimpleWindow *window);
57
58   int random_action();
59
60   //   void force_grab(Universe *universe, scalar_t x, scalar_t y);
61   void force_move(scalar_t x, scalar_t y);
62   void force_release();
63 };
64
65 #endif