Overrides - Implementation for floats
Also fixed some UI stuff.
This commit is contained in:
parent
422ab564f3
commit
4ac51553bc
5 changed files with 234 additions and 33 deletions
10
demo.cc
10
demo.cc
|
@ -103,12 +103,22 @@ bool T_Demo::runInit(
|
||||||
ov->setMin( 0 );
|
ov->setMin( 0 );
|
||||||
ov->setMax( 1000 );
|
ov->setMax( 1000 );
|
||||||
ov->setStep( .1 );
|
ov->setStep( .1 );
|
||||||
|
// ov->setSlider( true );
|
||||||
ov->setup( );
|
ov->setup( );
|
||||||
|
|
||||||
T_SyncOverrideSection sos( "" );
|
T_SyncOverrideSection sos( "" );
|
||||||
sos.subsections.add( NewOwned< T_SyncOverrideSection >( "Testing" ) );
|
sos.subsections.add( NewOwned< T_SyncOverrideSection >( "Testing" ) );
|
||||||
sos.subsections[ 0 ]->subsections.add( NewOwned< T_SyncOverrideSection >( "Yeah really" ) );
|
sos.subsections[ 0 ]->subsections.add( NewOwned< T_SyncOverrideSection >( "Yeah really" ) );
|
||||||
sos.subsections[ 0 ]->subsections[ 0 ]->overrides.add( std::move( ov ) );
|
sos.subsections[ 0 ]->subsections[ 0 ]->overrides.add( std::move( ov ) );
|
||||||
|
|
||||||
|
auto ov2{ NewOwned< sov::T_Float4 >(
|
||||||
|
"bloom-bw0" , "bloom-bw1" , "bloom-bw2" , "bloom-bw3" ,
|
||||||
|
"Blur weights" ) };
|
||||||
|
ov2->setMax( 1 );
|
||||||
|
ov2->setSlider( );
|
||||||
|
ov2->setup( );
|
||||||
|
sos.subsections[ 0 ]->overrides.add( std::move( ov2 ) );
|
||||||
|
|
||||||
Globals::Sync( ).mergeOverrides( sos );
|
Globals::Sync( ).mergeOverrides( sos );
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|
33
sync.cc
33
sync.cc
|
@ -361,9 +361,9 @@ uint32_t T_SyncValues::indexOf(
|
||||||
/*= A_SyncOverride ===========================================================*/
|
/*= A_SyncOverride ===========================================================*/
|
||||||
|
|
||||||
A_SyncOverride::A_SyncOverride(
|
A_SyncOverride::A_SyncOverride(
|
||||||
T_String type ,
|
char const* const type ,
|
||||||
T_String const& title ) noexcept
|
T_String const& title ) noexcept
|
||||||
: type_( std::move( type ) ) , title_( title.size( ) + 1 )
|
: type_( T_String::Pooled( type ) ) , title_( title.size( ) + 1 )
|
||||||
{
|
{
|
||||||
char const* src( title.data( ) );
|
char const* src( title.data( ) );
|
||||||
for ( auto i = 0u ; i < title_.size( ) - 1 ; i ++ ) {
|
for ( auto i = 0u ; i < title_.size( ) - 1 ; i ++ ) {
|
||||||
|
@ -394,15 +394,18 @@ void A_SyncOverride::makeUI( ) noexcept
|
||||||
{
|
{
|
||||||
using namespace ImGui;
|
using namespace ImGui;
|
||||||
|
|
||||||
Text( "%s" , &title_[ 0 ] );
|
if ( Checkbox( &title_[ 0 ] , &enabled_ ) ) {
|
||||||
if ( Checkbox( "Enable override" , &enabled_ ) ) {
|
Globals::Sync( ).setOverridesActive( enabled_ , inputPos_.size( ) , &inputPos_[ 0 ] );
|
||||||
// FIXME: set/clear inputs override flag
|
|
||||||
}
|
}
|
||||||
if ( !enabled_ ) {
|
if ( !enabled_ ) {
|
||||||
PushItemFlag( ImGuiItemFlags_Disabled , true );
|
PushItemFlag( ImGuiItemFlags_Disabled , true );
|
||||||
PushStyleVar( ImGuiStyleVar_Alpha , GetStyle( ).Alpha * 0.5f );
|
PushStyleVar( ImGuiStyleVar_Alpha , GetStyle( ).Alpha * 0.5f );
|
||||||
}
|
}
|
||||||
|
Indent( );
|
||||||
|
PushItemWidth( -1 );
|
||||||
makeEditWidgets( );
|
makeEditWidgets( );
|
||||||
|
PopItemWidth( );
|
||||||
|
Unindent( );
|
||||||
if ( !enabled_ ) {
|
if ( !enabled_ ) {
|
||||||
PopItemFlag( );
|
PopItemFlag( );
|
||||||
PopStyleVar( );
|
PopStyleVar( );
|
||||||
|
@ -654,6 +657,26 @@ void T_SyncManager::makeOverridesWindow( )
|
||||||
ImGui::End( );
|
ImGui::End( );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void T_SyncManager::setOverridesActive(
|
||||||
|
const bool active ,
|
||||||
|
const uint32_t n ,
|
||||||
|
uint32_t const* const pos )
|
||||||
|
{
|
||||||
|
for ( auto i = 0u ; i < n ; i ++ ) {
|
||||||
|
assert( values_.overriden[ pos[ i ] ] != active );
|
||||||
|
values_.overriden[ pos[ i ] ] = active;
|
||||||
|
}
|
||||||
|
if ( !active ) {
|
||||||
|
for ( auto i = 0u ; i < n ; i ++ ) {
|
||||||
|
const auto p{ pos[ i ] };
|
||||||
|
auto const& cc( curveCaches_[ p ] );
|
||||||
|
if ( cc ) {
|
||||||
|
values_.values[ p ] = cc->value( time_ , curves_ );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
void T_SyncManager::makeUI( )
|
void T_SyncManager::makeUI( )
|
||||||
{
|
{
|
||||||
|
|
9
sync.hh
9
sync.hh
|
@ -178,7 +178,7 @@ class A_SyncOverride
|
||||||
ebcl::UseTag< ebcl::ArrayBacked< 8 > >( ) };
|
ebcl::UseTag< ebcl::ArrayBacked< 8 > >( ) };
|
||||||
T_AutoArray< uint32_t , 8 > inputPos_;
|
T_AutoArray< uint32_t , 8 > inputPos_;
|
||||||
|
|
||||||
A_SyncOverride( T_String type ,
|
A_SyncOverride( char const* type ,
|
||||||
T_String const& title ) noexcept;
|
T_String const& title ) noexcept;
|
||||||
|
|
||||||
// Draw the UI for that specific override.
|
// Draw the UI for that specific override.
|
||||||
|
@ -268,6 +268,8 @@ struct T_SyncManager
|
||||||
{ return values_.indexOf( name ); }
|
{ return values_.indexOf( name ); }
|
||||||
T_Array< float > const& inputs( ) const noexcept
|
T_Array< float > const& inputs( ) const noexcept
|
||||||
{ return values_.values; }
|
{ return values_.values; }
|
||||||
|
T_Array< float >& inputs( ) noexcept
|
||||||
|
{ return values_.values; }
|
||||||
|
|
||||||
// ---------------------------------------------------------------------
|
// ---------------------------------------------------------------------
|
||||||
// Curves
|
// Curves
|
||||||
|
@ -288,6 +290,11 @@ struct T_SyncManager
|
||||||
void mergeOverrides( T_SyncOverrideSection& overrides );
|
void mergeOverrides( T_SyncOverrideSection& overrides );
|
||||||
void makeOverridesWindow( );
|
void makeOverridesWindow( );
|
||||||
|
|
||||||
|
// Mark a bunch of inputs as overridden / not overridden
|
||||||
|
void setOverridesActive( bool active ,
|
||||||
|
uint32_t n ,
|
||||||
|
uint32_t const* pos );
|
||||||
|
|
||||||
// ---------------------------------------------------------------------
|
// ---------------------------------------------------------------------
|
||||||
// Update
|
// Update
|
||||||
|
|
||||||
|
|
151
syncoverrides.cc
151
syncoverrides.cc
|
@ -10,39 +10,28 @@ using namespace sov;
|
||||||
return true
|
return true
|
||||||
|
|
||||||
|
|
||||||
/*= T_Float ====================================================================*/
|
/*= A_Float ====================================================================*/
|
||||||
|
|
||||||
T_Float::T_Float(
|
bool A_Float::setMin(
|
||||||
T_String const& input ,
|
|
||||||
T_String const& title ) noexcept
|
|
||||||
: A_SyncOverride( T_String::Pooled( "float" ) , title ) ,
|
|
||||||
title_( title )
|
|
||||||
{
|
|
||||||
inputs_.add( input );
|
|
||||||
}
|
|
||||||
|
|
||||||
/*------------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
bool T_Float::setMin(
|
|
||||||
const float v ) noexcept
|
const float v ) noexcept
|
||||||
{
|
{
|
||||||
M_SETOPT_( min_ , v );
|
M_SETOPT_( min_ , v );
|
||||||
}
|
}
|
||||||
|
|
||||||
bool T_Float::setMax(
|
bool A_Float::setMax(
|
||||||
const float v ) noexcept
|
const float v ) noexcept
|
||||||
{
|
{
|
||||||
M_SETOPT_( max_ , v );
|
M_SETOPT_( max_ , v );
|
||||||
}
|
}
|
||||||
|
|
||||||
bool T_Float::setStep(
|
bool A_Float::setStep(
|
||||||
const float v ) noexcept
|
const float v ) noexcept
|
||||||
{
|
{
|
||||||
assert( v > 0 );
|
assert( v > 0 );
|
||||||
M_SETOPT_( step_ , v );
|
M_SETOPT_( step_ , v );
|
||||||
}
|
}
|
||||||
|
|
||||||
bool T_Float::setDecimals(
|
bool A_Float::setDecimals(
|
||||||
const uint32_t n ) noexcept
|
const uint32_t n ) noexcept
|
||||||
{
|
{
|
||||||
assert( n <= 100 );
|
assert( n <= 100 );
|
||||||
|
@ -61,22 +50,142 @@ bool T_Float::setDecimals(
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool T_Float::setPower(
|
bool A_Float::setPower(
|
||||||
const float v ) noexcept
|
const float v ) noexcept
|
||||||
{
|
{
|
||||||
assert( v > 0 );
|
assert( v > 0 );
|
||||||
M_SETOPT_( power_ , v );
|
M_SETOPT_( power_ , v );
|
||||||
}
|
}
|
||||||
|
|
||||||
/*------------------------------------------------------------------------------*/
|
void A_Float::setSlider( ) noexcept
|
||||||
|
{
|
||||||
|
slider_ = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*= T_Float ====================================================================*/
|
||||||
|
|
||||||
|
T_Float::T_Float(
|
||||||
|
T_String const& input ,
|
||||||
|
T_String const& title ) noexcept
|
||||||
|
: A_Float( "float" , title )
|
||||||
|
{
|
||||||
|
inputs_.add( input );
|
||||||
|
}
|
||||||
|
|
||||||
void T_Float::makeEditWidgets( ) noexcept
|
void T_Float::makeEditWidgets( ) noexcept
|
||||||
{
|
{
|
||||||
|
using namespace ImGui;
|
||||||
float v[ 1 ] = {
|
float v[ 1 ] = {
|
||||||
Globals::Sync( ).inputs( )[ inputPos_[ 0 ] ]
|
Globals::Sync( ).inputs( )[ inputPos_[ 0 ] ]
|
||||||
};
|
};
|
||||||
if ( ImGui::DragFloat( "" , v , step( ) ,
|
|
||||||
min( ) , max( ) , decimals( ) , power( ) ) ) {
|
const bool changed( slider( )
|
||||||
// FIXME Globals::Sync( ).inputs( )[ inputPos_[ 0 ] ] = v[ 0 ];
|
? SliderFloat( "" , v , min( ) , max( ) , decimals( ) , power( ) )
|
||||||
|
: DragFloat( "" , v , step( ) , min( ) , max( ) , decimals( ) , power( ) ) );
|
||||||
|
if ( changed ) {
|
||||||
|
Globals::Sync( ).inputs( )[ inputPos_[ 0 ] ] = v[ 0 ];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*= T_Float2 ===================================================================*/
|
||||||
|
|
||||||
|
T_Float2::T_Float2(
|
||||||
|
T_String const& input0 ,
|
||||||
|
T_String const& input1 ,
|
||||||
|
T_String const& title ) noexcept
|
||||||
|
: A_Float( "float" , title )
|
||||||
|
{
|
||||||
|
inputs_.add( input0 );
|
||||||
|
inputs_.add( input1 );
|
||||||
|
}
|
||||||
|
|
||||||
|
void T_Float2::makeEditWidgets( ) noexcept
|
||||||
|
{
|
||||||
|
using namespace ImGui;
|
||||||
|
auto& sinp( Globals::Sync( ).inputs( ) );
|
||||||
|
float v[ 2 ];
|
||||||
|
for ( auto i = 0 ; i < 2 ; i ++ ) {
|
||||||
|
v[ i ] = sinp[ inputPos_[ i ] ];
|
||||||
|
}
|
||||||
|
|
||||||
|
const bool changed( slider( )
|
||||||
|
? SliderFloat2( "" , v , min( ) , max( ) , decimals( ) , power( ) )
|
||||||
|
: DragFloat2( "" , v , step( ) , min( ) , max( ) , decimals( ) , power( ) ) );
|
||||||
|
if ( changed ) {
|
||||||
|
for ( auto i = 0 ; i < 2 ; i ++ ) {
|
||||||
|
sinp[ inputPos_[ i ] ] = v[ i ];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*= T_Float3 ===================================================================*/
|
||||||
|
|
||||||
|
T_Float3::T_Float3(
|
||||||
|
T_String const& input0 ,
|
||||||
|
T_String const& input1 ,
|
||||||
|
T_String const& input2 ,
|
||||||
|
T_String const& title ) noexcept
|
||||||
|
: A_Float( "float" , title )
|
||||||
|
{
|
||||||
|
inputs_.add( input0 );
|
||||||
|
inputs_.add( input1 );
|
||||||
|
inputs_.add( input2 );
|
||||||
|
}
|
||||||
|
|
||||||
|
void T_Float3::makeEditWidgets( ) noexcept
|
||||||
|
{
|
||||||
|
using namespace ImGui;
|
||||||
|
auto& sinp( Globals::Sync( ).inputs( ) );
|
||||||
|
float v[ 3 ];
|
||||||
|
for ( auto i = 0 ; i < 3 ; i ++ ) {
|
||||||
|
v[ i ] = sinp[ inputPos_[ i ] ];
|
||||||
|
}
|
||||||
|
|
||||||
|
const bool changed( slider( )
|
||||||
|
? SliderFloat3( "" , v , min( ) , max( ) , decimals( ) , power( ) )
|
||||||
|
: DragFloat3( "" , v , step( ) , min( ) , max( ) , decimals( ) , power( ) ) );
|
||||||
|
if ( changed ) {
|
||||||
|
for ( auto i = 0 ; i < 3 ; i ++ ) {
|
||||||
|
sinp[ inputPos_[ i ] ] = v[ i ];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*= T_Float4 ===================================================================*/
|
||||||
|
|
||||||
|
T_Float4::T_Float4(
|
||||||
|
T_String const& input0 ,
|
||||||
|
T_String const& input1 ,
|
||||||
|
T_String const& input2 ,
|
||||||
|
T_String const& input3 ,
|
||||||
|
T_String const& title ) noexcept
|
||||||
|
: A_Float( "float" , title )
|
||||||
|
{
|
||||||
|
inputs_.add( input0 );
|
||||||
|
inputs_.add( input1 );
|
||||||
|
inputs_.add( input2 );
|
||||||
|
inputs_.add( input3 );
|
||||||
|
}
|
||||||
|
|
||||||
|
void T_Float4::makeEditWidgets( ) noexcept
|
||||||
|
{
|
||||||
|
using namespace ImGui;
|
||||||
|
auto& sinp( Globals::Sync( ).inputs( ) );
|
||||||
|
float v[ 4 ];
|
||||||
|
for ( auto i = 0 ; i < 4 ; i ++ ) {
|
||||||
|
v[ i ] = sinp[ inputPos_[ i ] ];
|
||||||
|
}
|
||||||
|
|
||||||
|
const bool changed( slider( )
|
||||||
|
? SliderFloat4( "" , v , min( ) , max( ) , decimals( ) , power( ) )
|
||||||
|
: DragFloat4( "" , v , step( ) , min( ) , max( ) , decimals( ) , power( ) ) );
|
||||||
|
if ( changed ) {
|
||||||
|
for ( auto i = 0 ; i < 4 ; i ++ ) {
|
||||||
|
sinp[ inputPos_[ i ] ] = v[ i ];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,24 +3,27 @@
|
||||||
|
|
||||||
namespace sov {
|
namespace sov {
|
||||||
|
|
||||||
/*= FLOATING POINT SLIDERS =====================================================*/
|
/*= FLOATING POINT DRAGGERS/SLIDERS ============================================*/
|
||||||
|
|
||||||
// Single float value
|
// Float values, common
|
||||||
class T_Float : public A_SyncOverride
|
class A_Float : public A_SyncOverride
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
T_String title_;
|
|
||||||
T_Optional< float > min_;
|
T_Optional< float > min_;
|
||||||
T_Optional< float > max_;
|
T_Optional< float > max_;
|
||||||
T_Optional< float > step_;
|
T_Optional< float > step_;
|
||||||
T_Optional< ebcl::T_StaticArray< char , 12 > > decimals_;
|
T_Optional< ebcl::T_StaticArray< char , 12 > > decimals_;
|
||||||
T_Optional< float > power_;
|
T_Optional< float > power_;
|
||||||
|
bool slider_;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void makeEditWidgets( ) noexcept override;
|
A_Float( char const* const type ,
|
||||||
|
T_String const& title ) noexcept
|
||||||
|
: A_SyncOverride( type , title )
|
||||||
|
{}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
T_Float( T_String const& input ,
|
A_Float( T_String const& input ,
|
||||||
T_String const& title ) noexcept;
|
T_String const& title ) noexcept;
|
||||||
|
|
||||||
bool setMin( const float v ) noexcept;
|
bool setMin( const float v ) noexcept;
|
||||||
|
@ -28,13 +31,62 @@ class T_Float : public A_SyncOverride
|
||||||
bool setStep( const float v ) noexcept;
|
bool setStep( const float v ) noexcept;
|
||||||
bool setDecimals( const uint32_t n ) noexcept;
|
bool setDecimals( const uint32_t n ) noexcept;
|
||||||
bool setPower( const float v ) noexcept;
|
bool setPower( const float v ) noexcept;
|
||||||
|
void setSlider( ) noexcept;
|
||||||
|
|
||||||
float min( ) const noexcept { return min_ ? *min_ : 0.0f; }
|
float min( ) const noexcept { return min_ ? *min_ : 0.0f; }
|
||||||
float max( ) const noexcept { return max_ ? *max_ : 0.0f; }
|
float max( ) const noexcept { return max_ ? *max_ : 0.0f; }
|
||||||
float step( ) const noexcept { return step_ ? *step_ : .001f; }
|
float step( ) const noexcept { return step_ ? *step_ : .001f; }
|
||||||
char const* decimals( ) const noexcept { return decimals_ ? &(*decimals_)[ 0 ] : "%.3f"; }
|
char const* decimals( ) const noexcept { return decimals_ ? &(*decimals_)[ 0 ] : "%.3f"; }
|
||||||
float power( ) const noexcept { return power_ ? *power_ : 1.0f; }
|
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( ) 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( ) 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( ) 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( ) 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;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
Loading…
Reference in a new issue