You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
75 lines
1.9 KiB
75 lines
1.9 KiB
// License: Apache 2.0. See LICENSE file in root directory.
|
|
// Copyright(c) 2021 Intel Corporation. All Rights Reserved.
|
|
|
|
#pragma once
|
|
|
|
#include <chrono>
|
|
|
|
|
|
namespace rs2 {
|
|
|
|
|
|
|
|
inline float clamp( float x, float min, float max )
|
|
{
|
|
return std::max( std::min( max, x ), min );
|
|
}
|
|
|
|
inline float smoothstep( float x, float min, float max )
|
|
{
|
|
if( max == min )
|
|
{
|
|
x = clamp( ( x - min ), 0.0, 1.0 );
|
|
}
|
|
else
|
|
{
|
|
x = clamp( ( x - min ) / ( max - min ), 0.0, 1.0 );
|
|
}
|
|
|
|
return x * x * ( 3 - 2 * x );
|
|
}
|
|
|
|
|
|
// Helper class that lets smoothly animate between its values
|
|
template < class T > class animated
|
|
{
|
|
private:
|
|
T _old, _new;
|
|
std::chrono::system_clock::time_point _last_update;
|
|
std::chrono::system_clock::duration _duration;
|
|
|
|
public:
|
|
animated( T def, std::chrono::system_clock::duration duration = std::chrono::milliseconds( 200 ) )
|
|
: _duration( duration )
|
|
, _old( def )
|
|
, _new( def )
|
|
{
|
|
static_assert( ( std::is_arithmetic< T >::value ), "animated class supports arithmetic built-in types only" );
|
|
_last_update = std::chrono::system_clock::now();
|
|
}
|
|
animated & operator=( const T & other )
|
|
{
|
|
if( other != _new )
|
|
{
|
|
_old = get();
|
|
_new = other;
|
|
_last_update = std::chrono::system_clock::now();
|
|
}
|
|
return *this;
|
|
}
|
|
T get() const
|
|
{
|
|
auto now = std::chrono::system_clock::now();
|
|
auto ms = std::chrono::duration_cast< std::chrono::microseconds >( now - _last_update ).count();
|
|
auto duration_ms = std::chrono::duration_cast< std::chrono::microseconds >( _duration ).count();
|
|
auto t = (float)ms / duration_ms;
|
|
t = clamp( smoothstep( t, 0.f, 1.f ), 0.f, 1.f );
|
|
return static_cast< T >( _old * ( 1.f - t ) + _new * t );
|
|
}
|
|
operator T() const { return get(); }
|
|
T value() const { return _new; }
|
|
};
|
|
|
|
|
|
} // namespace rs2
|