Rotate Dönerfisch
This commit is contained in:
@@ -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;
|
||||
|
||||
}
|
||||
```
|
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user