shithub: cstory

Download patch

ref: 663870ae7659b819412c8b82a6020821522896ca
parent: 6b8ffe2886418f886ff7c19ffe765e69e3719e6a
author: Clownacy <Clownacy@users.noreply.github.com>
date: Wed Sep 23 15:05:01 EDT 2020

Wii U: Offload tex-coord transformation to GPU

--- a/src/Backends/Rendering/WiiU.cpp
+++ b/src/Backends/Rendering/WiiU.cpp
@@ -33,8 +33,6 @@
 {
 	GX2Texture texture;
 	GX2ColorBuffer colour_buffer;
-	size_t width;
-	size_t height;
 	bool render_target;
 } RenderBackend_Surface;
 
@@ -339,6 +337,8 @@
 	// Disable blending
 	GX2SetColorControl(GX2_LOGIC_OP_COPY, 0, FALSE, TRUE);
 
+	const float texture_coordinate_transform[2] = {1.0f, 1.0f};
+
 	// Start drawing
 	WHBGfxBeginRender();
 
@@ -357,6 +357,9 @@
 	GX2SetVertexShader(shader_group_texture.vertexShader);
 	GX2SetPixelShader(shader_group_texture.pixelShader);
 
+	// Set shader uniforms
+	GX2SetVertexUniformReg(shader_group_texture.vertexShader->uniformVars[0].offset, 2, (uint32_t*)&texture_coordinate_transform);
+
 	// Bind a few things
 	GX2SetPixelSampler(&sampler, shader_group_texture.pixelShader->samplerVars[0].location);
 	GX2SetPixelTexture(&framebuffer_surface->texture, shader_group_texture.pixelShader->samplerVars[0].location);
@@ -383,6 +386,9 @@
 	GX2SetVertexShader(shader_group_texture.vertexShader);
 	GX2SetPixelShader(shader_group_texture.pixelShader);
 
+	// Set shader uniforms
+	GX2SetVertexUniformReg(shader_group_texture.vertexShader->uniformVars[0].offset, 2, (uint32_t*)&texture_coordinate_transform);
+
 	// Bind a few things
 	GX2SetPixelSampler(&sampler, shader_group_texture.pixelShader->samplerVars[0].location);
 	GX2SetPixelTexture(&framebuffer_surface->texture, shader_group_texture.pixelShader->samplerVars[0].location);
