142 lines
4.5 KiB
C++
142 lines
4.5 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),
|
|
_lenght(0),
|
|
_rotation(0.0f),
|
|
_outline(false)
|
|
{
|
|
|
|
}
|
|
|
|
DrawableLine::~DrawableLine(){
|
|
|
|
}
|
|
|
|
void DrawableLine::render(){
|
|
uint8_t* buf = getBuffer();
|
|
auto tt = _thickness;
|
|
auto e = engine();
|
|
// auto square = [buf,e,tt](uint16_t x, uint16_t y){
|
|
// uint8_t c = tt > 1 ? tt>>1 : 0; //sprite render
|
|
// x -= c;
|
|
// y -= c;
|
|
// for (auto xx(0); xx <= tt; ++xx)
|
|
// for (auto yy(0); yy <= tt; ++yy){
|
|
// e->setPixel(buf,xx+x,yy+y,getBlendMode());
|
|
// }
|
|
// };
|
|
|
|
// if (isDirty() && false) {
|
|
// _rotation = fmod(_rotation, M_TWOPI);
|
|
// float cx,sx;
|
|
// sincosf(_rotation,&sx,&cx); // use optimized float instructions
|
|
// uint16_t endX = fabs(round(cx*(float)_lenght));
|
|
// uint16_t endY = fabs(round(sx*(float)_lenght));
|
|
|
|
// int8_t mult = (_rotation <= 3*M_PI_4 || _rotation >= 7*M_PI_4) ? 1 : -1;
|
|
|
|
// if ((_rotation >= 7*M_PI_4 || _rotation <= M_PI_4) ||
|
|
// (_rotation >= 3*M_PI_4 && _rotation <= 5*M_PI_4)) {
|
|
|
|
// for(uint16_t xx(0); xx <= endX; ++xx){
|
|
// float dydx = cx == 0.0f ? 0 : (sx/cx);
|
|
// uint16_t y = getOrigin().y+xx*mult*dydx;
|
|
// uint16_t x = getOrigin().x+xx*mult;
|
|
// square(x,y);
|
|
// }
|
|
// } else {
|
|
// for (uint16_t yy(0); yy <= endY; ++yy){
|
|
// float dxdy = sx == 0.0f ? 0 : (cx/sx);
|
|
// uint16_t y = getOrigin().y+yy*mult;
|
|
// uint16_t x = getOrigin().x+yy*mult*dxdy;
|
|
// square(x,y);
|
|
// }
|
|
// }
|
|
// resetDirty();
|
|
// }
|
|
|
|
if (isDirty() && true) {
|
|
_rotation = fmod(_rotation, M_TWOPI);
|
|
pos_t o = getOrigin();
|
|
static spos_t res = {0,0};
|
|
for (uint16_t t(0); t < _thickness; ++t) {
|
|
for (uint16_t xx(0); xx < _lenght; ++xx) {
|
|
if (!_outline || (_outline && (xx == 0 || xx == _lenght - 1 || t == 0 || t == _thickness - 1))) {
|
|
res = e->rotateXY(xx,t-(_thickness>>1),_rotation);
|
|
e->setPixel(buf,res.x+o.x,res.y+o.y,getBlendMode());
|
|
}
|
|
}
|
|
}
|
|
resetDirty();
|
|
}
|
|
}
|
|
|
|
//--------+--------+--------+--------+--------+--------+--------+--------+--------+--------//
|
|
//Rectangle
|
|
|
|
//--------+--------+--------+--------+--------+--------+--------+--------+--------+--------//
|
|
//Circle
|
|
|
|
//--------+--------+--------+--------+--------+--------+--------+--------+--------+--------//
|
|
//Character
|
|
|
|
//--------+--------+--------+--------+--------+--------+--------+--------+--------+--------//
|
|
//String
|
|
|
|
//--------+--------+--------+--------+--------+--------+--------+--------+--------+--------//
|
|
//Custom
|
|
|
|
} |