Import gx, PadClamp, rest of mtx, TRK 2.6 and MSL (#525)
* Match mtx and Padclamp.c * Match the rest of GX * Import TRK 2.6 * Import MSL headers and files * Merge some MSL headers into ours
This commit is contained in:
parent
a79294aac0
commit
cdb1d1fc37
113 changed files with 11219 additions and 394 deletions
|
|
@ -6,15 +6,15 @@
|
|||
|
||||
#include <dolphin/gx/GXPriv.h>
|
||||
|
||||
static OSThread *__GXCurrentThread;
|
||||
static struct __GXFifoObj* CPUFifo;
|
||||
static struct __GXFifoObj* GPFifo;
|
||||
static OSThread* __GXCurrentThread;
|
||||
static GXBool CPGPLinked;
|
||||
static BOOL GXOverflowSuspendInProgress;
|
||||
static GXBreakPtCallback BreakPointCB;
|
||||
static u32 __GXOverflowCount;
|
||||
|
||||
struct __GXFifoObj *CPUFifo;
|
||||
struct __GXFifoObj *GPFifo;
|
||||
void *__GXCurrentBP;
|
||||
void* __GXCurrentBP;
|
||||
|
||||
static void __GXFifoReadEnable(void);
|
||||
static void __GXFifoReadDisable(void);
|
||||
|
|
@ -38,10 +38,10 @@ static void GXUnderflowHandler(s16 interrupt, OSContext *context)
|
|||
{
|
||||
ASSERTLINE(0x1A3, GXOverflowSuspendInProgress);
|
||||
|
||||
OSResumeThread(__GXCurrentThread);
|
||||
GXOverflowSuspendInProgress = FALSE;
|
||||
__GXWriteFifoIntReset(1U, 1U);
|
||||
__GXWriteFifoIntEnable(1U, 0U);
|
||||
OSResumeThread(__GXCurrentThread);
|
||||
GXOverflowSuspendInProgress = FALSE;
|
||||
__GXWriteFifoIntReset(1U, 1U);
|
||||
__GXWriteFifoIntEnable(1U, 0U);
|
||||
}
|
||||
|
||||
#define SOME_SET_REG_MACRO(reg, size, shift, val) \
|
||||
|
|
@ -51,17 +51,17 @@ static void GXUnderflowHandler(s16 interrupt, OSContext *context)
|
|||
|
||||
static void GXBreakPointHandler(s16 interrupt, OSContext *context)
|
||||
{
|
||||
OSContext exceptionContext;
|
||||
OSContext exceptionContext;
|
||||
|
||||
SOME_SET_REG_MACRO(gx->cpEnable, 1, 5, 0);
|
||||
GX_SET_CP_REG(1, gx->cpEnable);
|
||||
if (BreakPointCB != NULL) {
|
||||
OSClearContext(&exceptionContext);
|
||||
OSSetCurrentContext(&exceptionContext);
|
||||
BreakPointCB();
|
||||
OSClearContext(&exceptionContext);
|
||||
OSSetCurrentContext(context);
|
||||
}
|
||||
gx->cpEnable = gx->cpEnable & 0xFFFFFFDF;
|
||||
__cpReg[1] = gx->cpEnable;
|
||||
if (BreakPointCB != NULL) {
|
||||
OSClearContext(&exceptionContext);
|
||||
OSSetCurrentContext(&exceptionContext);
|
||||
BreakPointCB();
|
||||
OSClearContext(&exceptionContext);
|
||||
OSSetCurrentContext(context);
|
||||
}
|
||||
}
|
||||
|
||||
static void GXCPInterruptHandler(s16 interrupt, OSContext *context)
|
||||
|
|
|
|||
|
|
@ -291,26 +291,25 @@ f32 GXGetYScaleFactor(u16 efbHeight, u16 xfbHeight)
|
|||
|
||||
u32 GXSetDispCopyYScale(f32 vscale)
|
||||
{
|
||||
u8 enable;
|
||||
u32 iScale;
|
||||
u32 ht;
|
||||
u32 reg;
|
||||
u32 scale;
|
||||
GXBool check;
|
||||
u32 height;
|
||||
u32 reg;
|
||||
|
||||
CHECK_GXBEGIN(0x615, "GXSetDispCopyYScale");
|
||||
scale = (u32)(256.0f / vscale) & 0x1FF;
|
||||
check = (scale != 0x100);
|
||||
|
||||
ASSERTMSGLINE(0x617, vscale >= 1.0f, "GXSetDispCopyYScale: Vertical scale must be >= 1.0");
|
||||
reg = 0;
|
||||
SET_REG_FIELD(0, reg, 9, 0, scale);
|
||||
SET_REG_FIELD(0, reg, 8, 24, 0x4E);
|
||||
GX_WRITE_RAS_REG(reg);
|
||||
gx->bpSentNot = GX_FALSE;
|
||||
|
||||
iScale = (u32)(256.0f / vscale) & 0x1FF;
|
||||
enable = (iScale != 256);
|
||||
SET_REG_FIELD(0, gx->cpDisp, 1, 10, check);
|
||||
|
||||
reg = 0;
|
||||
SET_REG_FIELD(0x61E, reg, 9, 0, iScale);
|
||||
SET_REG_FIELD(0x61E, reg, 8, 24, 0x4E);
|
||||
GX_WRITE_RAS_REG(reg);
|
||||
gx->bpSentNot = 0;
|
||||
SET_REG_FIELD(0x623, gx->cpDisp, 1, 10, enable);
|
||||
ht = GET_REG_FIELD(gx->cpDispSize, 10, 10) + 1;
|
||||
return __GXGetNumXfbLines(ht, iScale);
|
||||
height = (gx->cpDispSize >> 10 & 0x3FF) + 1;
|
||||
|
||||
return __GXGetNumXfbLines(height, scale);
|
||||
}
|
||||
|
||||
void GXSetCopyClear(GXColor clear_clr, u32 clear_z)
|
||||
|
|
|
|||
|
|
@ -65,150 +65,134 @@ static GXTlutRegion *__GXDefaultTlutRegionCallback(u32 idx)
|
|||
|
||||
GXFifoObj FifoObj;
|
||||
|
||||
GXFifoObj *GXInit(void *base, u32 size)
|
||||
GXFifoObj* GXInit(void* base, u32 size)
|
||||
{
|
||||
u32 i;
|
||||
u32 reg;
|
||||
u32 freqBase;
|
||||
u32 i;
|
||||
u32 reg;
|
||||
u32 freqBase;
|
||||
char stack_padding[8];
|
||||
|
||||
// OSRegisterVersion(__GXVersion);
|
||||
gx->inDispList = FALSE;
|
||||
gx->dlSaveContext = TRUE;
|
||||
|
||||
gx->inDispList = FALSE;
|
||||
gx->dlSaveContext = TRUE;
|
||||
// gx->abtWaitPECopy = 1;
|
||||
#if DEBUG
|
||||
__GXinBegin = FALSE;
|
||||
#endif
|
||||
gx->tcsManEnab = FALSE;
|
||||
gx->tevTcEnab = FALSE;
|
||||
|
||||
GXSetMisc(GX_MT_XF_FLUSH, 0);
|
||||
gx->tcsManEnab = FALSE;
|
||||
gx->tevTcEnab = 0;
|
||||
GXSetMisc(GX_MT_XF_FLUSH, 0);
|
||||
__piReg = OSPhysicalToUncached(0xC003000);
|
||||
__cpReg = OSPhysicalToUncached(0xC000000);
|
||||
__peReg = OSPhysicalToUncached(0xC001000);
|
||||
__memReg = OSPhysicalToUncached(0xC004000);
|
||||
__GXFifoInit();
|
||||
GXInitFifoBase(&FifoObj, base, size);
|
||||
GXSetCPUFifo(&FifoObj);
|
||||
GXSetGPFifo(&FifoObj);
|
||||
__GXPEInit();
|
||||
EnableWriteGatherPipe();
|
||||
|
||||
__piReg = OSPhysicalToUncached(0xC003000);
|
||||
__cpReg = OSPhysicalToUncached(0xC000000);
|
||||
__peReg = OSPhysicalToUncached(0xC001000);
|
||||
__memReg = OSPhysicalToUncached(0xC004000);
|
||||
// __GXFifoInit();
|
||||
// GXInitFifoBase(&FifoObj, base, size);
|
||||
// GXSetCPUFifo(&FifoObj);
|
||||
// GXSetGPFifo(&FifoObj);
|
||||
gx->genMode = 0;
|
||||
SET_REG_FIELD(0, gx->genMode, 8, 24, 0);
|
||||
gx->bpMask = 255;
|
||||
SET_REG_FIELD(0, gx->bpMask, 8, 24, 0x0F);
|
||||
gx->lpSize = 0;
|
||||
SET_REG_FIELD(0, gx->lpSize, 8, 24, 0x22);
|
||||
for (i = 0; i < 16; ++i) {
|
||||
gx->tevc[i] = 0;
|
||||
gx->teva[i] = 0;
|
||||
gx->tref[i / 2] = 0;
|
||||
gx->texmapId[i] = GX_TEXMAP_NULL;
|
||||
SET_REG_FIELD(0x2F2, gx->tevc[i], 8, 24, 0xC0 + i * 2);
|
||||
SET_REG_FIELD(0x2F3, gx->teva[i], 8, 24, 0xC1 + i * 2);
|
||||
SET_REG_FIELD(0x2F5, gx->tevKsel[i / 2], 8, 24, 0xF6 + i / 2);
|
||||
SET_REG_FIELD(0x2F7, gx->tref[i / 2], 8, 24, 0x28 + i / 2);
|
||||
}
|
||||
gx->iref = 0;
|
||||
SET_REG_FIELD(0, gx->iref, 8, 24, 0x27);
|
||||
for (i = 0; i < 8; ++i) {
|
||||
gx->suTs0[i] = 0;
|
||||
gx->suTs1[i] = 0;
|
||||
SET_REG_FIELD(0x300, gx->suTs0[i], 8, 24, 0x30 + i * 2);
|
||||
SET_REG_FIELD(0x301, gx->suTs1[i], 8, 24, 0x31 + i * 2);
|
||||
}
|
||||
SET_REG_FIELD(0, gx->suScis0, 8, 24, 0x20);
|
||||
SET_REG_FIELD(0, gx->suScis1, 8, 24, 0x21);
|
||||
SET_REG_FIELD(0, gx->cmode0, 8, 24, 0x41);
|
||||
SET_REG_FIELD(0, gx->cmode1, 8, 24, 0x42);
|
||||
SET_REG_FIELD(0, gx->zmode, 8, 24, 0x40);
|
||||
SET_REG_FIELD(0, gx->peCtrl, 8, 24, 0x43);
|
||||
SET_REG_FIELD(0, gx->cpTex, 2, 7, 0);
|
||||
gx->dirtyState = 0;
|
||||
gx->dirtyVAT = FALSE;
|
||||
|
||||
// if (!resetFuncRegistered) {
|
||||
// OSRegisterResetFunction(&GXResetFuncInfo);
|
||||
// resetFuncRegistered = 1;
|
||||
// }
|
||||
freqBase = __OSBusClock / 500;
|
||||
__GXFlushTextureState();
|
||||
reg = (freqBase >> 11) | 0x400 | 0x69000000;
|
||||
GX_WRITE_RAS_REG(reg);
|
||||
|
||||
// __GXPEInit();
|
||||
// EnableWriteGatherPipe();
|
||||
__GXFlushTextureState();
|
||||
reg = (freqBase / 0x1080) | 0x200 | 0x46000000;
|
||||
GX_WRITE_RAS_REG(reg);
|
||||
|
||||
gx->genMode = 0;
|
||||
SET_REG_FIELD(0, gx->genMode, 8, 24, 0);
|
||||
gx->bpMask = 255;
|
||||
SET_REG_FIELD(0, gx->bpMask, 8, 24, 0x0F);
|
||||
gx->lpSize = 0;
|
||||
SET_REG_FIELD(0, gx->lpSize, 8, 24, 0x22);
|
||||
for (i = 0; i < 16; ++i) {
|
||||
gx->tevc[i] = 0;
|
||||
gx->teva[i] = 0;
|
||||
gx->tref[i / 2] = 0;
|
||||
gx->texmapId[i] = GX_TEXMAP_NULL;
|
||||
SET_REG_FIELD(0x46A, gx->tevc[i], 8, 24, 0xC0 + i * 2);
|
||||
SET_REG_FIELD(0x46B, gx->teva[i], 8, 24, 0xC1 + i * 2);
|
||||
SET_REG_FIELD(0x46D, gx->tevKsel[i / 2], 8, 24, 0xF6 + i / 2);
|
||||
SET_REG_FIELD(0x46F, gx->tref[i / 2], 8, 24, 0x28 + i / 2);
|
||||
}
|
||||
gx->iref = 0;
|
||||
SET_REG_FIELD(0, gx->iref, 8, 24, 0x27);
|
||||
for (i = 0; i < 8; ++i) {
|
||||
gx->suTs0[i] = 0;
|
||||
gx->suTs1[i] = 0;
|
||||
SET_REG_FIELD(0x478, gx->suTs0[i], 8, 24, 0x30 + i * 2);
|
||||
SET_REG_FIELD(0x479, gx->suTs1[i], 8, 24, 0x31 + i * 2);
|
||||
}
|
||||
SET_REG_FIELD(0, gx->suScis0, 8, 24, 0x20);
|
||||
SET_REG_FIELD(0, gx->suScis1, 8, 24, 0x21);
|
||||
SET_REG_FIELD(0, gx->cmode0, 8, 24, 0x41);
|
||||
SET_REG_FIELD(0, gx->cmode1, 8, 24, 0x42);
|
||||
SET_REG_FIELD(0, gx->zmode, 8, 24, 0x40);
|
||||
SET_REG_FIELD(0, gx->peCtrl, 8, 24, 0x43);
|
||||
SET_REG_FIELD(0, gx->cpTex, 2, 7, 0);
|
||||
for (i = GX_VTXFMT0; i < GX_MAX_VTXFMT; i++) {
|
||||
SET_REG_FIELD(0, gx->vatA[i], 1, 30, 1);
|
||||
SET_REG_FIELD(0, gx->vatB[i], 1, 31, 1);
|
||||
do {
|
||||
s32 regAddr;
|
||||
GX_WRITE_U8(GX_LOAD_CP_REG);
|
||||
GX_WRITE_U8(i | 0x80);
|
||||
GX_WRITE_U32(gx->vatB[i]);
|
||||
regAddr = i - 12;
|
||||
} while (0);
|
||||
}
|
||||
{
|
||||
u32 reg1 = 0;
|
||||
u32 reg2 = 0;
|
||||
SET_REG_FIELD(0, reg1, 1, 0, 1);
|
||||
SET_REG_FIELD(0, reg1, 1, 1, 1);
|
||||
SET_REG_FIELD(0, reg1, 1, 2, 1);
|
||||
SET_REG_FIELD(0, reg1, 1, 3, 1);
|
||||
SET_REG_FIELD(0, reg1, 1, 4, 1);
|
||||
SET_REG_FIELD(0, reg1, 1, 5, 1);
|
||||
GX_WRITE_XF_REG(0, reg1);
|
||||
SET_REG_FIELD(0, reg2, 1, 0, 1);
|
||||
GX_WRITE_XF_REG(0x12, reg2);
|
||||
}
|
||||
{
|
||||
u32 reg = 0;
|
||||
SET_REG_FIELD(0, reg, 1, 0, 1);
|
||||
SET_REG_FIELD(0, reg, 1, 1, 1);
|
||||
SET_REG_FIELD(0, reg, 1, 2, 1);
|
||||
SET_REG_FIELD(0, reg, 1, 3, 1);
|
||||
SET_REG_FIELD(0, reg, 8, 24, 0x58);
|
||||
GX_WRITE_RAS_REG(reg);
|
||||
}
|
||||
for (i = 0; i < 8; i++)
|
||||
GXInitTexCacheRegion(&gx->TexRegions[i], 0, i * 0x8000, 0,
|
||||
0x80000 + i * 0x8000, 0);
|
||||
for (i = 0; i < 4; i++)
|
||||
GXInitTexCacheRegion(&gx->TexRegionsCI[i], 0, (i * 2 + 8) * 0x8000, 0,
|
||||
(i * 2 + 9) * 0x8000, 0);
|
||||
for (i = 0; i < 16; i++)
|
||||
GXInitTlutRegion(&gx->TlutRegions[i], 0xC0000 + i * 0x2000, 16);
|
||||
for (i = 0; i < 4; i++)
|
||||
GXInitTlutRegion(&gx->TlutRegions[i + 16], 0xE0000 + i * 0x8000, 64);
|
||||
__cpReg[3] = 0;
|
||||
|
||||
// gx->zScale = 1.6777216E7f;
|
||||
// gx->zOffset = 0.0f;
|
||||
gx->dirtyState = 0;
|
||||
gx->dirtyVAT = FALSE;
|
||||
#if DEBUG
|
||||
__gxVerif->verifyLevel = GX_WARN_NONE;
|
||||
GXSetVerifyCallback((GXVerifyCallback)__GXDefaultVerifyCallback);
|
||||
for (i = 0; i < 256; i++) {
|
||||
SET_REG_FIELD(0, __gxVerif->rasRegs[i], 8, 24, 0xFF);
|
||||
}
|
||||
memset(__gxVerif->xfRegsDirty, 0, 0x50);
|
||||
memset(__gxVerif->xfMtxDirty, 0, 0x100);
|
||||
memset(__gxVerif->xfNrmDirty, 0, 0x60);
|
||||
memset(__gxVerif->xfLightDirty, 0, 0x80);
|
||||
#endif
|
||||
freqBase = __OSBusClock / 500;
|
||||
// __GXFlushTextureState();
|
||||
reg = (freqBase >> 11) | 0x400 | 0x69000000;
|
||||
GX_WRITE_RAS_REG(reg);
|
||||
{
|
||||
SET_REG_FIELD(0, gx->perfSel, 4, 4, 0);
|
||||
GX_WRITE_U8(GX_LOAD_CP_REG);
|
||||
GX_WRITE_U8(0x20);
|
||||
GX_WRITE_U32(gx->perfSel);
|
||||
GX_WRITE_U8(GX_LOAD_XF_REG);
|
||||
GX_WRITE_U32(0x1006);
|
||||
GX_WRITE_U32(0);
|
||||
GX_WRITE_RAS_REG(0x23000000);
|
||||
GX_WRITE_RAS_REG(0x24000000);
|
||||
GX_WRITE_RAS_REG(0x67000000);
|
||||
}
|
||||
|
||||
// __GXFlushTextureState();
|
||||
reg = (freqBase / 0x1080) | 0x200 | 0x46000000;
|
||||
GX_WRITE_RAS_REG(reg);
|
||||
|
||||
// __GXInitRevisionBits();
|
||||
|
||||
// for (i = 0; i < 8; i++) {
|
||||
// GXInitTexCacheRegion(&gx->TexRegions0[i], GX_FALSE, GXTexRegionAddrTable[i],
|
||||
// GX_TEXCACHE_32K, GXTexRegionAddrTable[i + 8], GX_TEXCACHE_32K);
|
||||
// GXInitTexCacheRegion(&gx->TexRegions1[i], GX_FALSE, GXTexRegionAddrTable[i + 16],
|
||||
// GX_TEXCACHE_32K, GXTexRegionAddrTable[i + 24], GX_TEXCACHE_32K);
|
||||
// GXInitTexCacheRegion(&gx->TexRegions2[i], GX_TRUE, GXTexRegionAddrTable[i + 32],
|
||||
// GX_TEXCACHE_32K, GXTexRegionAddrTable[i + 40], GX_TEXCACHE_32K);
|
||||
// }
|
||||
|
||||
// for (i = 0; i < 16; i++) {
|
||||
// GXInitTlutRegion(&gx->TlutRegions[i], 0xC0000 + 0x2000 * i, GX_TLUT_256);
|
||||
// }
|
||||
|
||||
// for (i = 0; i < 4; i++) {
|
||||
// GXInitTlutRegion(&gx->TlutRegions[i + 16], 0xE0000 + 0x8000 * i, GX_TLUT_1K);
|
||||
// }
|
||||
|
||||
{
|
||||
u32 reg = 0;
|
||||
#if DEBUG
|
||||
s32 regAddr;
|
||||
#endif
|
||||
GX_SET_CP_REG(3, reg);
|
||||
|
||||
SET_REG_FIELD(0, gx->perfSel, 4, 4, 0);
|
||||
GX_WRITE_U8(0x8);
|
||||
GX_WRITE_U8(0x20);
|
||||
GX_WRITE_U32(gx->perfSel);
|
||||
#if DEBUG
|
||||
regAddr = -12;
|
||||
#endif
|
||||
|
||||
reg = 0;
|
||||
GX_WRITE_XF_REG(6, reg);
|
||||
|
||||
reg = 0x23000000;
|
||||
GX_WRITE_RAS_REG(reg);
|
||||
|
||||
reg = 0x24000000;
|
||||
GX_WRITE_RAS_REG(reg);
|
||||
|
||||
reg = 0x67000000;
|
||||
GX_WRITE_RAS_REG(reg);
|
||||
}
|
||||
|
||||
__GXSetIndirectMask(0);
|
||||
__GXSetTmemConfig(2);
|
||||
__GXInitGX();
|
||||
|
||||
return &FifoObj;
|
||||
__GXSetTmemConfig(0);
|
||||
__GXInitGX();
|
||||
return &FifoObj;
|
||||
}
|
||||
|
||||
void __GXInitGX()
|
||||
|
|
|
|||
|
|
@ -3,6 +3,8 @@
|
|||
static f32 Unit01[] = { 0.0f, 1.0f };
|
||||
|
||||
extern f32 sinf(f32);
|
||||
extern f32 cosf(f32);
|
||||
extern f32 tanf(f32);
|
||||
|
||||
void C_MTXIdentity(Mtx mtx)
|
||||
{
|
||||
|
|
@ -648,12 +650,12 @@ void C_MTXRotRad(Mtx m, char axis, f32 rad)
|
|||
#ifdef GEKKO
|
||||
void PSMTXRotRad(Mtx m, char axis, f32 rad)
|
||||
{
|
||||
// f32 sinA, cosA;
|
||||
f32 sinA, cosA;
|
||||
|
||||
// sinA = sinf(rad);
|
||||
// cosA = cosf(rad);
|
||||
sinA = sinf(rad);
|
||||
cosA = cosf(rad);
|
||||
|
||||
// PSMTXRotTrig(m, axis, sinA, cosA);
|
||||
PSMTXRotTrig(m, axis, sinA, cosA);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
|
@ -717,68 +719,63 @@ void C_MTXRotTrig(Mtx m, char axis, f32 sinA, f32 cosA)
|
|||
#ifdef GEKKO
|
||||
void PSMTXRotTrig(register Mtx m, register char axis, register f32 sinA, register f32 cosA)
|
||||
{
|
||||
// register f32 fc0, fc1, nsinA;
|
||||
// register f32 fw0, fw1, fw2, fw3;
|
||||
// // clang-format off
|
||||
// asm
|
||||
// {
|
||||
// frsp sinA, sinA
|
||||
// frsp cosA, cosA
|
||||
// }
|
||||
register f32 fc0, fc1, nsinA;
|
||||
register f32 fw0, fw1, fw2, fw3;
|
||||
// clang-format off
|
||||
|
||||
// fc0 = 0.0F;
|
||||
// fc1 = 1.0F;
|
||||
// asm
|
||||
// {
|
||||
// ori axis, axis, 0x20
|
||||
// ps_neg nsinA, sinA
|
||||
// cmplwi axis, 'x'
|
||||
// beq _case_x
|
||||
// cmplwi axis, 'y'
|
||||
// beq _case_y
|
||||
// cmplwi axis, 'z'
|
||||
// beq _case_z
|
||||
// b _end
|
||||
fc0 = 0.0F;
|
||||
fc1 = 1.0F;
|
||||
asm
|
||||
{
|
||||
ori axis, axis, 0x20
|
||||
ps_neg nsinA, sinA
|
||||
cmplwi axis, 'x'
|
||||
beq _case_x
|
||||
cmplwi axis, 'y'
|
||||
beq _case_y
|
||||
cmplwi axis, 'z'
|
||||
beq _case_z
|
||||
b _end
|
||||
|
||||
// _case_x:
|
||||
// psq_st fc1, 0(m), 1, 0
|
||||
// psq_st fc0, 4(m), 0, 0
|
||||
// ps_merge00 fw0, sinA, cosA
|
||||
// psq_st fc0, 12(m), 0, 0
|
||||
// ps_merge00 fw1, cosA, nsinA
|
||||
// psq_st fc0, 28(m), 0, 0
|
||||
// psq_st fc0, 44(m), 1, 0
|
||||
// psq_st fw0, 36(m), 0, 0
|
||||
// psq_st fw1, 20(m), 0, 0
|
||||
// b _end;
|
||||
_case_x:
|
||||
psq_st fc1, 0(m), 1, 0
|
||||
psq_st fc0, 4(m), 0, 0
|
||||
ps_merge00 fw0, sinA, cosA
|
||||
psq_st fc0, 12(m), 0, 0
|
||||
ps_merge00 fw1, cosA, nsinA
|
||||
psq_st fc0, 28(m), 0, 0
|
||||
psq_st fc0, 44(m), 1, 0
|
||||
psq_st fw0, 36(m), 0, 0
|
||||
psq_st fw1, 20(m), 0, 0
|
||||
b _end;
|
||||
|
||||
// _case_y:
|
||||
// ps_merge00 fw0, cosA, fc0
|
||||
// ps_merge00 fw1, fc0, fc1
|
||||
// psq_st fc0, 24(m), 0, 0
|
||||
// psq_st fw0, 0(m), 0, 0
|
||||
// ps_merge00 fw2, nsinA, fc0
|
||||
// ps_merge00 fw3, sinA, fc0
|
||||
// psq_st fw0, 40(m), 0, 0;
|
||||
// psq_st fw1, 16(m), 0, 0;
|
||||
// psq_st fw3, 8(m), 0, 0;
|
||||
// psq_st fw2, 32(m), 0, 0;
|
||||
// b _end;
|
||||
_case_y:
|
||||
ps_merge00 fw0, cosA, fc0
|
||||
ps_merge00 fw1, fc0, fc1
|
||||
psq_st fc0, 24(m), 0, 0
|
||||
psq_st fw0, 0(m), 0, 0
|
||||
ps_merge00 fw2, nsinA, fc0
|
||||
ps_merge00 fw3, sinA, fc0
|
||||
psq_st fw0, 40(m), 0, 0;
|
||||
psq_st fw1, 16(m), 0, 0;
|
||||
psq_st fw3, 8(m), 0, 0;
|
||||
psq_st fw2, 32(m), 0, 0;
|
||||
b _end;
|
||||
|
||||
// _case_z:
|
||||
// psq_st fc0, 8(m), 0, 0
|
||||
// ps_merge00 fw0, sinA, cosA
|
||||
// ps_merge00 fw2, cosA, nsinA
|
||||
// psq_st fc0, 24(m), 0, 0
|
||||
// psq_st fc0, 32(m), 0, 0
|
||||
// ps_merge00 fw1, fc1, fc0
|
||||
// psq_st fw0, 16(m), 0, 0
|
||||
// psq_st fw2, 0(m), 0, 0
|
||||
// psq_st fw1, 40(m), 0, 0
|
||||
_case_z:
|
||||
psq_st fc0, 8(m), 0, 0
|
||||
ps_merge00 fw0, sinA, cosA
|
||||
ps_merge00 fw2, cosA, nsinA
|
||||
psq_st fc0, 24(m), 0, 0
|
||||
psq_st fc0, 32(m), 0, 0
|
||||
ps_merge00 fw1, fc1, fc0
|
||||
psq_st fw0, 16(m), 0, 0
|
||||
psq_st fw2, 0(m), 0, 0
|
||||
psq_st fw1, 40(m), 0, 0
|
||||
|
||||
// _end:
|
||||
// }
|
||||
// // clang-format on
|
||||
_end:
|
||||
}
|
||||
// clang-format on
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
@ -822,70 +819,58 @@ void C_MTXRotAxisRad(Mtx m, const Vec *axis, f32 rad)
|
|||
}
|
||||
|
||||
#ifdef GEKKO
|
||||
static void __PSMTXRotAxisRadInternal(register Mtx m, const register Vec *axis, register f32 sT, register f32 cT)
|
||||
#define qr0 0
|
||||
|
||||
void PSMTXRotAxisRad(register Mtx m, const Vec *axis, register f32 rad)
|
||||
{
|
||||
register f32 tT, fc0;
|
||||
register f32 tmp0, tmp1, tmp2, tmp3, tmp4;
|
||||
register f32 tmp5, tmp6, tmp7, tmp8, tmp9;
|
||||
|
||||
tmp9 = 0.5F;
|
||||
tmp8 = 3.0F;
|
||||
// clang-format off
|
||||
asm
|
||||
{
|
||||
frsp cT, cT
|
||||
psq_l tmp0, 0(axis), 0, 0
|
||||
frsp sT, sT
|
||||
lfs tmp1, 8(axis)
|
||||
ps_mul tmp2, tmp0, tmp0
|
||||
fadds tmp7, tmp9, tmp9
|
||||
ps_madd tmp3, tmp1, tmp1, tmp2
|
||||
fsubs fc0, tmp9, tmp9
|
||||
ps_sum0 tmp4, tmp3, tmp1, tmp2
|
||||
fsubs tT, tmp7, cT
|
||||
frsqrte tmp5, tmp4
|
||||
fmuls tmp2, tmp5, tmp5
|
||||
fmuls tmp3, tmp5, tmp9
|
||||
fnmsubs tmp2, tmp2, tmp4, tmp8
|
||||
fmuls tmp5, tmp2, tmp3
|
||||
ps_merge00 cT, cT, cT
|
||||
ps_muls0 tmp0, tmp0, tmp5
|
||||
ps_muls0 tmp1, tmp1, tmp5
|
||||
ps_muls0 tmp4, tmp0, tT
|
||||
ps_muls0 tmp9, tmp0, sT
|
||||
ps_muls0 tmp5, tmp1, tT
|
||||
ps_muls1 tmp3, tmp4, tmp0
|
||||
ps_muls0 tmp2, tmp4, tmp0
|
||||
ps_muls0 tmp4, tmp4, tmp1
|
||||
fnmsubs tmp6, tmp1, sT, tmp3
|
||||
fmadds tmp7, tmp1, sT, tmp3
|
||||
ps_neg tmp0, tmp9
|
||||
ps_sum0 tmp8, tmp4, fc0, tmp9
|
||||
ps_sum0 tmp2, tmp2, tmp6, cT
|
||||
ps_sum1 tmp3, cT, tmp7, tmp3
|
||||
ps_sum0 tmp6, tmp0, fc0 ,tmp4
|
||||
psq_st tmp8, 8(m), 0, 0
|
||||
ps_sum0 tmp0, tmp4, tmp4, tmp0
|
||||
psq_st tmp2, 0(m), 0, 0
|
||||
ps_muls0 tmp5, tmp5, tmp1
|
||||
psq_st tmp3, 16(m), 0, 0
|
||||
ps_sum1 tmp4, tmp9, tmp0, tmp4
|
||||
psq_st tmp6, 24(m), 0, 0
|
||||
ps_sum0 tmp5, tmp5, fc0, cT
|
||||
psq_st tmp4, 32(m), 0, 0
|
||||
psq_st tmp5, 40(m), 0, 0
|
||||
register f32 sT;
|
||||
register f32 cT;
|
||||
register f32 oneMinusCosT;
|
||||
register f32 zero;
|
||||
Vec axisNormalized;
|
||||
register Vec *axisNormalizedPtr;
|
||||
|
||||
zero = 0.0f;
|
||||
axisNormalizedPtr = &axisNormalized;
|
||||
sT = sinf(rad);
|
||||
cT = cosf(rad);
|
||||
oneMinusCosT = 1.0f - cT;
|
||||
|
||||
PSVECNormalize(axis, axisNormalizedPtr);
|
||||
|
||||
#ifdef __MWERKS__ // clang-format off
|
||||
asm {
|
||||
psq_l rad, 0x0(axisNormalizedPtr), 0, qr0
|
||||
lfs tmp1, 0x8(axisNormalizedPtr)
|
||||
ps_merge00 tmp0, cT, cT
|
||||
ps_muls0 tmp4, rad, oneMinusCosT
|
||||
ps_muls0 tmp5, tmp1, oneMinusCosT
|
||||
ps_muls1 tmp3, tmp4, rad
|
||||
ps_muls0 tmp2, tmp4, rad
|
||||
ps_muls0 rad, rad, sT
|
||||
ps_muls0 tmp4, tmp4, tmp1
|
||||
fnmsubs tmp6, tmp1, sT, tmp3
|
||||
fmadds tmp7, tmp1, sT, tmp3
|
||||
ps_neg tmp9, rad
|
||||
ps_sum0 tmp8, tmp4, zero, rad
|
||||
ps_sum0 tmp2, tmp2, tmp6, tmp0
|
||||
ps_sum1 tmp3, tmp0, tmp7, tmp3
|
||||
ps_sum0 tmp6, tmp9, zero, tmp4
|
||||
ps_sum0 tmp9, tmp4, tmp4, tmp9
|
||||
psq_st tmp8, 0x8(m), 0, qr0
|
||||
ps_muls0 tmp5, tmp5, tmp1
|
||||
psq_st tmp2, 0x0(m), 0, qr0
|
||||
ps_sum1 tmp4, rad, tmp9, tmp4
|
||||
psq_st tmp3, 0x10(m), 0, qr0
|
||||
ps_sum0 tmp5, tmp5, zero, tmp0
|
||||
psq_st tmp6, 0x18(m), 0, qr0
|
||||
psq_st tmp4, 0x20(m), 0, qr0
|
||||
psq_st tmp5, 0x28(m), 0, qr0
|
||||
}
|
||||
// clang-format on
|
||||
}
|
||||
|
||||
void PSMTXRotAxisRad(Mtx m, const Vec *axis, f32 rad)
|
||||
{
|
||||
// f32 sinT, cosT;
|
||||
|
||||
// sinT = sinf(rad);
|
||||
// cosT = cosf(rad);
|
||||
|
||||
// __PSMTXRotAxisRadInternal(m, axis, sinT, cosT);
|
||||
#endif // clang-format on
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
@ -1219,30 +1204,30 @@ void PSMTXReflect(register Mtx m, const register Vec *p, const register Vec *n)
|
|||
|
||||
void C_MTXLookAt(Mtx m, const Point3d *camPos, const Vec *camUp, const Point3d *target)
|
||||
{
|
||||
// Vec vLook, vRight, vUp;
|
||||
Vec vLook, vRight, vUp;
|
||||
|
||||
// vLook.x = camPos->x - target->x;
|
||||
// vLook.y = camPos->y - target->y;
|
||||
// vLook.z = camPos->z - target->z;
|
||||
// VECNormalize(&vLook, &vLook);
|
||||
// VECCrossProduct(camUp, &vLook, &vRight);
|
||||
// VECNormalize(&vRight, &vRight);
|
||||
// VECCrossProduct(&vLook, &vRight, &vUp);
|
||||
vLook.x = camPos->x - target->x;
|
||||
vLook.y = camPos->y - target->y;
|
||||
vLook.z = camPos->z - target->z;
|
||||
VECNormalize(&vLook, &vLook);
|
||||
VECCrossProduct(camUp, &vLook, &vRight);
|
||||
VECNormalize(&vRight, &vRight);
|
||||
VECCrossProduct(&vLook, &vRight, &vUp);
|
||||
|
||||
// m[0][0] = vRight.x;
|
||||
// m[0][1] = vRight.y;
|
||||
// m[0][2] = vRight.z;
|
||||
// m[0][3] = -(camPos->x * vRight.x + camPos->y * vRight.y + camPos->z * vRight.z);
|
||||
m[0][0] = vRight.x;
|
||||
m[0][1] = vRight.y;
|
||||
m[0][2] = vRight.z;
|
||||
m[0][3] = -(camPos->x * vRight.x + camPos->y * vRight.y + camPos->z * vRight.z);
|
||||
|
||||
// m[1][0] = vUp.x;
|
||||
// m[1][1] = vUp.y;
|
||||
// m[1][2] = vUp.z;
|
||||
// m[1][3] = -(camPos->x * vUp.x + camPos->y * vUp.y + camPos->z * vUp.z);
|
||||
m[1][0] = vUp.x;
|
||||
m[1][1] = vUp.y;
|
||||
m[1][2] = vUp.z;
|
||||
m[1][3] = -(camPos->x * vUp.x + camPos->y * vUp.y + camPos->z * vUp.z);
|
||||
|
||||
// m[2][0] = vLook.x;
|
||||
// m[2][1] = vLook.y;
|
||||
// m[2][2] = vLook.z;
|
||||
// m[2][3] = -(camPos->x * vLook.x + camPos->y * vLook.y + camPos->z * vLook.z);
|
||||
m[2][0] = vLook.x;
|
||||
m[2][1] = vLook.y;
|
||||
m[2][2] = vLook.z;
|
||||
m[2][3] = -(camPos->x * vLook.x + camPos->y * vLook.y + camPos->z * vLook.z);
|
||||
}
|
||||
|
||||
void C_MTXLightFrustum(Mtx m, float t, float b, float l, float r, float n, float scaleS, float scaleT, float transS, float transT)
|
||||
|
|
@ -1269,28 +1254,28 @@ void C_MTXLightFrustum(Mtx m, float t, float b, float l, float r, float n, float
|
|||
|
||||
void C_MTXLightPerspective(Mtx m, f32 fovY, f32 aspect, float scaleS, float scaleT, float transS, float transT)
|
||||
{
|
||||
// f32 angle;
|
||||
// f32 cot;
|
||||
f32 angle;
|
||||
f32 cot;
|
||||
|
||||
// angle = fovY * 0.5f;
|
||||
// angle = MTXDegToRad(angle);
|
||||
angle = fovY * 0.5f;
|
||||
angle = MTXDegToRad(angle);
|
||||
|
||||
// cot = 1.0f / tanf(angle);
|
||||
cot = 1.0f / tanf(angle);
|
||||
|
||||
// m[0][0] = (cot / aspect) * scaleS;
|
||||
// m[0][1] = 0.0f;
|
||||
// m[0][2] = -transS;
|
||||
// m[0][3] = 0.0f;
|
||||
m[0][0] = (cot / aspect) * scaleS;
|
||||
m[0][1] = 0.0f;
|
||||
m[0][2] = -transS;
|
||||
m[0][3] = 0.0f;
|
||||
|
||||
// m[1][0] = 0.0f;
|
||||
// m[1][1] = cot * scaleT;
|
||||
// m[1][2] = -transT;
|
||||
// m[1][3] = 0.0f;
|
||||
m[1][0] = 0.0f;
|
||||
m[1][1] = cot * scaleT;
|
||||
m[1][2] = -transT;
|
||||
m[1][3] = 0.0f;
|
||||
|
||||
// m[2][0] = 0.0f;
|
||||
// m[2][1] = 0.0f;
|
||||
// m[2][2] = -1.0f;
|
||||
// m[2][3] = 0.0f;
|
||||
m[2][0] = 0.0f;
|
||||
m[2][1] = 0.0f;
|
||||
m[2][2] = -1.0f;
|
||||
m[2][3] = 0.0f;
|
||||
}
|
||||
|
||||
void C_MTXLightOrtho(Mtx m, f32 t, f32 b, f32 l, f32 r, float scaleS, float scaleT, float transS, float transT)
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
#include "dolphin/math.h"
|
||||
#include "dolphin/mtx.h"
|
||||
|
||||
float acosf(float x);
|
||||
|
|
@ -5,6 +6,28 @@ float acosf(float x);
|
|||
float sinf(float x);
|
||||
float cosf(float x);
|
||||
|
||||
void C_QUATAdd(const Quaternion *p, const Quaternion *q, Qtrn *r)
|
||||
{
|
||||
r->x = p->x + q->x;
|
||||
r->y = p->y + q->y;
|
||||
r->z = p->z + q->z;
|
||||
r->w = p->w + q->w;
|
||||
}
|
||||
|
||||
void PSQUATAdd(register const Quaternion *p, register const Quaternion *q, register Quaternion *r)
|
||||
{
|
||||
asm {
|
||||
psq_l f0, 0x0(r3), 0, 0
|
||||
psq_l f1, 0x0(r4), 0, 0
|
||||
ps_add f0, f0, f1
|
||||
psq_st f0, 0x0(r5), 0, 0
|
||||
psq_l f0, 0x8(r3), 0, 0
|
||||
psq_l f1, 0x8(r4), 0, 0
|
||||
ps_add f0, f0, f1
|
||||
psq_st f0, 0x8(r5), 0, 0
|
||||
}
|
||||
}
|
||||
|
||||
void PSQUATMultiply(register const Quaternion *a, register const Quaternion *b, register Quaternion *ab)
|
||||
{
|
||||
asm {
|
||||
|
|
@ -33,6 +56,77 @@ void PSQUATMultiply(register const Quaternion *a, register const Quaternion *b,
|
|||
}
|
||||
}
|
||||
|
||||
void PSQUATNormalize(const register Quaternion *src, register Quaternion *unit)
|
||||
{
|
||||
// sdata2
|
||||
(void)0.00001f;
|
||||
(void)0.0f;
|
||||
(void)0.5;
|
||||
(void)3.0;
|
||||
(void)1.0f;
|
||||
(void)0.5f;
|
||||
(void)3.0f;
|
||||
{
|
||||
register f32 vv1, vv2, vv3;
|
||||
register f32 vv4, vv5, vv6;
|
||||
register f32 vv7, vv8;
|
||||
register f32 vv9 = 0.00001f;
|
||||
register f32 vvA = 0.5F;
|
||||
register f32 vvB = 3.0F;
|
||||
asm
|
||||
{
|
||||
psq_l vv1, 0(src), 0, 0;
|
||||
ps_mul vv3, vv1, vv1;
|
||||
psq_l vv2, 8(src), 0, 0;
|
||||
ps_sub vv6, vv9, vv9;
|
||||
ps_madd vv3, vv2, vv2, vv3;
|
||||
ps_sum0 vv3, vv3, vv3, vv3;
|
||||
frsqrte vv4, vv3;
|
||||
ps_sub vv5, vv3, vv9;
|
||||
fmul vv7, vv4, vv4;
|
||||
fmul vv8, vv4, vvA;
|
||||
fnmsub vv7, vv7, vv3, vvB;
|
||||
fmul vv4, vv7, vv8;
|
||||
ps_sel vv4, vv5, vv4, vv6;
|
||||
ps_muls0 vv1, vv1, vv4;
|
||||
ps_muls0 vv2, vv2, vv4;
|
||||
psq_st vv1, 0(unit), 0, 0;
|
||||
psq_st vv2, 8(unit), 0, 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void PSQUATInverse(const register Quaternion *src, register Quaternion *inv)
|
||||
{
|
||||
register f32 vv1, vv2, vv3, vv4;
|
||||
register f32 vv5, vv6, vv7, vv8, vv9, vvA, vvB;
|
||||
register f32 vvC = 1.0F;
|
||||
asm {
|
||||
psq_l vv1, 0(src), 0, 0;
|
||||
ps_mul vv5, vv1, vv1;
|
||||
psq_l vv2, 8(src), 0, 0;
|
||||
ps_madd vv5, vv2, vv2, vv5;
|
||||
ps_add vvA, vvC, vvC;
|
||||
ps_sum0 vv5, vv5, vv5, vv5;
|
||||
fres vv7, vv5;
|
||||
ps_neg vv6, vv5;
|
||||
ps_nmsub vv9, vv5, vv7, vvA;
|
||||
ps_mul vv7, vv7, vv9;
|
||||
ps_sel vv7, vv6, vvC, vv7
|
||||
b loc1;
|
||||
loc0:
|
||||
fmr vv7, vvC;
|
||||
loc1:
|
||||
ps_neg vv8, vv7;
|
||||
ps_muls1 vv4, vv7, vv2;
|
||||
ps_muls0 vv1, vv1, vv8;
|
||||
psq_st vv4, 12(inv), 1, 0;
|
||||
ps_muls0 vv3, vv2, vv8;
|
||||
psq_st vv1, 0(inv), 0, 0;
|
||||
psq_st vv3, 8(inv), 1, 0;
|
||||
}
|
||||
}
|
||||
|
||||
void C_QUATRotAxisRad(Quaternion *q, const Vec *axis, f32 rad)
|
||||
{
|
||||
f32 tmp, tmp2, tmp3;
|
||||
|
|
@ -52,6 +146,42 @@ void C_QUATRotAxisRad(Quaternion *q, const Vec *axis, f32 rad)
|
|||
q->w = tmp3;
|
||||
}
|
||||
|
||||
void C_QUATMtx(Quaternion *r, const Mtx m)
|
||||
{
|
||||
f32 vv0, vv1;
|
||||
s32 i, j, k;
|
||||
s32 idx[3] = { 1, 2, 0 };
|
||||
f32 vec[3];
|
||||
vv0 = m[0][0] + m[1][1] + m[2][2];
|
||||
if (vv0 > 0.0f) {
|
||||
vv1 = (f32)sqrtf(vv0 + 1.0f);
|
||||
r->w = vv1 * 0.5f;
|
||||
vv1 = 0.5f / vv1;
|
||||
r->x = (m[2][1] - m[1][2]) * vv1;
|
||||
r->y = (m[0][2] - m[2][0]) * vv1;
|
||||
r->z = (m[1][0] - m[0][1]) * vv1;
|
||||
}
|
||||
else {
|
||||
i = 0;
|
||||
if (m[1][1] > m[0][0])
|
||||
i = 1;
|
||||
if (m[2][2] > m[i][i])
|
||||
i = 2;
|
||||
j = idx[i];
|
||||
k = idx[j];
|
||||
vv1 = (f32)sqrtf((m[i][i] - (m[j][j] + m[k][k])) + 1.0f);
|
||||
vec[i] = vv1 * 0.5f;
|
||||
if (vv1 != 0.0f)
|
||||
vv1 = 0.5f / vv1;
|
||||
r->w = (m[k][j] - m[j][k]) * vv1;
|
||||
vec[j] = (m[i][j] + m[j][i]) * vv1;
|
||||
vec[k] = (m[i][k] + m[k][i]) * vv1;
|
||||
r->x = vec[0];
|
||||
r->y = vec[1];
|
||||
r->z = vec[2];
|
||||
}
|
||||
}
|
||||
|
||||
void C_QUATSlerp(const Quaternion *p, const Quaternion *q, Quaternion *r, f32 t)
|
||||
{
|
||||
f32 ratioA, ratioB;
|
||||
|
|
|
|||
|
|
@ -210,23 +210,23 @@ void C_VECHalfAngle(const Vec *a, const Vec *b, Vec *half)
|
|||
|
||||
void C_VECReflect(const Vec *src, const Vec *normal, Vec *dst)
|
||||
{
|
||||
// Vec a0;
|
||||
// Vec b0;
|
||||
// f32 dot;
|
||||
Vec a0;
|
||||
Vec b0;
|
||||
f32 dot;
|
||||
|
||||
// a0.x = -src->x;
|
||||
// a0.y = -src->y;
|
||||
// a0.z = -src->z;
|
||||
a0.x = -src->x;
|
||||
a0.y = -src->y;
|
||||
a0.z = -src->z;
|
||||
|
||||
// VECNormalize(&a0, &a0);
|
||||
// VECNormalize(normal, &b0);
|
||||
VECNormalize(&a0, &a0);
|
||||
VECNormalize(normal, &b0);
|
||||
|
||||
// dot = VECDotProduct(&a0, &b0);
|
||||
// dst->x = b0.x * 2.0f * dot - a0.x;
|
||||
// dst->y = b0.y * 2.0f * dot - a0.y;
|
||||
// dst->z = b0.z * 2.0f * dot - a0.z;
|
||||
dot = VECDotProduct(&a0, &b0);
|
||||
dst->x = b0.x * 2.0f * dot - a0.x;
|
||||
dst->y = b0.y * 2.0f * dot - a0.y;
|
||||
dst->z = b0.z * 2.0f * dot - a0.z;
|
||||
|
||||
// VECNormalize(dst, dst);
|
||||
VECNormalize(dst, dst);
|
||||
}
|
||||
|
||||
asm f32 PSVECSquareDistance(register const Vec *a, register const Vec *b) {
|
||||
|
|
|
|||
|
|
@ -103,17 +103,34 @@ static void ClampTrigger(u8 *trigger, u8 min, u8 max)
|
|||
}
|
||||
}
|
||||
|
||||
void PADClamp(PADStatus *status)
|
||||
void PADClamp(PADStatus* status)
|
||||
{
|
||||
// int i;
|
||||
// for (i = 0; i < PAD_CHANMAX; i++, status++) {
|
||||
// if (status->err != PAD_ERR_NONE) {
|
||||
// continue;
|
||||
// }
|
||||
int i;
|
||||
for (i = 0; i < PAD_CHANMAX; i++, status++) {
|
||||
if (status->err != PAD_ERR_NONE) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// ClampStick(&status->stickX, &status->stickY, ClampRegion.maxStick, ClampRegion.xyStick, ClampRegion.minStick);
|
||||
// ClampStick(&status->substickX, &status->substickY, ClampRegion.maxSubstick, ClampRegion.xySubstick, ClampRegion.minSubstick);
|
||||
// ClampTrigger(&status->triggerL, ClampRegion.minTrigger, ClampRegion.maxTrigger);
|
||||
// ClampTrigger(&status->triggerR, ClampRegion.minTrigger, ClampRegion.maxTrigger);
|
||||
// }
|
||||
ClampStick(&status->stickX, &status->stickY, ClampRegion.maxStick,
|
||||
ClampRegion.xyStick, ClampRegion.minStick);
|
||||
ClampStick(&status->substickX, &status->substickY,
|
||||
ClampRegion.maxSubstick, ClampRegion.xySubstick,
|
||||
ClampRegion.minSubstick);
|
||||
if (status->triggerL <= ClampRegion.minTrigger) {
|
||||
status->triggerL = 0;
|
||||
} else {
|
||||
if (ClampRegion.maxTrigger < status->triggerL) {
|
||||
status->triggerL = ClampRegion.maxTrigger;
|
||||
}
|
||||
status->triggerL -= ClampRegion.minTrigger;
|
||||
}
|
||||
if (status->triggerR <= ClampRegion.minTrigger) {
|
||||
status->triggerR = 0;
|
||||
} else {
|
||||
if (ClampRegion.maxTrigger < status->triggerR) {
|
||||
status->triggerR = ClampRegion.maxTrigger;
|
||||
}
|
||||
status->triggerR -= ClampRegion.minTrigger;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue