X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fvideo%2Fdrawing_context.hpp;h=df312256d12de341fcea650b9ddcaa5225e43764;hb=4a486d92343d1824b311c234e9321e08f280fe68;hp=b3b6d284fb7101d53bd6868ea7066de90eaedbf5;hpb=efc61e9d05b077f13a76982590fb0bd6a9d8dc61;p=supertux.git diff --git a/src/video/drawing_context.hpp b/src/video/drawing_context.hpp index b3b6d284f..df312256d 100644 --- a/src/video/drawing_context.hpp +++ b/src/video/drawing_context.hpp @@ -1,7 +1,7 @@ -// $Id: drawing_context.h 2334 2005-04-04 16:26:14Z grumbel $ +// $Id$ // -// SuperTux - A Jump'n Run -// Copyright (C) 2004 Matthias Braun // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License @@ -16,6 +16,7 @@ // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + #ifndef SUPERTUX_DRAWINGCONTEXT_H #define SUPERTUX_DRAWINGCONTEXT_H @@ -23,14 +24,16 @@ #include #include +#include #include #include #include #include "math/vector.hpp" -#include "video/screen.hpp" -#include "video/surface.hpp" -#include "video/font.hpp" +#include "math/rect.hpp" +#include "surface.hpp" +#include "font.hpp" +#include "color.hpp" class Surface; class Texture; @@ -41,13 +44,29 @@ enum { LAYER_BACKGROUND1 = -200, LAYER_BACKGROUNDTILES = -100, LAYER_TILES = 0, - LAYER_OBJECTS = 100, + LAYER_OBJECTS = 50, + LAYER_FLOATINGOBJECTS = 150, LAYER_FOREGROUNDTILES = 200, LAYER_FOREGROUND0 = 300, LAYER_FOREGROUND1 = 400, 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. @@ -57,9 +76,13 @@ class DrawingContext public: DrawingContext(); ~DrawingContext(); - + + /// Adds a drawing request for a surface into the request list. + 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, 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, @@ -67,40 +90,39 @@ 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 void draw_center_text(const Font* font, const std::string& text, const Vector& position, int layer); /// Draws a color gradient onto the whole screen */ - void draw_gradient(Color from, Color to, int layer); + void draw_gradient(const Color& from, const Color& to, int layer); /// Fills a rectangle. void draw_filled_rect(const Vector& topleft, const Vector& size, - Color color, int layer); - + 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(uint32_t effect); + void set_drawing_effect(DrawingEffect effect); /// return currently applied drawing effect - uint32_t get_drawing_effect() const; - /// apply that zoom in the next draws */ - void set_zooming(float zoom); - /// apply that alpha in the next draws */ - void set_alpha(uint8_t alpha); + DrawingEffect get_drawing_effect() const; + /// apply that alpha in the next draws (1.0 means fully opaque) */ + void set_alpha(float alpha); /// return currently set alpha - uint8_t get_alpha() const; + float get_alpha() const; enum Target { NORMAL, LIGHTMAP @@ -108,87 +130,82 @@ public: void push_target(); void pop_target(); void set_target(Target target); - + private: class Transform { public: Vector translation; - uint32_t drawing_effect; - float zoom; - uint8_t alpha; - + DrawingEffect drawing_effect; + float alpha; + Transform() - : drawing_effect(NONE_EFFECT), zoom(1), alpha(255) + : 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; - uint32_t drawing_effect; - float zoom; - int alpha; + DrawingEffect drawing_effect; + float alpha; Blend blend; - + float angle; + Color color; + void* request_data; - + + DrawingRequest() + : angle(0.0f), + color(1.0f, 1.0f, 1.0f, 1.0f) + {} + bool operator<(const DrawingRequest& other) const { return layer < other.layer; @@ -196,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; @@ -212,7 +229,7 @@ private: SDL_Surface* screen; Target target; std::vector target_stack; - std::auto_ptr lightmap; + Texture* lightmap; int lightmap_width, lightmap_height; float lightmap_uv_right, lightmap_uv_bottom; };