mirror of
https://github.com/OpenRCT2/OpenRCT2
synced 2025-12-24 00:03:11 +01:00
Improvements to sprite_paint_setup
This includes following changes: * Reorder exit conditions by frequency they're hit at, this makes the function exit earlier in many cases without having to do expensive accesses to global memory. * The code in C tested (eax > 0x2000) || (ecx > 0x2000) while I believe it was meant to check for >= instead (`cmp ax,2000h; jnb`) * The check mentioned above was changed to be expressed more concisely: `((eax | ecx) & 0xe000)`, which generates a single `test` instead of two. It improves performance by 1-2fps in parks that rely heavily on this function, like the mega-micro park from https://github.com/OpenRCT2/OpenRCT2/issues/2589
This commit is contained in:
@@ -1179,26 +1179,23 @@ void viewport_litter_paint_setup(rct_litter *litter, int imageDirection)
|
|||||||
* Paint Quadrant
|
* Paint Quadrant
|
||||||
* rct2: 0x0069E8B0
|
* rct2: 0x0069E8B0
|
||||||
*/
|
*/
|
||||||
void sprite_paint_setup(uint16 eax, uint16 ecx){
|
void sprite_paint_setup(const uint16 eax, const uint16 ecx){
|
||||||
uint32 _eax = eax, _ecx = ecx;
|
|
||||||
rct_drawpixelinfo* dpi;
|
rct_drawpixelinfo* dpi;
|
||||||
|
|
||||||
|
if ((eax & 0xe000) | (ecx & 0xe000)) return;
|
||||||
|
|
||||||
|
const int idx = ((eax << 3) & 0xff00) | (ecx >> 5);
|
||||||
|
int sprite_idx = RCT2_ADDRESS(0xF1EF60, uint16)[idx];
|
||||||
|
if (sprite_idx == SPRITE_INDEX_NULL) return;
|
||||||
|
|
||||||
if (RCT2_GLOBAL(0x9DEA6F, uint8) & 1) return;
|
if (RCT2_GLOBAL(0x9DEA6F, uint8) & 1) return;
|
||||||
|
|
||||||
dpi = RCT2_GLOBAL(0x140E9A8, rct_drawpixelinfo*);
|
|
||||||
|
|
||||||
if (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_VIEWPORT_FLAGS, uint16) & VIEWPORT_FLAG_INVISIBLE_SPRITES) return;
|
if (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_VIEWPORT_FLAGS, uint16) & VIEWPORT_FLAG_INVISIBLE_SPRITES) return;
|
||||||
|
|
||||||
|
dpi = RCT2_GLOBAL(0x140E9A8, rct_drawpixelinfo*);
|
||||||
if (dpi->zoom_level > 2) return;
|
if (dpi->zoom_level > 2) return;
|
||||||
|
|
||||||
if (eax > 0x2000)return;
|
|
||||||
if (ecx > 0x2000)return;
|
|
||||||
|
|
||||||
//push eax, ecx
|
|
||||||
eax = (eax & 0x1FE0) << 3 | (ecx >> 5);
|
|
||||||
int sprite_idx = RCT2_ADDRESS(0xF1EF60, uint16)[eax];
|
|
||||||
if (sprite_idx == SPRITE_INDEX_NULL) return;
|
|
||||||
|
|
||||||
for (rct_sprite* spr = &g_sprite_list[sprite_idx]; sprite_idx != SPRITE_INDEX_NULL; sprite_idx = spr->unknown.next_in_quadrant){
|
for (rct_sprite* spr = &g_sprite_list[sprite_idx]; sprite_idx != SPRITE_INDEX_NULL; sprite_idx = spr->unknown.next_in_quadrant){
|
||||||
spr = &g_sprite_list[sprite_idx];
|
spr = &g_sprite_list[sprite_idx];
|
||||||
@@ -1215,7 +1212,6 @@ void sprite_paint_setup(uint16 eax, uint16 ecx){
|
|||||||
image_direction &= 0x1F;
|
image_direction &= 0x1F;
|
||||||
|
|
||||||
RCT2_GLOBAL(0x9DE578, uint32) = (uint32)spr;
|
RCT2_GLOBAL(0x9DE578, uint32) = (uint32)spr;
|
||||||
int ebp = spr->unknown.sprite_identifier;
|
|
||||||
|
|
||||||
RCT2_GLOBAL(0x9DE568, sint16) = spr->unknown.x;
|
RCT2_GLOBAL(0x9DE568, sint16) = spr->unknown.x;
|
||||||
RCT2_GLOBAL(RCT2_ADDRESS_PAINT_SETUP_CURRENT_TYPE, uint8) = VIEWPORT_INTERACTION_ITEM_SPRITE;
|
RCT2_GLOBAL(RCT2_ADDRESS_PAINT_SETUP_CURRENT_TYPE, uint8) = VIEWPORT_INTERACTION_ITEM_SPRITE;
|
||||||
|
|||||||
Reference in New Issue
Block a user