summaryrefslogtreecommitdiff
path: root/assetFactory
diff options
context:
space:
mode:
Diffstat (limited to 'assetFactory')
-rw-r--r--assetFactory/assetFactory.cpp28
-rw-r--r--assetFactory/assetFactory.h6
2 files changed, 33 insertions, 1 deletions
diff --git a/assetFactory/assetFactory.cpp b/assetFactory/assetFactory.cpp
index 564ea28..016f29e 100644
--- a/assetFactory/assetFactory.cpp
+++ b/assetFactory/assetFactory.cpp
@@ -1,4 +1,5 @@
#include "assetFactory.h"
+#include "collections.hpp"
#include "cuboid.h"
#include "cylinder.h"
#include "modelFactoryMesh_fwd.h"
@@ -12,7 +13,8 @@ AssetFactory::AssetFactory() :
{"plane", std::make_shared<Plane>()},
{"cuboid", std::make_shared<Cuboid>()},
{"cylinder", std::make_shared<Cylinder>()},
- }
+ },
+ colours {parseX11RGB("/usr/share/X11/rgb.txt")}
{
}
@@ -23,6 +25,30 @@ AssetFactory::loadXML(const std::filesystem::path & filename)
return Persistence::SAXParsePersistence {}.loadState<std::shared_ptr<AssetFactory>>(file);
}
+AssetFactory::Colours
+AssetFactory::parseX11RGB(const char * path)
+{
+ filesystem::FileStar rgb {path, "r"};
+ Colours out;
+ glm::u8vec3 colour;
+ char inname[BUFSIZ];
+ while (fscanf(rgb, "%hhu %hhu %hhu %[^\n\r]s", &colour.r, &colour.g, &colour.b, inname) == 4) {
+ std::string name {inname};
+ normalizeColourName(name);
+ out.emplace(std::move(name), colour);
+ }
+ return out;
+}
+
+void
+AssetFactory::normalizeColourName(std::string & name)
+{
+ std::erase_if(name, ::isblank);
+ name *= [l = std::locale {}](auto & ch) {
+ ch = std::tolower(ch, l);
+ };
+}
+
bool
AssetFactory::persist(Persistence::PersistenceStore & store)
{
diff --git a/assetFactory/assetFactory.h b/assetFactory/assetFactory.h
index 9d79827..a68b460 100644
--- a/assetFactory/assetFactory.h
+++ b/assetFactory/assetFactory.h
@@ -22,12 +22,18 @@ class AssetFactory : public Persistence::Persistable {
public:
using Shapes = std::map<std::string, Shape::Ptr, std::less<>>;
using Assets = std::map<std::string, Asset::Ptr, std::less<>>;
+ using Colour = glm::u8vec3;
+ using Colours = std::map<std::string, Colour, std::less<>>;
AssetFactory();
[[nodiscard]] static std::shared_ptr<AssetFactory> loadXML(const std::filesystem::path &);
Shapes shapes;
Assets assets;
+ Colours colours;
+
+ static Colours parseX11RGB(const char * rgbtxtpath);
+ static void normalizeColourName(std::string &);
private:
friend Persistence::SelectionPtrBase<std::shared_ptr<AssetFactory>, true>;