X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fvideo%2Fdrawing_context.hpp;h=5f392ef0e7bfda86fbb5212d2d0dcb0cdcf29c13;hb=43db9a6c44b6ee544e7694d1bb234ba559b0849c;hp=f105ea125a474fbdf2488a2629954ea6adfff57b;hpb=5b7f9214cb929399f1a855ef5807018a9447d510;p=supertux.git diff --git a/src/video/drawing_context.hpp b/src/video/drawing_context.hpp index f105ea125..5f392ef0e 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 @@ -21,32 +21,22 @@ #include #include -#include +#include -#include #include +#include "obstack/obstack.h" #include "math/vector.hpp" -#include "video/screen.hpp" -#include "video/surface.hpp" -#include "video/font.hpp" +#include "math/rect.hpp" +#include "color.hpp" +#include "font.hpp" +#include "drawing_request.hpp" class Surface; +class Texture; +class Renderer; +class Lightmap; -// some constants for predefined layer values -enum { - LAYER_BACKGROUND0 = -300, - LAYER_BACKGROUND1 = -200, - LAYER_BACKGROUNDTILES = -100, - LAYER_TILES = 0, - LAYER_OBJECTS = 100, - LAYER_FOREGROUNDTILES = 200, - LAYER_FOREGROUND0 = 300, - LAYER_FOREGROUND1 = 400, - LAYER_GUI = 500 -}; - -/// 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,135 +44,125 @@ enum { class DrawingContext { public: - DrawingContext(SDL_Surface* targetsurface = 0); + DrawingContext(); ~DrawingContext(); - + + void init_renderer(); + + /// 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, const Vector& size, const Vector& dest, int layer); /// Draws a text. void draw_text(const Font* font, const std::string& text, - const Vector& position, FontAlignment alignment, int layer); - + const Vector& position, FontAlignment alignment, int layer, Color color = Color(1.0,1.0,1.0)); + /// 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 + /// alignment set to LEFT_ALIGN void draw_center_text(const Font* font, const std::string& text, - const Vector& position, int layer); + const Vector& position, int layer, Color color = Color(1.0,1.0,1.0)); /// 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); + void draw_filled_rect(const Rect& rect, const Color& color, float radius, int layer); + + void draw_inverse_ellipse(const Vector& pos, const Vector& size, 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 ); + + typedef ::Target Target; + static const Target NORMAL = ::NORMAL; + static const Target LIGHTMAP = ::LIGHTMAP; + void push_target(); + void pop_target(); + void set_target(Target target); + + void set_ambient_color( Color new_color ); + + /** + * requests that a screenshot be taken after the next frame has been rendered + */ + void take_screenshot(); + 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; } }; - + + Renderer *renderer; + Lightmap *lightmap; + /// the transform stack std::vector transformstack; /// the currently active transform Transform transform; - - 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; - - int layer; - uint32_t drawing_effect; - float zoom; - int alpha; - - void* request_data; - - bool operator<(const DrawingRequest& other) const - { - return layer < other.layer; - } - }; - - 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; - - SDL_Surface* screen; + + std::vector blend_stack; + Blend blend_mode; + + typedef std::vector DrawingRequests; + + void handle_drawing_requests(DrawingRequests& requests); + + DrawingRequests drawing_requests; + DrawingRequests lightmap_requests; + + DrawingRequests* requests; + Color ambient_color; + + Target target; + std::vector target_stack; + + /* obstack holding the memory of the drawing requests */ + struct obstack obst; + + bool screenshot_requested; /**< true if a screenshot should be taken after the next frame has been rendered */ }; #endif +