static int NDS_SetDisplayMode(_THIS, SDL_VideoDisplay *display, SDL_DisplayMode *mode) { display->driverdata = mode->driverdata; #ifdef USE_HW_RENDERER videoSetMode(MODE_5_3D); videoSetModeSub(MODE_5_2D); /* initialize gl2d */ glScreen2D(); vramSetBankA(VRAM_A_TEXTURE); vramSetBankB(VRAM_B_TEXTURE ); vramSetBankC(VRAM_C_SUB_BG_0x06200000); vramSetBankE(VRAM_E_TEX_PALETTE); powerOn(POWER_ALL_2D); irqInit(); irqEnable(IRQ_VBLANK); // sub sprites hold the bottom image when 3D directed to top initSubSprites(); // sub background holds the top image when 3D directed to bottom bgInitSub(3, BgType_Bmp16, BgSize_B16_256x256, 0, 0); #else /* Select mode 5 for both screens. Can do Extended Rotation * Background on both (BG 2 and 3). */ videoSetMode(MODE_5_2D); videoSetModeSub(MODE_5_2D); vramSetBankA(VRAM_A_MAIN_BG_0x06000000); vramSetBankB(VRAM_B_TEXTURE ); vramSetBankC(VRAM_C_SUB_BG_0x06200000); vramSetBankE(VRAM_E_TEX_PALETTE); powerOn(POWER_ALL_2D); irqInit(); irqEnable(IRQ_VBLANK); #endif return 0; }
//------------------------------------------------------- int main() { //------------------------------------------------------- videoSetMode(MODE_0_3D); videoSetModeSub(MODE_5_2D); glInit(); // sub sprites hold the bottom image when 3D directed to top initSubSprites(); // sub background holds the top image when 3D directed to bottom bgInitSub(3, BgType_Bmp16, BgSize_B16_256x256, 0, 0); //------------------------------------------------------- // Setup gl //------------------------------------------------------- glEnable(GL_ANTIALIAS); glClearColor(0,0,0,31); glClearPolyID(63); glClearDepth(0x7FFF); glViewport(0,0,255,191); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(70, 256.0 / 192.0, 0.1, 100); glPolyFmt(POLY_ALPHA(31) | POLY_CULL_NONE); //------------------------------------------------------- // main loop //------------------------------------------------------- bool top = true; while (true) { // wait for capture unit to be ready while(REG_DISPCAPCNT & DCAP_ENABLE); scanKeys(); int keys = keysDown(); if (keys & KEY_START) break; //------------------------------------------------------- // Switch render targets //------------------------------------------------------- top = !top; if(top) { lcdMainOnBottom(); vramSetBankC(VRAM_C_LCD); vramSetBankD(VRAM_D_SUB_SPRITE); REG_DISPCAPCNT = DCAP_BANK(2) | DCAP_ENABLE | DCAP_SIZE(3); } else { lcdMainOnTop(); vramSetBankD(VRAM_D_LCD); vramSetBankC(VRAM_C_SUB_BG); REG_DISPCAPCNT = DCAP_BANK(3) | DCAP_ENABLE | DCAP_SIZE(3); } //------------------------------------------------------- // Render the scene //------------------------------------------------------- glMatrixMode(GL_MODELVIEW); renderScene(top); glFlush(0); } return 0; }