Skip to content

Commit

Permalink
Merge pull request #48693 from Calinou/editor-import-invert-green-cha…
Browse files Browse the repository at this point in the history
…nnel-3.x

Add "Normal Map Invert Y" import option for normal maps
  • Loading branch information
akien-mga authored Jun 5, 2021
2 parents f102ba8 + dbf7593 commit 6580166
Showing 1 changed file with 20 additions and 0 deletions.
20 changes: 20 additions & 0 deletions editor/import/resource_importer_texture.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -201,6 +201,7 @@ void ResourceImporterTexture::get_import_options(List<ImportOption> *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));
Expand Down Expand Up @@ -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"];
Expand Down Expand Up @@ -465,6 +467,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 <http://wiki.polycount.com/wiki/Normal_Map_Technical_Details#Common_Swizzle_Coordinates>.
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;
Expand Down

0 comments on commit 6580166

Please sign in to comment.