#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 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; 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