demotool/syncoverrides.cc
2017-11-16 23:15:44 +01:00

191 lines
4 KiB
C++

#include "externals.hh"
#include "globals.hh"
#include "syncoverrides.hh"
using namespace sov;
#define M_SETOPT_( FIELD , VAR ) \
if ( FIELD ) { return false; } \
FIELD = (VAR); \
return true
/*= A_Float ====================================================================*/
bool A_Float::setMin(
const float v ) noexcept
{
M_SETOPT_( min_ , v );
}
bool A_Float::setMax(
const float v ) noexcept
{
M_SETOPT_( max_ , v );
}
bool A_Float::setStep(
const float v ) noexcept
{
assert( v > 0 );
M_SETOPT_( step_ , v );
}
bool A_Float::setDecimals(
const uint32_t n ) noexcept
{
assert( n <= 100 );
if ( decimals_ ) {
return false;
}
T_StringBuilder sb;
sb << "%." << n << 'f' << '\0';
assert( sb.size( ) < 12 );
decimals_.setNew( );
for ( auto i = 0u ; i < sb.size( ) ; i ++ ) {
decimals_->add( sb.data( )[ i ] );
}
return true;
}
bool A_Float::setPower(
const float v ) noexcept
{
assert( v > 0 );
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
{
using namespace ImGui;
float v[ 1 ] = {
Globals::Sync( ).inputs( )[ inputPos_[ 0 ] ]
};
const bool changed( slider( )
? 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 ];
}
}
}