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;