00001
00002 #include <OpenGL_drawer.h>
00003
00004 OpenGL_drawer::OpenGL_drawer():draw_list()
00005 {
00006 current_color.resize(3);
00007 draw_list.resize(0);
00008 }
00009
00010 OpenGL_drawer::~OpenGL_drawer()
00011 {
00012 unsigned int k=0;
00013 for(k=0;k<draw_list.size();k++)
00014 {
00015 if(glIsList(draw_list[k]))
00016 {
00017 glDeleteLists(draw_list[k],1);
00018
00019 #ifdef DEBUG
00020 printf("[draw_list %d deleted]\n",k);
00021 #endif
00022 }
00023 }
00024
00025 }
00026
00027 int OpenGL_drawer::init_opengl(int argc,char **argv,const Navigator_tool& navigator)
00028 {
00029
00030 glutInit (&argc, argv);
00031 glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
00032 glutInitWindowPosition(0,0);
00033 glutInitWindowSize(navigator.get_X_screen(),navigator.get_Y_screen());
00034 glutCreateWindow("win_1");
00035
00036
00037
00038 glClearColor(1.0f,1.0f,1.0f,1.0f);
00039 glPointSize(5);
00040 glLineWidth(2);
00041
00042 glEnable(GL_COLOR_MATERIAL);
00043
00044 glEnable(GL_DEPTH_TEST);
00045 glDepthMask(GL_TRUE);
00046
00047
00048 glFrontFace(GL_CCW);
00049 glDisable(GL_CULL_FACE);
00050
00051
00052 glDisable(GL_LIGHTING);
00053 glDisable(GL_BLEND);
00054 glDisable(GL_TEXTURE_2D);
00055 glDisable(GL_FOG);
00056
00057
00058
00059
00060 float light_ambient[4]={0.4,0.4,0.4,1.0};
00061 float light_diffuse[4]={0.4,0.4,0.4,1.0};
00062 float light_specular[4]={1.0,1.0,1.0,1.0};
00063 float light_position [4] = {0.0,100.0,1000.0,1.0};
00064
00065 float material_ambient [4] = {1.0,1.0,1.0,1.0};
00066 float material_diffuse [4] = {1.0,1.0,1.0,1.0};
00067 float material_specular [4] = {1.0,1.0,1.0,1.0};
00068 float material_exponent [1] = {60.0};
00069
00070
00071 glShadeModel(GL_SMOOTH);
00072 glEnable(GL_LIGHTING);
00073 glEnable(GL_LIGHT0);
00074 glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE);
00075 glLightfv(GL_LIGHT0, GL_POSITION, light_position);
00076 glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
00077 glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
00078 glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
00079
00080 glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, material_ambient);
00081 glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, material_diffuse);
00082 glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, material_specular);
00083 glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, material_exponent);
00084 glEnable(GL_DEPTH_TEST);
00085
00086
00087 glEnable(GL_LINE_SMOOTH);
00088 glHint(GL_LINE_SMOOTH_HINT,GL_NICEST);
00089
00090 return 0;
00091 }
00092
00093
00094
00095
00096
00097 int OpenGL_drawer::draw_local_basis(Navigator_tool& navigator)
00098 {
00099
00100 glDisable(GL_LIGHTING);
00101
00102
00103 glLoadIdentity();
00104 glTranslatef(0,0,navigator.get_dist_obs());
00105 glRotatef(navigator.get_theta_1(),1.0,0.0,0.0);
00106 glRotatef(navigator.get_theta_2(),0.0,1.0,0.0);
00107
00108 glColor4f(1.0,0.0,0.0,1.0);
00109 glBegin(GL_LINES);
00110 glColor3f(1.0,0.0,0.0);
00111 glVertex3f(0.0,0.0,0.0);
00112 glVertex3f(0.01,0.0,0.0);
00113
00114 glColor3f(0.0,1.0,0.0);
00115 glVertex3f(0.0,0.0,0.0);
00116 glVertex3f(0.0,0.01,0.0);
00117
00118 glColor3f(0.0,0.0,1.0);
00119 glVertex3f(0.0,0.0,0.0);
00120 glVertex3f(0.0,0.0,0.01);
00121 glEnd();
00122 glTranslatef(0,0,navigator.get_dist_obs());
00123
00124
00125 glEnable(GL_LIGHTING);
00126
00127 return 0;
00128 }
00129
00130
00131
00132
00133
00134
00135 int OpenGL_drawer::draw_mesh_slow(Mesh_object& mesh)
00136 {
00137
00138 int N_polygons=0;
00139 int k_polygon=0;
00140 int N_vertex=0;
00141 int k_vertex=0;
00142
00143
00144
00145
00146
00147
00148
00149
00150 glEnable(GL_BLEND);
00151 glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
00152
00153 glColor4d(0.5,0.0,0.2,1.0);
00154
00155 double r=0.0,g=0.0,b=0.0,t=0.0;
00156
00157 double t0=0.0,t1=0.0;
00158
00159
00160 if(mesh.texture_type()==0)
00161 {
00162 glEnable(GL_TEXTURE_2D);
00163 glBindTexture(GL_TEXTURE_2D,mesh.get_texture_number());
00164 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
00165 }
00166
00167 N_polygons=mesh.polygon_number();
00168 V_3D x;
00169 V_3D n;
00170 for(k_polygon=0;k_polygon<N_polygons;k_polygon++)
00171 {
00172 N_vertex=mesh.polygon_size(k_polygon);
00173 glBegin(GL_POLYGON);
00174 for(k_vertex=0;k_vertex<N_vertex;k_vertex++)
00175 {
00176
00177
00178 x = mesh.get_vertex_v3d(k_polygon,k_vertex);
00179
00180
00181 if(mesh.normal_type()==1)
00182 n = mesh.get_polygon_normal(k_polygon);
00183 else if(mesh.normal_type()==2)
00184 n = mesh.get_vertex_normal(k_polygon,k_vertex);
00185 else if(mesh.normal_type()==3)
00186 n = mesh.get_polygon_and_vertex_normal(k_polygon,k_vertex);
00187
00188
00189 if(mesh.color_type()==-1)
00190 glColor4d(0.5,0.0,0.2,1.0);
00191 else if(mesh.color_type()==1)
00192 {
00193 mesh.get_per_vertex_color(k_polygon,k_vertex,&r,&g,&b,&t);
00194 glColor4d(r,g,b,t);
00195 }
00196 else if(mesh.color_type()==2)
00197 {
00198 mesh.get_per_polygon_color(k_polygon,&r,&g,&b,&t);
00199 glColor4d(r,g,b,t);
00200 }
00201 else if(mesh.color_type()==3)
00202 {
00203 mesh.get_per_polygon_and_vertex_color(k_polygon,k_vertex,&r,&g,&b,&t);
00204 glColor4d(r,g,b,t);
00205 }
00206
00207 if(mesh.texture_type()==0)
00208 {
00209 mesh.get_intermediate_texture(k_polygon,k_vertex,&t0,&t1);
00210 glTexCoord2f(t0,1.0-t1);
00211 }
00212
00213
00214 glNormal3d(n[0],n[1],n[2]);
00215 glVertex3d(x[0],x[1],x[2]);
00216
00217 }
00218 glEnd();
00219 }
00220
00221 glDisable(GL_BLEND);
00222
00223
00224
00225
00226 return 0;
00227 }
00228
00229 int OpenGL_drawer::draw_mesh_grid(Mesh_object& mesh)
00230 {
00231 int N_polygons=0;
00232 int k_polygon=0;
00233 int N_vertex=0;
00234 int k_vertex=0;
00235
00236
00237
00238 glDisable(GL_LIGHTING);
00239 glEnable(GL_BLEND);
00240 glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
00241
00242
00243
00244 N_polygons=mesh.polygon_number();
00245 V_3D x;
00246 for(k_polygon=0;k_polygon<N_polygons;k_polygon++)
00247 {
00248 N_vertex=mesh.polygon_size(k_polygon);
00249 glBegin(GL_LINE_STRIP);
00250 for(k_vertex=0;k_vertex<=N_vertex;k_vertex++)
00251 {
00252 x = mesh.get_vertex_v3d(k_polygon,(k_vertex%N_vertex));
00253 glVertex3d(x[0],x[1],x[2]);
00254 }
00255 glEnd();
00256 }
00257
00258 glDisable(GL_BLEND);
00259 glEnable(GL_LIGHTING);
00260
00261
00262 return 0;
00263 }
00264
00265 int OpenGL_drawer::draw_segment(const Segment& s) const
00266 {
00267 V_3D x0=s.get_start(),x1=s.get_last();
00268 glBegin(GL_LINES);
00269 glVertex3f(x0[0],x0[1],x0[2]);
00270 glVertex3f(x1[0],x1[1],x1[2]);
00271 glEnd();
00272
00273 return 0;
00274 }
00275
00276 int OpenGL_drawer::draw_triangle(const Triangle& t) const
00277 {
00278 V_3D normal = t.normal();
00279 glBegin(GL_TRIANGLES);
00280 glNormal3d(normal[0],normal[1],normal[2]);
00281 glVertex3d(t[0][0],t[0][1],t[0][2]);
00282 glVertex3d(t[1][0],t[1][1],t[1][2]);
00283 glVertex3d(t[2][0],t[2][1],t[2][2]);
00284 glEnd();
00285
00286 return 0;
00287 }
00288
00289 int OpenGL_drawer::draw_polygon(const Polygon& p)const
00290 {
00291 V_3D normal = p.normal();
00292
00293 glNormal3d(normal[0],normal[1],normal[2]);
00294
00295 glBegin(GL_POLYGON);
00296 for(int k=0;k<p.size();k++)
00297 glVertex3d(p[k][0],p[k][1],p[k][2]);
00298 glEnd();
00299
00300 return 0;
00301 }
00302
00303 int OpenGL_drawer::draw_curve(const Curve_3D& c) const
00304 {
00305 int k_line=0,N_line=c.size();
00306 glDisable(GL_LIGHTING);
00307 glBegin(GL_LINE_STRIP);
00308 for(k_line=0;k_line<N_line;k_line++)
00309 glVertex3d(c[k_line][0],c[k_line][1],c[k_line][2]);
00310 glEnd();
00311 glEnable(GL_LIGHTING);
00312
00313 return 0;
00314 }
00315
00316 int OpenGL_drawer::draw_skeleton(Skeleton &skeleton)
00317 {
00318 int k_joint;
00319 V_3D p0,p1;
00320
00321 Joint *current=NULL;
00322 Joint *son=NULL;
00323
00324 int k_son=0;
00325 int N_son=0;
00326
00327 glDisable(GL_LIGHTING);
00328 glDisable(GL_DEPTH_TEST);
00329
00330 glLineWidth(4.0);
00331 glBegin(GL_LINES);
00332 for(k_joint=0;k_joint<skeleton.get_N_joint()-1;k_joint++)
00333 {
00334 current = skeleton.get_joint(k_joint);
00335 p0 = skeleton.get_world_position_of_bone(current->get_access_number());
00336
00337 N_son = current->get_N_son();
00338
00339 set_current_color(current->get_access_number());
00340 glColor4d(current_color[0],current_color[1],current_color[2],1.0);
00341 for(k_son=0;k_son<N_son;k_son++)
00342 {
00343 son = current->get_son(N_son-k_son-1);
00344 p1 = skeleton.get_world_position_of_bone(son->get_access_number());
00345
00346 set_current_color(k_son);
00347
00348 glVertex3f(p0[0],p0[1],p0[2]);
00349 glVertex3f(p1[0],p1[1],p1[2]);
00350 }
00351 }
00352 glEnd();
00353
00354 glEnable(GL_LIGHTING);
00355 glEnable(GL_DEPTH_TEST);
00356
00357 return 0;
00358
00359 }
00360
00361 int OpenGL_drawer::set_current_color(int k_bone)
00362 {
00363
00364 double c1=abs(cos(double(k_bone*43252345.323+24)));
00365 double c2=abs(cos(double(k_bone*26252345.73+24)));
00366 double c3=abs(cos(double(k_bone*1214345.923+24)));
00367 current_color[0]=(c1+0.5)/2.0;
00368 current_color[1]=(c2+0.5)/2.0;
00369 current_color[2]=(c3+0.5)/2.0;
00370
00371 return 0;
00372 }
00373
00374
00375 GLuint OpenGL_drawer::load_texture(const char* filename)
00376 {
00377 GLuint texture_number;
00378 Texture tex;
00379
00380 tex.load_picture(filename);
00381
00382
00383 glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
00384 glGenTextures (1, &texture_number);
00385 glBindTexture (GL_TEXTURE_2D, texture_number);
00386
00387 glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
00388 glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
00389 glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
00390 glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
00391
00392 if(tex.get_depth()==4)
00393 gluBuild2DMipmaps (GL_TEXTURE_2D, tex.get_depth(), tex.get_Nx(), tex.get_Ny(), GL_RGBA,GL_UNSIGNED_BYTE, tex.get_data());
00394 if(tex.get_depth()==3)
00395 gluBuild2DMipmaps (GL_TEXTURE_2D, tex.get_depth(), tex.get_Nx(), tex.get_Ny(), GL_RGB,GL_UNSIGNED_BYTE, tex.get_data());
00396
00397 return texture_number;
00398 }