demotool/syncoverrides.hh
Emmanuel BENOîT 2b1657ac3a Overrides - Camera angles problem fixed
Because of fucking numerical instability, updating the UI's input values
every frame caused problems. Fixed this by making sure it's set only if
the override is disabled or at the first frame after it is enabled.
2017-11-20 11:36:30 +01:00

339 lines
7.8 KiB
C++

#pragma once
#include "sync.hh"
#include "camera.hh"
namespace sov {
/*= FLOATING POINT DRAGGERS/SLIDERS ============================================*/
// Float values, common
class A_Float : public A_SyncOverride
{
private:
T_Optional< float > min_;
T_Optional< float > max_;
T_Optional< float > step_;
T_Optional< ebcl::T_StaticArray< char , 12 > > decimals_;
T_Optional< float > power_;
bool slider_{ false };
protected:
A_Float( char const* const type ,
T_String const& title ) noexcept
: A_SyncOverride( type , title )
{}
public:
A_Float( T_String const& input ,
T_String const& title ) noexcept;
bool setMin( const float v ) noexcept;
bool setMax( const float v ) noexcept;
bool setStep( const float v ) noexcept;
bool setDecimals( const uint32_t n ) noexcept;
bool setPower( const float v ) noexcept;
void setSlider( ) noexcept;
float min( ) const noexcept { return min_ ? *min_ : 0.0f; }
float max( ) const noexcept { return max_ ? *max_ : 0.0f; }
float step( ) const noexcept { return step_ ? *step_ : .001f; }
char const* decimals( ) const noexcept { return decimals_ ? &(*decimals_)[ 0 ] : "%.3f"; }
float power( ) const noexcept { return power_ ? *power_ : 1.0f; }
bool slider( ) const noexcept { return slider_; }
};
// Single float values
class T_Float : public A_Float
{
protected:
void makeEditWidgets(
uint32_t& counter ,
T_StringBuilder& sb ) noexcept override;
public:
T_Float( T_String const& input ,
T_String const& title ) noexcept;
};
// 2 float values
class T_Float2 : public A_Float
{
protected:
void makeEditWidgets(
uint32_t& counter ,
T_StringBuilder& sb ) noexcept override;
public:
T_Float2( T_String const& input0 ,
T_String const& input1 ,
T_String const& title ) noexcept;
};
// 3 float values
class T_Float3 : public A_Float
{
protected:
void makeEditWidgets(
uint32_t& counter ,
T_StringBuilder& sb ) noexcept override;
public:
T_Float3( T_String const& input0 ,
T_String const& input1 ,
T_String const& input2 ,
T_String const& title ) noexcept;
};
// 4 float values
class T_Float4 : public A_Float
{
protected:
void makeEditWidgets(
uint32_t& counter ,
T_StringBuilder& sb ) noexcept override;
public:
T_Float4( T_String const& input0 ,
T_String const& input1 ,
T_String const& input2 ,
T_String const& input3 ,
T_String const& title ) noexcept;
};
/*= INTEGER DRAGGERS/SLIDES ====================================================*/
// Integers, common
class A_Integer : public A_SyncOverride
{
private:
T_Optional< int32_t > min_;
T_Optional< int32_t > max_;
T_Optional< float > step_;
bool slider_{ false };
protected:
A_Integer( char const* const type ,
T_String const& title ) noexcept
: A_SyncOverride( type , title )
{}
public:
A_Integer( T_String const& input ,
T_String const& title ) noexcept;
bool setMin( const int32_t v ) noexcept;
bool setMax( const int32_t v ) noexcept;
bool setStep( const float v ) noexcept;
bool setPower( const float v ) noexcept;
void setSlider( ) noexcept;
float min( ) const noexcept { return min_ ? *min_ : 0.0f; }
float max( ) const noexcept { return max_ ? *max_ : 0.0f; }
float step( ) const noexcept { return step_ ? *step_ : .001f; }
bool slider( ) const noexcept { return slider_; }
};
// Single integers
class T_Integer : public A_Integer
{
protected:
void makeEditWidgets(
uint32_t& counter ,
T_StringBuilder& sb ) noexcept override;
public:
T_Integer( T_String const& input ,
T_String const& title ) noexcept;
};
// 2 integers
class T_Integer2 : public A_Integer
{
protected:
void makeEditWidgets(
uint32_t& counter ,
T_StringBuilder& sb ) noexcept override;
public:
T_Integer2( T_String const& input0 ,
T_String const& input1 ,
T_String const& title ) noexcept;
};
// 3 integers
class T_Integer3 : public A_Integer
{
protected:
void makeEditWidgets(
uint32_t& counter ,
T_StringBuilder& sb ) noexcept override;
public:
T_Integer3( T_String const& input0 ,
T_String const& input1 ,
T_String const& input2 ,
T_String const& title ) noexcept;
};
// 4 integers
class T_Integer4 : public A_Integer
{
protected:
void makeEditWidgets(
uint32_t& counter ,
T_StringBuilder& sb ) noexcept override;
public:
T_Integer4( T_String const& input0 ,
T_String const& input1 ,
T_String const& input2 ,
T_String const& input3 ,
T_String const& title ) noexcept;
};
/*= COLOR GRADING CONTROLS =====================================================*/
class T_ColorGrading : public A_SyncOverride
{
private:
T_Optional< float > base_;
T_Optional< float > unit_;
protected:
void makeEditWidgets(
uint32_t& counter ,
T_StringBuilder& sb ) noexcept override;
public:
T_ColorGrading( T_String const& iRed ,
T_String const& iGreen ,
T_String const& iBlue ,
T_String const& title ) noexcept;
bool setBase( const float v ) noexcept;
bool setUnit( const float v ) noexcept;
float base( ) const noexcept { return base_ ? *base_ : 0.f; }
float unit( ) const noexcept { return unit_ ? *unit_ : 1.f; }
};
/*= CAMERA CONTROLS ============================================================*/
class T_CamOverride : public A_SyncOverride
{
public:
enum E_SetState {
S_OK , // Inputs were set
S_DEF , // Duplicate definition
S_INPUTS , // Duplicate inputs
};
private:
enum E_CamMode_ {
CM_INVALID ,
CM_ANGLES ,
CM_VECTORS
};
enum E_FovMode_ {
FM_INVALID ,
FM_FOV ,
FM_NEARPLANE ,
};
struct T_FovConfig_
{
E_FovMode_ mode;
uint32_t inputIndex;
T_FovConfig_( E_FovMode_ mode , uint32_t idx ) noexcept
: mode( mode ) , inputIndex( idx )
{ assert( mode != FM_INVALID ); }
};
struct T_VectorConfig_
{
uint32_t x , y , z;
T_VectorConfig_( uint32_t x , uint32_t y , uint32_t z ) noexcept
: x(x),y(y),z(z)
{}
};
T_Optional< T_FovConfig_ > fovConfig_;
T_Optional< T_VectorConfig_ > target_;
T_Optional< T_VectorConfig_ > upVector_;
T_Optional< T_VectorConfig_ > position_;
T_Optional< T_VectorConfig_ > angles_;
T_Optional< uint32_t > distance_;
E_CamMode_ camMode_;
T_Camera camera_;
bool prevEnabled_{ false };
public:
T_CamOverride( T_String const& title ) noexcept;
E_SetState setFieldOfView(
T_String const& input ) noexcept;
E_SetState setNearPlane(
T_String const& input ) noexcept;
E_SetState setTarget(
T_String const& inX ,
T_String const& inY ,
T_String const& inZ ) noexcept;
E_SetState setUpVector(
T_String const& inX ,
T_String const& inY ,
T_String const& inZ ) noexcept;
E_SetState setPositionVector(
T_String const& inX ,
T_String const& inY ,
T_String const& inZ ) noexcept;
E_SetState setAngles(
T_String const& in1 ,
T_String const& in2 ,
T_String const& in3 ) noexcept;
E_SetState setDistance(
T_String const& input ) noexcept;
bool isFovConfigured( ) const noexcept
{ return fovConfig_; }
bool isTargetConfigured( ) const noexcept
{ return target_; }
bool checkValidConfig( ) noexcept;
T_Camera& camData( ) noexcept
{ return camera_; }
T_Camera const& camData( ) const noexcept
{ return camera_; }
private:
E_SetState setVector(
T_Optional< T_VectorConfig_ >& vector ,
T_String const& inX ,
T_String const& inY ,
T_String const& inZ ) noexcept;
protected:
void makeEditWidgets(
uint32_t& counter ,
T_StringBuilder& sb ) noexcept override;
private:
glm::vec3 vectorFromInputs(
T_VectorConfig_ const& inputs ) noexcept;
void inputsFromVector(
T_VectorConfig_ const& inputs ,
glm::vec3 const& vector ) noexcept;
};
/*= PARSER CONFIGURATION =======================================================*/
// Get a parser configuration that will be able to parse UI override definitions.
ebcl::T_SRDParserConfig GetParserConfig( );
} // namespace