/** * Set the correct frame of animation for the shockwave */ void shockwave_set_framenum(int index) { shockwave *sw; shockwave_info *si; Assert( (index >= 0) && (index < MAX_SHOCKWAVES) ); sw = &Shockwaves[index]; si = &Shockwave_info[sw->shockwave_info_index]; // skip this if it's a 3d shockwave since it won't have the maps managed here if (si->bitmap_id < 0) return; sw->current_bitmap = si->bitmap_id + shockwave_get_framenum(index, si->bitmap_id); }
void shockwave_render(object *objp, draw_list *scene) { shockwave *sw; vertex p; Assert(objp->type == OBJ_SHOCKWAVE); Assert(objp->instance >= 0 && objp->instance < MAX_SHOCKWAVES); 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; if (sw->model_id > -1) { vec3d scale; scale.xyz.x = scale.xyz.y = scale.xyz.z = sw->radius / 50.0f; model_render_params render_info; render_info.set_warp_params(-1, 1.0f - (sw->radius/sw->outer_radius), scale); float dist = vm_vec_dist_quick( &sw->pos, &Eye_position ); render_info.set_detail_level_lock((int)(dist / (sw->radius * 10.0f))); render_info.set_flags(MR_NO_LIGHTING | MR_NO_FOGGING | MR_NORMAL | MR_CENTER_ALPHA | MR_NO_CULL | MR_NO_BATCH); render_info.set_object_number(sw->objnum); model_render_queue( &render_info, scene, sw->model_id, &Objects[sw->objnum].orient, &sw->pos); 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 ); } }
/** * 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 ); } }