6161#include " tracing/Monitor.h"
6262#include " tracing/tracing.h"
6363#include " weapon.h"
64+ #include " model/modelrender.h"
6465
6566
6667// Since SSMs are parsed after weapons, if we want to allow SSM strikes to be specified by name, we need to store those names until after SSMs are parsed.
@@ -9089,7 +9090,8 @@ float weapon_render_headon_bitmap(object* wep_objp, vec3d* headp, vec3d* tailp,
90899090 weapon_info* wip = &Weapon_info[wp->weapon_info_index ];
90909091
90919092 vec3d center, reye;
9092- vm_vec_avg (¢er, headp, &wep_objp->pos );
9093+ vm_vec_avg (¢er, headp, tailp);
9094+
90939095 vm_vec_sub (&reye, &Eye_position, ¢er);
90949096 vm_vec_normalize (&reye);
90959097 float ang = vm_vec_delta_ang_norm (&reye, &wep_objp->orient .vec .fvec , nullptr );
@@ -9186,6 +9188,10 @@ void weapon_render(object* obj, model_draw_list *scene)
91869188 float switch_rate_mult = wip->weapon_curves .get_output (weapon_info::WeaponCurveOutputs::LASER_HEADON_SWITCH_RATE_MULT , *wp, &wp->modular_curves_instance );
91879189 bool anim_has_curve = wip->weapon_curves .has_curve (weapon_info::WeaponCurveOutputs::LASER_ANIM_STATE );
91889190 float anim_state = wip->weapon_curves .get_output (weapon_info::WeaponCurveOutputs::LASER_ANIM_STATE , *wp, &wp->modular_curves_instance );
9191+ float anim_state_add = 0 .f ;
9192+ if (wip->weapon_curves .has_curve (weapon_info::WeaponCurveOutputs::LASER_ANIM_STATE_ADD )) {
9193+ anim_state_add = wip->weapon_curves .get_output (weapon_info::WeaponCurveOutputs::LASER_ANIM_STATE_ADD , *wp, &wp->modular_curves_instance );
9194+ }
91899195 float alpha_mult = wip->weapon_curves .get_output (weapon_info::WeaponCurveOutputs::LASER_ALPHA_MULT , *wp, &wp->modular_curves_instance );
91909196 float bitmap_r_mult = wip->weapon_curves .get_output (weapon_info::WeaponCurveOutputs::LASER_BITMAP_R_MULT , *wp, &wp->modular_curves_instance );
91919197 float bitmap_g_mult = wip->weapon_curves .get_output (weapon_info::WeaponCurveOutputs::LASER_BITMAP_G_MULT , *wp, &wp->modular_curves_instance );
@@ -9212,6 +9218,9 @@ void weapon_render(object* obj, model_draw_list *scene)
92129218 if (laser_length < 0 .0001f )
92139219 return ;
92149220
9221+ if (head_radius < 0 .0001f && tail_radius < 0 .0001f )
9222+ return ;
9223+
92159224 if (head_radius <= 0 .0001f ) {
92169225 head_radius = 0 .0001f ;
92179226 }
@@ -9245,7 +9254,7 @@ void weapon_render(object* obj, model_draw_list *scene)
92459254 wp->laser_bitmap_frame += flFrametime;
92469255
92479256 if (anim_has_curve) {
9248- framenum = fl2i (i2fl (wip->laser_bitmap .num_frames - 1 ) * anim_state);
9257+ framenum = fl2i (i2fl (wip->laser_bitmap .num_frames - 1 ) * ( anim_state + anim_state_add) );
92499258 } else {
92509259 framenum = bm_get_anim_frame (wip->laser_bitmap .first_frame , wp->laser_bitmap_frame , wip->laser_bitmap .total_time , true );
92519260 }
@@ -9257,12 +9266,12 @@ void weapon_render(object* obj, model_draw_list *scene)
92579266 wp->laser_headon_bitmap_frame += flFrametime;
92589267
92599268 if (anim_has_curve) {
9260- framenum = fl2i (i2fl (wip->laser_headon_bitmap .num_frames - 1 ) * anim_state);
9269+ headon_framenum = fl2i (i2fl (wip->laser_headon_bitmap .num_frames - 1 ) * ( anim_state + anim_state_add) );
92619270 } else {
92629271 headon_framenum = bm_get_anim_frame (wip->laser_headon_bitmap .first_frame , wp->laser_headon_bitmap_frame , wip->laser_headon_bitmap .total_time , true );
92639272 }
92649273
9265- CLAMP (framenum , 0 , wip->laser_headon_bitmap .num_frames - 1 );
9274+ CLAMP (headon_framenum , 0 , wip->laser_headon_bitmap .num_frames - 1 );
92669275 }
92679276
92689277 if (wip->wi_flags [Weapon::Info_Flags::Transparent]) {
@@ -9342,7 +9351,7 @@ void weapon_render(object* obj, model_draw_list *scene)
93429351 wp->laser_glow_bitmap_frame -= wip->laser_glow_bitmap .total_time ;
93439352
93449353 if (anim_has_curve) {
9345- framenum = fl2i (i2fl (wip->laser_glow_bitmap .num_frames ) * anim_state);
9354+ framenum = fl2i (i2fl (wip->laser_glow_bitmap .num_frames - 1 ) * ( anim_state + anim_state_add) );
93469355 } else {
93479356 framenum = fl2i ( (wp->laser_glow_bitmap_frame * wip->laser_glow_bitmap .num_frames ) / wip->laser_glow_bitmap .total_time );
93489357 }
@@ -9363,7 +9372,7 @@ void weapon_render(object* obj, model_draw_list *scene)
93639372 wp->laser_glow_headon_bitmap_frame -= wip->laser_glow_headon_bitmap .total_time ;
93649373
93659374 if (anim_has_curve) {
9366- framenum = fl2i (i2fl (wip->laser_glow_headon_bitmap .num_frames ) * anim_state);
9375+ headon_framenum = fl2i (i2fl (wip->laser_glow_headon_bitmap .num_frames - 1 ) * ( anim_state + anim_state_add) );
93679376 } else {
93689377 headon_framenum = fl2i ((wp->laser_glow_headon_bitmap_frame * wip->laser_glow_headon_bitmap .num_frames ) / wip->laser_glow_headon_bitmap .total_time );
93699378 }
@@ -10467,4 +10476,36 @@ float weapon_get_lifetime_pct(const weapon& wp) {
1046710476
1046810477float weapon_get_age (const weapon& wp) {
1046910478 return f2fl (Missiontime - wp.creation_time );
10479+ }
10480+
10481+ float weapon_get_viewing_angle (const weapon& wp) {
10482+ object* wep_objp = &Objects[wp.objnum ];
10483+ weapon_info* wip = &Weapon_info[wp.weapon_info_index ];
10484+ vec3d center;
10485+ if (wip->render_type != WRT_LASER ) {
10486+ center = wep_objp->pos ;
10487+ } else {
10488+ vec3d rotated_offset;
10489+ vm_vec_unrotate (&rotated_offset, &wip->laser_pos_offset , &wep_objp->orient );
10490+
10491+ center = wep_objp->pos + (wep_objp->orient .vec .fvec * wip->laser_length * 0 .5f );
10492+ center += rotated_offset * wip->laser_length ;
10493+ }
10494+
10495+ vec3d reye;
10496+ vm_vec_sub (&reye, ¢er, &Eye_position);
10497+ vm_vec_normalize (&reye);
10498+ return vm_vec_dot (&reye, &wep_objp->orient .vec .fvec );
10499+ }
10500+
10501+ float weapon_get_apparent_size (const weapon& wp) {
10502+ object* wep_objp = &Objects[wp.objnum ];
10503+
10504+ float dist = vm_vec_dist (&Eye_position, &wep_objp->pos );
10505+
10506+ return convert_distance_and_diameter_to_pixel_size (
10507+ dist,
10508+ wep_objp->radius ,
10509+ fl_degrees (g3_get_hfov (Eye_fov)),
10510+ gr_screen.max_h ) / i2fl (gr_screen.max_h );
1047010511}
0 commit comments