81 lines
		
	
	
	
		
			2.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			81 lines
		
	
	
	
		
			2.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| #include <asset_parser/assets/texture.hpp>
 | |
| #include <lt_debug/assertions.hpp>
 | |
| #include <renderer/gl/texture.hpp>
 | |
| 
 | |
| namespace lt {
 | |
| 
 | |
| glTexture::glTexture(const Ref<Assets::TextureAsset> &asset)
 | |
| {
 | |
| 	const auto metadata = asset->get_metadata();
 | |
| 	const auto blob_metadata = asset->get_blob_metadata(Assets::BlobMetadata::Tag::color);
 | |
| 
 | |
| 	glCreateTextures(GL_TEXTURE_2D, 1, &m_texture_id);
 | |
| 	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);
 | |
| 
 | |
| 	auto blob = std::vector<std::byte>(blob_metadata.uncompressed_size);
 | |
| 	asset->unpack_blob(blob_metadata.tag, blob.data(), blob.size());
 | |
| 
 | |
| 	bind();
 | |
| 	glTexImage2D(
 | |
| 	    GL_TEXTURE_2D,
 | |
| 	    0,
 | |
| 	    map_num_components_to_internal_format(metadata.num_components),
 | |
| 	    static_cast<int>(metadata.pixel_size[0]),
 | |
| 	    static_cast<int>(metadata.pixel_size[1]),
 | |
| 	    0,
 | |
| 	    map_num_components_to_format(metadata.num_components),
 | |
| 	    GL_UNSIGNED_BYTE,
 | |
| 	    std::bit_cast<unsigned char *>(blob.data())
 | |
| 	);
 | |
| 	glGenerateMipmap(GL_TEXTURE_2D);
 | |
| }
 | |
| 
 | |
| glTexture::~glTexture()
 | |
| {
 | |
| 	glDeleteTextures(1, &m_texture_id);
 | |
| }
 | |
| 
 | |
| void glTexture::bind(unsigned int slot /* = 0u */)
 | |
| {
 | |
| 	glActiveTexture(GL_TEXTURE0 + slot);
 | |
| 	glBindTexture(GL_TEXTURE_2D, m_texture_id);
 | |
| }
 | |
| 
 | |
| auto glTexture::get_texture() -> void *
 | |
| {
 | |
| 	return (void *)(intptr_t)m_texture_id;
 | |
| }
 | |
| 
 | |
| [[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;
 | |
| 	default: ensure(false, "Invalid number of components: {}", num_components);
 | |
| 	}
 | |
| 
 | |
| 	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;
 | |
| 	default: ensure(false, "Invalid number of components: {}", num_components);
 | |
| 	}
 | |
| 
 | |
| 	return {};
 | |
| }
 | |
| 
 | |
| } // namespace lt
 |