X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fvideo%2Fdrawing_context.hpp;h=4839239dc52d6c97ddacc9581fb82329abb488c0;hb=2f7bf5676ef8b6b9ff3cf28468efe536888808b5;hp=f105ea125a474fbdf2488a2629954ea6adfff57b;hpb=5b7f9214cb929399f1a855ef5807018a9447d510;p=supertux.git diff --git a/src/video/drawing_context.hpp b/src/video/drawing_context.hpp index f105ea125..4839239dc 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,15 +24,19 @@ #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; // some constants for predefined layer values enum { @@ -39,14 +44,30 @@ 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 + LAYER_HUD = 500, + LAYER_GUI = 600 +}; + +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) + {} }; -/// Handles drawing of things. /** * This class provides functions for drawing things on screen. It also * maintains a stack of transforms that are applied to graphics. @@ -54,11 +75,15 @@ enum { class DrawingContext { public: - DrawingContext(SDL_Surface* targetsurface = 0); + 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, @@ -66,123 +91,161 @@ 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; + + /// 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 { 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; - + + 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; - 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; } }; - + + 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); - - typedef std::vector DrawingRequests; - DrawingRequests drawingrequests; + 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; + std::vector target_stack; + Texture* lightmap; + int lightmap_width, lightmap_height; + float lightmap_uv_right, lightmap_uv_bottom; }; #endif