2025-07-10 21:51:17 +03:30
|
|
|
#include <asset_parser/assets/texture.hpp>
|
|
|
|
#include <glad/gl.h>
|
2025-07-20 04:46:15 +03:30
|
|
|
#include <lt_debug/assertions.hpp>
|
2025-07-10 13:29:03 +03:30
|
|
|
#include <renderer/gl/texture.hpp>
|
2021-06-29 11:01:11 +04:30
|
|
|
|
2025-07-11 00:05:48 +03:30
|
|
|
namespace lt {
|
2021-06-29 11:01:11 +04:30
|
|
|
|
2025-07-10 21:51:17 +03:30
|
|
|
glTexture::glTexture(const Ref<Assets::TextureAsset> &asset)
|
2022-03-07 20:01:44 +03:30
|
|
|
{
|
2025-07-10 21:51:17 +03:30
|
|
|
const auto metadata = asset->get_metadata();
|
|
|
|
const auto blob_metadata = asset->get_blob_metadata(Assets::BlobMetadata::Tag::color);
|
2022-03-07 20:01:44 +03:30
|
|
|
|
2025-07-10 21:51:17 +03:30
|
|
|
glCreateTextures(GL_TEXTURE_2D, 1, &m_texture_id);
|
2025-07-05 14:23:01 +03:30
|
|
|
glTextureParameteri(m_texture_id, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
|
|
|
|
glTextureParameteri(m_texture_id, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
|
|
|
glTextureParameteri(m_texture_id, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
|
|
|
glTextureParameteri(m_texture_id, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
2022-03-07 20:01:44 +03:30
|
|
|
|
2025-07-10 21:51:17 +03:30
|
|
|
auto blob = std::vector<std::byte>(blob_metadata.uncompressed_size);
|
|
|
|
asset->unpack_blob(blob_metadata.tag, blob.data(), blob.size());
|
2022-03-07 20:01:44 +03:30
|
|
|
|
2025-07-05 15:36:53 +03:30
|
|
|
bind();
|
2025-07-05 13:28:41 +03:30
|
|
|
glTexImage2D(
|
|
|
|
GL_TEXTURE_2D,
|
|
|
|
0,
|
2025-07-10 21:51:17 +03:30
|
|
|
map_num_components_to_internal_format(metadata.num_components),
|
|
|
|
static_cast<int>(metadata.pixel_size[0]),
|
|
|
|
static_cast<int>(metadata.pixel_size[1]),
|
2025-07-05 13:28:41 +03:30
|
|
|
0,
|
2025-07-10 21:51:17 +03:30
|
|
|
map_num_components_to_format(metadata.num_components),
|
2025-07-05 13:28:41 +03:30
|
|
|
GL_UNSIGNED_BYTE,
|
2025-07-10 21:51:17 +03:30
|
|
|
std::bit_cast<unsigned char *>(blob.data())
|
2025-07-05 13:28:41 +03:30
|
|
|
);
|
2022-03-07 20:01:44 +03:30
|
|
|
glGenerateMipmap(GL_TEXTURE_2D);
|
|
|
|
}
|
|
|
|
|
|
|
|
glTexture::~glTexture()
|
|
|
|
{
|
2025-07-05 14:23:01 +03:30
|
|
|
glDeleteTextures(1, &m_texture_id);
|
2022-03-07 20:01:44 +03:30
|
|
|
}
|
|
|
|
|
2025-07-05 15:36:53 +03:30
|
|
|
void glTexture::bind(unsigned int slot /* = 0u */)
|
2022-03-07 20:01:44 +03:30
|
|
|
{
|
|
|
|
glActiveTexture(GL_TEXTURE0 + slot);
|
2025-07-05 14:23:01 +03:30
|
|
|
glBindTexture(GL_TEXTURE_2D, m_texture_id);
|
2022-03-07 20:01:44 +03:30
|
|
|
}
|
|
|
|
|
2025-07-06 14:02:50 +03:30
|
|
|
auto glTexture::get_texture() -> void *
|
2022-03-07 20:01:44 +03:30
|
|
|
{
|
2025-07-05 14:23:01 +03:30
|
|
|
return (void *)(intptr_t)m_texture_id;
|
2022-03-07 20:01:44 +03:30
|
|
|
}
|
|
|
|
|
2025-07-10 21:51:17 +03:30
|
|
|
[[nodiscard]] auto glTexture::map_num_components_to_format(uint32_t num_components) const -> int
|
|
|
|
{
|
|
|
|
switch (num_components)
|
|
|
|
{
|
|
|
|
case 4u: return GL_RGBA;
|
|
|
|
case 3u: return GL_RGB;
|
|
|
|
case 2u: return GL_RG;
|
|
|
|
case 1u: return GL_RED;
|
2025-07-11 02:12:55 +03:30
|
|
|
default: ensure(false, "Invalid number of components: {}", num_components);
|
2025-07-10 21:51:17 +03:30
|
|
|
}
|
|
|
|
|
|
|
|
return {};
|
|
|
|
}
|
|
|
|
|
|
|
|
[[nodiscard]] auto glTexture::map_num_components_to_internal_format(uint32_t num_components) const
|
|
|
|
-> int
|
|
|
|
{
|
|
|
|
switch (num_components)
|
|
|
|
{
|
|
|
|
case 4u: return GL_RGBA8;
|
|
|
|
case 3u: return GL_RGB8;
|
|
|
|
case 2u: return GL_RG8;
|
|
|
|
case 1u: return GL_R8;
|
2025-07-11 02:12:55 +03:30
|
|
|
default: ensure(false, "Invalid number of components: {}", num_components);
|
2025-07-10 21:51:17 +03:30
|
|
|
}
|
|
|
|
|
|
|
|
return {};
|
|
|
|
}
|
|
|
|
|
2025-07-11 00:05:48 +03:30
|
|
|
} // namespace lt
|