Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 11 additions & 5 deletions code/ai/aicode.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6775,20 +6775,26 @@ bool check_los(int objnum, int target_objnum, float threshold, int primary_bank,
bool is_primary = secondary_bank == -1;
ship *shipp = &Ships[firing_ship->instance];
ship_weapon *swp = &shipp->weapons;
ship_info *sip = &Ship_info[shipp->ship_info_index];
weapon_info *wip = &Weapon_info[is_primary ? swp->primary_bank_weapons[primary_bank] : swp->secondary_bank_weapons[secondary_bank]];
polymodel* pm = model_get(Ship_info[shipp->ship_info_index].model_num);
polymodel* pm = model_get(sip->model_num);

vec3d pnt = is_primary ? pm->gun_banks[primary_bank].pnt[swp->primary_next_slot[primary_bank]] : pm->missile_banks[secondary_bank].pnt[swp->secondary_next_slot[secondary_bank]];
vec3d firing_point;

// external model firing points only apply when the external models are actually drawn
// (matching ship_fire_primary and ship_fire_secondary)
bool draw_models = is_primary ? sip->draw_primary_models[primary_bank] : sip->draw_secondary_models[secondary_bank];
polymodel* weapon_model = nullptr;
if (wip->external_model_num >= 0) {
if (draw_models && wip->external_model_num >= 0) {
weapon_model = model_get(wip->external_model_num);
}

// use the same firing point the next shot will use
int external_bank = is_primary ? primary_bank : secondary_bank + MAX_SHIP_PRIMARY_BANKS;
vec3d external_fp_offset = ship_get_external_model_fp_offset(swp, wip, weapon_model, external_bank, false);
auto ext = is_primary ? &swp->primary_bank_external_weapon[primary_bank] : &swp->secondary_bank_external_weapon[secondary_bank];
auto ship_bank = is_primary ? &pm->gun_banks[primary_bank] : &pm->missile_banks[secondary_bank];
int slot = is_primary ? swp->primary_next_slot[primary_bank] : swp->secondary_next_slot[secondary_bank];
vec3d external_fp_offset = ship_get_external_model_fp_offset(ext, wip, weapon_model, ship_bank, slot, false);
vm_vec_add2(&pnt, &external_fp_offset);

vm_vec_unrotate(&firing_point, &pnt, &firing_ship->orient);
Expand Down
23 changes: 15 additions & 8 deletions code/hud/hudtarget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7905,11 +7905,13 @@ void HudGaugeHardpoints::render(float /*frametime*/, bool config)
auto ship_pm = model_get(sip->model_num);

for (i = 0; i < swp->num_secondary_banks; i++) {
if (swp->secondary_bank_weapons[i] < 0)
if (swp->secondary_bank_weapons[i] < 0 || !sip->draw_secondary_models[i])
continue;
auto wip = &Weapon_info[swp->secondary_bank_weapons[i]];

if (wip->external_model_num < 0 || !sip->draw_secondary_models[i])
// if the weapon has no dedicated external model, display the weapon's own model, if it has one
int display_model_num = (wip->external_model_num >= 0) ? wip->external_model_num : wip->model_num;
if (display_model_num < 0)
continue;

auto bank = &ship_pm->missile_banks[i];
Expand All @@ -7932,10 +7934,10 @@ void HudGaugeHardpoints::render(float /*frametime*/, bool config)
matrix model_orient;
vm_matrix_x_matrix(&model_orient, &object_orient, &slot_orient);

model_render_immediate(&weapon_render_info, wip->external_model_num, &model_orient, &world_position);
model_render_immediate(&weapon_render_info, display_model_num, &model_orient, &world_position);
}
} else {
auto weapon_pm = model_get(wip->external_model_num);
auto weapon_pm = model_get(display_model_num);
num_secondaries_rendered = 0;

for(k = 0; k < bank->num_slots; k++)
Expand Down Expand Up @@ -7971,7 +7973,7 @@ void HudGaugeHardpoints::render(float /*frametime*/, bool config)
matrix model_orient;
vm_matrix_x_matrix(&model_orient, &object_orient, &slot_orient);

model_render_immediate(&weapon_render_info, wip->external_model_num, &model_orient, &world_position);
model_render_immediate(&weapon_render_info, display_model_num, &model_orient, &world_position);
}
}
}
Expand All @@ -7989,7 +7991,12 @@ void HudGaugeHardpoints::render(float /*frametime*/, bool config)
auto bank = &ship_pm->gun_banks[i];
auto wip = (swp->primary_bank_weapons[i] >= 0) ? &Weapon_info[swp->primary_bank_weapons[i]] : nullptr;

if ( wip == nullptr || wip->external_model_num < 0 || !sip->draw_primary_models[i] ) {
// if the weapon has no dedicated external model, display the weapon's own model, if it has one
int display_model_num = -1;
if ( wip != nullptr && sip->draw_primary_models[i] )
display_model_num = (wip->external_model_num >= 0) ? wip->external_model_num : wip->model_num;

if ( display_model_num < 0 ) {
// no model to draw, so just mark each firing point with a circle
for ( k = 0; k < bank->num_slots; k++ ) {
vm_vec_unrotate(&subobj_pos, &bank->pnt[k], &object_orient);
Expand All @@ -8001,7 +8008,7 @@ void HudGaugeHardpoints::render(float /*frametime*/, bool config)
renderCircle((int)draw_point.screen.xyw.x + position[0], (int)draw_point.screen.xyw.y + position[1], 10);
}
} else {
int external_model_instance = ship_get_external_weapon_model_instance(swp, i);
int external_model_instance = ship_get_external_weapon_model_instance(swp, i, display_model_num);

for ( k = 0; k < bank->num_slots; k++ ) {
model_render_params weapon_render_info;
Expand All @@ -8020,7 +8027,7 @@ void HudGaugeHardpoints::render(float /*frametime*/, bool config)
matrix model_orient;
vm_matrix_x_matrix(&model_orient, &object_orient, &slot_orient);

model_render_immediate(&weapon_render_info, wip->external_model_num, external_model_instance, &model_orient, &world_position);
model_render_immediate(&weapon_render_info, display_model_num, external_model_instance, &model_orient, &world_position);
}
}
}
Expand Down
Loading
Loading