X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fvideo%2Fdrawing_context.cpp;h=faa95ddf58486b97cdf06b202aeeb6289eba98c6;hb=6492679a300bff2c17505c5d9bc9d333eeba384d;hp=96d06ab0d91945426f1dc2172e884db2e6d22690;hpb=76c0dd8b3bac15d407b8e84e09a416b098d6a3c7;p=supertux.git diff --git a/src/video/drawing_context.cpp b/src/video/drawing_context.cpp index 96d06ab0d..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(), @@ -53,10 +52,27 @@ DrawingContext::DrawingContext(Renderer& renderer, Lightmap& lightmap) : DrawingContext::~DrawingContext() { + clear_drawing_requests(lightmap_requests); + clear_drawing_requests(drawing_requests); + obstack_free(&obst, NULL); } void +DrawingContext::clear_drawing_requests(DrawingRequests& requests_) +{ + for(auto& request : requests_) + { + if (request->request_data) + { + request->request_data->~DrawingRequestData(); + } + request->~DrawingRequest(); + } + requests_.clear(); +} + +void DrawingContext::draw_surface(SurfacePtr surface, const Vector& position, float angle, const Color& color, const Blend& blend, int layer) @@ -81,7 +97,9 @@ DrawingContext::draw_surface(SurfacePtr surface, const Vector& position, request->color = color; request->blend = blend; - request->request_data = surface.get(); + SurfaceRequest* surfacerequest = new(obst) SurfaceRequest(); + surfacerequest->surface = surface.get(); + request->request_data = surfacerequest; requests->push_back(request); } @@ -94,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); @@ -103,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); @@ -236,7 +240,7 @@ DrawingContext::draw_filled_rect(const Rectf& rect, const Color& color, float ra fillrectrequest->radius = radius; request->request_data = fillrectrequest; - requests->push_back(request); + requests->push_back(request); } void @@ -253,20 +257,20 @@ DrawingContext::draw_inverse_ellipse(const Vector& pos, const Vector& size, cons request->alpha = transform.alpha; InverseEllipseRequest* ellipse = new(obst)InverseEllipseRequest; - + ellipse->color = color; ellipse->color.alpha = color.alpha * transform.alpha; ellipse->size = size; request->request_data = ellipse; - requests->push_back(request); + requests->push_back(request); } Rectf DrawingContext::get_cliprect() const { return Rectf(get_translation().x, get_translation().y, - get_translation().x + SCREEN_WIDTH, + get_translation().x + SCREEN_WIDTH, get_translation().y + SCREEN_HEIGHT); } @@ -307,11 +311,14 @@ DrawingContext::do_drawing() target_stack.clear(); //Use Lightmap if ambient color is not white. - bool use_lightmap = ( ambient_color.red != 1.0f || ambient_color.green != 1.0f || - ambient_color.blue != 1.0f ); + bool use_lightmap = ( ambient_color.red != 1.0f || + ambient_color.green != 1.0f || + ambient_color.blue != 1.0f ); // 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(); @@ -322,10 +329,15 @@ DrawingContext::do_drawing() request->layer = LAYER_HUD - 1; drawing_requests.push_back(request); } - lightmap_requests.clear(); + Renderer& renderer = video_system.get_renderer(); + renderer.start_draw(); handle_drawing_requests(drawing_requests); - drawing_requests.clear(); + renderer.end_draw(); + + clear_drawing_requests(lightmap_requests); + clear_drawing_requests(drawing_requests); + obstack_free(&obst, NULL); obstack_init(&obst); @@ -348,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) { @@ -370,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); } @@ -402,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); } @@ -478,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; } } @@ -495,7 +510,7 @@ DrawingContext::set_ambient_color( Color new_color ) ambient_color = new_color; } -void +void DrawingContext::take_screenshot() { screenshot_requested = true;