X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=source%2Frice_gles%2Fsrc%2FRSP_GBI_Sprite2D.h;fp=source%2Frice_gles%2Fsrc%2FRSP_GBI_Sprite2D.h;h=a69d35485cccb409a5178a149528df840039d505;hb=d07c171fa694cae985ad7045f9ce2b2f1a5699b4;hp=0000000000000000000000000000000000000000;hpb=ca22e7b76883b946060a6b40bb8709c1981e1cf6;p=mupen64plus-pandora.git diff --git a/source/rice_gles/src/RSP_GBI_Sprite2D.h b/source/rice_gles/src/RSP_GBI_Sprite2D.h new file mode 100644 index 0000000..a69d354 --- /dev/null +++ b/source/rice_gles/src/RSP_GBI_Sprite2D.h @@ -0,0 +1,169 @@ +/* +Copyright (C) 2002 Rice1964 + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +// Sprite2D Ucodes + +#include "Render.h" + +Sprite2DInfo g_Sprite2DInfo; +uint32 g_SavedUcode=1; + +void RSP_GBI_Sprite2DBase(Gfx *gfx) +{ + uint32 dwAddr = RSPSegmentAddr((gfx->words.w1)); + dwAddr &= (g_dwRamSize-1); + + //RSP_RDP_NOIMPL("RDP: Sprite2D (0x%08x 0x%08x)", (gfx->words.w0), (gfx->words.w1)); + + g_Sprite2DInfo.spritePtr = (SpriteStruct *)(g_pRDRAMs8+dwAddr); + + DEBUGGER_PAUSE_AND_DUMP_COUNT_N(NEXT_SPRITE_2D, {DebuggerAppendMsg("Pause after Sprite2DBase: Addr=%08X\n", dwAddr);}); +} + +typedef struct{ + uint32 SourceImagePointer; + uint32 TlutPointer; + + short SubImageWidth; + short Stride; + + char SourceImageBitSize; + char SourceImageType; + short SubImageHeight; + + short scaleY; + short scaleX; + + short SourceImageOffsetS; + char dummy1[2]; + + short px; + short SourceImageOffsetT; + + char dummy2[2]; + short py; + +} PuzzleMasterSprite; + +void RSP_GBI_Sprite2D_PuzzleMaster64(Gfx *gfx) +{ + uint32 dwAddr = RSPSegmentAddr((gfx->words.w1)); + dwAddr &= (g_dwRamSize-1); + + g_Sprite2DInfo.spritePtr = (SpriteStruct *)(g_pRDRAMs8+dwAddr); + + g_Sprite2DInfo.flipX = 0; + g_Sprite2DInfo.flipY = 0; + g_Sprite2DInfo.px = 0; + g_Sprite2DInfo.py = 0; + + SpriteStruct tempInfo; + memcpy(&tempInfo, g_Sprite2DInfo.spritePtr, sizeof(SpriteStruct)); + PuzzleMasterSprite info; + memcpy(&info, g_Sprite2DInfo.spritePtr, sizeof(PuzzleMasterSprite)); + + g_Sprite2DInfo.px = info.px>>2; + g_Sprite2DInfo.py = info.py>>2; + g_Sprite2DInfo.scaleX = info.scaleX / 1024.0f; + g_Sprite2DInfo.scaleY = info.scaleY / 1024.0f; + + tempInfo.SourceImageOffsetS = info.SourceImageOffsetS; + tempInfo.SourceImageOffsetT = info.SourceImageOffsetT; + g_Sprite2DInfo.spritePtr = &tempInfo; + + CRender::g_pRender->DrawSprite2D(g_Sprite2DInfo, 1); + DEBUGGER_PAUSE_AND_DUMP_COUNT_N(NEXT_SPRITE_2D, {DebuggerAppendMsg("Pause after Sprite2DBase: Addr=%08X\n", dwAddr);}); +} + + +void RSP_GBI1_Sprite2DDraw(Gfx *gfx) +{ + // This ucode is shared by PopMtx and gSPSprite2DDraw + g_Sprite2DInfo.px = (short)(((gfx->words.w1)>>16)&0xFFFF)/4; + g_Sprite2DInfo.py = (short)((gfx->words.w1)&0xFFFF)/4; + + //RSP_RDP_NOIMPL("gSPSprite2DDraw is not implemented", (gfx->words.w0), (gfx->words.w1)); + CRender::g_pRender->DrawSprite2D(g_Sprite2DInfo, 1); + DEBUGGER_PAUSE_AND_DUMP_COUNT_N(NEXT_SPRITE_2D, + {DebuggerAppendMsg("Pause after Sprite2DDraw at (%d, %d)\n", g_Sprite2DInfo.px, g_Sprite2DInfo.py);}); + + LoadedUcodeMap[RSP_SPRITE2D_SCALEFLIP] = &RSP_GBI1_CullDL; + LoadedUcodeMap[RSP_SPRITE2D_DRAW] = &RSP_GBI1_PopMtx; + LoadedUcodeMap[RSP_SPRITE2D_BASE] = &RSP_GBI1_Sprite2DBase; + +} + +void RSP_GBI0_Sprite2DDraw(Gfx *gfx) +{ + // This ucode is shared by PopMtx and gSPSprite2DDraw + g_Sprite2DInfo.px = (short)(((gfx->words.w1)>>16)&0xFFFF)/4; + g_Sprite2DInfo.py = (short)((gfx->words.w1)&0xFFFF)/4; + + //RSP_RDP_NOIMPL("gSPSprite2DDraw is not implemented", (gfx->words.w0), (gfx->words.w1)); + CRender::g_pRender->DrawSprite2D(g_Sprite2DInfo, 0); + DEBUGGER_PAUSE_AND_DUMP_COUNT_N(NEXT_SPRITE_2D, {TRACE0("Pause after Sprite2DDraw\n");}); +} + + +void RSP_GBI1_Sprite2DScaleFlip(Gfx *gfx) +{ + g_Sprite2DInfo.scaleX = (((gfx->words.w1)>>16)&0xFFFF)/1024.0f; + g_Sprite2DInfo.scaleY = ((gfx->words.w1)&0xFFFF)/1024.0f; + + if( ((gfx->words.w1)&0xFFFF) < 0x100 ) + { + g_Sprite2DInfo.scaleY = g_Sprite2DInfo.scaleX; + } + + g_Sprite2DInfo.flipX = (uint8)(((gfx->words.w0)>>8)&0xFF); + g_Sprite2DInfo.flipY = (uint8)((gfx->words.w0)&0xFF); + //RSP_RDP_NOIMPL("RSP_SPRITE2D_SCALEFLIP is not implemented", (gfx->words.w0), (gfx->words.w1)); + DEBUGGER_PAUSE_AND_DUMP_COUNT_N(NEXT_SPRITE_2D, + {DebuggerAppendMsg("Pause after Sprite2DScaleFlip, Flip (%d,%d), Scale (%f, %f)\n", g_Sprite2DInfo.flipX, g_Sprite2DInfo.flipY, + g_Sprite2DInfo.scaleX, g_Sprite2DInfo.scaleY);}); +} + + +void RSP_GBI1_Sprite2DBase(Gfx *gfx) +{ + if( !status.bUseModifiedUcodeMap ) + { + memcpy( &LoadedUcodeMap, &ucodeMap1, sizeof(UcodeMap)); + status.bUseModifiedUcodeMap = true; + } + + LoadedUcodeMap[RSP_SPRITE2D_BASE] = &RSP_GBI_Sprite2DBase; + LoadedUcodeMap[RSP_SPRITE2D_SCALEFLIP] = &RSP_GBI1_Sprite2DScaleFlip; + LoadedUcodeMap[RSP_SPRITE2D_DRAW] = &RSP_GBI1_Sprite2DDraw; + + TRACE0("Adding Sprite2D ucodes to ucode 1"); + RSP_GBI_Sprite2DBase(gfx); +} + + +void RSP_GBI0_Sprite2DBase(Gfx *gfx) +{ + //Weired, this ucode 0 game is using ucode 1, but sprite2D cmd is working differently from + //normal ucode1 sprite2D game + + TRACE0("Ucode 0 game is using Sprite2D, and using ucode 1 codes, create a new ucode for me"); + + RSP_GBI_Sprite2DBase(gfx); +} +