mirror of
https://github.com/scp-fs2open/fs2open.github.com.git
synced 2026-11-10 04:31:34 -10:00
This adds a mechanism for running generic operations at specific points of the frame execution. This can be used by any part of the code an not just Lua since it simply executes std::functions. It also adds an "execution context" concept that specifies in which situation an operation should be executed. This is then used by the Lua Coroutines code for resuming coroutines at specific points instead of always when the awaited promise resolves.
128 lines
2.8 KiB
C++
128 lines
2.8 KiB
C++
#include "particle/ParticleSourceWrapper.h"
|
|
#include "particle/ParticleSource.h"
|
|
|
|
namespace particle
|
|
{
|
|
ParticleSourceWrapper::ParticleSourceWrapper(SCP_vector<ParticleSource*>&& sources) : m_sources(std::move(sources))
|
|
{
|
|
}
|
|
|
|
ParticleSourceWrapper::ParticleSourceWrapper(ParticleSource* source)
|
|
{
|
|
m_sources.push_back(source);
|
|
}
|
|
|
|
ParticleSourceWrapper::ParticleSourceWrapper(ParticleSourceWrapper&& other) noexcept
|
|
{
|
|
*this = std::move(other);
|
|
}
|
|
|
|
ParticleSourceWrapper::~ParticleSourceWrapper()
|
|
{
|
|
|
|
// Prevent empty wrapper from causing issues
|
|
if (!m_sources.empty())
|
|
{
|
|
Assertion(m_finished, "Source wrapper wasn't finished! Get a coder!\n"
|
|
"(If you hit this then a coder hasn't properly finished creating a particle source)");
|
|
}
|
|
}
|
|
|
|
ParticleSourceWrapper& ParticleSourceWrapper::operator=(ParticleSourceWrapper&& other) noexcept
|
|
{
|
|
std::swap(other.m_sources, m_sources);
|
|
return *this;
|
|
}
|
|
|
|
void ParticleSourceWrapper::finish()
|
|
{
|
|
// This function is currently only used for debugging but may be extended to do some final adjustments on the sources in the future
|
|
#ifndef NDEBUG
|
|
for (auto& source : m_sources)
|
|
{
|
|
Assertion(source->isValid(), "Source is not valid after initializing! Get a coder!\n"
|
|
"(If you hit this it means that a coder hasn't properly initialized a particle source)");
|
|
}
|
|
#endif
|
|
for (auto& source : m_sources)
|
|
{
|
|
source->finishCreation();
|
|
}
|
|
|
|
m_finished = true;
|
|
}
|
|
|
|
void ParticleSourceWrapper::setCreationTimestamp(int timestamp)
|
|
{
|
|
for (auto& source : m_sources)
|
|
{
|
|
source->getTiming()->setCreationTimestamp(timestamp);
|
|
}
|
|
}
|
|
|
|
void ParticleSourceWrapper::moveToParticle(const WeakParticlePtr& ptr)
|
|
{
|
|
for (auto& source : m_sources)
|
|
{
|
|
source->getOrigin()->moveToParticle(ptr);
|
|
}
|
|
}
|
|
|
|
void ParticleSourceWrapper::moveToObject(object* obj, vec3d* d)
|
|
{
|
|
for (auto& source : m_sources)
|
|
{
|
|
source->getOrigin()->moveToObject(obj, d);
|
|
}
|
|
}
|
|
|
|
void ParticleSourceWrapper::moveTo(vec3d* pos)
|
|
{
|
|
for (auto& source : m_sources)
|
|
{
|
|
source->getOrigin()->moveTo(pos);
|
|
}
|
|
}
|
|
|
|
void ParticleSourceWrapper::setOrientationFromNormalizedVec(vec3d* normalizedDir)
|
|
{
|
|
for (auto& source : m_sources)
|
|
{
|
|
source->getOrientation()->setFromNormalizedVector(*normalizedDir);
|
|
}
|
|
}
|
|
|
|
|
|
void ParticleSourceWrapper::setOrientationFromVec(vec3d* dir)
|
|
{
|
|
for (auto& source : m_sources)
|
|
{
|
|
source->getOrientation()->setFromVector(*dir);
|
|
}
|
|
}
|
|
|
|
void ParticleSourceWrapper::setOrientationMatrix(matrix* mtx)
|
|
{
|
|
for (auto& source : m_sources)
|
|
{
|
|
source->getOrientation()->setFromMatrix(*mtx);
|
|
}
|
|
}
|
|
|
|
void ParticleSourceWrapper::setOrientationNormal(vec3d* normal)
|
|
{
|
|
for (auto& source : m_sources)
|
|
{
|
|
source->getOrientation()->setNormal(*normal);
|
|
}
|
|
}
|
|
|
|
void ParticleSourceWrapper::setWeaponState(WeaponState state)
|
|
{
|
|
for (auto& source : m_sources)
|
|
{
|
|
source->getOrigin()->setWeaponState(state);
|
|
}
|
|
}
|
|
}
|