178 lines
5.0 KiB
C++
178 lines
5.0 KiB
C++
#include "mare.h"
|
|
|
|
namespace Render {
|
|
|
|
Drawable::Drawable(const size_t id, Drawable* parent, Mare* engine):
|
|
_id(id),
|
|
_parent(parent),
|
|
_engine(engine),
|
|
_origin({0,0}),
|
|
_bbox({0,0,0,0}),
|
|
_blendMode(Render::BlendMode::Add),
|
|
_dirty(false)
|
|
{
|
|
}
|
|
|
|
Drawable::~Drawable() {
|
|
|
|
}
|
|
|
|
//--------+--------+--------+--------+--------+--------+--------+--------+--------+--------//
|
|
//Point
|
|
DrawablePoint::DrawablePoint(const size_t id, Drawable* parent, Mare* engine, dim_t size):
|
|
Drawable(id, parent,engine),
|
|
_size(size)
|
|
{
|
|
|
|
}
|
|
|
|
DrawablePoint::~DrawablePoint() {
|
|
|
|
}
|
|
|
|
void DrawablePoint::render() {
|
|
uint8_t *buf;
|
|
pos_t o = getOrigin();
|
|
if (isDirty()){
|
|
buf = getBuffer();
|
|
//TODO: implement screen rotation and margin check
|
|
auto dx = engine()->getSize().x;
|
|
auto dy = engine()->getSize().y;
|
|
for (uint16_t xx(0); xx< _size.x; xx++){
|
|
for (uint16_t yy(0); yy < _size.y; yy++)
|
|
{
|
|
engine()->setPixel(buf,o.x+xx,o.y+yy,getBlendMode());
|
|
}
|
|
}
|
|
resetDirty();
|
|
}
|
|
}
|
|
|
|
|
|
//--------+--------+--------+--------+--------+--------+--------+--------+--------+--------//
|
|
//Line
|
|
DrawableLine::DrawableLine(const size_t id, Drawable* parent, Mare* engine):
|
|
Drawable(id, parent,engine),
|
|
_thickness(1),
|
|
_length(0),
|
|
_rotation(0)
|
|
{
|
|
|
|
}
|
|
|
|
DrawableLine::~DrawableLine()
|
|
{
|
|
|
|
}
|
|
|
|
void DrawableLine::render(){
|
|
uint8_t* buf = getBuffer();
|
|
auto tt = _thickness;
|
|
auto e = engine();
|
|
if (isDirty()) {
|
|
_rotation = _rotation % 360;
|
|
pos_t o = getOrigin();
|
|
pos_t res = {0,0};
|
|
for (uint16_t t(0); t < _thickness; ++t) {
|
|
for (uint16_t xx(0); xx < _length; ++xx) {
|
|
if (_rotation == 0 || _rotation == 180){
|
|
res.x = _rotation == 0 ? xx : (_length-xx);
|
|
res.y = t-(_thickness>>1);
|
|
} else if (_rotation == 90 || _rotation == 270){
|
|
res.x = t-(_thickness>>1);
|
|
res.y = _rotation == 90 ? xx : _length-xx;
|
|
} else {
|
|
res = e->rotateXY(xx,t-(_thickness>>1),_rotation/180.0f*M_PI);
|
|
}
|
|
e->setPixel(buf,res.x+o.x,res.y+o.y,getBlendMode());
|
|
|
|
}
|
|
}
|
|
resetDirty();
|
|
}
|
|
}
|
|
|
|
//--------+--------+--------+--------+--------+--------+--------+--------+--------+--------//
|
|
//Rectangle
|
|
|
|
DrawableRectangle::DrawableRectangle(const size_t id, Drawable* parent, Mare* engine):
|
|
Drawable(id, parent,engine),
|
|
_thickness(1),
|
|
_rotation(0),
|
|
_dim({8,8}),
|
|
_outline(false)
|
|
{
|
|
|
|
}
|
|
|
|
DrawableRectangle::~DrawableRectangle()
|
|
{
|
|
|
|
}
|
|
|
|
void DrawableRectangle::createOutline(){
|
|
auto e = engine();
|
|
pos_t o = getOrigin();
|
|
float cx,sx;
|
|
if (l1 == nullptr) l1 = e->addDrawable<DrawableLine>();
|
|
if (l2 == nullptr) l2 = e->addDrawable<DrawableLine>();
|
|
if (l3 == nullptr) l3 = e->addDrawable<DrawableLine>();
|
|
if (l4 == nullptr) l4 = e->addDrawable<DrawableLine>();
|
|
|
|
_rotation %= 360;
|
|
sincosf(_rotation/180.0f*M_PI, &sx, &cx);
|
|
|
|
l1->setRotation(_rotation);
|
|
l1->setLength(_dim.x);
|
|
l1->setThickness(_thickness);
|
|
l2->setRotation(_rotation+90);
|
|
l2->setLength(_dim.y);
|
|
l2->setThickness(_thickness);
|
|
l3->setRotation(_rotation);
|
|
l3->setLength(_dim.x);
|
|
l3->setThickness(_thickness);
|
|
l4->setRotation(_rotation+90);
|
|
l4->setLength(_dim.y);
|
|
l4->setThickness(_thickness);
|
|
|
|
l1->setOrigin(o);
|
|
l2->setOrigin({(p_t)(o.x+(_dim.x-_thickness+1)*cx), (p_t)(o.y+(_dim.x-_thickness+1)*sx)});
|
|
l3->setOrigin({(p_t)(o.x-(_dim.y-_thickness+1)*sx), (p_t)(o.y+(_dim.y-_thickness+1)*cx)});
|
|
l4->setOrigin(o);
|
|
|
|
l1->setDirty();
|
|
l2->setDirty();
|
|
l3->setDirty();
|
|
l4->setDirty();
|
|
}
|
|
|
|
void DrawableRectangle::render()
|
|
{
|
|
uint8_t* buf = getBuffer();
|
|
auto tt = _thickness;
|
|
auto e = engine();
|
|
if (isDirty()) {
|
|
if (_outline) {
|
|
createOutline();
|
|
l1->render();
|
|
l2->render();
|
|
l3->render();
|
|
l4->render();
|
|
}
|
|
resetDirty();
|
|
}
|
|
}
|
|
|
|
//--------+--------+--------+--------+--------+--------+--------+--------+--------+--------//
|
|
//Circle
|
|
|
|
//--------+--------+--------+--------+--------+--------+--------+--------+--------+--------//
|
|
//Character
|
|
|
|
//--------+--------+--------+--------+--------+--------+--------+--------+--------+--------//
|
|
//String
|
|
|
|
//--------+--------+--------+--------+--------+--------+--------+--------+--------+--------//
|
|
//Custom
|
|
|
|
} |