Fixes by encounter
This commit is contained in:
parent
1bb770e5d7
commit
07b827eb2d
9 changed files with 509 additions and 491 deletions
|
|
@ -28,6 +28,10 @@ endif ()
|
||||||
|
|
||||||
add_compile_options(-fsanitize=address)
|
add_compile_options(-fsanitize=address)
|
||||||
|
|
||||||
|
if (MSVC)
|
||||||
|
add_compile_options(/bigobj)
|
||||||
|
endif ()
|
||||||
|
|
||||||
add_subdirectory(extern/aurora EXCLUDE_FROM_ALL)
|
add_subdirectory(extern/aurora EXCLUDE_FROM_ALL)
|
||||||
add_subdirectory(extern/musyx EXCLUDE_FROM_ALL)
|
add_subdirectory(extern/musyx EXCLUDE_FROM_ALL)
|
||||||
|
|
||||||
|
|
@ -112,7 +116,7 @@ target_include_directories(marioparty4 PRIVATE include build/GMPE01_00/include)
|
||||||
if (MSVC)
|
if (MSVC)
|
||||||
target_link_options(marioparty4 PRIVATE "/DEF:${CMAKE_SOURCE_DIR}/dol.def")
|
target_link_options(marioparty4 PRIVATE "/DEF:${CMAKE_SOURCE_DIR}/dol.def")
|
||||||
endif ()
|
endif ()
|
||||||
target_link_libraries(marioparty4 PRIVATE aurora::aurora aurora::main musyx)
|
target_link_libraries(marioparty4 PRIVATE aurora::core aurora::gx aurora::vi aurora::main musyx)
|
||||||
|
|
||||||
add_library(bootDll SHARED src/REL/bootDll/main.c src/REL/bootDll/language.c)
|
add_library(bootDll SHARED src/REL/bootDll/main.c src/REL/bootDll/language.c)
|
||||||
target_compile_definitions(bootDll PRIVATE TARGET_PC VERSION=0 TARGET_REL)
|
target_compile_definitions(bootDll PRIVATE TARGET_PC VERSION=0 TARGET_REL)
|
||||||
|
|
|
||||||
2
extern/aurora
vendored
2
extern/aurora
vendored
|
|
@ -1 +1 @@
|
||||||
Subproject commit 10bcf955aaabf8e1470ab07da51302a2ca3a8bfa
|
Subproject commit d9de6603c79917a5353abd3a9cc26ec557ceee05
|
||||||
|
|
@ -2,8 +2,9 @@
|
||||||
#define _DOLPHIN_GXPRIV
|
#define _DOLPHIN_GXPRIV
|
||||||
|
|
||||||
#include "dolphin/gx.h"
|
#include "dolphin/gx.h"
|
||||||
|
#include "dolphin/os.h"
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifndef NDEBUG
|
||||||
#define ASSERTLINE(line, cond) \
|
#define ASSERTLINE(line, cond) \
|
||||||
((cond) || (OSPanic(__FILE__, line, "Failed assertion " #cond), 0))
|
((cond) || (OSPanic(__FILE__, line, "Failed assertion " #cond), 0))
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -133,9 +133,12 @@ typedef struct _JUMP_BUFFER {
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(_M_IX86) || defined(__i386__) || defined(_M_X64) || defined(__x86_64__)
|
#if defined(_M_IX86) || defined(__i386__)
|
||||||
#define SETJMP_SET_IP(jump, func) ((_JUMP_BUFFER *)((jump)))->Eip = (size_t)func
|
#define SETJMP_SET_IP(jump, func) ((_JUMP_BUFFER *)((jump)))->Eip = (size_t)func
|
||||||
#define SETJMP_SET_SP(jump, sp) ((_JUMP_BUFFER *)((jump)))->Esp = (size_t)sp
|
#define SETJMP_SET_SP(jump, sp) ((_JUMP_BUFFER *)((jump)))->Esp = (size_t)sp
|
||||||
|
#elif defined(_M_X64) || defined(__x86_64__)
|
||||||
|
#define SETJMP_SET_IP(jump, func) ((_JUMP_BUFFER *)((jump)))->Rip = (size_t)func
|
||||||
|
#define SETJMP_SET_SP(jump, sp) ((_JUMP_BUFFER *)((jump)))->Rsp = (size_t)sp
|
||||||
#elif defined(_M_ARM) || defined(__arm__)
|
#elif defined(_M_ARM) || defined(__arm__)
|
||||||
#define SETJMP_SET_IP(jump, func) ((_JUMP_BUFFER *)((jump)))->Pc = (size_t)func
|
#define SETJMP_SET_IP(jump, func) ((_JUMP_BUFFER *)((jump)))->Pc = (size_t)func
|
||||||
#define SETJMP_SET_SP(jump, sp) ((_JUMP_BUFFER *)((jump)))->Sp = (size_t)sp
|
#define SETJMP_SET_SP(jump, sp) ((_JUMP_BUFFER *)((jump)))->Sp = (size_t)sp
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,5 @@
|
||||||
#include "dolphin/mtx.h"
|
#include "dolphin/mtx.h"
|
||||||
|
#include "dolphin/gx/GXPriv.h"
|
||||||
|
|
||||||
static f32 Unit01[] = { 0.0f, 1.0f };
|
static f32 Unit01[] = { 0.0f, 1.0f };
|
||||||
|
|
||||||
|
|
@ -6,17 +7,21 @@ extern f32 sinf(f32);
|
||||||
extern f32 cosf(f32);
|
extern f32 cosf(f32);
|
||||||
extern f32 tanf(f32);
|
extern f32 tanf(f32);
|
||||||
|
|
||||||
void C_MTXIdentity(Mtx mtx)
|
void C_MTXIdentity(Mtx m)
|
||||||
{
|
{
|
||||||
mtx[0][0] = 1.0f;
|
ASSERTMSGLINE(189, m, "MtxIdentity(): NULL Mtx 'm' ");
|
||||||
mtx[0][1] = 0.0f;
|
m[0][0] = 1;
|
||||||
mtx[0][2] = 0.0f;
|
m[0][1] = 0;
|
||||||
mtx[1][0] = 0.0f;
|
m[0][2] = 0;
|
||||||
mtx[1][1] = 1.0f;
|
m[0][3] = 0;
|
||||||
mtx[1][2] = 0.0f;
|
m[1][0] = 0;
|
||||||
mtx[2][0] = 0.0f;
|
m[1][1] = 1;
|
||||||
mtx[2][1] = 0.0f;
|
m[1][2] = 0;
|
||||||
mtx[2][2] = 1.0f;
|
m[1][3] = 0;
|
||||||
|
m[2][0] = 0;
|
||||||
|
m[2][1] = 0;
|
||||||
|
m[2][2] = 1;
|
||||||
|
m[2][3] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef GEKKO
|
#ifdef GEKKO
|
||||||
|
|
@ -41,27 +46,23 @@ void PSMTXIdentity(register Mtx m)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void C_MTXCopy(const Mtx src, Mtx dst)
|
void C_MTXCopy(const Mtx src, Mtx dst) {
|
||||||
{
|
ASSERTMSGLINE(250, src, "MTXCopy(): NULL MtxPtr 'src' ");
|
||||||
|
ASSERTMSGLINE(251, dst, "MTXCopy(): NULL MtxPtr 'dst' ");
|
||||||
if (src == dst) {
|
if (src != dst) {
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
dst[0][0] = src[0][0];
|
dst[0][0] = src[0][0];
|
||||||
dst[0][1] = src[0][1];
|
dst[0][1] = src[0][1];
|
||||||
dst[0][2] = src[0][2];
|
dst[0][2] = src[0][2];
|
||||||
dst[0][3] = src[0][3];
|
dst[0][3] = src[0][3];
|
||||||
|
|
||||||
dst[1][0] = src[1][0];
|
dst[1][0] = src[1][0];
|
||||||
dst[1][1] = src[1][1];
|
dst[1][1] = src[1][1];
|
||||||
dst[1][2] = src[1][2];
|
dst[1][2] = src[1][2];
|
||||||
dst[1][3] = src[1][3];
|
dst[1][3] = src[1][3];
|
||||||
|
|
||||||
dst[2][0] = src[2][0];
|
dst[2][0] = src[2][0];
|
||||||
dst[2][1] = src[2][1];
|
dst[2][1] = src[2][1];
|
||||||
dst[2][2] = src[2][2];
|
dst[2][2] = src[2][2];
|
||||||
dst[2][3] = src[2][3];
|
dst[2][3] = src[2][3];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef GEKKO
|
#ifdef GEKKO
|
||||||
|
|
@ -88,33 +89,34 @@ asm void PSMTXCopy(const register Mtx src, register Mtx dst)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void C_MTXConcat(const Mtx a, const Mtx b, Mtx ab)
|
void C_MTXConcat(const Mtx a, const Mtx b, Mtx ab) {
|
||||||
{
|
|
||||||
Mtx mTmp;
|
Mtx mTmp;
|
||||||
MtxPtr m;
|
MtxPtr m;
|
||||||
|
|
||||||
if ((ab == a) || (ab == b)) {
|
ASSERTMSGLINE(324, a, "MTXConcat(): NULL MtxPtr 'a' ");
|
||||||
m = mTmp;
|
ASSERTMSGLINE(325, b, "MTXConcat(): NULL MtxPtr 'b' ");
|
||||||
}
|
ASSERTMSGLINE(326, ab, "MTXConcat(): NULL MtxPtr 'ab' ");
|
||||||
|
|
||||||
else {
|
if (ab == a || ab == b) {
|
||||||
|
m = mTmp;
|
||||||
|
} else {
|
||||||
m = ab;
|
m = ab;
|
||||||
}
|
}
|
||||||
|
|
||||||
m[0][0] = a[0][0] * b[0][0] + a[0][1] * b[1][0] + a[0][2] * b[2][0];
|
m[0][0] = 0 + a[0][2] * b[2][0] + ((a[0][0] * b[0][0]) + (a[0][1] * b[1][0]));
|
||||||
m[0][1] = a[0][0] * b[0][1] + a[0][1] * b[1][1] + a[0][2] * b[2][1];
|
m[0][1] = 0 + a[0][2] * b[2][1] + ((a[0][0] * b[0][1]) + (a[0][1] * b[1][1]));
|
||||||
m[0][2] = a[0][0] * b[0][2] + a[0][1] * b[1][2] + a[0][2] * b[2][2];
|
m[0][2] = 0 + a[0][2] * b[2][2] + ((a[0][0] * b[0][2]) + (a[0][1] * b[1][2]));
|
||||||
m[0][3] = a[0][0] * b[0][3] + a[0][1] * b[1][3] + a[0][2] * b[2][3] + a[0][3];
|
m[0][3] = a[0][3] + (a[0][2] * b[2][3] + (a[0][0] * b[0][3] + (a[0][1] * b[1][3])));
|
||||||
|
|
||||||
m[1][0] = a[1][0] * b[0][0] + a[1][1] * b[1][0] + a[1][2] * b[2][0];
|
m[1][0] = 0 + a[1][2] * b[2][0] + ((a[1][0] * b[0][0]) + (a[1][1] * b[1][0]));
|
||||||
m[1][1] = a[1][0] * b[0][1] + a[1][1] * b[1][1] + a[1][2] * b[2][1];
|
m[1][1] = 0 + a[1][2] * b[2][1] + ((a[1][0] * b[0][1]) + (a[1][1] * b[1][1]));
|
||||||
m[1][2] = a[1][0] * b[0][2] + a[1][1] * b[1][2] + a[1][2] * b[2][2];
|
m[1][2] = 0 + a[1][2] * b[2][2] + ((a[1][0] * b[0][2]) + (a[1][1] * b[1][2]));
|
||||||
m[1][3] = a[1][0] * b[0][3] + a[1][1] * b[1][3] + a[1][2] * b[2][3] + a[1][3];
|
m[1][3] = a[1][3] + (a[1][2] * b[2][3] + (a[1][0] * b[0][3] + (a[1][1] * b[1][3])));
|
||||||
|
|
||||||
m[2][0] = a[2][0] * b[0][0] + a[2][1] * b[1][0] + a[2][2] * b[2][0];
|
m[2][0] = 0 + a[2][2] * b[2][0] + ((a[2][0] * b[0][0]) + (a[2][1] * b[1][0]));
|
||||||
m[2][1] = a[2][0] * b[0][1] + a[2][1] * b[1][1] + a[2][2] * b[2][1];
|
m[2][1] = 0 + a[2][2] * b[2][1] + ((a[2][0] * b[0][1]) + (a[2][1] * b[1][1]));
|
||||||
m[2][2] = a[2][0] * b[0][2] + a[2][1] * b[1][2] + a[2][2] * b[2][2];
|
m[2][2] = 0 + a[2][2] * b[2][2] + ((a[2][0] * b[0][2]) + (a[2][1] * b[1][2]));
|
||||||
m[2][3] = a[2][0] * b[0][3] + a[2][1] * b[1][3] + a[2][2] * b[2][3] + a[2][3];
|
m[2][3] = a[2][3] + (a[2][2] * b[2][3] + (a[2][0] * b[0][3] + (a[2][1] * b[1][3])));
|
||||||
|
|
||||||
if (m == mTmp) {
|
if (m == mTmp) {
|
||||||
C_MTXCopy(mTmp, ab);
|
C_MTXCopy(mTmp, ab);
|
||||||
|
|
@ -222,12 +224,16 @@ asm void PSMTXConcat(const register Mtx mA, const register Mtx mB, register Mtx
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void C_MTXConcatArray(const Mtx a, const Mtx *srcBase, Mtx *dstBase, u32 count)
|
void C_MTXConcatArray(const Mtx a, const Mtx* srcBase, Mtx* dstBase, u32 count) {
|
||||||
{
|
|
||||||
u32 i;
|
u32 i;
|
||||||
|
|
||||||
|
ASSERTMSGLINE(580, a != 0, "MTXConcatArray(): NULL MtxPtr 'a' ");
|
||||||
|
ASSERTMSGLINE(581, srcBase != 0, "MTXConcatArray(): NULL MtxPtr 'srcBase' ");
|
||||||
|
ASSERTMSGLINE(582, dstBase != 0, "MTXConcatArray(): NULL MtxPtr 'dstBase' ");
|
||||||
|
ASSERTMSGLINE(583, count > 1, "MTXConcatArray(): count must be greater than 1.");
|
||||||
|
|
||||||
for (i = 0; i < count; i++) {
|
for (i = 0; i < count; i++) {
|
||||||
C_MTXConcat(a, *srcBase, *dstBase);
|
C_MTXConcat(a, *srcBase, *dstBase);
|
||||||
|
|
||||||
srcBase++;
|
srcBase++;
|
||||||
dstBase++;
|
dstBase++;
|
||||||
}
|
}
|
||||||
|
|
@ -351,31 +357,31 @@ _loop:
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void C_MTXTranspose(const Mtx src, Mtx xPose)
|
void C_MTXTranspose(const Mtx src, Mtx xPose) {
|
||||||
{
|
|
||||||
Mtx mTmp;
|
Mtx mTmp;
|
||||||
MtxPtr m;
|
MtxPtr m;
|
||||||
|
|
||||||
|
ASSERTMSGLINE(851, src, "MTXTranspose(): NULL MtxPtr 'src' ");
|
||||||
|
ASSERTMSGLINE(852, xPose, "MTXTranspose(): NULL MtxPtr 'xPose' ");
|
||||||
|
|
||||||
if (src == xPose) {
|
if (src == xPose) {
|
||||||
m = mTmp;
|
m = mTmp;
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
m = xPose;
|
m = xPose;
|
||||||
}
|
}
|
||||||
|
|
||||||
m[0][0] = src[0][0];
|
m[0][0] = src[0][0];
|
||||||
m[0][1] = src[1][0];
|
m[0][1] = src[1][0];
|
||||||
m[0][2] = src[2][0];
|
m[0][2] = src[2][0];
|
||||||
m[0][3] = 0.0f;
|
m[0][3] = 0;
|
||||||
m[1][0] = src[0][1];
|
m[1][0] = src[0][1];
|
||||||
m[1][1] = src[1][1];
|
m[1][1] = src[1][1];
|
||||||
m[1][2] = src[2][1];
|
m[1][2] = src[2][1];
|
||||||
m[1][3] = 0.0f;
|
m[1][3] = 0;
|
||||||
m[2][0] = src[0][2];
|
m[2][0] = src[0][2];
|
||||||
m[2][1] = src[1][2];
|
m[2][1] = src[1][2];
|
||||||
m[2][2] = src[2][2];
|
m[2][2] = src[2][2];
|
||||||
m[2][3] = 0.0f;
|
m[2][3] = 0;
|
||||||
|
|
||||||
if (m == mTmp) {
|
if (m == mTmp) {
|
||||||
C_MTXCopy(mTmp, xPose);
|
C_MTXCopy(mTmp, xPose);
|
||||||
}
|
}
|
||||||
|
|
@ -413,48 +419,48 @@ void PSMTXTranspose(const register Mtx src, register Mtx xPose)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
u32 C_MTXInverse(const Mtx src, Mtx inv)
|
u32 C_MTXInverse(const Mtx src, Mtx inv) {
|
||||||
{
|
|
||||||
Mtx mTmp;
|
Mtx mTmp;
|
||||||
MtxPtr m;
|
MtxPtr m;
|
||||||
f32 det;
|
f32 det;
|
||||||
|
|
||||||
|
ASSERTMSGLINE(950, src, "MTXInverse(): NULL MtxPtr 'src' ");
|
||||||
|
ASSERTMSGLINE(951, inv, "MTXInverse(): NULL MtxPtr 'inv' ");
|
||||||
|
|
||||||
if (src == inv) {
|
if (src == inv) {
|
||||||
m = mTmp;
|
m = mTmp;
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
m = inv;
|
m = inv;
|
||||||
}
|
}
|
||||||
|
det = ((((src[2][1] * (src[0][2] * src[1][0]))
|
||||||
det = src[0][0] * src[1][1] * src[2][2] + src[0][1] * src[1][2] * src[2][0] + src[0][2] * src[1][0] * src[2][1]
|
+ ((src[2][2] * (src[0][0] * src[1][1]))
|
||||||
- src[2][0] * src[1][1] * src[0][2] - src[1][0] * src[0][1] * src[2][2] - src[0][0] * src[2][1] * src[1][2];
|
+ (src[2][0] * (src[0][1] * src[1][2]))))
|
||||||
|
- (src[0][2] * (src[2][0] * src[1][1])))
|
||||||
if (det == 0.0f) {
|
- (src[2][2] * (src[1][0] * src[0][1])))
|
||||||
|
- (src[1][2] * (src[0][0] * src[2][1]));
|
||||||
|
if (0 == det) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
det = 1 / det;
|
||||||
|
m[0][0] = (det * +((src[1][1] * src[2][2]) - (src[2][1] * src[1][2])));
|
||||||
|
m[0][1] = (det * -((src[0][1] * src[2][2]) - (src[2][1] * src[0][2])));
|
||||||
|
m[0][2] = (det * +((src[0][1] * src[1][2]) - (src[1][1] * src[0][2])));
|
||||||
|
|
||||||
det = 1.0f / det;
|
m[1][0] = (det * -((src[1][0] * src[2][2]) - (src[2][0] * src[1][2])));
|
||||||
|
m[1][1] = (det * +((src[0][0] * src[2][2]) - (src[2][0] * src[0][2])));
|
||||||
|
m[1][2] = (det * -((src[0][0] * src[1][2]) - (src[1][0] * src[0][2])));
|
||||||
|
|
||||||
m[0][0] = (src[1][1] * src[2][2] - src[2][1] * src[1][2]) * det;
|
m[2][0] = (det * +((src[1][0] * src[2][1]) - (src[2][0] * src[1][1])));
|
||||||
m[0][1] = -(src[0][1] * src[2][2] - src[2][1] * src[0][2]) * det;
|
m[2][1] = (det * -((src[0][0] * src[2][1]) - (src[2][0] * src[0][1])));
|
||||||
m[0][2] = (src[0][1] * src[1][2] - src[1][1] * src[0][2]) * det;
|
m[2][2] = (det * +((src[0][0] * src[1][1]) - (src[1][0] * src[0][1])));
|
||||||
|
|
||||||
m[1][0] = -(src[1][0] * src[2][2] - src[2][0] * src[1][2]) * det;
|
m[0][3] = ((-m[0][0] * src[0][3]) - (m[0][1] * src[1][3])) - (m[0][2] * src[2][3]);
|
||||||
m[1][1] = (src[0][0] * src[2][2] - src[2][0] * src[0][2]) * det;
|
m[1][3] = ((-m[1][0] * src[0][3]) - (m[1][1] * src[1][3])) - (m[1][2] * src[2][3]);
|
||||||
m[1][2] = -(src[0][0] * src[1][2] - src[1][0] * src[0][2]) * det;
|
m[2][3] = ((-m[2][0] * src[0][3]) - (m[2][1] * src[1][3])) - (m[2][2] * src[2][3]);
|
||||||
|
|
||||||
m[2][0] = (src[1][0] * src[2][1] - src[2][0] * src[1][1]) * det;
|
|
||||||
m[2][1] = -(src[0][0] * src[2][1] - src[2][0] * src[0][1]) * det;
|
|
||||||
m[2][2] = (src[0][0] * src[1][1] - src[1][0] * src[0][1]) * det;
|
|
||||||
|
|
||||||
m[0][3] = -m[0][0] * src[0][3] - m[0][1] * src[1][3] - m[0][2] * src[2][3];
|
|
||||||
m[1][3] = -m[1][0] * src[0][3] - m[1][1] * src[1][3] - m[1][2] * src[2][3];
|
|
||||||
m[2][3] = -m[2][0] * src[0][3] - m[2][1] * src[1][3] - m[2][2] * src[2][3];
|
|
||||||
|
|
||||||
if (m == mTmp) {
|
if (m == mTmp) {
|
||||||
C_MTXCopy(mTmp, inv);
|
C_MTXCopy(mTmp, inv);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -531,48 +537,48 @@ _regular:
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
u32 C_MTXInvXpose(const Mtx src, Mtx invX)
|
u32 C_MTXInvXpose(const Mtx src, Mtx invX) {
|
||||||
{
|
|
||||||
Mtx mTmp;
|
Mtx mTmp;
|
||||||
MtxPtr m;
|
MtxPtr m;
|
||||||
f32 det;
|
f32 det;
|
||||||
|
|
||||||
|
ASSERTMSGLINE(1185, src, "MTXInvXpose(): NULL MtxPtr 'src' ");
|
||||||
|
ASSERTMSGLINE(1186, invX, "MTXInvXpose(): NULL MtxPtr 'invX' ");
|
||||||
|
|
||||||
if (src == invX) {
|
if (src == invX) {
|
||||||
m = mTmp;
|
m = mTmp;
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
m = invX;
|
m = invX;
|
||||||
}
|
}
|
||||||
|
det = ((((src[2][1] * (src[0][2] * src[1][0]))
|
||||||
det = src[0][0] * src[1][1] * src[2][2] + src[0][1] * src[1][2] * src[2][0] + src[0][2] * src[1][0] * src[2][1]
|
+ ((src[2][2] * (src[0][0] * src[1][1]))
|
||||||
- src[2][0] * src[1][1] * src[0][2] - src[1][0] * src[0][1] * src[2][2] - src[0][0] * src[2][1] * src[1][2];
|
+ (src[2][0] * (src[0][1] * src[1][2]))))
|
||||||
|
- (src[0][2] * (src[2][0] * src[1][1])))
|
||||||
if (det == 0.0f) {
|
- (src[2][2] * (src[1][0] * src[0][1])))
|
||||||
|
- (src[1][2] * (src[0][0] * src[2][1]));
|
||||||
|
if (0 == det) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
det = 1 / det;
|
||||||
|
m[0][0] = (det * +((src[1][1] * src[2][2]) - (src[2][1] * src[1][2])));
|
||||||
|
m[0][1] = (det * -((src[1][0] * src[2][2]) - (src[2][0] * src[1][2])));
|
||||||
|
m[0][2] = (det * +((src[1][0] * src[2][1]) - (src[2][0] * src[1][1])));
|
||||||
|
|
||||||
det = 1.0f / det;
|
m[1][0] = (det * -((src[0][1] * src[2][2]) - (src[2][1] * src[0][2])));
|
||||||
|
m[1][1] = (det * +((src[0][0] * src[2][2]) - (src[2][0] * src[0][2])));
|
||||||
|
m[1][2] = (det * -((src[0][0] * src[2][1]) - (src[2][0] * src[0][1])));
|
||||||
|
|
||||||
m[0][0] = (src[1][1] * src[2][2] - src[2][1] * src[1][2]) * det;
|
m[2][0] = (det * +((src[0][1] * src[1][2]) - (src[1][1] * src[0][2])));
|
||||||
m[0][1] = -(src[1][0] * src[2][2] - src[2][0] * src[1][2]) * det;
|
m[2][1] = (det * -((src[0][0] * src[1][2]) - (src[1][0] * src[0][2])));
|
||||||
m[0][2] = (src[1][0] * src[2][1] - src[2][0] * src[1][1]) * det;
|
m[2][2] = (det * +((src[0][0] * src[1][1]) - (src[1][0] * src[0][1])));
|
||||||
|
|
||||||
m[1][0] = -(src[0][1] * src[2][2] - src[2][1] * src[0][2]) * det;
|
m[0][3] = 0;
|
||||||
m[1][1] = (src[0][0] * src[2][2] - src[2][0] * src[0][2]) * det;
|
m[1][3] = 0;
|
||||||
m[1][2] = -(src[0][0] * src[2][1] - src[2][0] * src[0][1]) * det;
|
m[2][3] = 0;
|
||||||
|
|
||||||
m[2][0] = (src[0][1] * src[1][2] - src[1][1] * src[0][2]) * det;
|
|
||||||
m[2][1] = -(src[0][0] * src[1][2] - src[1][0] * src[0][2]) * det;
|
|
||||||
m[2][2] = (src[0][0] * src[1][1] - src[1][0] * src[0][1]) * det;
|
|
||||||
|
|
||||||
m[0][3] = 0.0F;
|
|
||||||
m[1][3] = 0.0F;
|
|
||||||
m[2][3] = 0.0F;
|
|
||||||
|
|
||||||
if (m == mTmp) {
|
if (m == mTmp) {
|
||||||
C_MTXCopy(mTmp, invX);
|
C_MTXCopy(mTmp, invX);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -638,10 +644,11 @@ _regular:
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void C_MTXRotRad(Mtx m, char axis, f32 rad)
|
void C_MTXRotRad(Mtx m, char axis, f32 rad) {
|
||||||
{
|
f32 sinA;
|
||||||
|
f32 cosA;
|
||||||
|
|
||||||
f32 sinA, cosA;
|
ASSERTMSGLINE(1447, m, "MTXRotRad(): NULL MtxPtr 'm' ");
|
||||||
sinA = sinf(rad);
|
sinA = sinf(rad);
|
||||||
cosA = cosf(rad);
|
cosA = cosf(rad);
|
||||||
C_MTXRotTrig(m, axis, sinA, cosA);
|
C_MTXRotTrig(m, axis, sinA, cosA);
|
||||||
|
|
@ -659,59 +666,56 @@ void PSMTXRotRad(Mtx m, char axis, f32 rad)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void C_MTXRotTrig(Mtx m, char axis, f32 sinA, f32 cosA)
|
void C_MTXRotTrig(Mtx m, char axis, f32 sinA, f32 cosA) {
|
||||||
{
|
ASSERTMSGLINE(1502, m, "MTXRotTrig(): NULL MtxPtr 'm' ");
|
||||||
switch (axis) {
|
switch(axis) {
|
||||||
|
|
||||||
case 'x':
|
case 'x':
|
||||||
case 'X':
|
case 'X':
|
||||||
m[0][0] = 1.0f;
|
m[0][0] = 1;
|
||||||
m[0][1] = 0.0f;
|
m[0][1] = 0;
|
||||||
m[0][2] = 0.0f;
|
m[0][2] = 0;
|
||||||
m[0][3] = 0.0f;
|
m[0][3] = 0;
|
||||||
m[1][0] = 0.0f;
|
m[1][0] = 0;
|
||||||
m[1][1] = cosA;
|
m[1][1] = cosA;
|
||||||
m[1][2] = -sinA;
|
m[1][2] = -sinA;
|
||||||
m[1][3] = 0.0f;
|
m[1][3] = 0;
|
||||||
m[2][0] = 0.0f;
|
m[2][0] = 0;
|
||||||
m[2][1] = sinA;
|
m[2][1] = sinA;
|
||||||
m[2][2] = cosA;
|
m[2][2] = cosA;
|
||||||
m[2][3] = 0.0f;
|
m[2][3] = 0;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'y':
|
case 'y':
|
||||||
case 'Y':
|
case 'Y':
|
||||||
m[0][0] = cosA;
|
m[0][0] = cosA;
|
||||||
m[0][1] = 0.0f;
|
m[0][1] = 0;
|
||||||
m[0][2] = sinA;
|
m[0][2] = sinA;
|
||||||
m[0][3] = 0.0f;
|
m[0][3] = 0;
|
||||||
m[1][0] = 0.0f;
|
m[1][0] = 0;
|
||||||
m[1][1] = 1.0f;
|
m[1][1] = 1;
|
||||||
m[1][2] = 0.0f;
|
m[1][2] = 0;
|
||||||
m[1][3] = 0.0f;
|
m[1][3] = 0;
|
||||||
m[2][0] = -sinA;
|
m[2][0] = -sinA;
|
||||||
m[2][1] = 0.0f;
|
m[2][1] = 0;
|
||||||
m[2][2] = cosA;
|
m[2][2] = cosA;
|
||||||
m[2][3] = 0.0f;
|
m[2][3] = 0;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'z':
|
case 'z':
|
||||||
case 'Z':
|
case 'Z':
|
||||||
m[0][0] = cosA;
|
m[0][0] = cosA;
|
||||||
m[0][1] = -sinA;
|
m[0][1] = -sinA;
|
||||||
m[0][2] = 0.0f;
|
m[0][2] = 0;
|
||||||
m[0][3] = 0.0f;
|
m[0][3] = 0;
|
||||||
m[1][0] = sinA;
|
m[1][0] = sinA;
|
||||||
m[1][1] = cosA;
|
m[1][1] = cosA;
|
||||||
m[1][2] = 0.0f;
|
m[1][2] = 0;
|
||||||
m[1][3] = 0.0f;
|
m[1][3] = 0;
|
||||||
m[2][0] = 0.0f;
|
m[2][0] = 0;
|
||||||
m[2][1] = 0.0f;
|
m[2][1] = 0;
|
||||||
m[2][2] = 1.0f;
|
m[2][2] = 1;
|
||||||
m[2][3] = 0.0f;
|
m[2][3] = 0;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
ASSERTMSGLINE(1529, FALSE, "MTXRotTrig(): invalid 'axis' value ");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -780,42 +784,43 @@ _end:
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void C_MTXRotAxisRad(Mtx m, const Vec *axis, f32 rad)
|
void C_MTXRotAxisRad(Mtx m, const Vec* axis, f32 rad) {
|
||||||
{
|
|
||||||
Vec vN;
|
Vec vN;
|
||||||
f32 s, c;
|
f32 s;
|
||||||
|
f32 c;
|
||||||
f32 t;
|
f32 t;
|
||||||
f32 x, y, z;
|
f32 x;
|
||||||
f32 xSq, ySq, zSq;
|
f32 y;
|
||||||
|
f32 z;
|
||||||
|
f32 xSq;
|
||||||
|
f32 ySq;
|
||||||
|
f32 zSq;
|
||||||
|
|
||||||
|
ASSERTMSGLINE(1677, m, "MTXRotAxisRad(): NULL MtxPtr 'm' ");
|
||||||
|
ASSERTMSGLINE(1678, axis, "MTXRotAxisRad(): NULL VecPtr 'axis' ");
|
||||||
|
|
||||||
s = sinf(rad);
|
s = sinf(rad);
|
||||||
c = cosf(rad);
|
c = cosf(rad);
|
||||||
t = 1.0f - c;
|
t = 1 - c;
|
||||||
|
|
||||||
C_VECNormalize(axis, &vN);
|
C_VECNormalize(axis, &vN);
|
||||||
|
|
||||||
x = vN.x;
|
x = vN.x;
|
||||||
y = vN.y;
|
y = vN.y;
|
||||||
z = vN.z;
|
z = vN.z;
|
||||||
|
xSq = (x * x);
|
||||||
xSq = x * x;
|
ySq = (y * y);
|
||||||
ySq = y * y;
|
zSq = (z * z);
|
||||||
zSq = z * z;
|
m[0][0] = (c + (t * xSq));
|
||||||
|
m[0][1] = (y * (t * x)) - (s * z);
|
||||||
m[0][0] = (t * xSq) + (c);
|
m[0][2] = (z * (t * x)) + (s * y);
|
||||||
m[0][1] = (t * x * y) - (s * z);
|
m[0][3] = 0;
|
||||||
m[0][2] = (t * x * z) + (s * y);
|
m[1][0] = ((y * (t * x)) + (s * z));
|
||||||
m[0][3] = 0.0f;
|
m[1][1] = (c + (t * ySq));
|
||||||
|
m[1][2] = ((z * (t * y)) - (s * x));
|
||||||
m[1][0] = (t * x * y) + (s * z);
|
m[1][3] = 0;
|
||||||
m[1][1] = (t * ySq) + (c);
|
m[2][0] = ((z * (t * x)) - (s * y));
|
||||||
m[1][2] = (t * y * z) - (s * x);
|
m[2][1] = ((z * (t * y)) + (s * x));
|
||||||
m[1][3] = 0.0f;
|
m[2][2] = (c + (t * zSq));
|
||||||
|
m[2][3] = 0;
|
||||||
m[2][0] = (t * x * z) - (s * y);
|
|
||||||
m[2][1] = (t * y * z) + (s * x);
|
|
||||||
m[2][2] = (t * zSq) + (c);
|
|
||||||
m[2][3] = 0.0f;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef GEKKO
|
#ifdef GEKKO
|
||||||
|
|
@ -875,19 +880,19 @@ void PSMTXRotAxisRad(register Mtx m, const Vec *axis, register f32 rad)
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void C_MTXTrans(Mtx m, f32 xT, f32 yT, f32 zT)
|
void C_MTXTrans(Mtx m, f32 xT, f32 yT, f32 zT) {
|
||||||
{
|
ASSERTMSGLINE(1866, m, "MTXTrans(): NULL MtxPtr 'm' ");
|
||||||
m[0][0] = 1.0f;
|
m[0][0] = 1;
|
||||||
m[0][1] = 0.0f;
|
m[0][1] = 0;
|
||||||
m[0][2] = 0.0f;
|
m[0][2] = 0;
|
||||||
m[0][3] = xT;
|
m[0][3] = xT;
|
||||||
m[1][0] = 0.0f;
|
m[1][0] = 0;
|
||||||
m[1][1] = 1.0f;
|
m[1][1] = 1;
|
||||||
m[1][2] = 0.0f;
|
m[1][2] = 0;
|
||||||
m[1][3] = yT;
|
m[1][3] = yT;
|
||||||
m[2][0] = 0.0f;
|
m[2][0] = 0;
|
||||||
m[2][1] = 0.0f;
|
m[2][1] = 0;
|
||||||
m[2][2] = 1.0f;
|
m[2][2] = 1;
|
||||||
m[2][3] = zT;
|
m[2][3] = zT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -914,8 +919,10 @@ void PSMTXTrans(register Mtx m, register f32 xT, register f32 yT, register f32 z
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void C_MTXTransApply(const Mtx src, Mtx dst, f32 xT, f32 yT, f32 zT)
|
void C_MTXTransApply(const Mtx src, Mtx dst, f32 xT, f32 yT, f32 zT) {
|
||||||
{
|
ASSERTMSGLINE(1933, src, "MTXTransApply(): NULL MtxPtr 'src' ");
|
||||||
|
ASSERTMSGLINE(1934, dst, "MTXTransApply(): NULL MtxPtr 'src' "); //! wrong assert string
|
||||||
|
|
||||||
if (src != dst) {
|
if (src != dst) {
|
||||||
dst[0][0] = src[0][0];
|
dst[0][0] = src[0][0];
|
||||||
dst[0][1] = src[0][1];
|
dst[0][1] = src[0][1];
|
||||||
|
|
@ -928,9 +935,9 @@ void C_MTXTransApply(const Mtx src, Mtx dst, f32 xT, f32 yT, f32 zT)
|
||||||
dst[2][2] = src[2][2];
|
dst[2][2] = src[2][2];
|
||||||
}
|
}
|
||||||
|
|
||||||
dst[0][3] = src[0][3] + xT;
|
dst[0][3] = (src[0][3] + xT);
|
||||||
dst[1][3] = src[1][3] + yT;
|
dst[1][3] = (src[1][3] + yT);
|
||||||
dst[2][3] = src[2][3] + zT;
|
dst[2][3] = (src[2][3] + zT);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef GEKKO
|
#ifdef GEKKO
|
||||||
|
|
@ -961,20 +968,20 @@ asm void PSMTXTransApply(const register Mtx src, register Mtx dst, register f32
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void C_MTXScale(Mtx m, f32 xS, f32 yS, f32 zS)
|
void C_MTXScale(Mtx m, f32 xS, f32 yS, f32 zS) {
|
||||||
{
|
ASSERTMSGLINE(2008, m, "MTXScale(): NULL MtxPtr 'm' ");
|
||||||
m[0][0] = xS;
|
m[0][0] = xS;
|
||||||
m[0][1] = 0.0f;
|
m[0][1] = 0;
|
||||||
m[0][2] = 0.0f;
|
m[0][2] = 0;
|
||||||
m[0][3] = 0.0f;
|
m[0][3] = 0;
|
||||||
m[1][0] = 0.0f;
|
m[1][0] = 0;
|
||||||
m[1][1] = yS;
|
m[1][1] = yS;
|
||||||
m[1][2] = 0.0f;
|
m[1][2] = 0;
|
||||||
m[1][3] = 0.0f;
|
m[1][3] = 0;
|
||||||
m[2][0] = 0.0f;
|
m[2][0] = 0;
|
||||||
m[2][1] = 0.0f;
|
m[2][1] = 0;
|
||||||
m[2][2] = zS;
|
m[2][2] = zS;
|
||||||
m[2][3] = 0.0f;
|
m[2][3] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef GEKKO
|
#ifdef GEKKO
|
||||||
|
|
@ -997,22 +1004,21 @@ void PSMTXScale(register Mtx m, register f32 xS, register f32 yS, register f32 z
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void C_MTXScaleApply(const Mtx src, Mtx dst, f32 xS, f32 yS, f32 zS)
|
void C_MTXScaleApply(const Mtx src, Mtx dst, f32 xS, f32 yS, f32 zS) {
|
||||||
{
|
ASSERTMSGLINE(2070, src, "MTXScaleApply(): NULL MtxPtr 'src' ");
|
||||||
dst[0][0] = src[0][0] * xS;
|
ASSERTMSGLINE(2071, dst, "MTXScaleApply(): NULL MtxPtr 'dst' ");
|
||||||
dst[0][1] = src[0][1] * xS;
|
dst[0][0] = (src[0][0] * xS);
|
||||||
dst[0][2] = src[0][2] * xS;
|
dst[0][1] = (src[0][1] * xS);
|
||||||
dst[0][3] = src[0][3] * xS;
|
dst[0][2] = (src[0][2] * xS);
|
||||||
|
dst[0][3] = (src[0][3] * xS);
|
||||||
dst[1][0] = src[1][0] * yS;
|
dst[1][0] = (src[1][0] * yS);
|
||||||
dst[1][1] = src[1][1] * yS;
|
dst[1][1] = (src[1][1] * yS);
|
||||||
dst[1][2] = src[1][2] * yS;
|
dst[1][2] = (src[1][2] * yS);
|
||||||
dst[1][3] = src[1][3] * yS;
|
dst[1][3] = (src[1][3] * yS);
|
||||||
|
dst[2][0] = (src[2][0] * zS);
|
||||||
dst[2][0] = src[2][0] * zS;
|
dst[2][1] = (src[2][1] * zS);
|
||||||
dst[2][1] = src[2][1] * zS;
|
dst[2][2] = (src[2][2] * zS);
|
||||||
dst[2][2] = src[2][2] * zS;
|
dst[2][3] = (src[2][3] * zS);
|
||||||
dst[2][3] = src[2][3] * zS;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef GEKKO
|
#ifdef GEKKO
|
||||||
|
|
@ -1046,12 +1052,25 @@ asm void PSMTXScaleApply(const register Mtx src, register Mtx dst, register f32
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void C_MTXQuat(Mtx m, const Quaternion *q)
|
void C_MTXQuat(Mtx m, const Quaternion* q) {
|
||||||
{
|
f32 s;
|
||||||
|
f32 xs;
|
||||||
f32 s, xs, ys, zs, wx, wy, wz, xx, xy, xz, yy, yz, zz;
|
f32 ys;
|
||||||
s = 2.0f / ((q->x * q->x) + (q->y * q->y) + (q->z * q->z) + (q->w * q->w));
|
f32 zs;
|
||||||
|
f32 wx;
|
||||||
|
f32 wy;
|
||||||
|
f32 wz;
|
||||||
|
f32 xx;
|
||||||
|
f32 xy;
|
||||||
|
f32 xz;
|
||||||
|
f32 yy;
|
||||||
|
f32 yz;
|
||||||
|
f32 zz;
|
||||||
|
|
||||||
|
ASSERTMSGLINE(2145, m, "MTXQuat(): NULL MtxPtr 'm' ");
|
||||||
|
ASSERTMSGLINE(2146, q, "MTXQuat(): NULL QuaternionPtr 'q' ");
|
||||||
|
ASSERTMSGLINE(2147, q->x || q->y || q->z || q->w, "MTXQuat(): zero-value quaternion ");
|
||||||
|
s = 2 / ((q->w * q->w) + ((q->z * q->z) + ((q->x * q->x) + (q->y * q->y))));
|
||||||
xs = q->x * s;
|
xs = q->x * s;
|
||||||
ys = q->y * s;
|
ys = q->y * s;
|
||||||
zs = q->z * s;
|
zs = q->z * s;
|
||||||
|
|
@ -1064,21 +1083,18 @@ void C_MTXQuat(Mtx m, const Quaternion *q)
|
||||||
yy = q->y * ys;
|
yy = q->y * ys;
|
||||||
yz = q->y * zs;
|
yz = q->y * zs;
|
||||||
zz = q->z * zs;
|
zz = q->z * zs;
|
||||||
|
m[0][0] = (1 - (yy + zz));
|
||||||
m[0][0] = 1.0f - (yy + zz);
|
m[0][1] = (xy - wz);
|
||||||
m[0][1] = xy - wz;
|
m[0][2] = (xz + wy);
|
||||||
m[0][2] = xz + wy;
|
m[0][3] = 0;
|
||||||
m[0][3] = 0.0f;
|
m[1][0] = (xy + wz);
|
||||||
|
m[1][1] = (1 - (xx + zz));
|
||||||
m[1][0] = xy + wz;
|
m[1][2] = (yz - wx);
|
||||||
m[1][1] = 1.0f - (xx + zz);
|
m[1][3] = 0;
|
||||||
m[1][2] = yz - wx;
|
m[2][0] = (xz - wy);
|
||||||
m[1][3] = 0.0f;
|
m[2][1] = (yz + wx);
|
||||||
|
m[2][2] = (1 - (xx + yy));
|
||||||
m[2][0] = xz - wy;
|
m[2][3] = 0;
|
||||||
m[2][1] = yz + wx;
|
|
||||||
m[2][2] = 1.0f - (xx + yy);
|
|
||||||
m[2][3] = 0.0f;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef GEKKO
|
#ifdef GEKKO
|
||||||
|
|
@ -1136,29 +1152,28 @@ void PSMTXQuat(register Mtx m, const register Quaternion *q)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void C_MTXReflect(Mtx m, const Vec *p, const Vec *n)
|
void C_MTXReflect(Mtx m, const Vec* p, const Vec* n) {
|
||||||
{
|
f32 vxy;
|
||||||
f32 vxy, vxz, vyz, pdotn;
|
f32 vxz;
|
||||||
|
f32 vyz;
|
||||||
|
f32 pdotn;
|
||||||
|
|
||||||
vxy = -2.0f * n->x * n->y;
|
vxy = -2 * n->x * n->y;
|
||||||
vxz = -2.0f * n->x * n->z;
|
vxz = -2 * n->x * n->z;
|
||||||
vyz = -2.0f * n->y * n->z;
|
vyz = -2 * n->y * n->z;
|
||||||
pdotn = 2.0f * C_VECDotProduct(p, n);
|
pdotn = 2 * C_VECDotProduct(p, n);
|
||||||
|
m[0][0] = (1 - (2 * n->x * n->x));
|
||||||
m[0][0] = 1.0f - 2.0f * n->x * n->x;
|
|
||||||
m[0][1] = vxy;
|
m[0][1] = vxy;
|
||||||
m[0][2] = vxz;
|
m[0][2] = vxz;
|
||||||
m[0][3] = pdotn * n->x;
|
m[0][3] = (pdotn * n->x);
|
||||||
|
|
||||||
m[1][0] = vxy;
|
m[1][0] = vxy;
|
||||||
m[1][1] = 1.0f - 2.0f * n->y * n->y;
|
m[1][1] = (1 - (2 * n->y * n->y));
|
||||||
m[1][2] = vyz;
|
m[1][2] = vyz;
|
||||||
m[1][3] = pdotn * n->y;
|
m[1][3] = (pdotn * n->y);
|
||||||
|
|
||||||
m[2][0] = vxz;
|
m[2][0] = vxz;
|
||||||
m[2][1] = vyz;
|
m[2][1] = vyz;
|
||||||
m[2][2] = 1.0f - 2.0f * n->z * n->z;
|
m[2][2] = (1 - (2 * n->z * n->z));
|
||||||
m[2][3] = pdotn * n->z;
|
m[2][3] = (pdotn * n->z);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef GEKKO
|
#ifdef GEKKO
|
||||||
|
|
@ -1202,9 +1217,15 @@ void PSMTXReflect(register Mtx m, const register Vec *p, const register Vec *n)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void C_MTXLookAt(Mtx m, const Vec *camPos, const Vec *camUp, const Vec *target)
|
void C_MTXLookAt(Mtx m, const Point3d* camPos, const Vec* camUp, const Point3d* target) {
|
||||||
{
|
Vec vLook;
|
||||||
Vec vLook, vRight, vUp;
|
Vec vRight;
|
||||||
|
Vec vUp;
|
||||||
|
|
||||||
|
ASSERTMSGLINE(2438, m, "MTXLookAt(): NULL MtxPtr 'm' ");
|
||||||
|
ASSERTMSGLINE(2439, camPos, "MTXLookAt(): NULL VecPtr 'camPos' ");
|
||||||
|
ASSERTMSGLINE(2440, camUp, "MTXLookAt(): NULL VecPtr 'camUp' ");
|
||||||
|
ASSERTMSGLINE(2441, target, "MTXLookAt(): NULL Point3dPtr 'target' ");
|
||||||
|
|
||||||
vLook.x = camPos->x - target->x;
|
vLook.x = camPos->x - target->x;
|
||||||
vLook.y = camPos->y - target->y;
|
vLook.y = camPos->y - target->y;
|
||||||
|
|
@ -1213,90 +1234,88 @@ void C_MTXLookAt(Mtx m, const Vec *camPos, const Vec *camUp, const Vec *target)
|
||||||
VECCrossProduct(camUp, &vLook, &vRight);
|
VECCrossProduct(camUp, &vLook, &vRight);
|
||||||
VECNormalize(&vRight, &vRight);
|
VECNormalize(&vRight, &vRight);
|
||||||
VECCrossProduct(&vLook, &vRight, &vUp);
|
VECCrossProduct(&vLook, &vRight, &vUp);
|
||||||
|
|
||||||
m[0][0] = vRight.x;
|
m[0][0] = vRight.x;
|
||||||
m[0][1] = vRight.y;
|
m[0][1] = vRight.y;
|
||||||
m[0][2] = vRight.z;
|
m[0][2] = vRight.z;
|
||||||
m[0][3] = -(camPos->x * vRight.x + camPos->y * vRight.y + camPos->z * vRight.z);
|
m[0][3] = -((camPos->z * vRight.z) + ((camPos->x * vRight.x) + (camPos->y * vRight.y)));
|
||||||
|
|
||||||
m[1][0] = vUp.x;
|
m[1][0] = vUp.x;
|
||||||
m[1][1] = vUp.y;
|
m[1][1] = vUp.y;
|
||||||
m[1][2] = vUp.z;
|
m[1][2] = vUp.z;
|
||||||
m[1][3] = -(camPos->x * vUp.x + camPos->y * vUp.y + camPos->z * vUp.z);
|
m[1][3] = -((camPos->z * vUp.z) + ((camPos->x * vUp.x) + (camPos->y * vUp.y)));
|
||||||
|
|
||||||
m[2][0] = vLook.x;
|
m[2][0] = vLook.x;
|
||||||
m[2][1] = vLook.y;
|
m[2][1] = vLook.y;
|
||||||
m[2][2] = vLook.z;
|
m[2][2] = vLook.z;
|
||||||
m[2][3] = -(camPos->x * vLook.x + camPos->y * vLook.y + camPos->z * vLook.z);
|
m[2][3] = -((camPos->z * vLook.z) + ((camPos->x * vLook.x) + (camPos->y * vLook.y)));
|
||||||
}
|
}
|
||||||
|
|
||||||
void C_MTXLightFrustum(Mtx m, float t, float b, float l, float r, float n, float scaleS, float scaleT, float transS, float transT)
|
void C_MTXLightFrustum(Mtx m, f32 t, f32 b, f32 l, f32 r, f32 n, f32 scaleS, f32 scaleT, f32 transS, f32 transT) {
|
||||||
{
|
|
||||||
f32 tmp;
|
f32 tmp;
|
||||||
|
|
||||||
tmp = 1.0f / (r - l);
|
ASSERTMSGLINE(2541, m, "MTXLightFrustum(): NULL MtxPtr 'm' ");
|
||||||
m[0][0] = ((2 * n) * tmp) * scaleS;
|
ASSERTMSGLINE(2542, (t != b), "MTXLightFrustum(): 't' and 'b' clipping planes are equal ");
|
||||||
m[0][1] = 0.0f;
|
ASSERTMSGLINE(2543, (l != r), "MTXLightFrustum(): 'l' and 'r' clipping planes are equal ");
|
||||||
m[0][2] = (((r + l) * tmp) * scaleS) - transS;
|
|
||||||
m[0][3] = 0.0f;
|
|
||||||
|
|
||||||
tmp = 1.0f / (t - b);
|
tmp = 1 / (r - l);
|
||||||
m[1][0] = 0.0f;
|
m[0][0] = (scaleS * (2 * n * tmp));
|
||||||
m[1][1] = ((2 * n) * tmp) * scaleT;
|
m[0][1] = 0;
|
||||||
m[1][2] = (((t + b) * tmp) * scaleT) - transT;
|
m[0][2] = (scaleS * (tmp * (r + l))) - transS;
|
||||||
m[1][3] = 0.0f;
|
m[0][3] = 0;
|
||||||
|
tmp = 1 / (t - b);
|
||||||
m[2][0] = 0.0f;
|
m[1][0] = 0;
|
||||||
m[2][1] = 0.0f;
|
m[1][1] = (scaleT * (2 * n * tmp));
|
||||||
m[2][2] = -1.0f;
|
m[1][2] = (scaleT * (tmp * (t + b))) - transT;
|
||||||
m[2][3] = 0.0f;
|
m[1][3] = 0;
|
||||||
|
m[2][0] = 0;
|
||||||
|
m[2][1] = 0;
|
||||||
|
m[2][2] = -1;
|
||||||
|
m[2][3] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void C_MTXLightPerspective(Mtx m, f32 fovY, f32 aspect, float scaleS, float scaleT, float transS, float transT)
|
void C_MTXLightPerspective(Mtx m, f32 fovY, f32 aspect, f32 scaleS, f32 scaleT, f32 transS, f32 transT) {
|
||||||
{
|
|
||||||
f32 angle;
|
f32 angle;
|
||||||
f32 cot;
|
f32 cot;
|
||||||
|
|
||||||
angle = fovY * 0.5f;
|
ASSERTMSGLINE(2605, m, "MTXLightPerspective(): NULL MtxPtr 'm' ");
|
||||||
|
ASSERTMSGLINE(2606, (fovY > 0.0) && (fovY < 180.0), "MTXLightPerspective(): 'fovY' out of range ");
|
||||||
|
ASSERTMSGLINE(2607, 0 != aspect, "MTXLightPerspective(): 'aspect' is 0 ");
|
||||||
|
|
||||||
|
angle = (0.5f * fovY);
|
||||||
angle = MTXDegToRad(angle);
|
angle = MTXDegToRad(angle);
|
||||||
|
cot = 1 / tanf(angle);
|
||||||
cot = 1.0f / tanf(angle);
|
m[0][0] = (scaleS * (cot / aspect));
|
||||||
|
m[0][1] = 0;
|
||||||
m[0][0] = (cot / aspect) * scaleS;
|
|
||||||
m[0][1] = 0.0f;
|
|
||||||
m[0][2] = -transS;
|
m[0][2] = -transS;
|
||||||
m[0][3] = 0.0f;
|
m[0][3] = 0;
|
||||||
|
m[1][0] = 0;
|
||||||
m[1][0] = 0.0f;
|
m[1][1] = (cot * scaleT);
|
||||||
m[1][1] = cot * scaleT;
|
|
||||||
m[1][2] = -transT;
|
m[1][2] = -transT;
|
||||||
m[1][3] = 0.0f;
|
m[1][3] = 0;
|
||||||
|
m[2][0] = 0;
|
||||||
m[2][0] = 0.0f;
|
m[2][1] = 0;
|
||||||
m[2][1] = 0.0f;
|
m[2][2] = -1;
|
||||||
m[2][2] = -1.0f;
|
m[2][3] = 0;
|
||||||
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)
|
void C_MTXLightOrtho(Mtx m, f32 t, f32 b, f32 l, f32 r, f32 scaleS, f32 scaleT, f32 transS, f32 transT) {
|
||||||
{
|
|
||||||
f32 tmp;
|
f32 tmp;
|
||||||
tmp = 1.0f / (r - l);
|
|
||||||
m[0][0] = (2.0f * tmp * scaleS);
|
|
||||||
m[0][1] = 0.0f;
|
|
||||||
m[0][2] = 0.0f;
|
|
||||||
m[0][3] = ((-(r + l) * tmp) * scaleS) + transS;
|
|
||||||
|
|
||||||
tmp = 1.0f / (t - b);
|
ASSERTMSGLINE(2673, m, "MTXLightOrtho(): NULL MtxPtr 'm' ");
|
||||||
m[1][0] = 0.0f;
|
ASSERTMSGLINE(2674, (t != b), "MTXLightOrtho(): 't' and 'b' clipping planes are equal ");
|
||||||
m[1][1] = (2.0f * tmp) * scaleT;
|
ASSERTMSGLINE(2675, (l != r), "MTXLightOrtho(): 'l' and 'r' clipping planes are equal ");
|
||||||
m[1][2] = 0.0f;
|
tmp = 1 / (r - l);
|
||||||
m[1][3] = ((-(t + b) * tmp) * scaleT) + transT;
|
m[0][0] = (2 * tmp * scaleS);
|
||||||
|
m[0][1] = 0;
|
||||||
m[2][0] = 0.0f;
|
m[0][2] = 0;
|
||||||
m[2][1] = 0.0f;
|
m[0][3] = (transS + (scaleS * (tmp * -(r + l))));
|
||||||
m[2][2] = 0.0f;
|
tmp = 1/ (t - b);
|
||||||
m[2][3] = 1.0f;
|
m[1][0] = 0;
|
||||||
|
m[1][1] = (2 * tmp * scaleT);
|
||||||
|
m[1][2] = 0;
|
||||||
|
m[1][3] = (transT + (scaleT * (tmp * -(t + b))));
|
||||||
|
m[2][0] = 0;
|
||||||
|
m[2][1] = 0;
|
||||||
|
m[2][2] = 0;
|
||||||
|
m[2][3] = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef TARGET_PC
|
#ifdef TARGET_PC
|
||||||
|
|
@ -1310,20 +1329,39 @@ void C_MTXReorder(const Mtx src, ROMtx dest)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void C_MTXMultVec(const Mtx m, const Vec *in, Vec *out)
|
void C_MTXMultVec(const Mtx m, const Vec* src, Vec* dst) {
|
||||||
{
|
Vec vTmp;
|
||||||
out->x = m[0][0] * in->x + m[0][1] * in->y + m[0][2] * in->z + m[0][3];
|
|
||||||
out->y = m[1][0] * in->x + m[1][1] * in->y + m[1][2] * in->z + m[1][3];
|
ASSERTMSGLINE(66, m, "MTXMultVec(): NULL MtxPtr 'm' ");
|
||||||
out->z = m[2][0] * in->x + m[2][1] * in->y + m[2][2] * in->z + m[2][3];
|
ASSERTMSGLINE(67, src, "MTXMultVec(): NULL VecPtr 'src' ");
|
||||||
|
ASSERTMSGLINE(68, dst, "MTXMultVec(): NULL VecPtr 'dst' ");
|
||||||
|
|
||||||
|
vTmp.x = m[0][3] + ((m[0][2] * src->z) + ((m[0][0] * src->x) + (m[0][1] * src->y)));
|
||||||
|
vTmp.y = m[1][3] + ((m[1][2] * src->z) + ((m[1][0] * src->x) + (m[1][1] * src->y)));
|
||||||
|
vTmp.z = m[2][3] + ((m[2][2] * src->z) + ((m[2][0] * src->x) + (m[2][1] * src->y)));
|
||||||
|
dst->x = vTmp.x;
|
||||||
|
dst->y = vTmp.y;
|
||||||
|
dst->z = vTmp.z;
|
||||||
}
|
}
|
||||||
|
|
||||||
void C_MTXMultVecArray(const Mtx m, const Vec *srcBase, Vec *dstBase, u32 count)
|
void C_MTXMultVecArray(const Mtx m, const Vec* srcBase, Vec* dstBase, u32 count) {
|
||||||
{
|
|
||||||
u32 i;
|
u32 i;
|
||||||
for (i = 0; i < count; i++) {
|
Vec vTmp;
|
||||||
dstBase[i].x = m[0][0] * srcBase[i].x + m[0][1] * srcBase[i].y + m[0][2] * srcBase[i].z + m[0][3];
|
|
||||||
dstBase[i].y = m[1][0] * srcBase[i].x + m[1][1] * srcBase[i].y + m[1][2] * srcBase[i].z + m[1][3];
|
ASSERTMSGLINE(168, m, "MTXMultVecArray(): NULL MtxPtr 'm' ");
|
||||||
dstBase[i].z = m[2][0] * srcBase[i].x + m[2][1] * srcBase[i].y + m[2][2] * srcBase[i].z + m[2][3];
|
ASSERTMSGLINE(169, srcBase, "MTXMultVecArray(): NULL VecPtr 'srcBase' ");
|
||||||
|
ASSERTMSGLINE(170, dstBase, "MTXMultVecArray(): NULL VecPtr 'dstBase' ");
|
||||||
|
ASSERTMSGLINE(171, count > 1, "MTXMultVecArray(): count must be greater than 1.");
|
||||||
|
|
||||||
|
for(i = 0; i < count; i++) {
|
||||||
|
vTmp.x = m[0][3] + ((m[0][2] * srcBase->z) + ((m[0][0] * srcBase->x) + (m[0][1] * srcBase->y)));
|
||||||
|
vTmp.y = m[1][3] + ((m[1][2] * srcBase->z) + ((m[1][0] * srcBase->x) + (m[1][1] * srcBase->y)));
|
||||||
|
vTmp.z = m[2][3] + ((m[2][2] * srcBase->z) + ((m[2][0] * srcBase->x) + (m[2][1] * srcBase->y)));
|
||||||
|
dstBase->x = vTmp.x;
|
||||||
|
dstBase->y = vTmp.y;
|
||||||
|
dstBase->z = vTmp.z;
|
||||||
|
srcBase++;
|
||||||
|
dstBase++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1341,14 +1379,19 @@ void C_MTXROMultVecArray(const ROMtx m, const Vec *srcBase, Vec *dstBase, u32 co
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void C_MTXMultVecSR(const Mtx mtx, const Vec* in, Vec* out) {
|
void C_MTXMultVecSR(const Mtx m, const Vec* src, Vec* dst) {
|
||||||
float x = in->x;
|
Vec vTmp;
|
||||||
float y = in->y;
|
|
||||||
float z = in->z;
|
|
||||||
|
|
||||||
out->x = mtx[0][0] * x + mtx[0][1] * y + mtx[0][2] * z;
|
ASSERTMSGLINE(313, m, "MTXMultVecSR(): NULL MtxPtr 'm' ");
|
||||||
out->y = mtx[1][0] * x + mtx[1][1] * y + mtx[1][2] * z;
|
ASSERTMSGLINE(314, src, "MTXMultVecSR(): NULL VecPtr 'src' ");
|
||||||
out->z = mtx[2][0] * x + mtx[2][1] * y + mtx[2][2] * z;
|
ASSERTMSGLINE(315, dst, "MTXMultVecSR(): NULL VecPtr 'dst' ");
|
||||||
|
|
||||||
|
vTmp.x = (m[0][2] * src->z) + ((m[0][0] * src->x) + (m[0][1] * src->y));
|
||||||
|
vTmp.y = (m[1][2] * src->z) + ((m[1][0] * src->x) + (m[1][1] * src->y));
|
||||||
|
vTmp.z = (m[2][2] * src->z) + ((m[2][0] * src->x) + (m[2][1] * src->y));
|
||||||
|
dst->x = vTmp.x;
|
||||||
|
dst->y = vTmp.y;
|
||||||
|
dst->z = vTmp.z;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -1,77 +1,92 @@
|
||||||
#include "dolphin/mtx.h"
|
#include "dolphin/mtx.h"
|
||||||
|
#include "dolphin/gx/GXPriv.h"
|
||||||
#include "math.h"
|
#include "math.h"
|
||||||
|
|
||||||
void C_MTXFrustum(Mtx44 m, f32 arg1, f32 arg2, f32 arg3, f32 arg4, f32 arg5, f32 arg6)
|
void C_MTXFrustum(Mtx44 m, f32 t, f32 b, f32 l, f32 r, f32 n, f32 f) {
|
||||||
{
|
f32 tmp;
|
||||||
f32 tmp = 1.0f / (arg4 - arg3);
|
|
||||||
m[0][0] = (2 * arg5) * tmp;
|
ASSERTMSGLINE(105, m, "MTXFrustum(): NULL Mtx44Ptr 'm' ");
|
||||||
m[0][1] = 0.0f;
|
ASSERTMSGLINE(106, t != b, "MTXFrustum(): 't' and 'b' clipping planes are equal ");
|
||||||
m[0][2] = (arg4 + arg3) * tmp;
|
ASSERTMSGLINE(107, l != r, "MTXFrustum(): 'l' and 'r' clipping planes are equal ");
|
||||||
m[0][3] = 0.0f;
|
ASSERTMSGLINE(108, n != f, "MTXFrustum(): 'n' and 'f' clipping planes are equal ");
|
||||||
tmp = 1.0f / (arg1 - arg2);
|
tmp = 1 / (r - l);
|
||||||
m[1][0] = 0.0f;
|
m[0][0] = (2 * n * tmp);
|
||||||
m[1][1] = (2 * arg5) * tmp;
|
m[0][1] = 0;
|
||||||
m[1][2] = (arg1 + arg2) * tmp;
|
m[0][2] = (tmp * (r + l));
|
||||||
m[1][3] = 0.0f;
|
m[0][3] = 0;
|
||||||
m[2][0] = 0.0f;
|
tmp = 1 / (t - b);
|
||||||
m[2][1] = 0.0f;
|
m[1][0] = 0;
|
||||||
tmp = 1.0f / (arg6 - arg5);
|
m[1][1] = (2 * n * tmp);
|
||||||
m[2][2] = -(arg5)*tmp;
|
m[1][2] = (tmp * (t + b));
|
||||||
m[2][3] = -(arg6 * arg5) * tmp;
|
m[1][3] = 0;
|
||||||
m[3][0] = 0.0f;
|
m[2][0] = 0;
|
||||||
m[3][1] = 0.0f;
|
m[2][1] = 0;
|
||||||
m[3][2] = -1.0f;
|
tmp = 1 / (f - n);
|
||||||
m[3][3] = 0.0f;
|
m[2][2] = (-n * tmp);
|
||||||
|
m[2][3] = (tmp * -(f * n));
|
||||||
|
m[3][0] = 0;
|
||||||
|
m[3][1] = 0;
|
||||||
|
m[3][2] = -1;
|
||||||
|
m[3][3] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Functions match but has issues with float constants
|
void C_MTXPerspective(Mtx44 m, f32 fovY, f32 aspect, f32 n, f32 f) {
|
||||||
void C_MTXPerspective(Mtx44 m, f32 fovY, f32 aspect, f32 n, f32 f)
|
f32 angle;
|
||||||
{
|
|
||||||
f32 angle = fovY * 0.5f;
|
|
||||||
f32 cot;
|
f32 cot;
|
||||||
f32 tmp;
|
f32 tmp;
|
||||||
|
|
||||||
|
ASSERTMSGLINE(179, m, "MTXPerspective(): NULL Mtx44Ptr 'm' ");
|
||||||
|
ASSERTMSGLINE(180, (fovY > 0.0) && (fovY < 180.0), "MTXPerspective(): 'fovY' out of range ");
|
||||||
|
ASSERTMSGLINE(181, 0.0f != aspect, "MTXPerspective(): 'aspect' is 0 ");
|
||||||
|
|
||||||
|
angle = (0.5f * fovY);
|
||||||
angle = MTXDegToRad(angle);
|
angle = MTXDegToRad(angle);
|
||||||
cot = 1.0f / tanf(angle);
|
cot = 1 / tanf(angle);
|
||||||
m[0][0] = cot / aspect;
|
m[0][0] = (cot / aspect);
|
||||||
m[0][1] = 0.0f;
|
m[0][1] = 0;
|
||||||
m[0][2] = 0.0f;
|
m[0][2] = 0;
|
||||||
m[0][3] = 0.0f;
|
m[0][3] = 0;
|
||||||
m[1][0] = 0.0f;
|
m[1][0] = 0;
|
||||||
m[1][1] = cot;
|
m[1][1] = (cot);
|
||||||
m[1][2] = 0.0f;
|
m[1][2] = 0;
|
||||||
m[1][3] = 0.0f;
|
m[1][3] = 0;
|
||||||
m[2][0] = 0.0f;
|
m[2][0] = 0;
|
||||||
m[2][1] = 0.0f;
|
m[2][1] = 0;
|
||||||
tmp = 1.0f / (f - n);
|
tmp = 1 / (f - n);
|
||||||
m[2][2] = -(n)*tmp;
|
m[2][2] = (-n * tmp);
|
||||||
m[2][3] = -(f * n) * tmp;
|
m[2][3] = (tmp * -(f * n));
|
||||||
m[3][0] = 0.0f;
|
m[3][0] = 0;
|
||||||
m[3][1] = 0.0f;
|
m[3][1] = 0;
|
||||||
m[3][2] = -1.0f;
|
m[3][2] = -1;
|
||||||
m[3][3] = 0.0f;
|
m[3][3] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void C_MTXOrtho(Mtx44 m, f32 t, f32 b, f32 l, f32 r, f32 n, f32 f)
|
void C_MTXOrtho(Mtx44 m, f32 t, f32 b, f32 l, f32 r, f32 n, f32 f) {
|
||||||
{
|
f32 tmp;
|
||||||
f32 tmp = 1.0f / (r - l);
|
|
||||||
m[0][0] = 2.0f * tmp;
|
ASSERTMSGLINE(254, m, "MTXOrtho(): NULL Mtx44Ptr 'm' ");
|
||||||
m[0][1] = 0.0f;
|
ASSERTMSGLINE(255, t != b, "MTXOrtho(): 't' and 'b' clipping planes are equal ");
|
||||||
m[0][2] = 0.0f;
|
ASSERTMSGLINE(256, l != r, "MTXOrtho(): 'l' and 'r' clipping planes are equal ");
|
||||||
m[0][3] = -(r + l) * tmp;
|
ASSERTMSGLINE(257, n != f, "MTXOrtho(): 'n' and 'f' clipping planes are equal ");
|
||||||
tmp = 1.0f / (t - b);
|
tmp = 1 / (r - l);
|
||||||
m[1][0] = 0.0f;
|
m[0][0] = 2 * tmp;
|
||||||
m[1][1] = 2.0f * tmp;
|
m[0][1] = 0;
|
||||||
m[1][2] = 0.0f;
|
m[0][2] = 0;
|
||||||
m[1][3] = -(t + b) * tmp;
|
m[0][3] = (tmp * -(r + l));
|
||||||
m[2][0] = 0.0f;
|
tmp = 1 / (t - b);
|
||||||
m[2][1] = 0.0f;
|
m[1][0] = 0;
|
||||||
tmp = 1.0f / (f - n);
|
m[1][1] = 2 * tmp;
|
||||||
m[2][2] = -(1.0f) * tmp;
|
m[1][2] = 0;
|
||||||
m[2][3] = -(f)*tmp;
|
m[1][3] = (tmp * -(t + b));
|
||||||
m[3][0] = 0.0f;
|
m[2][0] = 0;
|
||||||
m[3][1] = 0.0f;
|
m[2][1] = 0;
|
||||||
m[3][2] = 0.0f;
|
tmp = 1 / (f - n);
|
||||||
m[3][3] = 1.0f;
|
m[2][2] = (-1 * tmp);
|
||||||
|
m[2][3] = (-f * tmp);
|
||||||
|
m[3][0] = 0;
|
||||||
|
m[3][1] = 0;
|
||||||
|
m[3][2] = 0;
|
||||||
|
m[3][3] = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef GEKKO
|
#ifdef GEKKO
|
||||||
|
|
|
||||||
|
|
@ -50,7 +50,7 @@ SHARED_SYM s32 SystemInitF;
|
||||||
|
|
||||||
#ifdef TARGET_PC
|
#ifdef TARGET_PC
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
void aurora_log_callback(AuroraLogLevel level, const char *message, unsigned int len)
|
void aurora_log_callback(AuroraLogLevel level, const char* module, const char *message, unsigned int len)
|
||||||
{
|
{
|
||||||
const char *levelStr = "??";
|
const char *levelStr = "??";
|
||||||
FILE *out = stdout;
|
FILE *out = stdout;
|
||||||
|
|
@ -73,14 +73,12 @@ void aurora_log_callback(AuroraLogLevel level, const char *message, unsigned int
|
||||||
out = stderr;
|
out = stderr;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
fprintf(out, "[%s: %s]\n", levelStr, message);
|
fprintf(out, "[%s | %s] %s\n", levelStr, module, message);
|
||||||
if (level == LOG_FATAL) {
|
if (level == LOG_FATAL) {
|
||||||
fflush(out);
|
fflush(out);
|
||||||
abort();
|
abort();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void VICallPostRetraceCallback(s32 retraceCount);
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef TARGET_PC
|
#ifdef TARGET_PC
|
||||||
|
|
@ -94,6 +92,11 @@ void main(void)
|
||||||
&(AuroraConfig) {
|
&(AuroraConfig) {
|
||||||
.appName = "Mario Party 4",
|
.appName = "Mario Party 4",
|
||||||
.logCallback = &aurora_log_callback,
|
.logCallback = &aurora_log_callback,
|
||||||
|
.desiredBackend = BACKEND_VULKAN,
|
||||||
|
.windowPosX = 100,
|
||||||
|
.windowPosY = 100,
|
||||||
|
.windowWidth = 640,
|
||||||
|
.windowHeight = 480,
|
||||||
});
|
});
|
||||||
#endif
|
#endif
|
||||||
u32 met0;
|
u32 met0;
|
||||||
|
|
@ -186,7 +189,6 @@ void main(void)
|
||||||
|
|
||||||
msmMusFdoutEnd();
|
msmMusFdoutEnd();
|
||||||
HuSysDoneRender(retrace);
|
HuSysDoneRender(retrace);
|
||||||
|
|
||||||
GXReadGPMetric(&met0, &met1);
|
GXReadGPMetric(&met0, &met1);
|
||||||
GXReadVCacheMetric(&vcheck, &vmiss, &vstall);
|
GXReadVCacheMetric(&vcheck, &vmiss, &vstall);
|
||||||
GXReadPixMetric(&top_pixels_in, &top_pixels_out, &bot_pixels_in, &bot_pixels_out, &clr_pixels_in, &total_copy_clks);
|
GXReadPixMetric(&top_pixels_in, &top_pixels_out, &bot_pixels_in, &bot_pixels_out, &clr_pixels_in, &total_copy_clks);
|
||||||
|
|
@ -197,8 +199,6 @@ void main(void)
|
||||||
#ifdef TARGET_PC
|
#ifdef TARGET_PC
|
||||||
imgui_main(&auroraInfo);
|
imgui_main(&auroraInfo);
|
||||||
aurora_end_frame();
|
aurora_end_frame();
|
||||||
// TODO PC remove
|
|
||||||
VICallPostRetraceCallback(0);
|
|
||||||
frame_limiter();
|
frame_limiter();
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -142,9 +142,9 @@ void imgui_main(const AuroraInfo *info)
|
||||||
hasPrevious = true;
|
hasPrevious = true;
|
||||||
|
|
||||||
ImGuiStringViewText(
|
ImGuiStringViewText(
|
||||||
fmt::format(FMT_STRING("Queued pipelines: {}\n"), aurora::gfx::queuedPipelines));
|
fmt::format(FMT_STRING("Queued pipelines: {}\n"), aurora::gfx::queuedPipelines.load()));
|
||||||
ImGuiStringViewText(
|
ImGuiStringViewText(
|
||||||
fmt::format(FMT_STRING("Done pipelines: {}\n"), aurora::gfx::createdPipelines));
|
fmt::format(FMT_STRING("Done pipelines: {}\n"), aurora::gfx::createdPipelines.load()));
|
||||||
ImGuiStringViewText(
|
ImGuiStringViewText(
|
||||||
fmt::format(FMT_STRING("Draw call count: {}\n"), aurora::gfx::g_drawCallCount));
|
fmt::format(FMT_STRING("Draw call count: {}\n"), aurora::gfx::g_drawCallCount));
|
||||||
ImGuiStringViewText(fmt::format(FMT_STRING("Merged draw calls: {}\n"),
|
ImGuiStringViewText(fmt::format(FMT_STRING("Merged draw calls: {}\n"),
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,4 @@
|
||||||
#include "dolphin/gx/GXVert.h"
|
#include "dolphin/gx/GXVert.h"
|
||||||
#include "dolphin/vitypes.h"
|
|
||||||
#include <dolphin.h>
|
#include <dolphin.h>
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
@ -10,6 +9,8 @@
|
||||||
|
|
||||||
// Credits: Super Monkey Ball
|
// Credits: Super Monkey Ball
|
||||||
|
|
||||||
|
static VIRetraceCallback sVIRetraceCallback = NULL;
|
||||||
|
|
||||||
void OSReport(const char *msg, ...)
|
void OSReport(const char *msg, ...)
|
||||||
{
|
{
|
||||||
va_list args;
|
va_list args;
|
||||||
|
|
@ -475,7 +476,10 @@ void VISetNextFrameBuffer(void *fb)
|
||||||
|
|
||||||
void VIWaitForRetrace()
|
void VIWaitForRetrace()
|
||||||
{
|
{
|
||||||
// puts("VIWaitForRetrace is a stub");
|
if (sVIRetraceCallback)
|
||||||
|
{
|
||||||
|
sVIRetraceCallback(0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
s32 __CARDFormatRegionAsync(int a, int b)
|
s32 __CARDFormatRegionAsync(int a, int b)
|
||||||
|
|
@ -528,18 +532,10 @@ void SISetSamplingRate(u32 msec)
|
||||||
puts("SISetSamplingRate is a stub");
|
puts("SISetSamplingRate is a stub");
|
||||||
}
|
}
|
||||||
|
|
||||||
VIRetraceCallback postRetraceCallback = NULL;
|
|
||||||
|
|
||||||
VIRetraceCallback VISetPostRetraceCallback(VIRetraceCallback callback)
|
VIRetraceCallback VISetPostRetraceCallback(VIRetraceCallback callback)
|
||||||
{
|
{
|
||||||
postRetraceCallback = callback;
|
sVIRetraceCallback = callback;
|
||||||
return NULL;
|
return callback;
|
||||||
}
|
|
||||||
|
|
||||||
void VICallPostRetraceCallback(s32 retraceCount)
|
|
||||||
{
|
|
||||||
if (postRetraceCallback != NULL)
|
|
||||||
postRetraceCallback(retraceCount);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void GXSetGPMetric(GXPerf0 perf0, GXPerf1 perf1)
|
void GXSetGPMetric(GXPerf0 perf0, GXPerf1 perf1)
|
||||||
|
|
@ -610,57 +606,11 @@ void PPCSync(void)
|
||||||
puts("PPCSync is a stub");
|
puts("PPCSync is a stub");
|
||||||
}
|
}
|
||||||
|
|
||||||
void GXColor3u8(u8 r, u8 g, u8 b)
|
|
||||||
{
|
|
||||||
// TODO
|
|
||||||
GXColor4u8(r, g, b, 255);
|
|
||||||
}
|
|
||||||
|
|
||||||
void GXNormal1x16(u16 index)
|
|
||||||
{
|
|
||||||
puts("GXNormal1x16 is a stub");
|
|
||||||
}
|
|
||||||
|
|
||||||
void GXColor1x16(u16 index)
|
|
||||||
{
|
|
||||||
puts("GXColor1x16 is a stub");
|
|
||||||
}
|
|
||||||
|
|
||||||
void GXTexCoord1x16(u16 index)
|
|
||||||
{
|
|
||||||
puts("GXTexCoord1x16 is a stub");
|
|
||||||
}
|
|
||||||
|
|
||||||
void GXUnknownu16(const u16 x)
|
void GXUnknownu16(const u16 x)
|
||||||
{
|
{
|
||||||
puts("GXUnknownu16 is a stub");
|
puts("GXUnknownu16 is a stub");
|
||||||
}
|
}
|
||||||
|
|
||||||
void GXNormal3s16(s16 x, s16 y, s16 z)
|
|
||||||
{
|
|
||||||
puts("GXNormal3s16 is a stub");
|
|
||||||
}
|
|
||||||
|
|
||||||
void GXPosition2u16(const u16 x, const u16 y)
|
|
||||||
{
|
|
||||||
GXPosition3f32(x, y, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
void GXPosition2f32(const f32 x, const f32 y)
|
|
||||||
{
|
|
||||||
GXPosition3f32(x, y, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
void GXPosition2s16(const s16 x, const s16 y)
|
|
||||||
{
|
|
||||||
GXPosition3f32(x, y, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
void GXColor1x8(u8 index)
|
|
||||||
{
|
|
||||||
puts("GXColor1x8 is a stub");
|
|
||||||
}
|
|
||||||
|
|
||||||
void GXWaitDrawDone(void)
|
void GXWaitDrawDone(void)
|
||||||
{
|
{
|
||||||
puts("GXWaitDrawDone is a stub");
|
puts("GXWaitDrawDone is a stub");
|
||||||
|
|
@ -682,8 +632,7 @@ void GXResetWriteGatherPipe(void)
|
||||||
puts("GXResetWriteGatherPipe is a stub");
|
puts("GXResetWriteGatherPipe is a stub");
|
||||||
}
|
}
|
||||||
|
|
||||||
void ARQInit(void)
|
void ARQInit(void) {
|
||||||
{
|
|
||||||
puts("ARQInit is a stub");
|
puts("ARQInit is a stub");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -692,13 +641,16 @@ void HuDvdErrDispInit(GXRenderModeObj *rmode, void *xfb1, void *xfb2) { }
|
||||||
|
|
||||||
void msmSysRegularProc(void)
|
void msmSysRegularProc(void)
|
||||||
{
|
{
|
||||||
|
puts("msmSysRegularProc is a stub");
|
||||||
}
|
}
|
||||||
|
|
||||||
void msmMusFdoutEnd(void) { }
|
void msmMusFdoutEnd(void)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
s32 HuSoftResetButtonCheck(void)
|
s32 HuSoftResetButtonCheck(void)
|
||||||
{
|
{
|
||||||
// puts("HuSoftResetButtonCheck is a stub");
|
//puts("HuSoftResetButtonCheck is a stub");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue