Skip to content

Commit d96c457

Browse files
authored
Merge pull request #153 from cortex-command-community/emissionparticlecount
Add ParticleCount to emissions, updates to InheritsVel
2 parents 453c108 + db1c811 commit d96c457

File tree

10 files changed

+112
-26
lines changed

10 files changed

+112
-26
lines changed

CHANGELOG.md

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,12 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
7373

7474
- Allow lua scripts to use LuaJIT's BitOp module (see https://bitop.luajit.org/api.html)
7575

76+
- New `Emission` INI and Lua (R/W) property `ParticleCount` which sets how many particles the Emission spawns per emission. Defaults to 1.
77+
78+
- New `Gib` and `Emission` INI and Lua (R/W) property `InheritsAngularVel`, which determines how much of the parent MO's angular velocity they inherit. Defaults to 1 for gibs, 0 for emissions.
79+
80+
- New `Attachable` INI and Lua (R/W) properties `InheritsVelWhenDetached` and `InheritsAngularVelWhenDetached`, which determine how much of these velocities an attachable inherits from its parent when detached. Defaults to 1.
81+
7682
</details>
7783

7884
<details><summary><b>Changed</b></summary>
@@ -109,7 +115,11 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
109115

110116
- Almost all ctrl+* special inputs functionality (i.e restarting activity, world dumps, showing performance stats) are now mapped to right alt, to not interfere with default crouching inputs. The only exception is ctrl+arrow keys for changing console size.
111117

112-
- Gibs and detached Attachables now inherit the parent's angular velocity, as well as velocity derived from the angular velocity of the parent MO and their offset from the parent's centre. On gibs, this is scaled by `InheritsVel`.
118+
- `Gib`s and detached `Attachable`s now inherit the parent's angular velocity by default.
119+
120+
- `InheritsVel` now accounts for the angular velocity of the parent MO, resulting in offset gibs and emissions being flung further away.
121+
122+
- `InheritsVel` and its ilk have been uncapped, allowing users to set them outside of 0-1.
113123

114124
</details>
115125

Source/Entities/AEmitter.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -446,9 +446,14 @@ void AEmitter::Update() {
446446
scale = m_BurstScale;
447447
}
448448
emissionCountTotal += emissionCount;
449+
if (emissionCount > 0) {
450+
int extraEmissions = emission.GetParticleCount() - 1;
451+
emissionCount += extraEmissions;
452+
}
449453
pParticle = 0;
450454
emitVel.Reset();
451455
parentVel = pRootParent->GetVel() * emission.InheritsVelocity();
456+
Vector rotationalVel = (((RotateOffset(emission.GetOffset()) + (m_Pos - pRootParent->GetPos())) * pRootParent->GetAngularVel()).GetPerpendicular() / c_PPM) * emission.InheritsVelocity();
452457

