Use an enum for texture setup

This commit is contained in:
Archie Hilton 2024-05-27 15:31:14 +01:00
parent 06e7e308cc
commit 89c8589c21
3 changed files with 28 additions and 9 deletions

View File

@ -25,7 +25,7 @@ Quad::Quad(std::span<float> verts, const Uniform &uniform_data)
color = glm::vec4(1.0f, 1.0f, 1.0f, 1.0f);
tex_id = TextureLoader::get_instance()
->load_texture("./res/tex/util/missing.png")
->load_texture(TextureID::Tex_Util_Missing)
->get_texture_id();
}

View File

@ -14,6 +14,16 @@
#define PNG_HEADER_BYTES_TO_CHECK 8
std::string TextureLoader::get_path_from_id(TextureID id) {
switch (id) {
case Tex_Util_Missing:
return "./res/tex/util/missing.png";
default:
spdlog::warn("Encountered request for invalid texture {}", id);
return "./res/tex/util/missing.png";
}
}
TextureLoader *TextureLoader::m_instance = NULL;
TextureLoader *TextureLoader::get_instance() {
@ -27,26 +37,30 @@ TextureLoader *TextureLoader::get_instance() {
TextureLoader::TextureLoader() { m_texture_cache.clear(); }
TextureLoader::~TextureLoader() {
for (std::pair<std::string, Texture *> st : m_texture_cache) {
for (std::pair<TextureID, Texture *> st : m_texture_cache) {
delete (st.second);
}
}
Texture *TextureLoader::load_texture(const std::string &path) {
Texture *TextureLoader::load_texture(TextureID id) {
// Cache Hit
if (m_texture_cache.contains(path)) {
return m_texture_cache.at(path);
if (m_texture_cache.contains(id)) {
return m_texture_cache.at(id);
}
// Cache miss - we have to load it and create it
m_texture_cache.emplace(std::make_pair(path, new Texture(path)));
m_texture_cache.emplace(
std::make_pair(id, new Texture(get_path_from_id(id))));
return m_texture_cache.at(path);
return m_texture_cache.at(id);
}
// FIXME: Figure out why png_sig_cmp never worked and replace this garbage
static bool validate_png_sig(
const std::array<std::uint8_t, PNG_HEADER_BYTES_TO_CHECK> &bytes) {
#ifndef texture_use_own_validation
return png_sig_cmp(bytes.data(), 0, 8) == 0;
#else
std::array<std::uint8_t, 8> valid_header = {0x89, 0x50, 0x4e, 0x47,
0x0d, 0x0a, 0x1a, 0x0a};
@ -60,6 +74,7 @@ static bool validate_png_sig(
}
return true;
#endif
}
Texture::Texture(const std::string &path) {

View File

@ -6,6 +6,8 @@
#include <string>
#include <unordered_map>
enum TextureID { Tex_Util_Missing = 0 };
class Texture {
private:
GLuint m_gl_texture_id;
@ -22,13 +24,15 @@ class TextureLoader {
private:
static TextureLoader *m_instance;
std::unordered_map<std::string, Texture *> m_texture_cache;
std::unordered_map<TextureID, Texture *> m_texture_cache;
TextureLoader();
~TextureLoader();
static std::string get_path_from_id(TextureID);
public:
Texture *load_texture(const std::string &path);
Texture *load_texture(TextureID id);
static TextureLoader *get_instance();
TextureLoader(const TextureLoader &tl) = delete;