void get_2d_object_under_mouse() { unsigned int i, l; float least_z = 1.0f; //First draw everyone with the same alpha test glPushMatrix(); glClearDepth(least_z); glClear(GL_DEPTH_BUFFER_BIT|GL_COLOR_BUFFER_BIT); for (i = get_intersect_start(main_bbox_tree, TYPE_2D_NO_ALPHA_OBJECT); i < get_intersect_stop(main_bbox_tree, TYPE_2D_NO_ALPHA_OBJECT); i++) { l = get_intersect_item_ID(main_bbox_tree, i); #ifdef EXTRA_DEBUG if (!obj_2d_list[l]) { ERR(); continue; } #endif draw_2d_object(obj_2d_list[l]); if(evaluate_collision(&least_z)){ selected_2d_object = l; } } //Then draw all that needs a change for (i = get_intersect_start(main_bbox_tree, TYPE_2D_ALPHA_OBJECT); i < get_intersect_stop(main_bbox_tree, TYPE_2D_ALPHA_OBJECT); i++) { l = get_intersect_item_ID(main_bbox_tree, i); #ifdef EXTRA_DEBUG if (!obj_2d_list[l]) { ERR(); continue; } #endif draw_2d_object(obj_2d_list[l]); if(evaluate_collision(&least_z)){ selected_2d_object = l; } } glPopMatrix(); #ifdef OPENGL_TRACE CHECK_GL_ERRORS(); #endif //OPENGL_TRACE }
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_3d_objects(unsigned int object_type) { unsigned int start, stop; unsigned int i, l; int is_selflit, is_transparent, is_ground; #ifdef SIMPLE_LOD int x, y, dist; #endif #ifdef CLUSTER_INSIDES_OLD short cluster = get_actor_cluster (); #endif #ifdef SIMPLE_LOD x= -camera_x; y= -camera_y; #endif cur_e3d= NULL; #ifdef DEBUG cur_e3d_count= 0; #endif //DEBUG get_intersect_start_stop(main_bbox_tree, object_type, &start, &stop); // nothing to draw? if(start >= stop){ return; } // reduce CPU usage while minimized if(!(SDL_GetAppState()&SDL_APPACTIVE)){ // not actually drawing, fake it // now loop through each object for (i=start; i<stop; i++) { int j; j = get_intersect_item_ID(main_bbox_tree, i); l = get_3dobject_index(j); if (objects_list[l] == NULL) continue; //track the usage cache_use(objects_list[l]->e3d_data->cache_ptr); } // and all done return; } // find the modes we need is_selflit= is_self_lit_3d_object(object_type); is_transparent= is_alpha_3d_object(object_type); is_ground= is_ground_3d_object(object_type); // set the modes we need if (is_selflit && (!is_day || dungeon)) { glDisable(GL_LIGHTING); } #ifdef FSAA if (fsaa > 1) { glEnable(GL_MULTISAMPLE); } #endif /* FSAA */ if(is_transparent) { #ifdef NEW_ALPHA if(use_3d_alpha_blend){ glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); } #endif //NEW_ALPHA //enable alpha filtering, so we have some alpha key glEnable(GL_ALPHA_TEST); if(is_ground)glAlphaFunc(GL_GREATER,0.23f); #ifdef OLD_MISC_OBJ_DIR else glAlphaFunc(GL_GREATER,0.06f); #else else glAlphaFunc(GL_GREATER,0.3f); #endif glDisable(GL_CULL_FACE); }