Tesseract-Engine/src/Engine/AssetManager.cpp

120 lines
4.0 KiB
C++
Raw Normal View History

#include "AssetManager.h"
#include <iostream>
#include <GL/glew.h> // or <GL/glew.h>, whichever you use
#define STB_IMAGE_IMPLEMENTATION
#include "stb/stb_image.h"
void* AssetManager::loadAsset(AssetType type, const std::string& path)
{
// 1) Generate a unique key for this type+path
std::string key = generateKey(type, path);
// 2) Check if this asset is already loaded/cached
auto it = m_AssetMap.find(key);
if (it != m_AssetMap.end())
{
// Already loaded, return existing data
return it->second.data;
}
// 3) Not loaded yet, so load from disk
void* assetData = loadAssetFromDisk(type, path);
if (!assetData)
{
std::cerr << "[AssetManager] Failed to load asset: " << path << std::endl;
return nullptr;
}
// 4) Cache the result in m_AssetMap
GenericAsset newAsset;
newAsset.data = assetData;
m_AssetMap[key] = newAsset;
// 5) Return the new asset pointer
return assetData;
}
std::string AssetManager::generateKey(AssetType type, const std::string& path)
{
// Combine the numeric type and path into a single string key
return std::to_string(static_cast<int>(type)) + ":" + path;
}
void* AssetManager::loadAssetFromDisk(AssetType type, const std::string& path)
{
switch (type)
{
case AssetType::TEXTURE:
{
// ----------------------------------------------------------
// REAL CODE: load an image file (PNG, JPG, etc.) with stb_image
// and upload it as an OpenGL texture.
// ----------------------------------------------------------
std::cout << "[AssetManager] Loading TEXTURE from " << path << std::endl;
// 1) Load pixels using stb_image
int width, height, channels;
unsigned char* data = stbi_load(path.c_str(), &width, &height, &channels, 0);
if (!data)
{
std::cerr << "[AssetManager] stb_image failed to load: " << path << std::endl;
return nullptr;
}
// 2) Determine the pixel format
GLenum format = GL_RGBA; // default
if (channels == 1)
format = GL_RED;
else if (channels == 3)
format = GL_RGB;
// if channels == 4, already RGBA
// 3) Generate and bind a texture
GLuint textureID = 0;
glGenTextures(1, &textureID);
glBindTexture(GL_TEXTURE_2D, textureID);
// 4) Upload the data to OpenGL
glTexImage2D(GL_TEXTURE_2D, 0, format, width, height, 0, format,
GL_UNSIGNED_BYTE, data);
glGenerateMipmap(GL_TEXTURE_2D);
// 5) Set texture parameters (filtering, wrapping, etc.)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
GL_LINEAR_MIPMAP_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
// 6) Unbind and free the stb_image data
glBindTexture(GL_TEXTURE_2D, 0);
stbi_image_free(data);
// Return the texture ID, but cast it to `void*`
// so it fits our `GenericAsset.data` usage.
return reinterpret_cast<void*>(static_cast<uintptr_t>(textureID));
}
case AssetType::SHADER:
{
std::cout << "[AssetManager] Loading SHADER from " << path << std::endl;
// Stub: in real code, read/compile .vert/.frag, return program ID
return (void*)0x87654321;
}
case AssetType::SOUND:
{
std::cout << "[AssetManager] Loading SOUND from " << path << std::endl;
// Stub: load .wav or .ogg file, return pointer to sound data
return (void*)0xAAAA8888;
}
default:
{
std::cerr << "[AssetManager] Unknown asset type!\n";
return nullptr;
}
}
}