# HG changeset patch # User John Tsiombikas # Date 1404246217 -10800 # Node ID 2e903e27e35a56bd2f9246c5434c956c9e9cbfc4 # Parent 62390f9cc93e75fdaf8e6af74240c68822f992af fixed x3d_disable_texture added runtime teture checks in the rasterizer diff -r 62390f9cc93e -r 2e903e27e35a src/polyfill.c --- a/src/polyfill.c Mon Jun 30 09:07:41 2014 +0300 +++ b/src/polyfill.c Tue Jul 01 23:23:37 2014 +0300 @@ -19,21 +19,6 @@ int32_t v0, int32_t v1, uint16_t color, struct texture *tex); static int winding(int32_t x0, int32_t y0, int32_t x1, int32_t y1); -#ifdef USE_TEX -static uint16_t tex_lookup(struct texture *tex, int tx, int ty); - -/* TODO currently the linkscript will put statics in iwram. make this explicit */ -#define TCACHE_XSZ 16 -#define TCACHE_YSZ 16 - -static struct { - uint16_t pixels[TCACHE_XSZ * TCACHE_YSZ]; - struct texture *tex; - int orig_x, orig_y; -} tcache; -#endif /* USE_TEX */ - - void draw_poly(int num, const pvec3 *verts, const pvec2 *texcoords, uint16_t color, struct texture *tex) { @@ -94,10 +79,12 @@ lx = verts[lidx[0]].x; ldxdy = x16div(verts[lidx[1]].x - lx, ldy); #ifdef USE_TEX - lu = texcoords[lidx[0]].x; - ldudy = x16div(texcoords[lidx[1]].x - lu, ldy); - lv = texcoords[lidx[0]].y; - ldvdy = x16div(texcoords[lidx[1]].y - lv, ldy); + if(tex) { + lu = texcoords[lidx[0]].x; + ldudy = x16div(texcoords[lidx[1]].x - lu, ldy); + lv = texcoords[lidx[0]].y; + ldvdy = x16div(texcoords[lidx[1]].y - lv, ldy); + } #endif /* find starting right edge */ @@ -117,14 +104,16 @@ rx = verts[ridx[0]].x; rdxdy = x16div(verts[ridx[1]].x - rx, rdy); #ifdef USE_TEX - ru = texcoords[ridx[0]].x; - rdudy = x16div(texcoords[ridx[1]].x - ru, rdy); - rv = texcoords[ridx[0]].y; - rdvdy = x16div(texcoords[ridx[1]].y - rv, rdy); + if(tex) { + ru = texcoords[ridx[0]].x; + rdudy = x16div(texcoords[ridx[1]].x - ru, rdy); + rv = texcoords[ridx[0]].y; + rdvdy = x16div(texcoords[ridx[1]].y - rv, rdy); + } #endif - start = topy >> 16; - end = boty >> 16; + start = (topy + 32768) >> 16; + end = (boty + 32768) >> 16; if(end >= HEIGHT) end = HEIGHT - 1; @@ -147,14 +136,16 @@ } #ifdef USE_TEX - lu = texcoords[lidx[0]].x; - lv = texcoords[lidx[0]].y; - if(ldy) { - ldudy = x16div(texcoords[lidx[1]].x - lu, ldy); - ldvdy = x16div(texcoords[lidx[1]].y - lv, ldy); - } else { - ldudy = texcoords[lidx[1]].x - lu; - ldvdy = texcoords[lidx[1]].y - lv; + if(tex) { + lu = texcoords[lidx[0]].x; + lv = texcoords[lidx[0]].y; + if(ldy) { + ldudy = x16div(texcoords[lidx[1]].x - lu, ldy); + ldvdy = x16div(texcoords[lidx[1]].y - lv, ldy); + } else { + ldudy = texcoords[lidx[1]].x - lu; + ldvdy = texcoords[lidx[1]].y - lv; + } } #endif /* USE_TEX */ } @@ -174,14 +165,16 @@ } #ifdef USE_TEX - ru = texcoords[ridx[0]].x; - rv = texcoords[ridx[0]].y; - if(rdy) { - rdudy = x16div(texcoords[ridx[1]].x - ru, rdy); - rdvdy = x16div(texcoords[ridx[1]].y - rv, rdy); - } else { - rdudy = texcoords[ridx[1]].x - ru; - rdvdy = texcoords[ridx[1]].y - rv; + if(tex) { + ru = texcoords[ridx[0]].x; + rv = texcoords[ridx[0]].y; + if(rdy) { + rdudy = x16div(texcoords[ridx[1]].x - ru, rdy); + rdvdy = x16div(texcoords[ridx[1]].y - rv, rdy); + } else { + rdudy = texcoords[ridx[1]].x - ru; + rdvdy = texcoords[ridx[1]].y - rv; + } } #endif /* USE_TEX */ } @@ -199,10 +192,12 @@ y += 65536; #ifdef USE_TEX - lu += ldudy; - lv += ldvdy; - ru += rdudy; - rv += rdvdy; + if(tex) { + lu += ldudy; + lv += ldvdy; + ru += rdudy; + rv += rdvdy; + } #endif } } @@ -293,16 +288,18 @@ } #ifdef USE_TEX - dx = x1 - x0; + if(tex) { + dx = x1 - x0; - u = u0; - v = v0; - if(dx) { - dudx = x16div(u1 - u0, dx); - dvdx = x16div(v1 - v0, dx); - } else { - dudx = u1 - u0; - dvdx = v1 - v0; + u = u0; + v = v0; + if(dx) { + dudx = x16div(u1 - u0, dx); + dvdx = x16div(v1 - v0, dx); + } else { + dudx = u1 - u0; + dvdx = v1 - v0; + } } #endif @@ -318,8 +315,7 @@ for(i=ix0; i> (16 - tex->ushift)) & tex->umask; int ty = (v >> (16 - tex->vshift)) & tex->vmask; - *pixels++ = tex_lookup(tex, tx, ty); - //*pixels++ = ((uint16_t*)tex->pixels)[ty * tex->xsz + yx]; + *pixels++ = ((uint16_t*)tex->pixels)[ty * tex->xsz + tx]; u += dudx; v += dvdx; @@ -336,8 +332,8 @@ void draw_point(const pvec3 *v, uint16_t color) { - int x = v->x >> 16; - int y = v->y >> 16; + int x = (v->x + 32768) >> 16; + int y = (v->y + 32768) >> 16; uint16_t *pixels = (uint16_t*)back_buffer->pixels; if(x < 0 || x >= WIDTH || y < 0 || y >= HEIGHT) { @@ -360,53 +356,3 @@ { return x16mul(x0, y1) - x16mul(y0, x1); } - -#ifdef USE_TEX -#define MIN(a, b) ((a) < (b) ? (a) : (b)) -static uint16_t tex_lookup(struct texture *tex, int tx, int ty) -{ - int x, y, i, j; - int width, height; - uint16_t *ptr; - int cx = tx - tcache.orig_x; - int cy = ty - tcache.orig_y; - - if(tcache.tex == tex && cx >= 0 && cx < TCACHE_XSZ && cy >= 0 && cy < TCACHE_YSZ) { - return tcache.pixels[cy * TCACHE_XSZ + cx]; - } - - tcache.tex = tex; - x = tx - TCACHE_XSZ / 2; - y = ty - TCACHE_YSZ / 2; - - if(x + TCACHE_XSZ > tex->xsz) { - x = tex->xsz - TCACHE_XSZ; - } - if(y + TCACHE_YSZ > tex->ysz) { - y = tex->ysz - TCACHE_YSZ; - } - - if(x < 0) x = 0; - if(y < 0) y = 0; - - width = MIN(TCACHE_XSZ, tex->xsz - x); - height = MIN(TCACHE_YSZ, tex->ysz - y); - - tcache.orig_x = x; - tcache.orig_y = y; - - /*logmsg(LOG_DBG, "lookup(%d, %d): loading %dx%d+%d+%d into cache %p\n", tx, ty, - width, height, x, y, tcache.pixels); - */ - - ptr = (uint16_t*)tex->pixels + y * tex->xsz + x; - for(i=0; ixsz; - } - - cx = tx - tcache.orig_x; - cy = ty - tcache.orig_y; - return tcache.pixels[cy * TCACHE_XSZ + cx]; -} -#endif /* USE_TEX */ diff -r 62390f9cc93e -r 2e903e27e35a src/x3d.c --- a/src/x3d.c Mon Jun 30 09:07:41 2014 +0300 +++ b/src/x3d.c Tue Jul 01 23:23:37 2014 +0300 @@ -352,9 +352,7 @@ for(i=0; i