Removed trailing whitespace from all *.?pp files
[supertux.git] / src / video / sdl / sdl_lightmap.cpp
1 //  SuperTux
2 //  Copyright (C) 2006 Matthias Braun <matze@braunis.de>
3 //
4 //  This program is free software: you can redistribute it and/or modify
5 //  it under the terms of the GNU General Public License as published by
6 //  the Free Software Foundation, either version 3 of the License, or
7 //  (at your option) any later version.
8 //
9 //  This program is distributed in the hope that it will be useful,
10 //  but WITHOUT ANY WARRANTY; without even the implied warranty of
11 //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 //  GNU General Public License for more details.
13 //
14 //  You should have received a copy of the GNU General Public License
15 //  along with this program.  If not, see <http://www.gnu.org/licenses/>.
16
17 #include <iostream>
18
19 #include "video/sdl/sdl_lightmap.hpp"
20 #include "video/sdl/sdl_surface_data.hpp"
21 #include "video/sdl/sdl_texture.hpp"
22 #include "video/sdl/sdl_renderer.hpp"
23 #include "video/sdl/sdl_painter.hpp"
24
25 SDLLightmap::SDLLightmap() :
26   renderer(static_cast<SDLRenderer*>(Renderer::instance())->get_sdl_renderer()),
27   texture(),
28   width(),
29   height(),
30   LIGHTMAP_DIV()
31 {
32   LIGHTMAP_DIV = 8;
33
34   width = SCREEN_WIDTH;
35   height = SCREEN_HEIGHT;
36
37   SDL_Renderer* renderer = static_cast<SDLRenderer*>(Renderer::instance())->get_sdl_renderer();
38   texture = SDL_CreateTexture(renderer,
39                               SDL_PIXELFORMAT_RGB888,
40                               SDL_TEXTUREACCESS_TARGET,
41                               width, height);
42   if (!texture)
43   {
44     std::stringstream msg;
45     msg << "Couldn't create lightmap texture: " << SDL_GetError();
46     throw std::runtime_error(msg.str());
47   }
48 }
49
50 SDLLightmap::~SDLLightmap()
51 {
52   SDL_DestroyTexture(texture);
53 }
54
55 void
56 SDLLightmap::start_draw(const Color &ambient_color)
57 {
58   SDL_SetRenderTarget(renderer, texture);
59
60   Uint8 r = static_cast<Uint8>(ambient_color.red * 255);
61   Uint8 g = static_cast<Uint8>(ambient_color.green * 255);
62   Uint8 b = static_cast<Uint8>(ambient_color.blue * 255);
63
64   SDL_SetRenderDrawColor(renderer, r, g, b, 255);
65   SDL_RenderClear(renderer);
66 }
67
68 void
69 SDLLightmap::end_draw()
70 {
71   SDL_SetRenderTarget(renderer, NULL);
72 }
73
74 void
75 SDLLightmap::do_draw()
76 {
77   SDL_SetTextureBlendMode(texture, SDL_BLENDMODE_MOD);
78
79   SDL_Rect dst_rect;
80   dst_rect.x = 0;
81   dst_rect.y = 0;
82   dst_rect.w = width;
83   dst_rect.h = height;
84
85   SDL_RenderCopy(renderer, texture, NULL, &dst_rect);
86 }
87
88 void
89 SDLLightmap::draw_surface(const DrawingRequest& request)
90 {
91   SDLPainter::draw_surface(renderer, request);
92 }
93
94 void
95 SDLLightmap::draw_surface_part(const DrawingRequest& request)
96 {
97   SDLPainter::draw_surface_part(renderer, request);
98 }
99
100 void
101 SDLLightmap::draw_gradient(const DrawingRequest& request)
102 {
103   SDLPainter::draw_gradient(renderer, request);
104 }
105
106 void
107 SDLLightmap::draw_filled_rect(const DrawingRequest& request)
108 {
109   SDLPainter::draw_filled_rect(renderer, request);
110 }
111
112 void
113 SDLLightmap::get_light(const DrawingRequest& request) const
114 {
115   const GetLightRequest* getlightrequest
116     = (GetLightRequest*) request.request_data;
117
118   SDL_Rect rect;
119   rect.x = static_cast<int>(request.pos.x * width / SCREEN_WIDTH);
120   rect.y = static_cast<int>(request.pos.y * height / SCREEN_HEIGHT);
121   rect.w = 1;
122   rect.h = 1;
123
124   SDL_SetRenderTarget(renderer, texture);
125   Uint8 pixel[4];
126   int ret = SDL_RenderReadPixels(renderer, &rect,
127                                  SDL_PIXELFORMAT_RGB888,
128                                  pixel,
129                                  1);
130   if (ret != 0)
131   {
132     log_warning << "failed to read pixels: " << SDL_GetError() << std::endl;
133   }
134   SDL_SetRenderTarget(renderer, 0);
135
136   *(getlightrequest->color_ptr) = Color(pixel[2] / 255.0f,
137                                         pixel[1] / 255.0f,
138                                         pixel[0] / 255.0f);
139 }
140
141 /* EOF */