void load_all_tiles() { int i; int cur_text; char str[80]; for(i=0;i<255;i++) { sprintf(str,"./3dobjects/tile%i.dds",i); if(is_water_tile(i) && is_reflecting(i)) cur_text=load_texture_cache(str,70); else cur_text=load_texture_cache(str,255); if(cur_text==-1)return; tile_list[i]=cur_text; tiles_no=i; #ifdef OLD_TEXTURE_LOADER //map_tiles[i].img=load_bmp8_color_key_no_texture_img(str,map_tiles+i,255); load_bmp8_texture(str,map_tiles+i,255); #else //OLD_TEXTURE_LOADER load_texture(str,map_tiles+i,255); #endif //OLD_TEXTURE_LOADER } map_tiles[255].texture=NULL; }
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); } }