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 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
|
// Copyright 2019 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef UI_BASE_PREDICTION_LINEAR_PREDICTOR_H_
#define UI_BASE_PREDICTION_LINEAR_PREDICTOR_H_
#include <deque>
#include "base/component_export.h"
#include "ui/base/prediction/input_predictor.h"
namespace ui {
// This class use a linear model for prediction
// You can choose between a first order equation:
// pred_p = last_p + velocity*pred_time
// and a second order equation:
// pred_p = last_p + velocity*pred_dt + 0.5*acceleration*pred_dt^2
class COMPONENT_EXPORT(UI_BASE_PREDICTION) LinearPredictor
: public InputPredictor {
public:
// Used to dissociate the order of the equation used but also used to
// define the number of events needed by each model
enum class EquationOrder : size_t { kFirstOrder = 2, kSecondOrder = 3 };
explicit LinearPredictor(EquationOrder order);
LinearPredictor(const LinearPredictor&) = delete;
LinearPredictor& operator=(const LinearPredictor&) = delete;
~LinearPredictor() override;
const char* GetName() const override;
// Reset the predictor to initial state.
void Reset() override;
// Store current input in queue.
void Update(const InputData& new_input) override;
// Return if there is enough data in the queue to generate prediction.
bool HasPrediction() const override;
// Generate the prediction based on stored points and given time_stamp.
// Return false if no prediction available.
std::unique_ptr<InputData> GeneratePrediction(
base::TimeTicks predict_time,
base::TimeDelta frame_interval) override;
// Return the average time delta in the event queue.
base::TimeDelta TimeInterval() const override;
// Return the number of events needed to compute a prediction
size_t NumberOfEventsNeeded();
private:
gfx::PointF GeneratePredictionFirstOrder(float pred_dt) const;
gfx::PointF GeneratePredictionSecondOrder(float pred_dt) const;
// Store the last events received
std::deque<InputData> events_queue_;
// Store the equation order of the predictor
// The enum value also represents the number of events needed to compute the
// prediction
EquationOrder equation_order_;
// Store the current velocity of the 2 last events
gfx::Vector2dF cur_velocity_;
// Store the last velocity of the 2 last past events
gfx::Vector2dF last_velocity_;
// Store the current delta time between the last 2 events
float events_dt_;
};
} // namespace ui
#endif // UI_BASE_PREDICTION_LINEAR_PREDICTOR_H_
|