#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