From 856b1d045787e27cc5213e1bff9755c816cfdde9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tur=C3=A1nszki=20J=C3=A1nos?= Date: Tue, 4 Oct 2022 19:20:02 +0200 Subject: [PATCH] BakeVirtualTexturesToFiles() fix; handle R8G8_UNORM write to file; --- WickedEngine/wiHelper.cpp | 5 ++ WickedEngine/wiTerrain.cpp | 109 +++++++++++++++++++------------------ WickedEngine/wiVersion.cpp | 2 +- 3 files changed, 62 insertions(+), 54 deletions(-) diff --git a/WickedEngine/wiHelper.cpp b/WickedEngine/wiHelper.cpp index a0cd8d21c..f02e49fed 100644 --- a/WickedEngine/wiHelper.cpp +++ b/WickedEngine/wiHelper.cpp @@ -351,6 +351,11 @@ namespace wi::helper // This can be saved by reducing target channel count, no conversion needed dst_channel_count = 1; } + else if (desc.format == Format::R8G8_UNORM) + { + // This can be saved by reducing target channel count, no conversion needed + dst_channel_count = 2; + } else if (IsFormatBlockCompressed(desc.format)) { basisu::texture_format fmt; diff --git a/WickedEngine/wiTerrain.cpp b/WickedEngine/wiTerrain.cpp index 108d9908d..4b93b09fe 100644 --- a/WickedEngine/wiTerrain.cpp +++ b/WickedEngine/wiTerrain.cpp @@ -1061,9 +1061,48 @@ namespace wi::terrain return; } - wi::jobsystem::context ctx; - static const std::string extension = "PNG"; + wi::vector resources; // retain resources until end of function + + wi::helper::messageBox("Baking terrain virtual textures to static textures, this could take a while!", "Attention!"); + + for (int i = 0; i < MaterialComponent::TEXTURESLOT_COUNT; ++i) + { + if (virtual_textures[i].IsValid()) + { + wi::vector texturedata; + if (wi::helper::saveTextureToMemory(virtual_textures[i], texturedata)) + { + wi::vector filedata; + if (wi::helper::saveTextureToMemoryFile(texturedata, virtual_textures[i].desc, extension, filedata)) + { + std::string filename = "Terrain::"; + switch (i) + { + default: + case MaterialComponent::TEXTURESLOT::BASECOLORMAP: + filename += "BASECOLORMAP"; + break; + case MaterialComponent::TEXTURESLOT::NORMALMAP: + filename += "NORMALMAP"; + break; + case MaterialComponent::TEXTURESLOT::SURFACEMAP: + filename += "SURFACEMAP"; + break; + } + filename += "." + extension; + resources.push_back( + wi::resourcemanager::Load( + filename, + wi::resourcemanager::Flags::IMPORT_RETAIN_FILEDATA, + filedata.data(), + filedata.size() + ) + ); + } + } + } + } for (auto it = chunks.begin(); it != chunks.end(); it++) { @@ -1074,62 +1113,26 @@ namespace wi::terrain { for (int i = 0; i < MaterialComponent::TEXTURESLOT_COUNT; ++i) { - auto& tex = material->textures[i]; - switch (i) + if (virtual_textures[i].IsValid()) { - case MaterialComponent::BASECOLORMAP: - case MaterialComponent::SURFACEMAP: - case MaterialComponent::NORMALMAP: - if (tex.GetGPUResource() != nullptr) + std::string filename = "Terrain::"; + switch (i) { - wi::vector filedata; - if (wi::helper::saveTextureToMemory(tex.resource.GetTexture(), filedata)) - { - tex.resource.SetFileData(std::move(filedata)); - wi::jobsystem::Execute(ctx, [i, &tex, chunk](wi::jobsystem::JobArgs args) { - wi::vector filedata_ktx2; - if (wi::helper::saveTextureToMemoryFile(tex.resource.GetFileData(), tex.resource.GetTexture().desc, extension, filedata_ktx2)) - { - tex.name = std::to_string(chunk.x) + "_" + std::to_string(chunk.z); - switch (i) - { - case MaterialComponent::BASECOLORMAP: - tex.name += "_basecolormap"; - break; - case MaterialComponent::SURFACEMAP: - tex.name += "_surfacemap"; - break; - case MaterialComponent::NORMALMAP: - tex.name += "_normalmap"; - break; - default: - break; - } - tex.name += "." + extension; - tex.resource = wi::resourcemanager::Load(tex.name, wi::resourcemanager::Flags::IMPORT_RETAIN_FILEDATA, filedata_ktx2.data(), filedata_ktx2.size()); - } - }); - } + default: + case MaterialComponent::TEXTURESLOT::BASECOLORMAP: + filename += "BASECOLORMAP"; + break; + case MaterialComponent::TEXTURESLOT::NORMALMAP: + filename += "NORMALMAP"; + break; + case MaterialComponent::TEXTURESLOT::SURFACEMAP: + filename += "SURFACEMAP"; + break; } - break; - default: - break; + filename += "." + extension; + material->textures[i].name = filename; } } - } - } - - wi::helper::messageBox("Baking terrain virtual textures to static textures, this could take a while!", "Attention!"); - - wi::jobsystem::Wait(ctx); - - for (auto it = chunks.begin(); it != chunks.end(); it++) - { - const Chunk& chunk = it->first; - ChunkData& chunk_data = it->second; - MaterialComponent* material = scene->materials.GetComponent(chunk_data.entity); - if (material != nullptr) - { material->CreateRenderData(); } } diff --git a/WickedEngine/wiVersion.cpp b/WickedEngine/wiVersion.cpp index 660207b64..d11f1f741 100644 --- a/WickedEngine/wiVersion.cpp +++ b/WickedEngine/wiVersion.cpp @@ -9,7 +9,7 @@ namespace wi::version // minor features, major updates, breaking compatibility changes const int minor = 71; // minor bug fixes, alterations, refactors, updates - const int revision = 69; + const int revision = 70; const std::string version_string = std::to_string(major) + "." + std::to_string(minor) + "." + std::to_string(revision);