Skip to content

Commit 0467053

Browse files
committed
Resources: persistent asset storage
1 parent 9158648 commit 0467053

File tree

8 files changed

+93
-13
lines changed

8 files changed

+93
-13
lines changed

src/app.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ constexpr auto context_ci = le::Context::CreateInfo{
1414
};
1515
} // namespace
1616

17-
App::App() : m_context(context_ci), m_data_loader(le::FileDataLoader::upfind("assets")), m_asset_loader(m_context.create_asset_loader(&m_data_loader)) {
17+
App::App() : m_context(context_ci), m_data_loader(le::FileDataLoader::upfind("assets")), m_resources(m_context.create_asset_loader(&m_data_loader)) {
1818
bind_services();
1919
}
2020

@@ -43,6 +43,6 @@ void App::bind_services() {
4343
m_services.bind<le::IDataLoader>(&m_data_loader);
4444
m_services.bind<le::FileDataLoader>(&m_data_loader);
4545

46-
m_services.bind(&m_asset_loader);
46+
m_services.bind(&m_resources);
4747
}
4848
} // namespace miracle

src/app.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
#include <le2d/context.hpp>
33
#include <le2d/file_data_loader.hpp>
44
#include <le2d/service_locator.hpp>
5+
#include <resources.hpp>
56

