From 7b999ca44eb2096b35b1eb14aea4bfd13c692fc0 Mon Sep 17 00:00:00 2001 From: Razakhel Date: Wed, 31 Jan 2024 21:51:52 +0100 Subject: [PATCH] [Tests/Render/Texture] Added unit tests for loading images to textures --- src/RaZ/Render/Texture.cpp | 13 +++++--- tests/src/RaZ/Render/Texture.cpp | 52 ++++++++++++++++++++++++++++++++ 2 files changed, 60 insertions(+), 5 deletions(-) diff --git a/src/RaZ/Render/Texture.cpp b/src/RaZ/Render/Texture.cpp index 0a81bf63..2a1bba58 100644 --- a/src/RaZ/Render/Texture.cpp +++ b/src/RaZ/Render/Texture.cpp @@ -382,11 +382,14 @@ void Texture3D::load(const std::vector& imageSlices, bool createMipmaps) return; } + const ImageColorspace firstImgColorspace = imageSlices.front().getColorspace(); + const ImageDataType firstImgDataType = imageSlices.front().getDataType(); + m_width = imageSlices.front().getWidth(); m_height = imageSlices.front().getHeight(); m_depth = static_cast(imageSlices.size()); - m_colorspace = static_cast(imageSlices.front().getColorspace()); - m_dataType = (imageSlices.front().getDataType() == ImageDataType::FLOAT ? TextureDataType::FLOAT16 : TextureDataType::BYTE); + m_colorspace = static_cast(firstImgColorspace); + m_dataType = (firstImgDataType == ImageDataType::FLOAT ? TextureDataType::FLOAT16 : TextureDataType::BYTE); #if defined(USE_OPENGL_ES) if ((m_width & (m_width - 1)) != 0 || (m_height & (m_height - 1)) != 0 || (m_depth & (m_depth - 1)) != 0) { @@ -397,7 +400,7 @@ void Texture3D::load(const std::vector& imageSlices, bool createMipmaps) load(); - const TextureFormat format = recoverFormat(m_colorspace); + const TextureFormat textureFormat = recoverFormat(m_colorspace); const PixelDataType pixelDataType = (m_dataType == TextureDataType::BYTE ? PixelDataType::UBYTE : PixelDataType::FLOAT); bind(); @@ -405,7 +408,7 @@ void Texture3D::load(const std::vector& imageSlices, bool createMipmaps) for (std::size_t imgIndex = 0; imgIndex < imageSlices.size(); ++imgIndex) { const Image& img = imageSlices[imgIndex]; - if (img.getWidth() != m_width || img.getHeight() != m_height || static_cast(img.getColorspace()) != m_colorspace) + if (img.getWidth() != m_width || img.getHeight() != m_height || img.getColorspace() != firstImgColorspace || img.getDataType() != firstImgDataType) throw std::invalid_argument("[Texture3D] The given images have different attributes."); Renderer::sendImageSubData3D(TextureType::TEXTURE_3D, @@ -416,7 +419,7 @@ void Texture3D::load(const std::vector& imageSlices, bool createMipmaps) m_width, m_height, 1, - format, + textureFormat, pixelDataType, img.getDataPtr()); } diff --git a/tests/src/RaZ/Render/Texture.cpp b/tests/src/RaZ/Render/Texture.cpp index fefa1c62..a76d11e2 100644 --- a/tests/src/RaZ/Render/Texture.cpp +++ b/tests/src/RaZ/Render/Texture.cpp @@ -1,6 +1,7 @@ #include "Catch.hpp" #include "RaZ/Data/Color.hpp" +#include "RaZ/Data/Image.hpp" #include "RaZ/Render/Renderer.hpp" #include "RaZ/Render/Texture.hpp" @@ -165,6 +166,57 @@ TEST_CASE("Texture move") { CHECK(movedTexture3DCtor.getIndex() == movedTexture3DOpIndex); } +TEST_CASE("Texture2D load image") { + Raz::Image img(2, 2, Raz::ImageColorspace::GRAY, Raz::ImageDataType::BYTE); + img.setPixel(0, 0, static_cast(0)); + img.setPixel(1, 0, static_cast(1)); + img.setPixel(0, 1, static_cast(2)); + img.setPixel(1, 1, static_cast(3)); + + const Raz::Texture2D texture2D(img); + + CHECK(texture2D.getWidth() == img.getWidth()); + CHECK(texture2D.getHeight() == img.getHeight()); + CHECK(texture2D.getColorspace() == Raz::TextureColorspace::GRAY); + CHECK(texture2D.getDataType() == Raz::TextureDataType::BYTE); + +#if !defined(USE_OPENGL_ES) + const Raz::Image textureImg = texture2D.recoverImage(); + REQUIRE_FALSE(textureImg.isEmpty()); + REQUIRE(textureImg.getWidth() == 2); + REQUIRE(textureImg.getHeight() == 2); + REQUIRE(textureImg.getColorspace() == Raz::ImageColorspace::GRAY); + REQUIRE(textureImg.getDataType() == Raz::ImageDataType::BYTE); + CHECK(textureImg.recoverPixel(0, 0) == 0); + CHECK(textureImg.recoverPixel(1, 0) == 1); + CHECK(textureImg.recoverPixel(0, 1) == 2); + CHECK(textureImg.recoverPixel(1, 1) == 3); +#endif +} + +TEST_CASE("Texture3D load image slices") { + std::vector imageSlices; + imageSlices.emplace_back(2, 2, Raz::ImageColorspace::GRAY, Raz::ImageDataType::FLOAT).setPixel(0, 0, 1.234f); + imageSlices.emplace_back(2, 2, Raz::ImageColorspace::GRAY, Raz::ImageDataType::FLOAT).setPixel(1, 1, 2.345f); + + const Raz::Texture3D texture3D(imageSlices); + + CHECK(texture3D.getWidth() == imageSlices.front().getWidth()); + CHECK(texture3D.getHeight() == imageSlices.front().getHeight()); + CHECK(texture3D.getDepth() == imageSlices.size()); + CHECK(texture3D.getColorspace() == Raz::TextureColorspace::GRAY); + CHECK(texture3D.getDataType() == Raz::TextureDataType::FLOAT16); + + CHECK_THROWS(Raz::Texture3D({ Raz::Image(1, 1, Raz::ImageColorspace::GRAY, Raz::ImageDataType::BYTE), + Raz::Image(2, 1, Raz::ImageColorspace::GRAY, Raz::ImageDataType::BYTE) })); // Different widths + CHECK_THROWS(Raz::Texture3D({ Raz::Image(1, 1, Raz::ImageColorspace::GRAY, Raz::ImageDataType::BYTE), + Raz::Image(1, 2, Raz::ImageColorspace::GRAY, Raz::ImageDataType::BYTE) })); // Different heights + CHECK_THROWS(Raz::Texture3D({ Raz::Image(1, 1, Raz::ImageColorspace::GRAY, Raz::ImageDataType::BYTE), + Raz::Image(1, 1, Raz::ImageColorspace::RGB, Raz::ImageDataType::BYTE) })); // Different colorspaces + CHECK_THROWS(Raz::Texture3D({ Raz::Image(1, 1, Raz::ImageColorspace::GRAY, Raz::ImageDataType::BYTE), + Raz::Image(1, 1, Raz::ImageColorspace::GRAY, Raz::ImageDataType::FLOAT) })); // Different data types +} + TEST_CASE("Texture fill") { Raz::Renderer::recoverErrors(); // Flushing errors