TWINE: optimized rendering inventory items for drawcalls

This commit is contained in:
Martin Gerhardy 2020-12-30 14:28:46 +01:00
parent b591d9e0e3
commit 0a97afc141
2 changed files with 26 additions and 10 deletions

View file

@ -1046,7 +1046,7 @@ void Menu::drawMagicItemsBox(int32 left, int32 top, int32 right, int32 bottom, i
_engine->_interface->drawLine(++left, bottom, right, bottom, color); // bottom line _engine->_interface->drawLine(++left, bottom, right, bottom, color); // bottom line
} }
void Menu::drawItem(int32 item) { void Menu::drawItem(int32 item, Common::Rect &dirtyRect) {
const int32 itemX = (item / 4) * 85 + 64; const int32 itemX = (item / 4) * 85 + 64;
const int32 itemY = (item & 3) * 75 + 52; const int32 itemY = (item & 3) * 75 + 52;
@ -1070,7 +1070,11 @@ void Menu::drawItem(int32 item) {
} }
drawBox(rect); drawBox(rect);
_engine->copyBlockPhys(rect); if (dirtyRect.isEmpty()) {
dirtyRect = rect;
} else {
dirtyRect.extend(rect);
}
} }
void Menu::drawInventoryItems() { void Menu::drawInventoryItems() {
@ -1080,8 +1084,12 @@ void Menu::drawInventoryItems() {
drawMagicItemsBox(110, 18, 188, 311, 75); drawMagicItemsBox(110, 18, 188, 311, 75);
_engine->copyBlockPhys(rect); _engine->copyBlockPhys(rect);
Common::Rect dirtyRect;
for (int32 item = 0; item < NUM_INVENTORY_ITEMS; item++) { for (int32 item = 0; item < NUM_INVENTORY_ITEMS; item++) {
drawItem(item); drawItem(item, dirtyRect);
}
if (!dirtyRect.isEmpty()) {
_engine->copyBlockPhys(dirtyRect);
} }
} }
@ -1129,33 +1137,34 @@ void Menu::processInventoryMenu() {
const bool cursorLeft = _engine->_input->toggleActionIfActive(TwinEActionType::UILeft); const bool cursorLeft = _engine->_input->toggleActionIfActive(TwinEActionType::UILeft);
const bool cursorRight = _engine->_input->toggleActionIfActive(TwinEActionType::UIRight); const bool cursorRight = _engine->_input->toggleActionIfActive(TwinEActionType::UIRight);
Common::Rect dirtyRect;
if (cursorDown) { if (cursorDown) {
inventorySelectedItem++; inventorySelectedItem++;
if (inventorySelectedItem >= NUM_INVENTORY_ITEMS) { if (inventorySelectedItem >= NUM_INVENTORY_ITEMS) {
inventorySelectedItem = 0; inventorySelectedItem = 0;
} }
drawItem(prevSelectedItem); drawItem(prevSelectedItem, dirtyRect);
updateItemText = true; updateItemText = true;
} else if (cursorUp) { } else if (cursorUp) {
inventorySelectedItem--; inventorySelectedItem--;
if (inventorySelectedItem < 0) { if (inventorySelectedItem < 0) {
inventorySelectedItem = NUM_INVENTORY_ITEMS - 1; inventorySelectedItem = NUM_INVENTORY_ITEMS - 1;
} }
drawItem(prevSelectedItem); drawItem(prevSelectedItem, dirtyRect);
updateItemText = true; updateItemText = true;
} else if (cursorLeft) { } else if (cursorLeft) {
inventorySelectedItem -= 4; inventorySelectedItem -= 4;
if (inventorySelectedItem < 0) { if (inventorySelectedItem < 0) {
inventorySelectedItem += NUM_INVENTORY_ITEMS; inventorySelectedItem += NUM_INVENTORY_ITEMS;
} }
drawItem(prevSelectedItem); drawItem(prevSelectedItem, dirtyRect);
updateItemText = true; updateItemText = true;
} else if (cursorRight) { } else if (cursorRight) {
inventorySelectedItem += 4; inventorySelectedItem += 4;
if (inventorySelectedItem >= NUM_INVENTORY_ITEMS) { if (inventorySelectedItem >= NUM_INVENTORY_ITEMS) {
inventorySelectedItem -= NUM_INVENTORY_ITEMS; inventorySelectedItem -= NUM_INVENTORY_ITEMS;
} }
drawItem(prevSelectedItem); drawItem(prevSelectedItem, dirtyRect);
updateItemText = true; updateItemText = true;
} }
@ -1185,14 +1194,21 @@ void Menu::processInventoryMenu() {
} }
} }
drawItem(inventorySelectedItem); drawItem(inventorySelectedItem, dirtyRect);
if (inventorySelectedItem < NUM_INVENTORY_ITEMS && _engine->_input->toggleActionIfActive(TwinEActionType::UIEnter) && _engine->_gameState->hasItem((InventoryItems)inventorySelectedItem) && !_engine->_gameState->inventoryDisabled()) { if (inventorySelectedItem < NUM_INVENTORY_ITEMS && _engine->_input->toggleActionIfActive(TwinEActionType::UIEnter) && _engine->_gameState->hasItem((InventoryItems)inventorySelectedItem) && !_engine->_gameState->inventoryDisabled()) {
_engine->loopInventoryItem = inventorySelectedItem; _engine->loopInventoryItem = inventorySelectedItem;
inventorySelectedColor = 91; inventorySelectedColor = 91;
drawItem(inventorySelectedItem); drawItem(inventorySelectedItem, dirtyRect);
if (!dirtyRect.isEmpty()) {
_engine->copyBlockPhys(dirtyRect);
}
break; break;
} }
if (!dirtyRect.isEmpty()) {
_engine->copyBlockPhys(dirtyRect);
}
} }
_engine->_text->_hasValidTextHandle = false; _engine->_text->_hasValidTextHandle = false;

View file

@ -171,7 +171,7 @@ private:
void drawInventoryItems(); void drawInventoryItems();
void prepareAndDrawBehaviour(int32 angle, HeroBehaviourType behaviour); void prepareAndDrawBehaviour(int32 angle, HeroBehaviourType behaviour);
void drawBehaviourMenu(int32 angle); void drawBehaviourMenu(int32 angle);
void drawItem(int32 item); void drawItem(int32 item, Common::Rect &dirtyRect);
/** /**
* Draw the entire button box * Draw the entire button box
* @param left start width to draw the button * @param left start width to draw the button