deepstone
diff src/scantmpl.h @ 38:17a5107b6fa4
- added perspective correct interpolation
- added recording functionality
- added video capture functionality
author | John Tsiombikas <nuclear@member.fsf.org> |
---|---|
date | Mon, 10 Mar 2014 17:24:42 +0200 |
parents | 11d14f688485 |
children | 1fa939507d8b |
line diff
1.1 --- a/src/scantmpl.h Mon Sep 23 07:42:56 2013 +0300 1.2 +++ b/src/scantmpl.h Mon Mar 10 17:24:42 2014 +0200 1.3 @@ -9,6 +9,9 @@ 1.4 fixed e, de, dfde; 1.5 #endif 1.6 #ifdef INTERP_TEX 1.7 +#ifdef TEXMAP_PERSP_CORRECT 1.8 + fixed w, dw, dfdw; 1.9 +#endif 1.10 fixed u, v, du, dv, dfdu, dfdv; 1.11 #endif 1.12 fixed x; 1.13 @@ -31,6 +34,11 @@ 1.14 dfde = fixed_div(de, dy); 1.15 #endif 1.16 #ifdef INTERP_TEX 1.17 +#ifdef TEXMAP_PERSP_CORRECT 1.18 + dw = v1->pos.w - v0->pos.w; 1.19 + dfdw = fixed_div(dw, dy); 1.20 +#endif 1.21 + 1.22 du = v1->tc.x - v0->tc.x; 1.23 dv = v1->tc.y - v0->tc.y; 1.24 dfdu = fixed_div(du, dy); 1.25 @@ -59,6 +67,9 @@ 1.26 e = v0->energy; 1.27 #endif 1.28 #ifdef INTERP_TEX 1.29 +#ifdef TEXMAP_PERSP_CORRECT 1.30 + w = v0->pos.w; 1.31 +#endif 1.32 u = v0->tc.x; 1.33 v = v0->tc.y; 1.34 #endif 1.35 @@ -73,6 +84,9 @@ 1.36 e = v0->energy + fixed_mul(dfde, lines); 1.37 #endif 1.38 #ifdef INTERP_TEX 1.39 +#ifdef TEXMAP_PERSP_CORRECT 1.40 + w = v0->pos.w + fixed_mul(dfdw, lines); 1.41 +#endif 1.42 u = v0->tc.x + fixed_mul(dfdu, lines); 1.43 v = v0->tc.y + fixed_mul(dfdv, lines); 1.44 #endif 1.45 @@ -102,6 +116,11 @@ 1.46 #endif 1.47 1.48 #ifdef INTERP_TEX 1.49 +#ifdef TEXMAP_PERSP_CORRECT 1.50 + edge[i].pos.w = w; 1.51 + w += dfdw; 1.52 +#endif 1.53 + 1.54 edge[i].tc.x = u; 1.55 edge[i].tc.y = v; 1.56 u += dfdu; 1.57 @@ -126,6 +145,8 @@ 1.58 #ifdef INTERP_TEX 1.59 unsigned int tx, ty; 1.60 fixed u, v, du, dv, dfdu, dfdv; 1.61 + fixed w, dw, dfdw; 1.62 + fixed tu, tv; 1.63 #endif 1.64 VERTEX *left, *right; 1.65 1.66 @@ -179,6 +200,12 @@ 1.67 dfde = fixed_div(de, dx); 1.68 #endif 1.69 #ifdef INTERP_TEX 1.70 +#ifdef TEXMAP_PERSP_CORRECT 1.71 + w = left[y].pos.w; 1.72 + dw = right[y].pos.w - w; 1.73 + dfdw = fixed_div(dw, dx); 1.74 +#endif 1.75 + 1.76 u = left[y].tc.x; 1.77 v = left[y].tc.y; 1.78 du = right[y].tc.x - u; 1.79 @@ -200,6 +227,12 @@ 1.80 e = left[y].energy + fixed_mul(dfde, dist); 1.81 #endif 1.82 #ifdef INTERP_TEX 1.83 +#ifdef TEXMAP_PERSP_CORRECT 1.84 + dw = right[y].pos.w - left[y].pos.w; 1.85 + dfdw = fixed_div(dw, dx); 1.86 + w = left[y].pos.w + fixed_mul(dfdw, dist); 1.87 +#endif 1.88 + 1.89 du = right[y].tc.x - left[y].tc.x; 1.90 dv = right[y].tc.y - left[y].tc.y; 1.91 dfdu = fixed_div(du, dx); 1.92 @@ -225,13 +258,16 @@ 1.93 unsigned short *zptr = fb->zbuf[ZTILE(pix)] + ZTILE_OFFS(pix); 1.94 1.95 if(z < 0 || z >= fixedi(1) || zval > *zptr) { 1.96 -# ifdef INTERP_TEX 1.97 +#ifdef INTERP_TEX 1.98 u += dfdu; 1.99 v += dfdv; 1.100 -# endif 1.101 -# ifdef INTERP_ENERGY 1.102 +#ifdef TEXMAP_PERSP_CORRECT 1.103 + w += dfdw; 1.104 +#endif 1.105 +#endif /* INTERP_TEX */ 1.106 +#ifdef INTERP_ENERGY 1.107 e += dfde; 1.108 -# endif 1.109 +#endif 1.110 z += dfdz; 1.111 continue; 1.112 } 1.113 @@ -240,13 +276,23 @@ 1.114 z += dfdz; 1.115 #endif 1.116 #ifdef INTERP_TEX 1.117 - tx = (unsigned int)fixed_int(fixed_mul(u, fixedi(st->tex.width))) & st->tex.xmask; 1.118 - ty = (unsigned int)fixed_int(fixed_mul(v, fixedi(st->tex.height))) & st->tex.ymask; 1.119 +#ifdef TEXMAP_PERSP_CORRECT 1.120 + tu = fixed_div(u, w); 1.121 + tv = fixed_div(v, w); 1.122 +#else 1.123 + tu = u; 1.124 + tv = v; 1.125 +#endif 1.126 + tx = (unsigned int)fixed_int(fixed_mul(tu, fixedi(st->tex.width))) & st->tex.xmask; 1.127 + ty = (unsigned int)fixed_int(fixed_mul(tv, fixedi(st->tex.height))) & st->tex.ymask; 1.128 c = st->tex.pixels[(ty << st->tex.xshift) + tx]; 1.129 1.130 u += dfdu; 1.131 v += dfdv; 1.132 +#ifdef TEXMAP_PERSP_CORRECT 1.133 + w += dfdw; 1.134 #endif 1.135 +#endif /* INTERP_TEX */ 1.136 #ifdef INTERP_ENERGY 1.137 c += fixed_int(fixed_mul(e, fixedi(st->col_range))); 1.138 e += dfde;