demotool/syncoverrides.hh
Emmanuel BENOîT 0e8c95f27e Overrides - Fixed segfault in initialisation
Override definitions were being moved, so there was no pointer left to
access the override on the next initialisation.
2017-11-20 16:16:53 +01:00

382 lines
8.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 )
{}
void copyTo( A_Float& other ) const noexcept
{
other.min_ = min_;
other.max_ = max_;
other.step_ = step_;
other.decimals_ = decimals_;
other.power_ = power_;
other.slider_ = slider_;
other.location( ) = location( );
}
public:
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;
P_SyncOverride clone( ) const noexcept override;
};
// 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;
P_SyncOverride clone( ) const noexcept override;
};
// 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;
P_SyncOverride clone( ) const noexcept override;
};
// 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;
P_SyncOverride clone( ) const noexcept override;
};
/*= 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 )
{}
void copyTo( A_Integer& other ) const noexcept
{
other.min_ = min_;
other.max_ = max_;
other.step_ = step_;
other.slider_ = slider_;
other.location( ) = location( );
}
public:
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;
P_SyncOverride clone( ) const noexcept override;
};
// 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;
P_SyncOverride clone( ) const noexcept override;
};
// 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;
P_SyncOverride clone( ) const noexcept override;
};
// 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;
P_SyncOverride clone( ) const noexcept override;
};
/*= 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; }
P_SyncOverride clone( ) const noexcept override;
};
/*= CAMERA CONTROLS ============================================================*/
class T_CamOverride : public A_SyncOverride , public virtual A_MouseCtrl
{
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;
P_SyncOverride clone( ) const noexcept override;
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_; }
void handleDragAndDrop(
ImVec2 const& move ,
T_KeyboardModifiers modifiers ,
T_MouseButtons buttons ) noexcept override;
void handleWheel(
float wheel ,
T_KeyboardModifiers modifiers ,
T_MouseButtons buttons ) noexcept override;
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