From 6d74f51cd16b33b61405d60af93a00534a8bfa6b Mon Sep 17 00:00:00 2001 From: lifehackerhansol Date: Fri, 4 Oct 2024 22:25:46 -0700 Subject: [PATCH] sprite: migrate to using OAM from libnds Co-authored-by: Ronny Chan --- arm9/source/gdi.cpp | 37 ++++++------------------------------ arm9/source/gdi.h | 5 ++--- arm9/source/sprite.cpp | 43 ++++++++++++++---------------------------- 3 files changed, 22 insertions(+), 63 deletions(-) diff --git a/arm9/source/gdi.cpp b/arm9/source/gdi.cpp index 5318d3c..d09aa74 100644 --- a/arm9/source/gdi.cpp +++ b/arm9/source/gdi.cpp @@ -140,6 +140,7 @@ void cGdi::initBg(const std::string& aFileName) _sprites[index].show(); } } + oamUpdate(&oamMain); } void cGdi::swapLCD(void) @@ -177,7 +178,6 @@ void cGdi::activeFbMain(void) setMainEngineLayer( MEL_UP ); zeroMemory( _bufferMain1, 0x20000 ); - //fillMemory( _bufferMain3, 0x20000, 0x8f008f00 ); fillMemory( _bufferMain3, 0x20000, 0xffffffff ); REG_BLDCNT = BLEND_ALPHA | BLEND_DST_BG2 | BLEND_DST_BG3; @@ -205,7 +205,6 @@ void cGdi::activeFbSub(void) // 初始化为文字模式 _subEngineMode = SEM_GRAPHICS; - //_subEngineMode = SEM_TEXT; // BMP bg 的参数设置,从 VRAM地址 0x06200000 开始,优先级3 REG_BG2CNT_SUB = BG_BMP16_256x256 | BG_BMP_BASE(0) | BG_PRIORITY_1; @@ -219,8 +218,6 @@ void cGdi::activeFbSub(void) _bufferSub1 = (u16 *)0x06200000; _bufferSub2 = (u16 *)new u32[256*192/2]; - //fillMemory( _bufferSub2, 0x18000, 0xfc00fc00 ); - //fillMemory( _bufferSub1, 0x18000, 0xfc00fc00 ); fillMemory( _bufferSub2, 0x18000, 0xffffffff ); fillMemory( _bufferSub1, 0x18000, 0xffffffff ); @@ -237,7 +234,7 @@ void cGdi::activeFbSub(void) swiWaitForVBlank(); //remove tearing at top screen // 模式5,开两层BG,一层BMP,一层文字(用于调试),bmp层现在默认关闭 - videoSetModeSub( MODE_5_2D | DISPLAY_BG2_ACTIVE );// | DISPLAY_BG2_ACTIVE ); + videoSetModeSub( MODE_5_2D | DISPLAY_BG2_ACTIVE ); } void cGdi::drawLine( s16 x1, s16 y1, s16 x2, s16 y2, GRAPHICS_ENGINE engine ) @@ -268,10 +265,6 @@ void cGdi::drawLine( s16 x1, s16 y1, s16 x2, s16 y2, GRAPHICS_ENGINE engine ) xs=x2+1; xe=x1; } - //for(int px=xs;px<=xe;px++) { - // drawPixel(px,y1,engine); - // //SetPixel(px,y1,Color); - //} if( GE_MAIN == engine ) fillRect( _penColor, _penColor, xs, y1, xe - xs + 1, 1, engine ); else @@ -317,18 +310,7 @@ void cGdi::drawLine( s16 x1, s16 y1, s16 x2, s16 y2, GRAPHICS_ENGINE engine ) } while(py!=ye) { - //if(AALineFlag==false){ drawPixel(x1+(int)px,y1+py,engine); - //}else{ - // int Alpha=(int)(px*32); - // if(Alpha<0){ - // while(Alpha<=0) Alpha+=32; - // }else{ - // while(32<=Alpha) Alpha-=32; - // } - // SetPixelAlpha(x1+(int)px+0,y1+py,Color,32-Alpha); - // SetPixelAlpha(x1+(int)px+1,y1+py,Color,Alpha); - //} px+=xv; py+=yv; } @@ -362,9 +344,9 @@ void cGdi::fillRect( u16 color1, u16 color2, s16 x, s16 y, u16 w, u16 h, GRAPHIC if( GE_MAIN == engine ) - pDest = _bufferMain2 + (y << 8) + x + _layerPitch;//_bufferMain2 + y * 256 + x + _layerPitch; + pDest = _bufferMain2 + (y << 8) + x + _layerPitch; else - pDest = _bufferSub2 + (y << 8) + x; //_bufferSub2 + y * 256 + x; + pDest = _bufferSub2 + (y << 8) + x; bool destAligned = !(x & 1); @@ -459,7 +441,6 @@ void cGdi::bitBlt( const void * src, s16 srcW, s16 srcH, s16 destX, s16 destY, u void cGdi::bitBlt( const void * src, s16 destX, s16 destY, u16 destW, u16 destH, GRAPHICS_ENGINE engine ) { - //dbg_printf("x %d y %d w %d h %d\n", destX, destY, destW, destH ); u16 * pSrc = (u16 *)src; u16 * pDest = NULL; @@ -487,7 +468,6 @@ void cGdi::bitBlt( const void * src, s16 destX, s16 destY, u16 destW, u16 destH, // 不是偶数也可以,但要求在内存中 src 的 pitch 凑成偶数 void cGdi::maskBlt( const void * src, s16 destX, s16 destY, u16 destW, u16 destH, GRAPHICS_ENGINE engine ) { - //dbg_printf("x %d y %d w %d h %d\n", destX, destY, destW, destH ); u16 * pSrc = (u16 *)src; u16 * pDest = NULL; bool destAligned = !(destX & 1); @@ -619,24 +599,19 @@ void cGdi::textOutRect( s16 x, s16 y, u16 w, u16 h, const char * text, GRAPHICS_ void cGdi::present( GRAPHICS_ENGINE engine ) { if( GE_MAIN == engine ) { // 翻转主引擎 - //u16 * temp = _bufferMain1; - //_bufferMain1 = _bufferMain2; - //_bufferMain2 = temp; - //REG_BG2CNT ^= BG_BMP_BASE( 128 / 16 ); dmaCopyWordsGdi( 3, _bufferMain2 + _layerPitch, _bufferMain1 + (_mainEngineLayer << 16), 256 * 192 * 2 ); fillMemory( (void *)(_bufferMain2 + _layerPitch), 256 * 192 * 2, 0 ); + oamUpdate(&oamMain); + } else if ( GE_SUB == engine ) { // 翻转副引擎 if( SEM_GRAPHICS == _subEngineMode ) dmaCopyWordsGdi( 3, (void *)_bufferSub2, (void *)_bufferSub1, 256 * 192 * 2 ); - //else if( SEM_TEXT == _subEngineMode ) - // dmaCopyWords( 3, (void *)_bufferSub3, (void *)_bufferSub1, 32768 ); fillMemory( (void *)_bufferSub2, 0x18000, 0xffffffff ); } - //dbg_printf( "\x1b[0;20%f\n", updateTimer() ); } //special version for window switching diff --git a/arm9/source/gdi.h b/arm9/source/gdi.h index 64fac99..6597efe 100644 --- a/arm9/source/gdi.h +++ b/arm9/source/gdi.h @@ -65,11 +65,10 @@ public: void initBg(const std::string& aFileName); void drawPixel( u8 x, u8 y, GRAPHICS_ENGINE engine ) { - //if( y > (u8)SCREEN_HEIGHT - 1 ) y = (u8)SCREEN_WIDTH - 1; if( GE_MAIN == engine ) - *(_bufferMain2 + ((u32)y << 8) + x + _layerPitch ) = _penColor; //_bufferMain2[y * SCREEN_WIDTH + x] = _penColor; + *(_bufferMain2 + ((u32)y << 8) + x + _layerPitch ) = _penColor; else - _bufferSub2[((u32)y << 8) + x] = _penColor; //_bufferSub2[y * SCREEN_WIDTH + x] = _penColor; + _bufferSub2[((u32)y << 8) + x] = _penColor; } void drawLine( s16 x1, s16 y1, s16 x2, s16 y2, GRAPHICS_ENGINE engine ); diff --git a/arm9/source/sprite.cpp b/arm9/source/sprite.cpp index a33b36b..e3c169b 100644 --- a/arm9/source/sprite.cpp +++ b/arm9/source/sprite.cpp @@ -18,6 +18,7 @@ along with this program. If not, see . */ +#include #include "sprite.h" @@ -31,24 +32,22 @@ cSprite::~cSprite() void cSprite::sysinit() { - SpriteEntry * psprites = (SpriteEntry *)OAM; - //SpriteRotation * pspriteRotations = (SpriteRotation * )OAM; + oamInit(&oamMain, SpriteMapping_Bmp_1D_128, true); for(int i = 0; i < 128; i++) { - psprites[i].attribute[0] = ATTR0_DISABLED; - psprites[i].attribute[1] = 0; - psprites[i].attribute[2] = 0; - psprites[i].filler = 0; + oamMain.oamMemory[i].attribute[0] = ATTR0_DISABLED; + oamMain.oamMemory[i].attribute[1] = 0; + oamMain.oamMemory[i].attribute[2] = 0; + oamMain.oamMemory[i].filler = 0; } - //DC_FlushRange( _sprites, 128 * sizeof(SpriteEntry) ); - //dmaCopy( _sprites, OAM, 128 * sizeof(SpriteEntry) ); + oamUpdate(&oamMain); + oamEnable(&oamMain); } void cSprite::init( u16 id ) { - //_alpha = 0; _id = id; _size = SS_SIZE_32; @@ -59,8 +58,8 @@ void cSprite::init( u16 id ) _priority = 2; - _entry = ((SpriteEntry *)OAM) + _id; - _affine = ((SpriteRotation * )OAM) + _id; + _entry = &oamMain.oamMemory[_id]; + _affine = &oamMain.oamRotationMemory[_id]; // initial x = 0, hidden, bitmap obj mode, square shape _entry->attribute[0] = ATTR0_DISABLED | ATTR0_BMP | ATTR0_SQUARE | 0; @@ -72,11 +71,6 @@ void cSprite::init( u16 id ) _entry->attribute[2] = ATTR2_ALPHA(15) | ATTR2_PRIORITY(0) | 0; setScale( 1, 1 ); - - //for(int i=0;i<32*32;i++) - // SPRITE_GFX[i]=RGB15(0,0,27)|(1<<15); //dont forget alpha bit - - //update(); } @@ -92,8 +86,7 @@ void cSprite::hide() void cSprite::setAlpha( u8 alpha ) { - _alpha = alpha & 0x1f; - _entry->attribute[2] = (_entry->attribute[2] & (~0xf000)) | ATTR2_ALPHA(_alpha); + oamSetAlpha(&oamMain, _id, alpha); } void cSprite::setPosition( u16 x, u8 y ) @@ -118,11 +111,10 @@ void cSprite::setPosition( u16 x, u8 y ) }; x -= offset; _x = x & 0x1FF; - _entry->attribute[1] = (_entry->attribute[1] & (~0x1FF)) | _x; - y -= offset; _y = y & 0xFF; - _entry->attribute[0] = (_entry->attribute[0] & (~0xFF)) | _y; + + oamSetXY(&oamMain, _id, _x, _y); } void cSprite::setSize( SPRITE_SIZE size ) @@ -143,13 +135,6 @@ u16 * cSprite::buffer() return SPRITE_GFX + (_bufferOffset * 64); } -//void cSprite::update() -//{ -// //DC_FlushRange( _sprites, 128 * sizeof(SpriteEntry) ); -// SpriteEntry * psprites = (SpriteEntry * )OAM; -// dmaCopy( _sprites, &psprites[_id], sizeof(SpriteEntry) ); -//} - void cSprite::setBufferOffset( u32 offset ) { _bufferOffset = offset; @@ -179,7 +164,7 @@ void cSprite::setScale( float scaleX, float scaleY ) void cSprite::setPriority( u8 priority ) { _priority = priority; - _entry->attribute[2] = (_entry->attribute[2] & (~0x0C00)) | ATTR2_PRIORITY(_priority); + oamSetPriority(&oamMain, _id, _priority); }