X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fvideo%2Fdrawing_context.hpp;h=4839239dc52d6c97ddacc9581fb82329abb488c0;hb=2f7bf5676ef8b6b9ff3cf28468efe536888808b5;hp=a8c7e56801cbf740282afa63bc4f6be342e77abd;hpb=6b50afc6cdd8d3555901b02ce12f15b5bac32aa8;p=supertux.git diff --git a/src/video/drawing_context.hpp b/src/video/drawing_context.hpp index a8c7e5680..4839239dc 100644 --- a/src/video/drawing_context.hpp +++ b/src/video/drawing_context.hpp @@ -49,7 +49,8 @@ enum { LAYER_FOREGROUNDTILES = 200, LAYER_FOREGROUND0 = 300, LAYER_FOREGROUND1 = 400, - LAYER_GUI = 500 + LAYER_HUD = 500, + LAYER_GUI = 600 }; class Blend @@ -57,7 +58,7 @@ class Blend public: GLenum sfactor; GLenum dfactor; - + Blend() : sfactor(GL_SRC_ALPHA), dfactor(GL_ONE_MINUS_SRC_ALPHA) {} @@ -78,10 +79,10 @@ 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, + 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. @@ -90,7 +91,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 @@ -102,19 +103,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 @@ -124,13 +125,18 @@ public: /// return currently set alpha float get_alpha() const; + /// on next update, set color to lightmap's color at position + void get_light(const Vector& position, Color* color ); + enum Target { NORMAL, LIGHTMAP }; void push_target(); void pop_target(); void set_target(Target target); - + + void set_ambient_color( Color new_color ); + private: class Transform { @@ -138,17 +144,17 @@ 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 @@ -156,42 +162,42 @@ private: std::vector blend_stack; Blend blend_mode; - + enum RequestType { - SURFACE, SURFACE_PART, TEXT, GRADIENT, FILLRECT + SURFACE, SURFACE_PART, TEXT, GRADIENT, FILLRECT, LIGHTMAPREQUEST, GETLIGHT }; - + 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; @@ -205,26 +211,34 @@ private: : angle(0.0f), color(1.0f, 1.0f, 1.0f, 1.0f) {} - + bool operator<(const DrawingRequest& other) const { return layer < other.layer; } }; + struct GetLightRequest + { + Color* color_ptr; + }; + 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); - + void draw_lightmap(DrawingRequest& request); + void get_light(DrawingRequest& request); + DrawingRequests drawing_requests; DrawingRequests lightmap_requests; DrawingRequests* requests; + Color ambient_color; SDL_Surface* screen; Target target;