67
namespace miracle {
78
class App {
@@ -15,7 +16,7 @@ class App {
1516

1617
le::Context m_context;
1718
le::FileDataLoader m_data_loader{};
18-
le::AssetLoader m_asset_loader{};
19+
Resources m_resources;
1920

2021
le::ServiceLocator m_services{};
2122
};

src/game.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#include <game.hpp>
22
#include <glm/gtx/norm.hpp>
33
#include <le2d/context.hpp>
4+
#include <resources.hpp>
45
#include <cstddef>
56
#include <format>
67
#include <iterator>
@@ -15,8 +16,8 @@
1516
namespace miracle {
1617
Game::Game(gsl::not_null<le::ServiceLocator const*> services) : m_services(services), m_lighthouse(services), m_light(services) {
1718
spawn_wave();
18-
auto const& asset_loader = services->get<le::AssetLoader>();
19-
m_font = asset_loader.load<le::IFont>("fonts/specialElite.ttf");
19+
auto& resources = services->get<Resources>();
20+
m_font = resources.load<le::IFont>("fonts/specialElite.ttf");
2021
if (!m_font) { throw std::runtime_error{"Failed to load font"}; }
2122
}
2223

src/game.hpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
#include <le2d/event.hpp>
55
#include <le2d/renderer.hpp>
66
#include <le2d/service_locator.hpp>
7-
#include <memory>
87
#include "enemy.hpp"
98
#include "le2d/drawable/text.hpp"
109
#include "le2d/resource/font.hpp"
@@ -29,7 +28,7 @@ class Game {
2928
Lighthouse m_lighthouse;
3029
Light m_light;
3130

32-
std::unique_ptr<le::IFont> m_font{};
31+
le::IFont* m_font{};
3332
le::drawable::Text m_score_text{};
3433
le::drawable::Text m_health_text{};
3534
int m_score{};

src/lighthouse.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
#include <glm/gtc/matrix_transform.hpp>
22
#include <lighthouse.hpp>
3+
#include <resources.hpp>
34
#include "glm/gtx/norm.hpp"
45

56
namespace miracle {
67
Lighthouse::Lighthouse(gsl::not_null<le::ServiceLocator const*> services) : m_services(services) {
78
m_sprite.create(m_hitbox_diameter);
8-
auto const& asset_loader = services->get<le::AssetLoader>();
9-
m_texture = asset_loader.load<le::ITexture>("images/lighthouse.png");
10-
m_sprite.texture = m_texture.get();
9+
auto& resources = services->get<Resources>();
10+
m_sprite.texture = resources.load<le::ITexture>("images/lighthouse.png");
1111
}
1212

1313
void Lighthouse::rotate_towards_cursor(glm::vec2 cursor_pos) {

src/lighthouse.hpp

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,7 @@
66
#include <le2d/event.hpp>
77
#include <le2d/renderer.hpp>
88
#include <le2d/service_locator.hpp>
9-
#include <memory>
109
#include "enemy.hpp"
11-
#include "le2d/resource/texture.hpp"
1210

1311
namespace miracle {
1412
class Lighthouse {
@@ -26,7 +24,6 @@ class Lighthouse {
2624
gsl::not_null<le::ServiceLocator const*> m_services;
2725
float m_hitbox_diameter{150.0f};
2826
float m_visibility_diameter{250.0f};
29-
std::unique_ptr<le::ITexture> m_texture;
3027
le::drawable::Circle m_sprite{};
3128
float m_health{100};
3229
};

src/resources.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
#include <resources.hpp>
2+
3+
namespace miracle {
4+
Resources::Resources(le::AssetLoader asset_loader) : m_asset_loader(std::move(asset_loader)) {}
5+
6+
void Resources::erase(std::string_view const uri) {
7+
if (auto const it = m_map.find(uri); it != m_map.end()) { m_map.erase(it); }
8+
}
9+
10+
auto Resources::find(std::string_view const uri, std::type_index const type) const -> le::IAsset* {
11+
auto const it = m_map.find(uri);
12+
if (it == m_map.end() || it->second.type != type) { return nullptr; }
13+
return it->second.asset.get();
14+
}
15+
} // namespace miracle

src/resources.hpp

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
#pragma once
2+
#include <djson/string_table.hpp>
3+
#include <klib/assert.hpp>
4+
#include <le2d/asset/asset_loader.hpp>
5+
#include <concepts>
6+
7+
namespace miracle {
8+
class Resources {
9+
public:
10+
explicit Resources(le::AssetLoader asset_loader);
11+
12+
template <std::derived_from<le::IAsset> AssetTypeT>
13+
[[nodiscard]] auto insert(std::string uri, std::unique_ptr<AssetTypeT> asset) -> AssetTypeT& {
14+
KLIB_ASSERT(asset);
15+
auto& ret = *asset;
16+
m_map.insert_or_assign(std::move(uri), Entry::create(std::move(asset)));
17+
return ret;
18+
}
19+
20+
void erase(std::string_view uri);
21+
22+
[[nodiscard]] auto contains(std::string_view const uri) const -> bool { return m_map.contains(uri); }
23+
24+
template <std::derived_from<le::IAsset> AssetTypeT>
25+
[[nodiscard]] auto peek(std::string_view const uri) const -> AssetTypeT* {
26+
auto const it = m_map.find(uri);
27+
if (it == m_map.end() || it->second.type != typeid(AssetTypeT)) { return nullptr; }
28+
return static_cast<AssetTypeT*>(it->second.asset.get());
29+
}
30+
31+
template <std::derived_from<le::IAsset> AssetTypeT>
32+
[[nodiscard]] auto at(std::string_view const uri) const -> AssetTypeT& {
33+
auto* ret = peek<AssetTypeT>(uri);
34+
KLIB_ASSERT(ret);
35+
return *ret;
36+
}
37+
38+
template <std::derived_from<le::IAsset> AssetTypeT>
39+
[[nodiscard]] auto load(std::string_view const uri) -> AssetTypeT* {
40+
if (auto* ret = peek<AssetTypeT>(uri); ret) { return ret; }
41+
std::unique_ptr<AssetTypeT> asset = m_asset_loader.load<AssetTypeT>(uri);
42+
if (!asset) { return nullptr; }
43+
return &insert(std::string{uri}, std::move(asset));
44+
}
45+
46+
void clear() { m_map.clear(); }
47+
48+
[[nodiscard]] auto size() const -> std::size_t { return m_map.size(); }
49+
[[nodiscard]] auto is_empty() const -> bool { return m_map.empty(); }
50+
51+
private:
52+
struct Entry {
53+
template <typename T>
54+
[[nodiscard]] static auto create(std::unique_ptr<T> asset) -> Entry {
55+
return Entry{.type = typeid(T), .asset = std::move(asset)};
56+
}
57+
58+
std::type_index type;
59+
std::unique_ptr<le::IAsset> asset{};
60+
};
61+
62+
[[nodiscard]] auto find(std::string_view uri, std::type_index type) const -> le::IAsset*;
63+
64+
le::AssetLoader m_asset_loader;
65+
dj::StringTable<Entry> m_map{};
66+
};
67+
} // namespace miracle

0 commit comments

Comments
 (0)