77 lines
1.6 KiB
C++
77 lines
1.6 KiB
C++
#pragma once
|
|
#ifndef REAL_BUILD
|
|
# include "externals.hh"
|
|
#endif
|
|
|
|
|
|
enum class E_SyncSegment
|
|
{
|
|
LINEAR ,
|
|
RAMP ,
|
|
SMOOTH ,
|
|
//HERMITE
|
|
};
|
|
|
|
struct T_SyncSegment
|
|
{
|
|
uint32_t nPoints;
|
|
E_SyncSegment type;
|
|
std::vector< float > values; // nPoints items
|
|
std::vector< uint32_t > durations; // nPoints - 1 items
|
|
};
|
|
|
|
using T_SyncVariable = std::vector< T_SyncSegment >;
|
|
|
|
|
|
struct T_SyncData
|
|
{
|
|
T_SyncData( );
|
|
T_SyncData(
|
|
__rd__ const uint32_t duration ,
|
|
__rd__ const float units ) noexcept;
|
|
|
|
float duration( ) const noexcept
|
|
{ return duration_ * units_; }
|
|
|
|
void setSyncVariable(
|
|
__rd__ std::string const& name ,
|
|
__rw__ T_SyncVariable&& variable ) noexcept;
|
|
|
|
T_SyncVariable const& variable(
|
|
__rd__ std::string const& name ) const noexcept;
|
|
uint32_t offsetOf(
|
|
__rd__ std::string const& name ) const noexcept;
|
|
|
|
float valueOf(
|
|
__rd__ std::string const& variable ,
|
|
__rd__ const float time ) const noexcept;
|
|
|
|
void computeValues(
|
|
__rd__ const float time ,
|
|
__wr__ std::vector< float >& values ) const noexcept;
|
|
|
|
private:
|
|
static const T_SyncVariable MissingVariable_;
|
|
|
|
// Caching structure used to access segments
|
|
using T_SegRef_ = std::pair< uint32_t , uint32_t >;
|
|
struct T_VarHelper_
|
|
{
|
|
T_SyncVariable variable;
|
|
std::vector< T_SegRef_ > segRefs;
|
|
std::vector< float > segStarts;
|
|
uint32_t position;
|
|
|
|
T_VarHelper_(
|
|
__rw__ T_SyncVariable&& variable ,
|
|
__rd__ const uint32_t duration ,
|
|
__rd__ const uint32_t position ) noexcept;
|
|
float valueAt(
|
|
__rd__ const float position ,
|
|
__rd__ const float units ) const noexcept;
|
|
};
|
|
|
|
uint32_t duration_;
|
|
float units_;
|
|
std::unordered_map< std::string , T_VarHelper_ > variables_;
|
|
};
|