From 2a5de178faa134b40adb36e8d60d2f60192ed8ae Mon Sep 17 00:00:00 2001 From: Chandler Cox Date: Fri, 4 Oct 2024 19:21:15 -0500 Subject: [PATCH 1/3] Small fix for Reconstructing Z Channel and add keeping aspect ration when resizing. --- .../Engine/Tools/TextureTool/TextureTool.DirectXTex.cpp | 9 +++++---- Source/Engine/Tools/TextureTool/TextureTool.cpp | 4 ++++ Source/Engine/Tools/TextureTool/TextureTool.h | 4 ++++ 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/Source/Engine/Tools/TextureTool/TextureTool.DirectXTex.cpp b/Source/Engine/Tools/TextureTool/TextureTool.DirectXTex.cpp index e62d32842..aa1e5fece 100644 --- a/Source/Engine/Tools/TextureTool/TextureTool.DirectXTex.cpp +++ b/Source/Engine/Tools/TextureTool/TextureTool.DirectXTex.cpp @@ -661,7 +661,7 @@ bool TextureTool::ImportTextureDirectXTex(ImageType type, const StringView& path if (sourceWidth != width || sourceHeight != height) { // During resizing we need to keep texture aspect ratio - const bool keepAspectRatio = false; // TODO: expose as import option + const bool keepAspectRatio = options.KeepAspectRatio; if (keepAspectRatio) { const float aspectRatio = static_cast(sourceWidth) / sourceHeight; @@ -728,7 +728,8 @@ bool TextureTool::ImportTextureDirectXTex(ImageType type, const StringView& path bool keepAsIs = false; if (!options.FlipY && - !options.InvertGreenChannel && + !options.InvertGreenChannel && + !options.ReconstructZChannel && options.Compress && type == ImageType::DDS && mipLevels == sourceMipLevels && @@ -833,7 +834,7 @@ bool TextureTool::ImportTextureDirectXTex(ImageType type, const StringView& path if (!keepAsIs & options.ReconstructZChannel) { auto& timage = GET_TMP_IMG(); - bool isunorm = (DirectX::FormatDataType(currentImage->GetMetadata().format) == DirectX::FORMAT_TYPE_UNORM) != 0; + bool isunorm = (DirectX::FormatDataType(sourceDxgiFormat) == DirectX::FORMAT_TYPE_UNORM) != 0; result = TransformImage(currentImage->GetImages(), currentImage->GetImageCount(), currentImage->GetMetadata(), [&](DirectX::XMVECTOR* outPixels, const DirectX::XMVECTOR* inPixels, size_t w, size_t y) { @@ -855,7 +856,7 @@ bool TextureTool::ImportTextureDirectXTex(ImageType type, const StringView& path { z = DirectX::XMVectorSqrt(DirectX::XMVectorSubtract(DirectX::g_XMOne, DirectX::XMVector2Dot(value, value))); } - outPixels[j] = XMVectorSelect(value, z, s_selectz); + outPixels[j] = DirectX::XMVectorSelect(value, z, s_selectz); } }, timage); if (FAILED(result)) diff --git a/Source/Engine/Tools/TextureTool/TextureTool.cpp b/Source/Engine/Tools/TextureTool/TextureTool.cpp index 48df4cb31..34be2c9fb 100644 --- a/Source/Engine/Tools/TextureTool/TextureTool.cpp +++ b/Source/Engine/Tools/TextureTool/TextureTool.cpp @@ -82,6 +82,9 @@ void TextureTool::Options::Serialize(SerializeStream& stream, const void* otherO stream.JKEY("Resize"); stream.Bool(Resize); + stream.JKEY("KeepAspectRatio"); + stream.Bool(KeepAspectRatio); + stream.JKEY("PreserveAlphaCoverage"); stream.Bool(PreserveAlphaCoverage); @@ -139,6 +142,7 @@ void TextureTool::Options::Deserialize(DeserializeStream& stream, ISerializeModi InvertGreenChannel = JsonTools::GetBool(stream, "InvertGreenChannel", InvertGreenChannel); ReconstructZChannel = JsonTools::GetBool(stream, "ReconstructZChannel", ReconstructZChannel); Resize = JsonTools::GetBool(stream, "Resize", Resize); + KeepAspectRatio = JsonTools::GetBool(stream, "KeepAspectRatio", KeepAspectRatio); PreserveAlphaCoverage = JsonTools::GetBool(stream, "PreserveAlphaCoverage", PreserveAlphaCoverage); PreserveAlphaCoverageReference = JsonTools::GetFloat(stream, "PreserveAlphaCoverageReference", PreserveAlphaCoverageReference); TextureGroup = JsonTools::GetInt(stream, "TextureGroup", TextureGroup); diff --git a/Source/Engine/Tools/TextureTool/TextureTool.h b/Source/Engine/Tools/TextureTool/TextureTool.h index 3acf41eb9..494618c60 100644 --- a/Source/Engine/Tools/TextureTool/TextureTool.h +++ b/Source/Engine/Tools/TextureTool/TextureTool.h @@ -77,6 +77,10 @@ API_CLASS(Namespace="FlaxEngine.Tools", Static) class FLAXENGINE_API TextureTool API_FIELD(Attributes="EditorOrder(100)") bool Resize = false; + // Keeps the aspect ratio when resizing. + API_FIELD(Attributes="EditorOrder(101), VisibleIf(nameof(Resize))") + bool KeepAspectRatio = false; + // The width of the imported texture. If Resize property is set to true then texture will be resized during the import to this value during the import, otherwise it will be ignored. API_FIELD(Attributes="HideInEditor") int32 SizeX = 1024; From 305d3a64966ea7dba4e83f7d5a9bb1fb91c67389 Mon Sep 17 00:00:00 2001 From: Chandler Cox Date: Fri, 4 Oct 2024 19:31:55 -0500 Subject: [PATCH 2/3] Add FlipX to texture tool. --- .../TextureTool/TextureTool.DirectXTex.cpp | 19 +++++++++++++++++-- .../Engine/Tools/TextureTool/TextureTool.cpp | 4 ++++ Source/Engine/Tools/TextureTool/TextureTool.h | 10 +++++++--- 3 files changed, 28 insertions(+), 5 deletions(-) diff --git a/Source/Engine/Tools/TextureTool/TextureTool.DirectXTex.cpp b/Source/Engine/Tools/TextureTool/TextureTool.DirectXTex.cpp index aa1e5fece..dc2b20778 100644 --- a/Source/Engine/Tools/TextureTool/TextureTool.DirectXTex.cpp +++ b/Source/Engine/Tools/TextureTool/TextureTool.DirectXTex.cpp @@ -727,7 +727,8 @@ bool TextureTool::ImportTextureDirectXTex(ImageType type, const StringView& path } bool keepAsIs = false; - if (!options.FlipY && + if (!options.FlipY && + !options.FlipX && !options.InvertGreenChannel && !options.ReconstructZChannel && options.Compress && @@ -788,7 +789,7 @@ bool TextureTool::ImportTextureDirectXTex(ImageType type, const StringView& path SET_CURRENT_IMG(tmpImg); } - // Check flip/rotate source image + // Check flip/rotate Y source image if (!keepAsIs && options.FlipY) { auto& tmpImg = GET_TMP_IMG(); @@ -802,6 +803,20 @@ bool TextureTool::ImportTextureDirectXTex(ImageType type, const StringView& path SET_CURRENT_IMG(tmpImg); } + // Check flip/rotate X source image + if (!keepAsIs && options.FlipX) + { + auto& tmpImg = GET_TMP_IMG(); + DirectX::TEX_FR_FLAGS flags = DirectX::TEX_FR_FLIP_HORIZONTAL; + result = FlipRotate(currentImage->GetImages(), currentImage->GetImageCount(), currentImage->GetMetadata(), flags, tmpImg); + if (FAILED(result)) + { + errorMsg = String::Format(TEXT("Cannot rotate/flip texture, error: {0:x}"), static_cast(result)); + return true; + } + SET_CURRENT_IMG(tmpImg); + } + // Check if invert green channel if (!keepAsIs && options.InvertGreenChannel) { diff --git a/Source/Engine/Tools/TextureTool/TextureTool.cpp b/Source/Engine/Tools/TextureTool/TextureTool.cpp index 34be2c9fb..550e26699 100644 --- a/Source/Engine/Tools/TextureTool/TextureTool.cpp +++ b/Source/Engine/Tools/TextureTool/TextureTool.cpp @@ -73,6 +73,9 @@ void TextureTool::Options::Serialize(SerializeStream& stream, const void* otherO stream.JKEY("FlipY"); stream.Bool(FlipY); + stream.JKEY("FlipX"); + stream.Bool(FlipX); + stream.JKEY("InvertGreenChannel"); stream.Bool(InvertGreenChannel); @@ -139,6 +142,7 @@ void TextureTool::Options::Deserialize(DeserializeStream& stream, ISerializeModi sRGB = JsonTools::GetBool(stream, "sRGB", sRGB); GenerateMipMaps = JsonTools::GetBool(stream, "GenerateMipMaps", GenerateMipMaps); FlipY = JsonTools::GetBool(stream, "FlipY", FlipY); + FlipX = JsonTools::GetBool(stream, "FlipX", FlipX); InvertGreenChannel = JsonTools::GetBool(stream, "InvertGreenChannel", InvertGreenChannel); ReconstructZChannel = JsonTools::GetBool(stream, "ReconstructZChannel", ReconstructZChannel); Resize = JsonTools::GetBool(stream, "Resize", Resize); diff --git a/Source/Engine/Tools/TextureTool/TextureTool.h b/Source/Engine/Tools/TextureTool/TextureTool.h index 494618c60..13bac0dc5 100644 --- a/Source/Engine/Tools/TextureTool/TextureTool.h +++ b/Source/Engine/Tools/TextureTool/TextureTool.h @@ -53,16 +53,20 @@ API_CLASS(Namespace="FlaxEngine.Tools", Static) class FLAXENGINE_API TextureTool API_FIELD(Attributes="EditorOrder(60)") bool GenerateMipMaps = true; - // True if flip Y coordinate of the texture. + // True if flip Y coordinate of the texture (Flips over X axis). API_FIELD(Attributes="EditorOrder(70)") bool FlipY = false; + // True if flip X coordinate of the texture (Flips over Y axis). + API_FIELD(Attributes="EditorOrder(71)") + bool FlipX = false; + // True if to invert the green channel on a normal map. Good for OpenGL to DirectX conversion. - API_FIELD(Attributes = "EditorOrder(71)") + API_FIELD(Attributes = "EditorOrder(72)") bool InvertGreenChannel = false; // Rebuild Z (blue) channel assuming X/Y are normals. - API_FIELD(Attributes = "EditorOrder(72)") + API_FIELD(Attributes = "EditorOrder(73)") bool ReconstructZChannel = false; // Texture size scale. Allows increasing or decreasing the imported texture resolution. Default is 1. From 9b7e5be50e7b0d1c915ad795dbf403b132fcf735 Mon Sep 17 00:00:00 2001 From: Wojtek Figat Date: Sat, 5 Oct 2024 23:22:06 +0200 Subject: [PATCH 3/3] Add new features to `stb` too (as unsupported) #2968 --- .../Tools/TextureTool/TextureTool.stb.cpp | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/Source/Engine/Tools/TextureTool/TextureTool.stb.cpp b/Source/Engine/Tools/TextureTool/TextureTool.stb.cpp index 1301327ef..15058752d 100644 --- a/Source/Engine/Tools/TextureTool/TextureTool.stb.cpp +++ b/Source/Engine/Tools/TextureTool/TextureTool.stb.cpp @@ -458,7 +458,7 @@ bool TextureTool::ImportTextureStb(ImageType type, const StringView& path, Textu { if (!options.InternalLoad.IsBinded() || options.InternalLoad(textureData)) return true; - if (options.FlipY) + if (options.FlipY || options.FlipX) { // TODO: impl this errorMsg = TEXT("Flipping images imported from Internal source is not supported by stb."); @@ -489,7 +489,7 @@ bool TextureTool::ImportTextureStb(ImageType type, const StringView& path, Textu if (sourceWidth != width || sourceHeight != height) { // During resizing we need to keep texture aspect ratio - const bool keepAspectRatio = false; // TODO: expose as import option + const bool keepAspectRatio = options.KeepAspectRatio; // TODO: expose as import option if (keepAspectRatio) { const float aspectRatio = static_cast(sourceWidth) / sourceHeight; @@ -536,6 +536,22 @@ bool TextureTool::ImportTextureStb(ImageType type, const StringView& path, Textu return true; } + if (options.FlipX) + { + // TODO: impl this + LOG(Warning "Option 'Flip X' is not supported"); + } + if (options.InvertGreenChannel) + { + // TODO: impl this + LOG(Warning "Option 'Invert Green Channel' is not supported"); + } + if (options.ReconstructZChannel) + { + // TODO: impl this + LOG(Warning "Option 'Reconstruct Z Channel' is not supported"); + } + // Generate mip maps chain if (useMipLevels && options.GenerateMipMaps) {