From 420d4c9dc12ebd707f008998ddada143250ddbe1 Mon Sep 17 00:00:00 2001 From: Simon Hardt Date: Thu, 3 Mar 2022 19:43:37 +0100 Subject: [PATCH] add: RenderTarget --- frame/CMakeLists.txt | 3 ++ frame/src/Color.hpp | 8 +++++ frame/src/Size.hpp | 6 ++++ frame/src/Vector.hpp | 56 +++++++++++++++++++++++++++++++ frame/src/main.cpp | 31 ++++++----------- frame/src/render/RenderTarget.cpp | 49 +++++++++++++++++++++++++++ frame/src/render/RenderTarget.hpp | 29 ++++++++++++++++ 7 files changed, 161 insertions(+), 21 deletions(-) create mode 100644 frame/src/Color.hpp create mode 100644 frame/src/Vector.hpp create mode 100644 frame/src/render/RenderTarget.cpp create mode 100644 frame/src/render/RenderTarget.hpp diff --git a/frame/CMakeLists.txt b/frame/CMakeLists.txt index c1ab48c..c84ab39 100644 --- a/frame/CMakeLists.txt +++ b/frame/CMakeLists.txt @@ -8,6 +8,9 @@ set(src src/display/IDisplay.hpp src/display/EPD_7in5_V2.hpp src/display/EPD_7in5_V2.cpp + src/render/RenderTarget.hpp + src/render/RenderTarget.cpp + ) add_executable(${target} ${src}) diff --git a/frame/src/Color.hpp b/frame/src/Color.hpp new file mode 100644 index 0000000..38f47e8 --- /dev/null +++ b/frame/src/Color.hpp @@ -0,0 +1,8 @@ +#pragma once + +#include + +namespace frame +{ + enum Color : uint32_t { WHITE = 0, BLACK = 0xFF }; +} diff --git a/frame/src/Size.hpp b/frame/src/Size.hpp index fe93d85..0e60e3d 100644 --- a/frame/src/Size.hpp +++ b/frame/src/Size.hpp @@ -9,4 +9,10 @@ namespace frame uint32_t width; uint32_t height; }; + + inline Size operator/(Size const& size, int div) + { + return {size.width / div, size.height / div}; + } + } // namespace frame diff --git a/frame/src/Vector.hpp b/frame/src/Vector.hpp new file mode 100644 index 0000000..75c958c --- /dev/null +++ b/frame/src/Vector.hpp @@ -0,0 +1,56 @@ +#pragma once + +#include "Size.hpp" + +namespace frame +{ + struct Vector + { + int32_t x; + int32_t y; + + Vector() = default; + Vector(int32_t x, int32_t) + : x(x) + , y(y) + { + } + + Vector(Size const& size) + : x(size.width) + , y(size.width) + { + } + + void operator=(Size const& size) + { + x = size.width; + y = size.height; + } + }; + + inline bool operator==(Vector const& a, Vector const& b) + { + return a.x == b.x && a.y == b.y; + } + + inline bool operator!=(Vector const& a, Vector const& b) + { + return !(a == b); + } + + inline Vector& operator+=(Vector& a, Vector const& b) + { + a.x += b.x; + a.y += b.y; + return a; + } + + inline Vector& operator-=(Vector& a, Vector const& b) + { + a.x -= b.x; + a.y -= b.y; + return a; + } + +} // namespace frame \ No newline at end of file diff --git a/frame/src/main.cpp b/frame/src/main.cpp index b9cf665..e90332d 100644 --- a/frame/src/main.cpp +++ b/frame/src/main.cpp @@ -6,6 +6,7 @@ using namespace std::chrono_literals; #include "display/EPD_7in5_V2.hpp" +#include "render/RenderTarget.hpp" int main() { @@ -14,34 +15,22 @@ int main() display.Init(); - display.Clear(frame::display::Color::BLACK); - - std::this_thread::sleep_for(2s); - display.Clear(frame::display::Color::WHITE); - std::this_thread::sleep_for(2s); + frame::render::RenderTarget target(display.getSize()); - frame::Image image(display.getSize()); + frame::Vector const center = (display.getSize() / 2); - for(int y = 0; y < 1; ++y) + for(int i = 0; i < 360; i += 45) { - for(int x = 0; x < image.getWidth(); ++x) - { - image.at(x, y) = 0xFF; - } + auto end = center; + end.x += (int)std::cos(i * 0.01745329); + end.y += (int)std::sin(i * 0.01745329); + + target.DrawLine(center, end); } - for(int y = image.getHeight() - 1; y < image.getHeight(); ++y) - { - for(int x = 0; x < image.getWidth(); ++x) - { - image.at(x, y) = 0xFF; - } - } - - - display.Display(image); + display.Display(target.getImage()); std::this_thread::sleep_for(10s); diff --git a/frame/src/render/RenderTarget.cpp b/frame/src/render/RenderTarget.cpp new file mode 100644 index 0000000..0d8ca4d --- /dev/null +++ b/frame/src/render/RenderTarget.cpp @@ -0,0 +1,49 @@ +#include "RenderTarget.hpp" + +namespace frame::render +{ + + RenderTarget::RenderTarget(Size size) + : image(size) + { + } + + void RenderTarget::DrawPixel(Vector const& position, Color color) + { + image.at(position.x, position.y) = color; + } + + void RenderTarget::DrawLine(Vector const& start, + Vector const& end, + Color color) + { + auto const deltaX = std::abs(start.x - end.x); + auto const deltaY = std::abs(start.y - end.y); + + auto const rX = start.x < end.x ? 1 : -1; + auto const rY = start.y < end.y ? 1 : -1; + + auto pos = start; + auto E = 2 * deltaY - deltaX; + + DrawPixel(pos, color); + + while(pos != end) + { + if(E <= 0) + { + pos.x += rX; + + E += 2 * deltaY; + } else + { + pos.x += rX; + pos.y += rY; + + E += 2 * deltaY - 2 * deltaX; + } + DrawPixel(pos, color); + } + } + +} // namespace frame::render \ No newline at end of file diff --git a/frame/src/render/RenderTarget.hpp b/frame/src/render/RenderTarget.hpp new file mode 100644 index 0000000..bae9a8d --- /dev/null +++ b/frame/src/render/RenderTarget.hpp @@ -0,0 +1,29 @@ +#pragma once + +#include "../Color.hpp" +#include "../Image.hpp" +#include "../Vector.hpp" + +namespace frame::render +{ + + class RenderTarget + { + Image image; + + public: + RenderTarget(Size size); + + void DrawPixel(Vector const& position, Color color); + + void DrawLine(Vector const& start, + Vector const& end, + Color color = BLACK); + + Image const& getImage() + { + return image; + } + }; + +} // namespace frame::render \ No newline at end of file