Rendering now uses translations and matrix modes exist
This commit is contained in:
parent
27af3a586d
commit
fd1a97507b
7 changed files with 94 additions and 20 deletions
|
@ -1,8 +1,8 @@
|
||||||
#include "tiles/dirt.h"
|
#include "tiles/dirt.h"
|
||||||
|
|
||||||
void Dirt::render(Render r) {
|
void Dirt::render(Render r) {
|
||||||
|
r.translate(node().pos() * (TILE_SIZE + 1));
|
||||||
r.fill_rectangle_sz(
|
r.fill_rectangle_sz(
|
||||||
node().pos() * (TILE_SIZE + 1),
|
|
||||||
node().size() * TILE_SIZE,
|
node().size() * TILE_SIZE,
|
||||||
{100, 50, 10}
|
{100, 50, 10}
|
||||||
);
|
);
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
#include "tiles/grass.h"
|
#include "tiles/grass.h"
|
||||||
|
|
||||||
void Grass::render(Render r) {
|
void Grass::render(Render r) {
|
||||||
|
r.translate(node().pos() * (TILE_SIZE + 1));
|
||||||
r.fill_rectangle_sz(
|
r.fill_rectangle_sz(
|
||||||
node().pos() * (TILE_SIZE + 1),
|
|
||||||
node().size() * TILE_SIZE,
|
node().size() * TILE_SIZE,
|
||||||
{7, 176, 52}
|
{7, 176, 52}
|
||||||
);
|
);
|
||||||
|
|
|
@ -7,8 +7,8 @@ Entity *Rainbow::create_entity() {
|
||||||
|
|
||||||
void Rainbow::render(Render r) {
|
void Rainbow::render(Render r) {
|
||||||
auto &entity = (entity::Rainbow &)node().entity();
|
auto &entity = (entity::Rainbow &)node().entity();
|
||||||
|
r.translate(node().pos() * (TILE_SIZE + 1));
|
||||||
r.fill_rectangle_sz(
|
r.fill_rectangle_sz(
|
||||||
node().pos() * (TILE_SIZE + 1),
|
|
||||||
node().size() * TILE_SIZE,
|
node().size() * TILE_SIZE,
|
||||||
entity.color()
|
entity.color()
|
||||||
);
|
);
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
#include "tiles/stone.h"
|
#include "tiles/stone.h"
|
||||||
|
|
||||||
void Stone::render(Render r) {
|
void Stone::render(Render r) {
|
||||||
|
r.translate(node().pos() * (TILE_SIZE + 1));
|
||||||
r.fill_rectangle_sz(
|
r.fill_rectangle_sz(
|
||||||
node().pos() * (TILE_SIZE + 1),
|
|
||||||
node().size() * TILE_SIZE,
|
node().size() * TILE_SIZE,
|
||||||
{42, 42, 42}
|
{42, 42, 42}
|
||||||
);
|
);
|
||||||
|
|
|
@ -8,8 +8,8 @@ Entity *Tile::create_entity() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Tile::render(Render r) {
|
void Tile::render(Render r) {
|
||||||
|
r.translate(node().pos() * (TILE_SIZE + 1));
|
||||||
r.rectangle_sz(
|
r.rectangle_sz(
|
||||||
node().pos() * (TILE_SIZE + 1),
|
|
||||||
node().size() * TILE_SIZE,
|
node().size() * TILE_SIZE,
|
||||||
{255, 0, 0}
|
{255, 0, 0}
|
||||||
);
|
);
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
#include "util/render.h"
|
#include "util/render.h"
|
||||||
|
|
||||||
void Render::rectangle(Vector2<int> start, Vector2<int> end, Color color) {
|
void Render::rectangle(Vector2<int> end, Color color) {
|
||||||
auto screen_start = m_matrix * m_view_matrix * Vector3<float>(start, 1);
|
auto screen_start = m_matrix * m_view_matrix * Vector3<float>(0, 0, 1);
|
||||||
auto screen_end = m_matrix * m_view_matrix * Vector3<float>(end, 1);
|
auto screen_end = m_matrix * m_view_matrix * Vector3<float>(end, 1);
|
||||||
m_pge->DrawRect(
|
m_pge->DrawRect(
|
||||||
screen_start.x(),
|
screen_start.x(),
|
||||||
|
@ -12,8 +12,9 @@ void Render::rectangle(Vector2<int> start, Vector2<int> end, Color color) {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Render::rectangle_sz(Vector2<int> start, Vector2<int> size, Color color) {
|
#include <iostream>
|
||||||
auto screen_start = m_matrix * m_view_matrix * Vector3<float>(start, 1);
|
void Render::rectangle_sz(Vector2<int> size, Color color) {
|
||||||
|
auto screen_start = m_matrix * m_view_matrix * Vector3<float>(0, 0, 1);
|
||||||
// auto screen_size = m_matrix * Vector3<float>(size, 1);
|
// auto screen_size = m_matrix * Vector3<float>(size, 1);
|
||||||
m_pge->DrawRect(
|
m_pge->DrawRect(
|
||||||
screen_start.x(),
|
screen_start.x(),
|
||||||
|
@ -24,8 +25,8 @@ void Render::rectangle_sz(Vector2<int> start, Vector2<int> size, Color color) {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Render::fill_rectangle(Vector2<int> start, Vector2<int> end, Color color) {
|
void Render::fill_rectangle(Vector2<int> end, Color color) {
|
||||||
auto screen_start = m_matrix * m_view_matrix * Vector3<float>(start, 1);
|
auto screen_start = m_matrix * m_view_matrix * Vector3<float>(0, 0, 1);
|
||||||
auto screen_end = m_matrix * m_view_matrix * Vector3<float>(end, 1);
|
auto screen_end = m_matrix * m_view_matrix * Vector3<float>(end, 1);
|
||||||
m_pge->FillRect(
|
m_pge->FillRect(
|
||||||
screen_start.x(),
|
screen_start.x(),
|
||||||
|
@ -36,8 +37,8 @@ void Render::fill_rectangle(Vector2<int> start, Vector2<int> end, Color color) {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Render::fill_rectangle_sz(Vector2<int> start, Vector2<int> size, Color color) {
|
void Render::fill_rectangle_sz(Vector2<int> size, Color color) {
|
||||||
auto screen_start = m_matrix * m_view_matrix * Vector3<float>(start, 1);
|
auto screen_start = m_matrix * m_view_matrix * Vector3<float>(0, 0, 1);
|
||||||
// auto screen_size = m_matrix * Vector3<float>(size, 1);
|
// auto screen_size = m_matrix * Vector3<float>(size, 1);
|
||||||
m_pge->FillRect(
|
m_pge->FillRect(
|
||||||
screen_start.x(),
|
screen_start.x(),
|
||||||
|
@ -57,16 +58,75 @@ Vector2<int> Render::camera_pos() {
|
||||||
return m_camera_pos;
|
return m_camera_pos;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Render::set_matrix_mode(MatrixMode mode) {
|
||||||
|
m_matrix_mode = mode;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Render::load_identity() {
|
||||||
|
switch(m_matrix_mode) {
|
||||||
|
case MODEL:
|
||||||
|
m_matrix = Matrix3x3<float>(1);
|
||||||
|
break;
|
||||||
|
case PROJECTION:
|
||||||
|
m_view_matrix = Matrix3x3<float>(1);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Render::push_matrix() {
|
||||||
|
switch(m_matrix_mode) {
|
||||||
|
case MODEL:
|
||||||
|
m_matrix_stack.push(m_matrix);
|
||||||
|
break;
|
||||||
|
case PROJECTION:
|
||||||
|
m_view_stack.push(m_view_matrix);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Render::pop_matrix() {
|
||||||
|
switch(m_matrix_mode) {
|
||||||
|
case MODEL:
|
||||||
|
m_matrix = m_matrix_stack.top();
|
||||||
|
m_matrix_stack.pop();
|
||||||
|
break;
|
||||||
|
case PROJECTION:
|
||||||
|
m_view_matrix = m_view_stack.top();
|
||||||
|
m_view_stack.pop();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void Render::translate(Vector2<float> trans) {
|
void Render::translate(Vector2<float> trans) {
|
||||||
m_matrix *= translation_matrix(trans);
|
switch(m_matrix_mode) {
|
||||||
|
case MODEL:
|
||||||
|
m_matrix *= translation_matrix(trans);
|
||||||
|
break;
|
||||||
|
case PROJECTION:
|
||||||
|
m_view_matrix *= translation_matrix(trans);
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Render::rotate(float theta) {
|
void Render::rotate(float theta) {
|
||||||
m_matrix *= rotation_matrix(theta);
|
switch(m_matrix_mode) {
|
||||||
|
case MODEL:
|
||||||
|
m_matrix *= rotation_matrix(theta);
|
||||||
|
break;
|
||||||
|
case PROJECTION:
|
||||||
|
m_view_matrix *= rotation_matrix(theta);
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Render::scale(Vector2<float> scale) {
|
void Render::scale(Vector2<float> scale) {
|
||||||
m_matrix *= scale_matrix(scale);
|
switch(m_matrix_mode) {
|
||||||
|
case MODEL:
|
||||||
|
m_matrix *= scale_matrix(scale);
|
||||||
|
break;
|
||||||
|
case PROJECTION:
|
||||||
|
m_view_matrix *= scale_matrix(scale);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Matrix3x3<float> Render::translation_matrix(Vector2<float> trans) {
|
Matrix3x3<float> Render::translation_matrix(Vector2<float> trans) {
|
||||||
|
|
|
@ -9,19 +9,30 @@
|
||||||
#include "util/matrix3x3.h"
|
#include "util/matrix3x3.h"
|
||||||
|
|
||||||
|
|
||||||
|
enum MatrixMode {
|
||||||
|
MODEL,
|
||||||
|
PROJECTION
|
||||||
|
};
|
||||||
|
|
||||||
class Render {
|
class Render {
|
||||||
public:
|
public:
|
||||||
Render(olc::PixelGameEngine *pge) : m_pge(pge) {}
|
Render(olc::PixelGameEngine *pge) : m_pge(pge) {}
|
||||||
|
|
||||||
void rectangle(Vector2<int> start, Vector2<int> end, Color color = {0, 0, 0});
|
void rectangle(Vector2<int> end, Color color = {0, 0, 0});
|
||||||
void rectangle_sz(Vector2<int> start, Vector2<int> size, Color color = {0, 0, 0});
|
void rectangle_sz(Vector2<int> size, Color color = {0, 0, 0});
|
||||||
|
|
||||||
void fill_rectangle(Vector2<int> start, Vector2<int> end, Color color = {0, 0, 0});
|
void fill_rectangle(Vector2<int> end, Color color = {0, 0, 0});
|
||||||
void fill_rectangle_sz(Vector2<int> start, Vector2<int> size, Color color = {0, 0, 0});
|
void fill_rectangle_sz(Vector2<int> size, Color color = {0, 0, 0});
|
||||||
|
|
||||||
void set_camera_pos(Vector2<int> camera_pos);
|
void set_camera_pos(Vector2<int> camera_pos);
|
||||||
Vector2<int> camera_pos();
|
Vector2<int> camera_pos();
|
||||||
|
|
||||||
|
void set_matrix_mode(MatrixMode mode);
|
||||||
|
|
||||||
|
void load_identity();
|
||||||
|
void push_matrix();
|
||||||
|
void pop_matrix();
|
||||||
|
|
||||||
void translate(Vector2<float> trans);
|
void translate(Vector2<float> trans);
|
||||||
void rotate(float theta);
|
void rotate(float theta);
|
||||||
void scale(Vector2<float> scale);
|
void scale(Vector2<float> scale);
|
||||||
|
@ -34,8 +45,11 @@ class Render {
|
||||||
private:
|
private:
|
||||||
olc::PixelGameEngine *m_pge;
|
olc::PixelGameEngine *m_pge;
|
||||||
|
|
||||||
|
MatrixMode m_matrix_mode{MODEL};
|
||||||
|
|
||||||
Vector2<int> m_camera_pos;
|
Vector2<int> m_camera_pos;
|
||||||
Matrix3x3<float> m_view_matrix{1};
|
Matrix3x3<float> m_view_matrix{1};
|
||||||
Matrix3x3<float> m_matrix{1};
|
Matrix3x3<float> m_matrix{1};
|
||||||
|
std::stack<Matrix3x3<float>> m_view_stack;
|
||||||
std::stack<Matrix3x3<float>> m_matrix_stack;
|
std::stack<Matrix3x3<float>> m_matrix_stack;
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in a new issue