#include "renderer.h" #include "simulation.h" #include "consts.h" #include "level.h" #include "views.h" Renderer::Renderer() { win_ = window_ptr( SDL_CreateWindow( "dispatcher", 100, 100, WINDOW_SIZE.w(), WINDOW_SIZE.h(), SDL_WINDOW_SHOWN)); if (!win_) { throw sdl_error(); } ren_ = renderer_ptr( SDL_CreateRenderer( win_.get(), -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC)); if (!ren_) { throw sdl_error(); } SDL_SetRenderDrawBlendMode(ren_.get(), SDL_BLENDMODE_MOD); SDL_SetRenderDrawColor(ren_.get(), 255, 150, 255, 255); SDL_RenderFillRect(ren_.get(), nullptr); } void Renderer::render(const Simulation& sim) { texture_ptr canvas( SDL_CreateTexture( ren_.get(), SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, WINDOW_SIZE.w(), WINDOW_SIZE.h())); if (!canvas) { throw sdl_error(); } SDL_SetRenderTarget(ren_.get(), nullptr); SDL_SetRenderDrawBlendMode(ren_.get(), SDL_BLENDMODE_NONE); SDL_SetRenderDrawColor(ren_.get(), 255, 150, rand() % 255, 255); SDL_RenderClear(ren_.get()); const Level& level = sim.getLevel(); for (size_t y = 0; y < level.getSize().h(); y++) { for (size_t x = 0; x < level.getSize().w(); x++) { int val = 255 - level.at(x, y) * 10; SDL_SetRenderDrawColor(ren_.get(), val, val, val, 255); SDL_Rect rect { static_cast(x * TILE_SIZE.w()), static_cast(y * TILE_SIZE.h()), TILE_SIZE.w(), TILE_SIZE.h() }; SDL_RenderFillRect(ren_.get(), &rect); } } constexpr Layer renderOrder[] = { Layer::track, Layer::object }; ranges::for_each( ranges::view::for_each( renderOrder, [&] (Layer layer) { return sim.entityRange() | views::isOnLayer(layer); }), [&] (const Entity& entity) { SDL_SetRenderDrawColor(ren_.get(), entity.colorVal, entity.colorVal, 65, 255); SDL_Rect rect { static_cast(entity.pos.x()), static_cast(entity.pos.y()), static_cast(entity.size.w()), static_cast(entity.size.h()) }; SDL_RenderFillRect(ren_.get(), &rect); }); //SDL_RenderCopy(ren_.get(), canvas.get(), nullptr, nullptr); SDL_RenderPresent(ren_.get()); }