| // Copyright 2018 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef SRC_LIB_UI_INPUT_GESTURE_H_ |
| #define SRC_LIB_UI_INPUT_GESTURE_H_ |
| |
| #include <fuchsia/ui/input/cpp/fidl.h> |
| |
| #include <map> |
| |
| #include "src/ui/lib/glm_workaround/glm_workaround.h" |
| |
| namespace input { |
| |
| // Tracks an individual gesture, defined as an ensemble of time-overlapping touch points in an |
| // interaction with a particular input device. Changes are transformed into a |Gesture::Delta| with |
| // aggregate 2D relative translation, rotation, and scale as suggested by touch point updates. |
| |
| // |
| // This class does not handle tapping or threshold-based classification of gestures, which can be |
| // handled by the caller. |GestureDetector| is an implementation of such a higher level facility. |
| class Gesture { |
| public: |
| using PointerId = decltype(fuchsia::ui::input::PointerEvent::pointer_id); |
| |
| // Represents a change from the previous |UpdatePointer| state. |
| struct Delta { |
| Delta& operator+=(const Delta& other); |
| bool operator==(const Delta& other) const; |
| |
| // Delta translation is expressed in the coordinate system determined by the input source. For |
| // most use cases, this is the view space, which is x-right y-down and scaled according to view |
| // properties. |
| glm::vec2 translation; |
| // Delta rotation is expressed in radians about the right-hand z of the coordinate system of the |
| // input source. For most use cases, this is clockwise. |
| float rotation = 0; |
| float scale = 1; |
| }; |
| |
| bool has_pointers() const { return !pointers_.empty(); } |
| size_t pointer_count() const { return pointers_.size(); } |
| const glm::vec2& centroid() const { return centroid_; } |
| |
| void AddPointer(PointerId pointer_id, const glm::vec2& position); |
| Delta UpdatePointer(PointerId pointer_id, const glm::vec2& position); |
| void RemovePointer(PointerId pointer_id); |
| |
| private: |
| struct PointerInfo { |
| glm::vec2 absolute; // input coordinates |
| glm::vec2 relative; // centroid coordinates |
| float distance; // centroid-relative |
| }; |
| |
| void UpdateCentroid(); |
| void UpdateRelative(); |
| |
| glm::vec2 centroid_; |
| std::map<PointerId, PointerInfo> pointers_; |
| }; |
| |
| } // namespace input |
| |
| #endif // SRC_LIB_UI_INPUT_GESTURE_H_ |