Skip to content

Commit 2a8cfbb

Browse files
committed
accommodate square pixel aspect tiles for rotatesprite
Used for situations where the tile data represents a 1:1 pixel aspect and has to be rendered by rotatesprite(). Apply `|256` to existing `dastat&(2|8)` and the aspect correction calculation will be skipped. Makes the svga tiles in TekWar properly cover the 4:3 frame.
1 parent 7fa7c12 commit 2a8cfbb

File tree

4 files changed

+24
-10
lines changed

4 files changed

+24
-10
lines changed

include/build.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -422,7 +422,7 @@ void drawmasks(void);
422422
void clearview(int dacol);
423423
void clearallviews(int dacol);
424424
void drawmapview(int dax, int day, int zoome, short ang);
425-
void rotatesprite(int sx, int sy, int z, short a, short picnum, signed char dashade, unsigned char dapalnum, unsigned char dastat, int cx1, int cy1, int cx2, int cy2);
425+
void rotatesprite(int sx, int sy, int z, short a, short picnum, signed char dashade, unsigned char dapalnum, unsigned short dastat, int cx1, int cy1, int cx2, int cy2);
426426
void drawline256(int x1, int y1, int x2, int y2, unsigned char col);
427427
void printext256(int xpos, int ypos, short col, short backcol, const char *name, char fontsize);
428428

