|
|
|
|
@ -18,119 +18,320 @@ enum {
|
|
|
|
|
RT_RTRAPEZOID |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
/** Fully transparent variant of WallMask. */ |
|
|
|
|
static DWORD WallMask_FullyTrasparent[TILE_HEIGHT] = { |
|
|
|
|
0x00000000, |
|
|
|
|
0x00000000, |
|
|
|
|
0x00000000, |
|
|
|
|
0x00000000, |
|
|
|
|
0x00000000, |
|
|
|
|
0x00000000, |
|
|
|
|
0x00000000, |
|
|
|
|
0x00000000, |
|
|
|
|
0x00000000, |
|
|
|
|
0x00000000, |
|
|
|
|
0x00000000, |
|
|
|
|
0x00000000, |
|
|
|
|
0x00000000, |
|
|
|
|
0x00000000, |
|
|
|
|
0x00000000, |
|
|
|
|
0x00000000, |
|
|
|
|
0x00000000, |
|
|
|
|
0x00000000, |
|
|
|
|
0x00000000, |
|
|
|
|
0x00000000, |
|
|
|
|
0x00000000, |
|
|
|
|
0x00000000, |
|
|
|
|
0x00000000, |
|
|
|
|
0x00000000, |
|
|
|
|
0x00000000, |
|
|
|
|
0x00000000, |
|
|
|
|
0x00000000, |
|
|
|
|
0x00000000, |
|
|
|
|
0x00000000, |
|
|
|
|
0x00000000, |
|
|
|
|
0x00000000, |
|
|
|
|
0x00000000 |
|
|
|
|
}; |
|
|
|
|
/** Transparent variant of RightMask. */ |
|
|
|
|
static DWORD RightMask_Transparent[TILE_HEIGHT] = { |
|
|
|
|
0xE0000000, |
|
|
|
|
0xF0000000, |
|
|
|
|
0xFE000000, |
|
|
|
|
0xFF000000, |
|
|
|
|
0xFFE00000, |
|
|
|
|
0xFFF00000, |
|
|
|
|
0xFFFE0000, |
|
|
|
|
0xFFFF0000, |
|
|
|
|
0xFFFFE000, |
|
|
|
|
0xFFFFF000, |
|
|
|
|
0xFFFFFE00, |
|
|
|
|
0xFFFFFF00, |
|
|
|
|
0xFFFFFFE0, |
|
|
|
|
0xFFFFFFF0, |
|
|
|
|
0xFFFFFFFE, |
|
|
|
|
0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF |
|
|
|
|
}; |
|
|
|
|
/** Transparent variant of LeftMask. */ |
|
|
|
|
static DWORD LeftMask_Transparent[TILE_HEIGHT] = { |
|
|
|
|
0x00000003, |
|
|
|
|
0x0000000F, |
|
|
|
|
0x0000003F, |
|
|
|
|
0x000000FF, |
|
|
|
|
0x000003FF, |
|
|
|
|
0x00000FFF, |
|
|
|
|
0x00003FFF, |
|
|
|
|
0x0000FFFF, |
|
|
|
|
0x0003FFFF, |
|
|
|
|
0x000FFFFF, |
|
|
|
|
0x003FFFFF, |
|
|
|
|
0x00FFFFFF, |
|
|
|
|
0x03FFFFFF, |
|
|
|
|
0x0FFFFFFF, |
|
|
|
|
0x3FFFFFFF, |
|
|
|
|
0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF |
|
|
|
|
}; |
|
|
|
|
/** Specifies the draw masks used to render transparency of the right side of tiles. */ |
|
|
|
|
static DWORD RightMask[TILE_HEIGHT] = { |
|
|
|
|
0xEAAAAAAA, 0xF5555555, |
|
|
|
|
0xFEAAAAAA, 0xFF555555, |
|
|
|
|
0xFFEAAAAA, 0xFFF55555, |
|
|
|
|
0xFFFEAAAA, 0xFFFF5555, |
|
|
|
|
0xFFFFEAAA, 0xFFFFF555, |
|
|
|
|
0xFFFFFEAA, 0xFFFFFF55, |
|
|
|
|
0xFFFFFFEA, 0xFFFFFFF5, |
|
|
|
|
0xFFFFFFFE, 0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, 0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, 0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, 0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, 0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, 0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, 0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, 0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, 0xFFFFFFFF |
|
|
|
|
0xEAAAAAAA, |
|
|
|
|
0xF5555555, |
|
|
|
|
0xFEAAAAAA, |
|
|
|
|
0xFF555555, |
|
|
|
|
0xFFEAAAAA, |
|
|
|
|
0xFFF55555, |
|
|
|
|
0xFFFEAAAA, |
|
|
|
|
0xFFFF5555, |
|
|
|
|
0xFFFFEAAA, |
|
|
|
|
0xFFFFF555, |
|
|
|
|
0xFFFFFEAA, |
|
|
|
|
0xFFFFFF55, |
|
|
|
|
0xFFFFFFEA, |
|
|
|
|
0xFFFFFFF5, |
|
|
|
|
0xFFFFFFFE, |
|
|
|
|
0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF |
|
|
|
|
}; |
|
|
|
|
/** Specifies the draw masks used to render transparency of the left side of tiles. */ |
|
|
|
|
static DWORD LeftMask[TILE_HEIGHT] = { |
|
|
|
|
0xAAAAAAAB, 0x5555555F, |
|
|
|
|
0xAAAAAABF, 0x555555FF, |
|
|
|
|
0xAAAAABFF, 0x55555FFF, |
|
|
|
|
0xAAAABFFF, 0x5555FFFF, |
|
|
|
|
0xAAABFFFF, 0x555FFFFF, |
|
|
|
|
0xAABFFFFF, 0x55FFFFFF, |
|
|
|
|
0xABFFFFFF, 0x5FFFFFFF, |
|
|
|
|
0xBFFFFFFF, 0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, 0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, 0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, 0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, 0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, 0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, 0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, 0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, 0xFFFFFFFF |
|
|
|
|
0xAAAAAAAB, |
|
|
|
|
0x5555555F, |
|
|
|
|
0xAAAAAABF, |
|
|
|
|
0x555555FF, |
|
|
|
|
0xAAAAABFF, |
|
|
|
|
0x55555FFF, |
|
|
|
|
0xAAAABFFF, |
|
|
|
|
0x5555FFFF, |
|
|
|
|
0xAAABFFFF, |
|
|
|
|
0x555FFFFF, |
|
|
|
|
0xAABFFFFF, |
|
|
|
|
0x55FFFFFF, |
|
|
|
|
0xABFFFFFF, |
|
|
|
|
0x5FFFFFFF, |
|
|
|
|
0xBFFFFFFF, |
|
|
|
|
0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF |
|
|
|
|
}; |
|
|
|
|
/** Specifies the draw masks used to render transparency of wall tiles. */ |
|
|
|
|
static DWORD WallMask[TILE_HEIGHT] = { |
|
|
|
|
0xAAAAAAAA, 0x55555555, |
|
|
|
|
0xAAAAAAAA, 0x55555555, |
|
|
|
|
0xAAAAAAAA, 0x55555555, |
|
|
|
|
0xAAAAAAAA, 0x55555555, |
|
|
|
|
0xAAAAAAAA, 0x55555555, |
|
|
|
|
0xAAAAAAAA, 0x55555555, |
|
|
|
|
0xAAAAAAAA, 0x55555555, |
|
|
|
|
0xAAAAAAAA, 0x55555555, |
|
|
|
|
0xAAAAAAAA, 0x55555555, |
|
|
|
|
0xAAAAAAAA, 0x55555555, |
|
|
|
|
0xAAAAAAAA, 0x55555555, |
|
|
|
|
0xAAAAAAAA, 0x55555555, |
|
|
|
|
0xAAAAAAAA, 0x55555555, |
|
|
|
|
0xAAAAAAAA, 0x55555555, |
|
|
|
|
0xAAAAAAAA, 0x55555555, |
|
|
|
|
0xAAAAAAAA, 0x55555555 |
|
|
|
|
0xAAAAAAAA, |
|
|
|
|
0x55555555, |
|
|
|
|
0xAAAAAAAA, |
|
|
|
|
0x55555555, |
|
|
|
|
0xAAAAAAAA, |
|
|
|
|
0x55555555, |
|
|
|
|
0xAAAAAAAA, |
|
|
|
|
0x55555555, |
|
|
|
|
0xAAAAAAAA, |
|
|
|
|
0x55555555, |
|
|
|
|
0xAAAAAAAA, |
|
|
|
|
0x55555555, |
|
|
|
|
0xAAAAAAAA, |
|
|
|
|
0x55555555, |
|
|
|
|
0xAAAAAAAA, |
|
|
|
|
0x55555555, |
|
|
|
|
0xAAAAAAAA, |
|
|
|
|
0x55555555, |
|
|
|
|
0xAAAAAAAA, |
|
|
|
|
0x55555555, |
|
|
|
|
0xAAAAAAAA, |
|
|
|
|
0x55555555, |
|
|
|
|
0xAAAAAAAA, |
|
|
|
|
0x55555555, |
|
|
|
|
0xAAAAAAAA, |
|
|
|
|
0x55555555, |
|
|
|
|
0xAAAAAAAA, |
|
|
|
|
0x55555555, |
|
|
|
|
0xAAAAAAAA, |
|
|
|
|
0x55555555, |
|
|
|
|
0xAAAAAAAA, |
|
|
|
|
0x55555555 |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
/** Fully opaque mask */ |
|
|
|
|
static DWORD SolidMask[TILE_HEIGHT] = { |
|
|
|
|
0xFFFFFFFF, 0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, 0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, 0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, 0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, 0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, 0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, 0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, 0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, 0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, 0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, 0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, 0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, 0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, 0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, 0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, 0xFFFFFFFF |
|
|
|
|
0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFF |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
/** Used to mask out the left half of the tile diamond and only render additional content */ |
|
|
|
|
static DWORD RightFoliageMask[TILE_HEIGHT] = { |
|
|
|
|
0xFFFFFFFF, 0x3FFFFFFF, |
|
|
|
|
0x0FFFFFFF, 0x03FFFFFF, |
|
|
|
|
0x00FFFFFF, 0x003FFFFF, |
|
|
|
|
0x000FFFFF, 0x0003FFFF, |
|
|
|
|
0x0000FFFF, 0x00003FFF, |
|
|
|
|
0x00000FFF, 0x000003FF, |
|
|
|
|
0x000000FF, 0x0000003F, |
|
|
|
|
0x0000000F, 0x00000003, |
|
|
|
|
0x00000000, 0x00000003, |
|
|
|
|
0x0000000F, 0x0000003F, |
|
|
|
|
0x000000FF, 0x000003FF, |
|
|
|
|
0x00000FFF, 0x00003FFF, |
|
|
|
|
0x0000FFFF, 0x0003FFFF, |
|
|
|
|
0x000FFFFF, 0x003FFFFF, |
|
|
|
|
0x00FFFFFF, 0x03FFFFFF, |
|
|
|
|
0x0FFFFFFF, 0x3FFFFFFF, |
|
|
|
|
0xFFFFFFFF, |
|
|
|
|
0x3FFFFFFF, |
|
|
|
|
0x0FFFFFFF, |
|
|
|
|
0x03FFFFFF, |
|
|
|
|
0x00FFFFFF, |
|
|
|
|
0x003FFFFF, |
|
|
|
|
0x000FFFFF, |
|
|
|
|
0x0003FFFF, |
|
|
|
|
0x0000FFFF, |
|
|
|
|
0x00003FFF, |
|
|
|
|
0x00000FFF, |
|
|
|
|
0x000003FF, |
|
|
|
|
0x000000FF, |
|
|
|
|
0x0000003F, |
|
|
|
|
0x0000000F, |
|
|
|
|
0x00000003, |
|
|
|
|
0x00000000, |
|
|
|
|
0x00000000, |
|
|
|
|
0x00000000, |
|
|
|
|
0x00000000, |
|
|
|
|
0x00000000, |
|
|
|
|
0x00000000, |
|
|
|
|
0x00000000, |
|
|
|
|
0x00000000, |
|
|
|
|
0x00000000, |
|
|
|
|
0x00000000, |
|
|
|
|
0x00000000, |
|
|
|
|
0x00000000, |
|
|
|
|
0x00000000, |
|
|
|
|
0x00000000, |
|
|
|
|
0x00000000, |
|
|
|
|
0x00000000, |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
/** Used to mask out the left half of the tile diamond and only render additional content */ |
|
|
|
|
static DWORD LeftFoliageMask[TILE_HEIGHT] = { |
|
|
|
|
0xFFFFFFFF, 0xFFFFFFFC, |
|
|
|
|
0xFFFFFFF0, 0xFFFFFFC0, |
|
|
|
|
0xFFFFFF00, 0xFFFFFC00, |
|
|
|
|
0xFFFFF000, 0xFFFFC000, |
|
|
|
|
0xFFFF0000, 0xFFFC0000, |
|
|
|
|
0xFFF00000, 0xFFC00000, |
|
|
|
|
0xFF000000, 0xFC000000, |
|
|
|
|
0xF0000000, 0xC0000000, |
|
|
|
|
0x00000000, 0xC0000000, |
|
|
|
|
0xF0000000, 0xFC000000, |
|
|
|
|
0xFF000000, 0xFFC00000, |
|
|
|
|
0xFFF00000, 0xFFFC0000, |
|
|
|
|
0xFFFF0000, 0xFFFFC000, |
|
|
|
|
0xFFFFF000, 0xFFFFFC00, |
|
|
|
|
0xFFFFFF00, 0xFFFFFFC0, |
|
|
|
|
0xFFFFFFF0, 0xFFFFFFFC, |
|
|
|
|
0xFFFFFFFF, |
|
|
|
|
0xFFFFFFFC, |
|
|
|
|
0xFFFFFFF0, |
|
|
|
|
0xFFFFFFC0, |
|
|
|
|
0xFFFFFF00, |
|
|
|
|
0xFFFFFC00, |
|
|
|
|
0xFFFFF000, |
|
|
|
|
0xFFFFC000, |
|
|
|
|
0xFFFF0000, |
|
|
|
|
0xFFFC0000, |
|
|
|
|
0xFFF00000, |
|
|
|
|
0xFFC00000, |
|
|
|
|
0xFF000000, |
|
|
|
|
0xFC000000, |
|
|
|
|
0xF0000000, |
|
|
|
|
0xC0000000, |
|
|
|
|
0x00000000, |
|
|
|
|
0x00000000, |
|
|
|
|
0x00000000, |
|
|
|
|
0x00000000, |
|
|
|
|
0x00000000, |
|
|
|
|
0x00000000, |
|
|
|
|
0x00000000, |
|
|
|
|
0x00000000, |
|
|
|
|
0x00000000, |
|
|
|
|
0x00000000, |
|
|
|
|
0x00000000, |
|
|
|
|
0x00000000, |
|
|
|
|
0x00000000, |
|
|
|
|
0x00000000, |
|
|
|
|
0x00000000, |
|
|
|
|
0x00000000, |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
inline static int count_leading_zeros(DWORD mask) |
|
|
|
|
@ -179,12 +380,12 @@ inline static void RenderLine(BYTE **dst, BYTE **src, int n, BYTE *tbl, DWORD ma
|
|
|
|
|
} |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
if (mask == 0xFFFFFFFF) { |
|
|
|
|
if (light_table_index == lightmax) { |
|
|
|
|
if (mask == 0xFFFFFFFF) { // Opaque line
|
|
|
|
|
if (light_table_index == lightmax) { // Complete darkness
|
|
|
|
|
memset(*dst, 0, n); |
|
|
|
|
} else if (light_table_index == 0) { |
|
|
|
|
} else if (light_table_index == 0) { // Fully lit
|
|
|
|
|
memcpy(*dst, *src, n); |
|
|
|
|
} else { |
|
|
|
|
} else { // Partially lit
|
|
|
|
|
for (int i = 0; i < n; i++) { |
|
|
|
|
(*dst)[i] = tbl[(*src)[i]]; |
|
|
|
|
} |
|
|
|
|
@ -197,12 +398,37 @@ inline static void RenderLine(BYTE **dst, BYTE **src, int n, BYTE *tbl, DWORD ma
|
|
|
|
|
assert(n != 0 && n <= sizeof(DWORD) * CHAR_BIT); |
|
|
|
|
mask &= DWORD(-1) << ((sizeof(DWORD) * CHAR_BIT) - n); |
|
|
|
|
|
|
|
|
|
if (light_table_index == lightmax) { |
|
|
|
|
foreach_set_bit(mask, [=](int i) { (*dst)[i] = 0; }); |
|
|
|
|
} else if (light_table_index == 0) { |
|
|
|
|
foreach_set_bit(mask, [=](int i) { (*dst)[i] = (*src)[i]; }); |
|
|
|
|
} else { |
|
|
|
|
foreach_set_bit(mask, [=](int i) { (*dst)[i] = tbl[(*src)[i]]; }); |
|
|
|
|
if (sgOptions.blendedTransparancy && !cel_foliage_active) { // Blended transparancy
|
|
|
|
|
if (light_table_index == lightmax) { // Complete darkness
|
|
|
|
|
for (int i = 0; i < n; i++, mask <<= 1) { |
|
|
|
|
if (mask & 0x80000000) |
|
|
|
|
(*dst)[i] = 0; |
|
|
|
|
else |
|
|
|
|
(*dst)[i] = paletteTransparencyLookup[0][(*dst)[i]]; |
|
|
|
|
} |
|
|
|
|
} else if (light_table_index == 0) { // Fully lit
|
|
|
|
|
for (int i = 0; i < n; i++, mask <<= 1) { |
|
|
|
|
if (mask & 0x80000000) |
|
|
|
|
(*dst)[i] = (*src)[i]; |
|
|
|
|
else |
|
|
|
|
(*dst)[i] = paletteTransparencyLookup[(*dst)[i]][(*src)[i]]; |
|
|
|
|
} |
|
|
|
|
} else { // Partially lit
|
|
|
|
|
for (int i = 0; i < n; i++, mask <<= 1) { |
|
|
|
|
if (mask & 0x80000000) |
|
|
|
|
(*dst)[i] = tbl[(*src)[i]]; |
|
|
|
|
else |
|
|
|
|
(*dst)[i] = paletteTransparencyLookup[(*dst)[i]][tbl[(*src)[i]]]; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} else { // Stippled transparancy
|
|
|
|
|
if (light_table_index == lightmax) { // Complete darkness
|
|
|
|
|
foreach_set_bit(mask, [=](int i) { (*dst)[i] = 0; }); |
|
|
|
|
} else if (light_table_index == 0) { // Fully lit
|
|
|
|
|
foreach_set_bit(mask, [=](int i) { (*dst)[i] = (*src)[i]; }); |
|
|
|
|
} else { // Partially lit
|
|
|
|
|
foreach_set_bit(mask, [=](int i) { (*dst)[i] = tbl[(*src)[i]]; }); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@ -218,7 +444,8 @@ __attribute__((no_sanitize("shift-base")))
|
|
|
|
|
* @brief Blit current world CEL to the given buffer |
|
|
|
|
* @param pBuff Output buffer |
|
|
|
|
*/ |
|
|
|
|
void RenderTile(BYTE *pBuff) |
|
|
|
|
void |
|
|
|
|
RenderTile(BYTE *pBuff) |
|
|
|
|
{ |
|
|
|
|
int i, j; |
|
|
|
|
char c, v, tile; |
|
|
|
|
@ -232,22 +459,32 @@ void RenderTile(BYTE *pBuff)
|
|
|
|
|
tile = (level_cel_block & 0x7000) >> 12; |
|
|
|
|
tbl = &pLightTbl[256 * light_table_index]; |
|
|
|
|
|
|
|
|
|
// The mask defines what parts of the tile is opaque
|
|
|
|
|
mask = &SolidMask[TILE_HEIGHT - 1]; |
|
|
|
|
|
|
|
|
|
if (cel_transparency_active) { |
|
|
|
|
if (arch_draw_type == 0) { |
|
|
|
|
mask = &WallMask[TILE_HEIGHT - 1]; |
|
|
|
|
if (sgOptions.blendedTransparancy) // Use a fully transparent mask
|
|
|
|
|
mask = &WallMask_FullyTrasparent[TILE_HEIGHT - 1]; |
|
|
|
|
else |
|
|
|
|
mask = &WallMask[TILE_HEIGHT - 1]; |
|
|
|
|
} |
|
|
|
|
if (arch_draw_type == 1 && tile != RT_LTRIANGLE) { |
|
|
|
|
c = block_lvid[level_piece_id]; |
|
|
|
|
if (c == 1 || c == 3) { |
|
|
|
|
mask = &LeftMask[TILE_HEIGHT - 1]; |
|
|
|
|
if (sgOptions.blendedTransparancy) // Use a fully transparent mask
|
|
|
|
|
mask = &LeftMask_Transparent[TILE_HEIGHT - 1]; |
|
|
|
|
else |
|
|
|
|
mask = &LeftMask[TILE_HEIGHT - 1]; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
if (arch_draw_type == 2 && tile != RT_RTRIANGLE) { |
|
|
|
|
c = block_lvid[level_piece_id]; |
|
|
|
|
if (c == 2 || c == 3) { |
|
|
|
|
mask = &RightMask[TILE_HEIGHT - 1]; |
|
|
|
|
if (sgOptions.blendedTransparancy) // Use a fully transparent mask
|
|
|
|
|
mask = &RightMask_Transparent[TILE_HEIGHT - 1]; |
|
|
|
|
else |
|
|
|
|
mask = &RightMask[TILE_HEIGHT - 1]; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} else if (arch_draw_type && cel_foliage_active) { |
|
|
|
|
@ -377,9 +614,21 @@ void trans_rect(int sx, int sy, int width, int height)
|
|
|
|
|
{ |
|
|
|
|
int row, col; |
|
|
|
|
BYTE *pix = &gpBuffer[SCREENXY(sx, sy)]; |
|
|
|
|
|
|
|
|
|
if (sgOptions.blendedTransparancy) { // Blended
|
|
|
|
|
for (row = 0; row < height; row++) { |
|
|
|
|
for (col = 0; col < width; col++) { |
|
|
|
|
*pix = paletteTransparencyLookup[0][*pix]; |
|
|
|
|
pix++; |
|
|
|
|
} |
|
|
|
|
pix += BUFFER_WIDTH - width; |
|
|
|
|
} |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
for (row = 0; row < height; row++) { |
|
|
|
|
for (col = 0; col < width; col++) { |
|
|
|
|
if ((row & 1 && col & 1) || (!(row & 1) && !(col & 1))) |
|
|
|
|
if ((row & 1 && col & 1) || (!(row & 1) && !(col & 1))) // Stippled
|
|
|
|
|
*pix = 0; |
|
|
|
|
pix++; |
|
|
|
|
} |
|
|
|
|
|