Skip to content

Commit 5ca6421

Browse files
authored
Weapon curves followup (scp-fs2open#6722)
1 parent a28b152 commit 5ca6421

3 files changed

Lines changed: 57 additions & 7 deletions

File tree

code/model/modelrender.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -313,6 +313,8 @@ void model_render_insignias(const insignia_draw_data* insignia);
313313
void model_render_set_wireframe_color(const color* clr);
314314
bool render_tech_model(tech_render_type model_type, int x1, int y1, int x2, int y2, float zoom, bool lighting, int class_idx, const matrix* orient, const SCP_string& pof_filename = "", float closeup_zoom = 0, const vec3d* closeup_pos = &vmd_zero_vector);
315315

316+
float convert_distance_and_diameter_to_pixel_size(float distance, float diameter, float field_of_view_deg, int screen_height);
317+
316318
float model_render_get_diameter_clamped_to_min_pixel_size(const vec3d* pos, float diameter, float min_pixel_size);
317319

318320
void model_render_determine_color(color* clr, float alpha, gr_alpha_blend blend_mode, bool no_texturing, bool desaturate);

code/weapon/weapon.h

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -344,6 +344,8 @@ enum class FiringPattern {
344344

345345
float weapon_get_lifetime_pct(const weapon& wp);
346346
float weapon_get_age(const weapon& wp);
347+
float weapon_get_viewing_angle(const weapon& wp);
348+
float weapon_get_apparent_size(const weapon& wp);
347349

348350
float beam_get_warmup_lifetime_pct(const beam& wp);
349351
float beam_get_warmdown_lifetime_pct(const beam& wp);
@@ -689,6 +691,7 @@ struct weapon_info
689691
LASER_HEADON_SWITCH_ANG_MULT,
690692
LASER_HEADON_SWITCH_RATE_MULT,
691693
LASER_ANIM_STATE,
694+
LASER_ANIM_STATE_ADD,
692695
LASER_ALPHA_MULT,
693696
LASER_BITMAP_R_MULT,
694697
LASER_BITMAP_G_MULT,
@@ -722,6 +725,7 @@ struct weapon_info
722725
std::pair {"Laser Headon Transition Angle Mult", WeaponCurveOutputs::LASER_HEADON_SWITCH_ANG_MULT},
723726
std::pair {"Laser Headon Transition Rate Mult", WeaponCurveOutputs::LASER_HEADON_SWITCH_RATE_MULT},
724727
std::pair {"Laser Animation State", WeaponCurveOutputs::LASER_ANIM_STATE},
728+
std::pair {"Laser Animation State Add", WeaponCurveOutputs::LASER_ANIM_STATE_ADD},
725729
std::pair {"Laser Alpha Mult", WeaponCurveOutputs::LASER_ALPHA_MULT},
726730
std::pair {"Laser Bitmap R Mult", WeaponCurveOutputs::LASER_BITMAP_R_MULT},
727731
std::pair {"Laser Bitmap G Mult", WeaponCurveOutputs::LASER_BITMAP_G_MULT},
@@ -742,14 +746,17 @@ struct weapon_info
742746
std::pair {"Lifetime", modular_curves_functional_input<weapon_get_lifetime_pct>{}},
743747
std::pair {"Age", modular_curves_functional_input<weapon_get_age>{}},
744748
std::pair {"Base Velocity", modular_curves_submember_input<&weapon::weapon_max_vel>{}},
749+
std::pair {"Base Damage", modular_curves_submember_input<&weapon::weapon_info_index, &Weapon_info, &weapon_info::damage>{}},
745750
std::pair {"Max Hitpoints", modular_curves_submember_input<&weapon::weapon_info_index, &Weapon_info, &weapon_info::weapon_hitpoints>{}},
746751
std::pair {"Current Hitpoints", modular_curves_submember_input<&weapon::objnum, &Objects, &object::hull_strength>{}},
747752
std::pair {"Hitpoints Fraction", modular_curves_math_input<
748753
modular_curves_submember_input<&weapon::objnum, &Objects, &object::hull_strength>,
749754
modular_curves_submember_input<&weapon::weapon_info_index, &Weapon_info, &weapon_info::weapon_hitpoints>,
750755
ModularCurvesMathOperators::division
751756
>{}},
752-
std::pair {"Parent Radius", modular_curves_submember_input<&weapon::objnum, &Objects, &object::parent, &Objects, &object::radius>{}}
757+
std::pair {"Parent Radius", modular_curves_submember_input<&weapon::objnum, &Objects, &object::parent, &Objects, &object::radius>{}},
758+
std::pair {"Viewing Angle", modular_curves_functional_input<weapon_get_viewing_angle>{}},
759+
std::pair {"Apparent Size", modular_curves_functional_input<weapon_get_apparent_size>{}}
753760
);
754761

755762
public:

code/weapon/weapons.cpp

Lines changed: 47 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@
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(&center, headp, &wep_objp->pos);
9093+
vm_vec_avg(&center, headp, tailp);
9094+
90939095
vm_vec_sub(&reye, &Eye_position, &center);
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

1046810477
float 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, &center, &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

Comments
 (0)