DS Video: Layer toggling

This commit is contained in:
Vicki Pfau 2017-04-22 02:45:26 -07:00
parent 154dd2e8e7
commit a5f664ca72
4 changed files with 58 additions and 7 deletions

View File

@ -112,6 +112,12 @@ struct DSVideoRenderer {
uint16_t* vramBOBJ[32];
uint16_t* vramBBGExtPal[4];
uint16_t* vramBOBJExtPal;
bool disableABG[4];
bool disableAOBJ;
bool disableBBG[4];
bool disableBOBJ;
union DSOAM* oam;
struct DSGX* gx;
};

View File

@ -24,11 +24,11 @@ const static struct mCoreChannelInfo _DSVideoLayers[] = {
{ 2, "abg2", "A BG2", NULL },
{ 3, "abg3", "A BG3", NULL },
{ 4, "aobj", "A OBJ", NULL },
{ 5, "bbg0", "B BG0", "2D/3D" },
{ 6, "bbg1", "B BG1", NULL },
{ 7, "bbg2", "B BG2", NULL },
{ 8, "bbg3", "B BG3", NULL },
{ 9, "bobj", "B OBJ", NULL },
{ 10, "bbg0", "B BG0", "2D/3D" },
{ 11, "bbg1", "B BG1", NULL },
{ 12, "bbg2", "B BG2", NULL },
{ 13, "bbg3", "B BG3", NULL },
{ 14, "bobj", "B OBJ", NULL },
};
const static struct mCoreChannelInfo _DSAudioChannels[] = {
@ -564,7 +564,28 @@ static size_t _DSCoreListAudioChannels(const struct mCore* core, const struct mC
static void _DSCoreEnableVideoLayer(struct mCore* core, size_t id, bool enable) {
struct DS* ds = core->board;
// TODO
switch (id) {
case 0:
case 1:
case 2:
case 3:
ds->video.renderer->disableABG[id] = !enable;
break;
case 4:
ds->video.renderer->disableAOBJ = !enable;
break;
case 10:
case 11:
case 12:
case 13:
ds->video.renderer->disableBBG[id - 10] = !enable;
break;
case 14:
ds->video.renderer->disableBOBJ = !enable;
break;
default:
break;
}
}
static void _DSCoreEnableAudioChannel(struct mCore* core, size_t id, bool enable) {

View File

@ -146,6 +146,18 @@ void DSVideoSoftwareRendererCreate(struct DSVideoSoftwareRenderer* renderer) {
renderer->d.getPixels = DSVideoSoftwareRendererGetPixels;
renderer->d.putPixels = DSVideoSoftwareRendererPutPixels;
renderer->d.disableABG[0] = false;
renderer->d.disableABG[1] = false;
renderer->d.disableABG[2] = false;
renderer->d.disableABG[3] = false;
renderer->d.disableAOBJ = false;
renderer->d.disableBBG[0] = false;
renderer->d.disableBBG[1] = false;
renderer->d.disableBBG[2] = false;
renderer->d.disableBBG[3] = false;
renderer->d.disableBOBJ = false;
renderer->engA.d.cache = NULL;
GBAVideoSoftwareRendererCreate(&renderer->engA);
renderer->engA.combinedObjSort = true;
@ -611,6 +623,18 @@ static void DSVideoSoftwareRendererDrawScanline(struct DSVideoRenderer* renderer
softwareRenderer->engB.outputBuffer = &softwareRenderer->outputBuffer[softwareRenderer->outputBufferStride * DS_VIDEO_VERTICAL_PIXELS];
}
softwareRenderer->engA.d.disableBG[0] = softwareRenderer->d.disableABG[0];
softwareRenderer->engA.d.disableBG[1] = softwareRenderer->d.disableABG[1];
softwareRenderer->engA.d.disableBG[2] = softwareRenderer->d.disableABG[2];
softwareRenderer->engA.d.disableBG[3] = softwareRenderer->d.disableABG[3];
softwareRenderer->engA.d.disableOBJ = softwareRenderer->d.disableAOBJ;
softwareRenderer->engB.d.disableBG[0] = softwareRenderer->d.disableBBG[0];
softwareRenderer->engB.d.disableBG[1] = softwareRenderer->d.disableBBG[1];
softwareRenderer->engB.d.disableBG[2] = softwareRenderer->d.disableBBG[2];
softwareRenderer->engB.d.disableBG[3] = softwareRenderer->d.disableBBG[3];
softwareRenderer->engB.d.disableOBJ = softwareRenderer->d.disableBOBJ;
_drawScanlineA(softwareRenderer, y);
_drawScanlineB(softwareRenderer, y);
}

View File

@ -902,7 +902,7 @@ void GameController::startAudio() {
}
void GameController::setVideoLayerEnabled(int layer, bool enable) {
if (layer > 4 || layer < 0) {
if (layer > 32 || layer < 0) {
return;
}
m_videoLayers.reserve(layer + 1);