Rotate Dönerfisch

This commit is contained in:
2024-04-02 11:24:11 -05:00
parent 96b7963404
commit 53eacdae43
5 changed files with 101 additions and 12 deletions

View File

@@ -1,3 +1,39 @@
# inline_n.h
This header is directly lifted from psx-redux and not my creation. I will try to give it my personal touch but the original implementation will be always from [pcsx-redux](https://github.com/grumpycoders/pcsx-redux) and the **grumpycoders**.
This header is directly lifted from psx-redux and not my creation. I will try to give it my personal touch but the original implementation will be always from [pcsx-redux](https://github.com/grumpycoders/pcsx-redux) and the **grumpycoders**.
```c++
MATRIX *HiRotMatrix(VECTOR *r, MATRIX *m) {
short s[3],c[3];
MATRIX tm[3];
s[0] = hisin(r->vx); s[1] = hisin(r->vy); s[2] = hisin(r->vz);
c[0] = hicos(r->vx); c[1] = hicos(r->vy); c[2] = hicos(r->vz);
// mX
m->m[0][0] = ONE; m->m[0][1] = 0; m->m[0][2] = 0;
m->m[1][0] = 0; m->m[1][1] = c[0]; m->m[1][2] = -s[0];
m->m[2][0] = 0; m->m[2][1] = s[0]; m->m[2][2] = c[0];
// mY
tm[0].m[0][0] = c[1]; tm[0].m[0][1] = 0; tm[0].m[0][2] = s[1];
tm[0].m[1][0] = 0; tm[0].m[1][1] = ONE; tm[0].m[1][2] = 0;
tm[0].m[2][0] = -s[1]; tm[0].m[2][1] = 0; tm[0].m[2][2] = c[1];
// mZ
tm[1].m[0][0] = c[2]; tm[1].m[0][1] = -s[2]; tm[1].m[0][2] = 0;
tm[1].m[1][0] = s[2]; tm[1].m[1][1] = c[2]; tm[1].m[1][2] = 0;
tm[1].m[2][0] = 0; tm[1].m[2][1] = 0; tm[1].m[2][2] = ONE;
PushMatrix();
MulMatrix0( m, &tm[0], &tm[2] );
MulMatrix0( &tm[2], &tm[1], m );
PopMatrix();
return m;
}
```

View File

@@ -26,6 +26,20 @@ int32_t cos(int32_t value) {
namespace JabyEngine {
namespace GTE {
namespace MatrixHelper {
struct SinCosPair {
int16_t sin;
int16_t cos;
static SinCosPair create_for(int32_t value) {
return SinCosPair{
.sin = static_cast<int16_t>(::sin(value)),
.cos = static_cast<int16_t>(::cos(value)),
};
}
};
}
static MATRIX Stack[StackSize];
static MATRIX* FreeStackEntry = Stack;
@@ -80,6 +94,33 @@ namespace JabyEngine {
pop_matrix();
return matrix;
}
}
MATRIX MATRIX :: rotation(int32_t x, int32_t y, int32_t z) {
using namespace MatrixHelper;
const auto sincos_x = SinCosPair::create_for(x);
const auto sincos_y = SinCosPair::create_for(y);
const auto sincos_z = SinCosPair::create_for(z);
auto rotX = MATRIX::identity();
rotX.rot[1][1] = sincos_x.cos; rotX.rot[1][2] = -sincos_x.sin;
rotX.rot[2][1] = sincos_x.sin; rotX.rot[2][2] = sincos_x.cos;
auto rotY = MATRIX::identity();
rotY.rot[0][0] = sincos_y.cos; rotY.rot[0][2] = sincos_y.sin;
rotY.rot[2][0] = -sincos_y.sin; rotY.rot[2][2] = sincos_y.cos;
auto rotZ = MATRIX::identity();
rotZ.rot[0][0] = sincos_z.cos; rotZ.rot[0][1] = -sincos_z.sin;
rotZ.rot[1][0] = sincos_z.sin; rotZ.rot[1][1] = sincos_z.cos;
push_matrix();
multiply_matrix(rotX, rotY, rotX);
multiply_matrix(rotX, rotZ, rotX);
pop_matrix();
return rotX;
}
}
}