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