mirror of
https://github.com/AxioDL/metaforce.git
synced 2025-12-10 05:07:43 +00:00
CParticleDatabase: Make use of heterogenous lookup
Resolves a TODO. (Technically this can be done with C++17 only, as std::map allows heterogenous lookup since that standard). Reduces number of allocations necessary for lookups.
This commit is contained in:
@@ -35,13 +35,13 @@ void CParticleDatabase::CacheParticleDesc(const CCharacterInfo::CParticleResData
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CParticleDatabase::SetModulationColorAllActiveEffectsForParticleDB(
|
void CParticleDatabase::SetModulationColorAllActiveEffectsForParticleDB(const zeus::CColor& color, DrawMap& map) {
|
||||||
const zeus::CColor& color, std::map<std::string, std::unique_ptr<CParticleGenInfo>>& map) {
|
|
||||||
for (auto& e : map) {
|
for (auto& e : map) {
|
||||||
if (e.second)
|
if (e.second) {
|
||||||
e.second->SetModulationColor(color);
|
e.second->SetModulationColor(color);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void CParticleDatabase::SetModulationColorAllActiveEffects(const zeus::CColor& color) {
|
void CParticleDatabase::SetModulationColorAllActiveEffects(const zeus::CColor& color) {
|
||||||
SetModulationColorAllActiveEffectsForParticleDB(color, x3c_rendererDrawLoop);
|
SetModulationColorAllActiveEffectsForParticleDB(color, x3c_rendererDrawLoop);
|
||||||
@@ -52,8 +52,7 @@ void CParticleDatabase::SetModulationColorAllActiveEffects(const zeus::CColor& c
|
|||||||
SetModulationColorAllActiveEffectsForParticleDB(color, xa0_lastDraw);
|
SetModulationColorAllActiveEffectsForParticleDB(color, xa0_lastDraw);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CParticleDatabase::SuspendAllActiveEffectsForParticleDB(
|
void CParticleDatabase::SuspendAllActiveEffectsForParticleDB(CStateManager& mgr, DrawMap& map) {
|
||||||
CStateManager& mgr, std::map<std::string, std::unique_ptr<CParticleGenInfo>>& map) {
|
|
||||||
for (auto& e : map) {
|
for (auto& e : map) {
|
||||||
e.second->SetParticleEmission(false, mgr);
|
e.second->SetParticleEmission(false, mgr);
|
||||||
}
|
}
|
||||||
@@ -65,8 +64,7 @@ void CParticleDatabase::SuspendAllActiveEffects(CStateManager& stateMgr) {
|
|||||||
SuspendAllActiveEffectsForParticleDB(stateMgr, x64_lastDrawLoop);
|
SuspendAllActiveEffectsForParticleDB(stateMgr, x64_lastDrawLoop);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CParticleDatabase::DeleteAllLightsForParticleDB(CStateManager& mgr,
|
void CParticleDatabase::DeleteAllLightsForParticleDB(CStateManager& mgr, DrawMap& map) {
|
||||||
std::map<std::string, std::unique_ptr<CParticleGenInfo>>& map) {
|
|
||||||
for (auto& e : map) {
|
for (auto& e : map) {
|
||||||
e.second->DeleteLight(mgr);
|
e.second->DeleteLight(mgr);
|
||||||
}
|
}
|
||||||
@@ -83,9 +81,7 @@ void CParticleDatabase::DeleteAllLights(CStateManager& mgr) {
|
|||||||
|
|
||||||
void CParticleDatabase::UpdateParticleGenDB(float dt, const CPoseAsTransforms& pose, const CCharLayoutInfo& charInfo,
|
void CParticleDatabase::UpdateParticleGenDB(float dt, const CPoseAsTransforms& pose, const CCharLayoutInfo& charInfo,
|
||||||
const zeus::CTransform& xf, const zeus::CVector3f& scale,
|
const zeus::CTransform& xf, const zeus::CVector3f& scale,
|
||||||
CStateManager& stateMgr,
|
CStateManager& stateMgr, DrawMap& map, bool deleteIfDone) {
|
||||||
std::map<std::string, std::unique_ptr<CParticleGenInfo>>& map,
|
|
||||||
bool deleteIfDone) {
|
|
||||||
for (auto it = map.begin(); it != map.end();) {
|
for (auto it = map.begin(); it != map.end();) {
|
||||||
CParticleGenInfo& info = *it->second;
|
CParticleGenInfo& info = *it->second;
|
||||||
if (info.GetIsActive()) {
|
if (info.GetIsActive()) {
|
||||||
@@ -204,14 +200,13 @@ void CParticleDatabase::Update(float dt, const CPoseAsTransforms& pose, const CC
|
|||||||
(x50_firstDrawLoop.size() || x64_lastDrawLoop.size() || x8c_firstDraw.size() || xa0_lastDraw.size());
|
(x50_firstDrawLoop.size() || x64_lastDrawLoop.size() || x8c_firstDraw.size() || xa0_lastDraw.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
void CParticleDatabase::RenderParticleGenMap(const std::map<std::string, std::unique_ptr<CParticleGenInfo>>& map) {
|
void CParticleDatabase::RenderParticleGenMap(const DrawMap& map) {
|
||||||
for (const auto& e : map) {
|
for (const auto& e : map) {
|
||||||
e.second->Render();
|
e.second->Render();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CParticleDatabase::RenderParticleGenMapMasked(const std::map<std::string, std::unique_ptr<CParticleGenInfo>>& map,
|
void CParticleDatabase::RenderParticleGenMapMasked(const DrawMap& map, int mask, int target) {
|
||||||
int mask, int target) {
|
|
||||||
for (const auto& e : map) {
|
for (const auto& e : map) {
|
||||||
if ((e.second->GetFlags() & mask) == target) {
|
if ((e.second->GetFlags() & mask) == target) {
|
||||||
e.second->Render();
|
e.second->Render();
|
||||||
@@ -219,8 +214,7 @@ void CParticleDatabase::RenderParticleGenMapMasked(const std::map<std::string, s
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CParticleDatabase::AddToRendererClippedParticleGenMap(
|
void CParticleDatabase::AddToRendererClippedParticleGenMap(const DrawMap& map, const zeus::CFrustum& frustum) {
|
||||||
const std::map<std::string, std::unique_ptr<CParticleGenInfo>>& map, const zeus::CFrustum& frustum) {
|
|
||||||
for (const auto& e : map) {
|
for (const auto& e : map) {
|
||||||
const auto bounds = e.second->GetBounds();
|
const auto bounds = e.second->GetBounds();
|
||||||
if (bounds && frustum.aabbFrustumTest(*bounds)) {
|
if (bounds && frustum.aabbFrustumTest(*bounds)) {
|
||||||
@@ -229,9 +223,8 @@ void CParticleDatabase::AddToRendererClippedParticleGenMap(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CParticleDatabase::AddToRendererClippedParticleGenMapMasked(
|
void CParticleDatabase::AddToRendererClippedParticleGenMapMasked(const DrawMap& map, const zeus::CFrustum& frustum,
|
||||||
const std::map<std::string, std::unique_ptr<CParticleGenInfo>>& map, const zeus::CFrustum& frustum, int mask,
|
int mask, int target) {
|
||||||
int target) {
|
|
||||||
for (const auto& e : map) {
|
for (const auto& e : map) {
|
||||||
if ((e.second->GetFlags() & mask) == target) {
|
if ((e.second->GetFlags() & mask) == target) {
|
||||||
const auto bounds = e.second->GetBounds();
|
const auto bounds = e.second->GetBounds();
|
||||||
@@ -273,25 +266,30 @@ void CParticleDatabase::AddToRendererClipped(const zeus::CFrustum& frustum) cons
|
|||||||
}
|
}
|
||||||
|
|
||||||
CParticleGenInfo* CParticleDatabase::GetParticleEffect(std::string_view name) const {
|
CParticleGenInfo* CParticleDatabase::GetParticleEffect(std::string_view name) const {
|
||||||
// TODO: Heterogeneous lookup when C++20 available
|
if (const auto search = x3c_rendererDrawLoop.find(name); search != x3c_rendererDrawLoop.cend()) {
|
||||||
auto search = x3c_rendererDrawLoop.find(name.data());
|
|
||||||
if (search != x3c_rendererDrawLoop.end())
|
|
||||||
return search->second.get();
|
return search->second.get();
|
||||||
search = x50_firstDrawLoop.find(name.data());
|
}
|
||||||
if (search != x50_firstDrawLoop.end())
|
|
||||||
|
if (const auto search = x50_firstDrawLoop.find(name); search != x50_firstDrawLoop.cend()) {
|
||||||
return search->second.get();
|
return search->second.get();
|
||||||
search = x64_lastDrawLoop.find(name.data());
|
}
|
||||||
if (search != x64_lastDrawLoop.end())
|
|
||||||
|
if (const auto search = x64_lastDrawLoop.find(name); search != x64_lastDrawLoop.cend()) {
|
||||||
return search->second.get();
|
return search->second.get();
|
||||||
search = x78_rendererDraw.find(name.data());
|
}
|
||||||
if (search != x78_rendererDraw.end())
|
|
||||||
|
if (const auto search = x78_rendererDraw.find(name); search != x78_rendererDraw.cend()) {
|
||||||
return search->second.get();
|
return search->second.get();
|
||||||
search = x8c_firstDraw.find(name.data());
|
}
|
||||||
if (search != x8c_firstDraw.end())
|
|
||||||
|
if (const auto search = x8c_firstDraw.find(name); search != x8c_firstDraw.cend()) {
|
||||||
return search->second.get();
|
return search->second.get();
|
||||||
search = xa0_lastDraw.find(name.data());
|
}
|
||||||
if (search != xa0_lastDraw.end())
|
|
||||||
|
if (const auto search = xa0_lastDraw.find(name); search != xa0_lastDraw.cend()) {
|
||||||
return search->second.get();
|
return search->second.get();
|
||||||
|
}
|
||||||
|
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -424,27 +422,30 @@ void CParticleDatabase::AddParticleEffect(std::string_view name, int flags, cons
|
|||||||
|
|
||||||
void CParticleDatabase::InsertParticleGen(bool oneShot, int flags, std::string_view name,
|
void CParticleDatabase::InsertParticleGen(bool oneShot, int flags, std::string_view name,
|
||||||
std::unique_ptr<CParticleGenInfo>&& gen) {
|
std::unique_ptr<CParticleGenInfo>&& gen) {
|
||||||
std::map<std::string, std::unique_ptr<CParticleGenInfo>>* useMap;
|
DrawMap* useMap;
|
||||||
if (oneShot) {
|
if (oneShot) {
|
||||||
if (flags & 0x40)
|
if ((flags & 0x40) != 0) {
|
||||||
useMap = &xa0_lastDraw;
|
useMap = &xa0_lastDraw;
|
||||||
else if (flags & 0x20)
|
} else if ((flags & 0x20) != 0) {
|
||||||
useMap = &x8c_firstDraw;
|
useMap = &x8c_firstDraw;
|
||||||
else
|
|
||||||
useMap = &x78_rendererDraw;
|
|
||||||
} else {
|
} else {
|
||||||
if (flags & 0x40)
|
useMap = &x78_rendererDraw;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if ((flags & 0x40) != 0) {
|
||||||
useMap = &x64_lastDrawLoop;
|
useMap = &x64_lastDrawLoop;
|
||||||
else if (flags & 0x20)
|
} else if ((flags & 0x20) != 0) {
|
||||||
useMap = &x50_firstDrawLoop;
|
useMap = &x50_firstDrawLoop;
|
||||||
else
|
} else {
|
||||||
useMap = &x3c_rendererDrawLoop;
|
useMap = &x3c_rendererDrawLoop;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
useMap->insert(std::make_pair(std::string(name), std::move(gen)));
|
useMap->insert(std::make_pair(std::string(name), std::move(gen)));
|
||||||
|
|
||||||
if (flags & 0x60)
|
if ((flags & 0x60) != 0) {
|
||||||
xb4_25_anySystemsDrawnWithModel = true;
|
xb4_25_anySystemsDrawnWithModel = true;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace urde
|
} // namespace urde
|
||||||
|
|||||||
@@ -19,35 +19,31 @@ class CCharLayoutInfo;
|
|||||||
class CPoseAsTransforms;
|
class CPoseAsTransforms;
|
||||||
|
|
||||||
class CParticleDatabase {
|
class CParticleDatabase {
|
||||||
|
using DrawMap = std::map<std::string, std::unique_ptr<CParticleGenInfo>, std::less<>>;
|
||||||
|
|
||||||
std::map<CAssetId, std::shared_ptr<TLockedToken<CGenDescription>>> x0_particleDescs;
|
std::map<CAssetId, std::shared_ptr<TLockedToken<CGenDescription>>> x0_particleDescs;
|
||||||
std::map<CAssetId, std::shared_ptr<TLockedToken<CSwooshDescription>>> x14_swooshDescs;
|
std::map<CAssetId, std::shared_ptr<TLockedToken<CSwooshDescription>>> x14_swooshDescs;
|
||||||
std::map<CAssetId, std::shared_ptr<TLockedToken<CElectricDescription>>> x28_electricDescs;
|
std::map<CAssetId, std::shared_ptr<TLockedToken<CElectricDescription>>> x28_electricDescs;
|
||||||
std::map<std::string, std::unique_ptr<CParticleGenInfo>> x3c_rendererDrawLoop;
|
DrawMap x3c_rendererDrawLoop;
|
||||||
std::map<std::string, std::unique_ptr<CParticleGenInfo>> x50_firstDrawLoop;
|
DrawMap x50_firstDrawLoop;
|
||||||
std::map<std::string, std::unique_ptr<CParticleGenInfo>> x64_lastDrawLoop;
|
DrawMap x64_lastDrawLoop;
|
||||||
std::map<std::string, std::unique_ptr<CParticleGenInfo>> x78_rendererDraw;
|
DrawMap x78_rendererDraw;
|
||||||
std::map<std::string, std::unique_ptr<CParticleGenInfo>> x8c_firstDraw;
|
DrawMap x8c_firstDraw;
|
||||||
std::map<std::string, std::unique_ptr<CParticleGenInfo>> xa0_lastDraw;
|
DrawMap xa0_lastDraw;
|
||||||
bool xb4_24_updatesEnabled : 1 = true;
|
bool xb4_24_updatesEnabled : 1 = true;
|
||||||
bool xb4_25_anySystemsDrawnWithModel : 1 = false;
|
bool xb4_25_anySystemsDrawnWithModel : 1 = false;
|
||||||
|
|
||||||
static void SetModulationColorAllActiveEffectsForParticleDB(
|
static void SetModulationColorAllActiveEffectsForParticleDB(const zeus::CColor& color, DrawMap& map);
|
||||||
const zeus::CColor& color, std::map<std::string, std::unique_ptr<CParticleGenInfo>>& map);
|
static void SuspendAllActiveEffectsForParticleDB(CStateManager& mgr, DrawMap& map);
|
||||||
static void SuspendAllActiveEffectsForParticleDB(CStateManager& mgr,
|
static void DeleteAllLightsForParticleDB(CStateManager& mgr, DrawMap& map);
|
||||||
std::map<std::string, std::unique_ptr<CParticleGenInfo>>& map);
|
static void RenderParticleGenMap(const DrawMap& map);
|
||||||
static void DeleteAllLightsForParticleDB(CStateManager& mgr,
|
static void RenderParticleGenMapMasked(const DrawMap& map, int mask, int target);
|
||||||
std::map<std::string, std::unique_ptr<CParticleGenInfo>>& map);
|
static void AddToRendererClippedParticleGenMap(const DrawMap& map, const zeus::CFrustum& frustum);
|
||||||
static void RenderParticleGenMap(const std::map<std::string, std::unique_ptr<CParticleGenInfo>>& map);
|
static void AddToRendererClippedParticleGenMapMasked(const DrawMap& map, const zeus::CFrustum& frustum, int mask,
|
||||||
static void RenderParticleGenMapMasked(const std::map<std::string, std::unique_ptr<CParticleGenInfo>>& map, int mask,
|
|
||||||
int target);
|
int target);
|
||||||
static void AddToRendererClippedParticleGenMap(const std::map<std::string, std::unique_ptr<CParticleGenInfo>>& map,
|
|
||||||
const zeus::CFrustum& frustum);
|
|
||||||
static void
|
|
||||||
AddToRendererClippedParticleGenMapMasked(const std::map<std::string, std::unique_ptr<CParticleGenInfo>>& map,
|
|
||||||
const zeus::CFrustum& frustum, int mask, int target);
|
|
||||||
static void UpdateParticleGenDB(float dt, const CPoseAsTransforms& pose, const CCharLayoutInfo& charInfo,
|
static void UpdateParticleGenDB(float dt, const CPoseAsTransforms& pose, const CCharLayoutInfo& charInfo,
|
||||||
const zeus::CTransform& xf, const zeus::CVector3f& vec, CStateManager& stateMgr,
|
const zeus::CTransform& xf, const zeus::CVector3f& vec, CStateManager& stateMgr,
|
||||||
std::map<std::string, std::unique_ptr<CParticleGenInfo>>& map, bool deleteIfDone);
|
DrawMap& map, bool deleteIfDone);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
CParticleDatabase();
|
CParticleDatabase();
|
||||||
|
|||||||
Reference in New Issue
Block a user