Skip to content

Commit 0334d36

Browse files
committed
Other: 'One Small Step'.
1 parent a8d0e89 commit 0334d36

File tree

5 files changed

+619
-1
lines changed

5 files changed

+619
-1
lines changed
Lines changed: 162 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,162 @@
1+
// zcc +zx -lndos -create-app -lmz -o OneSmallStep ../utils.c ../glsl.c OneSmallStep.c
2+
// zcc +zx -lndos -lmz -o OneSmallStep.bin ../utils.c ../glsl.c OneSmallStep.c
3+
#include "../utils.h"
4+
#include "../glsl.h"
5+
6+
#define iTime 0.0f
7+
#define iFrame 0
8+
vec2_t iResolution = {256.0f, 192.0f};
9+
#define R iResolution
10+
11+
/********************************/
12+
13+
static float n31(vec3_t p) {
14+
vec3_t s = {7, 157, 113}, ip;
15+
ip = *v3_floor(&p);
16+
p = *v3_fract(&p);
17+
p = *v3_mul(&p, v3_mul(&p, v3_addf(v3_mulf(&p, -2.0f), 3.0f)));
18+
vec4_t h = {0};
19+
h.y = s.y;
20+
h.z = s.z;
21+
h.w = 270.0f;
22+
h = *v4_addf(&h, v3_dot(&ip, &s));
23+
h = *v4_mix(v4_fract(v4_mulf(v4_sin(&h), 43.5453f)), v4_fract(v4_mulf(v4_sin(v4_addf(&h, s.x)), 43.5453f)), p.x);
24+
vec2_t hxz, hyw;
25+
hxz.x = h.x; hxz.y = h.z;
26+
hyw.x = h.y; hyw.y = h.w;
27+
vec2_t* r = v2_mix(&hxz, &hyw, p.y);
28+
set_xy(&h, r->x, r->y);
29+
return mix(h.x, h.y, p.z);
30+
}
31+
32+
static float box(vec3_t p, vec3_t b) {
33+
vec3_t q;
34+
q = *v3_sub(v3_abs(&p), &b);
35+
return v3_length(v3_maxf(&q, 0.0f)) + min(max(q.x, max(q.y, q.z)), 0.0f);
36+
}
37+
38+
static float map(vec3_t p) {
39+
// return v3_length(p) - 1.6f;
40+
float r, k, t, h,
41+
bmp = (n31(p) + n31(*v3_mulf(&p, 2.12f)) * .5 + n31(*v3_mulf(&p, 4.42f)) * .25 + n31(*v3_mulf(&p, 8.54f)) * .125 + n31(*v3_mulf(&p, 63.52f)) * .0156) * .5 * (.5 + 2. * exp(-spow(v2_length(v2_sub(vec2(p.x, p.z), vec2(.5, 2.2))), 2.) * .26)),
42+
a = p.y - .27 - bmp,
43+
b = (bmp * bmp * .5 - .5) * .12;
44+
set_xy(&p, -p.x, -p.y);
45+
p.x /= .95 - cos((p.z + 1.2 - sign(p.x)) * .8) * .1;
46+
vec3_t tp;
47+
tp = p;
48+
tp.z = fmod(tp.z - .5, .4) - .2;
49+
t = max(box(tp, *vec3(2, .16, .12 + tp.y * .25)), box(*v3_sub(&p, vec3(0, 0, 1.1)), *vec3(2, .16, 1.7)));
50+
tp = p;
51+
tp.x = abs(p.x) - 1.65;
52+
tp.z -= 1.1;
53+
t = min(t, box(tp, *vec3(.53 - .12 * tp.z, .16, 1.6)));
54+
p.z /= cos(p.z * .1);
55+
vec2_t q;
56+
set_xy(&q, p.x, p.z);
57+
q.x = abs(q.x);
58+
k = q.x * .12 + q.y;
59+
if (k < 0.) r = v2_length(&q) - 1.2;
60+
else if (k > 2.48) r = v2_length(v2_sub(&q, vec2(0, 2.5))) - 1.5;
61+
else r = v2_dot(&q, vec2(.99, -.12)) - 1.2;
62+
63+
b -= max(max(r, p.y), -t);
64+
h = clamp(.5 + .5 * (b - a) / -.8, 0., 1.);
65+
return mix(b, a, h) + .8 * h * (1. - h);
66+
}
67+
68+
static vec3_t* normal(vec3_t p) {
69+
vec3_t n = {0}, e;
70+
for (int i = 0; i < 4; ++i) {
71+
vec3_t o;
72+
o.x = ((i + 3) >> 1) & 1;
73+
o.y = (i >> 1) & 1;
74+
o.z = i & 1;
75+
e = *v3_mulf(v3_subf(v3_mulf(&o, 2.0f), 1.0f), 0.5773f);
76+
n = *v3_add(&n, v3_mulf(&e, map(*v3_add(&p, v3_mulf(&e, 0.01f)))));
77+
}
78+
79+
return v3_normalize(&n);
80+
}
81+
82+
static float lights(vec3_t p) {
83+
vec3_t lp = {6, 3, -10}, ld, n;
84+
ld = *v3_normalize(v3_sub(&lp, &p));
85+
n = *normal(p);
86+
return max(0.0f, 0.1f + 0.9f * v3_dot(&ld, &n));
87+
}
88+
89+
static float march(vec3_t ro, vec3_t rd) {
90+
vec3_t p;
91+
float d = .01f;
92+
for (float i = 0.0f; i < 15.0f; ++i) {
93+
p = *v3_add(&ro, v3_mulf(&rd, d));
94+
float h = map(p);
95+
if (abs(h) < .025f) break;
96+
d += h;
97+
}
98+
99+
return lights(p) * exp(-d * .14);
100+
}
101+
102+
static float mainImage(vec2_t fc) {
103+
vec2_t q, uv;
104+
q = *v2_div(&fc, &R);
105+
uv = *v2_divf(v2_sub(&fc, v2_mulf(&R, 0.5f)), R.y);
106+
107+
vec3_t f, r, ro = {0, .2, -4};
108+
ro = *rot_yz(&ro, -0.6f);
109+
ro = *rot_xz(&ro, 1.1);
110+
f = *v3_normalize(v3_sub(vec3(0.0f, 0.0f, 0.8f), &ro));
111+
r = *v3_normalize(v3_cross(vec3(0, 1, 0), &f));
112+
float c = march(ro, *v3_normalize(v3_add(&f, v3_add(v3_mulf(&r, uv.x), v3_mulf(v3_cross(&f, &r), uv.y)))));
113+
c *= 2.5;
114+
c *= c;
115+
return c;
116+
}
117+
118+
void main()
119+
{
120+
srand(0);
121+
zx_border(INK_BLUE);
122+
textbackground(BLACK);
123+
textcolor(WHITE);
124+
clrscr();
125+
126+
// Footer.
127+
draw_footer("One Small Step (@DeanTheCoder)");
128+
129+
// Loop.
130+
in_GetKeyReset();
131+
for (uint16_t y = 0; y < 192 - 8; y += 4)
132+
{
133+
for (uint16_t x = 0; x < 256; x += 4)
134+
{
135+
float c = clamp(mainImage(*vec2(x, 191 - y)), 0.0f, 2.0f);
136+
137+
// Set the color.
138+
uint8_t ink, bright = 1 << 6;
139+
switch ((uint8_t)(floor(c * 0.99f)))
140+
{
141+
case 0:
142+
ink = INK_WHITE;
143+
break;
144+
145+
case 1:
146+
ink = INK_WHITE + bright;
147+
c *= 0.4;
148+
break;
149+
150+
default:
151+
ink = INK_WHITE + PAPER_RED;
152+
break;
153+
}
154+
155+
// Plot the pixels.
156+
c_plot_shade((x >> 2), (y >> 2), min(c * 255.0f, 255.0f));
157+
attrMem[((y >> 3) << 5) + (x >> 3)] = ink;
158+
}
159+
}
160+
161+
in_waitForKey();
162+
}

0 commit comments

Comments
 (0)