19 #ifndef SIMULANT_WINDOW_BASE_H
20 #define SIMULANT_WINDOW_BASE_H
26 #include "generic/property.h"
27 #include "generic/object_manager.h"
28 #include "generic/data_carrier.h"
30 #include "input/input_state.h"
33 #include "event_listener.h"
34 #include "stats_recorder.h"
59 typedef sig::signal<void (std::string, Screen*)> ScreenAddedSignal;
60 typedef sig::signal<void (std::string, Screen*)> ScreenRemovedSignal;
62 typedef sig::signal<void ()> FocusLostSignal;
63 typedef sig::signal<void ()> FocusGainedSignal;
79 typedef std::shared_ptr<Window> ptr;
82 static std::shared_ptr<Window> create(
Application* app) {
83 auto window = std::make_shared<T>();
84 window->set_application(app);
90 virtual bool create_window(
98 virtual void set_title(
const std::string& title) = 0;
99 virtual void cursor_position(int32_t& mouse_x, int32_t& mouse_y) = 0;
100 virtual void show_cursor(
bool cursor_shown=
true) = 0;
101 virtual void lock_cursor(
bool cursor_locked=
true) = 0;
103 virtual void check_events() = 0;
107 uint16_t width()
const override {
return width_; }
108 uint16_t height()
const override {
return height_; }
109 bool is_fullscreen()
const {
return fullscreen_; }
110 bool vsync_enabled()
const {
return vsync_enabled_; }
112 float aspect_ratio()
const;
115 void set_logging_level(LogLevel level);
116 LogLevel logging_level()
const;
120 Vec2 coordinate_from_normalized(Ratio rx, Ratio ry) {
122 uint16_t(
float(width()) * rx),
123 uint16_t(
float(height()) * ry)
128 TouchPointID touch_id,
129 float normalized_x,
float normalized_y,
float pressure=1.0
133 TouchPointID touch_id,
134 float normalized_x,
float normalized_y
137 void on_finger_motion(
138 TouchPointID touch_id,
139 float normalized_x,
float normalized_y,
146 void on_game_controller_button_down(GameControllerIndex index, JoystickButton button);
147 void on_game_controller_button_up(GameControllerIndex index, JoystickButton button);
149 void on_mouse_down(MouseID
id, uint8_t mouse_button, int32_t x, int32_t y,
bool touch_device);
150 void on_mouse_up(MouseID
id, uint8_t mouse_button, int32_t x, int32_t y,
bool touch_device);
151 void on_mouse_move(MouseID
id, int32_t x, int32_t y,
bool touch_device);
154 std::size_t screen_count()
const;
157 Screen* screen(
const std::string& name)
const;
159 void each_screen(std::function<
void (std::string,
Screen*)> callback);
165 const std::string& name,
169 uint16_t refresh_rate);
171 void _destroy_screen(
const std::string& name);
174 virtual bool _init_window() = 0;
177 virtual bool _init_renderer(
Renderer* renderer) = 0;
179 bool initialize_assets_and_devices();
197 void set_audio_listener(
StageNode* node);
200 bool has_explicit_audio_listener()
const;
213 std::shared_ptr<Renderer> renderer_;
215 void set_vsync_enabled(
bool vsync) {
216 vsync_enabled_ = vsync;
219 void set_width(uint16_t width) {
223 void set_height(uint16_t height) {
227 void set_bpp(uint16_t bpp) {
231 void set_fullscreen(
bool val) {
235 virtual void destroy_window() = 0;
236 virtual void on_application_set(Application* app);
240 void set_has_context(
bool value=
true);
241 thread::Mutex& context_lock() {
return context_lock_; }
243 void set_application(Application* app);
245 void update_screens(
float dt);
246 sig::Connection update_conn_;
248 void set_escape_to_quit(
bool value=
true) { escape_to_quit_ = value; }
249 bool escape_to_quit_enabled()
const {
return escape_to_quit_; }
252 InputState* get_input_state() {
253 return input_state_.get();
257 Application* application_ =
nullptr;
259 void create_defaults();
260 virtual void initialize_input_controller(InputState& controller) = 0;
262 bool can_attach_sound_by_id()
const {
return false; }
264 bool initialized_ =
false;
267 uint16_t height_ = 0;
269 bool fullscreen_ =
false;
270 bool vsync_enabled_ =
false;
272 bool escape_to_quit_ =
true;
274 bool has_context_ =
false;
275 bool has_focus_ =
false;
282 thread::Mutex context_lock_;
286 std::shared_ptr<smlt::Compositor> compositor_;
287 generic::DataCarrier data_carrier_;
289 virtual std::shared_ptr<SoundDriver> create_sound_driver(
const std::string& from_config) = 0;
291 std::shared_ptr<InputState> input_state_;
292 std::shared_ptr<InputManager> input_manager_;
294 std::unordered_map<std::string, Screen::ptr> screens_;
297 virtual void render_screen(Screen* screen,
const uint8_t* data,
int row_stride) {
300 _S_UNUSED(row_stride);
304 virtual bool initialize_screen(Screen* screen) {
309 virtual void shutdown_screen(Screen* screen) {
313 virtual void do_swap_buffers() {}
315 StageNode* audio_listener_ =
nullptr;
317 friend class GameController;
319 InputState* _input_state()
const {
return input_state_.get(); }
321 virtual void game_controller_start_rumble(GameController *controller, RangeValue<0, 1> low_rumble, RangeValue<0, 1> high_rumble,
const smlt::Seconds& duration) {
322 _S_UNUSED(controller);
323 _S_UNUSED(low_rumble);
324 _S_UNUSED(high_rumble);
328 virtual void game_controller_stop_rumble(GameController *controller) {
329 _S_UNUSED(controller);
334 S_DEFINE_PROPERTY(app, &Window::application_);
335 S_DEFINE_PROPERTY(renderer, &Window::renderer_);
336 S_DEFINE_PROPERTY(data, &Window::data_carrier_);
337 S_DEFINE_PROPERTY(input, &Window::input_manager_);
338 S_DEFINE_PROPERTY(input_state, &Window::input_state_);
339 S_DEFINE_PROPERTY(compositor, &Window::compositor_);