Pioneer
Pi.h
Go to the documentation of this file.
1 // Copyright © 2008-2021 Pioneer Developers. See AUTHORS.txt for details
2 // Licensed under the terms of the GPL v3. See licenses/GPL-3.txt
3 
4 #ifndef _PI_H
5 #define _PI_H
6 
7 #include "JobQueue.h"
8 #include "Random.h"
9 #include "core/GuiApplication.h"
10 #include "gameconsts.h"
11 #include "libs.h"
12 
13 #include "SDL_keyboard.h"
14 #include <sigc++/sigc++.h>
15 #include <map>
16 #include <string>
17 #include <vector>
18 
19 namespace Input {
20  class Manager;
21 } //namespace Input
22 
23 namespace PiGui {
24  class Instance;
25 } //namespace PiGui
26 
27 class Game;
28 
29 class GameConfig;
30 class Intro;
31 class LuaConsole;
32 class LuaNameGen;
33 class LuaTimer;
34 class ModelCache;
35 class ObjectViewerView;
36 class Player;
37 class SystemPath;
38 class TransferPlanner;
39 class View;
40 class SDLGraphics;
41 class LuaSerializer;
42 
43 #if ENABLE_SERVER_AGENT
44 class ServerAgent;
45 #endif
46 
47 namespace Graphics {
48  class Renderer;
49  class Texture;
50  class RenderState;
51  class RenderTarget;
52  namespace Drawables {
53  class TexturedQuad;
54  }
55 } // namespace Graphics
56 
57 namespace SceneGraph {
58  class Model;
59 }
60 
61 namespace Sound {
62  class MusicPlayer;
63 }
64 
65 class DetailLevel {
66 public:
68  planets(0),
69  cities(0) {}
70  int planets;
71  int cities;
72 };
73 
74 class Pi {
75 public:
76  Pi() = delete;
77 
78  class App final : public GuiApplication {
79  public:
80  // TODO: headless mode should be part of a different, process-wide inter
81  bool HeadlessMode() { return m_noGui; }
82 
83  void SetStartPath(const SystemPath &startPath);
84 
85  // Returns a pointer to the async JobSet for the current startup loading step.
86  // The current load step will not complete until all ordered jobs have finished.
87  // NOTE: this queue runs on a different thread.
89 
90  // Returns a pointer to the async JobSet for the entire startup loading screen.
91  // Loading will not finish until all ordered jobs have finished.
92  // NOTE: this queue runs on a different thread.
94 
95  protected:
96  // for compatibility, while we're moving Pi's internals into App
97  friend class Pi;
98 
99  // Pi-internal lifecycle classes
100  friend class MainMenu;
101  friend class GameLoop;
102  friend class TombstoneLoop;
103 
104  App() :
105  GuiApplication("Pioneer") {}
106 
107  void Startup() override;
108  void Shutdown() override;
109 
110  void PreUpdate() override;
111  void PostUpdate() override;
112 
113  void RunJobs();
114 
115  void HandleRequests();
116  bool HandleEvent(SDL_Event &ev) override;
117 
118  private:
119  // msgs/requests that can be posted which the game processes at the end of a game loop in HandleRequests
120  enum class InternalRequests {
121  END_GAME = 0,
122  QUIT_GAME,
123  };
124 
125  std::vector<InternalRequests> internalRequests;
126 
127  bool m_noGui;
128 
129  std::shared_ptr<Lifecycle> m_loader;
130  std::shared_ptr<Lifecycle> m_mainMenu;
131  std::shared_ptr<Lifecycle> m_gameLoop;
132  };
133 
134 public:
135  static void Init(const std::map<std::string, std::string> &options, bool no_gui = false);
136 
137  static void StartGame(Game *game);
138 
139  static void RequestEndGame(); // request that the game is ended as soon as safely possible
140  static void RequestQuit();
141 
142  static void OnChangeDetailLevel();
143  static float GetFrameTime() { return frameTime; }
144  static float GetGameTickAlpha() { return gameTickAlpha; }
145  // for internal use, don't modify unless you know what you're doing
146  static void SetGameTickAlpha(float alpha) { gameTickAlpha = alpha; }
147 
148  static void SetShowDebugInfo(bool enabled) { showDebugInfo = enabled; };
150 
151  // FIXME: hacked-in singleton pattern, find a better way to locate the application
152  static App *GetApp() { return m_instance; }
153 
154  static bool IsNavTunnelDisplayed() { return navTunnelDisplayed; }
155  static void SetNavTunnelDisplayed(bool state) { navTunnelDisplayed = state; }
156  static bool AreSpeedLinesDisplayed() { return speedLinesDisplayed; }
157  static void SetSpeedLinesDisplayed(bool state) { speedLinesDisplayed = state; }
158  static bool AreHudTrailsDisplayed() { return hudTrailsDisplayed; }
159  static void SetHudTrailsDisplayed(bool state) { hudTrailsDisplayed = state; }
160 
161  static void SetMouseGrab(bool on);
162  static bool DoingMouseGrab() { return doingMouseGrab; }
163 
164  // Get the default speed modifier to apply to movement (scrolling, zooming...), depending on the "shift" keys.
165  // This is a default value only, centralized here to promote uniform user expericience.
166  static float GetMoveSpeedShiftModifier();
167 
168  static std::string GetSaveDir();
169  static SceneGraph::Model *FindModel(const std::string &, bool allowPlaceholder = true);
170 
171  static const char SAVE_DIR_NAME[];
172 
175 
177 
178 #if ENABLE_SERVER_AGENT
179  static ServerAgent *serverAgent;
180 #endif
181 
183 
184  static Random rng;
185  static int statSceneTris;
186  static int statNumPatches;
187 
188  static void SetView(View *v);
189  static View *GetView() { return currentView; }
190 
191  static void SetAmountBackgroundStars(const float pc)
192  {
193  amountOfBackgroundStarsDisplayed = Clamp(pc, 0.0f, 1.0f);
194  bRefreshBackgroundStars = true;
195  }
196  static float GetAmountBackgroundStars() { return amountOfBackgroundStarsDisplayed; }
198  {
199  const bool bRet = bRefreshBackgroundStars;
200  bRefreshBackgroundStars = false;
201  return bRet;
202  }
203 
204  /* Only use #if WITH_DEVKEYS */
205  static bool showDebugInfo;
206 
208  static Player *player;
210  static std::unique_ptr<LuaConsole> luaConsole;
211  static Sound::MusicPlayer &GetMusicPlayer() { return musicPlayer; }
214  static Intro *intro;
215  static SDLGraphics *sdl;
216 
217  static Game *game;
218 
221 
222  static JobQueue *GetAsyncJobQueue() { return asyncJobQueue.get(); }
223  static JobQueue *GetSyncJobQueue() { return syncJobQueue.get(); }
224 
225  static bool DrawGUI;
226 
227 private:
228  static void HandleKeyDown(SDL_Keysym *key);
229 
230  // private members
231  static const Uint32 SYNC_JOBS_PER_LOOP = 1;
232  static std::unique_ptr<AsyncJobQueue> asyncJobQueue;
233  static std::unique_ptr<SyncJobQueue> syncJobQueue;
234 
235  static bool menuDone;
236 
237  static View *currentView;
238 
243  static float gameTickAlpha;
244  static float frameTime;
245 
246  static Sound::MusicPlayer musicPlayer;
247 
248  static bool navTunnelDisplayed;
249  static bool speedLinesDisplayed;
250  static bool hudTrailsDisplayed;
251  static bool bRefreshBackgroundStars;
252  static float amountOfBackgroundStarsDisplayed;
253 
254  static Graphics::RenderTarget *renderTarget;
255  static RefCountedPtr<Graphics::Texture> renderTexture;
256  static std::unique_ptr<Graphics::Drawables::TexturedQuad> renderQuad;
257  static Graphics::RenderState *quadRenderState;
258 
259  static bool doingMouseGrab;
260 
261  static bool isRecordingVideo;
262  static FILE *ffmpegFile;
263 
264 private:
265  // for compatibility, while we're moving Pi's internals into App
266  friend class App;
267 
268  static App *m_instance;
269 };
270 
271 #endif /* _PI_H */
Definition: Pi.h:65
int cities
Definition: Pi.h:71
int planets
Definition: Pi.h:70
DetailLevel()
Definition: Pi.h:67
Definition: GameConfig.h:9
Definition: Pi.cpp:206
Definition: Game.h:39
Definition: RenderState.h:25
Definition: RenderTarget.h:38
Definition: Renderer.h:39
Definition: GuiApplication.h:18
Definition: Input.h:118
Definition: Intro.h:12
Definition: JobQueue.h:101
Definition: JobQueue.h:250
Definition: LuaConsole.h:15
Definition: LuaNameGen.h:14
Definition: LuaSerializer.h:12
Definition: LuaTimer.h:10
Definition: Pi.cpp:187
Definition: ModelCache.h:20
Definition: ObjectViewerView.h:15
Definition: PiGui.h:84
Definition: Pi.h:78
bool HeadlessMode()
Definition: Pi.h:81
App()
Definition: Pi.h:104
void HandleRequests()
Definition: Pi.cpp:834
void RunJobs()
Definition: Pi.cpp:880
JobSet * GetAsyncStartupQueue() const
Definition: Pi.cpp:472
void SetStartPath(const SystemPath &startPath)
Definition: Pi.cpp:267
void Shutdown() override
Definition: Pi.cpp:408
JobSet * GetCurrentLoadStepQueue() const
Definition: Pi.cpp:477
void PreUpdate() override
Definition: Pi.cpp:862
void Startup() override
Definition: Pi.cpp:315
bool HandleEvent(SDL_Event &ev) override
Definition: Pi.cpp:815
void PostUpdate() override
Definition: Pi.cpp:870
Definition: Pi.h:74
static void SetMouseGrab(bool on)
Definition: Pi.cpp:1224
static bool showDebugInfo
Definition: Pi.h:205
static LuaNameGen * luaNameGen
Definition: Pi.h:176
static JobQueue * GetSyncJobQueue()
Definition: Pi.h:223
static void SetAmountBackgroundStars(const float pc)
Definition: Pi.h:191
static void RequestEndGame()
Definition: Pi.cpp:1183
static View * GetView()
Definition: Pi.h:189
Pi()=delete
static void StartGame(Game *game)
Definition: Pi.cpp:707
static bool DrawGUI
Definition: Pi.h:225
static GameConfig * config
Definition: Pi.h:220
static std::string GetSaveDir()
Definition: Pi.cpp:1177
static ModelCache * modelCache
Definition: Pi.h:213
static bool AreHudTrailsDisplayed()
Definition: Pi.h:158
static void RequestQuit()
Definition: Pi.cpp:1188
static Sound::MusicPlayer & GetMusicPlayer()
Definition: Pi.h:211
static bool AreSpeedLinesDisplayed()
Definition: Pi.h:156
static float GetMoveSpeedShiftModifier()
Definition: Pi.cpp:1216
static int statNumPatches
Definition: Pi.h:186
static Graphics::Renderer * renderer
Definition: Pi.h:212
static SDLGraphics * sdl
Definition: Pi.h:215
static float GetGameTickAlpha()
Definition: Pi.h:144
static void SetHudTrailsDisplayed(bool state)
Definition: Pi.h:159
static Random rng
Definition: Pi.h:184
static void SetShowDebugInfo(bool enabled)
Definition: Pi.h:148
static Input::Manager * input
Definition: Pi.h:207
static JobQueue * GetAsyncJobQueue()
Definition: Pi.h:222
static Game * game
Definition: Pi.h:217
static void SetNavTunnelDisplayed(bool state)
Definition: Pi.h:155
static void SetSpeedLinesDisplayed(bool state)
Definition: Pi.h:157
static const char SAVE_DIR_NAME[]
Definition: Pi.h:171
static void OnChangeDetailLevel()
Definition: Pi.cpp:1205
static float GetFrameTime()
Definition: Pi.h:143
static Player * player
Definition: Pi.h:208
static LuaSerializer * luaSerializer
Definition: Pi.h:173
static bool IsNavTunnelDisplayed()
Definition: Pi.h:154
static PiGui::Instance * pigui
Definition: Pi.h:182
static float GetAmountBackgroundStars()
Definition: Pi.h:196
static LuaTimer * luaTimer
Definition: Pi.h:174
static TransferPlanner * planner
Definition: Pi.h:209
static bool MustRefreshBackgroundClearFlag()
Definition: Pi.h:197
static void SetGameTickAlpha(float alpha)
Definition: Pi.h:146
static void Init(const std::map< std::string, std::string > &options, bool no_gui=false)
Definition: Pi.cpp:254
static App * GetApp()
Definition: Pi.h:152
static std::unique_ptr< LuaConsole > luaConsole
Definition: Pi.h:210
static DetailLevel detail
Definition: Pi.h:219
static Intro * intro
Definition: Pi.h:214
static void ToggleShowDebugInfo()
Definition: Pi.h:149
static bool DoingMouseGrab()
Definition: Pi.h:162
static int statSceneTris
Definition: Pi.h:185
static void SetView(View *v)
Definition: Pi.cpp:1197
static SceneGraph::Model * FindModel(const std::string &, bool allowPlaceholder=true)
Definition: Pi.cpp:1156
Definition: Player.h:16
Definition: Random.h:27
Definition: Model.h:94
Definition: SoundMusic.h:22
Definition: SystemPath.h:13
Definition: Pi.cpp:234
Definition: TransferPlanner.h:8
Definition: View.h:22
const T & Clamp(const T &x, const T &min, const T &max)
Definition: libs.h:69
Definition: Background.h:13
Definition: Input.cpp:20
Definition: LuaBody.cpp:28
Definition: CityOnPlanet.h:23
Definition: Pi.h:61