Open Source Tomb Raider Engine
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299
  1. /*!
  2. * \file include/System.h
  3. * \brief Mostly defines the interface of System implementations.
  4. *
  5. * Currently only SDL is used, but there was a GLUT implementation.
  6. *
  7. * \author Mongoose
  8. * \author xythobuz
  9. */
  10. #ifndef _SYSTEM_H_
  11. #define _SYSTEM_H_
  12. #include <Map.h>
  13. #include <Vector.h>
  14. //! \todo Replace with unicode compatible key codes
  15. #define SYS_MOUSE_LEFT 6000
  16. #define SYS_MOUSE_RIGHT 6001
  17. #define SYS_MOUSE_MIDDLE 6002
  18. #define SYS_KEY_ESC 27
  19. #define SYS_KEY_ENTER 13
  20. #define SYS_KEY_UP 5000
  21. #define SYS_KEY_DOWN 5001
  22. #define SYS_KEY_RIGHT 5002
  23. #define SYS_KEY_LEFT 5003
  24. #define SYS_KEY_PAGEDOWN 5004
  25. #define SYS_KEY_PAGEUP 5005
  26. #define SYS_KEY_F1 1000
  27. #define SYS_KEY_F2 1001
  28. #define SYS_KEY_F3 1002
  29. #define SYS_KEY_F4 1003
  30. #define SYS_KEY_F5 1004
  31. #define SYS_KEY_F6 1005
  32. #define SYS_KEY_F7 1006
  33. #define SYS_KEY_F8 1007
  34. #define SYS_KEY_F9 1008
  35. #define SYS_KEY_F10 1009
  36. #define SYS_KEY_F11 1010
  37. #define SYS_KEY_F12 1011
  38. typedef enum {
  39. SYS_MOD_KEY_LSHIFT = 1,
  40. SYS_MOD_KEY_RSHIFT = 2,
  41. SYS_MOD_KEY_LCTRL = 4,
  42. SYS_MOD_KEY_RCTRL = 8,
  43. SYS_MOD_KEY_LALT = 16,
  44. SYS_MOD_KEY_RALT = 32,
  45. SYS_MOD_KEY_LMETA = 64,
  46. SYS_MOD_KEY_RMETA = 128,
  47. } sdl_sys_mod_key_t;
  48. /*!
  49. * \brief Basic Interface for System implementations (SDLSystem)
  50. */
  51. class System
  52. {
  53. public:
  54. ////////////////////////////////////////////////////////////
  55. // Constructors
  56. ////////////////////////////////////////////////////////////
  57. /*!
  58. * \brief Constructs an object of System
  59. */
  60. System();
  61. /*!
  62. * \brief Deconstructs an object of System
  63. */
  64. virtual ~System();
  65. ////////////////////////////////////////////////////////////
  66. // Public Accessors
  67. ////////////////////////////////////////////////////////////
  68. /*!
  69. * \brief Generates a buufered string for the printf call
  70. * \param string Format string like for printf
  71. * \returns string in a buffer
  72. */
  73. static char *bufferString(const char *string, ...);
  74. /*!
  75. * \brief Expansion of unix home enviroment char.
  76. * Also makes sure string ends in "end" char.
  77. * \param path path string
  78. * \param end end character. 0 appends no additional char
  79. * \returns allocated string of path with expansions
  80. */
  81. static char *fullPath(const char *path, char end);
  82. /*!
  83. * \brief Only returns last part of a path string.
  84. * \param filename Path to a file
  85. * \returns Name of the file in filename, without path in front
  86. */
  87. static char *getFileFromFullPath(char *filename);
  88. /*!
  89. * \brief Gets the game tick
  90. * \returns number of milliseconds since start of program
  91. */
  92. virtual unsigned int getTicks();
  93. /*!
  94. * \brief Downloads something into passed buffer
  95. * \todo Not yet implemented!
  96. * \param urlString URL of thing to download
  97. * \param buffer array of strings as target
  98. * \param size size of buffer
  99. * \returns < 0 on error, 0 on success
  100. */
  101. static int downloadToBuffer(char *urlString,
  102. unsigned char **buffer, unsigned int *size);
  103. /*!
  104. * \brief Downloads something into a disk file.
  105. * Supports HTTP and FTP.
  106. * \param urlString URL of thing to download
  107. * \param filename file that should be created/filled
  108. * \returns < 0 on error, 0 on success. -1000 if libferit not linked
  109. */
  110. static int downloadToFile(char *urlString, char *filename);
  111. /*!
  112. * \brief Created a directory
  113. * \param path Directory to create
  114. * \returns -1 on error
  115. */
  116. static int createDir(char *path);
  117. ////////////////////////////////////////////////////////////
  118. // Public Mutators
  119. ////////////////////////////////////////////////////////////
  120. /*!
  121. * \brief Created a new Command Mode.
  122. * \param command valid command mode for the resource file, eg "[Engine.OpenGL.Driver]"
  123. * \returns id given to mode
  124. */
  125. virtual unsigned int addCommandMode(const char *command);
  126. /*!
  127. * \brief Binds a key to a command
  128. * \param cmd valid command string for event
  129. * \param key valid keyboard code
  130. * \param event valid game event id
  131. */
  132. virtual void bindKeyCommand(const char *cmd, unsigned int key, int event);
  133. /*!
  134. * \brief Executes a command string
  135. * \param cmd valid command string, cmd sets its var
  136. */
  137. virtual void command(const char *cmd);
  138. virtual void gameFrame() = 0;
  139. virtual void handleMouseMotionEvent(float x, float y) = 0;
  140. /*!
  141. * \brief Receives the event bound to the command from the key press
  142. * \param key key pressed
  143. */
  144. virtual void handleBoundKeyPressEvent(unsigned int key) = 0;
  145. /*!
  146. * \brief Receives the event bound to the command from the key release
  147. * \param key key released
  148. */
  149. virtual void handleBoundKeyReleaseEvent(unsigned int key) = 0;
  150. /*!
  151. * \brief Executes valid command based on keyword
  152. * \param command valid keyword, optionally followed by space separated arguments
  153. * \param mode current type or resource mode
  154. */
  155. virtual void handleCommand(char *command, unsigned int mode) = 0;
  156. /*!
  157. * \brief Receives key code from text input in console mode
  158. * \param key is a valid keyboard code
  159. * \param mod modifier key
  160. */
  161. virtual void handleConsoleKeyPressEvent(unsigned int key,
  162. unsigned int mod) = 0;
  163. virtual void handleKeyPressEvent(unsigned int key, unsigned int mod) = 0;
  164. virtual void handleKeyReleaseEvent(unsigned int key, unsigned int mod) = 0;
  165. virtual void initGL();
  166. virtual void initVideo(unsigned int width, unsigned int height,
  167. bool fullscreen) = 0;
  168. /*!
  169. * \brief Init the resource vars
  170. * \param filename resource file
  171. * \returns < 0 on error
  172. */
  173. virtual int loadResourceFile(const char *filename);
  174. static void resetTicks();
  175. virtual void resizeGL(unsigned int width, unsigned int height);
  176. virtual void runGame() = 0;
  177. /*!
  178. * \brief Turns console key events on/off
  179. * Mostly for allowing text entry vs key impulse commands
  180. * \param on new state
  181. */
  182. void setConsoleMode(bool on);
  183. void setDriverGL(const char *driver);
  184. void setFastCardPerformance(bool isFast);
  185. virtual void shutdown(int code) = 0;
  186. virtual void swapBuffersGL() = 0;
  187. virtual void toggleFullscreen() = 0;
  188. protected:
  189. unsigned int m_width; //!< Width of the viewport
  190. unsigned int m_height; //!< Height of the viewport
  191. bool m_fastCard; //!< Assume expensive calls are fine if true
  192. char *m_driver; //!< String for dynamic use of GL library
  193. float m_clipNear; //!< Clip near distance
  194. float m_clipFar; //!< Clip far distance
  195. float m_fovY; //!< Field of vision
  196. Map<unsigned int, int> mKeyEvents; //!< Single key press event mappings
  197. bool mConsoleMode; //!< Using text (console) event handler?
  198. Vector<const char *> mCmdModes; //!< Dynamic resource command collection
  199. unsigned int mCommandMode; //!< Current resource command mode
  200. unsigned int mConsoleKey; //!< Console toggle event now handled lower
  201. private:
  202. ////////////////////////////////////////////////////////////
  203. // Private Accessors
  204. ////////////////////////////////////////////////////////////
  205. ////////////////////////////////////////////////////////////
  206. // Private Mutators
  207. ////////////////////////////////////////////////////////////
  208. };
  209. //! \todo Could make these static methods later, depends on API evolution
  210. /*!
  211. * \brief Checks if Command matches Symbol.
  212. * Returns the rest of the argument list back in command buffer, if any
  213. * \param symbol command string
  214. * \param command with arguments
  215. * \returns true if command matches symbol
  216. */
  217. bool rc_command(const char *symbol, char *command);
  218. /*!
  219. * \brief Interpret a string as a bool
  220. * \param buffer "true" or "false"
  221. * \param val is set to boolean interpretation of buffer
  222. * \returns -1 for null string, -2 if string is not "true" or "false"
  223. */
  224. int rc_get_bool(char *buffer, bool *val);
  225. /*!
  226. * \brief Sets timer state and returns number of ticks
  227. * \param state 0 - reset, 1 - get number of ticks
  228. * \returns number of ticks
  229. */
  230. unsigned int system_timer(int state);
  231. #endif