From 72208a3a02b52f5595a27f2abefecac8add81323 Mon Sep 17 00:00:00 2001 From: Lee Salzman Date: Sun, 14 Sep 2008 23:08:15 +0000 Subject: [PATCH] better shadow tile resolution in vertical direction git-svn-id: svn://svn.code.sf.net/p/actiongame/code/trunk/ac@2598 e016b1c5-ed68-44aa-a2f7-31cac88cffde --- source/src/shadow.cpp | 79 ++++++++++++++++++++++--------------------- 1 file changed, 40 insertions(+), 39 deletions(-) diff --git a/source/src/shadow.cpp b/source/src/shadow.cpp index 5368e05d..cc3f5712 100644 --- a/source/src/shadow.cpp +++ b/source/src/shadow.cpp @@ -12,9 +12,10 @@ VAR(shadowtile, 0, 1, 1); VAR(dbgtiles, 0, 0, 1); VAR(shadowcasters, 1, 0, 0); -#define SHADOWTILES 32 -#define SHADOWTILEMASK (0xFFFFFFFFU>>(32-SHADOWTILES)) -uint shadowtiles[SHADOWTILES+1]; +#define SHADOWROWS 64 +#define SHADOWCOLUMNS 32 +#define SHADOWCOLUMNMASK (0xFFFFFFFFU>>(32-SHADOWCOLUMNS)) +uint shadowtiles[SHADOWROWS+1]; float shadowx1 = 1, shadowy1 = 1, shadowx2 = -1, shadowy2 = -1; static void extrudeshadowtiles(int x1, int y1, int x2, int y2, int x3, int y3) @@ -23,7 +24,7 @@ static void extrudeshadowtiles(int x1, int y1, int x2, int y2, int x3, int y3) if(y2 > y3) { swap(x2, x3); swap(y2, y3); } if(y1 > y2) { swap(x1, x2); swap(y1, y2); } - if(y3 < 0 || y1 >= SHADOWTILES) return; + if(y3 < 0 || y1 >= SHADOWROWS) return; int lx = x1, rx = x1, fracl = 0, fracr = 0, @@ -45,7 +46,7 @@ static void extrudeshadowtiles(int x1, int y1, int x2, int y2, int x3, int y3) } int cy = y1; - y2 = min(y2, SHADOWTILES); + y2 = min(y2, SHADOWROWS); if(cy < 0 && y2 > cy) { int dy = min(y2, 0) - cy; @@ -65,10 +66,10 @@ static void extrudeshadowtiles(int x1, int y1, int x2, int y2, int x3, int y3) while(fracl >= dly) { lx += ldir; if(ldir < 0) cx1 = lx; fracl -= dly; } fracr += drx; while(fracr >= dry) { rx += rdir; if(rdir > 0) cx2 = rx; fracr -= dry; } - if(cx1 < SHADOWTILES && cx2 >= 0) shadowtiles[cy] |= (SHADOWTILEMASK>>(SHADOWTILES - (min(cx2, SHADOWTILES-1)+1))) & (SHADOWTILEMASK<= 0) shadowtiles[cy] |= (SHADOWCOLUMNMASK>>(SHADOWCOLUMNS - (min(cx2, SHADOWCOLUMNS-1)+1))) & (SHADOWCOLUMNMASK<= SHADOWTILES) return; + if(cy >= SHADOWROWS) return; if(x2 < x3 || y1 == cy) { @@ -95,7 +96,7 @@ static void extrudeshadowtiles(int x1, int y1, int x2, int y2, int x3, int y3) fracr = 0; } - y3 = min(y3, SHADOWTILES); + y3 = min(y3, SHADOWROWS); if(cy < 0 && y3 > cy) { int dy = min(y3, 0) - cy; @@ -115,10 +116,10 @@ static void extrudeshadowtiles(int x1, int y1, int x2, int y2, int x3, int y3) while(fracl >= dly) { lx += ldir; if(ldir < 0) cx1 = lx; fracl -= dly; } fracr += drx; while(fracr >= dry) { rx += rdir; if(rdir > 0) cx2 = rx; fracr -= dry; } - if(cx1 < SHADOWTILES && cx2 >= 0) shadowtiles[cy] |= (SHADOWTILEMASK>>(SHADOWTILES - (min(cx2, SHADOWTILES-1)+1))) & (SHADOWTILEMASK<= 0) shadowtiles[cy] |= (SHADOWCOLUMNMASK>>(SHADOWCOLUMNS - (min(cx2, SHADOWCOLUMNS-1)+1))) & (SHADOWCOLUMNMASK<= dry) { rx += rdir; if(rdir > 0) cx2 = rx; fracr -= dry; } } - if(cx1 < SHADOWTILES && cx2 >= 0) shadowtiles[cy] |= (SHADOWTILEMASK>>(SHADOWTILES - (min(cx2, SHADOWTILES-1)+1))) & (SHADOWTILEMASK<= 0) shadowtiles[cy] |= (SHADOWCOLUMNMASK>>(SHADOWCOLUMNS - (min(cx2, SHADOWCOLUMNS-1)+1))) & (SHADOWCOLUMNMASK<>(SHADOWTILES - (tx2+1))) & (SHADOWTILEMASK<>(SHADOWCOLUMNS - (tx2+1))) & (SHADOWCOLUMNMASK<= 1 && x >= 1) || (sy1 >= 1 && y >= 1) || (sx2 <= -1 && x <= -1) || (sy2 <= -1 && y <= -1)) return false; - int tx = int(floor(SHADOWTILES * (x + 1) / 2)), ty = int(floor(SHADOWTILES * (y + 1) / 2)), - tx1 = int(floor(SHADOWTILES * (sx1 + 1) / 2)), ty1 = int(floor(SHADOWTILES * (sy1 + 1) / 2)), - tx2 = int(floor(SHADOWTILES * (sx2 + 1) / 2)), ty2 = int(floor(SHADOWTILES * (sy2 + 1) / 2)); + int tx = int(floor(SHADOWCOLUMNS * (y + 1) / 2)), ty = int(floor(SHADOWROWS * (x + 1) / 2)), + tx1 = int(floor(SHADOWCOLUMNS * (sy1 + 1) / 2)), ty1 = int(floor(SHADOWROWS * (sx1 + 1) / 2)), + tx2 = int(floor(SHADOWCOLUMNS * (sy2 + 1) / 2)), ty2 = int(floor(SHADOWROWS * (sx2 + 1) / 2)); if(tx < tx1) { if(ty < ty1) { swap(ty1, ty2); tx1--; ty1--; } @@ -259,10 +260,10 @@ static void rendershadowtiles() if(shadowx1 >= shadowx2 || shadowy1 >= shadowy2) return; - float clipx1 = (shadowx1 + 1) / 2, - clipy1 = (shadowy1 + 1) / 2, - clipx2 = (shadowx2 + 1) / 2, - clipy2 = (shadowy2 + 1) / 2; + float clipx1 = (shadowy1 + 1) / 2, + clipy1 = (shadowx1 + 1) / 2, + clipx2 = (shadowy2 + 1) / 2, + clipy2 = (shadowx2 + 1) / 2; if(!shadowclip) { clipx1 = clipy1 = 0; @@ -272,18 +273,18 @@ static void rendershadowtiles() if(!shadowtile) { glBegin(GL_QUADS); - glVertex2f(clipx1, clipy2); - glVertex2f(clipx2, clipy2); - glVertex2f(clipx2, clipy1); - glVertex2f(clipx1, clipy1); + glVertex2f(clipy1, clipx1); + glVertex2f(clipy1, clipx2); + glVertex2f(clipy2, clipx2); + glVertex2f(clipy2, clipx1); xtraverts += 4; glEnd(); return; } glBegin(GL_QUADS); - float tsz = 1.0f/SHADOWTILES; - loop(y, SHADOWTILES+1) + float tw = 1.0f/SHADOWCOLUMNS, th = 1.0f/SHADOWROWS; + loop(y, SHADOWROWS+1) { uint mask = shadowtiles[y]; int x = 0; @@ -293,21 +294,21 @@ static void rendershadowtiles() while(!(mask&1)) { mask >>= 1; x++; } int xstart = x; do { mask >>= 1; x++; } while(mask&1); - uint strip = (SHADOWTILEMASK>>(SHADOWTILES - x)) & (SHADOWTILEMASK<>(SHADOWCOLUMNS - x)) & (SHADOWCOLUMNMASK<