Skip to content

Commit fbf5870

Browse files
authored
Merge pull request scp-fs2open#7271 from Goober5000/particle_fixes
particle fixes and subsystem speedup
2 parents 78f60c6 + 89e7fd9 commit fbf5870

7 files changed

Lines changed: 49 additions & 23 deletions

File tree

code/ai/aiturret.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2042,7 +2042,7 @@ bool turret_fire_weapon(int weapon_num,
20422042
}
20432043
//spawn particle effect
20442044
auto particleSource = particle::ParticleManager::get()->createSource(wip->muzzle_effect);
2045-
particleSource->setHost(make_unique<EffectHostTurret>(&Objects[parent_ship->objnum], turret->system_info->turret_gun_sobj, turret->turret_next_fire_pos));
2045+
particleSource->setHost(make_unique<EffectHostTurret>(&Objects[parent_ship->objnum], turret->system_info->turret_gun_sobj, turret->turret_next_fire_pos, false));
20462046
particleSource->setTriggerRadius(objp->radius * radius_mult);
20472047
particleSource->setTriggerVelocity(vm_vec_mag_quick(&objp->phys_info.vel));
20482048
particleSource->finishCreation();
@@ -2163,7 +2163,7 @@ void turret_swarm_fire_from_turret(turret_swarm_info *tsi)
21632163
if (Weapon_info[tsi->weapon_class].muzzle_effect.isValid()) {
21642164
//spawn particle effect
21652165
auto particleSource = particle::ParticleManager::get()->createSource(Weapon_info[tsi->weapon_class].muzzle_effect);
2166-
particleSource->setHost(make_unique<EffectHostTurret>(&Objects[tsi->parent_objnum], tsi->turret->system_info->turret_gun_sobj, tsi->turret->turret_next_fire_pos - 1));
2166+
particleSource->setHost(make_unique<EffectHostTurret>(&Objects[tsi->parent_objnum], tsi->turret->system_info->turret_gun_sobj, tsi->turret->turret_next_fire_pos - 1, false));
21672167
particleSource->setTriggerRadius(Objects[weapon_objnum].radius);
21682168
particleSource->finishCreation();
21692169
}

