Simplify handling and drawing of areas outside the map.

git-svn-id: svn+ssh://svn.gna.org/svn/warzone/trunk@2934 4a71c877-e1ca-e34f-864e-861f7616d084
master
Per Inge Mathisen 2007-12-01 16:35:49 +00:00
parent d555904212
commit 3dfc90107e
2 changed files with 36 additions and 78 deletions

View File

@ -130,7 +130,6 @@ typedef struct
Vector3i water; //! Screenspace water coordinates
int water_height; //! Worldspace water height
PIELIGHT wlight; //! Special water lighting
UBYTE drawInfo; //! Draw this tile?
UBYTE bWater; //! Is it a watertile?
} TERRAIN_VERTEX;
typedef struct {float x, y, z, u, v; PIELIGHT light, specular;} TERRAIN_VERTEXF;

View File

@ -243,7 +243,6 @@ static int averageCentreTerrainHeight;
static BOOL bReloadBars = TRUE;
static BOOL bEnergyBars = TRUE;
static BOOL bTinyBars = FALSE;
static MAPTILE edgeTile;
static UDWORD lastTargetAssignation = 0;
static UDWORD lastDestAssignation = 0;
@ -524,13 +523,11 @@ static void drawTiles(iView *camera, iView *player)
{
UDWORD i, j;
MAPTILE *psTile;
UDWORD edgeX, edgeY;
BOOL bWaterTile = FALSE;
BOOL PushedDown = FALSE;
UBYTE TileIllum;
int shiftVal = 0;
int numTilesAveraged = 0;
BOOL bEdgeTile;
static float angle = 0.0f;
// Animate the water texture, just cycles the V coordinate through half the tiles height.
@ -603,54 +600,23 @@ static void drawTiles(iView *camera, iView *player)
tileScreenInfo[i][j].pos.x = world_coord(j - terrainMidX);
tileScreenInfo[i][j].pos.z = world_coord(terrainMidY - i);
tileScreenInfo[i][j].pos.y = 0;
if( playerXTile+j < 0 ||
playerZTile+i < 0 ||
playerXTile+j > (SDWORD)(mapWidth-1) ||
playerZTile+i > (SDWORD)(mapHeight-1) )
{
// Tiles on the border of the map are never water tiles.
// Special past-edge-of-map tiles
tileScreenInfo[i][j].bWater = FALSE;
edgeX = playerXTile+j;
edgeY = playerZTile+i;
if (playerXTile+j < 0 )
edgeX = 0;
else if (playerXTile+j > (SDWORD)(mapWidth-1) )
edgeX = mapWidth-1;
if (playerZTile+i < 0 )
edgeY = 0;
else if (playerZTile+i > (SDWORD)(mapHeight-1) )
edgeY = mapHeight-1;
tileScreenInfo[i][j].pos.y = 0; // map_TileHeight(edgeX, edgeY);
if (pie_GetFogEnabled())
{
tileScreenInfo[i][j].light.argb = 0xff030303;
tileScreenInfo[i][j].specular = pie_GetFogColour();
}
else
{
TileIllum = mapTile(edgeX, edgeY)->illumination;
tileScreenInfo[i][j].light.argb = lightDoFogAndIllumination( TileIllum, rx - tileScreenInfo[i][j].pos.x, rz - world_coord(i-terrainMidY), &tileScreenInfo[i][j].specular.argb );
}
if( playerXTile+j < -1 ||
playerZTile+i < -1 ||
playerXTile+j > (SDWORD)(mapWidth-1) ||
playerZTile+i > (SDWORD)(mapHeight-1) )
{
tileScreenInfo[i][j].drawInfo = FALSE;
}
else
{
tileScreenInfo[i][j].drawInfo = TRUE;
}
tileScreenInfo[i][j].u = 0;
tileScreenInfo[i][j].v = 0;
tileScreenInfo[i][j].light.argb = 0;
tileScreenInfo[i][j].specular.argb = 0;
}
else
{
tileScreenInfo[i][j].drawInfo = TRUE;
BOOL bEdgeTile;
/* Get a pointer to the tile at this location */
psTile = mapTile(playerXTile + j, playerZTile + i);
@ -797,22 +763,19 @@ static void drawTiles(iView *camera, iView *player)
{
for (j = 0; j < MIN(visibleTiles.x, mapWidth); j++)
{
if (tileScreenInfo[i][j].drawInfo == TRUE)
//get distance of furthest corner
int zMax = MAX(tileScreenInfo[i][j].screen.z, tileScreenInfo[i+1][j].screen.z);
zMax = MAX(zMax, tileScreenInfo[i + 1][j + 1].screen.z);
zMax = MAX(zMax, tileScreenInfo[i][j + 1].screen.z);
if (zMax < 0)
{
//get distance of furthest corner
int zMax = MAX(tileScreenInfo[i][j].screen.z, tileScreenInfo[i+1][j].screen.z);
zMax = MAX(zMax, tileScreenInfo[i + 1][j + 1].screen.z);
zMax = MAX(zMax, tileScreenInfo[i][j + 1].screen.z);
if (zMax < 0)
{
// clipped
continue;
}
drawTerrainTile(i, j, FALSE);
// clipped
continue;
}
drawTerrainTile(i, j, FALSE);
}
}
pie_SetDepthOffset(-2.0);
@ -821,8 +784,7 @@ static void drawTiles(iView *camera, iView *player)
for (j = 0; j < MIN(visibleTiles.x, mapWidth); j++)
{
// check if we need to draw a water edge
if (tileScreenInfo[i][j].drawInfo == TRUE
&& tileScreenInfo[i][j].bWater
if (tileScreenInfo[i][j].bWater
&& TileNumber_tile(mapTile(playerXTile + j, playerZTile + i)->texture) != WATER_TILE)
{
//get distance of furthest corner
@ -855,7 +817,7 @@ static void drawTiles(iView *camera, iView *player)
{
for (j = 0; j < MIN(visibleTiles.x, mapWidth); j++)
{
if (tileScreenInfo[i][j].drawInfo == TRUE && tileScreenInfo[i][j].bWater)
if (tileScreenInfo[i][j].bWater)
{
//get distance of furthest corner
int zMax = MAX(tileScreenInfo[i][j].screen.z, tileScreenInfo[i + 1][j].screen.z);
@ -931,8 +893,6 @@ BOOL init3DView(void)
gridCentreX = player.p.x + world_coord(visibleTiles.x / 2);
gridCentreZ = player.p.z + world_coord(visibleTiles.y / 2);
edgeTile.texture = 0;
bEnergyBars = TRUE;
/* Base Level */
@ -4066,12 +4026,12 @@ static void drawTerrainTile(UDWORD i, UDWORD j, BOOL onWaterEdge)
(actualX > mapWidth-1) ||
(actualY > mapHeight-1) )
{
psTile = &edgeTile;
CLEAR_TILE_HIGHLIGHT(psTile);
tileNumber = 0;
}
else
{
psTile = mapTile(actualX, actualY);
#if defined(SHOW_ZONES)
if (!fpathBlockingTile(actualX, actualY) ||
terrainType(psTile) == TER_WATER)
@ -4084,17 +4044,16 @@ static void drawTerrainTile(UDWORD i, UDWORD j, BOOL onWaterEdge)
zone = gwGetZone(actualX, actualY);
}
#endif
}
if ( terrainType(psTile) != TER_WATER || onWaterEdge )
{
// what tile texture number is it?
tileNumber = psTile->texture;
}
else
{
// If it's a water tile then force it to be the river bed texture.
tileNumber = RIVERBED_TILE;
if ( terrainType(psTile) != TER_WATER || onWaterEdge )
{
// what tile texture number is it?
tileNumber = psTile->texture;
}
else
{
// If it's a water tile then force it to be the river bed texture.
tileNumber = RIVERBED_TILE;
}
}
#if defined(SHOW_ZONES)
@ -4103,14 +4062,14 @@ static void drawTerrainTile(UDWORD i, UDWORD j, BOOL onWaterEdge)
tileNumber = zone;
}
#elif defined(SHOW_GATEWAYS)
if (psTile->tileInfoBits & BITS_GATEWAY)
if (psTile && psTile->tileInfoBits & BITS_GATEWAY)
{
tileNumber = 55;//zone;
}
#endif
/* Is the tile highlighted? Perhaps because there's a building foundation on it */
if(!onWaterEdge && TILE_HIGHLIGHT(psTile))
if (psTile && !onWaterEdge && TILE_HIGHLIGHT(psTile))
{
/* Clear it for next time round */
CLEAR_TILE_HIGHLIGHT(psTile);
@ -4171,7 +4130,7 @@ static void drawTerrainTile(UDWORD i, UDWORD j, BOOL onWaterEdge)
vertices[1].pos.y = tileScreenInfo[i + 0][j + 1].water_height;
}
if (TRI_FLIPPED(psTile))
if (psTile && TRI_FLIPPED(psTile))
{
vertices[2] = tileScreenInfo[i + 1][j + 0];
if (onWaterEdge)
@ -4191,7 +4150,7 @@ static void drawTerrainTile(UDWORD i, UDWORD j, BOOL onWaterEdge)
pie_DrawTerrainTriangle(vertices, 0);
/* The second triangle */
if (TRI_FLIPPED(psTile))
if (psTile && TRI_FLIPPED(psTile))
{
vertices[0] = tileScreenInfo[i + 0][j + 1];
if (onWaterEdge)