openarras/src/render/window.cpp
2023-05-30 21:03:04 +08:00

77 lines
2.0 KiB
C++

#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