From dbf75931d08f5d3250a24749f41968190054dd99 Mon Sep 17 00:00:00 2001 From: Hugo Locurcio Date: Thu, 13 May 2021 20:04:02 +0200 Subject: [PATCH] Add "Normal Map Invert Y" import option for normal maps This can be used to invert a normal map's Y direction. The existing Invert import option that inverts all RGB channels is kept for compatibility with existing projects. --- editor/import/resource_importer_texture.cpp | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/editor/import/resource_importer_texture.cpp b/editor/import/resource_importer_texture.cpp index e9981c0d78f..4316010976c 100644 --- a/editor/import/resource_importer_texture.cpp +++ b/editor/import/resource_importer_texture.cpp @@ -201,6 +201,7 @@ void ResourceImporterTexture::get_import_options(List *r_options, r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "process/premult_alpha"), false)); r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "process/HDR_as_SRGB"), false)); r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "process/invert_color"), false)); + r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "process/normal_map_invert_y"), false)); r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "stream"), false)); r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "size_limit", PROPERTY_HINT_RANGE, "0,4096,1"), 0)); r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "detect_3d"), p_preset == PRESET_DETECT)); @@ -373,6 +374,7 @@ Error ResourceImporterTexture::import(const String &p_source_file, const String bool fix_alpha_border = p_options["process/fix_alpha_border"]; bool premult_alpha = p_options["process/premult_alpha"]; bool invert_color = p_options["process/invert_color"]; + bool normal_map_invert_y = p_options["process/normal_map_invert_y"]; bool stream = p_options["stream"]; int size_limit = p_options["size_limit"]; bool hdr_as_srgb = p_options["process/HDR_as_SRGB"]; @@ -450,6 +452,24 @@ Error ResourceImporterTexture::import(const String &p_source_file, const String image->unlock(); } + if (normal_map_invert_y) { + // Inverting the green channel can be used to flip a normal map's direction. + // There's no standard when it comes to normal map Y direction, so this is + // sometimes needed when using a normal map exported from another program. + // See . + const int height = image->get_height(); + const int width = image->get_width(); + + image->lock(); + for (int i = 0; i < width; i++) { + for (int j = 0; j < height; j++) { + const Color color = image->get_pixel(i, j); + image->set_pixel(i, j, Color(color.r, 1 - color.g, color.b)); + } + } + image->unlock(); + } + bool detect_3d = p_options["detect_3d"]; bool detect_srgb = srgb == 2; bool detect_normal = normal == 0;