// Yoshi's Story uses this - 0x03 void RSP_S2DEX_OBJ_RECTANGLE(Gfx *gfx) { uint32 dwAddr = RSPSegmentAddr((gfx->words.w1)); uObjSprite *ptr = (uObjSprite*)(g_pRDRAMu8+dwAddr); uObjTxSprite objtx; memcpy(&objtx.sprite,ptr,sizeof(uObjSprite)); if( g_TxtLoadBy == CMD_LOAD_OBJ_TXTR ) { memcpy(&(objtx.txtr.block),&(gObjTxtr->block),sizeof(uObjTxtr)); CRender::g_pRender->LoadObjSprite(objtx, true); } else { PrepareTextures(); } CRender::g_pRender->DrawSprite(objtx, false); #ifdef DEBUGGER if( (pauseAtNext && (eventToPause == NEXT_OBJ_TXT_CMD||eventToPause == NEXT_FLUSH_TRI)) || logTextures ) { if( debuggerPauseCount > 0 ) debuggerPauseCount--; if( debuggerPauseCount == 0 ) { eventToPause = false; debuggerPause = true; TRACE3("Paused at RSP_S2DEX_OBJ_RECTANGLE\nptr=%08X, img=%08X, TMEM=%08X", dwAddr,objtx.txtr.block.image, ptr->imageAdrs); CGraphicsContext::g_pGraphicsContext->UpdateFrame(false); } } #endif }
// Yoshi's Story uses this - 0x04 void RSP_S2DEX_OBJ_SPRITE(Gfx *gfx) { uint32 dwAddr = RSPSegmentAddr((gfx->words.w1)); uObjSprite *info = (uObjSprite*)(g_pRDRAMu8+dwAddr); uint32 dwTile = gRSP.curTile; status.bAllowLoadFromTMEM = false; // Because we need to use TLUT loaded by ObjTlut cmd PrepareTextures(); status.bAllowLoadFromTMEM = true; uObjTxSprite drawinfo; memcpy( &(drawinfo.sprite), info, sizeof(uObjSprite)); CRender::g_pRender->DrawSpriteR(drawinfo, false, dwTile, 0, 0, drawinfo.sprite.imageW/32, drawinfo.sprite.imageH/32); /* static BOOL bWarned = FALSE; //if (!bWarned) { RSP_RDP_NOIMPL("RDP: RSP_S2DEX_OBJ_SPRITE (0x%08x 0x%08x)", (gfx->words.w0), (gfx->words.w1)); bWarned = TRUE; } */ #ifdef DEBUGGER if( (pauseAtNext && (eventToPause == NEXT_OBJ_TXT_CMD||eventToPause == NEXT_FLUSH_TRI)) || logTextures ) { eventToPause = false; debuggerPause = true; TRACE0("Paused at RSP_S2DEX_OBJ_SPRITE"); CGraphicsContext::Get()->UpdateFrame(); } #endif }
// Yoshi's Story uses this - 0x04 void RSP_S2DEX_OBJ_SPRITE(Gfx *gfx) { uint32 dwAddr = RSPSegmentAddr((gfx->words.w1)); uObjSprite *info = (uObjSprite*)(g_pRDRAMu8+dwAddr); uint32 dwTile = gRSP.curTile; status.bAllowLoadFromTMEM = false; // Because we need to use TLUT loaded by the ObjTlut command PrepareTextures(); status.bAllowLoadFromTMEM = true; uObjTxSprite drawinfo; memcpy( &(drawinfo.sprite), info, sizeof(uObjSprite)); CRender::g_pRender->DrawSpriteR(drawinfo, false, dwTile, 0, 0, drawinfo.sprite.imageW/32, drawinfo.sprite.imageH/32); #ifdef DEBUGGER if( (pauseAtNext && (eventToPause == NEXT_OBJ_TXT_CMD||eventToPause == NEXT_FLUSH_TRI)) || logTextures ) { eventToPause = false; debuggerPause = true; TRACE0("Paused at RSP_S2DEX_OBJ_SPRITE"); CGraphicsContext::g_pGraphicsContext->UpdateFrame(false); } #endif }