jubilant-funicular
MyEngine.cpp
1 #include <memory>
2 #include <mutex>
3 
4 #ifdef NTA_USE_DEVIL
5  #include <IL/il.h>
6  #include <IL/ilu.h>
7 #endif
8 
9 #include <SDL2/SDL.h>
10 #include <SDL2/SDL_ttf.h>
11 
12 #ifdef NTA_USE_IMGUI
13  #include <imgui/imgui.h>
14  #include <imgui/imgui_impl_sdl.h>
15  #include <imgui/imgui_impl_opengl3.h>
16 #endif
17 
18 #include "nta/MyEngine.h"
19 #include "nta/ResourceManager.h"
20 #include "nta/WindowManager.h"
21 #include "nta/CallbackManager.h"
22 #include "nta/Logger.h"
23 #include "nta/Random.h"
24 #include "nta/utils.h"
25 
26 #ifdef NTA_USE_AUDIO
27  #include "nta/AudioManager.h"
28 #endif
29 
30 // This might be surprising if you look at most of the code I write, but I
31 // do know about smart pointers
32 static std::map<std::ostream*, std::unique_ptr<std::mutex>> g_stream_locks;
33 static std::mutex g_map_lock;
34 
35 namespace nta {
36  void init(int gl_major_version, int gl_minor_version, bool use_gl_core) {
38  Logger::writeToLog("Initializing Engine...");
40  Logger::writeToLog("Initializing SDL2...");
41  if (SDL_Init(SDL_INIT_EVERYTHING) != 0) {
42  Logger::writeErrorToLog("Failed to initialize SDL: " + utils::to_string(SDL_GetError()),
43  SDL_FAILURE);
44  }
45  if (gl_major_version > 0) SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, gl_major_version);
46  if (gl_minor_version >= 0) SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, gl_minor_version);
47  if (use_gl_core) SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
48  SDL_SetCursor(SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_CROSSHAIR));
49  TTF_Init();
50  #ifdef NTA_USE_IMGUI
51  Logger::writeToLog("Initializing imgui...");
52  IMGUI_CHECKVERSION();
53  ImGui::CreateContext();
54  ImGui::StyleColorsDark();
55  #endif
56  #ifdef NTA_USE_DEVIL
57  Logger::writeToLog("Initializing DevIL");
58  ilInit();
59  iluInit();
60  #endif
61  Random::init();
62  #ifdef NTA_USE_AUDIO
64  #endif
67  Logger::writeToLog("Initialized Engine");
68  }
69  void cleanup() {
70  #ifdef NTA_USE_IMGUI
71  ImGui_ImplOpenGL3_Shutdown();
72  ImGui_ImplSDL2_Shutdown();
73  ImGui::DestroyContext();
74  #endif
75  ResourceManager::destroy();
77  #ifdef NTA_USE_AUDIO
79  #endif
81  TTF_Quit();
82  SDL_Quit();
83  }
84  bool check_error() {
85  std::string gl_err;
86  int err = GL_NO_ERROR;
87  if (SDL_GL_GetCurrentContext() != nullptr) {
88  while ((err = glGetError()) != GL_NO_ERROR) {
89  gl_err += gl_err == "" ? "" : "\n";
90  gl_err += utils::to_string(gluErrorString(err)) + " (" + utils::to_string(err) + ")";
91  }
92  if (gl_err != "") {
93  Logger::writeToLog("GL Error(s): {}", gl_err);
94  }
95  }
96  std::string sdl_err = SDL_GetError();
97  if (sdl_err != "") {
98  Logger::writeToLog("SDL Error: {}", sdl_err);
99  SDL_ClearError();
100  }
101  return err != GL_NO_ERROR || sdl_err != "";
102  }
103  std::ostream& lock_stream(std::ostream& stream) {
104  g_map_lock.lock();
105  auto& lock = g_stream_locks[&stream];
106  if (!lock) lock.reset(new std::mutex);
107  g_map_lock.unlock();
108  lock->lock();
109  return stream;
110  }
111  std::ostream& unlock_stream(std::ostream& stream) {
112  g_map_lock.lock();
113  auto& lock = g_stream_locks[&stream];
114  g_map_lock.unlock();
115  if (lock) lock->unlock();
116  return stream;
117  }
118 }
nta::Logger::writeToLog
static void writeToLog(crstring entry)
writes an entry in the log
Definition: Logger.cpp:17
nta::Random::init
static void init()
initializes random number generation
Definition: Random.cpp:8
nta::Logger::unindent
static void unindent(size_t tab_size=TAB_SIZE)
unindents entries
Definition: Logger.cpp:46
nta::AudioManager::destroy
static void destroy()
frees all music
Definition: AudioManager.cpp:19
nta::unlock_stream
std::ostream & unlock_stream(std::ostream &stream)
Unlock stream.
Definition: MyEngine.cpp:111
nta::AudioManager::init
static void init()
initializes SDL_Mixer
Definition: AudioManager.cpp:8
nta
Definition: Animation2D.h:6
nta::lock_stream
std::ostream & lock_stream(std::ostream &stream)
Lock stream for thread-safe manipulation.
Definition: MyEngine.cpp:103
nta::WindowManager::destroy
static void destroy()
Destorys the manager, freeing all necessary data.
Definition: WindowManager.cpp:16
nta::CallbackManager::init
static void init()
Initializes the CallbackManager.
Definition: CallbackManager.cpp:49
nta::init
void init(int gl_major_version=3, int gl_minor_version=2, bool use_gl_core=true)
initializes some basic stuff for the engine
Definition: MyEngine.cpp:36
nta::CallbackManager::destroy
static void destroy()
Destroys the CallbackManager.
Definition: CallbackManager.cpp:108
nta::utils::to_string
std::string to_string(const T &input, std::size_t precision=0)
converts input to a std::string
Definition: utils.h:36
nta::Logger::writeErrorToLog
static Error writeErrorToLog(crstring error, ErrorType type=OTHER)
writes entry in log and then notifies ErrorManager
Definition: Logger.cpp:31
nta::Logger::createLog
static void createLog()
creates the log
Definition: Logger.cpp:12
nta::Logger::indent
static void indent(size_t tab_size=TAB_SIZE)
indents entries
Definition: Logger.cpp:43
nta::check_error
bool check_error()
Checks for and logs errors.
Definition: MyEngine.cpp:84
nta::cleanup
void cleanup()
deinitializes some stuff and destroys all managers
Definition: MyEngine.cpp:69