Browse Source

Fix crash on import.

Juan Linietsky 6 years ago
parent
commit
24b16f3bf0

+ 1 - 0
editor/import/resource_importer_texture.cpp

@@ -213,6 +213,7 @@ void ResourceImporterTexture::get_import_options(List<ImportOption> *r_options,
 	r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "process/fix_alpha_border"), p_preset != PRESET_3D));
 	r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "process/premult_alpha"), false));
 	r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "process/invert_color"), false));
+	r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "process/HDR_as_SRGB"), 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));

+ 2 - 0
servers/visual/rasterizer/rasterizer.h

@@ -872,6 +872,7 @@ public:
 		bool update_when_visible;
 		//VS::MaterialBlendMode blend_mode;
 		int light_mask;
+		int z_final;
 		Vector<Command *> commands;
 		mutable bool custom_rect;
 		mutable bool rect_dirty;
@@ -1032,6 +1033,7 @@ public:
 			distance_field = false;
 			light_masked = false;
 			update_when_visible = false;
+			z_final = 0;
 		}
 		virtual ~Item() {
 			clear();

+ 21 - 5
servers/visual/rasterizer/rasterizer_canvas_rd.cpp

@@ -512,9 +512,10 @@ void RasterizerCanvasRD::_render_item(RD::DrawListID p_draw_list, const Item *p_
 	push_constant.specular_shininess = 0xFFFFFFFF;
 	push_constant.color_texture_pixel_size[0] = 0;
 	push_constant.color_texture_pixel_size[1] = 0;
-	push_constant.pad[0] = 0;
+
 	push_constant.pad[1] = 0;
 	push_constant.pad[2] = 0;
+	push_constant.pad[3] = 0;
 
 	PipelineVariants *pipeline_variants = &shader.pipeline_variants;
 
@@ -760,7 +761,9 @@ void RasterizerCanvasRD::_render_item(RD::DrawListID p_draw_list, const Item *p_
 					_bind_texture_binding(primitive->texture_binding.binding_id, p_draw_list);
 				}
 
-				for (uint32_t j = 0; j < primitive->point_count; j++) {
+				RD::get_singleton()->draw_list_bind_index_array(p_draw_list, primitive_arrays.index_array[MIN(3, primitive->point_count) - 1]);
+
+				for (uint32_t j = 0; j < MIN(3, primitive->point_count); j++) {
 					push_constant.points[j * 2 + 0] = primitive->points[j].x;
 					push_constant.points[j * 2 + 1] = primitive->points[j].y;
 					push_constant.uvs[j * 2 + 0] = primitive->uvs[j].x;
@@ -770,10 +773,23 @@ void RasterizerCanvasRD::_render_item(RD::DrawListID p_draw_list, const Item *p_
 					push_constant.colors[j * 2 + 1] = (uint32_t(Math::make_half_float(col.a)) << 16) | Math::make_half_float(col.b);
 				}
 				RD::get_singleton()->draw_list_set_push_constant(p_draw_list, &push_constant, sizeof(PushConstant));
+				RD::get_singleton()->draw_list_draw(p_draw_list, true);
 
-				RD::get_singleton()->draw_list_bind_index_array(p_draw_list, primitive_arrays.index_array[primitive->point_count - 1]);
+				if (primitive->point_count == 4) {
+					for (uint32_t j = 1; j < 3; j++) {
+						//second half of triangle
+						push_constant.points[j * 2 + 0] = primitive->points[j + 1].x;
+						push_constant.points[j * 2 + 1] = primitive->points[j + 1].y;
+						push_constant.uvs[j * 2 + 0] = primitive->uvs[j + 1].x;
+						push_constant.uvs[j * 2 + 1] = primitive->uvs[j + 1].y;
+						Color col = primitive->colors[j + 1] * p_modulate;
+						push_constant.colors[j * 2 + 0] = (uint32_t(Math::make_half_float(col.g)) << 16) | Math::make_half_float(col.r);
+						push_constant.colors[j * 2 + 1] = (uint32_t(Math::make_half_float(col.a)) << 16) | Math::make_half_float(col.b);
+					}
 
-				RD::get_singleton()->draw_list_draw(p_draw_list, true);
+					RD::get_singleton()->draw_list_set_push_constant(p_draw_list, &push_constant, sizeof(PushConstant));
+					RD::get_singleton()->draw_list_draw(p_draw_list, true);
+				}
 
 			} break;
 
@@ -1364,7 +1380,7 @@ RasterizerCanvasRD::RasterizerCanvasRD(RasterizerStorageRD *p_storage) {
 			RD::AttachmentFormat af;
 			af.format = RD::DATA_FORMAT_R8G8B8A8_UNORM;
 			af.samples = RD::TEXTURE_SAMPLES_1;
-			af.usage_flags = RD::TEXTURE_USAGE_COLOR_ATTACHMENT_BIT | RD::TEXTURE_USAGE_SAMPLING_BIT;
+			af.usage_flags = RD::TEXTURE_USAGE_COLOR_ATTACHMENT_BIT | RD::TEXTURE_USAGE_SAMPLING_BIT | RD::TEXTURE_USAGE_CAN_RETRIEVE_BIT;
 			Vector<RD::AttachmentFormat> formats;
 			formats.push_back(af);
 			shader.framebuffer_formats[RENDER_TARGET_FORMAT_8_BIT_INT] = RD::get_singleton()->framebuffer_format_create(formats);

+ 23 - 5
servers/visual/rasterizer/rasterizer_canvas_rd.h

@@ -179,6 +179,23 @@ class RasterizerCanvasRD : public RasterizerCanvas {
 	/**** MATERIALS ****/
 	/*******************/
 
+	/******************/
+	/**** LIGHTING ****/
+	/******************/
+
+	enum {
+		LIGHT_GRID_WIDTH = 16,
+		LIGHT_GRID_HEIGHT = 16,
+		MAX_LIGHTS = 128
+	};
+
+	struct {
+		RID grid_texture;
+		RID grid_buffer;
+		PoolVector<uint8_t> grid_texture_data;
+		PoolVector<uint8_t> grid_buffer_data;
+	} lighting;
+
 	/***************/
 	/**** STATE ****/
 	/***************/
@@ -213,16 +230,17 @@ class RasterizerCanvasRD : public RasterizerCanvas {
 				float ninepatch_margins[4];
 				float dst_rect[4];
 				float src_rect[4];
-				float color_texture_pixel_size[2];
-				uint32_t pad[6];
+				float pad[2];
 			};
 			//primitive
 			struct {
-				float points[8]; // vec2 points[4]
-				uint32_t colors[8]; // colors encoded as half
-				float uvs[8]; // vec2 points[4]
+				float points[6]; // vec2 points[4]
+				float uvs[6]; // vec2 points[4]
+				uint32_t colors[6]; // colors encoded as half
 			};
 		};
+		float color_texture_pixel_size[2];
+		uint32_t lights[4];
 	};
 
 	struct SkeletonUniform {

+ 1 - 10
servers/visual/rasterizer/shaders/canvas.glsl

@@ -59,20 +59,11 @@ void main() {
 		vertex = draw_data.points[1];
 		uv = draw_data.uvs[1];
 		color = vec4(unpackHalf2x16(draw_data.colors[2]),unpackHalf2x16(draw_data.colors[3]));
-	} else if (gl_VertexIndex==2) {
+	} else {
 		vertex = draw_data.points[2];
 		uv = draw_data.uvs[2];
 		color = vec4(unpackHalf2x16(draw_data.colors[4]),unpackHalf2x16(draw_data.colors[5]));
-
-	} else {
-		vertex = draw_data.points[3];
-		uv = draw_data.uvs[3];
-		color = vec4(unpackHalf2x16(draw_data.colors[6]),unpackHalf2x16(draw_data.colors[7]));
 	}
-//      this does not
-//	vec2 vertex = draw_data.points[gl_VertexIndex];
-//	vec2 uv = draw_data.uvs[gl_VertexIndex];
-//	vec4 color = vec4(unpackHalf2x16(draw_data.colors[gl_VertexIndex*2+0]),unpackHalf2x16(draw_data.colors[gl_VertexIndex*2+1]));
 	uvec4 bone_indices = uvec4(0,0,0,0);
 	vec4 bone_weights = vec4(0,0,0,0);
 

+ 9 - 5
servers/visual/rasterizer/shaders/canvas_uniforms_inc.glsl

@@ -21,6 +21,8 @@
 #define FLAGS_NINEPATCH_H_MODE_SHIFT 16
 #define FLAGS_NINEPATCH_V_MODE_SHIFT 18
 
+#define FLAGS_LIGHT_COUNT_SHIFT 20
+
 layout(push_constant, binding = 0, std430) uniform DrawData {
 	vec2 world_x;
 	vec2 world_y;
@@ -28,17 +30,19 @@ layout(push_constant, binding = 0, std430) uniform DrawData {
 	uint flags;
 	uint specular_shininess;
 #ifdef USE_PRIMITIVE
-	vec2 points[4];
-	uint colors[8];
-	vec2 uvs[4];
+	vec2 points[3];
+	vec2 uvs[3];
+	uint colors[6];
 #else
 	vec4 modulation;
 	vec4 ninepatch_margins;
 	vec4 dst_rect; //for built-in rect and UV
 	vec4 src_rect;
-	vec2 color_texture_pixel_size;
-	uint pad[6];
+	vec2 pad;
+
 #endif
+	vec2 color_texture_pixel_size;
+	uint lights[4];
 
 } draw_data;
 

+ 0 - 1
servers/visual/visual_server_canvas.h

@@ -54,7 +54,6 @@ public:
 		Vector2 ysort_pos;
 		VS::CanvasItemTextureFilter texture_filter;
 		VS::CanvasItemTextureRepeat texture_repeat;
-		int z_final;
 
 		Vector<Item *> child_items;