2024-08-11 14:20:04 +02:00
|
|
|
Shader "CrispyPin/Quine" {
|
|
|
|
// https://git.crispypin.cc/CrispyPin/cvr-props/src/branch/main/Assets/test/quine.shader
|
2024-08-11 12:24:31 +02:00
|
|
|
Properties {}
|
|
|
|
SubShader {
|
|
|
|
Tags { "RenderType" = "Opaque" }
|
|
|
|
LOD 100
|
|
|
|
Pass {
|
|
|
|
CGPROGRAM
|
|
|
|
#pragma vertex vert
|
|
|
|
#pragma fragment frag
|
|
|
|
|
|
|
|
#include "UnityCG.cginc"
|
|
|
|
|
2024-08-11 14:20:04 +02:00
|
|
|
#define ROWS 104
|
2024-08-11 12:24:31 +02:00
|
|
|
#define COLS ROWS*2
|
|
|
|
|
|
|
|
struct appdata {
|
|
|
|
float4 vertex : POSITION;
|
|
|
|
float2 uv : TEXCOORD0;
|
|
|
|
UNITY_VERTEX_INPUT_INSTANCE_ID
|
|
|
|
};
|
|
|
|
|
|
|
|
struct v2f {
|
|
|
|
float2 uv : TEXCOORD0;
|
|
|
|
float4 vertex : SV_POSITION;
|
|
|
|
UNITY_VERTEX_OUTPUT_STEREO
|
|
|
|
};
|
|
|
|
|
|
|
|
v2f vert (appdata v) {
|
|
|
|
v2f o;
|
|
|
|
UNITY_SETUP_INSTANCE_ID(v);
|
|
|
|
UNITY_INITIALIZE_OUTPUT(v2f, o);
|
|
|
|
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
|
|
|
|
o.vertex = UnityObjectToClipPos(v.vertex);
|
|
|
|
o.uv = v.uv;
|
|
|
|
return o;
|
|
|
|
}
|
|
|
|
|
|
|
|
float3 bg(uint charx, uint chary) {
|
|
|
|
return ((charx + chary) & 1) * 0.03 + 0.03;
|
|
|
|
}
|
|
|
|
|
|
|
|
float3 frag (v2f i) : SV_Target {
|
|
|
|
// write as 'const uint text[] = {?};' before export
|
2024-08-11 14:20:04 +02:00
|
|
|
const uint text[] = {0x33484144,0x45520002,0x23524953,0x50593049,0x4e0f3155,0x494e4502,0x005b5f0f,0x0f004854,0x5450531a,0x0f0f4749,0x540e4352,0x49535059,0x50494e0e,0x43430f23,0x52495350,0x5930494e,0x0f435652,0x0d50524f,0x50530f53,0x52430f42,0x52414e43,0x480f4d41,0x494e0f21,0x53534554,0x530f5445,0x53540f51,0x55494e45,0x0e534841,0x4445525f,0x6030524f,0x50455254,0x49455300,0x5b5d5f60,0x33554233,0x48414445,0x52005b5f,0x60603441,0x4753005b,0x00023245,0x4e444552,0x34595045,0x02001d00,0x022f5041,0x51554502,0x005d5f60,0x602c2f24,0x00111010,0x5f606030,0x41535300,0x5b5f6060,0x60232730,0x322f2732,0x212d5f60,0x60600350,0x5241474d,0x41005645,0x52544558,0x00564552,0x545f6060,0x60035052,0x41474d41,0x00465241,0x474d454e,0x54004652,0x41475f5f,0x60606003,0x494e434c,0x55444500,0x02354e49,0x54592327,0x0e434749,0x4e43025f,0x5f606060,0x03444546,0x494e4500,0x322f3733,0x00111014,0x5f606060,0x03444546,0x494e4500,0x232f2c33,0x00322f37,0x330a125f,0x5f606060,0x53545255,0x43540041,0x50504441,0x5441005b,0x5f606060,0x60464c4f,0x41541400,0x56455254,0x4558001a,0x00302f33,0x2934292f,0x2e1b5f60,0x60606046,0x4c4f4154,0x12005556,0x001a0034,0x2538232f,0x2f322410,0x1b5f6060,0x6060352e,0x2934393f,0x36253234,0x25383f29,0x2e303534,0x3f292e33,0x34212e23,0x253f2924,0x5f606060,0x5d1b5f5f,0x60606053,0x54525543,0x54005612,0x46005b5f,0x60606060,0x464c4f41,0x54120055,0x56001a00,0x34253823,0x2f2f3224,0x101b5f60,0x60606046,0x4c4f4154,0x14005645,0x52544558,0x001a0033,0x363f302f,0x33293429,0x2f2e1b5f,0x60606060,0x352e2934,0x393f3625,0x32342538,0x3f2f3534,0x3035343f,0x33342532,0x252f5f60,0x60605d1b,0x5f5f6060,0x60561246,0x00564552,0x54000841,0x50504441,0x54410056,0x09005b5f,0x60606060,0x56124600,0x4f1b5f60,0x60606035,0x2e293439,0x3f332534,0x35303f29,0x2e333421,0x2e23253f,0x29240856,0x091b5f60,0x60606035,0x2e293439,0x3f292e29,0x3429212c,0x293a253f,0x2f353430,0x35340856,0x12460c00,0x4f091b5f,0x60606060,0x352e2934,0x393f292e,0x29342921,0x2c293a25,0x3f362532,0x3425383f,0x2f353430,0x35343f33,0x34253225,0x2f084f09,0x1b5f6060,0x60604f0e,0x56455254,0x4558001d,0x00354e49,0x54592f42,0x4a454354,0x344f234c,0x4950304f,0x5308560e,0x56455254,0x4558091b,0x5f606060,0x604f0e55,0x56001d00,0x560e5556,0x1b5f6060,0x60605245,0x5455524e,0x004f1b5f,0x6060605d,0x5f5f6060,0x60464c4f,0x41541300,0x42470855,0x494e5400,0x43484152,0x580c0055,0x494e5400,0x43484152,0x5909005b,0x5f606060,0x60524554,0x55524e00,0x08084348,0x41525800,0x0b004348,0x41525909,0x00060011,0x09000a00,0x100e1013,0x000b0010,0x0e10131b,0x5f606060,0x5d5f5f60,0x6060464c,0x4f415413,0x00465241,0x47000856,0x12460049,0x09001a00,0x33363f34,0x41524745,0x54005b5f,0x60606060,0x0f0f0057,0x52495445,0x00415300,0x07434f4e,0x53540055,0x494e5400,0x54455854,0x3b3d001d,0x005b1f5d,0x1b070042,0x45464f52,0x45004558,0x504f5254,0x5f606060,0x60434f4e,0x53540055,0x494e5400,0x54455854,0x3b3d001d,0x005b1f5d,0x1b5f6060,0x6060434f,0x4e535400,0x55494e54,0x00544558,0x543f4c45,0x4e001d00,0x11141412,0x1b5f6060,0x6060434f,0x4e535400,0x55494e54,0x00424c4f,0x423f5354,0x41525400,0x1d001110,0x11141b5f,0x5f606060,0x60434f4e,0x53540055,0x494e5400,0x464f4e54,0x3f413b14,0x183d3b14,0x3d001d00,0x5b5b100c,0x100c100c,0x105d0c5b,0x100c1410,0x12161519,0x1315120c,0x11101110,0x15171112,0x18180c16,0x1210145d,0x0c5b100c,0x100c1610,0x13191719,0x1717160c,0x16171110,0x1818165d,0x0c5b100c,0x19111413,0x10161611,0x140c1911,0x14131016,0x1611140c,0x15145d0c,0x5b141014,0x12121610,0x14180c11,0x16111619,0x19151113,0x140c1111,0x12141218,0x16101418,0x0c141014,0x12141210,0x11195d0c,0x5b100c12,0x10111714,0x15121419,0x0c111113,0x10151713,0x1814180c,0x105d0c5b,0x100c1815,0x18191913,0x1511180c,0x19101718,0x13121819,0x110c1712,0x12125d0c,0x5b100c10,0x0c111010,0x16161312,0x19160c17,0x18191511,0x165d0c5b,0x100c1210,0x12111119,0x1211160c,0x12101211,0x11161110,0x180c1112,0x1311125d,0x0c5b100c,0x18101814,0x15181215,0x120c1810,0x18141614,0x1413120c,0x13101916,0x5d0c5b10,0x0c111011,0x13131117,0x1613120c,0x16171010,0x1218170c,0x105d0c5b,0x100c1410,0x14121216,0x1014180c,0x11151719,0x1113140c,0x105d0c5b,0x12101113,0x12161519,0x120c1115,0x17191013,0x120c100c,0x105d0c5b,0x100c100c,0x1112170c,0x105d0c5b,0x100c1611,
|
|
|
|
const uint text_len = 1442;
|
|
|
|
const uint blob_start = 1014;
|
2024-08-11 12:24:31 +02:00
|
|
|
|
|
|
|
const uint font_a[48][4] = {{0,0,0,0},{0,402659352,1010571288,6204},{0,0,603979776,6710886},{0,914306614,914306614,54},{404226048,1616995134,1124286048,404242019},{0,201745249,1130573848,0},{0,858993518,907832891,7222},{0,0,100663296,789516},{0,202119216,202116108,12312},{0,808458252,808464432,3096},{0,1013317632,6700287,0},{0,404226048,1579134,0},{201326592,1579032,0,0},{0,0,127,0},{0,6168,0,0},{0,201720577,1080045592,0},{0,1667446300,1667459947,7222},{0,404232318,504895512,6172},{0,100885375,1613764620,15971},{0,1616929598,1616919648,15971},{0,808464504,1010185087,12344},{0,1616929598,50544480,32515},{0,1667457854,50544483,7174},{0,202116108,1616916504,32611},{0,1667457854,1667448419,15971},{0,1616916510,1667464800,15971},{0,1579008,404226048,0},{0,1579020,404226048,0},{0,202911840,806882310,96},{0,2113929216,8257536,0},{0,806882310,202911840,6},{0,402659352,1664096280,15971},{0,2067465022,1667464059,62},{0,1667457891,912483199,2076},{0,1717986879,1717976678,16230},{0,54748732,1124270851,15462},{0,1717974559,1717986918,7990},{0,105277055,1175854614,32614},{0,101058063,1175854614,32614},{0,1667458652,1124270971,15462},{0,1667457891,1667465059,25443},{0,404232252,404232216,15384},{0,858993438,808464432,30768},{0,912680551,1714822686,26470},{0,105277055,101058054,3846},{0,1667457891,2139056995,25463},{0,1667457891,1870625651,25447},{0,1667457854,1667457891,15971},};
|
2024-08-11 14:20:04 +02:00
|
|
|
const uint font_b[49][4] = {{0,101058063,1717976582,16230},{812646400,1667988286,1667457891,15971},{0,1717986919,1717976630,16230},{0,1617126206,1661344816,15971},{0,404232252,1511528472,32382},{0,1667457854,1667457891,25443},{0,1664490504,1667457891,25443},{0,1803515702,1667459947,25443},{0,1043751779,910040092,25443},{0,404232252,1717976088,26214},{0,105079679,1630541836,32611},/* read if cute */{0,202116156,202116108,15372},{0,946888768,50794012,1},{0,808464444,808464432,15408},{0,0,0,136066659},{16711680,0,0,0},{0,0,0,202119168},{0,858993518,1978430,0},{0,1717986878,102643302,1798},{0,50553662,4088579,0},{0,858993518,809252403,14384},{0,50553662,4088703,0},{0,101058063,637931270,7222},{808656384,858993470,7222067,0},{0,1717986919,104230502,1798},{0,404232252,1841176,6168},{1717976064,1616928864,7364704,24672},{0,506881639,107361822,1798},{0,404232252,404232216,7192},{0,1802201955,3637099,0},{0,1717986918,3892838,0},{0,1667457854,4088675,0},{101060352,1717986878,3892838,0},{808482816,858993470,7222067,0},{0,101058063,3894886,0},{0,472933182,4088582,0},{0,202140728,205458444,2060},{0,858993518,3355443,0},{0,1717976088,6710886,0},{0,1802207030,6513515,0},{0,471610979,6501916,0},{1613766400,1667457918,6513507,0},{0,201745279,8336152,0},{0,404232304,404229656,28696},{0,404232216,404226072,6168},{0,404232206,404254744,3608},{0,0,0,28219},{2131100672,1617192575,1616928864,96},{1073741824,2136492096,1078483071,64},};
|
2024-08-11 12:24:31 +02:00
|
|
|
|
|
|
|
float px = i.uv.x * COLS;
|
|
|
|
float py = i.uv.y * ROWS;
|
|
|
|
uint charx = px;
|
|
|
|
uint chary = py;
|
|
|
|
|
2024-08-11 14:20:04 +02:00
|
|
|
uint char_index = (charx + (ROWS - 1 - chary) * COLS);
|
|
|
|
uint char;
|
|
|
|
float3 color = 0.8;
|
|
|
|
if (char_index >= blob_start && char_index < (blob_start + text_len * 11)) {
|
2024-08-11 12:24:31 +02:00
|
|
|
uint blob_index = char_index - blob_start;
|
2024-08-11 14:20:04 +02:00
|
|
|
uint number_index = blob_index / 11;
|
|
|
|
uint digit_offset = blob_index % 11;
|
2024-08-11 12:24:31 +02:00
|
|
|
if (digit_offset == 0) {
|
|
|
|
char = 16; // '0'
|
2024-08-11 14:20:04 +02:00
|
|
|
color = float3(1, 0.3, 0.5);
|
2024-08-11 12:24:31 +02:00
|
|
|
} else if (digit_offset == 1) {
|
|
|
|
char = 88; // 'x'
|
2024-08-11 14:20:04 +02:00
|
|
|
color = float3(1, 0.3, 0.5);
|
2024-08-11 12:24:31 +02:00
|
|
|
} else if (digit_offset == 10) {
|
|
|
|
char = 12; // ','
|
|
|
|
} else {
|
|
|
|
uint number = text[number_index];
|
2024-08-11 14:20:04 +02:00
|
|
|
uint nibble_offset = (digit_offset - 2) & 7;
|
|
|
|
uint nibble = (number >> ((7 - nibble_offset) * 4)) & 15;
|
2024-08-11 12:24:31 +02:00
|
|
|
const uint hex_chars[16] = {16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 65, 66, 67, 68, 69, 70};
|
|
|
|
char = hex_chars[nibble];
|
2024-08-11 14:20:04 +02:00
|
|
|
color = float3(0.2, 0.85, 1);
|
2024-08-11 12:24:31 +02:00
|
|
|
}
|
|
|
|
} else {
|
2024-08-11 14:20:04 +02:00
|
|
|
if (char_index > blob_start) { char_index -= text_len * 11 - 1; }
|
|
|
|
uint text_index = char_index >> 2;
|
2024-08-11 12:24:31 +02:00
|
|
|
if (text_index > text_len) { return bg(charx, chary); }
|
|
|
|
char = text[text_index];
|
|
|
|
uint byte_index = (char_index & 3);
|
|
|
|
if (byte_index == 0) { char >>= 24;}
|
|
|
|
else if (byte_index == 1) { char >>= 16;}
|
|
|
|
else if (byte_index == 2) { char >>= 8;}
|
|
|
|
}
|
|
|
|
|
|
|
|
char &= 0xff;
|
2024-08-11 14:20:04 +02:00
|
|
|
uint tx = (px - charx) * 8;
|
|
|
|
uint ty = (py - chary) * 16;
|
2024-08-11 12:24:31 +02:00
|
|
|
|
2024-08-11 14:20:04 +02:00
|
|
|
uint section_index = ty >> 2;
|
|
|
|
uint offset = tx + ((ty & 3) << 3);
|
2024-08-11 12:24:31 +02:00
|
|
|
float pixel = 0;
|
|
|
|
if (char < 48){
|
|
|
|
pixel = (font_a[char][section_index] >> offset) & 1;
|
|
|
|
} else {
|
2024-08-11 14:20:04 +02:00
|
|
|
pixel = (font_b[char - 48][section_index] >> offset) & 1;
|
2024-08-11 12:24:31 +02:00
|
|
|
}
|
|
|
|
if (pixel) {
|
|
|
|
return color;
|
|
|
|
} else {
|
|
|
|
return bg(charx, chary);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
ENDCG
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|