453458
for (int i = 0; i < emissionCount; ++i) {
454459
velMin = emission.GetMinVelocity() * scale;
@@ -472,8 +477,9 @@ void AEmitter::Update() {
472477
emitVel.SetXY(velMin + RandomNum(0.0F, velRange), 0.0F);
473478
emitVel.RadRotate(m_EmitAngle.GetRadAngle() + spread * RandomNormalNum());
474479
emitVel = RotateOffset(emitVel);
475-
pParticle->SetVel(parentVel + emitVel);
480+
pParticle->SetVel(parentVel + rotationalVel + emitVel);
476481
pParticle->SetRotAngle(emitVel.GetAbsRadAngle() + (m_HFlipped ? -c_PI : 0));
482+
pParticle->SetAngularVel(pRootParent->GetAngularVel() * emission.InheritsAngularVelocity());
477483
pParticle->SetHFlipped(m_HFlipped);
478484

479485
// Scale the particle's lifetime based on life variation and throttle, as long as it's not 0

Source/Entities/Attachable.cpp

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,8 @@ void Attachable::Clear() {
4848
m_InheritedRotAngleOffset = 0;
4949
m_MountedRotAngleOffset = 0.0F;
5050
m_InheritsFrame = false;
51+
m_InheritsVelWhenDetached = 1.0F;
52+
m_InheritsAngularVelWhenDetached = 1.0F;
5153

5254
m_AtomSubgroupID = -1L;
5355
m_CollidesWithTerrainWhileAttached = true;
@@ -98,6 +100,8 @@ int Attachable::Create(const Attachable& reference) {
98100
m_InheritedRotAngleOffset = reference.m_InheritedRotAngleOffset;
99101
m_MountedRotAngleOffset = reference.m_MountedRotAngleOffset;
100102
m_InheritsFrame = reference.m_InheritsFrame;
103+
m_InheritsVelWhenDetached = reference.m_InheritsVelWhenDetached;
104+
m_InheritsAngularVelWhenDetached = reference.m_InheritsAngularVelWhenDetached;
101105

102106
m_AtomSubgroupID = GetUniqueID();
103107
m_CollidesWithTerrainWhileAttached = reference.m_CollidesWithTerrainWhileAttached;
@@ -147,6 +151,8 @@ int Attachable::ReadProperty(const std::string_view& propName, Reader& reader) {
147151
MatchProperty("InheritedRotAngleDegOffset", { m_InheritedRotAngleOffset = DegreesToRadians(std::stof(reader.ReadPropValue())); });
148152
MatchProperty("MountedRotAngleOffset", { reader >> m_MountedRotAngleOffset; });
149153
MatchProperty("InheritsFrame", { reader >> m_InheritsFrame; });
154+
MatchProperty("InheritsVelWhenDetached", { reader >> m_InheritsVelWhenDetached; });
155+
MatchProperty("InheritsAngularVelWhenDetached", { reader >> m_InheritsAngularVelWhenDetached; });
150156
MatchProperty("CollidesWithTerrainWhileAttached", { reader >> m_CollidesWithTerrainWhileAttached; });
151157
MatchProperty("IgnoresParticlesWhileAttached", { reader >> m_IgnoresParticlesWhileAttached; });
152158
MatchProperty("AddPieSlice", { m_PieSlices.emplace_back(std::unique_ptr<PieSlice>(dynamic_cast<PieSlice*>(g_PresetMan.ReadReflectedPreset(reader)))); });
@@ -173,7 +179,9 @@ int Attachable::Save(Writer& writer) const {
173179
writer.NewPropertyWithValue("InheritsHFlipped", ((m_InheritsHFlipped == 0 || m_InheritsHFlipped == 1) ? m_InheritsHFlipped : 2));
174180
writer.NewPropertyWithValue("InheritsRotAngle", m_InheritsRotAngle);
175181
writer.NewPropertyWithValue("InheritedRotAngleOffset", m_InheritedRotAngleOffset);
176-
writer.NewPropertyWithValue("MountedRotAngleOffset", m_MountedRotAngleOffset);
182+
writer.NewPropertyWithValue("MountedRotAngleOffset", m_MountedRotAngleOffset);
183+
writer.NewPropertyWithValue("InheritsVelWhenDetached", m_InheritsVelWhenDetached);
184+
writer.NewPropertyWithValue("InheritsAngularVelWhenDetached", m_InheritsAngularVelWhenDetached);
177185

178186
writer.NewPropertyWithValue("CollidesWithTerrainWhileAttached", m_CollidesWithTerrainWhileAttached);
179187
writer.NewPropertyWithValue("IgnoresParticlesWhileAttached", m_IgnoresParticlesWhileAttached);

Source/Entities/Attachable.h

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -276,6 +276,23 @@ namespace RTE {
276276
/// Sets whether or not this Attachable inherits its Frame from its parent, if attached.
277277
/// @param inheritsFrame Whether or not to inherit its parent's Frame.
278278
void SetInheritsFrame(bool inheritsFrame) { m_InheritsFrame = inheritsFrame; }
279+
280+
/// How much of the root parent's velocity this attachable inherits when detached
281+
/// @return The proportion of the velocity inherited. 0.1 = 10% inheritance.
282+
float InheritsVelocityWhenDetached() const { return m_InheritsVelWhenDetached; }
283+
284+
/// How much of the root parent's angular velocity this attachable inherits when detached
285+
/// @return The proportion of the angular velocity inherited. 0.1 = 10% inheritance.
286+
float InheritsAngularVelocityWhenDetached() const { return m_InheritsAngularVelWhenDetached; }
287+
288+
/// Sets how much of the root parent's velocity this attachable inherits when detached
289+
/// @param The proportion of the velocity inherited. 0.1 = 10% inheritance.
290+
void SetInheritsVelocityWhenDetached(float newValue) { m_InheritsVelWhenDetached = newValue; }
291+
292+
/// Sets how much of the root parent's angular velocity this attachable inherits when detached
293+
/// @param The proportion of the angular velocity inherited. 0.1 = 10% inheritance.
294+
void SetInheritsAngularVelocityWhenDetached(float newValue) { m_InheritsAngularVelWhenDetached = newValue; }
295+
279296
#pragma endregion
280297

281298
#pragma region Collision Management
@@ -447,6 +464,9 @@ namespace RTE {
447464
float m_MountedRotAngleOffset; //!< A relative offset angle (in radians) of this Attachable's rotation that should only be set by Turrets. Defaults to 0.
448465
bool m_InheritsFrame; //!< Whether this Attachable should inherit its parent's Frame. Defaults to false.
449466

467+
float m_InheritsVelWhenDetached; //!< How much of the parents velocity this attachable inherits when detached
468+
float m_InheritsAngularVelWhenDetached; //!< How much of the parents angular velocity this attachable inherits when detached
469+
450470
long m_AtomSubgroupID; //!< The Atom IDs this' atoms will have when attached and added to a parent's AtomGroup.
451471
bool m_CollidesWithTerrainWhileAttached; //!< Whether this attachable currently has terrain collisions enabled while it's attached to a parent.
452472
bool m_IgnoresParticlesWhileAttached; //!< Whether this Attachable should ignore collisions with single-atom MOs while attached.

Source/Entities/Emission.cpp

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,14 @@ void Emission::Clear() {
1717
m_MaxVelocity = 0;
1818
m_LifeVariation = 0.1;
1919
m_PushesEmitter = true;
20-
m_InheritsVel = 0;
20+
m_InheritsVel = 0.0F;
21+
m_InheritsAngularVel = 0.0F;
2122
m_StartTimer.SetSimTimeLimitMS(0);
2223
m_StartTimer.Reset();
2324
m_StopTimer.SetSimTimeLimitMS(1000000);
2425
m_StopTimer.Reset();
2526
m_Offset.Reset();
27+
m_ParticleCount = 1;
2628
}
2729

2830
/*
@@ -46,9 +48,11 @@ int Emission::Create(const Emission& reference) {
4648
m_LifeVariation = reference.m_LifeVariation;
4749
m_PushesEmitter = reference.m_PushesEmitter;
4850
m_InheritsVel = reference.m_InheritsVel;
51+
m_InheritsAngularVel = reference.m_InheritsAngularVel;
4952
m_StartTimer = reference.m_StartTimer;
5053
m_StopTimer = reference.m_StopTimer;
5154
m_Offset = reference.m_Offset;
55+
m_ParticleCount = reference.m_ParticleCount;
5256

5357
return 0;
5458
}
@@ -69,11 +73,9 @@ int Emission::ReadProperty(const std::string_view& propName, Reader& reader) {
6973
MatchProperty("LifeVariation", { reader >> m_LifeVariation; });
7074
MatchProperty("PushesEmitter", { reader >> m_PushesEmitter; });
7175
MatchProperty("Offset", { reader >> m_Offset; });
72-
MatchProperty("InheritsVel",
73-
{
74-
reader >> m_InheritsVel;
75-
Clamp(m_InheritsVel, 1, 0);
76-
});
76+
MatchProperty("ParticleCount", { reader >> m_ParticleCount; });
77+
MatchProperty("InheritsVel", { reader >> m_InheritsVel; });
78+
MatchProperty("InheritsAngularVel", { reader >> m_InheritsAngularVel; });
7779
MatchProperty("StartTimeMS",
7880
{
7981
double startTime;
@@ -111,12 +113,16 @@ int Emission::Save(Writer& writer) const {
111113
writer << m_PushesEmitter;
112114
writer.NewProperty("InheritsVel");
113115
writer << m_InheritsVel;
116+
writer.NewProperty("InheritsAngularVel");
117+
writer << m_InheritsAngularVel;
114118
writer.NewProperty("Offset");
115119
writer << m_Offset;
116120
writer.NewProperty("StartTimeMS");
117121
writer << m_StartTimer.GetSimTimeLimitMS();
118122
writer.NewProperty("StopTimeMS");
119123
writer << m_StopTimer.GetSimTimeLimitMS();
124+
writer.NewProperty("ParticleCount");
125+
writer << m_ParticleCount;
120126

121127
return 0;
122128
}

Source/Entities/Emission.h

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -114,9 +114,21 @@ namespace RTE {
114114
m_StopTimer.Reset();
115115
}
116116

117-
/// How much of the root parent's velocity this emission inherit
117+
/// How much of the root parent's velocity this emission inherits
118118
/// @return The proportion of the velocity inherited. 0.1 = 10% inheritance.
119-
float InheritsVelocity() { return m_InheritsVel; }
119+
float InheritsVelocity() const { return m_InheritsVel; }
120+
121+
/// How much of the root parent's angular velocity this emission inherits
122+
/// @return The proportion of the angular velocity inherited. 0.1 = 10% inheritance.
123+
float InheritsAngularVelocity() const { return m_InheritsAngularVel; }
124+
125+
/// Sets how much of the root parent's velocity this emission inherits
126+
/// @param The proportion of the velocity inherited. 0.1 = 10% inheritance.
127+
void SetInheritsVelocity(float newValue) { m_InheritsVel = newValue; }
128+
129+
/// Sets how much of the root parent's angular velocity this emission inherits
130+
/// @param The proportion of the angular velocity inherited. 0.1 = 10% inheritance.
131+
void SetInheritsAngularVelocity(float newValue) { m_InheritsAngularVel = newValue; }
120132

121133
/// Gets offset of the emission point from Emitter's sprite center, which gets rotated with owner Emitter
122134
/// @return Returns emission offset.
@@ -126,6 +138,14 @@ namespace RTE {
126138
/// @param offset New offset value.
127139
void SetOffset(Vector offset) { m_Offset = offset; }
128140

141+
/// Returns number of particles emitted per emission.
142+
/// @return Number of particles emitted per emission.
143+
int GetParticleCount() const { return m_ParticleCount; }
144+
145+
/// Sets number of particles emitted per emission.
146+
/// @param newParticleCount The new number of particles emitted per emission.
147+
void SetParticleCount(int newParticleCount) { m_ParticleCount = newParticleCount; }
148+
129149
/// Protected member variable and method declarations
130150
protected:
131151
// Member variables
@@ -157,11 +177,15 @@ namespace RTE {
157177
bool m_PushesEmitter;
158178
// How much of the parents velocity this emission inherits
159179
float m_InheritsVel;
180+
// How much of the parents angular velocity this emission inherits
181+
float m_InheritsAngularVel;
160182
// Timers for measuring when to start and stop this emission the actual times are the set time limits of these
161183
Timer m_StartTimer;
162184
Timer m_StopTimer;
163185
// Offset of the emission point from Emitter's sprite center, which gets rotated with owner Emitter
164186
Vector m_Offset;
187+
// The number of particles emitted per emission
188+
int m_ParticleCount;
165189

166190
/// Private member variable and method declarations
167191
private:

Source/Entities/Gib.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ void Gib::Clear() {
2323
m_MaxVelocity = 0;
2424
m_LifeVariation = 0.1F;
2525
m_InheritsVel = 1.0F;
26+
m_InheritsAngularVel = 1.0F;
2627
m_IgnoresTeamHits = false;
2728
m_SpreadMode = SpreadMode::SpreadRandom;
2829
}
@@ -36,6 +37,7 @@ int Gib::Create(const Gib& reference) {
3637
m_MaxVelocity = reference.m_MaxVelocity;
3738
m_LifeVariation = reference.m_LifeVariation;
3839
m_InheritsVel = reference.m_InheritsVel;
40+
m_InheritsAngularVel = reference.m_InheritsAngularVel;
3941
m_IgnoresTeamHits = reference.m_IgnoresTeamHits;
4042
m_SpreadMode = reference.m_SpreadMode;
4143

@@ -56,6 +58,7 @@ int Gib::ReadProperty(const std::string_view& propName, Reader& reader) {
5658
MatchProperty("MaxVelocity", { reader >> m_MaxVelocity; });
5759
MatchProperty("LifeVariation", { reader >> m_LifeVariation; });
5860
MatchProperty("InheritsVel", { reader >> m_InheritsVel; });
61+
MatchProperty("InheritsAngularVel", { reader >> m_InheritsAngularVel; });
5962
MatchProperty("IgnoresTeamHits", { reader >> m_IgnoresTeamHits; });
6063
MatchProperty("SpreadMode", { m_SpreadMode = static_cast<SpreadMode>(std::stoi(reader.ReadPropValue())); });
6164

@@ -89,6 +92,8 @@ int Gib::Save(Writer& writer) const {
8992
writer << m_LifeVariation;
9093
writer.NewProperty("InheritsVel");
9194
writer << m_InheritsVel;
95+
writer.NewProperty("InheritsAngularVel");
96+
writer << m_InheritsAngularVel;
9297
*/
9398

9499
return 0;

Source/Entities/Gib.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,10 @@ namespace RTE {
8686
/// @return The proportion of inherited velocity as a scalar from 0 to 1.
8787
float InheritsVelocity() const { return m_InheritsVel; }
8888

89+
/// Gets how much of the gibbing parent's angular velocity this Gib's GibParticles should inherit.
90+
/// @return The proportion of inherited velocity as a scalar from 0 to 1.
91+
float InheritsAngularVelocity() const { return m_InheritsAngularVel; }
92+
8993
/// Gets whether this Gib's GibParticles should ignore hits with the team of the gibbing parent.
9094
/// @return Whether this Gib's GibParticles should ignore hits with the team of the gibbing parent.
9195
bool IgnoresTeamHits() const { return m_IgnoresTeamHits; }
@@ -108,6 +112,7 @@ namespace RTE {
108112
float m_MaxVelocity; //!< The maximum velocity a GibParticle object can have when spawned.
109113
float m_LifeVariation; //!< The per-Gib variation in Lifetime, in percentage of the existing Lifetime of the gib.
110114
float m_InheritsVel; //!< How much of the exploding parent's velocity this Gib should inherit.
115+
float m_InheritsAngularVel; //!< How much of the exploding parent's angular velocity this Gib should inherit.
111116
bool m_IgnoresTeamHits; //!< Whether this Gib should ignore hits with the team of the exploding parent or not.
112117
SpreadMode m_SpreadMode; //!< Determines what kind of logic is used when applying velocity to the GibParticle objects.
113118

Source/Entities/MOSRotating.cpp

Lines changed: 11 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -943,12 +943,10 @@ void MOSRotating::CreateGibsWhenGibbing(const Vector& impactImpulse, MovableObje
943943
Vector gibVelocity(radius * scale + minVelocity, 0);
944944
gibVelocity.RadRotate(randAngle + RandomNum(0.0F, spread) + static_cast<float>(i) * goldenAngle);
945945

946-
if (gibSettingsObject.InheritsVelocity() > 0) {
947-
Vector offsetFromRootParent = m_Pos - GetRootParent()->GetPos() + rotatedGibOffset;
948-
Vector rotationalVelocity = (offsetFromRootParent.GetPerpendicular() * GetRootParent()->GetAngularVel() * gibSettingsObject.InheritsVelocity()) / c_PPM;
949-
gibVelocity += rotationalVelocity;
950-
gibParticleClone->SetAngularVel(gibParticleClone->GetAngularVel() + GetRootParent()->GetAngularVel() * gibSettingsObject.InheritsVelocity());
951-
}
946+
Vector offsetFromRootParent = m_Pos - GetRootParent()->GetPos() + rotatedGibOffset;
947+
Vector rotationalVelocity = (offsetFromRootParent.GetPerpendicular() * GetRootParent()->GetAngularVel() * gibSettingsObject.InheritsVelocity()) / c_PPM;
948+
gibVelocity += rotationalVelocity;
949+
gibParticleClone->SetAngularVel(gibParticleClone->GetAngularVel() + GetRootParent()->GetAngularVel() * gibSettingsObject.InheritsAngularVelocity());
952950

953951
if (lifetime != 0) {
954952
gibParticleClone->SetLifetime(std::max(static_cast<int>(static_cast<float>(lifetime) * (1.0F - lifeVariation * ((radius / maxRadius) * 0.75F + RandomNormalNum() * 0.25F))), 1));
@@ -1007,12 +1005,10 @@ void MOSRotating::CreateGibsWhenGibbing(const Vector& impactImpulse, MovableObje
10071005
gibVelocity.RadRotate(gibSpread * RandomNormalNum());
10081006
}
10091007

1010-
if (gibSettingsObject.InheritsVelocity() > 0) {
1011-
Vector offsetFromRootParent = m_Pos - GetRootParent()->GetPos() + rotatedGibOffset;
1012-
Vector rotationalVelocity = (offsetFromRootParent.GetPerpendicular() * GetRootParent()->GetAngularVel() * gibSettingsObject.InheritsVelocity()) / c_PPM;
1013-
gibVelocity += rotationalVelocity;
1014-
gibParticleClone->SetAngularVel(gibParticleClone->GetAngularVel() + GetRootParent()->GetAngularVel() * gibSettingsObject.InheritsVelocity());
1015-
}
1008+
Vector offsetFromRootParent = m_Pos - GetRootParent()->GetPos() + rotatedGibOffset;
1009+
Vector rotationalVelocity = (offsetFromRootParent.GetPerpendicular() * GetRootParent()->GetAngularVel() * gibSettingsObject.InheritsVelocity()) / c_PPM;
1010+
gibVelocity += rotationalVelocity;
1011+
gibParticleClone->SetAngularVel(gibParticleClone->GetAngularVel() + GetRootParent()->GetAngularVel() * gibSettingsObject.InheritsAngularVelocity());
10161012

10171013
gibParticleClone->SetVel(gibVelocity + ((m_PrevVel + m_Vel) / 2) * gibSettingsObject.InheritsVelocity());
10181014

@@ -1478,9 +1474,9 @@ Attachable* MOSRotating::RemoveAttachable(Attachable* attachable, bool addToMova
14781474
}
14791475
RTEAssert(attachable->IsAttachedTo(this), "Tried to remove Attachable " + attachable->GetPresetNameAndUniqueID() + " from presumed parent " + GetPresetNameAndUniqueID() + ", but it had a different parent (" + (attachable->GetParent() ? attachable->GetParent()->GetPresetNameAndUniqueID() : "ERROR") + "). This should never happen!");
14801476

1481-
Vector rotationalVelocity = ((attachable->GetPos() - GetRootParent()->GetPos()).GetPerpendicular() * GetRootParent()->GetAngularVel()) / c_PPM;
1482-
attachable->SetAngularVel(attachable->GetAngularVel() + GetRootParent()->GetAngularVel());
1483-
attachable->SetVel(attachable->GetVel() + rotationalVelocity); // Attachables have already had their velocity updated by ApplyImpulses(), no need to add impactImpulse again
1477+
Vector rotationalVelocity = ((attachable->GetPos() - GetRootParent()->GetPos()).GetPerpendicular() * GetRootParent()->GetAngularVel() * attachable->InheritsVelocityWhenDetached()) / c_PPM;
1478+
attachable->SetAngularVel(attachable->GetAngularVel() + GetRootParent()->GetAngularVel() * attachable->InheritsAngularVelocityWhenDetached());
1479+
attachable->SetVel(attachable->GetVel() * attachable->InheritsVelocityWhenDetached() + rotationalVelocity); // Attachables have already had their velocity updated by ApplyImpulses(), no need to add impactImpulse again
14841480

14851481
if (!m_Attachables.empty()) {
14861482
m_Attachables.remove(attachable);

0 commit comments

Comments
 (0)