|
|
@@ -198,6 +198,13 @@ static void GBVideoSoftwareRendererInit(struct GBVideoRenderer* renderer, enum G |
|
|
softwareRenderer->sgbTransfer = 0;
|
|
|
softwareRenderer->sgbCommandHeader = 0;
|
|
|
softwareRenderer->sgbBorders = sgbBorders;
|
|
|
+ softwareRenderer->objOffsetX = 0;
|
|
|
+ softwareRenderer->objOffsetY = 0;
|
|
|
+ softwareRenderer->offsetScx = 0;
|
|
|
+ softwareRenderer->offsetScy = 0;
|
|
|
+ softwareRenderer->offsetWx = 0;
|
|
|
+ softwareRenderer->offsetWy = 0;
|
|
|
+
|
|
|
int i;
|
|
|
for (i = 0; i < 64; ++i) {
|
|
|
softwareRenderer->lookup[i] = i;
|
|
|
@@ -471,18 +478,18 @@ static void GBVideoSoftwareRendererDrawRange(struct GBVideoRenderer* renderer, i |
|
|
int wy = softwareRenderer->wy + softwareRenderer->currentWy;
|
|
|
if (GBRegisterLCDCIsWindow(softwareRenderer->lcdc) && wy <= y && endX >= softwareRenderer->wx - 7) {
|
|
|
if (softwareRenderer->wx - 7 > 0 && !softwareRenderer->d.disableBG) {
|
|
|
- GBVideoSoftwareRendererDrawBackground(softwareRenderer, maps, startX, softwareRenderer->wx - 7, softwareRenderer->scx, softwareRenderer->scy + y);
|
|
|
+ GBVideoSoftwareRendererDrawBackground(softwareRenderer, maps, startX, softwareRenderer->wx - 7, softwareRenderer->scx - softwareRenderer->offsetScx, softwareRenderer->scy + y - softwareRenderer->offsetScy);
|
|
|
}
|
|
|
|
|
|
maps = &softwareRenderer->d.vram[GB_BASE_MAP];
|
|
|
if (GBRegisterLCDCIsWindowTileMap(softwareRenderer->lcdc)) {
|
|
|
maps += GB_SIZE_MAP;
|
|
|
}
|
|
|
if (!softwareRenderer->d.disableWIN) {
|
|
|
- GBVideoSoftwareRendererDrawBackground(softwareRenderer, maps, softwareRenderer->wx - 7, endX, 7 - softwareRenderer->wx, y - wy);
|
|
|
+ GBVideoSoftwareRendererDrawBackground(softwareRenderer, maps, softwareRenderer->wx - 7, endX, 7 - softwareRenderer->wx - softwareRenderer->offsetWx, y - wy - softwareRenderer->offsetWy);
|
|
|
}
|
|
|
} else if (!softwareRenderer->d.disableBG) {
|
|
|
- GBVideoSoftwareRendererDrawBackground(softwareRenderer, maps, startX, endX, softwareRenderer->scx, softwareRenderer->scy + y);
|
|
|
+ GBVideoSoftwareRendererDrawBackground(softwareRenderer, maps, startX, endX, softwareRenderer->scx - softwareRenderer->offsetScx, softwareRenderer->scy + y - softwareRenderer->offsetScy);
|
|
|
}
|
|
|
} else if (!softwareRenderer->d.disableBG) {
|
|
|
memset(&softwareRenderer->row[startX], 0, endX - startX);
|
|
|
@@ -778,30 +785,32 @@ static void GBVideoSoftwareRendererDrawBackground(struct GBVideoSoftwareRenderer |
|
|
}
|
|
|
|
|
|
static void GBVideoSoftwareRendererDrawObj(struct GBVideoSoftwareRenderer* renderer, struct GBObj* obj, int startX, int endX, int y) {
|
|
|
- int ix = obj->x - 8;
|
|
|
+ int objX = obj->x + renderer->objOffsetX;
|
|
|
+ int ix = objX - 8;
|
|
|
if (endX < ix || startX >= ix + 8) {
|
|
|
return;
|
|
|
}
|
|
|
- if (obj->x < endX) {
|
|
|
- endX = obj->x;
|
|
|
+ if (objX < endX) {
|
|
|
+ endX = objX;
|
|
|
}
|
|
|
- if (obj->x - 8 > startX) {
|
|
|
- startX = obj->x - 8;
|
|
|
+ if (objX - 8 > startX) {
|
|
|
+ startX = objX - 8;
|
|
|
}
|
|
|
if (startX < 0) {
|
|
|
startX = 0;
|
|
|
}
|
|
|
uint8_t* data = renderer->d.vram;
|
|
|
int tileOffset = 0;
|
|
|
int bottomY;
|
|
|
+ int objY = obj->y + renderer->objOffsetY;
|
|
|
if (GBObjAttributesIsYFlip(obj->attr)) {
|
|
|
- bottomY = 7 - ((y - obj->y - 16) & 7);
|
|
|
- if (GBRegisterLCDCIsObjSize(renderer->lcdc) && y - obj->y < -8) {
|
|
|
+ bottomY = 7 - ((y - objY - 16) & 7);
|
|
|
+ if (GBRegisterLCDCIsObjSize(renderer->lcdc) && y - objY < -8) {
|
|
|
++tileOffset;
|
|
|
}
|
|
|
} else {
|
|
|
- bottomY = (y - obj->y - 16) & 7;
|
|
|
- if (GBRegisterLCDCIsObjSize(renderer->lcdc) && y - obj->y >= -8) {
|
|
|
+ bottomY = (y - objY - 16) & 7;
|
|
|
+ if (GBRegisterLCDCIsObjSize(renderer->lcdc) && y - objY >= -8) {
|
|
|
++tileOffset;
|
|
|
}
|
|
|
}
|
|
|
@@ -825,12 +834,12 @@ static void GBVideoSoftwareRendererDrawObj(struct GBVideoSoftwareRenderer* rende |
|
|
}
|
|
|
int bottomX;
|
|
|
int x = startX;
|
|
|
- if ((x - obj->x) & 7) {
|
|
|
+ if ((x - objX) & 7) {
|
|
|
for (; x < endX; ++x) {
|
|
|
if (GBObjAttributesIsXFlip(obj->attr)) {
|
|
|
- bottomX = (x - obj->x) & 7;
|
|
|
+ bottomX = (x - objX) & 7;
|
|
|
} else {
|
|
|
- bottomX = 7 - ((x - obj->x) & 7);
|
|
|
+ bottomX = 7 - ((x - objX) & 7);
|
|
|
}
|
|
|
int objTile = obj->tile + tileOffset;
|
|
|
uint8_t tileDataLower = data[(objTile * 8 + bottomY) * 2];
|
|
|
|
0 comments on commit
67a135e