deepstone
diff src/scantmpl.h @ 9:bce78aaafc68
foo
author | John Tsiombikas <nuclear@member.fsf.org> |
---|---|
date | Sat, 26 Nov 2011 03:59:48 +0200 |
parents | 0e781cc43178 |
children | 059bb38506b3 |
line diff
1.1 --- a/src/scantmpl.h Mon Nov 21 12:45:18 2011 +0200 1.2 +++ b/src/scantmpl.h Sat Nov 26 03:59:48 2011 +0200 1.3 @@ -66,17 +66,41 @@ 1.4 start = (int)ROUND(v0->pos.y); 1.5 end = (int)ROUND(v1->pos.y); 1.6 1.7 - x = v0->pos.x; 1.8 + if(start >= 0) { 1.9 + 1.10 + x = v0->pos.x; 1.11 #ifdef INTERP_DEPTH 1.12 - z = v0->pos.z; 1.13 + z = v0->pos.z; 1.14 #endif 1.15 #ifdef INTERP_ENERGY 1.16 - e = v0->energy; 1.17 + e = v0->energy; 1.18 #endif 1.19 #ifdef INTERP_TEX 1.20 - u = v0->tc.x; 1.21 - v = v0->tc.y; 1.22 + u = v0->tc.x; 1.23 + v = v0->tc.y; 1.24 #endif 1.25 + } else { 1.26 + float lines = -v0->pos.y; 1.27 + 1.28 + x = v0->pos.x + dfdx * lines; 1.29 +#ifdef INTERP_DEPTH 1.30 + z = v0->pos.z + dfdz * lines; 1.31 +#endif 1.32 +#ifdef INTERP_ENERGY 1.33 + e = v0->energy + dfde * lines; 1.34 +#endif 1.35 +#ifdef INTERP_TEX 1.36 + u = v0->tc.x + dfdu * lines; 1.37 + v = v0->tc.y + dfdv * lines; 1.38 +#endif 1.39 + start = 0; 1.40 + } 1.41 + 1.42 + if(end >= fb->height) { 1.43 + end = fb->height - 1; 1.44 + } 1.45 + 1.46 + 1.47 for(i=start; i<end; i++) { 1.48 edge[i].pos.x = x; 1.49 x += dfdx; 1.50 @@ -124,7 +148,6 @@ 1.51 1.52 x0 = (int)ROUND(vleft[y].pos.x); 1.53 x1 = (int)ROUND(vright[y].pos.x); 1.54 - len = x1 - x0; 1.55 1.56 if(x1 < x0) { 1.57 if(st->flags & MGL_CULL_FACE) { 1.58 @@ -133,7 +156,6 @@ 1.59 tmp = x0; 1.60 x0 = x1; 1.61 x1 = tmp; 1.62 - len = -len; 1.63 1.64 left = vright; 1.65 right = vleft; 1.66 @@ -142,13 +164,15 @@ 1.67 right = vright; 1.68 } 1.69 1.70 - if(x0 < 0) x0 = 0; 1.71 - if(x1 >= fb->width) x1 = fb->width - 1; 1.72 - 1.73 - assert(len >= 0); 1.74 + if(x1 >= fb->width) { 1.75 + x1 = fb->width - 1; 1.76 + } 1.77 1.78 cidx = left[y].cidx; 1.79 #if !defined(INTERP_DEPTH) && !defined(INTERP_ENERGY) && !defined(INTERP_TEX) 1.80 + if(x0 < 0) x0 = 0; 1.81 + len = x1 - x0; 1.82 + assert(len >= 0); 1.83 /* no interpolation at all, just memset the whole scanline */ 1.84 memset(sline + x0, cidx + left[y].energy * st->col_range, len); 1.85 #else 1.86 @@ -160,29 +184,72 @@ 1.87 return; 1.88 } 1.89 1.90 + if(x0 >= 0) { 1.91 #ifdef INTERP_DEPTH 1.92 - z = left[y].pos.z; 1.93 - dz = right[y].pos.z - z; 1.94 - dfdz = dz / dx; 1.95 + z = left[y].pos.z; 1.96 + dz = right[y].pos.z - z; 1.97 + dfdz = dz / dx; 1.98 #endif 1.99 #ifdef INTERP_ENERGY 1.100 - e = left[y].energy; 1.101 - de = right[y].energy - e; 1.102 - dfde = de / dx; 1.103 + e = left[y].energy; 1.104 + de = right[y].energy - e; 1.105 + dfde = de / dx; 1.106 #endif 1.107 #ifdef INTERP_TEX 1.108 - u = left[y].tc.x; 1.109 - v = left[y].tc.y; 1.110 - du = right[y].tc.x - u; 1.111 - dv = right[y].tc.y - v; 1.112 - dfdu = du / dx; 1.113 - dfdv = dv / dx; 1.114 + u = left[y].tc.x; 1.115 + v = left[y].tc.y; 1.116 + du = right[y].tc.x - u; 1.117 + dv = right[y].tc.y - v; 1.118 + dfdu = du / dx; 1.119 + dfdv = dv / dx; 1.120 #endif 1.121 + } else { 1.122 + float dist = -left[y].pos.x; 1.123 + 1.124 +#ifdef INTERP_DEPTH 1.125 + dz = right[y].pos.z - left[y].pos.z; 1.126 + dfdz = dz / dx; 1.127 + z = left[y].pos.z + dfdz * dist; 1.128 +#endif 1.129 +#ifdef INTERP_ENERGY 1.130 + de = right[y].energy - left[y].energy; 1.131 + dfde = de / dx; 1.132 + e = left[y].energy + dfde * dist; 1.133 +#endif 1.134 +#ifdef INTERP_TEX 1.135 + du = right[y].tc.x - left[y].tc.x; 1.136 + dv = right[y].tc.y - left[y].tc.y; 1.137 + dfdu = du / dx; 1.138 + dfdv = dv / dx; 1.139 + u = left[y].tc.x + dfdu * dist; 1.140 + v = left[y].tc.y + dfdv * dist; 1.141 +#endif 1.142 + x0 = 0; 1.143 + } 1.144 + 1.145 + len = x1 - x0; 1.146 1.147 for(i=0; i<len; i++) { 1.148 int c = cidx; 1.149 1.150 #ifdef INTERP_DEPTH 1.151 + int pix = (sline + x0 + i) - fb->pixels; 1.152 + unsigned short zval = (unsigned short)(z * USHRT_MAX); 1.153 + unsigned short *zptr = fb->zbuf[ZTILE(pix)] + ZTILE_OFFS(pix); 1.154 + 1.155 + if(z < 0.0 || z >= 1.0 || zval > *zptr) { 1.156 +# ifdef INTERP_TEX 1.157 + u += dfdu; 1.158 + v += dfdv; 1.159 +# endif 1.160 +# ifdef INTERP_ENERGY 1.161 + e += dfde; 1.162 +# endif 1.163 + z += dfdz; 1.164 + continue; 1.165 + } 1.166 + 1.167 + *zptr = zval; 1.168 z += dfdz; 1.169 #endif 1.170 #ifdef INTERP_TEX