Browse Source

Merge pull request #15051 from binbitten/bug-fixes

Add missing image format RGB10A2. Fixes #14964
Rémi Verschelde 7 years ago
parent
commit
6d812ad27f
3 changed files with 33 additions and 1 deletions
  1. 24 0
      core/image.cpp
  2. 1 0
      core/image.h
  3. 8 1
      drivers/gles3/rasterizer_storage_gles3.cpp

+ 24 - 0
core/image.cpp

@@ -47,6 +47,7 @@ const char *Image::format_names[Image::FORMAT_MAX] = {
 	"RGBA8",
 	"RGBA4444",
 	"RGBA5551",
+	"RGB10A2",
 	"RFloat", //float
 	"RGFloat",
 	"RGBFloat",
@@ -112,6 +113,7 @@ int Image::get_format_pixel_size(Format p_format) {
 		case FORMAT_RGBA8: return 4;
 		case FORMAT_RGBA4444: return 2;
 		case FORMAT_RGBA5551: return 2;
+		case FORMAT_RGB10A2: return 4;
 		case FORMAT_RF:
 			return 4; //float
 		case FORMAT_RGF: return 8;
@@ -1978,6 +1980,15 @@ Color Image::get_pixel(int p_x, int p_y) const {
 			float a = ((u >> 15) & 0x1) / 1.0;
 			return Color(r, g, b, a);
 		} break;
+		case FORMAT_RGB10A2: {
+
+			uint32_t u = ((uint32_t *)ptr)[ofs];
+			float r = (u & 0x3FF) / 1023.0;
+			float g = ((u >> 10) & 0x3FF) / 1023.0;
+			float b = ((u >> 20) & 0x3FF) / 1023.0;
+			float a = ((u >> 30) & 0x3) / 3.0;
+			return Color(r, g, b, a);
+		} break;
 		case FORMAT_RF: {
 
 			float r = ((float *)ptr)[ofs];
@@ -2122,6 +2133,18 @@ void Image::set_pixel(int p_x, int p_y, const Color &p_color) {
 
 			((uint16_t *)ptr)[ofs] = rgba;
 
+		} break;
+		case FORMAT_RGB10A2: {
+
+			uint32_t rgba = 0;
+
+			rgba = uint32_t(CLAMP(p_color.r * 1023.0, 0, 1023));
+			rgba |= uint32_t(CLAMP(p_color.g * 1023.0, 0, 1023)) << 10;
+			rgba |= uint32_t(CLAMP(p_color.b * 1023.0, 0, 1023)) << 20;
+			rgba |= uint32_t(CLAMP(p_color.a * 3.0, 0, 3)) << 30;
+
+			((uint32_t *)ptr)[ofs] = rgba;
+
 		} break;
 		case FORMAT_RF: {
 
@@ -2300,6 +2323,7 @@ void Image::_bind_methods() {
 	BIND_ENUM_CONSTANT(FORMAT_RGBA8);
 	BIND_ENUM_CONSTANT(FORMAT_RGBA4444);
 	BIND_ENUM_CONSTANT(FORMAT_RGBA5551);
+	BIND_ENUM_CONSTANT(FORMAT_RGB10A2);
 	BIND_ENUM_CONSTANT(FORMAT_RF); //float
 	BIND_ENUM_CONSTANT(FORMAT_RGF);
 	BIND_ENUM_CONSTANT(FORMAT_RGBF);

+ 1 - 0
core/image.h

@@ -68,6 +68,7 @@ public:
 		FORMAT_RGBA8,
 		FORMAT_RGBA4444,
 		FORMAT_RGBA5551,
+		FORMAT_RGB10A2,
 		FORMAT_RF, //float
 		FORMAT_RGF,
 		FORMAT_RGBF,

+ 8 - 1
drivers/gles3/rasterizer_storage_gles3.cpp

@@ -192,6 +192,13 @@ Ref<Image> RasterizerStorageGLES3::_get_gl_image_and_format(const Ref<Image> &p_
 			r_gl_format = GL_RGBA;
 			r_gl_type = GL_UNSIGNED_SHORT_5_5_5_1;
 
+		} break;
+		case Image::FORMAT_RGB10A2: {
+
+			r_gl_internal_format = GL_RGB10_A2;
+			r_gl_format = GL_RGBA;
+			r_gl_type = GL_UNSIGNED_INT_2_10_10_10_REV;
+
 		} break;
 		case Image::FORMAT_RF: {
 
@@ -6090,7 +6097,7 @@ void RasterizerStorageGLES3::_render_target_allocate(RenderTarget *rt) {
 			color_internal_format = GL_RGB10_A2;
 			color_format = GL_RGBA;
 			color_type = GL_UNSIGNED_INT_2_10_10_10_REV;
-			image_format = Image::FORMAT_RGBA8;
+			image_format = Image::FORMAT_RGB10A2;
 		} else {
 
 			color_internal_format = GL_RGBA8;