X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fvideo%2Fdrawing_context.cpp;h=faa95ddf58486b97cdf06b202aeeb6289eba98c6;hb=d794aac09d4a3b3f5f93985cd74381bb4de4ce84;hp=57057b843a5c841665a5fb1935f0515a04c1e542;hpb=bd47623805cd3eb2bcb5953946282a7a92453eb9;p=supertux.git diff --git a/src/video/drawing_context.cpp b/src/video/drawing_context.cpp index 57057b843..faa95ddf5 100644 --- a/src/video/drawing_context.cpp +++ b/src/video/drawing_context.cpp @@ -29,11 +29,10 @@ #include "video/surface.hpp" #include "video/texture.hpp" #include "video/texture_manager.hpp" -#include "video/video_systems.hpp" +#include "video/video_system.hpp" -DrawingContext::DrawingContext(Renderer& renderer, Lightmap& lightmap) : - renderer(renderer), - lightmap(lightmap), +DrawingContext::DrawingContext(VideoSystem& video_system_) : + video_system(video_system_), transformstack(), transform(), blend_stack(), @@ -60,9 +59,9 @@ DrawingContext::~DrawingContext() } void -DrawingContext::clear_drawing_requests(DrawingRequests& requests) +DrawingContext::clear_drawing_requests(DrawingRequests& requests_) { - for(auto& request : requests) + for(auto& request : requests_) { if (request->request_data) { @@ -70,7 +69,7 @@ DrawingContext::clear_drawing_requests(DrawingRequests& requests) } request->~DrawingRequest(); } - requests.clear(); + requests_.clear(); } void @@ -113,8 +112,9 @@ DrawingContext::draw_surface(SurfacePtr surface, const Vector& position, } void -DrawingContext::draw_surface_part(SurfacePtr surface, const Vector& source, - const Vector& size, const Vector& dest, int layer) +DrawingContext::draw_surface_part(SurfacePtr surface, + const Rectf& srcrect, const Rectf& dstrect, + int layer) { assert(surface != 0); @@ -122,31 +122,16 @@ DrawingContext::draw_surface_part(SurfacePtr surface, const Vector& source, request->target = target; request->type = SURFACE_PART; - request->pos = transform.apply(dest); + request->pos = transform.apply(dstrect.p1); request->layer = layer; request->drawing_effect = transform.drawing_effect; request->alpha = transform.alpha; SurfacePartRequest* surfacepartrequest = new(obst) SurfacePartRequest(); - surfacepartrequest->size = size; - surfacepartrequest->source = source; + surfacepartrequest->srcrect = srcrect; + surfacepartrequest->dstsize = dstrect.get_size(); surfacepartrequest->surface = surface.get(); - // clip on screen borders - if(request->pos.x < 0) { - surfacepartrequest->size.x += request->pos.x; - if(surfacepartrequest->size.x <= 0) - return; - surfacepartrequest->source.x -= request->pos.x; - request->pos.x = 0; - } - if(request->pos.y < 0) { - surfacepartrequest->size.y += request->pos.y; - if(surfacepartrequest->size.y <= 0) - return; - surfacepartrequest->source.y -= request->pos.y; - request->pos.y = 0; - } request->request_data = surfacepartrequest; requests->push_back(request); @@ -332,6 +317,8 @@ DrawingContext::do_drawing() // PART1: create lightmap if(use_lightmap) { + Lightmap& lightmap = video_system.get_lightmap(); + lightmap.start_draw(ambient_color); handle_drawing_requests(lightmap_requests); lightmap.end_draw(); @@ -342,7 +329,11 @@ DrawingContext::do_drawing() request->layer = LAYER_HUD - 1; drawing_requests.push_back(request); } + + Renderer& renderer = video_system.get_renderer(); + renderer.start_draw(); handle_drawing_requests(drawing_requests); + renderer.end_draw(); clear_drawing_requests(lightmap_requests); clear_drawing_requests(drawing_requests); @@ -369,12 +360,15 @@ public: }; void -DrawingContext::handle_drawing_requests(DrawingRequests& requests) +DrawingContext::handle_drawing_requests(DrawingRequests& requests_) { - std::stable_sort(requests.begin(), requests.end(), RequestPtrCompare()); + std::stable_sort(requests_.begin(), requests_.end(), RequestPtrCompare()); + + Renderer& renderer = video_system.get_renderer(); + Lightmap& lightmap = video_system.get_lightmap(); DrawingRequests::const_iterator i; - for(i = requests.begin(); i != requests.end(); ++i) { + for(i = requests_.begin(); i != requests_.end(); ++i) { const DrawingRequest& request = **i; switch(request.target) { @@ -391,7 +385,7 @@ DrawingContext::handle_drawing_requests(DrawingRequests& requests) break; case TEXT: { - const TextRequest* textrequest = (TextRequest*) request.request_data; + const TextRequest* textrequest = static_cast(request.request_data); textrequest->font->draw(&renderer, textrequest->text, request.pos, textrequest->alignment, request.drawing_effect, request.color, request.alpha); } @@ -423,7 +417,7 @@ DrawingContext::handle_drawing_requests(DrawingRequests& requests) break; case TEXT: { - const TextRequest* textrequest = (TextRequest*) request.request_data; + const TextRequest* textrequest = static_cast(request.request_data); textrequest->font->draw(&renderer, textrequest->text, request.pos, textrequest->alignment, request.drawing_effect, request.color, request.alpha); } @@ -499,13 +493,13 @@ DrawingContext::pop_target() } void -DrawingContext::set_target(Target target) +DrawingContext::set_target(Target target_) { - this->target = target; - if(target == LIGHTMAP) { + this->target = target_; + if(target_ == LIGHTMAP) { requests = &lightmap_requests; } else { - assert(target == NORMAL); + assert(target_ == NORMAL); requests = &drawing_requests; } }