1 #ifndef __DALI_INTERNAL_SCENE_GRAPH_PAN_GESTURE_H__
2 #define __DALI_INTERNAL_SCENE_GRAPH_PAN_GESTURE_H__
5 * Copyright (c) 2017 Samsung Electronics Co., Ltd.
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
22 #include <dali/public-api/common/vector-wrapper.h>
23 #include <dali/public-api/events/pan-gesture.h>
24 #include <dali/internal/update/common/property-owner.h>
25 #include <dali/internal/update/gestures/gesture-properties.h>
35 struct PanGestureProfiling;
41 * The latest pan gesture information is stored in this scene object.
43 class PanGesture : public PropertyOwner
55 SMOOTHING_NONE, // no smoothing
56 SMOOTHING_LAST_VALUE, // smooth between last value and latest value
59 static const PredictionMode DEFAULT_PREDICTION_MODE;
60 static const int NUM_PREDICTION_MODES;
62 static const SmoothingMode DEFAULT_SMOOTHING_MODE;
63 static const int NUM_SMOOTHING_MODES;
65 // Latest Pan Information
68 * Only stores the information we actually require from Dali::PanGesture
73 * Stores the velocity, displacement and position.
84 Info( const Info& rhs )
85 : velocity( rhs.velocity ),
86 displacement( rhs.displacement ),
87 position( rhs.position )
94 Info& operator=( const Info& rhs )
98 velocity = rhs.velocity;
99 displacement = rhs.displacement;
100 position = rhs.position;
109 Vector2 displacement;
118 state( Gesture::Clear ),
126 PanInfo( const PanInfo& rhs )
130 screen( rhs.screen ),
136 * Assignment operator
138 PanInfo& operator=( const PanInfo& rhs )
153 * Assignment operator
154 * @param[in] gesture A Dali::Gesture
156 PanInfo& operator=( const Dali::PanGesture& rhs )
161 local.velocity = rhs.velocity;
162 local.displacement = rhs.displacement;
163 local.position = rhs.position;
165 screen.velocity = rhs.screenVelocity;
166 screen.displacement = rhs.screenDisplacement;
167 screen.position = rhs.screenPosition;
174 Gesture::State state;
180 typedef std::vector<PanInfo> PanInfoHistory;
181 typedef PanInfoHistory::iterator PanInfoHistoryIter;
182 typedef PanInfoHistory::const_iterator PanInfoHistoryConstIter;
185 static const unsigned int PAN_GESTURE_HISTORY = 10u;
190 * Create a new PanGesture
192 static PanGesture* New();
197 virtual ~PanGesture();
200 * Adds a PanGesture to the internal circular-buffer waiting to be handled by UpdateProperties.
201 * @param[in] gesture The latest pan gesture.
203 void AddGesture( const Dali::PanGesture& gesture );
206 * @brief Removes pan events from the history that are older than maxAge, leaving at least minEvents
208 * @param[in] panHistory The pan event history container
209 * @param[in] currentTime The current frame time
210 * @param[in] maxAge Maximum age of an event before removing (in millis)
211 * @param[in] minEvents The minimum number of events to leave in history, oldest events are removed before newest
213 void RemoveOldHistory(PanInfoHistory& panHistory, unsigned int currentTime, unsigned int maxAge, unsigned int minEvents);
216 * Uses elapsed time and time stamps
218 void PredictiveAlgorithm1(int eventsThisFrame, PanInfo& gestureOut, PanInfoHistory& panHistory, unsigned int lastVSyncTime, unsigned int nextVSyncTime);
221 * Uses last two gestures
223 * @param[in] justStarted Whether the pan has just started.
224 * @param[out] gestureOut Output gesture using average values from last two gestures
225 * @param[in] lastVSyncTime The time to set on gestureOut.
227 void SmoothingAlgorithm1(bool justStarted, PanInfo& gestureOut, unsigned int lastVSyncTime);
230 * Future smoothing method, implementation not complete
232 void SmoothingAlgorithm2(bool justStarted, PanInfo& gestureOut, unsigned int lastVSyncTime);
235 * Called by the update manager so that we can update the value of our properties.
236 * @param[in] nextRenderTime The estimated time of the next render (in milliseconds).
237 * @return true, if properties were updated.
239 bool UpdateProperties( unsigned int lastRenderTime, unsigned int nextRenderTime );
242 * Retrieves a reference to the panning flag property.
243 * @return The panning flag property.
245 const GesturePropertyBool& GetPanningProperty() const;
248 * Retrieves a reference to the screen position property.
249 * @return The screen position property.
251 const GesturePropertyVector2& GetScreenPositionProperty() const;
254 * Retrieves a reference to the screen velocity property.
255 * @return The screen velocity property.
257 const GesturePropertyVector2& GetScreenVelocityProperty() const;
260 * Retrieves a reference to the screen displacement property.
261 * @return The screen displacement property.
263 const GesturePropertyVector2& GetScreenDisplacementProperty() const;
266 * Retrieves a reference to the local position property.
267 * @return The local position property.
269 const GesturePropertyVector2& GetLocalPositionProperty() const;
272 * Retrieves a reference to the local displacement property.
273 * @return The local displacement property.
275 const GesturePropertyVector2& GetLocalDisplacementProperty() const;
278 * Retrieves a reference to the local velocity property.
279 * @return The local velocity property.
281 const GesturePropertyVector2& GetLocalVelocityProperty() const;
284 * @brief Sets the prediction mode of the pan gesture
286 * @param[in] mode The prediction mode
288 void SetPredictionMode(PredictionMode mode);
291 * @brief Sets the prediction amount of the pan gesture
293 * @param[in] amount The prediction amount in milliseconds
295 void SetPredictionAmount(unsigned int amount);
298 * @brief Sets the upper bound of the prediction amount for clamping
300 * @param[in] amount The prediction amount in milliseconds
302 void SetMaximumPredictionAmount(unsigned int amount);
305 * @brief Sets the lower bound of the prediction amount for clamping
307 * @param[in] amount The prediction amount in milliseconds
309 void SetMinimumPredictionAmount(unsigned int amount);
312 * @brief Sets the amount of prediction interpolation to adjust when the pan velocity is changed
314 * @param[in] amount The prediction amount in milliseconds
316 void SetPredictionAmountAdjustment(unsigned int amount);
319 * @brief Sets the prediction mode of the pan gesture
321 * @param[in] mode The prediction mode
323 void SetSmoothingMode(SmoothingMode mode);
326 * @brief Sets the amount of smoothing to apply for the current smoothing mode
328 * @param[in] amount The amount of smoothing [0.0f,1.0f]
330 void SetSmoothingAmount(float amount);
333 * Called to provide pan-gesture profiling information.
335 void EnableProfiling();
338 * Reset default properties, custom ones not supported due to this being the only object in scene side
339 * @param updateBufferIndex index to use
341 void ResetDefaultProperties( BufferIndex updateBufferIndex );
346 * Protected constructor.
351 PanGesture(const PanGesture&);
354 PanGesture& operator=(const PanGesture&);
356 // Defines information to be gathered by the gesture reading code.
357 struct FrameGestureInfo
359 PanGesture::PanInfo frameGesture;
361 unsigned int eventsThisFrame;
366 : acceleration( 0.0f ),
367 eventsThisFrame( 0 ),
368 justStarted( false ),
369 justFinished( false )
375 * Reads gestures from input, builds history.
376 * @param[out] info Written to with information about gestures read this frame.
377 * @param[in] currentTimestamp The time of this frame.
379 bool ReadGestures( FrameGestureInfo& info, unsigned int currentTimestamp );
382 * Reads gestures from input and resamples data, builds history.
383 * @param[out] info Written to with information about gestures read this frame.
384 * @param[in] currentTimestamp The time of this frame.
386 bool ReadAndResampleGestures( FrameGestureInfo& info, unsigned int currentTimestamp );
391 GesturePropertyBool mPanning; ///< panning flag
392 GesturePropertyVector2 mScreenPosition; ///< screenPosition
393 GesturePropertyVector2 mScreenDisplacement; ///< screenDisplacement
394 GesturePropertyVector2 mScreenVelocity; ///< screenVelocity
395 GesturePropertyVector2 mLocalPosition; ///< localPosition
396 GesturePropertyVector2 mLocalDisplacement; ///< localDisplacement
397 GesturePropertyVector2 mLocalVelocity; ///< localVelocity
399 PanInfoHistory mPanHistory;
400 PanInfoHistory mPredictionHistory;
401 PanInfo mGestures[PAN_GESTURE_HISTORY]; ///< Circular buffer storing the 4 most recent gestures.
402 PanInfo mLastGesture; ///< The last gesture. (last update frame).
403 PanInfo mTargetGesture; ///< The most recent input gesture, if the current used gesture does not match.
404 PanInfo mLastUnmodifiedGesture; ///< The last gesture before any processing was done on it.
405 unsigned int mWritePosition; ///< The next PanInfo buffer to write to. (starts at 0).
406 unsigned int mReadPosition; ///< The next PanInfo buffer to read. (starts at 0).
407 bool mNotAtTarget; ///< Keeps track of if the last gesture used was the most recent received.
408 bool mInGesture; ///< True if the gesture is currently being handled i.e. between Started <-> Finished/Cancelled.
410 PredictionMode mPredictionMode; ///< The pan gesture prediction mode
411 unsigned int mPredictionAmount; ///< how far into future to predict in milliseconds
412 unsigned int mCurrentPredictionAmount; ///< the current prediction amount used by the prediction algorithm
413 unsigned int mMaxPredictionAmount; ///< the maximum prediction amount used by the prediction algorithm
414 unsigned int mMinPredictionAmount; ///< the minimum prediction amount used by the prediction algorithm
415 unsigned int mPredictionAmountAdjustment; ///< the prediction amount to adjust in milliseconds when pan velocity changes
416 SmoothingMode mSmoothingMode; ///< The pan gesture prediction mode
417 float mSmoothingAmount; ///< How much smoothing to apply [0.0f,1.0f]
418 PanGestureProfiling* mProfiling; ///< NULL unless pan-gesture profiling information is required.
421 } // namespace SceneGraph
423 } // namespace Internal
427 #endif // __DALI_INTERNAL_SCENE_GRAPH_PAN_GESTURE_H__