1 /* 2 * Copyright (C) 2016 Google, Inc. 3 * 4 * Permission is hereby granted, free of charge, to any person obtaining a 5 * copy of this software and associated documentation files (the "Software"), 6 * to deal in the Software without restriction, including without limitation 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8 * and/or sell copies of the Software, and to permit persons to whom the 9 * Software is furnished to do so, subject to the following conditions: 10 * 11 * The above copyright notice and this permission notice shall be included 12 * in all copies or substantial portions of the Software. 13 * 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 17 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 18 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 19 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 20 * DEALINGS IN THE SOFTWARE. 21 */ 22 23 #ifndef GAME_H 24 #define GAME_H 25 26 #include <string> 27 #include <vector> 28 29 class Shell; 30 31 class Game { 32 public: 33 Game(const Game &game) = delete; 34 Game &operator=(const Game &game) = delete; ~Game()35 virtual ~Game() {} 36 37 struct Settings { 38 std::string name; 39 int initial_width; 40 int initial_height; 41 int queue_count; 42 int back_buffer_count; 43 int ticks_per_second; 44 bool vsync; 45 bool animate; 46 47 bool validate; 48 bool validate_verbose; 49 50 bool no_tick; 51 bool no_render; 52 bool no_present; 53 }; settings()54 const Settings &settings() const { return settings_; } 55 attach_shell(Shell & shell)56 virtual void attach_shell(Shell &shell) { shell_ = &shell; } detach_shell()57 virtual void detach_shell() { shell_ = nullptr; } 58 attach_swapchain()59 virtual void attach_swapchain() {} detach_swapchain()60 virtual void detach_swapchain() {} 61 62 enum Key { 63 // virtual keys 64 KEY_SHUTDOWN, 65 // physical keys 66 KEY_UNKNOWN, 67 KEY_ESC, 68 KEY_UP, 69 KEY_DOWN, 70 KEY_SPACE, 71 }; on_key(Key key)72 virtual void on_key(Key key) {} on_tick()73 virtual void on_tick() {} 74 on_frame(float frame_pred)75 virtual void on_frame(float frame_pred) {} 76 77 protected: Game(const std::string & name,const std::vector<std::string> & args)78 Game(const std::string &name, const std::vector<std::string> &args) 79 : settings_(), shell_(nullptr) 80 { 81 settings_.name = name; 82 settings_.initial_width = 1280; 83 settings_.initial_height = 1024; 84 settings_.queue_count = 1; 85 settings_.back_buffer_count = 1; 86 settings_.ticks_per_second = 30; 87 settings_.vsync = true; 88 settings_.animate = true; 89 90 settings_.validate = false; 91 settings_.validate_verbose = false; 92 93 settings_.no_tick = false; 94 settings_.no_render = false; 95 settings_.no_present = false; 96 97 parse_args(args); 98 } 99 100 Settings settings_; 101 Shell *shell_; 102 103 private: parse_args(const std::vector<std::string> & args)104 void parse_args(const std::vector<std::string> &args) 105 { 106 for (auto it = args.begin(); it != args.end(); ++it) { 107 if (*it == "-b") { 108 settings_.vsync = false; 109 } else if (*it == "-w") { 110 ++it; 111 settings_.initial_width = std::stoi(*it); 112 } else if (*it == "-h") { 113 ++it; 114 settings_.initial_height = std::stoi(*it); 115 } else if (*it == "-v") { 116 settings_.validate = true; 117 } else if (*it == "--validate") { 118 settings_.validate = true; 119 } else if (*it == "-vv") { 120 settings_.validate = true; 121 settings_.validate_verbose = true; 122 } else if (*it == "-nt") { 123 settings_.no_tick = true; 124 } else if (*it == "-nr") { 125 settings_.no_render = true; 126 } else if (*it == "-np") { 127 settings_.no_present = true; 128 } 129 } 130 } 131 }; 132 133 #endif // GAME_H 134