X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fvideo%2Fdrawing_context.hpp;h=df312256d12de341fcea650b9ddcaa5225e43764;hb=4a486d92343d1824b311c234e9321e08f280fe68;hp=4ed28068864aab8f35b698db75d284de933558a0;hpb=49796e6cc2385aea989d7c44c789b406190f2bf7;p=supertux.git diff --git a/src/video/drawing_context.hpp b/src/video/drawing_context.hpp index 4ed280688..df312256d 100644 --- a/src/video/drawing_context.hpp +++ b/src/video/drawing_context.hpp @@ -52,6 +52,21 @@ enum { LAYER_GUI = 500 }; +class Blend +{ +public: + GLenum sfactor; + GLenum dfactor; + + Blend() + : sfactor(GL_SRC_ALPHA), dfactor(GL_ONE_MINUS_SRC_ALPHA) + {} + + Blend(GLenum s, GLenum d) + : sfactor(s), dfactor(d) + {} +}; + /** * This class provides functions for drawing things on screen. It also * maintains a stack of transforms that are applied to graphics. @@ -63,10 +78,11 @@ public: ~DrawingContext(); /// Adds a drawing request for a surface into the request list. - void draw_surface(const Surface* surface, const Vector& position, + void draw_surface(const Surface* surface, const Vector& position, int layer); /// Adds a drawing request for a surface into the request list. - void draw_surface(const Surface* surface, const Vector& position, float angle, + void draw_surface(const Surface* surface, const Vector& position, + float angle, const Color& color, const Blend& blend, int layer); /// Adds a drawing request for part of a surface. void draw_surface_part(const Surface* surface, const Vector& source, @@ -74,7 +90,7 @@ public: /// Draws a text. void draw_text(const Font* font, const std::string& text, const Vector& position, FontAlignment alignment, int layer); - + /// Draws text on screen center (feed Vector.x with a 0). /// This is the same as draw_text() with a SCREEN_WIDTH/2 position and /// alignment set to LEFT_ALLIGN @@ -86,19 +102,19 @@ public: void draw_filled_rect(const Vector& topleft, const Vector& size, const Color& color, int layer); void draw_filled_rect(const Rect& rect, const Color& color, int layer); - + /// Processes all pending drawing requests and flushes the list. void do_drawing(); - + const Vector& get_translation() const { return transform.translation; } - + void set_translation(const Vector& newtranslation) { transform.translation = newtranslation; } - + void push_transform(); void pop_transform(); - + /// Apply that effect in the next draws (effects are listed on surface.h). void set_drawing_effect(DrawingEffect effect); /// return currently applied drawing effect @@ -114,7 +130,7 @@ public: void push_target(); void pop_target(); void set_target(Target target); - + private: class Transform { @@ -122,82 +138,74 @@ private: Vector translation; DrawingEffect drawing_effect; float alpha; - + Transform() : drawing_effect(NO_EFFECT), alpha(1.0f) { } - + Vector apply(const Vector& v) const { return v - translation; } }; - + /// the transform stack std::vector transformstack; /// the currently active transform Transform transform; - class Blend - { - public: - GLenum sfactor; - GLenum dfactor; - - Blend() - : sfactor(GL_SRC_ALPHA), dfactor(GL_ONE_MINUS_SRC_ALPHA) - {} - }; std::vector blend_stack; Blend blend_mode; - + enum RequestType { SURFACE, SURFACE_PART, TEXT, GRADIENT, FILLRECT }; - + struct SurfacePartRequest { const Surface* surface; Vector source, size; }; - + struct TextRequest { const Font* font; std::string text; FontAlignment alignment; }; - + struct GradientRequest { Color top, bottom; Vector size; }; - + struct FillRectRequest { Color color; Vector size; }; - + struct DrawingRequest { RequestType type; - Vector pos; - + Vector pos; + int layer; DrawingEffect drawing_effect; float alpha; Blend blend; float angle; - + Color color; + void* request_data; DrawingRequest() - : angle(0.0f) + : angle(0.0f), + color(1.0f, 1.0f, 1.0f, 1.0f) {} - + bool operator<(const DrawingRequest& other) const { return layer < other.layer; @@ -205,14 +213,14 @@ private: }; typedef std::vector DrawingRequests; - + void handle_drawing_requests(DrawingRequests& requests); void draw_surface_part(DrawingRequest& request); void draw_text(DrawingRequest& request); void draw_text_center(DrawingRequest& request); void draw_gradient(DrawingRequest& request); void draw_filled_rect(DrawingRequest& request); - + DrawingRequests drawing_requests; DrawingRequests lightmap_requests;