summary refs log tree commit diff stats
path: root/src/renderer.cpp
diff options
context:
space:
mode:
authorKelly Rauchenberger <fefferburbia@gmail.com>2021-01-30 04:46:44 -0500
committerKelly Rauchenberger <fefferburbia@gmail.com>2021-01-30 04:46:44 -0500
commitd92c7970df0d2e0a0c3f84037640336102c084a6 (patch)
tree162f27ff353ca1ae7a5df78a651c93e2e5865aac /src/renderer.cpp
parent2ff08dfdbb94d059a2c92da56c0266d38854df8a (diff)
downloadtanetane-d92c7970df0d2e0a0c3f84037640336102c084a6.tar.gz
tanetane-d92c7970df0d2e0a0c3f84037640336102c084a6.tar.bz2
tanetane-d92c7970df0d2e0a0c3f84037640336102c084a6.zip
Imported renderer stuff from Ether
Diffstat (limited to 'src/renderer.cpp')
-rw-r--r--src/renderer.cpp216
1 files changed, 216 insertions, 0 deletions
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 @@
1#include "renderer.h"
2#include "consts.h"
3
4Renderer::Renderer()
5{
6 win_ = window_ptr(
7 SDL_CreateWindow(
8 "Tanetane",
9 100,
10 100,
11 GAME_WIDTH,
12 GAME_HEIGHT,
13 SDL_WINDOW_SHOWN));
14
15 if (!win_)
16 {
17 throw sdl_error();
18 }
19
20 ren_ = renderer_ptr(
21 SDL_CreateRenderer(
22 win_.get(),
23 -1,
24 SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC));
25
26 if (!ren_)
27 {
28 throw sdl_error();
29 }
30}
31
32/*void Renderer::render()
33{
34 texture_ptr canvas(
35 SDL_CreateTexture(
36 ren_.get(),
37 SDL_PIXELFORMAT_RGBA8888,
38 SDL_TEXTUREACCESS_TARGET,
39 TILE_WIDTH * game.map.getWidth(),
40 TILE_HEIGHT * game.map.getHeight()));
41
42 if (!canvas)
43 {
44 throw sdl_error();
45 }
46
47 SDL_SetRenderTarget(ren_.get(), canvas.get());
48 SDL_SetRenderDrawBlendMode(ren_.get(), SDL_BLENDMODE_NONE);
49 SDL_SetRenderDrawColor(ren_.get(), rand() % 255, rand() % 255, rand() % 255, 255);
50 SDL_RenderClear(ren_.get());
51
52 for (int y = game.map.getTop(); y < game.map.getBottom(); y++)
53 {
54 for (int x = game.map.getLeft(); x < game.map.getRight(); x++)
55 {
56 bool draw = true;
57
58 if ((game.player_x == x && game.player_y == y) && game.renderPlayer)
59 {
60 SDL_SetRenderDrawColor(ren_.get(), 255, 255, 0, 255);
61 } else if (!game.map.at(x,y).lit)
62 {
63 if (drawDark)
64 {
65 SDL_SetRenderDrawColor(ren_.get(), 40, 40, 40, 255);
66 } else {
67 draw = false;
68 }
69 } else {
70 int alpha = 255;
71
72 switch (game.map.at(x,y).tile)
73 {
74 case Tile::Floor:
75 {
76 SDL_SetRenderDrawColor(ren_.get(), 210, 210, 210, alpha);
77 break;
78 }
79
80 case Tile::Wall:
81 {
82 SDL_SetRenderDrawColor(ren_.get(), 100, 100, 100, alpha);
83 break;
84 }
85
86 case Tile::Dust:
87 {
88 SDL_SetRenderDrawColor(ren_.get(), 128, 40, 255, alpha);
89 break;
90 }
91
92 case Tile::Lamp:
93 {
94 SDL_SetRenderDrawColor(ren_.get(), 0, 255, 255, alpha);
95 break;
96 }
97 }
98 }
99
100 if (draw)
101 {
102 SDL_Rect rect {
103 game.map.getTrueX(x) * TILE_WIDTH,
104 game.map.getTrueY(y) * TILE_HEIGHT,
105 TILE_WIDTH,
106 TILE_HEIGHT};
107
108 SDL_RenderFillRect(ren_.get(), &rect);
109 }
110 }
111 }
112
113 texture_ptr mask(
114 SDL_CreateTexture(
115 ren_.get(),
116 SDL_PIXELFORMAT_RGBA8888,
117 SDL_TEXTUREACCESS_TARGET,
118 TILE_WIDTH * game.map.getWidth(),
119 TILE_HEIGHT * game.map.getHeight()));
120
121 if (!mask)
122 {
123 throw sdl_error();
124 }
125
126 SDL_SetRenderTarget(ren_.get(), mask.get());
127 SDL_SetRenderDrawColor(ren_.get(), 0, 0, 0, 0);
128 SDL_RenderClear(ren_.get());
129
130 for (int y = game.map.getTop(); y < game.map.getBottom(); y++)
131 {
132 for (int x = game.map.getLeft(); x < game.map.getRight(); x++)
133 {
134 if (game.map.at(x,y).lightType != Source::None)
135 {
136 texture_ptr sourceMask(
137 SDL_CreateTexture(
138 ren_.get(),
139 SDL_PIXELFORMAT_RGBA8888,
140 SDL_TEXTUREACCESS_TARGET,
141 TILE_WIDTH * game.map.getWidth(),
142 TILE_HEIGHT * game.map.getHeight()));
143
144 if (!sourceMask)
145 {
146 throw sdl_error();
147 }
148
149 SDL_SetRenderTarget(ren_.get(), sourceMask.get());
150 SDL_SetRenderDrawBlendMode(ren_.get(), SDL_BLENDMODE_NONE);
151 SDL_SetRenderDrawColor(ren_.get(), 0, 0, 0, 0);
152 SDL_RenderClear(ren_.get());
153
154 int fadeX = game.map.getTrueX(x) - game.map.at(x,y).lightRadius;
155 int fadeY = game.map.getTrueY(y) - game.map.at(x,y).lightRadius;
156 int fadeRight = game.map.getTrueX(x) + game.map.at(x,y).lightRadius;
157 int fadeBottom = game.map.getTrueY(y) + game.map.at(x,y).lightRadius;
158
159 SDL_Rect fadeRect {
160 fadeX * TILE_WIDTH,
161 fadeY * TILE_HEIGHT,
162 (game.map.at(x,y).lightRadius * 2 + 1) * TILE_WIDTH,
163 (game.map.at(x,y).lightRadius * 2 + 1) * TILE_HEIGHT};
164
165 if (game.map.at(x,y).lightType == Source::Lamp)
166 {
167 SDL_SetTextureBlendMode(lampFade_.get(), SDL_BLENDMODE_NONE);
168 SDL_RenderCopy(ren_.get(), lampFade_.get(), nullptr, &fadeRect);
169 } else if (game.map.at(x,y).lightType == Source::Player) {
170 SDL_SetTextureBlendMode(playerFade_.get(), SDL_BLENDMODE_NONE);
171 SDL_RenderCopy(ren_.get(), playerFade_.get(), nullptr, &fadeRect);
172 } else if (game.map.at(x,y).lightType == Source::Dust) {
173 SDL_SetTextureBlendMode(dustFade_.get(), SDL_BLENDMODE_NONE);
174 SDL_RenderCopy(ren_.get(), dustFade_.get(), nullptr, &fadeRect);
175 }
176
177 SDL_SetRenderDrawColor(ren_.get(), 0, 0, 0, 0);
178
179 for (int sy = fadeY; sy < fadeBottom; sy++)
180 {
181 for (int sx = fadeX; sx < fadeRight; sx++)
182 {
183 if (!game.map.at(x,y).litTiles.count({sx, sy}))
184 {
185 SDL_Rect rect {
186 game.map.getTrueX(sx) * TILE_WIDTH,
187 game.map.getTrueY(sy) * TILE_HEIGHT,
188 TILE_WIDTH,
189 TILE_HEIGHT};
190
191 SDL_RenderFillRect(ren_.get(), &rect);
192 }
193 }
194 }
195
196 SDL_SetRenderTarget(ren_.get(), mask.get());
197 SDL_SetTextureBlendMode(sourceMask.get(), SDL_BLENDMODE_ADD);
198 SDL_RenderCopy(ren_.get(), sourceMask.get(), nullptr, nullptr);
199 }
200 }
201 }
202
203 SDL_SetRenderTarget(ren_.get(), canvas.get());
204 SDL_SetTextureBlendMode(mask.get(), SDL_BLENDMODE_MOD);
205 SDL_RenderCopy(ren_.get(), mask.get(), nullptr, nullptr);
206
207 SDL_SetRenderTarget(ren_.get(), nullptr);
208
209 SDL_Rect zoomRect;
210
211 std::tie(zoomRect.x, zoomRect.y, zoomRect.w, zoomRect.h) =
212 calculateZoomRect(game);
213
214 SDL_RenderCopy(ren_.get(), canvas.get(), &zoomRect, nullptr);
215 SDL_RenderPresent(ren_.get());
216}*/