Skip to content

Commit

Permalink
GBA Video: Fix out-of-order OBJWIN
Browse files Browse the repository at this point in the history
  • Loading branch information
endrift committed Sep 11, 2016
1 parent 2155a30 commit f34f452
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 4 deletions.
1 change: 1 addition & 0 deletions CHANGES
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ Bugfixes:
- GBA: Timer 0 cannot be count up
- Qt: Fix being unable to pause manually when using auto-pausing
- GBA Memory: Fix ldm {pc}
- GBA Video: Fix out-of-order OBJWIN
Misc:
- 3DS: Use blip_add_delta_fast for a small speed improvement
- OpenGL: Log shader compilation failure
Expand Down
31 changes: 27 additions & 4 deletions src/gba/renderers/video-software.c
Original file line number Diff line number Diff line change
Expand Up @@ -455,6 +455,7 @@ static void _breakWindowInner(struct GBAVideoSoftwareRenderer* softwareRenderer,
static void _cleanOAM(struct GBAVideoSoftwareRenderer* renderer) {
int i;
int oamMax = 0;
int objwinMax = 0;
for (i = 0; i < 128; ++i) {
struct GBAObj obj;
LOAD_16(obj.a, 0, &renderer->d.oam->obj[i].a);
Expand All @@ -466,14 +467,22 @@ static void _cleanOAM(struct GBAVideoSoftwareRenderer* renderer) {
height <<= GBAObjAttributesAGetDoubleSize(obj.a);
}
if (GBAObjAttributesAGetY(obj.a) < VIDEO_VERTICAL_PIXELS || GBAObjAttributesAGetY(obj.a) + height >= VIDEO_VERTICAL_TOTAL_PIXELS) {
renderer->sprites[oamMax].y = GBAObjAttributesAGetY(obj.a);
renderer->sprites[oamMax].endY = GBAObjAttributesAGetY(obj.a) + height;
renderer->sprites[oamMax].obj = obj;
++oamMax;
if (GBAObjAttributesAGetMode(obj.a) == OBJ_MODE_OBJWIN) {
renderer->objwinSprites[objwinMax].y = GBAObjAttributesAGetY(obj.a);
renderer->objwinSprites[objwinMax].endY = GBAObjAttributesAGetY(obj.a) + height;
renderer->objwinSprites[objwinMax].obj = obj;
++objwinMax;
} else {
renderer->sprites[oamMax].y = GBAObjAttributesAGetY(obj.a);
renderer->sprites[oamMax].endY = GBAObjAttributesAGetY(obj.a) + height;
renderer->sprites[oamMax].obj = obj;
++oamMax;
}
}
}
}
renderer->oamMax = oamMax;
renderer->objwinMax = objwinMax;
renderer->oamDirty = 0;
}

Expand Down Expand Up @@ -773,6 +782,20 @@ static void _drawScanline(struct GBAVideoSoftwareRenderer* renderer, int y) {
}
int i;
int drawn;
for (i = 0; i < renderer->objwinMax; ++i) {
int localY = y;
if (renderer->spriteCyclesRemaining <= 0) {
break;
}
struct GBAVideoSoftwareSprite* sprite = &renderer->objwinSprites[i];
if (GBAObjAttributesAIsMosaic(sprite->obj.a)) {
localY = mosaicY;
}
if ((localY < sprite->y && (sprite->endY - 256 < 0 || localY >= sprite->endY - 256)) || localY >= sprite->endY) {
continue;
}
drawn = GBAVideoSoftwareRendererPreprocessSprite(renderer, &sprite->obj, localY);
}
for (i = 0; i < renderer->oamMax; ++i) {
int localY = y;
if (renderer->spriteCyclesRemaining <= 0) {
Expand Down
2 changes: 2 additions & 0 deletions src/gba/renderers/video-software.h
Original file line number Diff line number Diff line change
Expand Up @@ -152,7 +152,9 @@ struct GBAVideoSoftwareRenderer {

int oamDirty;
int oamMax;
int objwinMax;
struct GBAVideoSoftwareSprite sprites[128];
struct GBAVideoSoftwareSprite objwinSprites[128];

int start;
int end;
Expand Down

0 comments on commit f34f452

Please sign in to comment.