From d92c7970df0d2e0a0c3f84037640336102c084a6 Mon Sep 17 00:00:00 2001 From: Kelly Rauchenberger Date: Sat, 30 Jan 2021 04:46:44 -0500 Subject: Imported renderer stuff from Ether --- src/renderer.cpp | 216 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 216 insertions(+) create mode 100644 src/renderer.cpp (limited to 'src/renderer.cpp') diff --git a/src/renderer.cpp b/src/renderer.cpp new file mode 100644 index 0000000..e29d8cd --- /dev/null +++ b/src/renderer.cpp @@ -0,0 +1,216 @@ +#include "renderer.h" +#include "consts.h" + +Renderer::Renderer() +{ + win_ = window_ptr( + SDL_CreateWindow( + "Tanetane", + 100, + 100, + GAME_WIDTH, + GAME_HEIGHT, + 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(); + } +} + +/*void Renderer::render() +{ + texture_ptr canvas( + SDL_CreateTexture( + ren_.get(), + SDL_PIXELFORMAT_RGBA8888, + SDL_TEXTUREACCESS_TARGET, + TILE_WIDTH * game.map.getWidth(), + TILE_HEIGHT * game.map.getHeight())); + + if (!canvas) + { + throw sdl_error(); + } + + SDL_SetRenderTarget(ren_.get(), canvas.get()); + SDL_SetRenderDrawBlendMode(ren_.get(), SDL_BLENDMODE_NONE); + SDL_SetRenderDrawColor(ren_.get(), rand() % 255, rand() % 255, rand() % 255, 255); + SDL_RenderClear(ren_.get()); + + for (int y = game.map.getTop(); y < game.map.getBottom(); y++) + { + for (int x = game.map.getLeft(); x < game.map.getRight(); x++) + { + bool draw = true; + + if ((game.player_x == x && game.player_y == y) && game.renderPlayer) + { + SDL_SetRenderDrawColor(ren_.get(), 255, 255, 0, 255); + } else if (!game.map.at(x,y).lit) + { + if (drawDark) + { + SDL_SetRenderDrawColor(ren_.get(), 40, 40, 40, 255); + } else { + draw = false; + } + } else { + int alpha = 255; + + switch (game.map.at(x,y).tile) + { + case Tile::Floor: + { + SDL_SetRenderDrawColor(ren_.get(), 210, 210, 210, alpha); + break; + } + + case Tile::Wall: + { + SDL_SetRenderDrawColor(ren_.get(), 100, 100, 100, alpha); + break; + } + + case Tile::Dust: + { + SDL_SetRenderDrawColor(ren_.get(), 128, 40, 255, alpha); + break; + } + + case Tile::Lamp: + { + SDL_SetRenderDrawColor(ren_.get(), 0, 255, 255, alpha); + break; + } + } + } + + if (draw) + { + SDL_Rect rect { + game.map.getTrueX(x) * TILE_WIDTH, + game.map.getTrueY(y) * TILE_HEIGHT, + TILE_WIDTH, + TILE_HEIGHT}; + + SDL_RenderFillRect(ren_.get(), &rect); + } + } + } + + texture_ptr mask( + SDL_CreateTexture( + ren_.get(), + SDL_PIXELFORMAT_RGBA8888, + SDL_TEXTUREACCESS_TARGET, + TILE_WIDTH * game.map.getWidth(), + TILE_HEIGHT * game.map.getHeight())); + + if (!mask) + { + throw sdl_error(); + } + + SDL_SetRenderTarget(ren_.get(), mask.get()); + SDL_SetRenderDrawColor(ren_.get(), 0, 0, 0, 0); + SDL_RenderClear(ren_.get()); + + for (int y = game.map.getTop(); y < game.map.getBottom(); y++) + { + for (int x = game.map.getLeft(); x < game.map.getRight(); x++) + { + if (game.map.at(x,y).lightType != Source::None) + { + texture_ptr sourceMask( + SDL_CreateTexture( + ren_.get(), + SDL_PIXELFORMAT_RGBA8888, + SDL_TEXTUREACCESS_TARGET, + TILE_WIDTH * game.map.getWidth(), + TILE_HEIGHT * game.map.getHeight())); + + if (!sourceMask) + { + throw sdl_error(); + } + + SDL_SetRenderTarget(ren_.get(), sourceMask.get()); + SDL_SetRenderDrawBlendMode(ren_.get(), SDL_BLENDMODE_NONE); + SDL_SetRenderDrawColor(ren_.get(), 0, 0, 0, 0); + SDL_RenderClear(ren_.get()); + + int fadeX = game.map.getTrueX(x) - game.map.at(x,y).lightRadius; + int fadeY = game.map.getTrueY(y) - game.map.at(x,y).lightRadius; + int fadeRight = game.map.getTrueX(x) + game.map.at(x,y).lightRadius; + int fadeBottom = game.map.getTrueY(y) + game.map.at(x,y).lightRadius; + + SDL_Rect fadeRect { + fadeX * TILE_WIDTH, + fadeY * TILE_HEIGHT, + (game.map.at(x,y).lightRadius * 2 + 1) * TILE_WIDTH, + (game.map.at(x,y).lightRadius * 2 + 1) * TILE_HEIGHT}; + + if (game.map.at(x,y).lightType == Source::Lamp) + { + SDL_SetTextureBlendMode(lampFade_.get(), SDL_BLENDMODE_NONE); + SDL_RenderCopy(ren_.get(), lampFade_.get(), nullptr, &fadeRect); + } else if (game.map.at(x,y).lightType == Source::Player) { + SDL_SetTextureBlendMode(playerFade_.get(), SDL_BLENDMODE_NONE); + SDL_RenderCopy(ren_.get(), playerFade_.get(), nullptr, &fadeRect); + } else if (game.map.at(x,y).lightType == Source::Dust) { + SDL_SetTextureBlendMode(dustFade_.get(), SDL_BLENDMODE_NONE); + SDL_RenderCopy(ren_.get(), dustFade_.get(), nullptr, &fadeRect); + } + + SDL_SetRenderDrawColor(ren_.get(), 0, 0, 0, 0); + + for (int sy = fadeY; sy < fadeBottom; sy++) + { + for (int sx = fadeX; sx < fadeRight; sx++) + { + if (!game.map.at(x,y).litTiles.count({sx, sy})) + { + SDL_Rect rect { + game.map.getTrueX(sx) * TILE_WIDTH, + game.map.getTrueY(sy) * TILE_HEIGHT, + TILE_WIDTH, + TILE_HEIGHT}; + + SDL_RenderFillRect(ren_.get(), &rect); + } + } + } + + SDL_SetRenderTarget(ren_.get(), mask.get()); + SDL_SetTextureBlendMode(sourceMask.get(), SDL_BLENDMODE_ADD); + SDL_RenderCopy(ren_.get(), sourceMask.get(), nullptr, nullptr); + } + } + } + + SDL_SetRenderTarget(ren_.get(), canvas.get()); + SDL_SetTextureBlendMode(mask.get(), SDL_BLENDMODE_MOD); + SDL_RenderCopy(ren_.get(), mask.get(), nullptr, nullptr); + + SDL_SetRenderTarget(ren_.get(), nullptr); + + SDL_Rect zoomRect; + + std::tie(zoomRect.x, zoomRect.y, zoomRect.w, zoomRect.h) = + calculateZoomRect(game); + + SDL_RenderCopy(ren_.get(), canvas.get(), &zoomRect, nullptr); + SDL_RenderPresent(ren_.get()); +}*/ -- cgit 1.4.1