From bc439760f42d203ada02748a6b28359d90ff987f Mon Sep 17 00:00:00 2001 From: langfod Date: Mon, 9 Sep 2024 19:23:30 -0400 Subject: [PATCH 1/3] DynamicCubeMap Creator crash fix When a destination folder for the DynamicCubeMap Creator export does not exist then CS should not crash. Now: Create Folder if destination folder does not exist. Unable to create missing folder: log error File Object with same name exists: skips --- src/Features/DynamicCubemaps.cpp | 24 +++++++++++++++++++++--- src/Features/DynamicCubemaps.h | 2 ++ 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/src/Features/DynamicCubemaps.cpp b/src/Features/DynamicCubemaps.cpp index fd723146c5..4de7886156 100644 --- a/src/Features/DynamicCubemaps.cpp +++ b/src/Features/DynamicCubemaps.cpp @@ -91,11 +91,29 @@ void DynamicCubemaps::DrawSettings() DirectX::ScratchImage image; DX::ThrowIfFailed(CaptureTexture(device, context, tempTexture, image)); - std::string filename = std::format("Data\\Textures\\DynamicCubemaps\\{:.2f}{:.2f}{:.2f}R{:.2f}.dds", settings.CubemapColor.x, settings.CubemapColor.y, settings.CubemapColor.z, settings.CubemapColor.w); + bool defaultDynamicCubeMapSavePathSafe = true; + try { + if (std::filesystem::create_directories(defaultDynamicCubeMapSavePath)) { + logger::info("Missing DynamicCubeMap Creator directory created: {}", defaultDynamicCubeMapSavePath); + } + } catch (const std::exception) { + logger::error("Failed to create missing DynamicCubeMap Creator directory: {}", defaultDynamicCubeMapSavePath); + defaultDynamicCubeMapSavePathSafe = false; + } + + if (defaultDynamicCubeMapSavePathSafe) { - std::wstring wfilename = std::wstring(filename.begin(), filename.end()); - DX::ThrowIfFailed(SaveToDDSFile(image.GetImages(), image.GetImageCount(), image.GetMetadata(), DirectX::DDS_FLAGS::DDS_FLAGS_NONE, wfilename.c_str())); + std::filesystem::path DynamicCubeMapSavePath = defaultDynamicCubeMapSavePath; + std::filesystem::path filename(std::format("R{:03d}G{:03d}B{:03d}A{:03d}.dds", colorPixel.r, colorPixel.g, colorPixel.b, colorPixel.a)); + DynamicCubeMapSavePath /= filename; + if (std::filesystem::exists(DynamicCubeMapSavePath)) { + logger::info("DynamicCubeMap Creator file for {} already exists, skipping.", filename.string()); + } else { + DX::ThrowIfFailed(SaveToDDSFile(image.GetImages(), image.GetImageCount(), image.GetMetadata(), DirectX::DDS_FLAGS::DDS_FLAGS_NONE, DynamicCubeMapSavePath.c_str())); + logger::info("DynamicCubeMap Creator file for {} written", filename.string()); + } + } image.Release(); tempTexture->Release(); } diff --git a/src/Features/DynamicCubemaps.h b/src/Features/DynamicCubemaps.h index fed7630806..69b5ae4834 100644 --- a/src/Features/DynamicCubemaps.h +++ b/src/Features/DynamicCubemaps.h @@ -19,6 +19,8 @@ struct DynamicCubemaps : Feature return &singleton; } + const std::string defaultDynamicCubeMapSavePath = "Data\\textures\\DynamicCubemaps"; + // Specular irradiance ID3D11SamplerState* computeSampler = nullptr; From 4df801262fbb256e103696987828db2114244286 Mon Sep 17 00:00:00 2001 From: langfod Date: Mon, 9 Sep 2024 23:26:27 +0000 Subject: [PATCH 2/3] =?UTF-8?q?style:=20=F0=9F=8E=A8=20apply=20clang-forma?= =?UTF-8?q?t=20changes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Features/DynamicCubemaps.cpp | 1 - src/Features/DynamicCubemaps.h | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/Features/DynamicCubemaps.cpp b/src/Features/DynamicCubemaps.cpp index 4de7886156..ab9001ffa9 100644 --- a/src/Features/DynamicCubemaps.cpp +++ b/src/Features/DynamicCubemaps.cpp @@ -102,7 +102,6 @@ void DynamicCubemaps::DrawSettings() } if (defaultDynamicCubeMapSavePathSafe) { - std::filesystem::path DynamicCubeMapSavePath = defaultDynamicCubeMapSavePath; std::filesystem::path filename(std::format("R{:03d}G{:03d}B{:03d}A{:03d}.dds", colorPixel.r, colorPixel.g, colorPixel.b, colorPixel.a)); DynamicCubeMapSavePath /= filename; diff --git a/src/Features/DynamicCubemaps.h b/src/Features/DynamicCubemaps.h index 69b5ae4834..a188190962 100644 --- a/src/Features/DynamicCubemaps.h +++ b/src/Features/DynamicCubemaps.h @@ -20,7 +20,7 @@ struct DynamicCubemaps : Feature } const std::string defaultDynamicCubeMapSavePath = "Data\\textures\\DynamicCubemaps"; - + // Specular irradiance ID3D11SamplerState* computeSampler = nullptr; From 600063055f04d69fd1d96a9d5a27ba900ce1d97f Mon Sep 17 00:00:00 2001 From: langfod Date: Wed, 11 Sep 2024 00:02:16 -0400 Subject: [PATCH 3/3] Update DynamicCubemaps.cpp Moved Texture creation and SaveToDDSFile inside try/catch block. This removed one boolean variable that had been used . No attempt is made to save a file if that filename exists (even an incorrect file object). As there are multiple types of exceptions including OS filesystem errors the catch was left as std::exception instead of multiple catch types and specific log messages. --- src/Features/DynamicCubemaps.cpp | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/src/Features/DynamicCubemaps.cpp b/src/Features/DynamicCubemaps.cpp index ab9001ffa9..55c7fee7e5 100644 --- a/src/Features/DynamicCubemaps.cpp +++ b/src/Features/DynamicCubemaps.cpp @@ -86,22 +86,16 @@ void DynamicCubemaps::DrawSettings() } ID3D11Texture2D* tempTexture; - DX::ThrowIfFailed(device->CreateTexture2D(&texDesc, subresourceData, &tempTexture)); - DirectX::ScratchImage image; - DX::ThrowIfFailed(CaptureTexture(device, context, tempTexture, image)); - bool defaultDynamicCubeMapSavePathSafe = true; try { + DX::ThrowIfFailed(device->CreateTexture2D(&texDesc, subresourceData, &tempTexture)); + DX::ThrowIfFailed(CaptureTexture(device, context, tempTexture, image)); + if (std::filesystem::create_directories(defaultDynamicCubeMapSavePath)) { logger::info("Missing DynamicCubeMap Creator directory created: {}", defaultDynamicCubeMapSavePath); } - } catch (const std::exception) { - logger::error("Failed to create missing DynamicCubeMap Creator directory: {}", defaultDynamicCubeMapSavePath); - defaultDynamicCubeMapSavePathSafe = false; - } - if (defaultDynamicCubeMapSavePathSafe) { std::filesystem::path DynamicCubeMapSavePath = defaultDynamicCubeMapSavePath; std::filesystem::path filename(std::format("R{:03d}G{:03d}B{:03d}A{:03d}.dds", colorPixel.r, colorPixel.g, colorPixel.b, colorPixel.a)); DynamicCubeMapSavePath /= filename; @@ -112,7 +106,11 @@ void DynamicCubemaps::DrawSettings() DX::ThrowIfFailed(SaveToDDSFile(image.GetImages(), image.GetImageCount(), image.GetMetadata(), DirectX::DDS_FLAGS::DDS_FLAGS_NONE, DynamicCubeMapSavePath.c_str())); logger::info("DynamicCubeMap Creator file for {} written", filename.string()); } + + } catch (const std::exception& e) { + logger::error("Failed in DynamicCubeMap Creator file: {} {}", defaultDynamicCubeMapSavePath, e.what()); } + image.Release(); tempTexture->Release(); }