mirror of
https://github.com/blawar/GLideN64.git
synced 2024-07-04 10:03:36 +00:00
Implement missing sprite functions. Fix existing ones.
This commit is contained in:
parent
adca07aabe
commit
b49e3f67fd
|
@ -7,6 +7,7 @@
|
|||
#include "gDP.h"
|
||||
#include "RSP.h"
|
||||
#include "Types.h"
|
||||
#include "Log.h"
|
||||
|
||||
void S2DEX_BG_1Cyc( u32 w0, u32 w1 )
|
||||
{
|
||||
|
@ -45,14 +46,17 @@ void S2DEX_Obj_MoveMem( u32 w0, u32 w1 )
|
|||
|
||||
void S2DEX_Select_DL( u32 w0, u32 w1 )
|
||||
{
|
||||
LOG(LOG_ERROR, "S2DEX_Select_DL unimplemented\n");
|
||||
}
|
||||
|
||||
void S2DEX_Obj_RenderMode( u32 w0, u32 w1 )
|
||||
{
|
||||
LOG(LOG_ERROR, "S2DEX_Obj_RenderMode unimplemented\n");
|
||||
}
|
||||
|
||||
void S2DEX_Obj_Rectangle_R( u32 w0, u32 w1 )
|
||||
{
|
||||
gSPObjRectangleR(w1);
|
||||
}
|
||||
|
||||
void S2DEX_Obj_LoadTxtr( u32 w0, u32 w1 )
|
||||
|
@ -67,6 +71,7 @@ void S2DEX_Obj_LdTx_Sprite( u32 w0, u32 w1 )
|
|||
|
||||
void S2DEX_Obj_LdTx_Rect( u32 w0, u32 w1 )
|
||||
{
|
||||
gSPObjLoadTxRect(w1);
|
||||
}
|
||||
|
||||
void S2DEX_Obj_LdTx_Rect_R( u32 w0, u32 w1 )
|
||||
|
|
115
gSP.cpp
115
gSP.cpp
|
@ -2090,21 +2090,6 @@ void gSPBgRectCopy( u32 bg )
|
|||
gDPTextureRectangle( frameX, frameY, frameX + frameW - 1, frameY + frameH - 1, 0, gSP.bgImage.imageX, gSP.bgImage.imageY, 4, 1 );
|
||||
}
|
||||
|
||||
void gSPObjRectangle( u32 sp )
|
||||
{
|
||||
u32 address = RSP_SegmentToPhysical( sp );
|
||||
uObjSprite *objSprite = (uObjSprite*)&RDRAM[address];
|
||||
|
||||
f32 scaleW = _FIXED2FLOAT( objSprite->scaleW, 10 );
|
||||
f32 scaleH = _FIXED2FLOAT( objSprite->scaleH, 10 );
|
||||
f32 objX = _FIXED2FLOAT( objSprite->objX, 2 );
|
||||
f32 objY = _FIXED2FLOAT( objSprite->objY, 2 );
|
||||
u32 imageW = objSprite->imageW >> 2;
|
||||
u32 imageH = objSprite->imageH >> 2;
|
||||
|
||||
gDPTextureRectangle( objX, objY, objX + imageW / scaleW - 1, objY + imageH / scaleH - 1, 0, 0.0f, 0.0f, scaleW * (gDP.otherMode.cycleType == G_CYC_COPY ? 4.0f : 1.0f), scaleH );
|
||||
}
|
||||
|
||||
void gSPObjLoadTxtr( u32 tx )
|
||||
{
|
||||
u32 address = RSP_SegmentToPhysical( tx );
|
||||
|
@ -2132,22 +2117,76 @@ void gSPObjLoadTxtr( u32 tx )
|
|||
}
|
||||
}
|
||||
|
||||
void gSPObjSprite( u32 sp )
|
||||
struct ObjData {
|
||||
f32 scaleW;
|
||||
f32 scaleH;
|
||||
u32 imageW;
|
||||
u32 imageH;
|
||||
f32 X0;
|
||||
f32 X1;
|
||||
f32 Y0;
|
||||
f32 Y1;
|
||||
ObjData(const uObjSprite *_pObjSprite, bool _scale)
|
||||
{
|
||||
scaleW = _FIXED2FLOAT(_pObjSprite->scaleW, 10);
|
||||
scaleH = _FIXED2FLOAT(_pObjSprite->scaleH, 10);
|
||||
imageW = _pObjSprite->imageW >> 5;
|
||||
imageH = _pObjSprite->imageH >> 5;
|
||||
X0 = _FIXED2FLOAT(_pObjSprite->objX, 2);
|
||||
X1 = X0 + imageW / scaleW;
|
||||
Y0 = _FIXED2FLOAT(_pObjSprite->objY, 2);
|
||||
Y1 = Y0 + imageH / scaleH;
|
||||
if (_scale) {
|
||||
X0 /= gSP.objMatrix.baseScaleX;
|
||||
X1 /= gSP.objMatrix.baseScaleX;
|
||||
Y0 /= gSP.objMatrix.baseScaleY;
|
||||
Y1 /= gSP.objMatrix.baseScaleY;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
static
|
||||
void gSPSetSpriteTile(const uObjSprite *_pObjSprite)
|
||||
{
|
||||
const u32 w = max(_pObjSprite->imageW >> 5, 1);
|
||||
const u32 h = max(_pObjSprite->imageH >> 5, 1);
|
||||
|
||||
gDPSetTile( _pObjSprite->imageFmt, _pObjSprite->imageSiz, _pObjSprite->imageStride, _pObjSprite->imageAdrs, 0, _pObjSprite->imagePal, G_TX_CLAMP, G_TX_CLAMP, 0, 0, 0, 0 );
|
||||
gDPSetTileSize( 0, 0, 0, (w - 1) << 2, (h - 1) << 2 );
|
||||
gSPTexture( 1.0f, 1.0f, 0, 0, TRUE );
|
||||
}
|
||||
|
||||
void gSPObjRectangle(u32 sp)
|
||||
{
|
||||
u32 address = RSP_SegmentToPhysical(sp);
|
||||
uObjSprite *objSprite = (uObjSprite*)&RDRAM[address];
|
||||
gSPSetSpriteTile(objSprite);
|
||||
ObjData data(objSprite, false);
|
||||
|
||||
gDPTextureRectangle(data.X0, data.Y0, data.X1, data.Y1, 0, 0.0f, 0.0f, data.scaleW * (gDP.otherMode.cycleType == G_CYC_COPY ? 4.0f : 1.0f), data.scaleH);
|
||||
}
|
||||
|
||||
void gSPObjRectangleR(u32 sp)
|
||||
{
|
||||
const u32 address = RSP_SegmentToPhysical(sp);
|
||||
const uObjSprite *objSprite = (uObjSprite*)&RDRAM[address];
|
||||
gSPSetSpriteTile(objSprite);
|
||||
ObjData data(objSprite, true);
|
||||
|
||||
gDPTextureRectangle(gSP.objMatrix.X + data.X0, gSP.objMatrix.Y + data.Y0, gSP.objMatrix.X + data.X1, gSP.objMatrix.Y + data.Y1, 0, 0.0f, 0.0f, data.scaleW * (gDP.otherMode.cycleType == G_CYC_COPY ? 4.0f : 1.0f), data.scaleH);
|
||||
}
|
||||
|
||||
void gSPObjSprite(u32 sp)
|
||||
{
|
||||
u32 address = RSP_SegmentToPhysical( sp );
|
||||
uObjSprite *objSprite = (uObjSprite*)&RDRAM[address];
|
||||
gSPSetSpriteTile(objSprite);
|
||||
ObjData data(objSprite, false);
|
||||
|
||||
f32 scaleW = _FIXED2FLOAT( objSprite->scaleW, 10 );
|
||||
f32 scaleH = _FIXED2FLOAT( objSprite->scaleH, 10 );
|
||||
f32 objX = _FIXED2FLOAT( objSprite->objX, 2 );
|
||||
f32 objY = _FIXED2FLOAT( objSprite->objY, 2 );
|
||||
u32 imageW = objSprite->imageW >> 5;
|
||||
u32 imageH = objSprite->imageH >> 5;
|
||||
|
||||
f32 x0 = objX;
|
||||
f32 y0 = objY;
|
||||
f32 x1 = objX + imageW / scaleW - 1;
|
||||
f32 y1 = objY + imageH / scaleH - 1;
|
||||
const f32 x0 = data.X0;
|
||||
const f32 y0 = data.Y0;
|
||||
const f32 x1 = data.X1;
|
||||
const f32 y1 = data.Y1;
|
||||
|
||||
s32 v0=0,v1=1,v2=2,v3=3;
|
||||
|
||||
|
@ -2171,26 +2210,22 @@ void gSPObjSprite( u32 sp )
|
|||
vtx1.y = gSP.objMatrix.C * x1 + gSP.objMatrix.D * y0 + gSP.objMatrix.Y;
|
||||
vtx1.z = 0.0f;
|
||||
vtx1.w = 1.0f;
|
||||
vtx1.s = imageW - 1;
|
||||
vtx1.s = data.imageW - 1;
|
||||
vtx1.t = 0.0f;
|
||||
SPVertex & vtx2 = render.getVertex(v2);
|
||||
vtx2.x = gSP.objMatrix.A * x1 + gSP.objMatrix.B * y1 + gSP.objMatrix.X;
|
||||
vtx2.y = gSP.objMatrix.C * x1 + gSP.objMatrix.D * y1 + gSP.objMatrix.Y;
|
||||
vtx2.z = 0.0f;
|
||||
vtx2.w = 1.0f;
|
||||
vtx2.s = imageW - 1;
|
||||
vtx2.t = imageH - 1;
|
||||
vtx2.s = data.imageW - 1;
|
||||
vtx2.t = data.imageH - 1;
|
||||
SPVertex & vtx3 = render.getVertex(v3);
|
||||
vtx3.x = gSP.objMatrix.A * x0 + gSP.objMatrix.B * y1 + gSP.objMatrix.X;
|
||||
vtx3.y = gSP.objMatrix.C * x0 + gSP.objMatrix.D * y1 + gSP.objMatrix.Y;
|
||||
vtx3.z = 0.0f;
|
||||
vtx3.w = 1.0f;
|
||||
vtx3.s = 0;
|
||||
vtx3.t = imageH - 1;
|
||||
|
||||
gDPSetTile( objSprite->imageFmt, objSprite->imageSiz, objSprite->imageStride, objSprite->imageAdrs, 0, objSprite->imagePal, G_TX_CLAMP, G_TX_CLAMP, 0, 0, 0, 0 );
|
||||
gDPSetTileSize( 0, 0, 0, (imageW - 1) << 2, (imageH - 1) << 2 );
|
||||
gSPTexture( 1.0f, 1.0f, 0, 0, TRUE );
|
||||
vtx3.t = data.imageH - 1;
|
||||
|
||||
const FrameBufferList & fbList = frameBufferList();
|
||||
FrameBuffer * pBuffer = fbList.getCurrent();
|
||||
|
@ -2227,10 +2262,16 @@ void gSPObjLoadTxSprite( u32 txsp )
|
|||
gSPObjSprite( txsp + sizeof( uObjTxtr ) );
|
||||
}
|
||||
|
||||
void gSPObjLoadTxRectR( u32 txsp )
|
||||
void gSPObjLoadTxRect(u32 txsp)
|
||||
{
|
||||
gSPObjLoadTxtr(txsp);
|
||||
gSPObjRectangle(txsp + sizeof(uObjTxtr));
|
||||
}
|
||||
|
||||
void gSPObjLoadTxRectR(u32 txsp)
|
||||
{
|
||||
gSPObjLoadTxtr( txsp );
|
||||
// gSPObjRectangleR( txsp + sizeof( uObjTxtr ) );
|
||||
gSPObjRectangleR( txsp + sizeof( uObjTxtr ) );
|
||||
}
|
||||
|
||||
void gSPObjMatrix( u32 mtx )
|
||||
|
|
4
gSP.h
4
gSP.h
|
@ -197,9 +197,11 @@ void gSPClearGeometryMode( u32 mode );
|
|||
void gSPLine3D( s32 v0, s32 v1, s32 flag );
|
||||
void gSPLineW3D( s32 v0, s32 v1, s32 wd, s32 flag );
|
||||
void gSPObjRectangle( u32 sp );
|
||||
void gSPObjSprite( u32 sp );
|
||||
void gSPObjRectangleR(u32 sp);
|
||||
void gSPObjSprite(u32 sp);
|
||||
void gSPObjLoadTxtr( u32 tx );
|
||||
void gSPObjLoadTxSprite( u32 txsp );
|
||||
void gSPObjLoadTxRect(u32 txsp);
|
||||
void gSPObjLoadTxRectR( u32 txsp );
|
||||
void gSPBgRect1Cyc( u32 bg );
|
||||
void gSPBgRectCopy( u32 bg );
|
||||
|
|
Loading…
Reference in New Issue
Block a user