void WriteRGBA8Encoder(char* p,API_TYPE ApiType)
{
	Write32BitSwizzler(p, GX_TF_RGBA8,ApiType);

	WRITE(p, "  float cl1 = xb - (halfxb * 2);\n");
	WRITE(p, "  float cl0 = 1.0f - cl1;\n");

	WRITE(p, "  float4 texSample;\n");
	WRITE(p, "  float4 color0;\n");
	WRITE(p, "  float4 color1;\n");

	WriteSampleColor(p, "rgba", "texSample",ApiType);
	WRITE(p, "  color0.b = texSample.a;\n");
	WRITE(p, "  color0.g = texSample.r;\n");
	WRITE(p, "  color1.b = texSample.g;\n");
	WRITE(p, "  color1.g = texSample.b;\n");

	WriteIncrementSampleX(p,ApiType);

	WriteSampleColor(p, "rgba", "texSample",ApiType);
	WRITE(p, "  color0.r = texSample.a;\n");
	WRITE(p, "  color0.a = texSample.r;\n");
	WRITE(p, "  color1.r = texSample.g;\n");
	WRITE(p, "  color1.a = texSample.b;\n");

	WRITE(p, "  ocol0 = (cl0 * color0) + (cl1 * color1);\n");

	WriteEncoderEnd(p);
}
void WriteRGBA8Encoder(char* p)
{
	Write32BitSwizzler(p, GX_TF_RGBA8);

	WRITE(p, "  float cl1 = xb - (halfxb * 2.0f);\n");
	WRITE(p, "  float cl0 = 1.0f - cl1;\n");

	WRITE(p, "  float4 texSample;\n");
	WRITE(p, "  float4 color0;\n");
	WRITE(p, "  float4 color1;\n");

	WriteSampleColor(p, "rgba", "texSample", 0);
	WRITE(p, "  color0.b = texSample.a;\n");
	WRITE(p, "  color0.g = texSample.r;\n");
	WRITE(p, "  color1.b = texSample.g;\n");
	WRITE(p, "  color1.g = texSample.b;\n");

	WriteSampleColor(p, "rgba", "texSample", 1);
	WRITE(p, "  color0.r = texSample.a;\n");
	WRITE(p, "  color0.a = texSample.r;\n");
	WRITE(p, "  color1.r = texSample.g;\n");
	WRITE(p, "  color1.a = texSample.b;\n");

	WRITE(p, "  ocol0 = (cl0 * color0) + (cl1 * color1);\n");

	WriteEncoderEnd(p);
}
void WriteZ24Encoder(char* p)
{
	Write32BitSwizzler(p, GX_TF_Z24X8);

	WRITE(p, "  float cl = xb - (halfxb * 2.0f);\n");

	WRITE(p, "  float depth0;\n");
	WRITE(p, "  float depth1;\n");
	WRITE(p, "  float3 expanded0;\n");
	WRITE(p, "  float3 expanded1;\n");

	WriteSampleColor(p, "b", "depth0", 0);
	WRITE(p, " depth0 = 1.0f - depth0;\n");
	WriteSampleColor(p, "b", "depth1", 1);
	WRITE(p, " depth1 = 1.0f - depth1;\n");

	for (int i = 0; i < 2; i++)
	{
		WRITE(p, "  depth%i *= 16777215.0f;\n", i);

		WRITE(p, "  expanded%i.r = floor(depth%i / (256.0f * 256.0f));\n", i, i);
		WRITE(p, "  depth%i -= expanded%i.r * 256.0f * 256.0f;\n", i, i);
		WRITE(p, "  expanded%i.g = floor(depth%i / 256.0f);\n", i, i);
		WRITE(p, "  depth%i -= expanded%i.g * 256.0f;\n", i, i);
		WRITE(p, "  expanded%i.b = depth%i;\n", i, i);
	}

	WRITE(p, "  if(cl > 0.5f) {\n");
	// upper 16
	WRITE(p, "     ocol0.b = expanded0.g / 255.0f;\n");
	WRITE(p, "     ocol0.g = expanded0.b / 255.0f;\n");
	WRITE(p, "     ocol0.r = expanded1.g / 255.0f;\n");
	WRITE(p, "     ocol0.a = expanded1.b / 255.0f;\n");
	WRITE(p, "  } else {\n");
	// lower 8
	WRITE(p, "     ocol0.b = 1.0f;\n");
	WRITE(p, "     ocol0.g = expanded0.r / 255.0f;\n");
	WRITE(p, "     ocol0.r = 1.0f;\n");
	WRITE(p, "     ocol0.a = expanded1.r / 255.0f;\n");
	WRITE(p, "  }\n");

	WriteEncoderEnd(p);
}
void WriteZ24Encoder(char* p, API_TYPE ApiType)
{
	Write32BitSwizzler(p, GX_TF_Z24X8,ApiType);

	WRITE(p, "  float cl = xb - (halfxb * 2);\n");

	WRITE(p, "  float depth0;\n");
    WRITE(p, "  float depth1;\n");
    WRITE(p, "  float3 expanded0;\n");
    WRITE(p, "  float3 expanded1;\n");

	WriteSampleColor(p, "b", "depth0",ApiType);
    WriteIncrementSampleX(p,ApiType);
    WriteSampleColor(p, "b", "depth1",ApiType);

    for (int i = 0; i < 2; i++)
    {
        WRITE(p, "  depth%i *= 16777215.0f;\n", i);

        WRITE(p, "  expanded%i.r = floor(depth%i / (256 * 256));\n", i, i);
        WRITE(p, "  depth%i -= expanded%i.r * 256 * 256;\n", i, i);
        WRITE(p, "  expanded%i.g = floor(depth%i / 256);\n", i, i);
        WRITE(p, "  depth%i -= expanded%i.g * 256;\n", i, i);
        WRITE(p, "  expanded%i.b = depth%i;\n", i, i);
    }

    WRITE(p, "  if(cl > 0.5f) {\n");
    // upper 16
    WRITE(p, "     ocol0.b = expanded0.g / 255;\n");
    WRITE(p, "     ocol0.g = expanded0.b / 255;\n");
    WRITE(p, "     ocol0.r = expanded1.g / 255;\n");
    WRITE(p, "     ocol0.a = expanded1.b / 255;\n");
    WRITE(p, "  } else {\n");
    // lower 8
    WRITE(p, "     ocol0.b = 1.0f;\n");
    WRITE(p, "     ocol0.g = expanded0.r / 255;\n");
    WRITE(p, "     ocol0.r = 1.0f;\n");
    WRITE(p, "     ocol0.a = expanded1.r / 255;\n");
    WRITE(p, "  }\n");

    WriteEncoderEnd(p);
}