From bc4c5b6ec42297dc51f0139d49198eb58f86f3f6 Mon Sep 17 00:00:00 2001 From: szdytom Date: Tue, 30 May 2023 21:03:04 +0800 Subject: [PATCH] add render --- assets/basic.png | Bin 0 -> 6114 bytes 2d.hpp => include/2d.h | 25 +++++++---- include/render.h | 98 +++++++++++++++++++++++++++++++++++++++++ main.cpp | 32 ++++++++++++++ objects.hpp | 32 ++++++++++++++ src/render/misc.cpp | 42 ++++++++++++++++++ src/render/surface.cpp | 53 ++++++++++++++++++++++ src/render/texture.cpp | 63 ++++++++++++++++++++++++++ src/render/window.cpp | 76 ++++++++++++++++++++++++++++++++ test/cases/2d.cpp | 3 +- test/cases/objects.cpp | 10 +++++ xmake.lua | 24 ++++++++-- 12 files changed, 446 insertions(+), 12 deletions(-) create mode 100644 assets/basic.png rename 2d.hpp => include/2d.h (80%) create mode 100644 include/render.h create mode 100644 main.cpp create mode 100644 objects.hpp create mode 100644 src/render/misc.cpp create mode 100644 src/render/surface.cpp create mode 100644 src/render/texture.cpp create mode 100644 src/render/window.cpp create mode 100644 test/cases/objects.cpp diff --git a/assets/basic.png b/assets/basic.png new file mode 100644 index 0000000000000000000000000000000000000000..1548bce67d8a77947fc5118d76da61b04804e4cb GIT binary patch literal 6114 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 literal 0 HcmV?d00001 diff --git a/2d.hpp b/include/2d.h similarity index 80% rename from 2d.hpp rename to include/2d.h index 71eeba5..9f7681c 100644 --- a/2d.hpp +++ b/include/2d.h @@ -5,19 +5,25 @@ #include #include +namespace arras { + using Float = float; using Vec2 = std::complex; const Float eps = 1e-6; -Float cross(const Vec2& a, const Vec2& b) { +inline Float cross(const Vec2& a, const Vec2& b) { return a.real() * b.imag() - a.imag() * b.real(); } -Float dot(const Vec2& a, const Vec2& b) { +inline Float dot(const Vec2& a, const Vec2& b) { return a.real() * b.real() + a.imag() * b.imag(); } +inline Float asAngle(const Vec2& d) { + return std::atan2(d.imag(), d.real()); +} + struct Circle { Vec2 o; Float r; @@ -39,8 +45,10 @@ struct Polygon { Polygon(const std::array& v): vertex(v) {} Polygon(std::initializer_list&& v) { int i = 0; - for (auto &&x : v) { - if (i >= n) break; + for (auto&& x : v) { + if (i >= n) { + break; + } vertex[i] = x; i += 1; } @@ -64,12 +72,12 @@ struct Polygon { } }; -bool intersect(const Circle& a, const Circle& b) { +inline bool intersect(const Circle& a, const Circle& b) { return abs(a.o - b.o) <= a.r + b.r; } template -bool intersect(const Polygon& a, const Polygon& b) { +inline bool intersect(const Polygon& a, const Polygon& b) { for (int i = 0; i < n; i++) { if (b.contain(a[i])) { return true; @@ -98,7 +106,7 @@ bool intersect(const Polygon& a, const Polygon& b) { } template -bool intersect(const Polygon& a, const Circle& b) { +inline bool intersect(const Polygon& a, const Circle& b) { if (a.contain(b.o)) { return true; } @@ -121,8 +129,9 @@ bool intersect(const Polygon& a, const Circle& b) { } template -bool intersect(const Circle& b, const Polygon& a) { +inline bool intersect(const Circle& b, const Polygon& a) { return intersect(a, b); } +} #endif diff --git a/include/render.h b/include/render.h new file mode 100644 index 0000000..1e009cd --- /dev/null +++ b/include/render.h @@ -0,0 +1,98 @@ +#ifndef HEADER_ARRAS_RENDER_H +#define HEADER_ARRAS_RENDER_H + +extern "C" { +#include +#include +} + +#include "2d.h" +#include +#include +#include +#include + +namespace arras { + +struct Color { + uint8_t r, g, b, a; + + Color(); + Color(uint8_t r, uint8_t g, uint8_t b, uint8_t a); +}; + +std::shared_ptr makeRect(int x, int y, int w, int h); +std::shared_ptr makeFRect(const arras::Vec2& pos, const arras::Vec2& size); + +class RenderSurface { +public: + RenderSurface(RenderSurface&& rs); + RenderSurface(const RenderSurface& rs); + explicit RenderSurface(SDL_RWops* src); + RenderSurface(int width, int height); + + ~RenderSurface(); + + SDL_Surface* nativeHandle() const noexcept; + + int width() const noexcept; + int height() const noexcept; + +private: + SDL_Surface* s; +}; + +class RenderWindow; + +class RenderTexture { + RenderTexture(const RenderTexture&) = delete; + RenderTexture& operator=(const RenderTexture&) = delete; + +public: + RenderTexture(RenderTexture&& rt); + RenderTexture(const RenderWindow& rd, SDL_RWops* src); + RenderTexture(const RenderWindow& rd, const RenderSurface& rs); + + ~RenderTexture(); + + SDL_Texture* nativeHandle() const noexcept; + + int width() const noexcept; + int height() const noexcept; + + std::pair calcRenderSize(int w, int h) const noexcept; + +private: + SDL_Texture* t; + int w, h; +}; + +class RenderWindow { + RenderWindow(const RenderWindow&) = delete; + RenderWindow& operator=(const RenderWindow&) = delete; + +public: + RenderWindow(RenderWindow&& rd); + RenderWindow(int w, int h); + + ~RenderWindow(); + + SDL_Renderer* nativeHandle() const noexcept; + + void renderTextureAt(const RenderTexture& t, const Vec2& pos) const; + void renderTextureAt(const RenderTexture& t, const Vec2& pos, const Vec2& direction) const; + + void present() const noexcept; + void clear(const Color& c = {}) const; + + int width() const noexcept; + int height() const noexcept; + +private: + int w, h; + SDL_Window* window; + SDL_Renderer* renderer; +}; +} // namespace arras + +#endif diff --git a/main.cpp b/main.cpp new file mode 100644 index 0000000..d643d1f --- /dev/null +++ b/main.cpp @@ -0,0 +1,32 @@ +#include "2d.h" +#include "render.h" +#include +#include +#include + +int main() { + arras::RenderWindow w(2360, 1240); + arras::RenderTexture t(w, SDL_RWFromFile("assets/basic.png", "rb")); + std::printf("%d %d\n", t.width(), t.height()); + + const float PI = acos(-1); + arras::Vec2 d{1, 0}, v{std::cos(PI / 300), std::sin(PI / 300)}; + SDL_Event evt; + while (true) { + while (SDL_PollEvent(&evt)) { + if (evt.type == SDL_QUIT) { + break; + } + } + + w.clear(); + w.renderTextureAt(t, {200, 200}, d); + w.present(); + d *= v; + // pos += v; + // if (pos.real() > 1000 || pos.real() < 200) { + // v *= -1; + // } + std::this_thread::sleep_for(std::chrono::milliseconds(16)); + } +} diff --git a/objects.hpp b/objects.hpp new file mode 100644 index 0000000..342cd51 --- /dev/null +++ b/objects.hpp @@ -0,0 +1,32 @@ +#ifndef HEADER_OBJECTS_HPP +#define HEADER_OBJECTS_HPP + +#include "2d.h" +#include + +namespace arras { + +struct Transform { + Vec2 position; +}; + +struct Velocity { + Vec2 velocity; +}; + +struct EngineAcceleration { + Vec2 ideal_velocity; + Float acceleration; +}; + +inline entt::entity makeTank(entt::registry &r, Vec2 position) { + const auto e = r.create(); + r.emplace(e, Transform{position}); + r.emplace(e, Velocity{{0, 0}}); + r.emplace(e, EngineAcceleration{{0, 0}, 1}); + return e; +} + +} + +#endif \ No newline at end of file diff --git a/src/render/misc.cpp b/src/render/misc.cpp new file mode 100644 index 0000000..5ca083b --- /dev/null +++ b/src/render/misc.cpp @@ -0,0 +1,42 @@ +#include "render.h" + +namespace { + +class SDLLoader { +private: + SDLLoader() { + SDL_Init(SDL_INIT_VIDEO | SDL_INIT_EVENTS); + SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "best"); + IMG_Init(IMG_INIT_PNG); + } + + ~SDLLoader() { + IMG_Quit(); + SDL_Quit(); + } + + static const SDLLoader _; +}; + +} // namespace + +arras::Color::Color(): r(255), g(255), b(255), a(255) {} +arras::Color::Color(uint8_t r, uint8_t g, uint8_t b, uint8_t a): r(r), g(g), b(b), a(a) {} + +std::shared_ptr arras::makeRect(int x, int y, int w, int h) { + auto res = std::make_shared(); + res->x = x; + res->y = y; + res->w = w; + res->h = h; + return res; +} + +std::shared_ptr arras::makeFRect(const arras::Vec2& pos, const arras::Vec2& size) { + auto res = std::make_shared(); + res->x = pos.real(); + res->y = pos.imag(); + res->w = size.real(); + res->h = size.imag(); + return res; +} diff --git a/src/render/surface.cpp b/src/render/surface.cpp new file mode 100644 index 0000000..70146ad --- /dev/null +++ b/src/render/surface.cpp @@ -0,0 +1,53 @@ +#include "render.h" + +using namespace arras; + +RenderSurface::RenderSurface(RenderSurface&& rs): s(rs.s) { + rs.s = nullptr; +} + +RenderSurface::RenderSurface(const RenderSurface& rs) { + s = SDL_CreateRGBSurfaceWithFormat(0, rs.width(), rs.height(), 32, SDL_PIXELFORMAT_RGBA8888); + if (!s) { + throw std::runtime_error( + fmt::format("SDL_CreateRGBSurfaceWithFormat() failed: {}", SDL_GetError())); + } + if (SDL_BlitSurface(rs.nativeHandle(), + nullptr, + s, + makeRect(0, 0, rs.width(), rs.height()).get()) + != 0) { + throw std::runtime_error(fmt::format("SDL_BlitSurface() failed: {}", SDL_GetError())); + } +} + +RenderSurface::RenderSurface(SDL_RWops* src) { + s = IMG_Load_RW(src, 1); + if (!s) { + throw std::runtime_error(fmt::format("IMG_Load_RW() failed: {}", IMG_GetError())); + } +} + +RenderSurface::RenderSurface(int width, int height) { + s = SDL_CreateRGBSurfaceWithFormat(0, width, height, 32, SDL_PIXELFORMAT_RGBA8888); + if (!s) { + throw std::runtime_error( + fmt::format("SDL_CreateRGBSurfaceWithFormat() failed: {}", SDL_GetError())); + } +} + +RenderSurface ::~RenderSurface() { + SDL_FreeSurface(s); +} + +SDL_Surface* RenderSurface::nativeHandle() const noexcept { + return s; +} + +int RenderSurface::width() const noexcept { + return s->w; +} + +int RenderSurface::height() const noexcept { + return s->h; +} \ No newline at end of file diff --git a/src/render/texture.cpp b/src/render/texture.cpp new file mode 100644 index 0000000..5b86e16 --- /dev/null +++ b/src/render/texture.cpp @@ -0,0 +1,63 @@ + +#include "render.h" + +using namespace arras; + +RenderTexture::RenderTexture(RenderTexture&& rt): t(rt.t) { + rt.t = nullptr; +} + +RenderTexture::RenderTexture(const RenderWindow& rd, SDL_RWops* src) { + t = IMG_LoadTexture_RW(rd.nativeHandle(), src, 1); + if (!t) { + throw std::runtime_error(fmt::format("IMG_LoadTexture_RW() failed: {}", IMG_GetError())); + } + if (SDL_QueryTexture(t, nullptr, nullptr, &w, &h) != 0) { + throw std::runtime_error(fmt::format("SDL_QueryTexture() failed: {}", SDL_GetError())); + } +} + +RenderTexture::RenderTexture(const RenderWindow& rd, const RenderSurface& rs) { + t = SDL_CreateTextureFromSurface(rd.nativeHandle(), rs.nativeHandle()); + if (!t) { + throw std::runtime_error( + fmt::format("SDL_CreateRGBSurfaceWithFormat() failed: {}", SDL_GetError())); + } + if (SDL_QueryTexture(t, nullptr, nullptr, &w, &h)) { + throw std::runtime_error(fmt::format("SDL_QueryTexture() failed: {}", SDL_GetError())); + } +} + +RenderTexture::~RenderTexture() { + SDL_DestroyTexture(t); +} + +SDL_Texture* RenderTexture::nativeHandle() const noexcept { + return t; +} + +int RenderTexture::width() const noexcept { + return w; +} + +int RenderTexture::height() const noexcept { + return h; +} + +std::pair RenderTexture::calcRenderSize(int w, int h) const noexcept { + int rw, rh; + if (w == 0 && h == 0) { + rw = width(); + rh = height(); + } else if (w == 0) { + rw = (h * width() / height()); + rh = h; + } else if (h == 0) { + rw = w; + rh = (w * height() / width()); + } else { + rw = w; + rh = h; + } + return {rw, rh}; +} diff --git a/src/render/window.cpp b/src/render/window.cpp new file mode 100644 index 0000000..90b44a3 --- /dev/null +++ b/src/render/window.cpp @@ -0,0 +1,76 @@ +#ifndef HEADER_ARRAS_RENDER_WINDOW_HPP +#define HEADER_ARRAS_RENDER_WINDOW_HPP + +#include "render.h" +#define Pi 3.14159265358979323846 + +using namespace arras; + +RenderWindow::RenderWindow(RenderWindow&& rd) + : w(rd.w), h(rd.h), window(rd.window), renderer(rd.renderer) { + rd.renderer = nullptr; + rd.window = nullptr; +} + +RenderWindow::RenderWindow(int w, int h): w(w), h(h) { + if (SDL_CreateWindowAndRenderer(w, h, SDL_WINDOW_SHOWN | SDL_WINDOW_ALLOW_HIGHDPI, &window, &renderer) != 0) { + throw std::runtime_error( + fmt::format("SDL_CreateWindowAndRenderer() failed: {}", SDL_GetError())); + } +} + +RenderWindow::~RenderWindow() { + SDL_DestroyRenderer(renderer); + SDL_DestroyWindow(window); +} + +SDL_Renderer* RenderWindow::nativeHandle() const noexcept { + return renderer; +} + +void RenderWindow::renderTextureAt(const RenderTexture& t, const Vec2& pos) const { + if (SDL_RenderCopyF(renderer, + t.nativeHandle(), + NULL, + makeFRect(pos, {t.width(), t.height()}).get())) { + throw std::runtime_error(fmt::format("SDL_RenderCopy() failed: {}", SDL_GetError())); + } +} + +void RenderWindow::renderTextureAt(const RenderTexture& t, + const Vec2& pos, + const Vec2& direction) const { + if (SDL_RenderCopyExF(renderer, + t.nativeHandle(), + NULL, + makeFRect(pos, {t.width(), t.height()}).get(), + -asAngle(direction) * 180 / Pi, + nullptr, + SDL_FLIP_NONE)) { + throw std::runtime_error(fmt::format("SDL_RenderCopy() failed: {}", SDL_GetError())); + } +} + +void RenderWindow::present() const noexcept { + SDL_RenderPresent(renderer); +} + +void RenderWindow::clear(const Color& c) const { + if (SDL_SetRenderDrawColor(renderer, c.r, c.g, c.b, c.a)) { + throw std::runtime_error( + fmt::format("SDL_SetRenderDrawColor() failed: {}", SDL_GetError())); + } + if (SDL_RenderClear(renderer)) { + throw std::runtime_error(fmt::format("SDL_RenderClear() failed: {}", SDL_GetError())); + } +} + +int RenderWindow::width() const noexcept { + return w; +} + +int RenderWindow::height() const noexcept { + return h; +} + +#endif diff --git a/test/cases/2d.cpp b/test/cases/2d.cpp index 0be2e94..c8b5ed8 100644 --- a/test/cases/2d.cpp +++ b/test/cases/2d.cpp @@ -1,4 +1,4 @@ -#include "2d.hpp" +#include "2d.h" #include "test/u.hpp" #include #include @@ -6,6 +6,7 @@ namespace { AddTestCase _(1, "2d.hpp", [](TestCase& t) { + using namespace arras; t.expectEq([] { return cross({1, 2}, {4, 1}); }, -7); t.expectEq([] { return cross({.5, 2.5}, {4, 1.5}); }, -9.25); diff --git a/test/cases/objects.cpp b/test/cases/objects.cpp new file mode 100644 index 0000000..9c8a420 --- /dev/null +++ b/test/cases/objects.cpp @@ -0,0 +1,10 @@ +#include "objects.hpp" +#include "test/u.hpp" + +namespace { + +AddTestCase _(1, "objects.hpp", [](TestCase& t) { + +}); + +} diff --git a/xmake.lua b/xmake.lua index b23e643..d5d6fe6 100644 --- a/xmake.lua +++ b/xmake.lua @@ -4,13 +4,31 @@ set_version("0.0a0") set_languages("c++17") set_targetdir(".") -target("test") +add_requires("entt 3.11", "libsdl 2.26", "libsdl_image 2.6", "fmt 10") +add_includedirs("include", ".") + + +target("main") + set_default(true) set_kind("binary") + add_files("main.cpp") + add_files("src/**/*.cpp") + + add_packages("entt", "libsdl", "libsdl_image", "fmt") set_warnings("allextra") + +target("test") + set_default(false) + set_kind("binary") + set_prefixname("test-") + add_files("test/main.cpp") add_files("test/cases/*.cpp") - add_includedirs(".") + add_files("src/**/*.cpp") + + add_packages("entt", "fmt") + + set_warnings("allextra") set_optimize("none") set_symbols("debug") add_defines("DEBUG") - set_prefixname("test-") \ No newline at end of file