X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fvideo%2Fdrawing_context.hpp;h=cc2bc0104bf4b87e0eb8945c95c79f6633c1a616;hb=2b7cf1bf8c85a4df1d2a02ddcad8723b40f8efff;hp=73713f7943d810e15be088310fb9d45f82750e01;hpb=9e7e803e384ed7bf0f5ccf9a4c381dd13b6a01d1;p=supertux.git diff --git a/src/video/drawing_context.hpp b/src/video/drawing_context.hpp index 73713f794..cc2bc0104 100644 --- a/src/video/drawing_context.hpp +++ b/src/video/drawing_context.hpp @@ -1,12 +1,10 @@ -// $Id$ -// // SuperTux // Copyright (C) 2006 Matthias Braun // -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -14,32 +12,74 @@ // GNU General Public License for more details. // // 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 +// along with this program. If not, see . -#include -#include -#include +#ifndef HEADER_SUPERTUX_VIDEO_DRAWING_CONTEXT_HPP +#define HEADER_SUPERTUX_VIDEO_DRAWING_CONTEXT_HPP +#include +#include +#include #include +#include -#include - -#include "glutil.hpp" -#include "obstack/obstack.h" +#include "math/rectf.hpp" #include "math/vector.hpp" -#include "math/rect.hpp" -#include "drawing_request.hpp" -#include "font.hpp" -#include "color.hpp" +#include "video/color.hpp" +#include "video/font.hpp" +#include "video/font_ptr.hpp" +#include "video/texture.hpp" +class DrawingRequest; +class Lightmap; +class Renderer; class Surface; class Texture; -struct DrawingRequest; -class Renderer; -class Lightmap; + +// 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, + // Ordinary objects + LAYER_OBJECTS = 50, + // Objects that pass through walls + LAYER_FLOATINGOBJECTS = 150, + // + LAYER_FOREGROUNDTILES = 200, + // + LAYER_FOREGROUND0 = 300, + // + LAYER_FOREGROUND1 = 400, + // 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 +}; /** * This class provides functions for drawing things on screen. It also @@ -48,37 +88,41 @@ class Lightmap; class DrawingContext { public: - DrawingContext(); + DrawingContext(Renderer& renderer, Lightmap& lightmap); ~DrawingContext(); - void init_renderer(); - /// 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(const Surface* surface, const Vector& position, + 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 Rect& rect, const Color& color, float radius, 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(); @@ -119,6 +163,12 @@ public: void take_screenshot(); private: + typedef std::vector DrawingRequests; + +private: + void handle_drawing_requests(DrawingRequests& requests); + +private: class Transform { public: @@ -126,8 +176,10 @@ private: 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 @@ -136,8 +188,11 @@ private: } }; - Renderer *renderer; - Lightmap *lightmap; + void clear_drawing_requests(DrawingRequests& requests); + +private: + Renderer& renderer; + Lightmap& lightmap; /// the transform stack std::vector transformstack; @@ -147,10 +202,6 @@ private: std::vector blend_stack; Blend blend_mode; - typedef std::vector DrawingRequests; - - void handle_drawing_requests(DrawingRequests& requests); - DrawingRequests drawing_requests; DrawingRequests lightmap_requests; @@ -164,7 +215,12 @@ private: 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 */