TWINE: use SpriteData for rendering

This commit is contained in:
Martin Gerhardy 2020-12-24 00:09:40 +01:00
parent e1f827c323
commit c1b89c9878
3 changed files with 24 additions and 23 deletions

View file

@ -806,7 +806,7 @@ void Menu::drawInfoMenu(int16 left, int16 top) {
int32 newBoxLeft2 = left + 9;
_engine->_grid->drawSprite(0, newBoxLeft2, top + 13, _engine->_resources->spriteTable[SPRITEHQR_LIFEPOINTS]);
_engine->_grid->drawSprite(0, newBoxLeft2, top + 13, _engine->_resources->spriteData[SPRITEHQR_LIFEPOINTS]);
int32 boxRight = left + 325;
int32 newBoxLeft = left + 25;
@ -818,7 +818,7 @@ void Menu::drawInfoMenu(int16 left, int16 top) {
drawBox(newBoxLeft, boxTop, left + 324, boxTop + 14);
if (!_engine->_gameState->inventoryDisabled() && _engine->_gameState->hasItem(InventoryItems::kiTunic)) {
_engine->_grid->drawSprite(0, newBoxLeft2, top + 36, _engine->_resources->spriteTable[SPRITEHQR_MAGICPOINTS]);
_engine->_grid->drawSprite(0, newBoxLeft2, top + 36, _engine->_resources->spriteData[SPRITEHQR_MAGICPOINTS]);
if (_engine->_gameState->magicLevelIdx > 0) {
_engine->_interface->drawSplittedBox(Common::Rect(newBoxLeft, top + 35, _engine->_screens->crossDot(newBoxLeft, boxRight, 80, _engine->_gameState->inventoryMagicPoints), top + 50), 75);
}
@ -828,13 +828,13 @@ void Menu::drawInfoMenu(int16 left, int16 top) {
boxLeft = left + 340;
/** draw coin sprite */
_engine->_grid->drawSprite(0, boxLeft, top + 15, _engine->_resources->spriteTable[SPRITEHQR_KASHES]);
_engine->_grid->drawSprite(0, boxLeft, top + 15, _engine->_resources->spriteData[SPRITEHQR_KASHES]);
_engine->_text->setFontColor(155);
Common::String inventoryNumKashes = Common::String::format("%d", _engine->_gameState->inventoryNumKashes);
_engine->_text->drawText(left + 370, top + 5, inventoryNumKashes.c_str());
/** draw key sprite */
_engine->_grid->drawSprite(0, boxLeft, top + 55, _engine->_resources->spriteTable[SPRITEHQR_KEY]);
_engine->_grid->drawSprite(0, boxLeft, top + 55, _engine->_resources->spriteData[SPRITEHQR_KEY]);
_engine->_text->setFontColor(155);
Common::String inventoryNumKeys = Common::String::format("%d", _engine->_gameState->inventoryNumKeys);
_engine->_text->drawText(left + 370, top + 40, inventoryNumKeys.c_str());
@ -846,12 +846,12 @@ void Menu::drawInfoMenu(int16 left, int16 top) {
// Clover leaf boxes
for (int32 i = 0; i < _engine->_gameState->inventoryNumLeafsBox; i++) {
_engine->_grid->drawSprite(0, _engine->_screens->crossDot(left + 25, left + 325, 10, i), top + 58, _engine->_resources->spriteTable[SPRITEHQR_CLOVERLEAFBOX]);
_engine->_grid->drawSprite(0, _engine->_screens->crossDot(left + 25, left + 325, 10, i), top + 58, _engine->_resources->spriteData[SPRITEHQR_CLOVERLEAFBOX]);
}
// Clover leafs
for (int32 i = 0; i < _engine->_gameState->inventoryNumLeafs; i++) {
_engine->_grid->drawSprite(0, _engine->_screens->crossDot(left + 25, left + 325, 10, i) + 2, top + 60, _engine->_resources->spriteTable[SPRITEHQR_CLOVERLEAF]);
_engine->_grid->drawSprite(0, _engine->_screens->crossDot(left + 25, left + 325, 10, i) + 2, top + 60, _engine->_resources->spriteData[SPRITEHQR_CLOVERLEAF]);
}
_engine->copyBlockPhys(left, top, left + width, top + 135);

View file

@ -415,13 +415,13 @@ void Redraw::processDrawListActors(const DrawListStruct &drawCmd, bool bgRedraw)
void Redraw::processDrawListActorSprites(const DrawListStruct &drawCmd, bool bgRedraw) {
int32 actorIdx = drawCmd.actorIdx;
ActorStruct *actor = _engine->_scene->getActor(actorIdx);
const uint8 *spritePtr = _engine->_resources->spriteTable[actor->entity];
const SpriteData &spritePtr = _engine->_resources->spriteData[actor->entity];
// get actor position on screen
_engine->_renderer->projectPositionOnScreen(actor->x - _engine->_grid->cameraX, actor->y - _engine->_grid->cameraY, actor->z - _engine->_grid->cameraZ);
int32 spriteWidth, spriteHeight;
_engine->_grid->getSpriteSize(0, &spriteWidth, &spriteHeight, spritePtr);
const int32 spriteWidth = spritePtr.surface().w;
const int32 spriteHeight = spritePtr.surface().h;
// calculate sprite position on screen
const SpriteDim* dim = _engine->_resources->spriteBoundingBox.dim(actor->entity);
@ -478,8 +478,9 @@ void Redraw::processDrawListExtras(const DrawListStruct &drawCmd) {
if (extra->info0 & 0x8000) {
_engine->_extra->drawExtraSpecial(actorIdx, _engine->_renderer->projPosX, _engine->_renderer->projPosY);
} else {
int32 spriteWidth, spriteHeight;
_engine->_grid->getSpriteSize(0, &spriteWidth, &spriteHeight, _engine->_resources->spriteTable[extra->info0]);
const SpriteData &spritePtr = _engine->_resources->spriteData[extra->info0];
const int32 spriteWidth = spritePtr.surface().w;
const int32 spriteHeight = spritePtr.surface().h;
// calculate sprite position on screen
const SpriteDim* dim = _engine->_resources->spriteBoundingBox.dim(extra->info0);
@ -488,7 +489,7 @@ void Redraw::processDrawListExtras(const DrawListStruct &drawCmd) {
renderRect.right = renderRect.left + spriteWidth;
renderRect.bottom = renderRect.top + spriteHeight;
_engine->_grid->drawSprite(0, renderRect.left, renderRect.top, _engine->_resources->spriteTable[extra->info0]);
_engine->_grid->drawSprite(0, renderRect.left, renderRect.top, spritePtr);
}
_engine->_interface->setClip(renderRect);
@ -569,10 +570,9 @@ void Redraw::renderOverlays() {
// process overlay type
switch (overlay->type) {
case OverlayType::koSprite: {
const uint8 *spritePtr = _engine->_resources->spriteTable[overlay->info0];
int32 spriteWidth, spriteHeight;
_engine->_grid->getSpriteSize(0, &spriteWidth, &spriteHeight, spritePtr);
const SpriteData &spritePtr = _engine->_resources->spriteData[overlay->info0];
const int32 spriteWidth = spritePtr.surface().w;
const int32 spriteHeight = spritePtr.surface().h;
const SpriteDim* dim = _engine->_resources->spriteBoundingBox.dim(overlay->info0);
renderRect.left = dim->x + overlay->x;
@ -777,9 +777,9 @@ void Redraw::drawBubble(int32 actorIdx) {
bubbleActor = actorIdx;
}
const uint8 *spritePtr = _engine->_resources->spriteTable[bubbleSpriteIndex];
int32 spriteWidth, spriteHeight;
_engine->_grid->getSpriteSize(0, &spriteWidth, &spriteHeight, spritePtr);
const SpriteData &spritePtr = _engine->_resources->spriteData[bubbleSpriteIndex];
const int32 spriteWidth = spritePtr.surface().w;
const int32 spriteHeight = spritePtr.surface().h;
// calculate sprite position on screen
if (bubbleSpriteIndex == SPRITEHQR_DIAG_BUBBLE_RIGHT) {

View file

@ -142,6 +142,11 @@ private:
void preloadAnimations();
void preloadSamples();
/** Table with all loaded sprites */
uint8 *spriteTable[NUM_SPRITES] {nullptr};
/** Table with all loaded sprite sizes */
uint32 spriteSizeTable[NUM_SPRITES] {0};
public:
Resources(TwinEEngine *engine) : _engine(engine) {}
~Resources();
@ -151,10 +156,6 @@ public:
/** Table with all loaded samples sizes */
uint32 inventorySizeTable[NUM_INVENTORY_ITEMS] {0};
/** Table with all loaded sprites */
uint8 *spriteTable[NUM_SPRITES] {nullptr};
/** Table with all loaded sprite sizes */
uint32 spriteSizeTable[NUM_SPRITES] {0};
SpriteData spriteData[NUM_SPRITES];
/** Table with all loaded animations */