Viewports code cleanups and comments added.
This commit is contained in:
parent
19887eef44
commit
93c2370991
1 changed files with 92 additions and 58 deletions
|
@ -158,7 +158,7 @@ local unsigned int PixelsHigh[256];
|
|||
** Flags must redraw map row.
|
||||
** MustRedrawRow[y]!=0 This line of tiles must be redrawn.
|
||||
**
|
||||
** @see MAXMAP_W
|
||||
** @see MAXMAP_W
|
||||
*/
|
||||
global char MustRedrawRow[MAXMAP_W];
|
||||
|
||||
|
@ -1438,21 +1438,23 @@ global void MapColorCycle(void)
|
|||
}
|
||||
|
||||
/**
|
||||
** Mark position inside screenmap be drawn for next display update.
|
||||
** Mark position inside viewport be drawn for next display update.
|
||||
**
|
||||
** @param x X map tile position of point in Map to be marked.
|
||||
** @param y Y map tile position of point in Map to be marked.
|
||||
**
|
||||
** @return True if inside and marked, false otherwise.
|
||||
**
|
||||
** @note latimerius: MarkDrawPosMap() in split screen environment
|
||||
** schedules RedrawMap if (x,y) is visible inside *any* of the existing
|
||||
** viewports. Is this OK, johns? Do you think it would pay having
|
||||
** RedrawViewport0, RedrawViewport1 etc. variables and redraw just
|
||||
** vp's that actually need redrawing? We should evaluate this.
|
||||
** JOHNS: A complete viewport redraw is still too much work. The final
|
||||
** version should only redraw the needed tiles.
|
||||
*/
|
||||
global int MarkDrawPosMap(int x, int y)
|
||||
{
|
||||
/* NOTE: latimerius: MarkDrawPosMap() in split screen environment
|
||||
* schedules RedrawMap if (x,y) is visible inside *any* of the existing
|
||||
* viewports. Is this OK, johns? Do you think it would pay having
|
||||
* RedrawViewport0, RedrawViewport1 etc. variables and redraw just
|
||||
* vp's that actually need redrawing? We should evaluate this.
|
||||
*/
|
||||
if (GetViewport(x, y) != -1) {
|
||||
MustRedraw |= RedrawMap;
|
||||
return 1;
|
||||
|
@ -1460,6 +1462,16 @@ global int MarkDrawPosMap(int x, int y)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
** Denote wether area in map is overlapping with the viewport.
|
||||
**
|
||||
** @param sx X map tile position of area in map to be checked.
|
||||
** @param sy Y map tile position of area in map to be checked.
|
||||
** @param ex X map tile position of area in map to be checked.
|
||||
** @param ey Y map tile position of area in map to be checked.
|
||||
**
|
||||
** @return True if overlapping, false otherwise.
|
||||
*/
|
||||
global int MapAreaVisibleInViewport(int v, int sx, int sy, int ex, int ey)
|
||||
{
|
||||
const Viewport* view;
|
||||
|
@ -1470,24 +1482,46 @@ global int MapAreaVisibleInViewport(int v, int sx, int sy, int ex, int ey)
|
|||
&& ey < view->MapY + view->MapHeight;
|
||||
}
|
||||
|
||||
local inline int PointInViewport(int v, int x, int y)
|
||||
/**
|
||||
** Check if a point is visible (inside) a viewport.
|
||||
**
|
||||
** @param v Viewport.
|
||||
** @param x X map tile position of point in map to be checked.
|
||||
** @param y Y map tile position of point in map to be checked.
|
||||
**
|
||||
** @return True if point is in the visible map, false otherwise
|
||||
*/
|
||||
local inline int PointInViewport(const Viewport* vp, int x, int y)
|
||||
{
|
||||
const Viewport* view;
|
||||
|
||||
view = &TheUI.VP[v];
|
||||
return view->MapX <= x && x < view->MapX + view->MapWidth
|
||||
&& view->MapY <= y && y < view->MapY + view->MapHeight;
|
||||
}
|
||||
|
||||
global int AnyMapAreaVisibleInViewport (int v, int sx, int sy, int ex, int ey)
|
||||
{
|
||||
// FIXME: Can be faster written
|
||||
return PointInViewport (v,sx,sy) || PointInViewport (v,sx,ey)
|
||||
|| PointInViewport (v,ex,sy) || PointInViewport (v,ex,ey);
|
||||
return vp->MapX <= x && x < vp->MapX + vp->MapWidth
|
||||
&& vp->MapY <= y && y < vp->MapY + vp->MapHeight;
|
||||
}
|
||||
|
||||
/**
|
||||
** Mark overlapping area with screenmap be drawn for next display update.
|
||||
** Check if any part of an area is visible in a viewport.
|
||||
**
|
||||
** @param sx X map tile position of area in map to be checked.
|
||||
** @param sy Y map tile position of area in map to be checked.
|
||||
** @param ex X map tile position of area in map to be checked.
|
||||
** @param ey Y map tile position of area in map to be checked.
|
||||
**
|
||||
** @return True if any part of area is visible, false otherwise
|
||||
**
|
||||
** @todo Didn't works if all points lay outside and the area covers
|
||||
** the complete viewport.
|
||||
*/
|
||||
global int AnyMapAreaVisibleInViewport(int v, int sx, int sy, int ex, int ey)
|
||||
{
|
||||
const Viewport* vp;
|
||||
|
||||
// FIXME: Can be faster written
|
||||
vp = &TheUI.VP[v];
|
||||
return PointInViewport(vp, sx, sy) || PointInViewport(vp, sx, ey)
|
||||
|| PointInViewport(vp, ex, sy) || PointInViewport(vp, ex, ey);
|
||||
}
|
||||
|
||||
/**
|
||||
** Mark overlapping area with viewport be drawn for next display update.
|
||||
**
|
||||
** @param sx X map tile position of area in Map to be marked.
|
||||
** @param sy Y map tile position of area in Map to be marked.
|
||||
|
@ -1500,7 +1534,7 @@ global int AnyMapAreaVisibleInViewport (int v, int sx, int sy, int ex, int ey)
|
|||
*/
|
||||
global int MarkDrawAreaMap(int sx, int sy, int ex, int ey)
|
||||
{
|
||||
if (MapTileGetViewport (sx,sy) != -1 || MapTileGetViewport (ex,ey) != -1) {
|
||||
if (MapTileGetViewport(sx, sy) != -1 || MapTileGetViewport(ex, ey) != -1) {
|
||||
MustRedraw |= RedrawMap;
|
||||
return 1;
|
||||
}
|
||||
|
@ -1532,7 +1566,6 @@ global void MarkDrawEntireMap(void)
|
|||
MustRedraw|=RedrawMap;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
** Draw the map backgrounds.
|
||||
**
|
||||
|
@ -1562,8 +1595,7 @@ global void MarkDrawEntireMap(void)
|
|||
** (in pixels)
|
||||
** </PRE>
|
||||
*/
|
||||
|
||||
global void DrawMapBackgroundInViewport (int v, int x, int y)
|
||||
global void DrawMapBackgroundInViewport(int v, int x, int y)
|
||||
{
|
||||
int sx;
|
||||
int sy;
|
||||
|
@ -1603,13 +1635,13 @@ global void DrawMapBackgroundInViewport (int v, int x, int y)
|
|||
MapDrawTile(TheMap.Fields[sx].SeenTile,dx,dy);
|
||||
|
||||
// StephanR: debug-mode denote tiles that are redrawn
|
||||
#if NEW_MAPDRAW > 1
|
||||
#if NEW_MAPDRAW > 1
|
||||
VideoDrawRectangle( redraw_tile[-1] > 1
|
||||
? ColorWhite
|
||||
: ColorRed,
|
||||
dx, dy, 32, 32 );
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
}
|
||||
++sx;
|
||||
dx+=TileSizeX;
|
||||
}
|
||||
|
@ -1661,45 +1693,47 @@ global void DrawMapBackgroundInViewport (int v, int x, int y)
|
|||
**
|
||||
** @param dummy_data should be NULL; needed to make callback possible
|
||||
*/
|
||||
local void mapdeco_draw( void *dummy_data )
|
||||
local void mapdeco_draw(void *dummy_data)
|
||||
{
|
||||
MapField *src;
|
||||
int x, y, w, h, nextline;
|
||||
MapField *src;
|
||||
int x;
|
||||
int y;
|
||||
int w;
|
||||
int h;
|
||||
int nextline;
|
||||
|
||||
extern int ClipX1;
|
||||
extern int ClipY1;
|
||||
extern int ClipX2;
|
||||
extern int ClipY2;
|
||||
extern int ClipX1;
|
||||
extern int ClipY1;
|
||||
extern int ClipX2;
|
||||
extern int ClipY2;
|
||||
|
||||
// VideoDrawRectangle( ColorWhite, ClipX1, ClipY1,
|
||||
// ClipX2-ClipX1+1, ClipY2-ClipY1+1 );
|
||||
w = (ClipX2 - ClipX1) / TileSizeX + 1;
|
||||
h = (ClipY2 - ClipY1) / TileSizeY + 1;
|
||||
x = (ClipX1 - TheUI.MapX) / TileSizeX;
|
||||
y = (ClipY1 - TheUI.MapY) / TileSizeY;
|
||||
src = TheMap.Fields + MapX + x + (MapY + y) * TheMap.Width;
|
||||
x = TheUI.MapX + x * TileSizeX;
|
||||
y = TheUI.MapY + y * TileSizeY;
|
||||
nextline=TheMap.Width-w;
|
||||
do
|
||||
{
|
||||
int w2=w;
|
||||
do
|
||||
{
|
||||
MapDrawTile(src->SeenTile,x,y);
|
||||
x+=TileSizeX;
|
||||
src++;
|
||||
w = (ClipX2 - ClipX1) / TileSizeX + 1;
|
||||
h = (ClipY2 - ClipY1) / TileSizeY + 1;
|
||||
x = (ClipX1 - TheUI.MapX) / TileSizeX;
|
||||
y = (ClipY1 - TheUI.MapY) / TileSizeY;
|
||||
src = TheMap.Fields + MapX + x + (MapY + y) * TheMap.Width;
|
||||
x = TheUI.MapX + x * TileSizeX;
|
||||
y = TheUI.MapY + y * TileSizeY;
|
||||
nextline = TheMap.Width - w;
|
||||
do {
|
||||
int w2 = w;
|
||||
|
||||
do {
|
||||
MapDrawTile(src->SeenTile, x, y);
|
||||
x += TileSizeX;
|
||||
src++;
|
||||
}
|
||||
while (--w2);
|
||||
y += TileSizeY;
|
||||
src += nextline;
|
||||
}
|
||||
while ( --w2 );
|
||||
y+=TileSizeY;
|
||||
src+=nextline;
|
||||
}
|
||||
while ( --h );
|
||||
while (--h);
|
||||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
:w
|
||||
** Initialise the fog of war.
|
||||
** Build tables, setup functions.
|
||||
**
|
||||
|
|
Loading…
Add table
Reference in a new issue