SuperTuxKart
sp_texture_manager.hpp
1 // SuperTuxKart - a fun racing game with go-kart
2 // Copyright (C) 2018 SuperTuxKart-Team
3 //
4 // This program is free software; you can redistribute it and/or
5 // modify it under the terms of the GNU General Public License
6 // as published by the Free Software Foundation; either version 3
7 // of the License, or (at your option) any later version.
8 //
9 // This program is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 // GNU General Public License for more details.
13 //
14 // You should have received a copy of the GNU General Public License
15 // along with this program; if not, write to the Free Software
16 // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
17 
18 #ifndef HEADER_SP_TEXTURE_MANAGER_HPP
19 #define HEADER_SP_TEXTURE_MANAGER_HPP
20 
21 #ifndef SERVER_ONLY
22 
23 #include "graphics/gl_headers.hpp"
24 #include "utils/log.hpp"
25 #include "utils/no_copy.hpp"
26 
27 #include <algorithm>
28 #include <atomic>
29 #include <condition_variable>
30 #include <functional>
31 #include <list>
32 #include <map>
33 #include <memory>
34 #include <mutex>
35 #include <string>
36 #include <thread>
37 
38 #include "irrString.h"
39 
40 class Material;
41 
42 namespace SP
43 {
44 class SPTexture;
45 
46 class SPTextureManager : public NoCopy
47 {
48 private:
49  static SPTextureManager* m_sptm;
50 
51  std::map<std::string, std::shared_ptr<SPTexture> > m_textures;
52 
53  std::atomic_uint m_max_threaded_load_obj;
54 
55  std::atomic_int m_gl_cmd_function_count;
56 
57  std::list<std::function<bool()> > m_threaded_functions;
58 
59  std::list<std::function<bool()> > m_gl_cmd_functions;
60 
61  std::mutex m_thread_obj_mutex, m_gl_cmd_mutex;
62 
63  std::condition_variable m_thread_obj_cv;
64 
65  std::list<std::thread> m_threaded_load_obj;
66 
67 public:
68  // ------------------------------------------------------------------------
69  static SPTextureManager* get()
70  {
71  if (m_sptm == NULL)
72  {
73  m_sptm = new SPTextureManager();
74  }
75  return m_sptm;
76  }
77  // ------------------------------------------------------------------------
78  static void destroy()
79  {
80  delete m_sptm;
81  m_sptm = NULL;
82  }
83  // ------------------------------------------------------------------------
85  // ------------------------------------------------------------------------
87  // ------------------------------------------------------------------------
88  void stopThreads()
89  {
90  m_max_threaded_load_obj.store(0);
91  std::unique_lock<std::mutex> ul(m_thread_obj_mutex);
92  m_threaded_functions.push_back([](){ return true; });
93  m_thread_obj_cv.notify_all();
94  ul.unlock();
95  for (std::thread& t : m_threaded_load_obj)
96  {
97  t.join();
98  }
99  m_threaded_load_obj.clear();
100  }
101  // ------------------------------------------------------------------------
102  void removeUnusedTextures();
103  // ------------------------------------------------------------------------
104  void addThreadedFunction(std::function<bool()> threaded_function)
105  {
106  std::lock_guard<std::mutex> lock(m_thread_obj_mutex);
107  m_threaded_functions.push_back(threaded_function);
108  m_thread_obj_cv.notify_one();
109  }
110  // ------------------------------------------------------------------------
111  void addGLCommandFunction(std::function<bool()> function)
112  {
113  std::lock_guard<std::mutex> lock(m_gl_cmd_mutex);
114  m_gl_cmd_functions.push_back(function);
115  }
116  // ------------------------------------------------------------------------
117  void increaseGLCommandFunctionCount(int count)
118  { m_gl_cmd_function_count.fetch_add(count); }
119  // ------------------------------------------------------------------------
120  void checkForGLCommand(bool before_scene = false);
121  // ------------------------------------------------------------------------
122  std::shared_ptr<SPTexture> getTexture(const std::string& p,
123  Material* m, bool undo_srgb,
124  const std::string& container_id);
125  // ------------------------------------------------------------------------
126  void dumpAllTextures();
127  // ------------------------------------------------------------------------
128  irr::core::stringw reloadTexture(const irr::core::stringw& name);
129 
130 };
131 
132 }
133 
134 #endif
135 
136 #endif
Definition: b3d_mesh_loader.hpp:18
Utility class, you can inherit from this class to disallow the assignment operator and copy construct...
Definition: no_copy.hpp:25
Definition: material.hpp:47
Definition: sp_texture_manager.hpp:46