compression quality option

This commit is contained in:
Mikulas Florek 2021-03-27 11:53:33 +01:00
parent e869cb1149
commit 02019e7af2

View file

@ -273,7 +273,7 @@ static bool saveAsDDS(const char* path, const u8* data, int w, int h, bool gener
nvtt::CompressionOptions compression; nvtt::CompressionOptions compression;
compression.setFormat(nvtt::Format_DXT5); compression.setFormat(nvtt::Format_DXT5);
compression.setQuality(nvtt::Quality_Fastest); compression.setQuality(nvtt::Quality_Normal);
if (!context.process(input, compression, output)) { if (!context.process(input, compression, output)) {
file.close(); file.close();
@ -712,6 +712,12 @@ struct TexturePlugin final : AssetBrowser::IPlugin, AssetCompiler::IPlugin
{ {
struct Meta struct Meta
{ {
enum class Quality : i32 {
FASTEST,
NORMAL,
PRODUCTION,
HIGHEST
};
enum WrapMode : u32 { enum WrapMode : u32 {
REPEAT, REPEAT,
CLAMP CLAMP
@ -729,6 +735,7 @@ struct TexturePlugin final : AssetBrowser::IPlugin, AssetCompiler::IPlugin
WrapMode wrap_mode_u = WrapMode::REPEAT; WrapMode wrap_mode_u = WrapMode::REPEAT;
WrapMode wrap_mode_v = WrapMode::REPEAT; WrapMode wrap_mode_v = WrapMode::REPEAT;
WrapMode wrap_mode_w = WrapMode::REPEAT; WrapMode wrap_mode_w = WrapMode::REPEAT;
Quality quality = Quality::NORMAL;
Filter filter = Filter::LINEAR; Filter filter = Filter::LINEAR;
}; };
@ -1018,7 +1025,7 @@ struct TexturePlugin final : AssetBrowser::IPlugin, AssetCompiler::IPlugin
nvtt::CompressionOptions compression; nvtt::CompressionOptions compression;
// TODO format // TODO format
compression.setFormat(nvtt::Format_BC3); compression.setFormat(nvtt::Format_BC3);
compression.setQuality(nvtt::Quality_Fastest); compression.setQuality(toNVTT(meta.quality));
dst.write("dds", 3); dst.write("dds", 3);
u32 flags = meta.srgb ? (u32)Texture::Flags::SRGB : 0; u32 flags = meta.srgb ? (u32)Texture::Flags::SRGB : 0;
@ -1078,7 +1085,6 @@ struct TexturePlugin final : AssetBrowser::IPlugin, AssetCompiler::IPlugin
flags |= meta.filter == Meta::Filter::POINT ? (u32)Texture::Flags::POINT : 0; flags |= meta.filter == Meta::Filter::POINT ? (u32)Texture::Flags::POINT : 0;
flags |= meta.filter == Meta::Filter::ANISOTROPIC ? (u32)Texture::Flags::ANISOTROPIC : 0; flags |= meta.filter == Meta::Filter::ANISOTROPIC ? (u32)Texture::Flags::ANISOTROPIC : 0;
dst.write(&flags, sizeof(flags)); dst.write(&flags, sizeof(flags));
nvtt::Context context; nvtt::Context context;
const bool has_alpha = comps == 4; const bool has_alpha = comps == 4;
@ -1105,7 +1111,7 @@ struct TexturePlugin final : AssetBrowser::IPlugin, AssetCompiler::IPlugin
nvtt::CompressionOptions compression; nvtt::CompressionOptions compression;
compression.setFormat(meta.is_normalmap ? nvtt::Format_DXT5n : (has_alpha ? nvtt::Format_DXT5 : nvtt::Format_DXT1)); compression.setFormat(meta.is_normalmap ? nvtt::Format_DXT5n : (has_alpha ? nvtt::Format_DXT5 : nvtt::Format_DXT1));
compression.setQuality(nvtt::Quality_Normal); compression.setQuality(toNVTT(meta.quality));
if (!context.process(input, compression, output)) { if (!context.process(input, compression, output)) {
return false; return false;
@ -1113,6 +1119,15 @@ struct TexturePlugin final : AssetBrowser::IPlugin, AssetCompiler::IPlugin
return true; return true;
} }
static nvtt::Quality toNVTT(Meta::Quality quality) {
switch (quality) {
case Meta::Quality::FASTEST: return nvtt::Quality_Fastest;
case Meta::Quality::NORMAL: return nvtt::Quality_Normal;
case Meta::Quality::PRODUCTION: return nvtt::Quality_Production;
case Meta::Quality::HIGHEST: return nvtt::Quality_Highest;
default: return nvtt::Quality_Production;
}
}
Meta getMeta(const Path& path) const Meta getMeta(const Path& path) const
{ {
@ -1144,6 +1159,13 @@ struct TexturePlugin final : AssetBrowser::IPlugin, AssetCompiler::IPlugin
if(LuaWrapper::getOptionalStringField(L, LUA_GLOBALSINDEX, "wrap_mode_w", Span(tmp))) { if(LuaWrapper::getOptionalStringField(L, LUA_GLOBALSINDEX, "wrap_mode_w", Span(tmp))) {
meta.wrap_mode_w = equalIStrings(tmp, "repeat") ? Meta::WrapMode::REPEAT : Meta::WrapMode::CLAMP; meta.wrap_mode_w = equalIStrings(tmp, "repeat") ? Meta::WrapMode::REPEAT : Meta::WrapMode::CLAMP;
} }
if(LuaWrapper::getOptionalStringField(L, LUA_GLOBALSINDEX, "quality", Span(tmp))) {
if (equalIStrings(tmp, "fastest")) meta.quality = Meta::Quality::FASTEST;
else if (equalIStrings(tmp, "normal")) meta.quality = Meta::Quality::NORMAL;
else if (equalIStrings(tmp, "production")) meta.quality = Meta::Quality::PRODUCTION;
else if (equalIStrings(tmp, "highest")) meta.quality = Meta::Quality::HIGHEST;
}
}); });
return meta; return meta;
} }
@ -1213,6 +1235,16 @@ struct TexturePlugin final : AssetBrowser::IPlugin, AssetCompiler::IPlugin
} }
} }
const char* toString(Meta::Quality quality) {
switch (quality) {
case Meta::Quality::FASTEST: return "fastest";
case Meta::Quality::NORMAL: return "normal";
case Meta::Quality::PRODUCTION: return "production";
case Meta::Quality::HIGHEST: return "highest";
default: ASSERT(false); return "production";
}
}
void compositeGUI(Texture& texture) { void compositeGUI(Texture& texture) {
FileSystem& fs = m_app.getEngine().getFileSystem(); FileSystem& fs = m_app.getEngine().getFileSystem();
if (m_composite_tag != &texture) { if (m_composite_tag != &texture) {
@ -1398,11 +1430,17 @@ struct TexturePlugin final : AssetBrowser::IPlugin, AssetCompiler::IPlugin
ImGuiEx::Label("SRGB"); ImGuiEx::Label("SRGB");
ImGui::Checkbox("##srgb", &m_meta.srgb); ImGui::Checkbox("##srgb", &m_meta.srgb);
if (Path::hasExtension(texture->getPath().c_str(), "tga")) { bool is_tga = Path::hasExtension(texture->getPath().c_str(), "tga");
if (is_tga) {
ImGuiEx::Label("Compress"); ImGuiEx::Label("Compress");
ImGui::Checkbox("##cmprs", &m_meta.compress); ImGui::Checkbox("##cmprs", &m_meta.compress);
} }
if ((m_meta.compress || !is_tga) && !m_meta.convert_to_raw) {
ImGuiEx::Label("Compression quality");
ImGui::Combo("Quality", (i32*)&m_meta.quality, "Fastest\0Normal\0Production\0Highest\0");
}
ImGuiEx::Label("Convert to RAW"); ImGuiEx::Label("Convert to RAW");
ImGui::Checkbox("##cvt2raw", &m_meta.convert_to_raw); ImGui::Checkbox("##cvt2raw", &m_meta.convert_to_raw);
bool scale_coverage = m_meta.scale_coverage >= 0; bool scale_coverage = m_meta.scale_coverage >= 0;
@ -1437,6 +1475,7 @@ struct TexturePlugin final : AssetBrowser::IPlugin, AssetCompiler::IPlugin
, "\nconvert_to_raw = ", m_meta.convert_to_raw ? "true" : "false" , "\nconvert_to_raw = ", m_meta.convert_to_raw ? "true" : "false"
, "\nmip_scale_coverage = ", m_meta.scale_coverage , "\nmip_scale_coverage = ", m_meta.scale_coverage
, "\nnormalmap = ", m_meta.is_normalmap ? "true" : "false" , "\nnormalmap = ", m_meta.is_normalmap ? "true" : "false"
, "\nquality = \"", toString(m_meta.quality), "\""
, "\nwrap_mode_u = \"", toString(m_meta.wrap_mode_u), "\"" , "\nwrap_mode_u = \"", toString(m_meta.wrap_mode_u), "\""
, "\nwrap_mode_v = \"", toString(m_meta.wrap_mode_v), "\"" , "\nwrap_mode_v = \"", toString(m_meta.wrap_mode_v), "\""
, "\nwrap_mode_w = \"", toString(m_meta.wrap_mode_w), "\"" , "\nwrap_mode_w = \"", toString(m_meta.wrap_mode_w), "\""
@ -1527,8 +1566,7 @@ struct ModelPropertiesPlugin final : PropertyGrid::IPlugin {
struct ModelPlugin final : AssetBrowser::IPlugin, AssetCompiler::IPlugin struct ModelPlugin final : AssetBrowser::IPlugin, AssetCompiler::IPlugin
{ {
struct Meta struct Meta {
{
float scale = 1.f; float scale = 1.f;
float culling_scale = 1.f; float culling_scale = 1.f;
bool split = false; bool split = false;