00001 #ifndef CAJUN_CBVIZ_SCRIPTED_CAMERA_H
00002 #define CAJUN_CBVIZ_SCRIPTED_CAMERA_H
00003
00004 #include "cbviz_util.H"
00005 #include "conf.H"
00006 #include "spline.H"
00007 #include "component_interface.H"
00008 #include "events.H"
00009 #include <queue>
00010
00011 using namespace std;
00012
00013 namespace cajun
00014 {
00015 enum camera_style_t {CAMERA_AT_ORIGIN, CAMERA_IN_CAR,
00016 CAMERA_WITH_CAR, CAMERA_FOCUS_CAR};
00017
00021 struct scripted_camera_data_t
00022 {
00024 double tstamp;
00026 camera_style_t style;
00028 double eye_x;
00030 double eye_y;
00032 double eye_z;
00034 double ctr_x;
00036 double ctr_y;
00038 double ctr_z;
00039 };
00040
00041 class scripted_camera_t : public component_interface_t
00042 {
00043 public:
00044 scripted_camera_t (conf_t &conf, world_state_t *ws_,
00045 char const *camera_script_file,
00046 bool static_mode);
00047 void init_data ();
00048 void update_data (double bot_pos[3]);
00049 void display (double bot_pos[3]) {};
00050 void toggle_display () {};
00051
00052 void print_data ();
00053 void print_head ();
00054 void print_tail ();
00055 unsigned size ();
00056 bool empty ();
00057 scripted_camera_data_t head ();
00058 void pop ();
00059 bool set_elem_free (
00060 scripted_camera_data_t &data,
00061 bool abs_tstamp,
00062 double tstamp,
00063 double eye_x,
00064 double eye_y,
00065 double eye_z,
00066 double ctr_x,
00067 double ctr_y,
00068 double ctr_z);
00069 bool set_elem_follow (
00070 scripted_camera_data_t &data,
00071 bool abs_tstamp,
00072 double tstamp,
00073 double eye_x,
00074 double eye_y,
00075 double eye_z);
00076 bool set_elem_focus (
00077 scripted_camera_data_t &data,
00078 bool abs_tstamp,
00079 double tstamp,
00080 double eye_x,
00081 double eye_y,
00082 double eye_z);
00083 bool set_elem_inside (
00084 scripted_camera_data_t &data,
00085 bool abs_tstamp,
00086 double tstamp,
00087 double rotation_angle,
00088 double elevation_angle);
00089
00090
00091
00092
00093 bool set_elems_free_spline (
00094 queue<scripted_camera_data_t> &data,
00095 bool abs_tstamp_beg,
00096 double tstamp_beg,
00097 bool abs_tstamp_end,
00098 double tstamp_end,
00099 double eye_spline_pts[12],
00100 double ctr_spline_pts[12]);
00101 bool set_elems_follow_spline (
00102 queue<scripted_camera_data_t> &data,
00103 bool abs_tstamp_beg,
00104 double tstamp_beg,
00105 bool abs_tstamp_end,
00106 double tstamp_end,
00107 double spline_pts[12]);
00108 bool set_elems_focus_spline (
00109 queue<scripted_camera_data_t> &data,
00110 bool abs_tstamp_beg,
00111 double tstamp_beg,
00112 bool abs_tstamp_end,
00113 double tstamp_end,
00114 double spline_pts[12]);
00115
00116
00117
00118 bool set_elems_inside_spline (
00119 queue<scripted_camera_data_t> &data,
00120 bool abs_tstamp_beg,
00121 double tstamp_beg,
00122 bool abs_tstamp_end,
00123 double tstamp_end,
00124 double spline_pts[8]);
00125
00126 private:
00128 bool m_static_mode;
00130 bool m_draw_free_splines;
00132 float m_draw_free_splines_vec_length;
00134 char const *m_camera_script_file;
00136 ifstream fd;
00138 queue<scripted_camera_data_t> *m_data;
00140 event_watch_t m_event_watcher;
00142 const event_t *m_event;
00144 vector<event_t *> m_events;
00146 double m_spline_detail;
00148 cbmesg_data_t m_cbmesg_data;
00150 bool m_cbmesg_ok;
00152 bool m_events_take_priority;
00153
00154 bool skip_line (string read);
00155 void clear_queue ();
00156 bool add_elem (scripted_camera_data_t &data);
00157 bool parse_and_add_style (string read, bool is_from_event);
00158 bool time_ok (double timestamp);
00159 double get_abs_tstamp (double rel_tstamp);
00160 void print_elem (scripted_camera_data_t &data);
00161 bool set_elem (scripted_camera_data_t &data, double tstamp,
00162 camera_style_t style, double eye_x,
00163 double eye_y, double eye_z,
00164 double ctr_x, double ctr_y,
00165 double ctr_z);
00166
00167
00168
00169 bool set_spline (spline_curve_t &spline,
00170 bool abs_tstamp_beg,
00171 double &tstamp_beg,
00172 bool abs_tstamp_end,
00173 double &tstamp_end,
00174 double spline_pts_[12]);
00175 };
00176 };
00177
00178 #endif