Initial integration, lots of broken stuff
[supertux.git] / src / unison / src / video / Renderers.cpp
1 //          Copyright Timothy Goya 2007.
2 // Distributed under the Boost Software License, Version 1.0.
3 //    (See accompanying file LICENSE_1_0.txt or copy at
4 //          http://www.boost.org/LICENSE_1_0.txt)
5
6 #include <unison/video/Renderers.hpp>
7 #include <unison/video/Window.hpp>
8 #include <unison/video/Texture.hpp>
9 #include "auto/Renderer.hpp"
10 #include "sdl/Renderer.hpp"
11 #include "opengl/Renderer.hpp"
12
13 #include <assert.h>
14
15 namespace Unison
16 {
17    namespace Video
18    {
19       Renderers::Renderers() :
20          auto_renderer(0),
21          renderer(0),
22          renderers()
23       {
24          auto_renderer = new Auto::Renderer(renderers);
25          renderer = auto_renderer;
26          add_renderer(new SDL::Renderer());
27          add_renderer(new OpenGL::Renderer());
28          renderer->init();
29       }
30
31       Renderers::~Renderers()
32       {
33          assert(renderer);
34          renderer->quit();
35          std::for_each(renderers.begin(), renderers.end(), std::ptr_fun(operator delete));
36          delete auto_renderer;
37       }
38
39       Renderers &Renderers::get()
40       {
41          static Renderers renderers;
42          return renderers;
43       }
44
45       namespace
46       {
47          bool match_name(Backend::Renderer *renderer, std::string name)
48          {
49             return renderer && renderer->get_name() == name;
50          }
51       }
52
53       void Renderers::set_renderer(const std::string &name)
54       {
55          Area window_size;
56          bool fullscreen = false;
57          if(Window::get().is_open())
58          {
59             window_size = Window::get().get_size();
60             fullscreen = Window::get().is_fullscreen();
61          }
62          std::vector<Surface> surfaces = Texture::save_textures();
63          renderer->quit();
64          if(name == "auto")
65          {
66             renderer = auto_renderer;
67          }
68          else
69          {
70             std::vector<Backend::Renderer *>::iterator found = std::find_if(renderers.begin(), renderers.end(), std::bind2nd(std::ptr_fun(match_name), name));
71             if(found == renderers.end())
72             {
73                fprintf(stderr, "Renderer '%s' not found.\n", name.c_str());
74                return;
75             }
76             renderer = *found;
77          }
78          renderer->init();
79          Texture::load_textures(surfaces);
80          if(window_size != Area())
81          {
82             Window::get().open(window_size, fullscreen);
83          }
84       }
85
86
87       Backend::Renderer &Renderers::get_renderer()
88       {
89          assert(renderer);
90          return *renderer;
91       }
92
93       void Renderers::add_renderer(Backend::Renderer *renderer)
94       {
95          renderers.push_back(renderer);
96       }
97    }
98 }