// 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
}