src/engine.c

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -536,7 +536,8 @@ typedef struct
536536
int sx, sy, z;
537537
short a, picnum;
538538
signed char dashade;
539-
unsigned char dapalnum, dastat, pagesleft;
539+
unsigned char dapalnum, pagesleft;
540+
unsigned short dastat;
540541
int cx1, cy1, cx2, cy2;
541542
int uniqid; //JF extension
542543
} permfifotype;
@@ -4374,7 +4375,7 @@ static int clippoly4(int cx1, int cy1, int cx2, int cy2)
43744375
//
43754376
//JBF 20031206: Thanks to Ken's hunting, s/(rx1|ry1|rx2|ry2)/n\1/ in this function
43764377
static void dorotatesprite(int sx, int sy, int z, short a, short picnum, signed char dashade,
4377-
unsigned char dapalnum, unsigned char dastat, int cx1, int cy1, int cx2, int cy2, int uniqid)
4378+
unsigned char dapalnum, unsigned short dastat, int cx1, int cy1, int cx2, int cy2, int uniqid)
43784379
{
43794380
int cosang, sinang, v, nextv, dax1, dax2, oy, bx, by;
43804381
int x, y, x1, y1, x2, y2, gx1, gy1, iv;
@@ -4438,11 +4439,16 @@ static void dorotatesprite(int sx, int sy, int z, short a, short picnum, signed
44384439

44394440
xv = mulscale14(cosang,z);
44404441
yv = mulscale14(sinang,z);
4441-
if (((dastat&2) != 0) || ((dastat&8) == 0)) //Don't aspect unscaled perms
4442+
if (((dastat&2) != 0 && (dastat&256) == 0) || ((dastat&8) == 0)) //Don't aspect unscaled perms
44424443
{
44434444
xv2 = mulscale16(xv,xyaspect);
44444445
yv2 = mulscale16(yv,xyaspect);
44454446
}
4447+
else if (pixelaspect == 65536 && ((dastat&2) && (dastat&256))) //Skew 1:1 to 1.2:1 aspect
4448+
{
4449+
xv2 = mulscale16(xv,78643);
4450+
yv2 = mulscale16(yv,78643);
4451+
}
44464452
else
44474453
{
44484454
xv2 = xv;
@@ -4502,11 +4508,16 @@ static void dorotatesprite(int sx, int sy, int z, short a, short picnum, signed
45024508
iv = divscale32(1L,z);
45034509
xv = mulscale14(sinang,iv);
45044510
yv = mulscale14(cosang,iv);
4505-
if (((dastat&2) != 0) || ((dastat&8) == 0)) //Don't aspect unscaled perms
4511+
if (((dastat&2) != 0 && (dastat&256) == 0) || ((dastat&8) == 0)) //Don't aspect unscaled perms
45064512
{
45074513
yv2 = mulscale16(-xv,yxaspect);
45084514
xv2 = mulscale16(yv,yxaspect);
45094515
}
4516+
else if (pixelaspect == 65536 && ((dastat&2) && (dastat&256))) //Skew 1:1 to 1.2:1 aspect
4517+
{
4518+
yv2 = mulscale16(-xv,54613);
4519+
xv2 = mulscale16(yv,54613);
4520+
}
45104521
else
45114522
{
45124523
yv2 = -xv;
@@ -9948,7 +9959,7 @@ void flushperms(void)
99489959
// rotatesprite
99499960
//
99509961
void rotatesprite(int sx, int sy, int z, short a, short picnum, signed char dashade,
9951-
unsigned char dapalnum, unsigned char dastat, int cx1, int cy1, int cx2, int cy2)
9962+
unsigned char dapalnum, unsigned short dastat, int cx1, int cy1, int cx2, int cy2)
99529963
{
99539964
int i, gap = -1;
99549965
permfifotype *per, *per2;

src/polymost.c

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3715,9 +3715,10 @@ void polymost_drawsprite (int snum)
37153715
//dastat&32 1:reverse translucence
37163716
//dastat&64 1:non-masked, 0:masked
37173717
//dastat&128 1:draw all pages (permanent)
3718+
//dastat&256 1:one-to-one pixel aspect (when dastat&2)
37183719
//cx1,... clip window (actual screen coords)
37193720
void polymost_dorotatesprite (int sx, int sy, int z, short a, short picnum,
3720-
signed char dashade, unsigned char dapalnum, unsigned char dastat, int cx1, int cy1, int cx2, int cy2, int uniqid)
3721+
signed char dashade, unsigned char dapalnum, unsigned short dastat, int cx1, int cy1, int cx2, int cy2, int uniqid)
37213722
{
37223723
int n, nn, x, zz, xoff, yoff, xsiz, ysiz, method;
37233724
int ogpicnum, ogshade, ogpal, oxdimen, oydimen;
@@ -3768,7 +3769,7 @@ void polymost_dorotatesprite (int sx, int sy, int z, short a, short picnum,
37683769
d = (double)z/(65536.0*16384.0);
37693770
cosang2 = cosang = (double)sintable[(a+512)&2047]*d;
37703771
sinang2 = sinang = (double)sintable[a&2047]*d;
3771-
if ((dastat&2) || (!(dastat&8))) //Don't aspect unscaled perms
3772+
if (((dastat&2) && !(dastat&256)) || (!(dastat&8))) //Don't aspect unscaled perms
37723773
{ d = (double)xyaspect/65536.0; cosang2 *= d; sinang2 *= d; }
37733774
fx += -(double)xoff*cosang2+ (double)yoff*sinang2;
37743775
fy += -(double)xoff*sinang - (double)yoff*cosang;
@@ -3902,8 +3903,10 @@ void polymost_dorotatesprite (int sx, int sy, int z, short a, short picnum,
39023903
d = (double)z/(65536.0*16384.0);
39033904
cosang2 = cosang = (double)sintable[(a+512)&2047]*d;
39043905
sinang2 = sinang = (double)sintable[a&2047]*d;
3905-
if ((dastat&2) || (!(dastat&8))) //Don't aspect unscaled perms
3906+
if (((dastat&2) && !(dastat&256)) || (!(dastat&8))) //Don't aspect unscaled perms
39063907
{ d = (double)xyaspect/65536.0; cosang2 *= d; sinang2 *= d; }
3908+
else if (pixelaspect == 65536 && ((dastat&2) && (dastat&256))) //Skew 1:1 to 1.2:1 aspect
3909+
{ d = 1.2; cosang2 *= d; sinang2 *= d; }
39073910
px[0] = (double)sx/65536.0 - (double)xoff*cosang2+ (double)yoff*sinang2;
39083911
py[0] = (double)sy/65536.0 - (double)xoff*sinang - (double)yoff*cosang;
39093912
px[1] = px[0] + (double)xsiz*cosang2;

src/polymost_priv.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,5 +127,5 @@ void polymost_drawrooms (void);
127127
void polymost_drawmaskwall (int damaskwallcnt);
128128
void polymost_drawsprite (int snum);
129129
void polymost_dorotatesprite (int sx, int sy, int z, short a, short picnum,
130-
signed char dashade, unsigned char dapalnum, unsigned char dastat, int cx1, int cy1, int cx2, int cy2, int uniqid);
130+
signed char dashade, unsigned char dapalnum, unsigned short dastat, int cx1, int cy1, int cx2, int cy2, int uniqid);
131131
void polymost_initosdfuncs(void);

0 commit comments

Comments
 (0)