10 int main(int argc, char **argv)
12 int i, j, imgrad, xsz = 240, ysz = 160, texsz = 128;
13 struct vec2 *tunbuf, *tun;
15 struct vec2 *buf, *ptr;
17 for(i=1; i<argc; i++) {
18 if(argv[i][0] == '-') {
19 if(argv[i][2] != 0) goto invalopt;
22 if(sscanf(argv[++i], "%dx%d", &xsz, &ysz) != 2 || xsz <= 1 || ysz <= 1) {
23 fprintf(stderr, "-s must be followed by WxH\n");
29 if(!(texsz = atoi(argv[++i])) || texsz > 256) {
30 fprintf(stderr, "-t must be followed by the texture size (1-256)\n");
39 invalopt: fprintf(stderr, "invalid argument: %s\n", argv[i]);
44 if(!(buf = malloc(xsz * ysz * sizeof *buf))) {
45 perror("failed to allocate buffer");
48 imgrad = sqrt(xsz * xsz + ysz * ysz);
53 for(i=0; i<VDIV; i++) {
54 float v = (float)(VDIV - i) / (float)VDIV;
55 float r = 1.5 / v + 16;
58 /* don't bother drawing rings < 1 pixel apart */
59 if(fabs(r - prev_r) < 0.05) continue;
61 for(j=0; j<UDIV; j++) {
62 float u = (float)j / (float)(UDIV - 1);
63 float theta = 2.0f * u * M_PI;
65 int x = (int)(cos(theta) * r - z) + xsz / 2;
66 int y = (int)(sin(theta) * r) + ysz / 2;
68 if(x >= 0 && x < xsz && y >= 0 && y < ysz) {
69 ptr = buf + y * xsz + x;
77 FILE *fp = fopen("tun_preview.ppm", "wb");
79 fprintf(fp, "P6\n%d %d\n255\n", xsz, ysz);
82 aspect = (float)xsz / (float)ysz;
85 for(i=0; i<ysz; i++) {
86 for(j=0; j<xsz; j++) {
89 int r = (int)(u * 8.0 * 255.0f) & 0xff;
90 int g = (int)(v * 8.0 * 255.0f) & 0xff;
91 int b = (~(int)(v * 0.5 * 255.0f) & 0xff) + 105;
95 /*if(v > 2.0) r = g = b = 0;*/
99 uint16_t out = ((uint16_t)(u * 255.0f) & 0xff) |
100 (((uint16_t)(v * 255.0f) & 0xff) << 8);
101 fwrite(&out, sizeof out, 1, stdout);