rectagle outline drawing
This commit is contained in:
@@ -54,14 +54,14 @@ namespace Render {
|
||||
DrawableLine::DrawableLine(const size_t id, Drawable* parent, Mare* engine):
|
||||
Drawable(id, parent,engine),
|
||||
_thickness(1),
|
||||
_lenght(0),
|
||||
_rotation(0.0f),
|
||||
_outline(false)
|
||||
_length(0),
|
||||
_rotation(0)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
DrawableLine::~DrawableLine(){
|
||||
DrawableLine::~DrawableLine()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
@@ -69,55 +69,23 @@ namespace 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);
|
||||
if (isDirty()) {
|
||||
_rotation = _rotation % 360;
|
||||
pos_t o = getOrigin();
|
||||
static spos_t res = {0,0};
|
||||
pos_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());
|
||||
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();
|
||||
@@ -127,6 +95,74 @@ namespace Render {
|
||||
//--------+--------+--------+--------+--------+--------+--------+--------+--------+--------//
|
||||
//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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user