Browse Source

Ensure, if a texture meant for a normal map is imported and size limit exists, that it's renormalized after resize.

Juan Linietsky 7 years ago
parent
commit
e179bf0726
5 changed files with 37 additions and 2 deletions
  1. 30 0
      core/image.cpp
  2. 1 0
      core/image.h
  3. 4 0
      editor/import/resource_importer_texture.cpp
  4. 1 1
      scene/resources/mesh.h
  5. 1 1
      servers/visual_server.h

+ 30 - 0
core/image.cpp

@@ -1076,6 +1076,36 @@ void Image::shrink_x2() {
 	}
 }
 
+void Image::normalize() {
+
+	bool used_mipmaps = has_mipmaps();
+	if (used_mipmaps) {
+		clear_mipmaps();
+	}
+
+	lock();
+
+	for (int y = 0; y < height; y++) {
+
+		for (int x = 0; x < width; x++) {
+
+			Color c = get_pixel(x, y);
+			Vector3 v(c.r * 2.0 - 1.0, c.g * 2.0 - 1.0, c.b * 2.0 - 1.0);
+			v.normalize();
+			c.r = v.x * 0.5 + 0.5;
+			c.g = v.y * 0.5 + 0.5;
+			c.b = v.z * 0.5 + 0.5;
+			set_pixel(x, y, c);
+		}
+	}
+
+	unlock();
+
+	if (used_mipmaps) {
+		generate_mipmaps(true);
+	}
+}
+
 Error Image::generate_mipmaps(bool p_renormalize) {
 
 	if (!_can_modify(format)) {

+ 1 - 0
core/image.h

@@ -220,6 +220,7 @@ public:
 	Error generate_mipmaps(bool p_renormalize = false);
 
 	void clear_mipmaps();
+	void normalize(); //for normal maps
 
 	/**
 	 * Create a new image of a given size and format. Current image will be lost

+ 4 - 0
editor/import/resource_importer_texture.cpp

@@ -395,6 +395,10 @@ Error ResourceImporterTexture::import(const String &p_source_file, const String
 
 			image->resize(new_width, new_height, Image::INTERPOLATE_CUBIC);
 		}
+
+		if (normal) {
+			image->normalize();
+		}
 	}
 
 	if (fix_alpha_border) {

+ 1 - 1
scene/resources/mesh.h

@@ -100,7 +100,7 @@ public:
 		ARRAY_FLAG_USE_16_BIT_BONES = ARRAY_COMPRESS_INDEX << 2,
 		ARRAY_FLAG_USE_DYNAMIC_UPDATE = ARRAY_COMPRESS_INDEX << 3,
 
-		ARRAY_COMPRESS_DEFAULT = ARRAY_COMPRESS_VERTEX | ARRAY_COMPRESS_NORMAL | ARRAY_COMPRESS_TANGENT | ARRAY_COMPRESS_COLOR | ARRAY_COMPRESS_TEX_UV | ARRAY_COMPRESS_TEX_UV2 | ARRAY_COMPRESS_WEIGHTS
+		ARRAY_COMPRESS_DEFAULT = ARRAY_COMPRESS_NORMAL | ARRAY_COMPRESS_TANGENT | ARRAY_COMPRESS_COLOR | ARRAY_COMPRESS_TEX_UV | ARRAY_COMPRESS_TEX_UV2 | ARRAY_COMPRESS_WEIGHTS
 
 	};
 

+ 1 - 1
servers/visual_server.h

@@ -233,7 +233,7 @@ public:
 		ARRAY_FLAG_USE_16_BIT_BONES = ARRAY_COMPRESS_INDEX << 2,
 		ARRAY_FLAG_USE_DYNAMIC_UPDATE = ARRAY_COMPRESS_INDEX << 3,
 
-		ARRAY_COMPRESS_DEFAULT = ARRAY_COMPRESS_VERTEX | ARRAY_COMPRESS_NORMAL | ARRAY_COMPRESS_TANGENT | ARRAY_COMPRESS_COLOR | ARRAY_COMPRESS_TEX_UV | ARRAY_COMPRESS_TEX_UV2 | ARRAY_COMPRESS_WEIGHTS
+		ARRAY_COMPRESS_DEFAULT = ARRAY_COMPRESS_NORMAL | ARRAY_COMPRESS_TANGENT | ARRAY_COMPRESS_COLOR | ARRAY_COMPRESS_TEX_UV | ARRAY_COMPRESS_TEX_UV2 | ARRAY_COMPRESS_WEIGHTS
 
 	};