refactor(default): glsl cleaning (1/2)

This commit is contained in:
2026-08-28 19:46:46 +02:00
parent 69f98e536f
commit 749206746d
11 changed files with 323 additions and 380 deletions
+41 -79
View File
@@ -1,7 +1,9 @@
#include inc_sentences.glsl
#ifndef INC_CP437
#define INC_CP437
const int cp437[] = {
const int cp437[] = int[1024](
0x0000, 0x0000, 0x0000, 0x0000, // 0x00, NUL
0x151E, 0x8A87, 0xE19D, 0x789B, // 0x01, SOH, SMILEY BLACK
0xFBFE, 0xFDF7, 0xEF73, 0x7FEC, // 0x02, STX, SMILEY LIGHT
@@ -257,10 +259,10 @@ const int cp437[] = {
0x666E, 0x3331, 0x0006, 0x0003, // 0xFC, ⁿ
0x6C8E, 0x0010, 0x000E, 0x0001, // 0xFD, ²
0xCC00, 0x3300, 0x00CC, 0x0033, // 0xFE, ■
0x0000, 0x0000, 0x0000, 0x0000, // 0xFF, NBSP
};
0x0000, 0x0000, 0x0000, 0x0000 // 0xFF, NBSP
);
const int charsets[] = {
const int charsets[] = int[18](
0x30, 10, // NUMBERS
0x41, 26, // UPPERCASE LETTERS
0x61, 26, // LOWERCASE LETTERS
@@ -269,12 +271,12 @@ const int charsets[] = {
0xB3, 40, // BARS
0xE0, 16, // GREEK
0x80, 28, // ACCENTS
0xB0, 3, // SHADES
};
0xB0, 3 // SHADES
);
#define CHARSETS 8
const int hex_chars[] = {
const int hex_chars[] = int[16](
0x30,
0x31,
0x32,
@@ -290,29 +292,29 @@ const int hex_chars[] = {
0x43,
0x44,
0x45,
0x46,
};
0x46
);
bool char(vec2 pos, int code)
{
if (pos.x < 0.0 || pos.y < 0.0 || pos.x >= 1.0 || pos.y >= 1.0) {
if (pos.x < .0 || pos.y < .0 || pos.x >= 1. || pos.y >= 1.) {
return false;
}
ivec2 pos2 = ivec2(pos.x * 8.0, (1 - pos.y) * 8.0);
ivec2 pos2 = ivec2(pos.x * 8., (1 - pos.y) * 8.);
ivec2 subpos = pos2 % 4;
int v = int(pow(2, subpos.y * 4 + subpos.x));
int d = int(pos2.y * 0.25) * 2 + int(pos2.x * 0.25);
int v = int(pow(2., subpos.y * 4. + subpos.x));
int d = int(pos2.y * .25) * 2 + int(pos2.x * .25);
return (cp437[code * 4 + d] & v) > 0;
}
float char_at(vec2 uv, vec2 pos, int code)
{
return char(uv - pos, code) ? 1 : 0;
return char(uv - pos, code) ? 1. : 0.;
}
float write_5(vec2 uv, vec2 pos, int str[5])
{
float d = 0;
float d = 0.;
int i;
for (i = 0; i < 5; i++) {
@@ -320,7 +322,7 @@ float write_5(vec2 uv, vec2 pos, int str[5])
return d;
}
d += char_at(uv, pos + vec2(i, 0), str[i]);
d += char_at(uv, pos + vec2(i, 0.), str[i]);
}
return d;
@@ -328,7 +330,7 @@ float write_5(vec2 uv, vec2 pos, int str[5])
float write_10(vec2 uv, vec2 pos, int str[10])
{
float d = 0;
float d = 0.;
int i;
for (i = 0; i < 10; i++) {
@@ -336,7 +338,7 @@ float write_10(vec2 uv, vec2 pos, int str[10])
return d;
}
d += char_at(uv, pos + vec2(i, 0), str[i]);
d += char_at(uv, pos + vec2(i, 0.), str[i]);
}
return d;
@@ -344,7 +346,7 @@ float write_10(vec2 uv, vec2 pos, int str[10])
float write_20(vec2 uv, vec2 pos, int str[20])
{
float d = 0;
float d = 0.;
int i;
for (i = 0; i < 20; i++) {
@@ -352,96 +354,56 @@ float write_20(vec2 uv, vec2 pos, int str[20])
return d;
}
d += char_at(uv, pos + vec2(i, 0), str[i]);
d += char_at(uv, pos + vec2(i, 0.), str[i]);
}
return d;
}
float write_int(vec2 uv, vec2 pos, uint value, uint magnitude)
float write_int(vec2 uv, vec2 pos, int value, int magnitude)
{
value = max(0, value);
int i;
uint m = 1;
float d = 0;
float d = 0.;
for (i = 0; i < magnitude; i++) {
if (i == 0 || value >= m) {
d += char_at(uv, pos + vec2(magnitude - i - 1, 0), int(0x30 + (value % (m * 10u)) / m));
m *= 10u;
d += char_at(uv, pos + vec2(magnitude - i - 1, 0.), int(0x30 + (value % (m * 10)) / m));
m *= 10;
}
}
return d;
}
float write_int_left(vec2 uv, vec2 pos, uint value, uint magnitude)
float write_int_left(vec2 uv, vec2 pos, int value, int magnitude)
{
value = max(0, value);
int i;
uint m = 1;
float d = 0;
int m = 1;
float d = 0.;
for (i = 0; i < magnitude; i++) {
if (i == 0 || value >= m) {
pos.x += 1;
m *= 10u;
pos.x += 1.;
m *= 10;
}
}
return write_int(uv, pos, value, magnitude);
}
int read(sampler2D tex, vec2 uv, float k, int d, float t)
float write_sentence(vec2 uv, vec2 pos, int n)
{
float inv_k = 1 / k;
vec2 tex_uv = floor(uv * k) * inv_k;
tex_uv += vec2(d % 2, floor(d * 0.5)) * 0.5 * inv_k;
return
((mean(reframe(tex, tex_uv + vec2(0, 3) * inv_k * 0.125)) > t) ? 1 : 0) +
((mean(reframe(tex, tex_uv + vec2(0, 2) * inv_k * 0.125)) > t) ? 2 : 0) +
((mean(reframe(tex, tex_uv + vec2(0, 1) * inv_k * 0.125)) > t) ? 4 : 0) +
((mean(reframe(tex, tex_uv + vec2(0, 0) * inv_k * 0.125)) > t) ? 8 : 0) +
((mean(reframe(tex, tex_uv + vec2(1, 3) * inv_k * 0.125)) > t) ? 16 : 0) +
((mean(reframe(tex, tex_uv + vec2(1, 2) * inv_k * 0.125)) > t) ? 32 : 0) +
((mean(reframe(tex, tex_uv + vec2(1, 1) * inv_k * 0.125)) > t) ? 64 : 0) +
((mean(reframe(tex, tex_uv + vec2(1, 0) * inv_k * 0.125)) > t) ? 128 : 0) +
((mean(reframe(tex, tex_uv + vec2(2, 3) * inv_k * 0.125)) > t) ? 256 : 0) +
((mean(reframe(tex, tex_uv + vec2(2, 2) * inv_k * 0.125)) > t) ? 512 : 0) +
((mean(reframe(tex, tex_uv + vec2(2, 1) * inv_k * 0.125)) > t) ? 1024 : 0) +
((mean(reframe(tex, tex_uv + vec2(2, 0) * inv_k * 0.125)) > t) ? 2048 : 0) +
((mean(reframe(tex, tex_uv + vec2(3, 3) * inv_k * 0.125)) > t) ? 4096 : 0) +
((mean(reframe(tex, tex_uv + vec2(3, 2) * inv_k * 0.125)) > t) ? 8192 : 0) +
((mean(reframe(tex, tex_uv + vec2(3, 1) * inv_k * 0.125)) > t) ? 16384 : 0) +
((mean(reframe(tex, tex_uv + vec2(3, 0) * inv_k * 0.125)) > t) ? 32768 : 0);
}
// https://web.archive.org/web/20151229003112/http://blogs.msdn.com/b/jeuge/archive/2005/06/08/hakmem-bit-count.aspx
int bit_count(int u)
{
int c;
c = u - ((u >> 1) & 033333333333) - ((u >> 2) & 011111111111);
return ((c + (c >> 3)) & 030707070707) % 63;
}
int guess_char(sampler2D tex, vec2 uv, float k, float t)
{
int b0 = read(tex, uv, k, 0, t);
int b1 = read(tex, uv, k, 1, t);
int b2 = read(tex, uv, k, 2, t);
int b3 = read(tex, uv, k, 3, t);
int mc = 0;
int mb = 100;
float d = 0.;
int i;
int b;
for (i = 0x01; i <= 0xFF; i++) {
if (i == 0x20 || i == 0xff || i == 0xDB) {
continue;
}
b = bit_count(cp437[i * 4] ^ b0) + bit_count(cp437[i * 4 + 1] ^ b1) + bit_count(cp437[i * 4 + 2] ^ b2) + + bit_count(cp437[i * 4 + 3] ^ b3);
if (b < mb) {
mb = b;
mc = i;
for (i = 0; i < SENTENCE_MAX_LENGTH; i++) {
if (sentences[n * SENTENCE_MAX_LENGTH + i] == 0) {
return d;
}
d += char_at(uv, pos + vec2(i, 0.), sentences[n * SENTENCE_MAX_LENGTH + i]);
}
return mc;
return d;
}
#endif