summaryrefslogtreecommitdiffstats
path: root/src/core/frontend/motion_emu.h
blob: 99d41a726401563e8020afac6279398e1a0d689a (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
// Copyright 2016 Citra Emulator Project
// Licensed under GPLv2 or any later version
// Refer to the license.txt file included.

#pragma once
#include "common/thread.h"
#include "common/vector_math.h"

class EmuWindow;

namespace Motion {

class MotionEmu final {
public:
    MotionEmu(EmuWindow& emu_window);
    ~MotionEmu();

    /**
     * Signals that a motion sensor tilt has begun.
     * @param x the x-coordinate of the cursor
     * @param y the y-coordinate of the cursor
     */
    void BeginTilt(int x, int y);

    /**
     * Signals that a motion sensor tilt is occurring.
     * @param x the x-coordinate of the cursor
     * @param y the y-coordinate of the cursor
     */
    void Tilt(int x, int y);

    /**
     * Signals that a motion sensor tilt has ended.
     */
    void EndTilt();

private:
    Math::Vec2<int> mouse_origin;

    std::mutex tilt_mutex;
    Math::Vec2<float> tilt_direction;
    float tilt_angle = 0;

    bool is_tilting = false;

    Common::Event shutdown_event;
    std::thread motion_emu_thread;

    void MotionEmuThread(EmuWindow& emu_window);
};

} // namespace Motion