11 int main(int argc, char **argv)
13 int i, j, frm, imgrad, out_nlines, xsz = 240, ysz = 160, texsz = 128;
16 struct vec2 *tunbuf, *tun;
18 struct vec2 *buf, *ptr;
22 for(i=1; i<argc; i++) {
23 if(argv[i][0] == '-') {
24 if(argv[i][2] != 0) goto invalopt;
27 if(sscanf(argv[++i], "%dx%d", &xsz, &ysz) != 2 || xsz <= 1 || ysz <= 1) {
28 fprintf(stderr, "-s must be followed by WxH\n");
34 if(!(texsz = atoi(argv[++i])) || texsz > 256) {
35 fprintf(stderr, "-t must be followed by the texture size (1-256)\n");
46 fprintf(stderr, "-c must be followed by a center pixel\n");
49 center = strtol(argv[i], &endp, 10);
51 fprintf(stderr, "-c invalid center position: %s\n", argv[i]);
58 fprintf(stderr, "-n must be followed by the number of frames\n");
61 if(!(num_frames = atoi(argv[i]))) {
62 fprintf(stderr, "-n invalid number of frames: %s\n", argv[i]);
71 invalopt: fprintf(stderr, "invalid argument: %s\n", argv[i]);
76 out_nlines = half_y ? ysz / 2 : ysz;
78 if(!(buf = malloc(xsz * ysz * sizeof *buf))) {
79 perror("failed to allocate buffer");
82 imgrad = sqrt(xsz * xsz + ysz * ysz);
84 FILE *fp = fopen("tun_preview.ppm", "wb");
86 fprintf(fp, "P6\n%d %d\n255\n", xsz, out_nlines * num_frames);
90 for(frm=0; frm<num_frames; frm++) {
91 int coffs = num_frames > 1 ? frm * center / (num_frames - 1) : center;
93 memset(buf, 0xff, xsz * ysz * sizeof *buf);
98 #pragma omp parallel for private(i, j, prev_r, ptr) schedule(dynamic)
99 for(i=0; i<VDIV; i++) {
100 float v = (float)(VDIV - i) / (float)VDIV;
101 float r = 4.0 / v + 16;
104 /* don't bother drawing rings < 1 pixel apart */
105 if(r < 0 || fabs(r - prev_r) < 0.05) continue;
107 for(j=0; j<UDIV; j++) {
108 float u = (float)j / (float)(UDIV - 1);
109 float theta = 2.0f * u * M_PI;
111 int x = (int)(cos(theta) * r - z) + xsz / 2;
112 int y = (int)(sin(theta) * r) + ysz / 2;
114 if(x >= 0 && x < xsz && y >= 0 && y < ysz) {
115 ptr = buf + y * xsz + x;
116 ptr->x = (j << 8) / UDIV;
117 ptr->y = ((VDIV - i - 1) << 10) / VDIV;
124 for(i=0; i<out_nlines; i++) {
125 for(j=0; j<xsz; j++) {
129 int g = (v >> 2) & 0xff;
131 /*if(v > 2.0) r = g = b = 0;*/
135 uint16_t out = ((uint16_t)u & 0x3f) | (((uint16_t)v & 0x3ff) << 6);
136 fwrite(&out, sizeof out, 1, stdout);