Веб-сайт самохостера Lotigara

summaryrefslogtreecommitdiff
path: root/source/game/StarParticleDatabase.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/game/StarParticleDatabase.cpp')
-rw-r--r--source/game/StarParticleDatabase.cpp58
1 files changed, 58 insertions, 0 deletions
diff --git a/source/game/StarParticleDatabase.cpp b/source/game/StarParticleDatabase.cpp
new file mode 100644
index 0000000..91315ca
--- /dev/null
+++ b/source/game/StarParticleDatabase.cpp
@@ -0,0 +1,58 @@
+#include "StarParticleDatabase.hpp"
+#include "StarJsonExtra.hpp"
+#include "StarAssets.hpp"
+#include "StarRoot.hpp"
+
+namespace Star {
+
+ParticleConfig::ParticleConfig(Json const& config) {
+ m_kind = config.getString("kind");
+ m_particle = Particle(config.queryObject("definition"));
+ m_variance = Particle(config.queryObject("definition.variance", {}));
+}
+
+String const& ParticleConfig::kind() {
+ return m_kind;
+}
+
+Particle ParticleConfig::instance() {
+ auto particle = m_particle;
+ particle.applyVariance(m_variance);
+ return particle;
+}
+
+ParticleDatabase::ParticleDatabase() {
+ auto assets = Root::singleton().assets();
+ auto files = assets->scanExtension("particle");
+ assets->queueJsons(files);
+ for (auto file : files) {
+ auto particleConfig = make_shared<ParticleConfig>(assets->json(file));
+ if (m_configs.contains(particleConfig->kind()))
+ throw StarException(strf("Duplicate particle asset kind Name %s. configfile %s", particleConfig->kind(), file));
+ m_configs[particleConfig->kind()] = particleConfig;
+ }
+}
+
+ParticleConfigPtr ParticleDatabase::config(String const& kind) const {
+ auto k = kind.toLower();
+ if (!m_configs.contains(k))
+ throw StarException(strf("Unknown particle definition with kind %s.", kind));
+ return m_configs.get(k);
+}
+
+ParticleVariantCreator ParticleDatabase::particleCreator(Json const& kindOrConfig, String const& relativePath) const {
+ if (kindOrConfig.isType(Json::Type::String)) {
+ auto pconfig = config(kindOrConfig.toString());
+ return [pconfig]() { return pconfig->instance(); };
+ } else {
+ Particle particle(kindOrConfig.toObject(), relativePath);
+ Particle variance(kindOrConfig.getObject("variance", {}), relativePath);
+ return makeParticleVariantCreator(move(particle), move(variance));
+ }
+}
+
+Particle ParticleDatabase::particle(Json const& kindOrConfig, String const& relativePath) const {
+ return particleCreator(kindOrConfig, relativePath)();
+}
+
+}