@@ -406,8 +412,6 @@
 
 	if (surface != NULL)
 	{
-		surface->width = width;
-		surface->height = height;
 		surface->render_target = render_target;
 
 		// Initialise texture
@@ -555,6 +559,10 @@
 		GX2SetVertexShader(shader->vertexShader);
 		GX2SetPixelShader(shader->pixelShader);
 
+		// Set shader uniforms (for some reason this vec2 needs padding to a vec4)
+		const float texture_coordinate_transform[4] = {1.0f / source_surface->texture.surface.width, 1.0f / source_surface->texture.surface.height, 1.0f, 1.0f};
+		GX2SetVertexUniformReg(shader_group_glyph.vertexShader->uniformVars[0].offset, 4, (uint32_t*)texture_coordinate_transform);
+
 		// Bind misc. data
 		GX2SetPixelSampler(&sampler, shader->pixelShader->samplerVars[0].location);
 		GX2SetPixelTexture(&source_surface->texture, shader->pixelShader->samplerVars[0].location);
@@ -570,10 +578,10 @@
 	if (vertex_buffer_slot != NULL)
 	{
 		// Set vertex position buffer
-		const float vertex_left = x * 2.0f / destination_surface->width - 1.0f;
-		const float vertex_top = y * -2.0f / destination_surface->height + 1.0f;
-		const float vertex_right = (x + (rect->right - rect->left)) * 2.0f / destination_surface->width - 1.0f;
-		const float vertex_bottom = (y + (rect->bottom - rect->top)) * -2.0f / destination_surface->height + 1.0f;
+		const float vertex_left = x * 2.0f / destination_surface->texture.surface.width - 1.0f;
+		const float vertex_top = y * -2.0f / destination_surface->texture.surface.height + 1.0f;
+		const float vertex_right = (x + (rect->right - rect->left)) * 2.0f / destination_surface->texture.surface.width - 1.0f;
+		const float vertex_bottom = (y + (rect->bottom - rect->top)) * -2.0f / destination_surface->texture.surface.height + 1.0f;
 
 		vertex_buffer_slot->vertices[0].position.x = vertex_left;
 		vertex_buffer_slot->vertices[0].position.y = vertex_top;
@@ -584,10 +592,10 @@
 		vertex_buffer_slot->vertices[3].position.x = vertex_left;
 		vertex_buffer_slot->vertices[3].position.y = vertex_bottom;
 
-		const float texture_left = rect->left / (float)source_surface->width;
-		const float texture_top = rect->top / (float)source_surface->height;
-		const float texture_right = rect->right / (float)source_surface->width;
-		const float texture_bottom = rect->bottom / (float)source_surface->height;
+		const float texture_left = rect->left;
+		const float texture_top = rect->top;
+		const float texture_right = rect->right;
+		const float texture_bottom = rect->bottom;
 
 		// Set texture coordinate buffer
 		vertex_buffer_slot->vertices[0].texture.x = texture_left;
@@ -645,10 +653,10 @@
 	if (vertex_buffer_slot != NULL)
 	{
 		// Set vertex position buffer
-		const float vertex_left = rect->left * 2.0f / surface->width - 1.0f;
-		const float vertex_top = rect->top * -2.0f / surface->height + 1.0f;
-		const float vertex_right = rect->right * 2.0f / surface->width - 1.0f;
-		const float vertex_bottom = rect->bottom * -2.0f / surface->height + 1.0f;
+		const float vertex_left = rect->left * 2.0f / surface->texture.surface.width - 1.0f;
+		const float vertex_top = rect->top * -2.0f / surface->texture.surface.height + 1.0f;
+		const float vertex_right = rect->right * 2.0f / surface->texture.surface.width - 1.0f;
+		const float vertex_bottom = rect->bottom * -2.0f / surface->texture.surface.height + 1.0f;
 
 		vertex_buffer_slot->vertices[0].position.x = vertex_left;
 		vertex_buffer_slot->vertices[0].position.y = vertex_top;
@@ -758,6 +766,10 @@
 		GX2SetVertexShader(shader_group_glyph.vertexShader);
 		GX2SetPixelShader(shader_group_glyph.pixelShader);
 
+		// Set shader uniforms (for some reason this vec2 needs padding to a vec4)
+		const float texture_coordinate_transform[4] = {1.0f / atlas->texture.surface.width, 1.0f / atlas->texture.surface.height, 1.0f, 1.0f};
+		GX2SetVertexUniformReg(shader_group_glyph.vertexShader->uniformVars[0].offset, 4, (uint32_t*)texture_coordinate_transform);
+
 		// Bind misc. data
 		GX2SetPixelSampler(&sampler, shader_group_glyph.pixelShader->samplerVars[0].location);
 		GX2SetPixelTexture(&atlas->texture, shader_group_glyph.pixelShader->samplerVars[0].location);
@@ -776,10 +788,10 @@
 	if (vertex_buffer_slot != NULL)
 	{
 		// Set vertex position buffer
-		const float vertex_left = x * 2.0f / glyph_destination_surface->width - 1.0f;
-		const float vertex_top = y * -2.0f / glyph_destination_surface->height + 1.0f;
-		const float vertex_right = (x + glyph_width) * 2.0f / glyph_destination_surface->width - 1.0f;
-		const float vertex_bottom = (y + glyph_height) * -2.0f / glyph_destination_surface->height + 1.0f;
+		const float vertex_left = x * 2.0f / glyph_destination_surface->texture.surface.width - 1.0f;
+		const float vertex_top = y * -2.0f / glyph_destination_surface->texture.surface.height + 1.0f;
+		const float vertex_right = (x + glyph_width) * 2.0f / glyph_destination_surface->texture.surface.width - 1.0f;
+		const float vertex_bottom = (y + glyph_height) * -2.0f / glyph_destination_surface->texture.surface.height + 1.0f;
 
 		vertex_buffer_slot->vertices[0].position.x = vertex_left;
 		vertex_buffer_slot->vertices[0].position.y = vertex_top;
@@ -790,10 +802,10 @@
 		vertex_buffer_slot->vertices[3].position.x = vertex_left;
 		vertex_buffer_slot->vertices[3].position.y = vertex_bottom;
 
-		const float texture_left = glyph_x / (float)glyph_atlas->texture.surface.width;
-		const float texture_top = glyph_y / (float)glyph_atlas->texture.surface.height;
-		const float texture_right = (glyph_x + glyph_width) / (float)glyph_atlas->texture.surface.width;
-		const float texture_bottom = (glyph_y + glyph_height) / (float)glyph_atlas->texture.surface.height;
+		const float texture_left = glyph_x;
+		const float texture_top = glyph_y;
+		const float texture_right = glyph_x + glyph_width;
+		const float texture_bottom = glyph_y + glyph_height;
 
 		// Set texture coordinate buffer
 		vertex_buffer_slot->vertices[0].texture.x = texture_left;
--- a/src/Backends/Rendering/WiiUShaders/glyph.gsh.h
+++ b/src/Backends/Rendering/WiiUShaders/glyph.gsh.h
@@ -1,26 +1,27 @@
-71,102,120,50,0,0,0,32,0,0,0,7,0,0,0,1,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,66,76,75,123,0,0,0,32,0,0,0,1,0,0,0,0,0,0,0,3,0,0,1,192,0,0,0,0,0,0,0,0,
+71,102,120,50,0,0,0,32,0,0,0,7,0,0,0,1,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,66,76,75,123,0,0,0,32,0,0,0,1,0,0,0,0,0,0,0,3,0,0,1,252,0,0,0,0,0,0,0,0,
 0,0,1,3,0,0,0,0,0,0,0,0,0,0,0,1,255,255,255,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,255,255,255,252,
 0,0,0,2,0,0,0,1,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,
 0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,
-0,0,0,255,0,0,0,0,0,0,0,14,0,0,0,16,0,0,1,24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,2,208,96,1,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,202,112,1,84,0,0,0,9,0,0,0,0,
-0,0,0,1,202,112,1,112,0,0,0,9,0,0,0,0,0,0,0,0,105,110,112,117,116,95,116,101,120,116,117,114,101,95,99,111,111,114,100,105,110,97,116,101,115,0,0,0,105,110,112,117,116,95,118,101,114,116,101,120,95,99,111,111,
-114,100,105,110,97,116,101,115,0,0,0,0,208,96,1,8,202,112,1,52,202,112,1,68,125,66,76,75,0,0,0,40,0,0,0,0,0,0,1,140,208,96,0,0,0,0,0,56,208,96,1,84,0,0,0,0,0,0,0,3,208,96,1,140,
-66,76,75,123,0,0,0,32,0,0,0,1,0,0,0,0,0,0,0,5,0,0,1,24,0,0,0,1,0,0,0,0,0,0,0,0,0,0,128,9,32,0,0,0,0,0,4,160,60,32,1,0,136,6,0,148,0,192,0,0,136,4,0,20,
-34,0,0,0,0,0,0,160,0,0,0,0,0,0,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,255,0,0,0,0,0,0,0,14,0,0,0,16,0,0,1,24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,208,96,1,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,2,208,96,1,72,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,202,112,1,104,0,0,0,9,0,0,0,1,
+0,0,0,0,255,255,255,255,202,112,1,136,0,0,0,9,0,0,0,0,0,0,0,1,202,112,1,164,0,0,0,11,0,0,0,0,0,0,0,0,116,101,120,116,117,114,101,95,99,111,111,114,100,105,110,97,116,101,95,116,114,97,110,115,
+102,111,114,109,0,0,0,0,105,110,112,117,116,95,116,101,120,116,117,114,101,95,99,111,111,114,100,105,110,97,116,101,115,0,0,0,105,110,112,117,116,95,118,101,114,116,101,120,95,99,111,111,114,100,105,110,97,116,101,115,0,0,0,0,
+208,96,0,232,208,96,1,8,202,112,1,52,202,112,1,72,202,112,1,88,125,66,76,75,0,0,0,40,0,0,0,0,0,0,1,192,208,96,0,0,0,0,0,88,208,96,1,104,0,0,0,0,0,0,0,5,208,96,1,192,66,76,75,123,
+0,0,0,32,0,0,0,1,0,0,0,0,0,0,0,5,0,0,1,24,0,0,0,1,0,0,0,0,0,0,0,0,0,0,128,9,32,0,0,0,0,0,4,160,60,32,1,0,136,6,0,148,0,192,0,0,136,4,0,20,34,0,0,0,
+0,0,0,160,0,0,0,0,0,0,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,144,12,32,0,1,4,0,128,144,12,32,32,0,0,0,128,0,13,0,0,66,76,75,123,0,0,0,32,
-0,0,0,1,0,0,0,0,0,0,0,6,0,0,1,76,0,0,0,2,0,0,0,0,0,0,0,1,0,0,0,2,20,0,0,1,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,32,0,144,0,32,0,1,4,160,128,144,0,32,32,0,0,0,128,0,13,0,0,66,76,75,123,0,0,0,32,0,0,0,1,
+0,0,0,0,0,0,0,6,0,0,1,76,0,0,0,2,0,0,0,0,0,0,0,1,0,0,0,2,20,0,0,1,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,1,0,0,0,16,0,0,0,0,0,0,1,144,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,208,96,0,232,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,208,96,0,252,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-202,112,1,8,0,0,0,11,0,0,0,1,0,0,0,0,255,255,255,255,202,112,1,16,0,0,0,1,0,0,0,0,99,111,108,111,117,114,0,0,116,101,120,0,208,96,0,188,208,96,0,212,202,112,0,232,202,112,0,252,125,66,76,75,
-0,0,0,40,0,0,0,0,0,0,1,20,208,96,0,0,0,0,0,12,208,96,1,8,0,0,0,0,0,0,0,4,208,96,1,20,66,76,75,123,0,0,0,32,0,0,0,1,0,0,0,0,0,0,0,7,0,0,1,144,0,0,0,3,
-0,0,0,0,48,0,0,0,0,0,192,128,32,0,0,0,0,0,12,160,0,0,0,0,136,6,32,148,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,1,0,0,0,16,0,0,0,0,0,0,1,144,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,208,96,0,232,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,208,96,0,252,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,202,112,1,8,
+0,0,0,11,0,0,0,1,0,0,0,0,255,255,255,255,202,112,1,16,0,0,0,1,0,0,0,0,99,111,108,111,117,114,0,0,116,101,120,0,208,96,0,188,208,96,0,212,202,112,0,232,202,112,0,252,125,66,76,75,0,0,0,40,
+0,0,0,0,0,0,1,20,208,96,0,0,0,0,0,12,208,96,1,8,0,0,0,0,0,0,0,4,208,96,1,20,66,76,75,123,0,0,0,32,0,0,0,1,0,0,0,0,0,0,0,7,0,0,1,144,0,0,0,3,0,0,0,0,
+48,0,0,0,0,0,192,128,32,0,0,0,0,0,12,160,0,0,0,0,136,6,32,148,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,1,0,0,144,12,0,0,0,5,0,0,144,12,0,32,0,9,0,0,144,12,0,64,0,12,160,129,144,0,0,96,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,1,0,0,144,12,0,0,0,5,0,0,144,12,0,32,0,9,0,0,144,12,0,64,0,12,160,129,144,0,0,96,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,16,0,0,0,0,254,3,240,0,0,128,16,0,0,0,0,66,76,75,123,0,0,0,32,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,4,0,0,0,0
+16,0,0,0,0,254,3,240,0,0,128,16,0,0,0,0,66,76,75,123,0,0,0,32,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,4,0,0,0,0
binary files a/src/Backends/Rendering/WiiUShaders/shader sources/glyph.gsh b/src/Backends/Rendering/WiiUShaders/shader sources/glyph.gsh differ
binary files a/src/Backends/Rendering/WiiUShaders/shader sources/texture.gsh b/src/Backends/Rendering/WiiUShaders/shader sources/texture.gsh differ
--- a/src/Backends/Rendering/WiiUShaders/shader sources/texture.vert
+++ b/src/Backends/Rendering/WiiUShaders/shader sources/texture.vert
@@ -1,4 +1,5 @@
 #version 150 core
+layout(location = 0) uniform vec2 texture_coordinate_transform;
 layout(location = 0) in vec4 input_vertex_coordinates;
 layout(location = 1) in vec2 input_texture_coordinates;
 out vec2 texture_coordinates; 
@@ -5,5 +6,5 @@
 void main() 
 { 
 	gl_Position = input_vertex_coordinates; 
-	texture_coordinates = input_texture_coordinates; 
+	texture_coordinates = input_texture_coordinates * texture_coordinate_transform; 
 } 
--- a/src/Backends/Rendering/WiiUShaders/shader sources/texture.vsh
+++ b/src/Backends/Rendering/WiiUShaders/shader sources/texture.vsh
@@ -1,17 +1,25 @@
 ; $MODE = "UniformRegister"
+
+; $UNIFORM_VARS[0].name = "texture_coordinate_transform"
+; $UNIFORM_VARS[0].type = "vec2"
+; $UNIFORM_VARS[0].count = 1
+; $UNIFORM_VARS[0].offset = 0
+; $UNIFORM_VARS[0].block = -1
+
 ; $ATTRIB_VARS[0].name = "input_texture_coordinates"
 ; $ATTRIB_VARS[0].type = "vec2"
 ; $ATTRIB_VARS[0].location = 1
 ; $ATTRIB_VARS[1].name = "input_vertex_coordinates"
-; $ATTRIB_VARS[1].type = "vec2"
+; $ATTRIB_VARS[1].type = "vec4"
 ; $ATTRIB_VARS[1].location = 0
+
 ; $NUM_SPI_VS_OUT_ID = 1
 ; $SPI_VS_OUT_ID[0].SEMANTIC_0 = 0
 
 00 CALL_FS NO_BARRIER 
 01 ALU: ADDR(32) CNT(2) 
-      0  x: MOV         R1.x,  R1.x      
-         y: MOV         R1.y,  R1.y      
+      0  x: MUL         R1.x,  R1.x,  C0.x      
+         y: MUL         R1.y,  R1.y,  C0.y      
 02 EXP_DONE: POS0, R2
 03 EXP_DONE: PARAM0, R1.xyzz  NO_BARRIER 
 04 ALU: ADDR(34) CNT(1) 
@@ -18,6 +26,7 @@
       1  x: NOP         ____      
 05 NOP NO_BARRIER 
 END_OF_PROGRAM
+
 
 
 
binary files a/src/Backends/Rendering/WiiUShaders/shader sources/texture_colour_key.gsh b/src/Backends/Rendering/WiiUShaders/shader sources/texture_colour_key.gsh differ
--- a/src/Backends/Rendering/WiiUShaders/texture.gsh.h
+++ b/src/Backends/Rendering/WiiUShaders/texture.gsh.h
@@ -1,24 +1,25 @@
-71,102,120,50,0,0,0,32,0,0,0,7,0,0,0,1,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,66,76,75,123,0,0,0,32,0,0,0,1,0,0,0,0,0,0,0,3,0,0,1,192,0,0,0,0,0,0,0,0,
+71,102,120,50,0,0,0,32,0,0,0,7,0,0,0,1,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,66,76,75,123,0,0,0,32,0,0,0,1,0,0,0,0,0,0,0,3,0,0,1,252,0,0,0,0,0,0,0,0,
 0,0,1,3,0,0,0,0,0,0,0,0,0,0,0,1,255,255,255,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,255,255,255,252,
 0,0,0,2,0,0,0,1,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,
 0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,
-0,0,0,255,0,0,0,0,0,0,0,14,0,0,0,16,0,0,1,24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,2,208,96,1,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,202,112,1,84,0,0,0,9,0,0,0,0,
-0,0,0,1,202,112,1,112,0,0,0,9,0,0,0,0,0,0,0,0,105,110,112,117,116,95,116,101,120,116,117,114,101,95,99,111,111,114,100,105,110,97,116,101,115,0,0,0,105,110,112,117,116,95,118,101,114,116,101,120,95,99,111,111,
-114,100,105,110,97,116,101,115,0,0,0,0,208,96,1,8,202,112,1,52,202,112,1,68,125,66,76,75,0,0,0,40,0,0,0,0,0,0,1,140,208,96,0,0,0,0,0,56,208,96,1,84,0,0,0,0,0,0,0,3,208,96,1,140,
-66,76,75,123,0,0,0,32,0,0,0,1,0,0,0,0,0,0,0,5,0,0,1,24,0,0,0,1,0,0,0,0,0,0,0,0,0,0,128,9,32,0,0,0,0,0,4,160,60,32,1,0,136,6,0,148,0,192,0,0,136,4,0,20,
-34,0,0,0,0,0,0,160,0,0,0,0,0,0,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,255,0,0,0,0,0,0,0,14,0,0,0,16,0,0,1,24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,208,96,1,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,2,208,96,1,72,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,202,112,1,104,0,0,0,9,0,0,0,1,
+0,0,0,0,255,255,255,255,202,112,1,136,0,0,0,9,0,0,0,0,0,0,0,1,202,112,1,164,0,0,0,11,0,0,0,0,0,0,0,0,116,101,120,116,117,114,101,95,99,111,111,114,100,105,110,97,116,101,95,116,114,97,110,115,
+102,111,114,109,0,0,0,0,105,110,112,117,116,95,116,101,120,116,117,114,101,95,99,111,111,114,100,105,110,97,116,101,115,0,0,0,105,110,112,117,116,95,118,101,114,116,101,120,95,99,111,111,114,100,105,110,97,116,101,115,0,0,0,0,
+208,96,0,232,208,96,1,8,202,112,1,52,202,112,1,72,202,112,1,88,125,66,76,75,0,0,0,40,0,0,0,0,0,0,1,192,208,96,0,0,0,0,0,88,208,96,1,104,0,0,0,0,0,0,0,5,208,96,1,192,66,76,75,123,
+0,0,0,32,0,0,0,1,0,0,0,0,0,0,0,5,0,0,1,24,0,0,0,1,0,0,0,0,0,0,0,0,0,0,128,9,32,0,0,0,0,0,4,160,60,32,1,0,136,6,0,148,0,192,0,0,136,4,0,20,34,0,0,0,
+0,0,0,160,0,0,0,0,0,0,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,144,12,32,0,1,4,0,128,144,12,32,32,0,0,0,128,0,13,0,0,66,76,75,123,0,0,0,32,
-0,0,0,1,0,0,0,0,0,0,0,6,0,0,1,88,0,0,0,2,0,0,0,0,0,0,0,1,0,0,0,2,20,0,0,1,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,32,0,144,0,32,0,1,4,160,128,144,0,32,32,0,0,0,128,0,13,0,0,66,76,75,123,0,0,0,32,0,0,0,1,
+0,0,0,0,0,0,0,6,0,0,1,88,0,0,0,2,0,0,0,0,0,0,0,1,0,0,0,2,20,0,0,1,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,1,0,0,0,16,0,0,0,0,0,0,1,16,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,208,96,0,232,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,208,96,0,252,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-202,112,1,8,0,0,0,9,0,0,0,1,0,0,0,0,255,255,255,255,202,112,1,28,0,0,0,1,0,0,0,0,116,101,120,116,117,114,101,95,99,111,111,114,100,105,110,97,116,101,115,0,116,101,120,0,208,96,0,188,208,96,0,212,
-202,112,0,232,202,112,0,252,125,66,76,75,0,0,0,40,0,0,0,0,0,0,1,32,208,96,0,0,0,0,0,24,208,96,1,8,0,0,0,0,0,0,0,4,208,96,1,32,66,76,75,123,0,0,0,32,0,0,0,1,0,0,0,0,
-0,0,0,7,0,0,1,16,0,0,0,3,0,0,0,0,32,0,0,0,0,0,192,128,0,0,0,0,136,6,32,148,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,1,0,0,0,16,0,0,0,0,0,0,1,16,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,208,96,0,232,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,208,96,0,252,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,202,112,1,8,
+0,0,0,9,0,0,0,1,0,0,0,0,255,255,255,255,202,112,1,28,0,0,0,1,0,0,0,0,116,101,120,116,117,114,101,95,99,111,111,114,100,105,110,97,116,101,115,0,116,101,120,0,208,96,0,188,208,96,0,212,202,112,0,232,
+202,112,0,252,125,66,76,75,0,0,0,40,0,0,0,0,0,0,1,32,208,96,0,0,0,0,0,24,208,96,1,8,0,0,0,0,0,0,0,4,208,96,1,32,66,76,75,123,0,0,0,32,0,0,0,1,0,0,0,0,0,0,0,7,
+0,0,1,16,0,0,0,3,0,0,0,0,32,0,0,0,0,0,192,128,0,0,0,0,136,6,32,148,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,0,0,0,16,13,240,0,0,128,16,0,0,0,0,66,76,75,123,0,0,0,32,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,4,0,0,0,0
+0,0,0,0,0,0,0,0,0,0,0,0,16,0,0,0,0,16,13,240,0,0,128,16,0,0,0,0,66,76,75,123,0,0,0,32,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,4,0,0,0,0
--- a/src/Backends/Rendering/WiiUShaders/texture_colour_key.gsh.h
+++ b/src/Backends/Rendering/WiiUShaders/texture_colour_key.gsh.h
@@ -1,26 +1,27 @@
-71,102,120,50,0,0,0,32,0,0,0,7,0,0,0,1,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,66,76,75,123,0,0,0,32,0,0,0,1,0,0,0,0,0,0,0,3,0,0,1,192,0,0,0,0,0,0,0,0,
+71,102,120,50,0,0,0,32,0,0,0,7,0,0,0,1,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,66,76,75,123,0,0,0,32,0,0,0,1,0,0,0,0,0,0,0,3,0,0,1,252,0,0,0,0,0,0,0,0,
 0,0,1,3,0,0,0,0,0,0,0,0,0,0,0,1,255,255,255,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,255,255,255,252,
 0,0,0,2,0,0,0,1,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,
 0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,
-0,0,0,255,0,0,0,0,0,0,0,14,0,0,0,16,0,0,1,24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,2,208,96,1,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,202,112,1,84,0,0,0,9,0,0,0,0,
-0,0,0,1,202,112,1,112,0,0,0,9,0,0,0,0,0,0,0,0,105,110,112,117,116,95,116,101,120,116,117,114,101,95,99,111,111,114,100,105,110,97,116,101,115,0,0,0,105,110,112,117,116,95,118,101,114,116,101,120,95,99,111,111,
-114,100,105,110,97,116,101,115,0,0,0,0,208,96,1,8,202,112,1,52,202,112,1,68,125,66,76,75,0,0,0,40,0,0,0,0,0,0,1,140,208,96,0,0,0,0,0,56,208,96,1,84,0,0,0,0,0,0,0,3,208,96,1,140,
-66,76,75,123,0,0,0,32,0,0,0,1,0,0,0,0,0,0,0,5,0,0,1,24,0,0,0,1,0,0,0,0,0,0,0,0,0,0,128,9,32,0,0,0,0,0,4,160,60,32,1,0,136,6,0,148,0,192,0,0,136,4,0,20,
-34,0,0,0,0,0,0,160,0,0,0,0,0,0,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,255,0,0,0,0,0,0,0,14,0,0,0,16,0,0,1,24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,208,96,1,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,2,208,96,1,72,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,202,112,1,104,0,0,0,9,0,0,0,1,
+0,0,0,0,255,255,255,255,202,112,1,136,0,0,0,9,0,0,0,0,0,0,0,1,202,112,1,164,0,0,0,11,0,0,0,0,0,0,0,0,116,101,120,116,117,114,101,95,99,111,111,114,100,105,110,97,116,101,95,116,114,97,110,115,
+102,111,114,109,0,0,0,0,105,110,112,117,116,95,116,101,120,116,117,114,101,95,99,111,111,114,100,105,110,97,116,101,115,0,0,0,105,110,112,117,116,95,118,101,114,116,101,120,95,99,111,111,114,100,105,110,97,116,101,115,0,0,0,0,
+208,96,0,232,208,96,1,8,202,112,1,52,202,112,1,72,202,112,1,88,125,66,76,75,0,0,0,40,0,0,0,0,0,0,1,192,208,96,0,0,0,0,0,88,208,96,1,104,0,0,0,0,0,0,0,5,208,96,1,192,66,76,75,123,
+0,0,0,32,0,0,0,1,0,0,0,0,0,0,0,5,0,0,1,24,0,0,0,1,0,0,0,0,0,0,0,0,0,0,128,9,32,0,0,0,0,0,4,160,60,32,1,0,136,6,0,148,0,192,0,0,136,4,0,20,34,0,0,0,
+0,0,0,160,0,0,0,0,0,0,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,144,12,32,0,1,4,0,128,144,12,32,32,0,0,0,128,0,13,0,0,66,76,75,123,0,0,0,32,
-0,0,0,1,0,0,0,0,0,0,0,6,0,0,1,88,0,0,0,2,0,0,0,0,0,0,0,1,0,0,0,2,20,0,0,1,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,32,0,144,0,32,0,1,4,160,128,144,0,32,32,0,0,0,128,0,13,0,0,66,76,75,123,0,0,0,32,0,0,0,1,
+0,0,0,0,0,0,0,6,0,0,1,88,0,0,0,2,0,0,0,0,0,0,0,1,0,0,0,2,20,0,0,1,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,1,0,0,0,16,0,0,0,0,0,0,1,144,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,208,96,0,232,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,208,96,0,252,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-202,112,1,8,0,0,0,9,0,0,0,1,0,0,0,0,255,255,255,255,202,112,1,28,0,0,0,1,0,0,0,0,116,101,120,116,117,114,101,95,99,111,111,114,100,105,110,97,116,101,115,0,116,101,120,0,208,96,0,188,208,96,0,212,
-202,112,0,232,202,112,0,252,125,66,76,75,0,0,0,40,0,0,0,0,0,0,1,32,208,96,0,0,0,0,0,24,208,96,1,8,0,0,0,0,0,0,0,4,208,96,1,32,66,76,75,123,0,0,0,32,0,0,0,1,0,0,0,0,
-0,0,0,7,0,0,1,144,0,0,0,3,0,0,0,0,48,0,0,0,0,0,192,128,32,0,0,0,0,0,8,160,0,0,0,0,136,6,32,148,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,1,0,0,0,16,0,0,0,0,0,0,1,144,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,208,96,0,232,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,208,96,0,252,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,202,112,1,8,
+0,0,0,9,0,0,0,1,0,0,0,0,255,255,255,255,202,112,1,28,0,0,0,1,0,0,0,0,116,101,120,116,117,114,101,95,99,111,111,114,100,105,110,97,116,101,115,0,116,101,120,0,208,96,0,188,208,96,0,212,202,112,0,232,
+202,112,0,252,125,66,76,75,0,0,0,40,0,0,0,0,0,0,1,32,208,96,0,0,0,0,0,24,208,96,1,8,0,0,0,0,0,0,0,4,208,96,1,32,66,76,75,123,0,0,0,32,0,0,0,1,0,0,0,0,0,0,0,7,
+0,0,1,144,0,0,0,3,0,0,0,0,48,0,0,0,0,0,192,128,32,0,0,0,0,0,8,160,0,0,0,0,136,6,32,148,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,128,0,0,0,32,0,200,159,128,0,0,0,0,254,0,31,128,0,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,128,0,0,0,32,0,200,159,128,0,0,0,0,254,0,31,128,0,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,0,0,0,16,13,240,0,0,128,16,0,0,0,0,66,76,75,123,0,0,0,32,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,4,0,0,0,0
+0,0,0,0,0,0,0,0,0,0,0,0,16,0,0,0,0,16,13,240,0,0,128,16,0,0,0,0,66,76,75,123,0,0,0,32,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,4,0,0,0,0