void opengl_tnl_set_material(material* material_info, bool set_base_map) { int shader_handle = material_info->get_shader_handle(); int base_map = material_info->get_texture_map(TM_BASE_TYPE); vec4 clr = material_info->get_color(); Assert(shader_handle >= 0); opengl_shader_set_current(shader_handle); if ( Current_shader->shader == SDR_TYPE_PASSTHROUGH_RENDER ) { opengl_shader_set_passthrough(base_map >= 0, material_info->get_texture_type() == TCACHE_TYPE_AABITMAP, &clr, material_info->get_color_scale()); } GL_state.SetAlphaBlendMode(material_info->get_blend_mode()); GL_state.SetZbufferType(material_info->get_depth_mode()); gr_set_cull(material_info->get_cull_mode() ? 1 : 0); gr_zbias(material_info->get_depth_bias()); gr_set_fill_mode(material_info->get_fill_mode()); material::fog &fog_params = material_info->get_fog(); if ( fog_params.enabled ) { gr_fog_set(GR_FOGMODE_FOG, fog_params.r, fog_params.g, fog_params.b, fog_params.dist_near, fog_params.dist_far); } else { gr_fog_set(GR_FOGMODE_NONE, 0, 0, 0); } gr_set_texture_addressing(material_info->get_texture_addressing()); material::clip_plane &clip_params = material_info->get_clip_plane(); if ( clip_params.enabled ) { gr_opengl_set_clip_plane(&clip_params.normal, &clip_params.position); } else { gr_opengl_set_clip_plane(NULL, NULL); } if ( set_base_map && base_map >= 0 ) { float u_scale, v_scale; if ( !gr_opengl_tcache_set(base_map, material_info->get_texture_type(), &u_scale, &v_scale) ) { mprintf(("WARNING: Error setting bitmap texture (%i)!\n", base_map)); } } }
// ------------------------------------------------------------------------------------ // shockwave_render() // // Draw the shockwave identified by handle // // input: objp => pointer to shockwave object // void shockwave_render(object *objp) { shockwave *sw; shockwave_info *si; vertex p; Assert(objp->type == OBJ_SHOCKWAVE); Assert(objp->instance >= 0 && objp->instance < MAX_SHOCKWAVES); sw = &Shockwaves[objp->instance]; si = &Shockwave_info[sw->shockwave_info_index]; if( (sw->delay_stamp != -1) && !timestamp_elapsed(sw->delay_stamp)){ return; } if ( (sw->current_bitmap < 0) && (sw->model_id < 0) ) return; // turn off fogging if(The_mission.flags & MISSION_FLAG_FULLNEB){ gr_fog_set(GR_FOGMODE_NONE, 0, 0, 0); } if (sw->model_id > -1) { float model_Interp_scale_xyz = sw->radius / 50.0f; model_set_warp_globals( model_Interp_scale_xyz, model_Interp_scale_xyz, model_Interp_scale_xyz, -1, 1.0f - (sw->radius/sw->outer_radius) ); float dist = vm_vec_dist_quick( &sw->pos, &Eye_position ); model_set_detail_level((int)(dist / (sw->radius * 10.0f))); model_render( sw->model_id, &Objects[sw->objnum].orient, &sw->pos, MR_NO_LIGHTING | MR_NO_FOGGING | MR_NORMAL | MR_CENTER_ALPHA | MR_NO_CULL, sw->objnum); model_set_warp_globals(); }else{ if (!Cmdline_nohtl) { g3_transfer_vertex(&p, &sw->pos); } else { g3_rotate_vertex(&p, &sw->pos); } gr_set_bitmap(sw->current_bitmap, GR_ALPHABLEND_FILTER, GR_BITBLT_MODE_NORMAL, 1.3f ); g3_draw_rotated_bitmap(&p, fl_radian(sw->rot_angles.p), sw->radius, TMAP_FLAG_TEXTURED | TMAP_HTL_3D_UNLIT); } }
/** * Draw the shockwave identified by handle * * @param objp pointer to shockwave object */ void shockwave_render_DEPRECATED(object *objp) { shockwave *sw; vertex p; Assert(objp->type == OBJ_SHOCKWAVE); Assert(objp->instance >= 0 && objp->instance < MAX_SHOCKWAVES); memset(&p, 0, sizeof(p)); sw = &Shockwaves[objp->instance]; if( (sw->delay_stamp != -1) && !timestamp_elapsed(sw->delay_stamp)){ return; } if ( (sw->current_bitmap < 0) && (sw->model_id < 0) ) return; // turn off fogging if(The_mission.flags & MISSION_FLAG_FULLNEB){ gr_fog_set(GR_FOGMODE_NONE, 0, 0, 0); } if (sw->model_id > -1) { float model_Interp_scale_xyz = sw->radius / 50.0f; model_set_warp_globals( model_Interp_scale_xyz, model_Interp_scale_xyz, model_Interp_scale_xyz, -1, 1.0f - (sw->radius/sw->outer_radius) ); float dist = vm_vec_dist_quick( &sw->pos, &Eye_position ); model_set_detail_level((int)(dist / (sw->radius * 10.0f))); model_render_DEPRECATED( sw->model_id, &Objects[sw->objnum].orient, &sw->pos, MR_DEPRECATED_NO_LIGHTING | MR_DEPRECATED_NO_FOGGING | MR_DEPRECATED_NORMAL | MR_DEPRECATED_CENTER_ALPHA | MR_DEPRECATED_NO_CULL, sw->objnum); model_set_warp_globals(); if(Cmdline_fb_explosions) { g3_transfer_vertex(&p, &sw->pos); distortion_add_bitmap_rotated( Shockwave_info[1].bitmap_id+shockwave_get_framenum(objp->instance, 94), TMAP_FLAG_TEXTURED | TMAP_HTL_3D_UNLIT | TMAP_FLAG_SOFT_QUAD | TMAP_FLAG_DISTORTION, &p, fl_radians(sw->rot_angles.p), sw->radius, ((sw->time_elapsed/sw->total_time)>0.9f)?(1.0f-(sw->time_elapsed/sw->total_time))*10.0f:1.0f ); } }else{ if (!Cmdline_nohtl) { g3_transfer_vertex(&p, &sw->pos); } else { g3_rotate_vertex(&p, &sw->pos); } if(Cmdline_fb_explosions) { distortion_add_bitmap_rotated( sw->current_bitmap, TMAP_FLAG_TEXTURED | TMAP_HTL_3D_UNLIT | TMAP_FLAG_SOFT_QUAD | TMAP_FLAG_DISTORTION, &p, fl_radians(sw->rot_angles.p), sw->radius, ((sw->time_elapsed/sw->total_time)>0.9f)?(1.0f-(sw->time_elapsed/sw->total_time))*10.0f:1.0f ); } batch_add_bitmap_rotated( sw->current_bitmap, TMAP_FLAG_TEXTURED | TMAP_HTL_3D_UNLIT | TMAP_FLAG_SOFT_QUAD, &p, fl_radians(sw->rot_angles.p), sw->radius ); } }
void obj_render_all(void (*render_function)(object *objp) ) { object *objp; int i, j, incr; float fog_near, fog_far; objp = Objects; Num_sorted_objects = 0; for (i=0;i<=Highest_object_index;i++,objp++) { if ( (objp->type != OBJ_NONE) && (objp->flags&OF_RENDERS) ) { objp->flags &= ~OF_WAS_RENDERED; if ( obj_in_view_cone(objp) ) { sorted_obj * osp = &Sorted_objects[Num_sorted_objects]; Object_sort_order[Num_sorted_objects] = Num_sorted_objects; Num_sorted_objects++; osp->obj = objp; vector to_obj; vm_vec_sub( &to_obj, &objp->pos, &Eye_position ); osp->z = vm_vec_dot( &Eye_matrix.fvec, &to_obj ); /* if ( objp->type == OBJ_SHOCKWAVE ) osp->z -= 2*objp->radius; */ // Make warp in effect draw after any ship in it if ( objp->type == OBJ_FIREBALL ) { //if ( fireball_is_warp(objp) ) { osp->z -= 2*objp->radius; //} } osp->min_z = osp->z - objp->radius; osp->max_z = osp->z + objp->radius; } } } // Sort them by their maximum z value if ( Num_sorted_objects > 1 ) { incr = Num_sorted_objects / 2; while( incr > 0 ) { for (i=incr; i<Num_sorted_objects; i++ ) { j = i - incr; while (j>=0 ) { // compare element j and j+incr if ( (Sorted_objects[Object_sort_order[j]].max_z < Sorted_objects[Object_sort_order[j+incr]].max_z) ) { // If not in correct order, them swap 'em int tmp; tmp = Object_sort_order[j]; Object_sort_order[j] = Object_sort_order[j+incr]; Object_sort_order[j+incr] = tmp; j -= incr; } else { break; } } } incr = incr / 2; } } gr_zbuffer_set( GR_ZBUFF_FULL ); // now draw them for (i=0; i<Num_sorted_objects; i++) { sorted_obj * os = &Sorted_objects[Object_sort_order[i]]; os->obj->flags |= OF_WAS_RENDERED; // if we're fullneb, fire up the fog - this also generates a fog table if((The_mission.flags & MISSION_FLAG_FULLNEB) && (Neb2_render_mode != NEB2_RENDER_NONE) && !Fred_running){ // get the fog values neb2_get_fog_values(&fog_near, &fog_far, os->obj); // only reset fog if the fog mode has changed - since regenerating a fog table takes // a bit of time if((fog_near != gr_screen.fog_near) || (fog_far != gr_screen.fog_far)){ gr_fog_set(GR_FOGMODE_FOG, gr_screen.current_fog_color.red, gr_screen.current_fog_color.green, gr_screen.current_fog_color.blue, fog_near, fog_far); } // maybe skip rendering an object because its obscured by the nebula if(neb2_skip_render(os->obj, os->z)){ continue; } } (*render_function)(os->obj); } // if we're fullneb, switch off the fog effet if((The_mission.flags & MISSION_FLAG_FULLNEB) && (Neb2_render_mode != NEB2_RENDER_NONE)){ gr_fog_set(GR_FOGMODE_NONE, 0, 0, 0); } /* Show spheres where wingmen should be flying { extern void render_wing_phantoms_all(); render_wing_phantoms_all(); } */ }