Implement Matrix stack

This commit is contained in:
Jaby 2024-02-01 21:29:13 -05:00 committed by Jaby
parent 0963f9bf45
commit b1e3e2790f
3 changed files with 38 additions and 31 deletions

View File

@ -3,6 +3,8 @@
namespace JabyEngine { namespace JabyEngine {
namespace GTE { namespace GTE {
static constexpr auto StackSize = 16;
/* /*
RotTrans RotTrans
@ -123,12 +125,13 @@ namespace JabyEngine {
Optional: replaces current matrix (rotation and parallel) with input Optional: replaces current matrix (rotation and parallel) with input
*/ */
void push_matrix(); void push_matrix();
void push_matrix(const MATRIX& matrix); void push_matrix_and_set(const MATRIX& matrix);
/* /*
Restores the previous stored matrix (rotation and parallel) Restores the previous stored matrix (rotation and parallel)
*/ */
void pop_matrix(); MATRIX get_and_pop_matrix();
void pop_matrix();
/* /*
SetGeomOffset(ofx,ofy) SetGeomOffset(ofx,ofy)

View File

@ -111,38 +111,30 @@ namespace JabyEngine {
printf("{%i, %i, %i}\n", matrix.trans[0], matrix.trans[1], matrix.trans[2]); printf("{%i, %i, %i}\n", matrix.trans[0], matrix.trans[1], matrix.trans[2]);
}; };
static const auto make_matrix = [](int16_t mult) -> GTE::MATRIX {
return GTE::MATRIX {
.rot = {
{static_cast<int16_t>(1*mult), static_cast<int16_t>(2*mult), static_cast<int16_t>(3*mult)},
{static_cast<int16_t>(2*mult), static_cast<int16_t>(3*mult), static_cast<int16_t>(1*mult)},
{static_cast<int16_t>(3*mult), static_cast<int16_t>(1*mult), static_cast<int16_t>(2*mult)},
},
.trans = {6*mult, 7*mult, 8*mult}
};
};
display_stuff(25); display_stuff(25);
display_stuff(45); display_stuff(45);
display_stuff(75); display_stuff(75);
display_stuff(90); display_stuff(90);
auto rot_mat = []() -> GTE::MATRIX { for(size_t n = 0; n < 3; n++) {
auto rot = GTE::MATRIX::identity(); GTE::push_matrix_and_set(make_matrix(n + 1));
}
rot.rot[0][0] = 123; for(size_t n = 0; n < 3; n++) {
rot.rot[0][1] = 456; print_matrix(GTE::get_and_pop_matrix());
rot.rot[0][2] = 789; printf("---\n");
}
rot.rot[1][0] = 1123;
rot.rot[1][1] = 1456;
rot.rot[1][2] = 1789;
rot.rot[2][0] = 2123;
rot.rot[2][1] = 2456;
rot.rot[2][2] = 2789;
rot.trans[0] = 9;
rot.trans[1] = 8;
rot.trans[2] = 7;
return rot;
}();
print_matrix(rot_mat);
printf("---\n");
GTE::set_matrix(rot_mat);
rot_mat = GTE::get_matrix();
print_matrix(rot_mat);
printf("---\n");
} }
void start() { void start() {

View File

@ -26,6 +26,9 @@ int32_t cos(int32_t value) {
namespace JabyEngine { namespace JabyEngine {
namespace GTE { namespace GTE {
static MATRIX Stack[StackSize];
static MATRIX* FreeStackEntry = Stack;
MATRIX& multiply_matrix(const MATRIX& m0, const MATRIX& m1, MATRIX& result) { MATRIX& multiply_matrix(const MATRIX& m0, const MATRIX& m1, MATRIX& result) {
set_rot_matrix(m0); set_rot_matrix(m0);
@ -58,16 +61,25 @@ namespace JabyEngine {
} }
void push_matrix() { void push_matrix() {
// FIXME: Implement this *FreeStackEntry = get_matrix();
FreeStackEntry++;
} }
void push_matrix(const MATRIX& matrix) { void push_matrix_and_set(const MATRIX& matrix) {
push_matrix(); push_matrix();
set_matrix(matrix); set_matrix(matrix);
} }
void pop_matrix() { void pop_matrix() {
// FIXME: Implement this FreeStackEntry--;
set_matrix(*FreeStackEntry);
} }
MATRIX get_and_pop_matrix() {
const auto matrix = get_matrix();
pop_matrix();
return matrix;
}
} }
} }