mirror of
https://github.com/blawar/GLideN64.git
synced 2024-07-04 10:03:36 +00:00
Rewrite coordinates calculation for ObjRectangle and ObjRectangleR
This commit is contained in:
parent
83995f5dc8
commit
164d012138
|
@ -250,31 +250,37 @@ struct ObjCoordinates
|
||||||
S2DEXCoordCorrector CC;
|
S2DEXCoordCorrector CC;
|
||||||
s16 xh, xl, yh, yl;
|
s16 xh, xl, yh, yl;
|
||||||
if (_useMatrix) {
|
if (_useMatrix) {
|
||||||
// scaleW = (BaseScaleX * 0x40 * scaleW) >> 16
|
// scaleW = (BaseScaleX * 0x40 * scaleW) >> 16
|
||||||
// scaleH = (BaseScaleY * 0x40 * scaleH) >> 16
|
// scaleH = (BaseScaleY * 0x40 * scaleH) >> 16
|
||||||
// If objX < 0x0000, CX = 0x0001 If objX > 0x0000, CX = 0x00000
|
// XHP = ((objX << 16) * 0x0800) / (BaseScaleX * 2 - 0x02) + ((AND(X + A2) by B0) << 16))
|
||||||
// If objY < 0x0000, CY = 0x0001 If objY > 0x0000, CY = 0x00000
|
// XH = XHP >> 16
|
||||||
// XH = ((objX * 0x0800) / BaseScaleX * 2) + (AND(X + A2) by B0) - CX
|
// XLP = XHP + ((ImageW - A1) << 24) / (scaleW * 2 - 0x02)
|
||||||
// XL = XH + ((ImageW - A1) << 8) / (scaleW * 2)
|
// XL = XLP >> 16
|
||||||
// YH = ((objY * 0x0800) / BaseScaleY * 2) + (AND(Y + A2) by B0) - CY
|
// YHP = ((objY << 16) * 0x0800) / (BaseScaleY * 2 - 0x02) + ((AND(Y + A2) by B0) << 16)
|
||||||
// YL = YL + ((ImageH - A1) << 8) / (scaleH * 2)
|
// YH = YHP >> 16
|
||||||
const u16 scaleW = static_cast<u16>((u32(objMtx.BaseScaleX) * 0x40 * _pObjSprite->scaleW) >> 16);
|
// YLP = YHP + ((ImageH - A1) << 24)/(scaleH * 2 - 0x02)
|
||||||
const u16 scaleH = static_cast<u16>((u32(objMtx.BaseScaleY) * 0x40 * _pObjSprite->scaleH) >> 16);
|
// YL = YLP >> 16
|
||||||
const s32 CX = _pObjSprite->objX < 0 ? 1 : 0;
|
const u32 scaleW = (u32(objMtx.BaseScaleX) * 0x40 * _pObjSprite->scaleW) >> 16;
|
||||||
const s32 CY = _pObjSprite->objY < 0 ? 1 : 0;
|
const u32 scaleH = (u32(objMtx.BaseScaleY) * 0x40 * _pObjSprite->scaleH) >> 16;
|
||||||
xh = static_cast<s16>(((s32(_pObjSprite->objX) << 11) / (objMtx.BaseScaleX << 1)) + ((objMtx.X + CC.A2) & CC.B0) - CX);
|
const s32 xhp = ((s64(_pObjSprite->objX) << 16) * 0x0800) / ((objMtx.BaseScaleX - 1) << 1) + (((s32(objMtx.X) + CC.A2) & CC.B0) << 16);
|
||||||
xl = ((_pObjSprite->imageW - CC.A1) << 8) / (scaleW << 1) + xh;
|
xh = static_cast<s16>(xhp >> 16);
|
||||||
yh = static_cast<s16>(((s32(_pObjSprite->objY) << 11) / (objMtx.BaseScaleY << 1)) + ((objMtx.Y + CC.A2) & CC.B0) - CY);
|
const s32 xlp = ((u64(_pObjSprite->imageW) - CC.A1) << 24) / ((scaleW - 1) << 1) + xhp;
|
||||||
yl = ((_pObjSprite->imageH - CC.A1) << 8) / (scaleH << 1) + yh;
|
xl = static_cast<s16>(xlp >> 16);
|
||||||
|
const s32 yhp = ((s64(_pObjSprite->objY) << 16) * 0x0800) / ((objMtx.BaseScaleY - 1) << 1) + (((s32(objMtx.Y) + CC.A2) & CC.B0) << 16);
|
||||||
|
yh = static_cast<s16>(yhp >> 16);
|
||||||
|
const s32 ylp = ((u64(_pObjSprite->imageH) - CC.A1) << 24) / ((scaleH - 1) << 1) + yhp;
|
||||||
|
yl = static_cast<s16>(ylp >> 16);
|
||||||
} else {
|
} else {
|
||||||
// XH = AND(objX + A2) by B0
|
// XH = AND(objX + A2) by B0
|
||||||
// XL = AND(objX + A2) by B0 + ((ImageW - A1) * 0x100) / (scaleW * 2)
|
// XL = (((AND (objX + A2) by B0) << 16) + ((ImageW - A1) << 24 )/(scaleW * 2 - 0x02)) >> 16
|
||||||
// YH = AND(objY + A2) by B0
|
// YH = AND(objY + A2) by B0
|
||||||
// YL = AND(objY + A2) by B0 + ((ImageH - A1) * 0x100) / (scaleH * 2)
|
// YL = (((AND (objY + A2) by B0) << 16) + ((ImageH - A1) << 24)/(scaleH * 2 - 0x02)) >> 16
|
||||||
xh = (_pObjSprite->objX + CC.A2) & CC.B0;
|
xh = (_pObjSprite->objX + CC.A2) & CC.B0;
|
||||||
xl = ((_pObjSprite->imageW - CC.A1) << 8) / (_pObjSprite->scaleW << 1) + xh;
|
const s32 xlp = ((u64(_pObjSprite->imageW) - CC.A1) << 24) / ((_pObjSprite->scaleW - 1) << 1) + (xh << 16);
|
||||||
|
xl = static_cast<s16>(xlp >> 16);
|
||||||
yh = (_pObjSprite->objY + CC.A2) & CC.B0;
|
yh = (_pObjSprite->objY + CC.A2) & CC.B0;
|
||||||
yl = ((_pObjSprite->imageH - CC.A1) << 8) / (_pObjSprite->scaleH << 1) + yh;
|
const s32 ylp = ((u64(_pObjSprite->imageH) - CC.A1) << 24) / ((_pObjSprite->scaleH - 1) << 1) + (yh << 16);
|
||||||
|
yl = static_cast<s16>(ylp >> 16);
|
||||||
}
|
}
|
||||||
|
|
||||||
ulx = _FIXED2FLOAT(xh, 2);
|
ulx = _FIXED2FLOAT(xh, 2);
|
||||||
|
@ -575,8 +581,8 @@ void gSPObjSprite(u32 _sp)
|
||||||
const s16 y0 = (objMtx.Y + CC.B3) & CC.B0;
|
const s16 y0 = (objMtx.Y + CC.B3) & CC.B0;
|
||||||
const s16 ulx = objSprite->objX + CC.A3;
|
const s16 ulx = objSprite->objX + CC.A3;
|
||||||
const s16 uly = objSprite->objY + CC.A3;
|
const s16 uly = objSprite->objY + CC.A3;
|
||||||
const s16 lrx = ((objSprite->imageW - CC.A1) << 8) / (objSprite->scaleW << 1) + ulx;
|
const s16 lrx = ((u32(objSprite->imageW) - CC.A1) << 8) / (u32(objSprite->scaleW) << 1) + ulx;
|
||||||
const s16 lry = ((objSprite->imageH - CC.A1) << 8) / (objSprite->scaleH << 1) + uly;
|
const s16 lry = ((u32(objSprite->imageH) - CC.A1) << 8) / (u32(objSprite->scaleH) << 1) + uly;
|
||||||
|
|
||||||
auto calcX = [&](s16 _x, s16 _y) -> f32
|
auto calcX = [&](s16 _x, s16 _y) -> f32
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue
Block a user