describe embedded julia sets
[maximus:emndl.git] / TODO
1 OpenGL/GLSL unwarp
2 ==================
3
4 // unwarping (todo: cubic interpolation)
5 const char *unwarp_frag_src =
6 "uniform sampler2D tex;\n"
7 "uniform float radius;\n"
8 "uniform float offset;\n"
9 "\n"
10 "void main() {\n"
11 "  vec2 q = gl_TexCoord[0].xy;\n"
12 "  float a = atan(q.y, q.x) * 0.15915494309189535;\n"
13 "  float d = max(sqrt(dot(q,q)), 0.000000001);\n"
14 "  float r = log(d) * radius;\n"
15 "  vec2 p = vec2(frac(a), clamp(r + offset, 0.0, 1.0));\n"
16 "  float l = -log2(d);\n"
17 "  gl_FragColor = texture2DLod(tex, p, l);\n"
18 "}\n";
19 // main program
20 logradius = 1.0 / log(pow(0.5, 8.0 / IWIDTH));
21
22
23 Y4M tidbits
24 ===========
25
26 y4m = "YUV4MPEG2 W720 H576 F25:1 Ip A118:81 C420mpeg2\n"; -- PAL 16:9
27 y4m = "YUV4MPEG2 W720 H576 F25:1 Ip A59:54 C420mpeg2\n";  -- PAL  4:3
28 ffmpeg -f yuv4mpegpipe -b 5625000 -r 25 -i - out.mkv # 1920x1080
29
30
31 DVD Author
32 ==========
33
34 dvdauthor -o dvd/ -x dvd.xml
35 k3b
36 growisofs -dvd-compat -Z/dev/dvd=dvd.iso
37
38
39 Miscellany
40 ==========
41
42 emndl_unwarp_gl for speed when GLSL is available
43 emndl.sh option to use unwarp_gl (or autodetect?)
44 emndl_colourize speedup
45 emndl_colourize configuration
46
47
48
49
50
51
52 int locates(mpfr_prec_t bits, int maxperiod, int nboxes, int *boxes, int *periods, int npoints, mpfr_t *cx, mpfr_t *cy, mpfr_t *zx, mpfr_t *zy) {
53   mpfr_t dx, dy, t;
54   mpfr_inits2(bits, dx, dy, t, (mpfr_ptr) 0);
55   int p = 0;
56   int found = 0;
57   do {
58     ++p;
59     for (int i = 0; i < npoints; ++i) {
60       mpfr_mul(t, zx[i], zy[i], MPFR_RNDN);
61       mpfr_sqr(zx[i], zx[i], MPFR_RNDN);
62       mpfr_sqr(zy[i], zy[i], MPFR_RNDN);
63       mpfr_sub(zx[i], zx[i], zy[i], MPFR_RNDN);
64       mpfr_add(zx[i], zx[i], cx[i], MPFR_RNDN);
65       mpfr_mul_2ui(zy[i], t, 1, MPFR_RNDN);
66       mpfr_add(zy[i], zy[i], cy[i], MPFR_RNDN);
67     }
68     for (int box = 0; box < nboxes; ++box) {
69       int preal = 0;
70       for (int ii = 0; ii < 4; ++ii) {
71         int jj = (ii + 1) % 4;
72         int i = boxes[4 * box + ii];
73         int j = boxes[4 * box + jj];
74         if (!(mpfr_sgn(zy[i]) < 0 && mpfr_sgn(zy[j]) < 0) && !(mpfr_sgn(zy[i]) > 0 && mpfr_sgn(zy[j]) > 0)) {
75           mpfr_sub(dy, zy[j], zy[i], MPFR_RNDN);
76           mpfr_sub(dx, zx[j], zx[i], MPFR_RNDN);
77           int s = mpfr_sgn(dy);
78           mpfr_mul(dy, dy, zx[i], MPFR_RNDN);
79           mpfr_mul(dx, dx, zy[i], MPFR_RNDN);
80           mpfr_sub(dy, dy, dx, MPFR_RNDN);
81           if (mpfr_sgn(dy) == s) { // && s != 0) {
82             ++preal;
83           }
84         }
85         int origin = preal & 1;
86         if (origin) {
87           periods[box] = p;
88         }
89         found += origin;
90       }
91     }
92   } while (! found && p < maxperiod);
93   mpfr_clears(dx, dy, t, (mpfr_ptr) 0);
94   return found;
95 }
96
97 int locate(mpfr_prec_t bits, mpfr_t x, mpfr_t y, mpfr_t z, int *period) {
98   mpfr_t cz0, zx[4], zy[4], cx[4], cy[4];
99   mpfr_inits2(bits, cz0, zx[0], zx[1], zx[2], zx[3], zy[0], zy[1], zy[2], zy[3], cx[0], cx[1], cx[2], cx[3], cy[0], cy[1], cy[2], cy[3], (mpfr_ptr) 0);
100   mpfr_set(cz0, z, MPFR_RNDN);
101   mpfr_sub(cx[0], x, cz0, MPFR_RNDN);
102   mpfr_sub(cy[0], y, cz0, MPFR_RNDN);
103   mpfr_add(cx[1], x, cz0, MPFR_RNDN);
104   mpfr_sub(cy[1], y, cz0, MPFR_RNDN);
105   mpfr_add(cx[2], x, cz0, MPFR_RNDN);
106   mpfr_add(cy[2], y, cz0, MPFR_RNDN);
107   mpfr_sub(cx[3], x, cz0, MPFR_RNDN);
108   mpfr_add(cy[3], y, cz0, MPFR_RNDN);
109   mpfr_set_ui(zx[0], 0, MPFR_RNDN);
110   mpfr_set_ui(zy[0], 0, MPFR_RNDN);
111   mpfr_set_ui(zx[1], 0, MPFR_RNDN);
112   mpfr_set_ui(zy[1], 0, MPFR_RNDN);
113   mpfr_set_ui(zx[2], 0, MPFR_RNDN);
114   mpfr_set_ui(zy[2], 0, MPFR_RNDN);
115   mpfr_set_ui(zx[3], 0, MPFR_RNDN);
116   mpfr_set_ui(zy[3], 0, MPFR_RNDN);
117   int nboxes = 1;
118   int boxes[] = { 0, 1, 2, 3 };
119   int periods[] = { -1 };
120   int npoints = 4;
121   int maxperiod = *period;
122   int success = locates(bits, maxperiod, nboxes, boxes, periods, npoints, cx, cy, zx, zy);
123   mpfr_clears(cz0, zx[0], zx[1], zx[2], zx[3], zy[0], zy[1], zy[2], zy[3], cx[0], cx[1], cx[2], cx[3], cy[0], cy[1], cy[2], cy[3], (mpfr_ptr) 0);
124   if (success) {
125     *period = periods[0];
126   }
127   return success;
128 }