00001 #ifndef RENDERER_H
00002 #define RENDERER_H
00003
00004
00005 #include <list>
00006 #include <string>
00007
00008 #include <GL/glew.h>
00009 #include <GL/gl.h>
00010 #include <GL/glu.h>
00011 #define ILUT_USE_OPENGL
00012 #include <IL/il.h>
00013 #include <IL/ilu.h>
00014 #include <IL/ilut.h>
00015
00016 #include "rtc/rtcRenderNode.h"
00017
00018
00019 namespace rtc {
00020
00021
00022
00023 typedef enum { GUI_MODE_3D, GUI_MODE_2D } eGUIMode;
00024 typedef enum { IDLE, ROTATING, MOVING, ZOOMING } camera_state_t;
00025
00026 typedef void (*idle_func)(void);
00027 typedef void (*timer_func)(void);
00028 typedef void (*display_func)(void);
00029 typedef void (*keyboard_func)(unsigned char, int, int);
00030 typedef void (*mouse_func)(int, int, int, int);
00031 typedef void (*motion_func)(int, int);
00032 typedef void (*passive_motion_func)(int, int);
00033
00034 typedef struct {
00035 camera_state_t state;
00036 float pan, tilt, distance;
00037 float x_offset, y_offset, z_offset;
00038 float x_offset_2D, y_offset_2D, rotation_2D, zoom, warp_x, warp_y;
00039 } camera_pose_t, *camera_pose_p;
00040
00041 class RenderManager;
00042
00043 class Renderer {
00044 friend class RenderManager;
00045 public:
00046
00047 Renderer(RenderManager* render_manager,
00048 int window_x, int window_y,
00049 int window_width, int window_height,
00050 const char * title);
00051
00052 Renderer();
00053
00054 virtual ~Renderer();
00055
00056 virtual void initialize(RenderManager* render_manager,
00057 int window_x, int window_y,
00058 int window_width, int window_height,
00059 const char * title);
00060
00061 virtual void clear();
00062
00063 void setRenderMode(eRenderMode render_mode);
00064
00065 eRenderMode getRenderMode();
00066
00067
00068
00069
00070 void setIdleFunc(idle_func idle);
00071
00072 void setTimerFunc(timer_func timer);
00073
00074 void setDisplayFunc(display_func display);
00075
00076 void setKeyboardFunc(keyboard_func keyboard);
00077
00078 void setMouseFunc(mouse_func mouse);
00079
00080 void setMotionFunc(motion_func motion);
00081
00082 void setPassiveMotionFunc(passive_motion_func motion);
00083
00084 void addRenderNode(RenderNode* node);
00085 void clearRenderNode();
00086
00087 void setCameraParams(double zoom_sensitivity,
00088 double rotate_sensitivity,
00089 double move_sensitivity,
00090 double min_zoom_range,
00091 double camera_fov,
00092 double min_clip_range,
00093 double max_clip_range);
00094
00095 void set2DCameraParams(double zoom_sensitivity,
00096 double rotate_sensivitity,
00097 double move_sensitivity);
00098
00099 void initialize(int argc, char **argv,
00100 int window_x, int window_y,
00101 int window_width, int window_height,
00102 double fps);
00103
00104 void setInitialCameraPos(double pan,
00105 double tilt,
00106 double range,
00107 double x_offset,
00108 double y_offset,
00109 double z_offset);
00110
00111 void setInitial2DCameraPos(double x_offset,
00112 double y_offset,
00113 double rotation,
00114 double zoom);
00115
00116 void setMode2D(void);
00117
00118 void setMode3D(void);
00119
00120 void setMode(int mode);
00121
00122 int getMode(void);
00123
00124 void forceRedraw(void);
00125
00126 void set2DWarping(double warp_x, double warp_y);
00127
00128 void recenter(void);
00129
00130 void recenter2D(void);
00131
00132 void pickPoint(int mouse_x, int mouse_y, double *scene_x, double *scene_y);
00133
00134 void get2DPosition(int x, int y, double *xout, double *yout);
00135
00136 void get3DPosition(double x, double y, double z, double *xout, double *yout, double *zout);
00137
00138 int getWindowId();
00139
00140 camera_pose_p getCameraPose();
00141
00142 void setCameraPose(camera_pose_t camera_pose);
00143
00144 int getWindowWidth();
00145
00146 int getWindowHeight();
00147
00148 void setDisplayMode2D(int w, int h);
00149
00150 void setDisplayMode3D(int w, int h, float fov, float zNear, float zFar);
00151
00152 void switchTo2DMode(void);
00153
00154 void switchTo3DMode(void);
00155
00156 void renderBitmapString(float x, float y, void *font, char *string) ;
00157
00158 void renderBitmapString3D(float x, float y, float z, void *font, char *string);
00159
00160 int bitmapStringWidth(void *font, char *string);
00161
00162 void renderBitmapStringCentered(float x, float y, void *font, char *string);
00163
00164 void takeScreenShot(const char *filename);
00165 void takeScreenShot();
00166
00167 void drawCoordinateFrame(double scale = 1.0);
00168 void drawGrid(double center_x=0, double center_y=0, int size=100, double resolution=1.0) const;
00169 void drawDashedLine3D(double x1, double y1, double z1, double x2, double y2, double z2, double stripe_len) const;
00170
00171 Vec3d unProject(double winx, double winy, double winz=0.0);
00172 void setRasterPos(double winx, double winy, double winz=0.0);
00173
00174 private:
00175 bool arrow_initialized;
00176 GLuint arrow_triangle_vertices_vbo;
00177 GLuint arrow_triangle_normals_vbo;
00178 GLuint arrow_quad_vertices_vbo;
00179 GLuint arrow_quad_normals_vbo;
00180 void initializeArrow();
00181
00182 protected:
00183
00184 void display(void);
00185 void mouse(int button, int state, int x, int y);
00186 void keyboard(unsigned char key, int x, int y);
00187 void motion(int x, int y);
00188 void passive_motion(int x, int y);
00189 void special(int key, int x, int y);
00190 void visibility(int visible);
00191 void reshape(int w, int h);
00192 void timer();
00193 void idle();
00194
00195
00196 void rotate_camera(double dx, double dy);
00197 void zoom_camera(double dy);
00198 void move_camera(double dx, double dy);
00199 void rotate_camera_2D(double dx);
00200 void zoom_camera_2D(double dx);
00201 void move_camera_2D(double dx, double dy);
00202
00203
00204 public:
00205
00206 bool is_initialized;
00207
00208 eRenderMode render_mode;
00209
00210 typedef std::vector<RenderNode*> TRenderNodeList;
00211 TRenderNodeList render_nodes;
00212
00213 int m_frame;
00214 int m_time;
00215 int m_timebase;
00216 float m_fps;
00217
00218 int window_id;
00219 int window_width, window_height;
00220 float GLUI_x_offset, GLUI_y_offset;
00221 double fps;
00222 camera_pose_t camera_pose;
00223 int last_mouse_x, last_mouse_y;
00224 bool received_input;
00225
00226 idle_func user_idle_func;
00227 timer_func user_timer_func;
00228 display_func user_display_func;
00229 keyboard_func user_keyboard_func;
00230 mouse_func user_mouse_func;
00231 motion_func user_motion_func;
00232 passive_motion_func user_passive_motion_func;
00233
00234 double zoom_sensitivity;
00235 double rotate_sensitivity;
00236 double move_sensitivity;
00237 double min_zoom_range;
00238 double camera_fov;
00239 double min_clip_range;
00240 double max_clip_range;
00241
00242 double zoom_sensitivity_2D;
00243 double rotate_sensitivity_2D;
00244 double move_sensitivity_2D;
00245 int mode;
00246
00247 ILuint image_id;
00248 int screen_shot_number;
00249 };
00250
00251
00252 }
00253
00254 #endif // RENDERER_H defined
00255
00256