1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2026-01-15 11:03:00 +01:00

Add tertiary colour to ImageId

This commit is contained in:
Ted John
2019-08-24 22:19:40 +01:00
parent 3925a6162d
commit c653f13552
6 changed files with 72 additions and 46 deletions

View File

@@ -176,7 +176,7 @@ void TextureCache::GeneratePaletteTexture()
GLint y = PaletteToY(i);
uint16_t image = palette_to_g1_offset[i];
auto element = gfx_get_g1_element(image);
gfx_draw_sprite_software(&dpi, ImageId(image), -element->x_offset, y - element->y_offset, 0);
gfx_draw_sprite_software(&dpi, ImageId(image), -element->x_offset, y - element->y_offset);
}
glBindTexture(GL_TEXTURE_RECTANGLE, _paletteTexture);
@@ -299,7 +299,7 @@ rct_drawpixelinfo TextureCache::GetImageAsDPI(uint32_t image, uint32_t tertiaryC
int32_t height = g1Element->height;
rct_drawpixelinfo dpi = CreateDPI(width, height);
gfx_draw_sprite_software(&dpi, ImageId::FromUInt32(image), -g1Element->x_offset, -g1Element->y_offset, tertiaryColour);
gfx_draw_sprite_software(&dpi, ImageId::FromUInt32(image, tertiaryColour), -g1Element->x_offset, -g1Element->y_offset);
return dpi;
}
@@ -310,7 +310,8 @@ rct_drawpixelinfo TextureCache::GetGlyphAsDPI(uint32_t image, uint8_t* palette)
int32_t height = g1Element->height;
rct_drawpixelinfo dpi = CreateDPI(width, height);
gfx_draw_sprite_palette_set_software(&dpi, ImageId::FromUInt32(image), -g1Element->x_offset, -g1Element->y_offset, palette, nullptr);
gfx_draw_sprite_palette_set_software(
&dpi, ImageId::FromUInt32(image), -g1Element->x_offset, -g1Element->y_offset, palette, nullptr);
return dpi;
}

View File

