|
| 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