gpu - clean up sprite window rendering so it isn't a separate codepath but rather is identical to regular character OBJ until the very end. may fix subtle bugs, may do nothing, but it's cleaner now anyway
This commit is contained in:
parent
bf120f3c3e
commit
222f5d8507
|
@ -3743,7 +3743,7 @@ void GPUEngineBase::_RenderSpriteBMP(GPUEngineCompositorInfo &compInfo, const u8
|
|||
}
|
||||
}
|
||||
|
||||
template<bool ISDEBUGRENDER>
|
||||
template<bool ISDEBUGRENDER, bool ISWINDOW>
|
||||
void GPUEngineBase::_RenderSprite256(GPUEngineCompositorInfo &compInfo, const u8 spriteNum, u16 *__restrict dst, const u32 srcadr, const u16 *__restrict pal, u8 *__restrict dst_alpha, u8 *__restrict typeTab, u8 *__restrict prioTab, const u8 prio, const size_t lg, size_t sprX, size_t x, const s32 xdir, const u8 alpha)
|
||||
{
|
||||
for (size_t i = 0; i < lg; i++, ++sprX, x += xdir)
|
||||
|
@ -3762,7 +3762,12 @@ void GPUEngineBase::_RenderSprite256(GPUEngineCompositorInfo &compInfo, const u8
|
|||
}
|
||||
else
|
||||
{
|
||||
if ((palette_entry > 0) && (prio < prioTab[sprX]))
|
||||
if(ISWINDOW)
|
||||
{
|
||||
if(palette_entry > 0)
|
||||
this->_sprWin[sprX] = 1;
|
||||
}
|
||||
else if ((palette_entry > 0) && (prio < prioTab[sprX]))
|
||||
{
|
||||
dst[sprX] = LE_TO_LOCAL_16(pal[palette_entry]);
|
||||
dst_alpha[sprX] = 0xFF;
|
||||
|
@ -3774,7 +3779,7 @@ void GPUEngineBase::_RenderSprite256(GPUEngineCompositorInfo &compInfo, const u8
|
|||
}
|
||||
}
|
||||
|
||||
template<bool ISDEBUGRENDER>
|
||||
template<bool ISDEBUGRENDER, bool ISWINDOW>
|
||||
void GPUEngineBase::_RenderSprite16(GPUEngineCompositorInfo &compInfo, const u8 spriteNum, u16 *__restrict dst, const u32 srcadr, const u16 *__restrict pal, u8 *__restrict dst_alpha, u8 *__restrict typeTab, u8 *__restrict prioTab, const u8 prio, const size_t lg, size_t sprX, size_t x, const s32 xdir, const u8 alpha)
|
||||
{
|
||||
for (size_t i = 0; i < lg; i++, ++sprX, x += xdir)
|
||||
|
@ -3795,7 +3800,12 @@ void GPUEngineBase::_RenderSprite16(GPUEngineCompositorInfo &compInfo, const u8
|
|||
}
|
||||
else
|
||||
{
|
||||
if ((palette_entry > 0) && (prio < prioTab[sprX]))
|
||||
if(ISWINDOW)
|
||||
{
|
||||
if(palette_entry > 0)
|
||||
this->_sprWin[sprX] = 1;
|
||||
}
|
||||
else if ((palette_entry > 0) && (prio < prioTab[sprX]))
|
||||
{
|
||||
dst[sprX] = LE_TO_LOCAL_16(pal[palette_entry]);
|
||||
dst_alpha[sprX] = 0xFF;
|
||||
|
@ -3807,34 +3817,6 @@ void GPUEngineBase::_RenderSprite16(GPUEngineCompositorInfo &compInfo, const u8
|
|||
}
|
||||
}
|
||||
|
||||
void GPUEngineBase::_RenderSpriteWin(const u8 *src, const bool col256, const size_t lg, size_t sprX, size_t x, const s32 xdir)
|
||||
{
|
||||
if (col256)
|
||||
{
|
||||
for (size_t i = 0; i < lg; i++, sprX++, x += xdir)
|
||||
{
|
||||
if (src[(x & 7) + ((x & 0xFFF8) << 3)])
|
||||
{
|
||||
this->_sprWin[sprX] = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for (size_t i = 0; i < lg; i++, sprX++, x += xdir)
|
||||
{
|
||||
const size_t x1 = x >> 1;
|
||||
const u8 palette = src[(x1 & 0x3) + ((x1 & 0xFFFC) << 3)];
|
||||
const u8 palette_entry = (x & 1) ? palette >> 4 : palette & 0xF;
|
||||
|
||||
if (palette_entry)
|
||||
{
|
||||
this->_sprWin[sprX] = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// return val means if the sprite is to be drawn or not
|
||||
bool GPUEngineBase::_ComputeSpriteVars(GPUEngineCompositorInfo &compInfo, const OAMAttributes &spriteInfo, SpriteSize &sprSize, s32 &sprX, s32 &sprY, s32 &x, s32 &y, s32 &lg, s32 &xdir)
|
||||
{
|
||||
|
@ -4253,32 +4235,14 @@ void GPUEngineBase::_SpriteRenderPerform(GPUEngineCompositorInfo &compInfo, u16
|
|||
|
||||
cost += sprSize.width;
|
||||
|
||||
if (objMode == OBJMode_Window)
|
||||
{
|
||||
if (MODE == SpriteRenderMode_Sprite2D)
|
||||
{
|
||||
if (spriteInfo.PaletteMode == PaletteMode_1x256)
|
||||
src = (u8 *)MMU_gpu_map(this->_sprMem + ((spriteInfo.TileIndex)<<5) + ((y>>3)<<10) + ((y&0x7)*8));
|
||||
else
|
||||
src = (u8 *)MMU_gpu_map(this->_sprMem + ((spriteInfo.TileIndex)<<5) + ((y>>3)<<10) + ((y&0x7)*4));
|
||||
}
|
||||
else
|
||||
{
|
||||
if (spriteInfo.PaletteMode == PaletteMode_1x256)
|
||||
src = (u8 *)MMU_gpu_map(this->_sprMem + (spriteInfo.TileIndex<<compInfo.renderState.spriteBoundary) + ((y>>3)*sprSize.width*8) + ((y&0x7)*8));
|
||||
else
|
||||
src = (u8 *)MMU_gpu_map(this->_sprMem + (spriteInfo.TileIndex<<compInfo.renderState.spriteBoundary) + ((y>>3)*sprSize.width*4) + ((y&0x7)*4));
|
||||
}
|
||||
|
||||
this->_RenderSpriteWin(src, (spriteInfo.PaletteMode == PaletteMode_1x256), lg, sprX, x, xdir);
|
||||
}
|
||||
else if (objMode == OBJMode_Bitmap) //sprite is in BMP format
|
||||
if (objMode == OBJMode_Bitmap) //sprite is in BMP format
|
||||
{
|
||||
//transparent (i think, dont bother to render?) if alpha is 0
|
||||
if (spriteInfo.PaletteIndex == 0)
|
||||
continue;
|
||||
|
||||
srcadr = this->_SpriteAddressBMP(compInfo, spriteInfo, sprSize, y);
|
||||
|
||||
this->_RenderSpriteBMP<ISDEBUGRENDER>(compInfo, i, dst, srcadr, dst_alpha, typeTab, prioTab, prio, lg, sprX, x, xdir, spriteInfo.PaletteIndex);
|
||||
|
||||
const size_t vramPixel = (size_t)((u8 *)MMU_gpu_map(srcadr) - MMU.ARM9_LCD) / sizeof(u16);
|
||||
|
@ -4295,7 +4259,7 @@ void GPUEngineBase::_SpriteRenderPerform(GPUEngineCompositorInfo &compInfo, u16
|
|||
}
|
||||
}
|
||||
}
|
||||
else if (spriteInfo.PaletteMode == PaletteMode_1x256) //256 colors
|
||||
else if (spriteInfo.PaletteMode == PaletteMode_1x256) //256 colors; handles OBJ windows too
|
||||
{
|
||||
if (MODE == SpriteRenderMode_Sprite2D)
|
||||
srcadr = this->_sprMem + ((spriteInfo.TileIndex)<<5) + ((y>>3)<<10) + ((y&0x7)*8);
|
||||
|
@ -4303,9 +4267,13 @@ void GPUEngineBase::_SpriteRenderPerform(GPUEngineCompositorInfo &compInfo, u16
|
|||
srcadr = this->_sprMem + (spriteInfo.TileIndex<<compInfo.renderState.spriteBoundary) + ((y>>3)*sprSize.width*8) + ((y&0x7)*8);
|
||||
|
||||
pal = (DISPCNT.ExOBJPalette_Enable) ? (u16 *)(MMU.ObjExtPal[this->_engineID][0]+(spriteInfo.PaletteIndex*ADDRESS_STEP_512B)) : this->_paletteOBJ;
|
||||
this->_RenderSprite256<ISDEBUGRENDER>(compInfo, i, dst, srcadr, pal, dst_alpha, typeTab, prioTab, prio, lg, sprX, x, xdir, (objMode == OBJMode_Transparent));
|
||||
|
||||
if (objMode == OBJMode_Window)
|
||||
this->_RenderSprite256<ISDEBUGRENDER,true>(compInfo, i, dst, srcadr, pal, dst_alpha, typeTab, prioTab, prio, lg, sprX, x, xdir, (objMode == OBJMode_Transparent));
|
||||
else
|
||||
this->_RenderSprite256<ISDEBUGRENDER,false>(compInfo, i, dst, srcadr, pal, dst_alpha, typeTab, prioTab, prio, lg, sprX, x, xdir, (objMode == OBJMode_Transparent));
|
||||
}
|
||||
else // 16 colors
|
||||
else // 16 colors; handles OBJ windows too
|
||||
{
|
||||
if (MODE == SpriteRenderMode_Sprite2D)
|
||||
{
|
||||
|
@ -4317,7 +4285,11 @@ void GPUEngineBase::_SpriteRenderPerform(GPUEngineCompositorInfo &compInfo, u16
|
|||
}
|
||||
|
||||
pal = this->_paletteOBJ + (spriteInfo.PaletteIndex << 4);
|
||||
this->_RenderSprite16<ISDEBUGRENDER>(compInfo, i, dst, srcadr, pal, dst_alpha, typeTab, prioTab, prio, lg, sprX, x, xdir, (objMode == OBJMode_Transparent));
|
||||
|
||||
if (objMode == OBJMode_Window)
|
||||
this->_RenderSprite16<ISDEBUGRENDER, true>(compInfo, i, dst, srcadr, pal, dst_alpha, typeTab, prioTab, prio, lg, sprX, x, xdir, (objMode == OBJMode_Transparent));
|
||||
else
|
||||
this->_RenderSprite16<ISDEBUGRENDER, false>(compInfo, i, dst, srcadr, pal, dst_alpha, typeTab, prioTab, prio, lg, sprX, x, xdir, (objMode == OBJMode_Transparent));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1437,8 +1437,8 @@ protected:
|
|||
#endif
|
||||
|
||||
template<bool ISDEBUGRENDER> void _RenderSpriteBMP(GPUEngineCompositorInfo &compInfo, const u8 spriteNum, u16 *__restrict dst, const u32 srcadr, u8 *__restrict dst_alpha, u8 *__restrict typeTab, u8 *__restrict prioTab, const u8 prio, const size_t lg, size_t sprX, size_t x, const s32 xdir, const u8 alpha);
|
||||
template<bool ISDEBUGRENDER> void _RenderSprite256(GPUEngineCompositorInfo &compInfo, const u8 spriteNum, u16 *__restrict dst, const u32 srcadr, const u16 *__restrict pal, u8 *__restrict dst_alpha, u8 *__restrict typeTab, u8 *__restrict prioTab, const u8 prio, const size_t lg, size_t sprX, size_t x, const s32 xdir, const u8 alpha);
|
||||
template<bool ISDEBUGRENDER> void _RenderSprite16(GPUEngineCompositorInfo &compInfo, const u8 spriteNum, u16 *__restrict dst, const u32 srcadr, const u16 *__restrict pal, u8 *__restrict dst_alpha, u8 *__restrict typeTab, u8 *__restrict prioTab, const u8 prio, const size_t lg, size_t sprX, size_t x, const s32 xdir, const u8 alpha);
|
||||
template<bool ISDEBUGRENDER, bool ISWINDOW> void _RenderSprite256(GPUEngineCompositorInfo &compInfo, const u8 spriteNum, u16 *__restrict dst, const u32 srcadr, const u16 *__restrict pal, u8 *__restrict dst_alpha, u8 *__restrict typeTab, u8 *__restrict prioTab, const u8 prio, const size_t lg, size_t sprX, size_t x, const s32 xdir, const u8 alpha);
|
||||
template<bool ISDEBUGRENDER, bool ISWINDOW> void _RenderSprite16(GPUEngineCompositorInfo &compInfo, const u8 spriteNum, u16 *__restrict dst, const u32 srcadr, const u16 *__restrict pal, u8 *__restrict dst_alpha, u8 *__restrict typeTab, u8 *__restrict prioTab, const u8 prio, const size_t lg, size_t sprX, size_t x, const s32 xdir, const u8 alpha);
|
||||
void _RenderSpriteWin(const u8 *src, const bool col256, const size_t lg, size_t sprX, size_t x, const s32 xdir);
|
||||
bool _ComputeSpriteVars(GPUEngineCompositorInfo &compInfo, const OAMAttributes &spriteInfo, SpriteSize &sprSize, s32 &sprX, s32 &sprY, s32 &x, s32 &y, s32 &lg, s32 &xdir);
|
||||
|
||||
|
|
Loading…
Reference in New Issue