RedScreen::~RedScreen() { bool captured = is_mouse_captured(); _window.stop_key_interception(); relase_mouse(); destroy_composit_area(); _owner.deactivate_interval_timer(*_update_timer); _owner.on_screen_destroyed(_id, captured); region_destroy(&_dirty_region); if (_default_cursor) { _default_cursor->unref(); } if (_inactive_cursor) { _inactive_cursor->unref(); } }
void CameraController::update(float delta_time) { const Matrix3 rot = get_object()->get_rotation_matrix(); Vector3 right, up, forward; rot.get_basis(right, up, forward); const float move_speed = 2.5f * (key_down(Key::Left_Shift) ? 4.0f : 1.0f); // meters/second const float rotate_speed = 0.002f; // rad/pixel Vector3 delta = Vector3::zero; if (key_down(Key::W)) delta += forward; if (key_down(Key::S)) delta -= forward; if (key_down(Key::D)) delta += right; if (key_down(Key::A)) delta -= right; if (key_down(Key::Space)) delta += up; if (key_down(Key::Left_Control)) delta -= up; get_object()->move(delta * move_speed * m_speed_up * delta_time); if (key_pressed(Key::Left_Alt)) toggle_mouse_captured(); if (is_mouse_captured()) { const Vector2 mouse_delta = get_mouse_delta() * rotate_speed; m_rot_x += mouse_delta.y; m_rot_y += mouse_delta.x; m_speed_up += get_delta_scroll() * 0.5f; m_speed_up = std::max(m_speed_up, 0.0f); } Quaternion rot_x, rot_y; rot_x.rotation_x(m_rot_x); rot_y.rotation_y(m_rot_y); get_object()->set_rotation(rot_y * rot_x); }
void RedScreen::resize(int width, int height) { RecurciveLock lock(_update_lock); _size.x = width; _size.y = height; create_composit_area(); if (_full_screen) { bool cuptur = _owner.rearrange_monitors(*this); __show_full_screen(); if (cuptur) { capture_mouse(); } } else { bool cuptur = is_mouse_captured(); if (cuptur) { relase_mouse(); } _window.resize(_size.x, _size.y); if (_active && cuptur) { capture_mouse(); } } notify_new_size(); }