10 int main(int argc, char **argv)
12 int i, j, frm, imgrad, out_nlines, xsz = 240, ysz = 160, texsz = 128;
15 struct vec2 *tunbuf, *tun;
17 struct vec2 *buf, *ptr;
21 for(i=1; i<argc; i++) {
22 if(argv[i][0] == '-') {
23 if(argv[i][2] != 0) goto invalopt;
26 if(sscanf(argv[++i], "%dx%d", &xsz, &ysz) != 2 || xsz <= 1 || ysz <= 1) {
27 fprintf(stderr, "-s must be followed by WxH\n");
33 if(!(texsz = atoi(argv[++i])) || texsz > 256) {
34 fprintf(stderr, "-t must be followed by the texture size (1-256)\n");
45 fprintf(stderr, "-c must be followed by a center pixel\n");
48 center = strtol(argv[i], &endp, 10);
50 fprintf(stderr, "-c invalid center position: %s\n", argv[i]);
57 fprintf(stderr, "-n must be followed by the number of frames\n");
60 if(!(num_frames = atoi(argv[i]))) {
61 fprintf(stderr, "-n invalid number of frames: %s\n", argv[i]);
70 invalopt: fprintf(stderr, "invalid argument: %s\n", argv[i]);
75 out_nlines = half_y ? ysz / 2 : ysz;
77 if(!(buf = malloc(xsz * ysz * sizeof *buf))) {
78 perror("failed to allocate buffer");
81 imgrad = sqrt(xsz * xsz + ysz * ysz);
83 FILE *fp = fopen("tun_preview.ppm", "wb");
85 fprintf(fp, "P6\n%d %d\n255\n", xsz, out_nlines * num_frames);
89 for(frm=0; frm<num_frames; frm++) {
90 int coffs = num_frames > 1 ? frm * center / (num_frames - 1) : center;
95 #pragma omp parallel for private(i, j, prev_r, ptr) schedule(dynamic)
96 for(i=0; i<VDIV; i++) {
97 float v = (float)(VDIV - i) / (float)VDIV;
98 float r = 4.0 / v + 16;
101 /* don't bother drawing rings < 1 pixel apart */
102 if(fabs(r - prev_r) < 0.05) continue;
104 for(j=0; j<UDIV; j++) {
105 float u = (float)j / (float)(UDIV - 1);
106 float theta = 2.0f * u * M_PI;
108 int x = (int)(cos(theta) * r - z) + xsz / 2;
109 int y = (int)(sin(theta) * r) + ysz / 2;
111 if(x >= 0 && x < xsz && y >= 0 && y < ysz) {
112 ptr = buf + y * xsz + x;
121 for(i=0; i<out_nlines; i++) {
122 for(j=0; j<xsz; j++) {
125 int r = (int)(u * 8.0 * 255.0f) & 0xff;
126 int g = (int)(v * 8.0 * 255.0f) & 0xff;
127 int b = (~(int)(v * 0.5 * 255.0f) & 0xff) + 105;
131 /*if(v > 2.0) r = g = b = 0;*/
135 uint16_t out = ((uint16_t)(u * 255.0f) & 0xff) |
136 (((uint16_t)(v * 255.0f) & 0xff) << 8);
137 fwrite(&out, sizeof out, 1, stdout);