BakeVirtualTexturesToFiles() fix; handle R8G8_UNORM write to file;

This commit is contained in:
Turánszki János
2022-10-04 19:20:02 +02:00
parent 1f0f13bd28
commit 856b1d0457
3 changed files with 62 additions and 54 deletions
+5
View File
@@ -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;
+56 -53
View File
@@ -1061,9 +1061,48 @@ namespace wi::terrain
return;
}
wi::jobsystem::context ctx;
static const std::string extension = "PNG";
wi::vector<wi::Resource> 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<uint8_t> texturedata;
if (wi::helper::saveTextureToMemory(virtual_textures[i], texturedata))
{
wi::vector<uint8_t> 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<uint8_t> 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<uint8_t> 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();
}
}
+1 -1
View File
@@ -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);