diff --git a/Data/Textures/defaultTexture.png b/Data/Textures/defaultTexture.png deleted file mode 100644 index 0d26e56fe628bdeae9a16117ef24d09bd3a91a10..0000000000000000000000000000000000000000 Binary files a/Data/Textures/defaultTexture.png and /dev/null differ diff --git a/Data/Textures/test2.KTX b/Data/Textures/test2.KTX new file mode 100644 index 0000000000000000000000000000000000000000..01b38d5c0cc5bfca8facac67dc4e2f43f252b0aa Binary files /dev/null and b/Data/Textures/test2.KTX differ diff --git a/src/Engine/AssManRendererConnect.cpp b/src/Engine/AssManRendererConnect.cpp index ccc0354eebda1fa2d74d64ee3f0bfceae7d6bc46..ca38cc3f4002258274d4d1e071111ba380bb8cc4 100644 --- a/src/Engine/AssManRendererConnect.cpp +++ b/src/Engine/AssManRendererConnect.cpp @@ -47,16 +47,16 @@ namespace Engine newInfo.byteArray = std::move(oldInfo.byteArray); + newInfo.isCompressed = oldInfo.isCompressed; newInfo.baseInternalFormat = Renderer::TextureDocument::Format(oldInfo.baseInternalFormat); + newInfo.internalFormat = Renderer::TextureDocument::Format(oldInfo.internalFormat); newInfo.type = Renderer::TextureDocument::Type(oldInfo.type); newInfo.numDimensions = oldInfo.numDimensions; - newInfo.dimensions = oldInfo.dimensions; newInfo.numLayers = oldInfo.numLayers; - newInfo.numLevels = oldInfo.numLevels; return std::optional<Renderer::TextureDocument>{ Renderer::TextureDocument(std::move(newInfo)) }; diff --git a/src/Engine/AssetManager/AssetManager.cpp b/src/Engine/AssetManager/AssetManager.cpp index d1b5f611a1245ff84404511002e9b8b76b717001..161be7d7101465569324622587172eb230088024 100644 --- a/src/Engine/AssetManager/AssetManager.cpp +++ b/src/Engine/AssetManager/AssetManager.cpp @@ -16,10 +16,7 @@ struct AssetManagerInfo static const std::map<size_t, AssetManagerInfo> textureInfos { - { size_t(Engine::AssetManager::Sprite::None), {"None" , ""} }, - { size_t(Engine::AssetManager::Sprite::Default), {"Default", "defaultTexture.png"} }, - { size_t(Engine::AssetManager::Sprite::Test), {"Test", "test.ktx"} }, - { size_t(Engine::AssetManager::Sprite::Circle), {"Circle", "circle.png"} }, + { size_t(Engine::AssetManager::Sprite::Test), {"Test", "test2.ktx"} }, }; static const std::map<size_t, AssetManagerInfo> meshInfos diff --git a/src/Engine/AssetManager/TextureDocument.hpp b/src/Engine/AssetManager/TextureDocument.hpp index bdcfc966e0b5d6b69b3b20ac0903a01bc04d1131..0ce9d92356c46569ac3c2278131b3cfe91bbd8e8 100644 --- a/src/Engine/AssetManager/TextureDocument.hpp +++ b/src/Engine/AssetManager/TextureDocument.hpp @@ -23,35 +23,43 @@ namespace Engine TextureDocument(const TextureDocument&) = delete; ~TextureDocument(); + const std::vector<uint8_t>& GetByteArray() const; + const uint8_t* GetData() const; + size_t GetByteLength() const; + const std::array<uint32_t, 3>& GetDimensions() const; - const uint8_t* TextureDocument::GetData() const; - Format TextureDocument::GetBaseInternalFormat() const; - Type TextureDocument::GetType() const; + Format GetBaseInternalFormat() const; + Format GetInternalFormat() const; + Type GetType() const; + + bool IsCompressed() const; static CreateInfo ToCreateInfo(TextureDocument&& texDoc); private: std::vector<uint8_t> byteArray; + Format internalFormat{}; Format baseInternalFormat{}; Type type{}; uint8_t numDimensions = 0; std::array<uint32_t, 3> dimensions{}; size_t numLayers = 0; size_t numLevels = 0; + bool isCompressed = false; }; - std::optional<TextureDocument> LoadTextureDocument(std::string path); - struct TextureDocument::CreateInfo { std::vector<uint8_t> byteArray; + Format internalFormat{}; Format baseInternalFormat{}; Type type{}; uint8_t numDimensions = 0; std::array<uint32_t, 3> dimensions{}; size_t numLayers = 0; size_t numLevels = 0; + bool isCompressed = false; }; enum class TextureDocument::Format @@ -60,7 +68,14 @@ namespace Engine RGBA, RGB, R8G8B8A8, - + Compressed_RGB_S3TC_DXT1_ANGLE, + Compressed_RGBA_S3TC_DXT1_ANGLE, + Compressed_RGBA_S3TC_DXT3_ANGLE, + Compressed_RGBA_S3TC_DXT5_ANGLE, + Compressed_RGBA_BPTC_UNORM, + Compressed_SRGB_ALPHA_BPTC_UNORM, + Compressed_RGB_BPTC_SIGNED_FLOAT, + Compressed_RGB_BPTC_UNSIGNED_FLOAT, }; enum class TextureDocument::Type @@ -68,6 +83,8 @@ namespace Engine Invalid, UnsignedByte, }; + + std::optional<TextureDocument> LoadTextureDocument(std::string path); } namespace AssMan = AssetManager; diff --git a/src/Engine/AssetManager/TextureDocument.inl b/src/Engine/AssetManager/TextureDocument.inl index 9a42eb42aff9ccfb99b113300b3fe52963667a34..1f04cc22192cc2808e290a39ef8bedd9b1e4c4f1 100644 --- a/src/Engine/AssetManager/TextureDocument.inl +++ b/src/Engine/AssetManager/TextureDocument.inl @@ -17,11 +17,13 @@ namespace Engine TextureDocument::TextureDocument(CreateInfo&& info) : byteArray(std::move(info.byteArray)), baseInternalFormat(info.baseInternalFormat), + internalFormat(info.internalFormat), type(info.type), numDimensions(info.numDimensions), dimensions(info.dimensions), numLayers(info.numLayers), - numLevels(info.numLevels) + numLevels(info.numLevels), + isCompressed(info.isCompressed) { } @@ -31,9 +33,9 @@ namespace Engine } - const std::array<uint32_t, 3>& TextureDocument::GetDimensions() const + const std::vector<uint8_t>& TextureDocument::GetByteArray() const { - return dimensions; + return byteArray; } const uint8_t* TextureDocument::GetData() const @@ -41,11 +43,31 @@ namespace Engine return byteArray.data(); } + size_t TextureDocument::GetByteLength() const + { + return byteArray.size(); + } + + const std::array<uint32_t, 3>& TextureDocument::GetDimensions() const + { + return dimensions; + } + + bool TextureDocument::IsCompressed() const + { + return isCompressed; + } + TextureDocument::Format TextureDocument::GetBaseInternalFormat() const { return baseInternalFormat; } + TextureDocument::Format TextureDocument::GetInternalFormat() const + { + return internalFormat; + } + TextureDocument::Type TextureDocument::GetType() const { return type; @@ -56,7 +78,9 @@ namespace Engine CreateInfo info{}; info.byteArray = std::move(texDoc.byteArray); + info.isCompressed = texDoc.isCompressed; info.baseInternalFormat = texDoc.baseInternalFormat; + info.internalFormat = texDoc.internalFormat; info.type = texDoc.type; info.numDimensions = texDoc.numDimensions; info.dimensions = texDoc.dimensions; @@ -88,8 +112,10 @@ namespace Engine createInfo.numLayers = texture->numLayers; createInfo.numLevels = texture->numLevels; + createInfo.isCompressed = texture->isCompressed; createInfo.type = ConvertGLType(texture->glType); createInfo.baseInternalFormat = ConvertGLFormat(texture->glBaseInternalformat); + createInfo.internalFormat = ConvertGLFormat(texture->glInternalformat); ktxTexture_Destroy(texture); @@ -121,10 +147,10 @@ namespace Engine { using Format = TextureDocument::Format; + // Uncompressed constexpr auto GL_RGB = 0x1907; constexpr auto GL_RGBA = 0x1908; constexpr auto GL_RGBA8 = 0x8058; - switch (glFormat) { case GL_RGB: @@ -133,9 +159,43 @@ namespace Engine return Format::RGBA; case GL_RGBA8: return Format::R8G8B8A8; - default: - return Format::Invalid; + }; + + // DXT + constexpr auto GL_COMPRESSED_RGB_S3TC_DXT1_ANGLE = 0x83F0; + constexpr auto GL_COMPRESSED_RGBA_S3TC_DXT1_ANGLE = 0x83F1; + constexpr auto GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE = 0x83F2; + constexpr auto GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE = 0x83F3; + switch (glFormat) + { + case GL_COMPRESSED_RGB_S3TC_DXT1_ANGLE: + return Format::Compressed_RGB_S3TC_DXT1_ANGLE; + case GL_COMPRESSED_RGBA_S3TC_DXT1_ANGLE: + return Format::Compressed_RGBA_S3TC_DXT1_ANGLE; + case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE: + return Format::Compressed_RGBA_S3TC_DXT3_ANGLE; + case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE: + return Format::Compressed_RGBA_S3TC_DXT5_ANGLE; + } + + // BPTC + constexpr auto GL_COMPRESSED_RGBA_BPTC_UNORM = 0x8E8C; + constexpr auto GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM = 0x8E8D; + constexpr auto GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT = 0x8E8E; + constexpr auto GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT = 0x8E8F; + switch (glFormat) + { + case GL_COMPRESSED_RGBA_BPTC_UNORM: + return Format::Compressed_RGBA_BPTC_UNORM; + case GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM: + return Format::Compressed_SRGB_ALPHA_BPTC_UNORM; + case GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT: + return Format::Compressed_RGB_BPTC_SIGNED_FLOAT; + case GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT: + return Format::Compressed_RGB_BPTC_UNSIGNED_FLOAT; } + + return Format::Invalid; } } } \ No newline at end of file diff --git a/src/Engine/Engine.cpp b/src/Engine/Engine.cpp index 151fb34cc89dca9b4a1d2d686fb9f9a2cd55fd96..bf310ddf48862215c4a4a51f59c19686152dac08 100644 --- a/src/Engine/Engine.cpp +++ b/src/Engine/Engine.cpp @@ -85,7 +85,7 @@ void Engine::Core::Run() auto& lightObj = scene1.NewSceneObject(); lightObj.transform.localPosition = { 2.5f, 2.5f, 2.5f }; Components::PointLight& light1 = lightObj.AddComponent<Components::PointLight>().first.get(); - light1.color = { 1.f, 0.5f, 0.f }; + light1.color = { 1.f, 1.f, 1.f }; auto& mesh3 = lightObj.AddComponent<Components::MeshRenderer>().first.get(); mesh3.SetMesh(AssMan::Mesh::Cube); mesh3.scale = { 0.1f, 0.1f, 0.1f }; diff --git a/src/Engine/Renderer/OpenGL.cpp b/src/Engine/Renderer/OpenGL.cpp index 308be6b2c2926049310ddd16af16fceffe9333de..3e71b04c9ed81f45e3be27ff6d60f3dfe1eb66e1 100644 --- a/src/Engine/Renderer/OpenGL.cpp +++ b/src/Engine/Renderer/OpenGL.cpp @@ -502,17 +502,25 @@ namespace Engine auto texDocumentOpt = Core::GetData().assetLoadData.textureLoader(id); assert(texDocumentOpt.has_value()); - auto& texDocument = texDocumentOpt.value(); + auto& texDoc = texDocumentOpt.value(); IBO ibo; glGenTextures(1, &ibo.texture); glBindTexture(GL_TEXTURE_2D, ibo.texture); - GLint internalFormat = ToGLFormat(texDocument.GetBaseInternalFormat()); - GLint type = ToGLType(texDocument.GetType()); - const uint8_t* data = texDocument.GetData(); - glTexImage2D(GL_TEXTURE_2D, 0, internalFormat, texDocument.GetDimensions()[0], texDocument.GetDimensions()[1], 0, internalFormat, type, data); + GLint internalFormat = ToGLFormat(texDoc.GetInternalFormat()); + GLint baseInternalFormat = ToGLFormat(texDoc.GetBaseInternalFormat()); + GLsizei width = texDoc.GetDimensions()[0]; + GLsizei height = texDoc.GetDimensions()[1]; + GLint type = ToGLType(texDoc.GetType()); + GLsizei byteLength = texDoc.GetByteLength(); + const uint8_t* data = texDoc.GetData(); + + if (texDoc.IsCompressed()) + glCompressedTexImage2D(GL_TEXTURE_2D, 0, internalFormat, width, height, 0, byteLength, data); + else + glTexImage2D(GL_TEXTURE_2D, 0, baseInternalFormat, width, height, 0, baseInternalFormat, type, data); return ibo; } @@ -584,13 +592,44 @@ namespace Engine GLint Renderer::OpenGL::ToGLFormat(TextureDocument::Format format) { using Format = TextureDocument::Format; + + // Uncompressed switch (format) { + case Format::RGB: + return GL_RGB; case Format::RGBA: return GL_RGBA; - default: - return 0; + case Format::R8G8B8A8: + return GL_RGBA8; + }; + + // DXT + switch (format) + { + case Format::Compressed_RGB_S3TC_DXT1_ANGLE: + return GL_COMPRESSED_RGB_S3TC_DXT1_ANGLE; + case Format::Compressed_RGBA_S3TC_DXT1_ANGLE: + return GL_COMPRESSED_RGBA_S3TC_DXT1_ANGLE; + case Format::Compressed_RGBA_S3TC_DXT3_ANGLE: + return GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE; + case Format::Compressed_RGBA_S3TC_DXT5_ANGLE: + return GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE; } + + switch (format) + { + case Format::Compressed_RGBA_BPTC_UNORM: + return GL_COMPRESSED_RGBA_BPTC_UNORM; + case Format::Compressed_SRGB_ALPHA_BPTC_UNORM: + return GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM; + case Format::Compressed_RGB_BPTC_SIGNED_FLOAT: + return GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT; + case Format::Compressed_RGB_BPTC_UNSIGNED_FLOAT: + return GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT; + } + + return 0; } GLint Renderer::OpenGL::ToGLType(TextureDocument::Type type) diff --git a/src/Engine/Renderer/TextureDocument.hpp b/src/Engine/Renderer/TextureDocument.hpp index bd366c988e3ea84dd6ed4c650c04d63008974ccd..fbc3d38063b2d700329fff6c01e0243551dec903 100644 --- a/src/Engine/Renderer/TextureDocument.hpp +++ b/src/Engine/Renderer/TextureDocument.hpp @@ -21,35 +21,44 @@ namespace Engine TextureDocument(const TextureDocument&) = delete; ~TextureDocument(); + const std::vector<uint8_t>& GetByteArray() const; + const uint8_t* GetData() const; + size_t GetByteLength() const; + const std::array<uint32_t, 3>& GetDimensions() const; - const uint8_t* TextureDocument::GetData() const; - Format TextureDocument::GetBaseInternalFormat() const; - Type TextureDocument::GetType() const; + + Format GetBaseInternalFormat() const; + Format GetInternalFormat() const; + Type GetType() const; + + bool IsCompressed() const; static CreateInfo ToCreateInfo(TextureDocument&& texDoc); private: std::vector<uint8_t> byteArray; + Format internalFormat{}; Format baseInternalFormat{}; Type type{}; uint8_t numDimensions = 0; std::array<uint32_t, 3> dimensions{}; size_t numLayers = 0; size_t numLevels = 0; + bool isCompressed = false; }; - std::optional<TextureDocument> LoadTextureDocument(std::string path); - struct TextureDocument::CreateInfo { std::vector<uint8_t> byteArray; + Format internalFormat{}; Format baseInternalFormat{}; Type type{}; uint8_t numDimensions = 0; std::array<uint32_t, 3> dimensions{}; size_t numLayers = 0; size_t numLevels = 0; + bool isCompressed = false; }; enum class TextureDocument::Format @@ -58,7 +67,14 @@ namespace Engine RGBA, RGB, R8G8B8A8, - + Compressed_RGB_S3TC_DXT1_ANGLE, + Compressed_RGBA_S3TC_DXT1_ANGLE, + Compressed_RGBA_S3TC_DXT3_ANGLE, + Compressed_RGBA_S3TC_DXT5_ANGLE, + Compressed_RGBA_BPTC_UNORM, + Compressed_SRGB_ALPHA_BPTC_UNORM, + Compressed_RGB_BPTC_SIGNED_FLOAT, + Compressed_RGB_BPTC_UNSIGNED_FLOAT, }; enum class TextureDocument::Type diff --git a/src/Engine/Renderer/TextureDocument.inl b/src/Engine/Renderer/TextureDocument.inl index 5e41c830017a5746a4f957b5e85ae10fc8b4a9f0..c2ebeca8e64a275b1eb10eb52685d23e4b78eb41 100644 --- a/src/Engine/Renderer/TextureDocument.inl +++ b/src/Engine/Renderer/TextureDocument.inl @@ -9,11 +9,13 @@ namespace Engine TextureDocument::TextureDocument(CreateInfo&& info) : byteArray(std::move(info.byteArray)), baseInternalFormat(info.baseInternalFormat), + internalFormat(info.internalFormat), type(info.type), numDimensions(info.numDimensions), dimensions(info.dimensions), numLayers(info.numLayers), - numLevels(info.numLevels) + numLevels(info.numLevels), + isCompressed(info.isCompressed) { } @@ -23,9 +25,9 @@ namespace Engine } - const std::array<uint32_t, 3>& TextureDocument::GetDimensions() const + const std::vector<uint8_t>& TextureDocument::GetByteArray() const { - return dimensions; + return byteArray; } const uint8_t* TextureDocument::GetData() const @@ -33,11 +35,31 @@ namespace Engine return byteArray.data(); } + size_t TextureDocument::GetByteLength() const + { + return byteArray.size(); + } + + const std::array<uint32_t, 3>& TextureDocument::GetDimensions() const + { + return dimensions; + } + + bool TextureDocument::IsCompressed() const + { + return isCompressed; + } + TextureDocument::Format TextureDocument::GetBaseInternalFormat() const { return baseInternalFormat; } + TextureDocument::Format TextureDocument::GetInternalFormat() const + { + return internalFormat; + } + TextureDocument::Type TextureDocument::GetType() const { return type; @@ -48,7 +70,9 @@ namespace Engine CreateInfo info{}; info.byteArray = std::move(texDoc.byteArray); + info.isCompressed = texDoc.isCompressed; info.baseInternalFormat = texDoc.baseInternalFormat; + info.internalFormat = texDoc.internalFormat; info.type = texDoc.type; info.numDimensions = texDoc.numDimensions; info.dimensions = texDoc.dimensions;