Mapster32: further 2d mode performance improvements. Sprites are also now displayed with their xrepeat and yrepeat taken into account. It's not perfect yet... needs more "jiggery-pokery"

git-svn-id: https://svn.eduke32.com/eduke32@5293 1a8010ca-5511-0410-912e-c29ae57300e0
This commit is contained in:
terminx 2015-07-11 23:07:47 +00:00
parent e20e6584d6
commit 868afddbc3
5 changed files with 280 additions and 229 deletions

View file

@ -75,11 +75,17 @@ void hlineasm4(int32_t cnt, int32_t skiploadincs, int32_t paloffs, uint32_t by,
#ifdef CLASSIC_SLICE_BY_4 #ifdef CLASSIC_SLICE_BY_4
for (; cnt>=4; cnt-=4, pp-=4) for (; cnt>=4; cnt-=4, pp-=4)
{ {
#if 0
*pp = palptr[buf[((bx>>log32.x)<<log.y)+(by>>log32.y)]]; *pp = palptr[buf[((bx>>log32.x)<<log.y)+(by>>log32.y)]];
*(pp-1) = palptr[buf[(((bx-inc.x)>>log32.x)<<log.y)+((by-inc.y)>>log32.y)]]; *(pp-1) = palptr[buf[(((bx-inc.x)>>log32.x)<<log.y)+((by-inc.y)>>log32.y)]];
*(pp-2) = palptr[buf[(((bx-(inc.x<<1))>>log32.x)<<log.y)+((by-(inc.y<<1))>>log32.y)]]; *(pp-2) = palptr[buf[(((bx-(inc.x<<1))>>log32.x)<<log.y)+((by-(inc.y<<1))>>log32.y)]];
*(pp-3) = palptr[buf[(((bx-(inc.x*3))>>log32.x)<<log.y)+((by-(inc.y*3))>>log32.y)]]; *(pp-3) = palptr[buf[(((bx-(inc.x*3))>>log32.x)<<log.y)+((by-(inc.y*3))>>log32.y)]];
#else
*(int32_t *)(pp-3) = palptr[buf[(((bx-(inc.x*3))>>log32.x)<<log.y)+((by-(inc.y*3))>>log32.y)]] +
(palptr[buf[(((bx-(inc.x<<1))>>log32.x)<<log.y)+((by-(inc.y<<1))>>log32.y)]]<<8) +
(palptr[buf[(((bx-inc.x)>>log32.x)<<log.y)+((by-inc.y)>>log32.y)]]<<16) +
(palptr[buf[((bx>>log32.x)<<log.y)+(by>>log32.y)]]<<24);
#endif
bx -= inc.x<<2; bx -= inc.x<<2;
by -= inc.y<<2; by -= inc.y<<2;
} }

View file

@ -1573,39 +1573,51 @@ static inline void drawline16base(int32_t bx, int32_t by, int32_t x1, int32_t y1
void drawsmallabel(const char *text, char col, char backcol, char border, int32_t dax, int32_t day, int32_t daz) void drawsmallabel(const char *text, char col, char backcol, char border, int32_t dax, int32_t day, int32_t daz)
{ {
int32_t x1, y1, x2, y2;
screencoords(&dax,&day, dax-pos.x,day-pos.y, zoom); screencoords(&dax,&day, dax-pos.x,day-pos.y, zoom);
if (m32_sideview) if (m32_sideview)
day += getscreenvdisp(daz-pos.z, zoom); day += getscreenvdisp(daz-pos.z, zoom);
x1 = halfxdim16+dax-(Bstrlen(text)<<1); int32_t const x1 = halfxdim16+dax-(Bstrlen(text)<<1);
y1 = midydim16+day-4; int32_t const y1 = midydim16+day-4;
x2 = x1 + (Bstrlen(text)<<2)+2; int32_t const x2 = x1 + (Bstrlen(text)<<2)+2;
y2 = y1 + 7; int32_t const y2 = y1 + 7;
int f = mulscale8(x2-x1, zoom); int f = mulscale8(x2-x1, zoom);
if ((x1 > -f) && (x2 < xdim+f) && (y1 > -f) && (y2 < ydim16+f)) if ((x1 <= -f) || (x2 >= xdim + f) || (y1 <= -f) || (y2 >= ydim16 + f))
return;
printext16(x1,y1, col,backcol, text,1);
drawline16(x1-2, y1-2, x2-2, y1-2, border);
drawline16(x1-2, y2+1, x2-2, y2+1, border);
drawline16(x1-3, y1-1, x1-3, y2+0, border);
drawline16(x2-1, y1-1, x2-1, y2+0, border);
drawline16(x1-1,y1-1, x2-3,y1-1, backcol);
drawline16(x1-1,y2+0, x2-3,y2+0, backcol);
drawline16(x1-2,y1+0, x1-2,y2-1, backcol);
drawline16(x2-2,y1+0, x2-2,y2-1, backcol);
drawline16(x2-3,y1+0, x2-3,y2+0, backcol);
begindrawing(); //{{{
if ((unsigned)y1-1 < ydim16+0u && (unsigned) (x1-2) < xdim2d+0u && (unsigned) (x2-2) < xdim2d+0u)
{ {
printext16(x1,y1, col,backcol, text,1); drawpixel((char *) (frameplace + ((y1-1) * bytesperline) + (x1-2)), border);
drawpixel((char *) (frameplace + ((y1-1) * bytesperline) + (x2-2)), border);
drawline16(x1-2, y1-2, x2-2, y1-2, border);
drawline16(x1-2, y2+2, x2-2, y2+2, border);
drawline16(x1-2, y1-1, x2-2, y1-1, border);
drawline16(x1-2, y2+1, x2-2, y2+1, border);
drawline16(x1-3, y1-1, x1-3, y2+1, border);
drawline16(x2-1, y1-1, x2-1, y2+1, border);
drawline16(x1-1,y1-1, x2-3,y1-1, backcol);
drawline16(x1-1,y2+1, x2-3,y2+1, backcol);
drawline16(x1-2,y1, x1-2,y2, backcol);
drawline16(x2-2,y1, x2-2,y2, backcol);
drawline16(x2-3,y1, x2-3,y2, backcol);
} }
if ((unsigned) y2 < ydim16+0u && (unsigned) (x1-2) < xdim2d+0u && (unsigned) (x2-2) < xdim2d+0u)
{
drawpixel((char *) (frameplace + ((y2) * bytesperline) + (x1-2)), border);
drawpixel((char *) (frameplace + ((y2) * bytesperline) + (x2-2)), border);
}
enddrawing();
} }
// backup highlighted sectors with sprites as mapinfo for later restoration // backup highlighted sectors with sprites as mapinfo for later restoration
@ -3342,16 +3354,16 @@ void overheadeditor(void)
if (zoom < ztarget) if (zoom < ztarget)
{ {
if ((ztarget - zoom) >> 3) if ((ztarget - zoom) >> 3)
zoom += (ztarget - zoom) >> 3; zoom += synctics * ((ztarget - zoom) >> 3);
else zoom++; else zoom++;
zoom = min(zoom, ztarget); zoom = min(zoom, ztarget);
if (zoom == 65536) if (zoom >= 39936)
silentmessage("Ludicrous Zoom!"); silentmessage("Ludicrous Zoom!");
} }
else if (zoom > ztarget) else if (zoom > ztarget)
{ {
if ((zoom - ztarget) >> 3) if ((zoom - ztarget) >> 3)
zoom -= (zoom - ztarget) >> 3; zoom -= synctics * ((zoom - ztarget) >> 3);
else zoom--; else zoom--;
zoom = max(zoom, ztarget); zoom = max(zoom, ztarget);
} }
@ -3478,34 +3490,30 @@ void overheadeditor(void)
draw2dgrid(pos.x,pos.y,pos.z,cursectnum,ang,zoom,grid); draw2dgrid(pos.x,pos.y,pos.z,cursectnum,ang,zoom,grid);
CallExtPreCheckKeys(); CallExtPreCheckKeys();
{
int32_t cx, cy;
// Draw brown arrow (start)
screencoords(&x2, &y2, startpos.x-pos.x,startpos.y-pos.y, zoom);
if (m32_sideview)
y2 += getscreenvdisp(startpos.z-pos.z, zoom);
cx = halfxdim16+x2;
cy = midydim16+y2;
if ((cx >= 2 && cx <= xdim-3) && (cy >= 2 && cy <= ydim16-3))
{
int16_t angofs = m32_sideview ? m32_sideang : 0;
x1 = mulscale11(sintable[(startang+angofs+2560)&2047],zoom) / 768;
y1 = mulscale11(sintable[(startang+angofs+2048)&2047],zoom) / 768;
i = scalescreeny(x1);
j = scalescreeny(y1);
begindrawing(); //{{{
drawline16base(cx,cy, x1,j, -x1,-j, editorcolors[2]);
drawline16base(cx,cy, x1,j, +y1,-i, editorcolors[2]);
drawline16base(cx,cy, x1,j, -y1,+i, editorcolors[2]);
enddrawing(); //}}}
}
}
draw2dscreen(&pos,cursectnum,ang,zoom,grid); draw2dscreen(&pos,cursectnum,ang,zoom,grid);
// Draw brown arrow (start)
screencoords(&x2, &y2, startpos.x-pos.x,startpos.y-pos.y, zoom);
if (m32_sideview)
y2 += getscreenvdisp(startpos.z-pos.z, zoom);
int32_t cx = halfxdim16+x2;
int32_t cy = midydim16+y2;
if ((cx >= 2 && cx <= xdim-3) && (cy >= 2 && cy <= ydim16-3))
{
int16_t angofs = m32_sideview ? m32_sideang : 0;
x1 = mulscale11(sintable[(startang+angofs+2560)&2047],zoom) / 768;
y1 = mulscale11(sintable[(startang+angofs+2048)&2047],zoom) / 768;
i = scalescreeny(x1);
j = scalescreeny(y1);
begindrawing(); //{{{
drawline16base(cx,cy, x1,j, -x1,-j, editorcolors[6]);
drawline16base(cx,cy, x1,j, +y1,-i, editorcolors[6]);
drawline16base(cx,cy, x1,j, -y1,+i, editorcolors[6]);
enddrawing(); //}}}
}
begindrawing(); //{{{ begindrawing(); //{{{
if (keystatus[0x2a] && (pointhighlight&16384) && highlightcnt<=0) // LShift if (keystatus[0x2a] && (pointhighlight&16384) && highlightcnt<=0) // LShift
@ -5914,7 +5922,7 @@ end_point_dragging:
{ {
int32_t didzoom=0; int32_t didzoom=0;
if ((DOWN_BK(MOVEUP) || (bstatus&16)) && zoom < 65536) if ((DOWN_BK(MOVEUP) || (bstatus&16)) && zoom < 39936)
{ {
if (DOWN_BK(MOVEUP)) if (DOWN_BK(MOVEUP))
{ {
@ -5953,7 +5961,7 @@ end_point_dragging:
pos.x = mousxplc; pos.x = mousxplc;
pos.y = mousyplc; pos.y = mousyplc;
} }
ztarget = clamp(ztarget, 16, 65536); ztarget = clamp(ztarget, 16, 39936);
_printmessage16("Zoom: %d",ztarget); _printmessage16("Zoom: %d",ztarget);
} }

View file

@ -7057,8 +7057,8 @@ static void fillpolygon(int32_t npoints)
x1 += mulscale12((day1<<12)+4095-y1, xinc); x1 += mulscale12((day1<<12)+4095-y1, xinc);
for (y=day1; y<day2; y++) for (y=day1; y<day2; y++)
{ {
if (dotp2[y]) Bassert(dotp2[y]);
*(dotp2[y]++) = x1>>12; *(dotp2[y]++) = x1>>12;
x1 += xinc; x1 += xinc;
} }
} }
@ -7067,8 +7067,8 @@ static void fillpolygon(int32_t npoints)
x2 += mulscale12((day2<<12)+4095-y2, xinc); x2 += mulscale12((day2<<12)+4095-y2, xinc);
for (y=day2; y<day1; y++) for (y=day2; y<day1; y++)
{ {
if (dotp1[y]) Bassert(dotp1[y]);
*(dotp1[y]++) = x2>>12; *(dotp1[y]++) = x2>>12;
x2 += xinc; x2 += xinc;
} }
} }
@ -7122,12 +7122,10 @@ static void fillpolygon(int32_t npoints)
{ {
//maphline //maphline
const int32_t ox = x2+1-(xdim>>1); const int32_t ox = x2+1-(xdim>>1);
const int32_t bx = ox*asm1 + globalposx;
const int32_t by = ox*asm2 - globalposy;
const intptr_t p = ylookup[y]+x2+frameplace; hlineasm4(x2 - x1, -1L, globalshade << 8,
ox * asm2 - globalposy, ox * asm1 + globalposx,
hlineasm4(x2-x1,-1L,globalshade<<8,by,bx,p); ylookup[y] + x2 + frameplace);
} }
else else
{ {
@ -13749,23 +13747,25 @@ void dragpoint(int16_t pointhighlight, int32_t dax, int32_t day, uint8_t flags)
// //
int32_t lastwall(int16_t point) int32_t lastwall(int16_t point)
{ {
int32_t i, cnt;
if (point > 0 && wall[point-1].point2 == point) if (point > 0 && wall[point-1].point2 == point)
return point-1; return point-1;
i = point; int i = point, cnt = MAXWALLS;
cnt = MAXWALLS;
do do
{ {
int32_t j = wall[i].point2; int const j = wall[i].point2;
if (j == point) return(i);
i = j;
cnt--;
}
while (cnt > 0);
return(point); if (j == point)
{
point = i;
break;
}
i = j;
}
while (--cnt);
return point;
} }
@ -16523,16 +16523,16 @@ int32_t drawline16(int32_t x1, int32_t y1, int32_t x2, int32_t y2, char col)
if (y1 < 0) if (y1 < 0)
{ {
if (d.x) x1 += scale(0-y1,d.x,d.y); if (d.x)
x1 = clamp(x1 + scale(0 - y1, d.x, d.y), 0, xres - 1);
y1 = 0; y1 = 0;
x1 = clamp(x1, 0, xres-1);
} }
if (y2 >= ydim16) if (y2 >= ydim16)
{ {
if (d.x) x2 += scale(ydim16-1-y2,d.x,d.y); if (d.x)
x2 = clamp(x2 + scale(ydim16-1-y2, d.x, d.y), 0, xres-1);
y2 = ydim16-1; y2 = ydim16-1;
x2 = clamp(x2, 0, xres-1);
} }
if (d.y < 0) if (d.y < 0)
@ -16554,8 +16554,6 @@ int32_t drawline16(int32_t x1, int32_t y1, int32_t x2, int32_t y2, char col)
swaplong(&y1, &y2); swaplong(&y1, &y2);
} }
int df = 0;
uint32_t patc=UINT_MAX;
int pinc, inc = 1; int pinc, inc = 1;
begindrawing(); //{{{ begindrawing(); //{{{
@ -16577,7 +16575,7 @@ int32_t drawline16(int32_t x1, int32_t y1, int32_t x2, int32_t y2, char col)
clearbufbyte((void *)p, d.x, ((int32_t) col<<24)|((int32_t) col<<16)|((int32_t) col<<8)|col); clearbufbyte((void *)p, d.x, ((int32_t) col<<24)|((int32_t) col<<16)|((int32_t) col<<8)|col);
else if (drawlinepat == 0xffffffff) else if (drawlinepat == 0xffffffff)
{ {
for (int i=d.x; i>0; i--) for (int i=d.x, df=0; i>0; i--)
{ {
drawpixel((char *) p, col); drawpixel((char *) p, col);
df += d.y; df += d.y;
@ -16586,13 +16584,17 @@ int32_t drawline16(int32_t x1, int32_t y1, int32_t x2, int32_t y2, char col)
} }
} }
else else
for (int i=d.x; i>0; i--)
{ {
if (drawlinepat & pow2long[(++patc)&31]) uint32_t patc = UINT_MAX;
drawpixel((char *) p, col);
df += d.y; for (int i=d.x, df=0; i>0; i--)
if (df >= d.x) { df -= d.x; p += pinc; } {
p += inc; if (drawlinepat & pow2long[(++patc)&31])
drawpixel((char *) p, col);
df += d.y;
if (df >= d.x) { df -= d.x; p += pinc; }
p += inc;
}
} }
enddrawing(); //}}} enddrawing(); //}}}
@ -16611,114 +16613,154 @@ FORCE_INLINE void drawline16mid(int32_t x1, int32_t y1, int32_t x2, int32_t y2,
// >16384: grow in y // >16384: grow in y
void drawcircle16(int32_t x1, int32_t y1, int32_t r, int32_t eccen, char col) void drawcircle16(int32_t x1, int32_t y1, int32_t r, int32_t eccen, char col)
{ {
if (eccen==16384) if (eccen != 16384)
{
intptr_t p;
int32_t xp, yp, xpbpl, ypbpl, d, de, dse, patc=0;
uint32_t uxres = xres, uydim16 = ydim16;
if (r < 0) r = -r;
if (x1+r < 0 || x1-r >= xres) return;
if (y1+r < 0 || y1-r >= ydim16) return;
/*
* d
* 6 | 7
* \ | /
* 5 \|/ 8
* c----+----a
* 4 /|\ 1
* / | \
* 3 | 2
* b
*/
xp = 0;
yp = r;
d = 1 - r;
de = 2;
dse = 5 - (r << 1);
begindrawing();
p = (y1*bytesperline)+x1+frameplace;
if (drawlinepat & pow2long[(patc++)&31])
{
if ((uint32_t)y1 < uydim16 && (uint32_t)(x1+r) < uxres)
drawpixel((char *)(p+r), col); // a
if ((uint32_t)x1 < uxres && (uint32_t)(y1+r) < uydim16)
drawpixel((char *)(p+(r*bytesperline)), col); // b
if ((uint32_t)y1 < uydim16 && (uint32_t)(x1-r) < uxres)
drawpixel((char *)(p-r), col); // c
if ((uint32_t)x1 < uxres && (uint32_t)(y1-r) < uydim16)
drawpixel((char *)(p-(r*bytesperline)), col); // d
}
do
{
if (d < 0)
{
d += de;
de += 2;
dse += 2;
xp++;
}
else
{
d += dse;
de += 2;
dse += 4;
xp++;
yp--;
}
ypbpl = yp*bytesperline;
xpbpl = xp*bytesperline;
if (drawlinepat & pow2long[(patc++)&31])
{
if ((uint32_t)(x1+yp) < uxres && (uint32_t)(y1+xp) < uydim16)
drawpixel_safe((char *)(p+yp+xpbpl), col); // 1
if ((uint32_t)(x1+xp) < uxres && (uint32_t)(y1+yp) < uydim16)
drawpixel_safe((char *)(p+xp+ypbpl), col); // 2
if ((uint32_t)(x1-xp) < uxres && (uint32_t)(y1+yp) < uydim16)
drawpixel_safe((char *)(p-xp+ypbpl), col); // 3
if ((uint32_t)(x1-yp) < uxres && (uint32_t)(y1+xp) < uydim16)
drawpixel_safe((char *)(p-yp+xpbpl), col); // 4
if ((uint32_t)(x1-yp) < uxres && (uint32_t)(y1-xp) < uydim16)
drawpixel_safe((char *)(p-yp-xpbpl), col); // 5
if ((uint32_t)(x1-xp) < uxres && (uint32_t)(y1-yp) < uydim16)
drawpixel_safe((char *)(p-xp-ypbpl), col); // 6
if ((uint32_t)(x1+xp) < uxres && (uint32_t)(y1-yp) < uydim16)
drawpixel_safe((char *)(p+xp-ypbpl), col); // 7
if ((uint32_t)(x1+yp) < uxres && (uint32_t)(y1-xp) < uydim16)
drawpixel_safe((char *)(p+yp-xpbpl), col); // 8
}
}
while (yp > xp);
enddrawing();
}
else
{ {
// JonoF's rough approximation of a circle // JonoF's rough approximation of a circle
int32_t l,spx,spy,lpx,lpy,px,py; int32_t l, spx, spy, lpx, lpy, px, py;
spx = lpx = x1 + mulscale14(r,sintable[0]); spx = lpx = x1 + mulscale14(r, sintable[0]);
spy = lpy = y1 + mulscale14(eccen, mulscale14(r,sintable[512])); spy = lpy = y1 + mulscale14(eccen, mulscale14(r, sintable[512]));
for (l=64; l<2048; l+=64) for (l=64; l<2048; l+=64)
{ {
px = x1 + mulscale14(r,sintable[l]); px = x1 + mulscale14(r, sintable[l]);
py = y1 + mulscale14(eccen, mulscale14(r,sintable[(l+512)&2047])); py = y1 + mulscale14(eccen, mulscale14(r, sintable[(l+512)&2047]));
drawline16(lpx,lpy,px,py,col); drawline16(lpx, lpy, px, py, col);
lpx = px; lpx = px;
lpy = py; lpy = py;
} }
drawline16(lpx,lpy,spx,spy,col); drawline16(lpx, lpy, spx, spy, col);
return;
} }
if (r < 0) r = -r;
if (x1+r < 0 || x1-r >= xres) return;
if (y1+r < 0 || y1-r >= ydim16) return;
uint32_t const uxres = xres, uydim16 = ydim16;
/*
* d
* 6 | 7
* \ | /
* 5 \|/ 8
* c----+----a
* 4 /|\ 1
* / | \
* 3 | 2
* b
*/
begindrawing();
intptr_t const p = (y1*bytesperline)+x1+frameplace;
uint32_t patc = UINT_MAX;
if (drawlinepat == 0xffffffff || drawlinepat & pow2long[(++patc)&31])
{
if ((uint32_t)y1 < uydim16 && (uint32_t)(x1+r) < uxres)
drawpixel((char *)(p+r), col); // a
if ((uint32_t)x1 < uxres && (uint32_t)(y1+r) < uydim16)
drawpixel((char *)(p+(r*bytesperline)), col); // b
if ((uint32_t)y1 < uydim16 && (uint32_t)(x1-r) < uxres)
drawpixel((char *)(p-r), col); // c
if ((uint32_t)x1 < uxres && (uint32_t)(y1-r) < uydim16)
drawpixel((char *)(p-(r*bytesperline)), col); // d
}
int32_t xp = 0, yp = r;
int32_t d = 1 - r, de = 2, dse = 5 - (r << 1);
if (drawlinepat != 0xffffffff)
{
do
{
if (d < 0)
{
d += de;
dse += 2;
}
else
{
d += dse;
dse += 4;
yp--;
}
xp++;
de += 2;
int32_t ypbpl = yp*bytesperline;
int32_t xpbpl = xp*bytesperline;
if (drawlinepat & pow2long[(++patc) & 31])
{
if ((uint32_t)(x1 + yp) < uxres && (uint32_t)(y1 + xp) < uydim16)
drawpixel_safe((char *)(p + yp + xpbpl), col); // 1
if ((uint32_t)(x1 + xp) < uxres && (uint32_t)(y1 + yp) < uydim16)
drawpixel_safe((char *)(p + xp + ypbpl), col); // 2
if ((uint32_t)(x1 - xp) < uxres && (uint32_t)(y1 + yp) < uydim16)
drawpixel_safe((char *)(p - xp + ypbpl), col); // 3
if ((uint32_t)(x1 - yp) < uxres && (uint32_t)(y1 + xp) < uydim16)
drawpixel_safe((char *)(p - yp + xpbpl), col); // 4
if ((uint32_t)(x1 - yp) < uxres && (uint32_t)(y1 - xp) < uydim16)
drawpixel_safe((char *)(p - yp - xpbpl), col); // 5
if ((uint32_t)(x1 - xp) < uxres && (uint32_t)(y1 - yp) < uydim16)
drawpixel_safe((char *)(p - xp - ypbpl), col); // 6
if ((uint32_t)(x1 + xp) < uxres && (uint32_t)(y1 - yp) < uydim16)
drawpixel_safe((char *)(p + xp - ypbpl), col); // 7
if ((uint32_t)(x1 + yp) < uxres && (uint32_t)(y1 - xp) < uydim16)
drawpixel_safe((char *)(p + yp - xpbpl), col); // 8
}
} while (yp > xp);
enddrawing();
return;
}
do
{
if (d < 0)
{
d += de;
dse += 2;
}
else
{
d += dse;
dse += 4;
yp--;
}
xp++;
de += 2;
int32_t ypbpl = yp*bytesperline;
int32_t xpbpl = xp*bytesperline;
if ((uint32_t)(x1 + yp) < uxres && (uint32_t)(y1 + xp) < uydim16)
drawpixel_safe((char *)(p + yp + xpbpl), col); // 1
if ((uint32_t)(x1 + xp) < uxres && (uint32_t)(y1 + yp) < uydim16)
drawpixel_safe((char *)(p + xp + ypbpl), col); // 2
if ((uint32_t)(x1 - xp) < uxres && (uint32_t)(y1 + yp) < uydim16)
drawpixel_safe((char *)(p - xp + ypbpl), col); // 3
if ((uint32_t)(x1 - yp) < uxres && (uint32_t)(y1 + xp) < uydim16)
drawpixel_safe((char *)(p - yp + xpbpl), col); // 4
if ((uint32_t)(x1 - yp) < uxres && (uint32_t)(y1 - xp) < uydim16)
drawpixel_safe((char *)(p - yp - xpbpl), col); // 5
if ((uint32_t)(x1 - xp) < uxres && (uint32_t)(y1 - yp) < uydim16)
drawpixel_safe((char *)(p - xp - ypbpl), col); // 6
if ((uint32_t)(x1 + xp) < uxres && (uint32_t)(y1 - yp) < uydim16)
drawpixel_safe((char *)(p + xp - ypbpl), col); // 7
if ((uint32_t)(x1 + yp) < uxres && (uint32_t)(y1 - xp) < uydim16)
drawpixel_safe((char *)(p + yp - xpbpl), col); // 8
} while (yp > xp);
enddrawing();
} }
// //
@ -17021,14 +17063,8 @@ void draw2dgrid(int32_t posxe, int32_t posye, int32_t posze, int16_t cursectnum,
static void drawscreen_drawwall(int32_t i, int32_t posxe, int32_t posye, int32_t posze, int32_t zoome, int32_t grayp) static void drawscreen_drawwall(int32_t i, int32_t posxe, int32_t posye, int32_t posze, int32_t zoome, int32_t grayp)
{ {
const walltype *wal = &wall[i]; const walltype *wal = &wall[i];
int32_t j, x1, y1, x2, y2, dz = 0, dz2 = 0;
int32_t fz=0,fzn=0;
// intptr_t tempint;
char col;
int64_t dist,dx,dy; int32_t j = wal->nextwall;
j = wal->nextwall;
#if 0 #if 0
if (editstatus == 0) if (editstatus == 0)
{ {
@ -17042,34 +17078,32 @@ static void drawscreen_drawwall(int32_t i, int32_t posxe, int32_t posye, int32_t
if (!m32_sideview && !(grayp&2) && (j >= 0) && (i > j)) return; if (!m32_sideview && !(grayp&2) && (j >= 0) && (i > j)) return;
} }
char col;
if (grayp&1) if (grayp&1)
{
col = 8; col = 8;
}
else if (j < 0) else if (j < 0)
{ col = (i == linehighlight) && !(totalclock & 16) ? 7 : 15;
col = 15;
if (i == linehighlight)
col = (totalclock & 16) ? 15 : 7;
}
else else
{ {
col = 33;
if ((wal->cstat&1) != 0)
col = 5;
if ((unsigned)wal->nextwall < MAXWALLS && ((wal->cstat^wall[j].cstat)&1)) if ((unsigned)wal->nextwall < MAXWALLS && ((wal->cstat^wall[j].cstat)&1))
col = 2; col = 2;
else if ((wal->cstat&1) != 0)
col = 5;
else col = 33;
if ((i == linehighlight) || ((linehighlight >= 0) && (i == wall[linehighlight].nextwall))) if ((i == linehighlight) || ((linehighlight >= 0) && (i == wall[linehighlight].nextwall)))
if (totalclock & 16) if (totalclock & 16)
col += (2<<2); col += (2<<2);
} }
int32_t x1, y1, x2, y2;
screencoords(&x1,&y1, wal->x-posxe,wal->y-posye, zoome); screencoords(&x1,&y1, wal->x-posxe,wal->y-posye, zoome);
screencoords(&x2,&y2, wall[wal->point2].x-posxe,wall[wal->point2].y-posye, zoome); screencoords(&x2,&y2, wall[wal->point2].x-posxe,wall[wal->point2].y-posye, zoome);
dx = wal->x-wall[wal->point2].x; int64_t dx = wal->x-wall[wal->point2].x;
dy = wal->y-wall[wal->point2].y; int64_t dy = wal->y-wall[wal->point2].y;
dist = dx*dx+dy*dy; int64_t dist = dx*dx+dy*dy;
if (dist > INT32_MAX) if (dist > INT32_MAX)
{ {
@ -17086,17 +17120,18 @@ static void drawscreen_drawwall(int32_t i, int32_t posxe, int32_t posye, int32_t
else if (circlewall >= 0 && (i == circlewall || wal->nextwall == circlewall)) else if (circlewall >= 0 && (i == circlewall || wal->nextwall == circlewall))
col = 14; col = 14;
int32_t fz=0, fzn=0;
if (m32_sideview) if (m32_sideview)
{ {
// draw vertical line to neighboring wall // draw vertical line to neighboring wall
int32_t fz2;
int32_t sect = sectorofwall(i); int32_t sect = sectorofwall(i);
fz = getflorzofslope(sect, wal->x,wal->y); fz = getflorzofslope(sect, wal->x,wal->y);
fz2 = getflorzofslope(sect, wall[wal->point2].x,wall[wal->point2].y); int32_t fz2 = getflorzofslope(sect, wall[wal->point2].x,wall[wal->point2].y);
dz = getscreenvdisp(fz-posze,zoome); int32_t dz = getscreenvdisp(fz-posze,zoome);
dz2 = getscreenvdisp(fz2-posze,zoome); int32_t dz2 = getscreenvdisp(fz2-posze,zoome);
y1 += dz; y1 += dz;
y2 += dz2; y2 += dz2;
@ -17110,6 +17145,7 @@ static void drawscreen_drawwall(int32_t i, int32_t posxe, int32_t posye, int32_t
#ifdef YAX_ENABLE #ifdef YAX_ENABLE
{ {
int16_t nw = yax_getnextwall(i, YAX_CEILING); int16_t nw = yax_getnextwall(i, YAX_CEILING);
if (nw >= 0) if (nw >= 0)
{ {
int32_t odrawlinepat = drawlinepat; int32_t odrawlinepat = drawlinepat;
@ -17150,27 +17186,25 @@ static void drawscreen_drawwall(int32_t i, int32_t posxe, int32_t posye, int32_t
if (wal->nextsector >= 0) if (wal->nextsector >= 0)
{ {
int32_t z1 = sector[sectorofwall(i)].floorz; int32_t const z1 = sector[sectorofwall(i)].floorz;
int32_t z2 = sector[wal->nextsector].floorz; int32_t const z2 = sector[wal->nextsector].floorz;
if (z1 != z2 || showheightindicators == 2) if (z1 != z2 || showheightindicators == 2)
{ {
// Red walls. Show them on equal-height walls ONLY with setting 2. // Red walls. Show them on equal-height walls ONLY with setting 2.
int32_t bb = (z2 < z1); int32_t const bb = (z2 < z1);
int32_t dx = mulscale11(sintable[(k+1024 + 1024*bb)&2047],min(4096, zoome)) / 2560; int32_t const dx = mulscale11(sintable[(k+1024 + 1024*bb)&2047],min(4096, zoome)) / 2560;
int32_t dy = mulscale11(sintable[(k+512 + 1024*bb)&2047],min(4096, zoome)) / 2560; int32_t const dy = scalescreeny(mulscale11(sintable[(k+512 + 1024*bb)&2047], min(4096, zoome)) / 2560);
dy = scalescreeny(dy);
drawline16mid(dax,day, dax+dx,day+dy, editorcolors[col]); drawline16mid(dax,day, dax+dx,day+dy, editorcolors[col]);
} }
} }
else if (showheightindicators == 2) else if (showheightindicators == 2)
{ {
// Show them on white walls ONLY with setting 2. // Show them on white walls ONLY with setting 2.
int32_t dx = mulscale11(sintable[(k+2048)&2047],min(4096, zoome)) / 2560; int32_t const dx = mulscale11(sintable[(k+2048)&2047],min(4096, zoome)) / 2560;
int32_t dy = mulscale11(sintable[(k+1536)&2047],min(4096, zoome)) / 2560; int32_t const dy = scalescreeny(mulscale11(sintable[(k+1536)&2047], min(4096, zoome)) / 2560);
dy = scalescreeny(dy);
drawline16mid(dax,day, dax+dx,day+dy, editorcolors[col]); drawline16mid(dax,day, dax+dx,day+dy, editorcolors[col]);
} }
} }
@ -17181,11 +17215,14 @@ static void drawscreen_drawwall(int32_t i, int32_t posxe, int32_t posye, int32_t
{ {
int32_t pointsize = 2; int32_t pointsize = 2;
col = 15;
if (i == pointhighlight || ((pointhighlight < MAXWALLS) && (pointhighlight >= 0) && if (i == pointhighlight || ((pointhighlight < MAXWALLS) && (pointhighlight >= 0) &&
(wall[i].x == wall[pointhighlight].x) && (wall[i].y == wall[pointhighlight].y))) (wall[i].x == wall[pointhighlight].x) && (wall[i].y == wall[pointhighlight].y)))
{ {
if (totalclock & 16) if (totalclock & 16)
pointsize++; pointsize++;
else col = 7;
} }
else //if (highlightcnt > 0) else //if (highlightcnt > 0)
{ {
@ -17193,10 +17230,10 @@ static void drawscreen_drawwall(int32_t i, int32_t posxe, int32_t posye, int32_t
{ {
if (totalclock & 16) if (totalclock & 16)
pointsize++; pointsize++;
else col = 7;
} }
} }
col = 15;
if (m32_sideview) if (m32_sideview)
{ {
if (wal->nextwall >= 0) if (wal->nextwall >= 0)
@ -17208,10 +17245,7 @@ static void drawscreen_drawwall(int32_t i, int32_t posxe, int32_t posye, int32_t
} }
} }
// tempint = ((midydim16+y1)*bytesperline)+(halfxdim16+x1)+frameplace; drawcircle16(halfxdim16+x1, midydim16+y1, pointsize, 16384, editorcolors[col]);
do
drawcircle16(halfxdim16+x1, midydim16+y1, pointsize--, 16384, editorcolors[col]);
while (pointsize);
} }
} }

View file

@ -269,13 +269,13 @@ void swapbuf4(void *a, void *b, int32_t c)
void clearbufbyte(void *D, int32_t c, int32_t a) void clearbufbyte(void *D, int32_t c, int32_t a)
{ {
// Cringe City // Cringe City
int32_t const m[4] = { 0xffl, 0xff00l, 0xff0000l, (int32_t)0xff000000l };
int32_t z = 0;
char *p = (char *)D; char *p = (char *)D;
int32_t m[4] = { 0xffl,0xff00l,0xff0000l,(int32_t)0xff000000l };
int32_t n[4] = { 0,8,16,24 };
int32_t z=0;
while ((c--) > 0) while ((c--) > 0)
{ {
*(p++) = (uint8_t)((a & m[z])>>n[z]); *(p++) = (uint8_t)((a & m[z])>>(z<<3));
z=(z+1)&3; z=(z+1)&3;
} }
} }

View file

@ -866,7 +866,7 @@ const char *SectorEffectorText(int32_t spritenum)
else else
{ {
if (cursprite == spritenum) if (cursprite == spritenum)
Bsprintf(tempbuf, "SE %d %s", sprite[spritenum].lotag, lo); Bsprintf(tempbuf, "SE %d %s", TrackerCast(sprite[spritenum].lotag), lo);
else Bstrcpy(tempbuf, lo); else Bstrcpy(tempbuf, lo);
} }
@ -7705,7 +7705,7 @@ static void Keys2d(void)
if (autogrid) if (autogrid)
{ {
grid = 0; grid = -1;
while (grid++ < 7) while (grid++ < 7)
{ {
@ -10256,8 +10256,11 @@ void ExtPreCheckKeys(void) // just before drawrooms
if (xp1 < -f || xp1 > xdim+f || yp1 < -f || yp1 > ydim16+f) if (xp1 < -f || xp1 > xdim+f || yp1 < -f || yp1 > ydim16+f)
continue; continue;
const int32_t oviewingrange=viewingrange, oyxaspect=yxaspect;
setaspect(yxaspect, divscale16(sprite[i].yrepeat, sprite[i].xrepeat));
rotatesprite(xp1<<16,yp1<<16,zoom<<5,daang,picnum, rotatesprite(xp1<<16,yp1<<16,zoom<<5,daang,picnum,
shade,sprite[i].pal,flags,0,0,xdim-1,ydim16-1); shade,sprite[i].pal,flags|1024,0,0,xdim-1,ydim16-1);
setaspect(oviewingrange, oyxaspect);
} }
} }