int display_browser_handler(window_info *win) { //title bar //draw_menu_title_bar(browser_menu_x,browser_menu_y-16,browser_menu_x_len); // window drawing glEnable(GL_BLEND); glBlendFunc(GL_ONE,GL_SRC_ALPHA); glDisable(GL_TEXTURE_2D); glDisable(GL_BLEND); glColor3f(0.77f,0.57f,0.39f); glBegin(GL_LINES); //scroll bar if(!mc){ glVertex3i(win->len_x-20,20,0); glVertex3i(win->len_x-20,400,0); } if(cd!=-1){ glVertex3i(win->len_x-15,30,0); glVertex3i(win->len_x-10,25,0); glVertex3i(win->len_x-10,25,0); glVertex3i(win->len_x-5,30,0); glVertex3i(win->len_x-15,385,0); glVertex3i(win->len_x-10,390,0); glVertex3i(win->len_x-10,390,0); glVertex3i(win->len_x-5,385,0); //separators glVertex3i(0+200,0,0); glVertex3i(0+200,0+400,0); glVertex3i(0,0+200,0); glVertex3i(0+400,0+200,0); } glEnd(); glEnable(GL_TEXTURE_2D); // The X if(!mc){ draw_string(win->len_x-16,160,(unsigned char *)"B",1); draw_string(win->len_x-16,180,(unsigned char *)"A",1); draw_string(win->len_x-16,200,(unsigned char *)"C",1); draw_string(win->len_x-16,220,(unsigned char *)"K",1); } draw_string(0+win->len_x-16,0+2,(unsigned char *)"X",1); if(cd==-1){ //display dir select menu int i,x=0,y=2; if(mc==1){ for(i=0;i<=cc;i++){ draw_string(x+2,0+y,(unsigned char *)Cat[i].Name,1); y+=18; if(y>=398){ x=210; y=2; } } }else{ for(i=0;i<Cat[ccat].ns;i++){ draw_string(x+2,0+y,(unsigned char *)Cat[ccat].Sub[i]->DirName,1); y+=18; if(y>=398){ x=210; y=2; } } } }else{ // display specified dir int i=cp,valid_object=0; float tz=zoom_level; char fn[256]; // Prepare to render Leave2DMode(); glEnable(GL_CULL_FACE); glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_TEXTURE_COORD_ARRAY); if(have_multitexture && clouds_shadows){ //bind the detail texture glActiveTextureARB(GL_TEXTURE1_ARB); glEnable(GL_TEXTURE_2D); #ifdef NEW_TEXTURES bind_texture_unbuffered(ground_detail_text); #else /* NEW_TEXTURES */ glBindTexture(GL_TEXTURE_2D, texture_cache[ground_detail_text].texture_id); #endif /* NEW_TEXTURES */ glActiveTextureARB(GL_TEXTURE0_ARB); glEnable(GL_TEXTURE_2D); } // Now we draw the 4 objects zoom_level=3.0; window_resize(); glRotatef(-60, 1.0f, 0.0f, 0.0f); glRotatef(0, 0.0f, 0.0f, 1.0f); glRotatef(45, 0.0f, 0.0f, 1.0f); glViewport(win->pos_x,window_height-win->pos_y-150,200,150); glClearStencil(0); glClear (GL_DEPTH_BUFFER_BIT); #ifdef LINUX strcpy(fn,exec_path); #else //Fedora: don't ask me why, if you use exec_path, e3d files are not found strcpy(fn,"."/*exec_path*/); #endif strcat(fn,Dir[cd].Files[i]); valid_object=setobject(0,fn,Dir[cd].xrot[i],Dir[cd].yrot[i],Dir[cd].zrot[i]); if(valid_object){ glPushMatrix(); glScalef(Dir[cd].size[i],Dir[cd].size[i],Dir[cd].size[i]); draw_3d_object(&o3d[0]); glPopMatrix(); } if(i+1<Dir[cd].nf){ glViewport(win->pos_x+200,window_height-win->pos_y-150,200,150); glClearStencil(0); glClear (GL_DEPTH_BUFFER_BIT); #ifdef LINUX strcpy(fn,exec_path); #else //Fedora: don't ask me why, if you use exec_path, e3d files are not found strcpy(fn,"."/*exec_path*/); #endif strcat(fn,Dir[cd].Files[i+1]); valid_object=setobject(1,fn,Dir[cd].xrot[i+1],Dir[cd].yrot[i+1],Dir[cd].zrot[i+1]); if(valid_object){ glPushMatrix(); glScalef(Dir[cd].size[i+1],Dir[cd].size[i+1],Dir[cd].size[i+1]); draw_3d_object(&o3d[1]); glPopMatrix(); } } if(i+2<Dir[cd].nf){ glViewport(win->pos_x,window_height-win->pos_y-350,200,150); glClearStencil(0); glClear (GL_DEPTH_BUFFER_BIT); #ifdef LINUX strcpy(fn,exec_path); #else //Fedora: don't ask me why, if you use exec_path, e3d files are not found strcpy(fn,"."/*exec_path*/); #endif strcat(fn,Dir[cd].Files[i+2]); valid_object=setobject(2,fn,Dir[cd].xrot[i+2],Dir[cd].yrot[i+2],Dir[cd].zrot[i+2]); if(valid_object){ glPushMatrix(); glScalef(Dir[cd].size[i+2],Dir[cd].size[i+2],Dir[cd].size[i+2]); draw_3d_object(&o3d[2]); glPopMatrix(); } } if(i+3<Dir[cd].nf){ glViewport(win->pos_x+200,window_height-win->pos_y-350,200,150); glClearStencil(0); glClear (GL_DEPTH_BUFFER_BIT); #ifdef LINUX strcpy(fn,exec_path); #else //Fedora: don't ask me why, if you use exec_path, e3d files are not found strcpy(fn,"."/*exec_path*/); #endif strcat(fn,Dir[cd].Files[i+3]); valid_object=setobject(3,fn,Dir[cd].xrot[i+3],Dir[cd].yrot[i+3],Dir[cd].zrot[i+3]); if(valid_object){ glPushMatrix(); glScalef(Dir[cd].size[i+3],Dir[cd].size[i+3],Dir[cd].size[i+3]); draw_3d_object(&o3d[3]); glPopMatrix(); } } zoom_level=tz; window_resize(); // Back to normal glViewport(0,0,window_width,window_height); glDisable(GL_CULL_FACE); glDisableClientState(GL_VERTEX_ARRAY); glDisableClientState(GL_TEXTURE_COORD_ARRAY); if(have_multitexture && clouds_shadows) { //disable the second texture unit glActiveTextureARB(GL_TEXTURE1_ARB); glDisable(GL_TEXTURE_2D); glActiveTextureARB(GL_TEXTURE0_ARB); } Enter2DMode(); CHECK_GL_ERRORS(); // Object names draw_string(win->pos_x+2,win->pos_y+200-18,(unsigned char *)Dir[cd].Names[i],1); draw_string(win->pos_x+2,win->pos_y+400-18,(unsigned char *)Dir[cd].Names[i+2],1); draw_string(win->pos_x+202,win->pos_y+200-18,(unsigned char *)Dir[cd].Names[i+1],1); draw_string(win->pos_x+202,win->pos_y+400-18,(unsigned char *)Dir[cd].Names[i+3],1); } return 1; }
void display_2d_objects() { unsigned int i, l, start, stop; #ifdef SIMPLE_LOD int dist; int x, y; #endif //SIMPLE_LOD #ifdef CLUSTER_INSIDES_OLD short cluster = get_actor_cluster (); #endif #ifdef SIMPLE_LOD x= -camera_x; y= -camera_y; #endif //SIMPLE_LOD //First draw everyone with the same alpha test #ifdef FSAA if (fsaa > 1) { glEnable(GL_MULTISAMPLE); } #endif /* FSAA */ glEnable(GL_ALPHA_TEST); glAlphaFunc(GL_GREATER, 0.18f); if (!dungeon && !(!clouds_shadows && !use_shadow_mapping)) { if(clouds_shadows) { //bind the detail texture ELglActiveTextureARB(detail_unit); glEnable(GL_TEXTURE_2D); //glBindTexture(GL_TEXTURE_2D, texture_cache[ground_detail_text].texture_id); bind_texture_unbuffered(ground_detail_text); } ELglActiveTextureARB(base_unit); glEnable(GL_TEXTURE_2D); } get_intersect_start_stop(main_bbox_tree, TYPE_2D_NO_ALPHA_OBJECT, &start, &stop); for (i = start; i < stop; i++) { l = get_intersect_item_ID(main_bbox_tree, i); #ifdef CLUSTER_INSIDES_OLD if (obj_2d_list[l]->cluster && obj_2d_list[l]->cluster != cluster) // Object is on a different cluster as our actor, don't show it continue; #endif #ifdef SIMPLE_LOD // simple size/distance culling dist= (x-obj_2d_list[l]->x_pos)*(x-obj_2d_list[l]->x_pos) + (y-obj_2d_list[l]->y_pos)*(y-obj_2d_list[l]->y_pos); if(/*dist > 10*10 &&*/ 1000*max2f(obj_2d_list[l]->obj_pointer->x_size, obj_2d_list[l]->obj_pointer->y_size)/(dist) < 5) continue; #endif //SIMPLE_LOD draw_2d_object(obj_2d_list[l]); } //Then draw all that needs a change get_intersect_start_stop(main_bbox_tree, TYPE_2D_ALPHA_OBJECT, &start, &stop); for (i = start; i < stop; i++) { l = get_intersect_item_ID(main_bbox_tree, i); #ifdef SIMPLE_LOD // simple size/distance culling dist= (x-obj_2d_list[l]->x_pos)*(x-obj_2d_list[l]->x_pos) + (y-obj_2d_list[l]->y_pos)*(y-obj_2d_list[l]->y_pos); if(/*dist > 10*10 &&*/ 1000*max2f(obj_2d_list[l]->obj_pointer->x_size, obj_2d_list[l]->obj_pointer->y_size)/(dist) < 5) continue; #endif //SIMPLE_LOD glAlphaFunc(GL_GREATER, obj_2d_list[l]->obj_pointer->alpha_test); draw_2d_object(obj_2d_list[l]); } if (!dungeon && !(!clouds_shadows && !use_shadow_mapping)) { //disable the multitexturing ELglActiveTextureARB(detail_unit); glDisable(GL_TEXTURE_2D); ELglActiveTextureARB(base_unit); } #ifdef FSAA if (fsaa > 1) { glDisable(GL_MULTISAMPLE); } #endif /* FSAA */ glDisable(GL_ALPHA_TEST); #ifdef OPENGL_TRACE CHECK_GL_ERRORS(); #endif //OPENGL_TRACE }
void draw_tile_map() { int x_start,x_end,y_start,y_end; int x,y; float x_scaled,y_scaled; //get only the tiles around the camera //we have the axes inverted, btw the go from 0 to -255 if(camera_x<0)x=(int)(camera_x*-1)/3; else x=(int)camera_x/3; if(camera_y<0)y=(int)(camera_y*-1)/3; else y=(int)camera_y/3; x_start=x-(int)zoom_level; y_start=y-(int)zoom_level; x_end=x+(int)zoom_level; y_end=y+(int)zoom_level; if(x_start<0)x_start=0; if(x_end>=tile_map_size_x)x_end=tile_map_size_x-1; if(y_start<0)y_start=0; if(y_end>=tile_map_size_y)y_end=tile_map_size_y-1; if(!have_multitexture || poor_man) { for(y=y_start;y<=y_end;y++) { y_scaled=y*3.0f; for(x=x_start;x<=x_end;x++) { x_scaled=x*3.0f; if(is_water_tile(tile_map[y*tile_map_size_x+x]))continue;//lake, skip if(tile_map[y*tile_map_size_x+x]==255){ /*glDisable(GL_TEXTURE_2D); glDisable(GL_LIGHTING); glBegin(GL_QUADS); glColor3f(0.2,0.2,0.2); glVertex3f(x_scaled,y_scaled+3, -3.0f); glVertex3f(x_scaled,y_scaled, -3.0f); glVertex3f(x_scaled+3, y_scaled,-3.0f); glVertex3f(x_scaled+3, y_scaled+3,-3.0f); glColor3f(1.0,1.0,1.0); glEnd(); glEnable(GL_LIGHTING); glEnable(GL_TEXTURE_2D);*/ continue; }//null, skip bind_texture(tile_list[tile_map[y*tile_map_size_x+x]]); glBegin(GL_QUADS); glTexCoord2f(0, 0.0f); glVertex3f(x_scaled,y_scaled+3, 0.0f); glTexCoord2f(0, 1.0f); glVertex3f(x_scaled,y_scaled, 0.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f(x_scaled+3, y_scaled,0.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f(x_scaled+3, y_scaled+3,0.0f); glEnd(); } } } else//we draw the ground details { //bind the detail texture glActiveTextureARB(GL_TEXTURE1_ARB); glEnable(GL_TEXTURE_2D); bind_texture_unbuffered(ground_detail_text); glActiveTextureARB(GL_TEXTURE0_ARB); glEnable(GL_TEXTURE_2D); for(y=y_start;y<=y_end;y++) { y_scaled=y*3.0f; for(x=x_start;x<=x_end;x++) { x_scaled=x*3.0f; if(is_water_tile(tile_map[y*tile_map_size_x+x]))continue;//lake, skip if(tile_map[y*tile_map_size_x+x]==255){ /*glDisable(GL_TEXTURE_2D); glDisable(GL_LIGHTING); glBegin(GL_QUADS); glColor3f(0.2,0.2,0.2); glVertex3f(x_scaled,y_scaled+3, -3.0f); glVertex3f(x_scaled,y_scaled, -3.0f); glVertex3f(x_scaled+3, y_scaled,-3.0f); glVertex3f(x_scaled+3, y_scaled+3,-3.0f); glColor3f(1.0,1.0,1.0); glEnd(); glEnable(GL_LIGHTING); glEnable(GL_TEXTURE_2D);*/ continue; }//null, skip bind_texture(tile_list[tile_map[y*tile_map_size_x+x]]); //draw our normal tile glBegin(GL_QUADS); glMultiTexCoord2fARB(GL_TEXTURE0_ARB,0, 0.0f); glMultiTexCoord2fARB(GL_TEXTURE1_ARB,x_scaled/texture_scale+clouds_movement_u, (y_scaled+3.0)/texture_scale+clouds_movement_v); glVertex3f(x_scaled,y_scaled+3, 0.0f); glMultiTexCoord2fARB(GL_TEXTURE0_ARB,0, 1.0f); glMultiTexCoord2fARB(GL_TEXTURE1_ARB,x_scaled/texture_scale+clouds_movement_u, y_scaled/texture_scale+clouds_movement_v); glVertex3f(x_scaled,y_scaled, 0.0f); glMultiTexCoord2fARB(GL_TEXTURE0_ARB,1.0f, 1.0f); glMultiTexCoord2fARB(GL_TEXTURE1_ARB,(x_scaled+3.0f)/texture_scale+clouds_movement_u, y_scaled/texture_scale+clouds_movement_v); glVertex3f(x_scaled+3, y_scaled,0.0f); glMultiTexCoord2fARB(GL_TEXTURE0_ARB,1.0f, 0.0f); glMultiTexCoord2fARB(GL_TEXTURE1_ARB,(x_scaled+3.0)/texture_scale+clouds_movement_u, (y_scaled+3.0)/texture_scale+clouds_movement_v); glVertex3f(x_scaled+3, y_scaled+3,0.0f); glEnd(); } } //disable the second texture unit glActiveTextureARB(GL_TEXTURE1_ARB); glDisable(GL_TEXTURE_2D); glActiveTextureARB(GL_TEXTURE0_ARB); } }