code/particle/ParticleSource.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,10 @@ void ParticleSource::finishCreation() {
3232
if (Is_standalone)
3333
return;
3434

35+
Assertion(isValid(), "Cannot create a ParticleSource that is not valid!");
36+
if (!isValid())
37+
return;
38+
3539
m_host->setupProcessing();
3640

3741
const auto& effectList = ParticleManager::get()->getEffect(m_effect);

code/particle/hosts/EffectHostTurret.cpp

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,23 @@
44
#include "model/model.h"
55
#include "ship/ship.h"
66

7-
EffectHostTurret::EffectHostTurret(object* objp, int submodel, int fire_pnt, matrix orientationOverride, bool orientationOverrideRelative) :
8-
EffectHost(orientationOverride, orientationOverrideRelative), m_objnum(OBJ_INDEX(objp)), m_objsig(objp->signature), m_submodel(submodel), m_fire_pnt(fire_pnt) {}
7+
EffectHostTurret::EffectHostTurret(const object* objp, int submodel, int fire_pnt, bool is_fighterbeam, matrix orientationOverride, bool orientationOverrideRelative) :
8+
EffectHost(orientationOverride, orientationOverrideRelative), m_objnum(OBJ_INDEX(objp)), m_objsig(objp ? objp->signature : -1), m_submodel(submodel), m_fire_pnt(fire_pnt), m_is_fighterbeam(is_fighterbeam) {}
99

1010
std::pair<vec3d, matrix> EffectHostTurret::getPositionAndOrientation(bool relativeToParent, float interp, const std::optional<vec3d>& tabled_offset) const {
1111
ship& shipp = Ships[Objects[m_objnum].instance];
1212
const polymodel* pm = model_get(Ship_info[shipp.ship_info_index].model_num);
1313
const polymodel_instance* pmi = model_get_instance(shipp.model_instance_num);
1414

1515
vec3d gvec, pos;
16-
model_subsystem *tp = ship_get_indexed_subsys(&shipp, pm->submodel[m_submodel].subsys_num)->system_info;
16+
model_subsystem* tp;
17+
if (m_is_fighterbeam) {
18+
tp = &shipp.beam_sys_info;
19+
} else {
20+
auto subsys = ship_get_subsys_for_submodel(&shipp, m_submodel);
21+
Assertion(subsys != nullptr, "EffectHostTurret constructed with missing subsystem!");
22+
tp = subsys->system_info;
23+
}
1724
vec3d* gun_pos = &tp->turret_firing_point[m_fire_pnt % tp->turret_num_firing_points];
1825
const matrix& gun_frame_of_reference = pm->submodel[m_submodel].frame_of_reference;
1926

@@ -72,6 +79,5 @@ float EffectHostTurret::getHostRadius() const {
7279
}
7380

7481
bool EffectHostTurret::isValid() const {
75-
return m_objnum >= 0 && m_submodel >= 0 && Objects[m_objnum].signature == m_objsig && Objects[m_objnum].type == OBJ_SHIP &&
76-
model_get(Ship_info[Ships[Objects[m_objnum].instance].ship_info_index].model_num)->submodel[m_submodel].subsys_num >= 0;
77-
}
82+
return m_objnum >= 0 && m_submodel >= 0 && Objects[m_objnum].signature == m_objsig && Objects[m_objnum].type == OBJ_SHIP;
83+
}

code/particle/hosts/EffectHostTurret.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,10 @@
55

66
class EffectHostTurret : public EffectHost {
77
int m_objnum, m_objsig, m_submodel, m_fire_pnt;
8+
bool m_is_fighterbeam;
89

910
public:
10-
EffectHostTurret(object* objp, int submodel, int fire_pnt, matrix orientationOverride = vmd_identity_matrix, bool orientationOverrideRelative = true);
11+
EffectHostTurret(const object* objp, int submodel, int fire_pnt, bool is_fighterbeam, matrix orientationOverride = vmd_identity_matrix, bool orientationOverrideRelative = true);
1112

1213
std::pair<vec3d, matrix> getPositionAndOrientation(bool relativeToParent, float interp, const std::optional<vec3d>& tabled_offset) const override;
1314

@@ -18,4 +19,4 @@ class EffectHostTurret : public EffectHost {
1819
float getHostRadius() const override;
1920

2021
bool isValid() const override;
21-
};
22+
};

code/scripting/api/objs/particle.cpp

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#include "model.h"
88
#include "particle/ParticleManager.h"
99
#include "particle/ParticleEffect.h"
10+
#include "ship/ship.h"
1011

1112
namespace scripting {
1213
namespace api {
@@ -397,11 +398,20 @@ ADE_FUNC(createOnTurret, l_ParticleSource, "object object, submodel submodel, nu
397398
if (!(subobjh.isValid() && objh.isValid()))
398399
return ade_set_args(L, "b", false);
399400

401+
if (objh.objp()->type != OBJ_SHIP)
402+
return ade_set_args(L, "b", false);
403+
404+
// this submodel must be a turret
405+
auto shipp = &Ships[objh.objp()->instance];
406+
auto subsys = ship_get_subsys_for_submodel(shipp, subobjh.GetSubmodelIndex());
407+
if (subsys == nullptr || subsys->system_info->type != SUBSYSTEM_TURRET)
408+
return ade_set_args(L, "b", false);
409+
400410
particle::ParticleSource* psp = ps.Get();
401411
if (psp == nullptr)
402412
return ade_set_args(L, "b", false);
403413

404-
psp->setHost(std::make_unique<EffectHostTurret>(objh.objp(), subobjh.GetSubmodelIndex(), firepoint, *orientationOverride.GetMatrix(), orientationOverrideRelative));
414+
psp->setHost(std::make_unique<EffectHostTurret>(objh.objp(), subobjh.GetSubmodelIndex(), firepoint, false, *orientationOverride.GetMatrix(), orientationOverrideRelative));
405415
psp->finishCreation();
406416

407417
return ade_set_args(L, "b", true);

code/ship/ship.cpp

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -21941,20 +21941,18 @@ void toggle_ignore_list_flag(Ship::Ship_Flags flag) {
2194121941

2194221942
ship_subsys* ship_get_subsys_for_submodel(ship* shipp, int submodel)
2194321943
{
21944-
ship_subsys* subsys;
21945-
21946-
if (submodel == -1) {
21944+
// no submodel
21945+
if (submodel == -1)
2194721946
return nullptr;
21948-
}
2194921947

21950-
for (subsys = GET_FIRST(&shipp->subsys_list); subsys != END_OF_LIST(&shipp->subsys_list);
21951-
subsys = GET_NEXT(subsys)) {
21952-
if (subsys->system_info->subobj_num == submodel) {
21953-
return subsys;
21954-
}
21955-
}
21948+
auto pm = model_get(Ship_info[shipp->ship_info_index].model_num);
21949+
Assertion(submodel >= 0 && submodel < pm->n_models, "Ship %s submodel index %d is out of range!", shipp->ship_name, submodel);
2195621950

21957-
return nullptr;
21951+
// no associated subsystem
21952+
if (pm->submodel[submodel].subsys_num == -1)
21953+
return nullptr;
21954+
21955+
return ship_get_indexed_subsys(shipp, pm->submodel[submodel].subsys_num);
2195821956
}
2195921957

2196021958
/**

code/weapon/beam.cpp

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -583,7 +583,14 @@ int beam_fire(beam_fire_info *fire_info)
583583
host = std::make_unique<EffectHostObject>(new_item->objp, local_pos, orient);
584584
}
585585
else {
586-
host = std::make_unique<EffectHostTurret>(new_item->objp, new_item->subsys->system_info->turret_gun_sobj, new_item->firingpoint);
586+
bool is_fighterbeam = false;
587+
if (new_item->objp->type == OBJ_SHIP) {
588+
auto shipp = &Ships[new_item->objp->instance];
589+
if (new_item->subsys == &shipp->fighter_beam_turret_data) {
590+
is_fighterbeam = true;
591+
}
592+
}
593+
host = std::make_unique<EffectHostTurret>(new_item->objp, new_item->subsys->system_info->turret_gun_sobj, new_item->firingpoint, is_fighterbeam);
587594
}
588595

589596
source->setHost(std::move(host));

0 commit comments

Comments
 (0)