@@ -508,12 +508,9 @@ void FASTCALL gfx_bmp_sprite_to_buffer(
}
}
uint8_t* FASTCALL gfx_draw_sprite_get_palette(ImageId imageId, uint32_t tertiary_colour)
uint8_t* FASTCALL gfx_draw_sprite_get_palette(ImageId imageId)
{
if (!imageId.HasPrimary() && !imageId.HasSecondary() && !imageId.IsBlended())
return nullptr;
if (!imageId.HasSecondary())
if (imageId.IsRemap())
{
uint8_t palette_ref = imageId.GetRemap();
if (!imageId.IsBlended())
@@ -532,20 +529,20 @@ uint8_t* FASTCALL gfx_draw_sprite_get_palette(ImageId imageId, uint32_t tertiary
return g1->offset;
}
}
else
else if (imageId.HasSecondary())
{
uint8_t* palette_pointer = gPeepPalette;
uint32_t primary_offset = palette_to_g1_offset[imageId.GetPrimary()];
uint32_t secondary_offset = palette_to_g1_offset[imageId.GetSecondary()];
if (!imageId.HasPrimary())
if (imageId.HasTertiary())
{
palette_pointer = gOtherPalette;
#if defined(DEBUG_LEVEL_2) && DEBUG_LEVEL_2
assert(tertiary_colour < PALETTE_TO_G1_OFFSET_COUNT);
#endif // DEBUG_LEVEL_2
uint32_t tertiary_offset = palette_to_g1_offset[tertiary_colour];
uint32_t tertiary_offset = palette_to_g1_offset[imageId.GetTertiary()];
auto tertiary_palette = gfx_get_g1_element(tertiary_offset);
if (tertiary_palette != nullptr)
{
@@ -565,35 +562,18 @@ uint8_t* FASTCALL gfx_draw_sprite_get_palette(ImageId imageId, uint32_t tertiary
return palette_pointer;
}
else
{
return nullptr;
}
}
/**
*
* rct2: 0x0067A28E
* image_id (ebx)
* image_id as below
* 0b_111X_XXXX_XXXX_XXXX_XXXX_XXXX_XXXX_XXXX image_type
* 0b_XXX1_11XX_XXXX_XXXX_XXXX_XXXX_XXXX_XXXX image_sub_type (unknown pointer)
* 0b_XXX1_1111_XXXX_XXXX_XXXX_XXXX_XXXX_XXXX secondary_colour
* 0b_XXXX_XXXX_1111_1XXX_XXXX_XXXX_XXXX_XXXX primary_colour
* 0b_XXXX_X111_1111_1XXX_XXXX_XXXX_XXXX_XXXX palette_ref
* 0b_XXXX_XXXX_XXXX_X111_1111_1111_1111_1111 image_id (offset to g1)
* x (cx)
* y (dx)
* dpi (esi)
* tertiary_colour (ebp)
*/
void FASTCALL gfx_draw_sprite_software(rct_drawpixelinfo* dpi, ImageId imageId, int32_t x, int32_t y, uint32_t tertiary_colour)
void FASTCALL gfx_draw_sprite_software(rct_drawpixelinfo* dpi, ImageId imageId, int32_t x, int32_t y)
{
if (imageId.HasValue())
{
uint8_t* palette_pointer = gfx_draw_sprite_get_palette(imageId, tertiary_colour);
if (imageId.HasSecondary())
{
imageId = imageId.WithPrimary(imageId.GetPrimary());
}
gfx_draw_sprite_palette_set_software(dpi, imageId, x, y, palette_pointer, nullptr);
auto palette = gfx_draw_sprite_get_palette(imageId);
gfx_draw_sprite_palette_set_software(dpi, imageId, x, y, palette, nullptr);
}
}
@@ -786,7 +766,7 @@ void FASTCALL
// Only BMP format is supported for masking
if (!(imgMask->flags & G1_FLAG_BMP) || !(imgColour->flags & G1_FLAG_BMP))
{
gfx_draw_sprite_software(dpi, ImageId::FromUInt32(colourImage), x, y, 0);
gfx_draw_sprite_software(dpi, ImageId::FromUInt32(colourImage), x, y);
return;
}

View File

@@ -266,6 +266,7 @@ private:
// clang-format on
uint32_t _value = VALUE_UNDEFINED;
uint8_t _tertiary = 0;
public:
static ImageId FromUInt32(uint32_t value)
@@ -275,6 +276,14 @@ public:
return result;
}
static ImageId FromUInt32(uint32_t value, uint32_t tertiary)
{
ImageId result;
result._value = value;
result._tertiary = tertiary & 0xFF;
return result;
}
ImageId() = default;
explicit ImageId(uint32_t index)
@@ -282,8 +291,8 @@ public:
{
}
ImageId(uint32_t index, colour_t primaryColour)
: ImageId(ImageId(index).WithPrimary(primaryColour))
ImageId(uint32_t index, uint8_t primaryColourOrPalette)
: ImageId(ImageId(index).WithPrimary(primaryColourOrPalette))
{
}
@@ -292,6 +301,11 @@ public:
{
}
ImageId(uint32_t index, colour_t primaryColour, colour_t secondaryColour, colour_t tertiaryColour)
: ImageId(ImageId(index).WithPrimary(primaryColour).WithSecondary(secondaryColour).WithTertiary(tertiaryColour))
{
}
uint32_t ToUInt32() const
{
return _value;
@@ -304,7 +318,7 @@ public:
bool HasPrimary() const
{
return _value & FLAG_PRIMARY;
return (_value & FLAG_PRIMARY) || (_value & FLAG_SECONDARY);
}
bool HasSecondary() const
@@ -312,6 +326,16 @@ public:
return _value & FLAG_SECONDARY;
}
bool HasTertiary() const
{
return !(_value & FLAG_PRIMARY) && (_value & FLAG_SECONDARY);
}
bool IsRemap() const
{
return (_value & FLAG_PRIMARY) && !(_value & FLAG_SECONDARY);
}
bool IsBlended() const
{
return _value & FLAG_BLEND;
@@ -337,6 +361,11 @@ public:
return (_value & MASK_SECONDARY) >> SHIFT_SECONDARY;
}
colour_t GetTertiary() const
{
return _tertiary;
}
ImageCatalogue GetCatalogue() const;
ImageId WithIndex(uint32_t index)
@@ -359,6 +388,21 @@ public:
result._value = (_value & ~MASK_SECONDARY) | ((colour << SHIFT_SECONDARY) & MASK_SECONDARY) | FLAG_SECONDARY;
return result;
}
ImageId WithTertiary(colour_t tertiary)
{
ImageId result = *this;
result._value &= ~FLAG_PRIMARY;
if (!(_value & FLAG_SECONDARY))
{
// Tertiary implies primary and secondary, so if colour was remap (8-bit primary) then
// we need to zero the secondary colour.
result._value &= ~MASK_SECONDARY;
result._value |= FLAG_SECONDARY;
}
result._tertiary = tertiary;
return result;
}
};
#define SPRITE_ID_PALETTE_COLOUR_1(colourId) (IMAGE_TYPE_REMAP | ((colourId) << 19))
@@ -454,8 +498,8 @@ void FASTCALL gfx_draw_glpyh(rct_drawpixelinfo* dpi, int32_t image_id, int32_t x
void FASTCALL gfx_draw_sprite_raw_masked(rct_drawpixelinfo* dpi, int32_t x, int32_t y, int32_t maskImage, int32_t colourImage);
void FASTCALL gfx_draw_sprite_solid(rct_drawpixelinfo* dpi, int32_t image, int32_t x, int32_t y, uint8_t colour);
void FASTCALL gfx_draw_sprite_software(rct_drawpixelinfo* dpi, ImageId imageId, int32_t x, int32_t y, uint32_t tertiary_colour);
uint8_t* FASTCALL gfx_draw_sprite_get_palette(ImageId imageId, uint32_t tertiary_colour);
void FASTCALL gfx_draw_sprite_software(rct_drawpixelinfo* dpi, ImageId imageId, int32_t x, int32_t y);
uint8_t* FASTCALL gfx_draw_sprite_get_palette(ImageId imageId);
void FASTCALL gfx_draw_sprite_palette_set_software(
rct_drawpixelinfo* dpi, ImageId imageId, int32_t x, int32_t y, uint8_t* palette_pointer, uint8_t* unknown_pointer);
void FASTCALL

View File

@@ -53,7 +53,7 @@ void scrolling_text_initialise_bitmaps()
for (int32_t i = 0; i < FONT_SPRITE_GLYPH_COUNT; i++)
{
std::fill_n(drawingSurface, sizeof(drawingSurface), 0x00);
gfx_draw_sprite_software(&dpi, ImageId::FromUInt32(SPR_CHAR_START + FONT_SPRITE_BASE_TINY + i), -1, 0, 0);
gfx_draw_sprite_software(&dpi, ImageId::FromUInt32(SPR_CHAR_START + FONT_SPRITE_BASE_TINY + i), -1, 0);
for (int32_t x = 0; x < 8; x++)
{
@@ -75,7 +75,7 @@ void scrolling_text_initialise_bitmaps()
{
std::fill_n(drawingSurface, sizeof(drawingSurface), 0x00);
gfx_draw_sprite_software(
&dpi, ImageId::FromUInt32(SPR_G2_CHAR_BEGIN + (FONT_SIZE_TINY * SPR_G2_GLYPH_COUNT) + i), -1, 0, 0);
&dpi, ImageId::FromUInt32(SPR_G2_CHAR_BEGIN + (FONT_SIZE_TINY * SPR_G2_GLYPH_COUNT) + i), -1, 0);
for (int32_t x = 0; x < 8; x++)
{

View File

@@ -730,7 +730,7 @@ void X8DrawingContext::DrawLine(uint32_t colour, int32_t x1, int32_t y1, int32_t
void X8DrawingContext::DrawSprite(uint32_t image, int32_t x, int32_t y, uint32_t tertiaryColour)
{
gfx_draw_sprite_software(_dpi, ImageId::FromUInt32(image), x, y, tertiaryColour);
gfx_draw_sprite_software(_dpi, ImageId::FromUInt32(image, tertiaryColour), x, y);
}
void X8DrawingContext::DrawSpriteRawMasked(int32_t x, int32_t y, uint32_t maskImage, uint32_t colourImage)
@@ -743,7 +743,8 @@ void X8DrawingContext::DrawSpriteSolid(uint32_t image, int32_t x, int32_t y, uin
uint8_t palette[256];
std::fill_n(palette, sizeof(palette), colour);
palette[0] = 0;
gfx_draw_sprite_palette_set_software(_dpi, ImageId::FromUInt32((image & 0x7FFFF) | IMAGE_TYPE_REMAP), x, y, palette, nullptr);
gfx_draw_sprite_palette_set_software(
_dpi, ImageId::FromUInt32((image & 0x7FFFF) | IMAGE_TYPE_REMAP), x, y, palette, nullptr);
}
void X8DrawingContext::DrawGlyph(uint32_t image, int32_t x, int32_t y, uint8_t* palette)

View File

@@ -6072,7 +6072,7 @@ void set_vehicle_type_image_max_sizes(rct_ride_entry_vehicle* vehicle_type, int3
for (int32_t i = 0; i < num_images; ++i)
{
gfx_draw_sprite_software(&dpi, ImageId::FromUInt32(vehicle_type->base_image_id + i), 0, 0, 0);
gfx_draw_sprite_software(&dpi, ImageId::FromUInt32(vehicle_type->base_image_id + i), 0, 0);
}
int32_t al = -1;
for (int32_t i = 99; i != 0; --i)