X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fvideo%2Fdrawing_context.hpp;h=53e171aeedaa245f641b708e35638a3198e64ed7;hb=9eab9403c2b9ff629c07380e8d5f1032d21bd3f7;hp=8b7dcab63f1742c324b4f247b0bb5b42407c0028;hpb=c0c4838b917943354c150d56ab970ca249267037;p=supertux.git diff --git a/src/video/drawing_context.hpp b/src/video/drawing_context.hpp index 8b7dcab63..53e171aee 100644 --- a/src/video/drawing_context.hpp +++ b/src/video/drawing_context.hpp @@ -1,12 +1,10 @@ -// $Id: drawing_context.h 2334 2005-04-04 16:26:14Z grumbel $ +// SuperTux +// Copyright (C) 2006 Matthias Braun // -// SuperTux - A Jump'n Run -// Copyright (C) 2004 Matthias Braun . -#include -#include -#include +#ifndef HEADER_SUPERTUX_VIDEO_DRAWING_CONTEXT_HPP +#define HEADER_SUPERTUX_VIDEO_DRAWING_CONTEXT_HPP -#include -#include -#include #include +#include +#include +#include +#include +#include "math/rectf.hpp" #include "math/vector.hpp" -#include "math/rect.hpp" -#include "surface.hpp" -#include "font.hpp" -#include "color.hpp" +#include "video/color.hpp" +#include "video/font.hpp" +#include "video/font_ptr.hpp" +#include "video/texture.hpp" +struct DrawingRequest; class Surface; class Texture; +class VideoSystem; // some constants for predefined layer values enum { + // Image/gradient backgrounds (should cover entire screen) LAYER_BACKGROUND0 = -300, + // Particle backgrounds LAYER_BACKGROUND1 = -200, + // Tilemap backgrounds LAYER_BACKGROUNDTILES = -100, + // Solid tilemaps LAYER_TILES = 0, - LAYER_OBJECTS = 100, + // Ordinary objects + LAYER_OBJECTS = 50, + // Objects that pass through walls + LAYER_FLOATINGOBJECTS = 150, + // LAYER_FOREGROUNDTILES = 200, + // LAYER_FOREGROUND0 = 300, + // LAYER_FOREGROUND1 = 400, - LAYER_GUI = 500 + // Hitpoints, time, coins, etc. + LAYER_HUD = 500, + // Menus, mouse, console etc. + 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) + {} +}; + +enum Target { + NORMAL, LIGHTMAP }; /** @@ -57,43 +87,54 @@ enum { class DrawingContext { public: - DrawingContext(); + DrawingContext(VideoSystem& video_system); ~DrawingContext(); - + /// Adds a drawing request for a surface into the request list. - void draw_surface(const Surface* surface, const Vector& position, + void draw_surface(SurfacePtr surface, const Vector& position, + int layer); + /// Adds a drawing request for a surface into the request list. + void draw_surface(SurfacePtr 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); + void draw_surface_part(SurfacePtr surface, + const Rectf& srcrect, const Rectf& dstrect, + int layer); /// Draws a text. - void draw_text(const Font* font, const std::string& text, - const Vector& position, FontAlignment alignment, int layer); - + void draw_text(FontPtr font, const std::string& text, + 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 - void draw_center_text(const Font* font, const std::string& text, - const Vector& position, int layer); + /// alignment set to LEFT_ALIGN + void draw_center_text(FontPtr font, const std::string& text, + 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(const Color& from, const Color& to, int layer); /// Fills a rectangle. 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); - + void draw_filled_rect(const Rectf& rect, const Color& color, int layer); + void draw_filled_rect(const Rectf& rect, const Color& color, float radius, int layer); + + void draw_inverse_ellipse(const Vector& pos, const Vector& size, const Color& color, int layer); + + /// Returns the visible area in world coordinates + Rectf get_cliprect() const; + /// 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 @@ -103,13 +144,29 @@ public: /// return currently set alpha float get_alpha() const; - enum Target { - NORMAL, LIGHTMAP - }; + /// 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: + typedef std::vector DrawingRequests; + +private: + void handle_drawing_requests(DrawingRequests& requests); + private: class Transform { @@ -117,103 +174,51 @@ private: Vector translation; DrawingEffect drawing_effect; float alpha; - - Transform() - : drawing_effect(NO_EFFECT), alpha(1.0f) + + Transform() : + translation(), + drawing_effect(NO_EFFECT), + alpha(1.0f) { } - + Vector apply(const Vector& v) const { return v - translation; } }; - + + void clear_drawing_requests(DrawingRequests& requests); + +private: + VideoSystem& video_system; + /// 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; - - int layer; - DrawingEffect drawing_effect; - float alpha; - Blend blend; - - void* request_data; - - bool operator<(const DrawingRequest& other) const - { - return layer < other.layer; - } - }; - 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; 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; + + /* 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 */ + +private: + DrawingContext(const DrawingContext&); + DrawingContext& operator=(const DrawingContext&); }; #endif + +/* EOF */