Asset: Implement assimp texture loading

This commit is contained in:
Riyyi
2024-05-13 14:05:21 +02:00
parent a266a27f88
commit 79b4f1c3d1
2 changed files with 30 additions and 3 deletions
+27 -3
View File
@@ -8,6 +8,7 @@
#include <cstdint> // uint8_t, uint32_t
#include <memory> // std::shared_ptr
#include "assimp/texture.h"
#include "glad/glad.h"
#include "ruc/meta/assert.h"
#define STB_IMAGE_IMPLEMENTATION
@@ -56,6 +57,32 @@ std::shared_ptr<Texture2D> Texture2D::create(std::string_view path)
return result;
}
std::shared_ptr<Texture2D> Texture2D::create(aiTexture* texture)
{
auto result = std::shared_ptr<Texture2D>(new Texture2D(texture->mFilename.C_Str()));
int width = static_cast<int>(texture->mWidth);
int height = static_cast<int>(texture->mHeight);
int channels = 0;
unsigned char* data = reinterpret_cast<unsigned char*>(texture->pcData);
bool isCompressed = height == 0; // height 0 is compression, byte length stored in width variable
if (isCompressed) {
stbi_set_flip_vertically_on_load(0);
data = stbi_load_from_memory(data, width, &width, &height, &channels, STBI_default);
}
else {
channels = 4; // ARGB888
// TODO: imprement format hints? `archFormatHint'
VERIFY_NOT_REACHED();
}
result->init(width, height, channels);
result->create(data);
return result;
}
void Texture2D::bind(uint32_t unit) const
{
// Set active unit
@@ -198,6 +225,3 @@ void TextureCubemap::create()
}
} // namespace Inferno
// FIXME
// auto texture = (type == Texture::TwoDimensional) ? Texture2D::create(path) : TextureCubemap::create(path);
+3
View File
@@ -12,6 +12,8 @@
#include "inferno/asset/asset-manager.h"
struct aiTexture;
namespace Inferno {
class Texture2D;
@@ -63,6 +65,7 @@ public:
// Factory function
static std::shared_ptr<Texture2D> create(std::string_view path);
static std::shared_ptr<Texture2D> create(aiTexture* texture);
virtual void bind(uint32_t unit = 0) const override;
virtual void unbind() const override;