Overrides - Fixed segfault in initialisation

Override definitions were being moved, so there was no pointer left to
access the override on the next initialisation.
This commit is contained in:
Emmanuel BENOîT 2017-11-20 16:16:53 +01:00
parent afe7c43351
commit 0e8c95f27e
4 changed files with 132 additions and 7 deletions

View file

@ -440,7 +440,7 @@ void T_SyncOverrideSection::merge(
section( os->title ).merge( *os );
}
for ( auto& ov : other.overrides ) {
overrides.add( std::move( ov ) );
overrides.add( ov->clone( ) );
}
}

View file

@ -222,6 +222,9 @@ class A_SyncOverride
virtual void makeUI(
uint32_t& counter ,
T_StringBuilder& sb ) noexcept;
// Create a clone of the current override.
virtual T_OwnPtr< A_SyncOverride > clone( ) const noexcept = 0;
};
// Overrides section

View file

@ -659,6 +659,13 @@ void T_Float::makeEditWidgets(
}
}
P_SyncOverride T_Float::clone( ) const noexcept
{
auto c{ NewOwned< T_Float >( inputs_[ 0 ] , &title_[ 0 ] ) };
copyTo( *c );
return c;
}
/*= T_Float2 ===================================================================*/
@ -694,6 +701,13 @@ void T_Float2::makeEditWidgets(
}
}
P_SyncOverride T_Float2::clone( ) const noexcept
{
auto c{ NewOwned< T_Float2 >( inputs_[ 0 ] , inputs_[ 1 ] , &title_[ 0 ] ) };
copyTo( *c );
return c;
}
/*= T_Float3 ===================================================================*/
@ -731,6 +745,14 @@ void T_Float3::makeEditWidgets(
}
}
P_SyncOverride T_Float3::clone( ) const noexcept
{
auto c{ NewOwned< T_Float3 >( inputs_[ 0 ] , inputs_[ 1 ] ,
inputs_[ 2 ] , &title_[ 0 ] ) };
copyTo( *c );
return c;
}
/*= T_Float4 ===================================================================*/
@ -770,6 +792,14 @@ void T_Float4::makeEditWidgets(
}
}
P_SyncOverride T_Float4::clone( ) const noexcept
{
auto c{ NewOwned< T_Float4 >( inputs_[ 0 ] , inputs_[ 1 ] ,
inputs_[ 2 ] , inputs_[ 3 ] , &title_[ 0 ] ) };
copyTo( *c );
return c;
}
/*= A_Integer ==================================================================*/
@ -826,6 +856,13 @@ void T_Integer::makeEditWidgets(
}
}
P_SyncOverride T_Integer::clone( ) const noexcept
{
auto c{ NewOwned< T_Integer >( inputs_[ 0 ] , &title_[ 0 ] ) };
copyTo( *c );
return c;
}
/*= T_Integer2 =================================================================*/
@ -861,6 +898,13 @@ void T_Integer2::makeEditWidgets(
}
}
P_SyncOverride T_Integer2::clone( ) const noexcept
{
auto c{ NewOwned< T_Integer2 >( inputs_[ 0 ] , inputs_[ 1 ] , &title_[ 0 ] ) };
copyTo( *c );
return c;
}
/*= T_Integer3 =================================================================*/
@ -898,6 +942,14 @@ void T_Integer3::makeEditWidgets(
}
}
P_SyncOverride T_Integer3::clone( ) const noexcept
{
auto c{ NewOwned< T_Integer3 >( inputs_[ 0 ] , inputs_[ 1 ] ,
inputs_[ 2 ] , &title_[ 0 ] ) };
copyTo( *c );
return c;
}
/*= T_Integer4 =================================================================*/
@ -937,6 +989,14 @@ void T_Integer4::makeEditWidgets(
}
}
P_SyncOverride T_Integer4::clone( ) const noexcept
{
auto c{ NewOwned< T_Integer4 >( inputs_[ 0 ] , inputs_[ 1 ] ,
inputs_[ 2 ] , inputs_[ 3 ] , &title_[ 0 ] ) };
copyTo( *c );
return c;
}
/*= T_ColorGrading =============================================================*/
@ -989,6 +1049,16 @@ bool T_ColorGrading::setUnit(
M_SETOPT_( unit_ , v );
}
P_SyncOverride T_ColorGrading::clone( ) const noexcept
{
auto c{ NewOwned< T_ColorGrading >( inputs_[ 0 ] ,
inputs_[ 1 ] , inputs_[ 2 ] , &title_[ 0 ] ) };
c->location( ) = location( );
c->base_ = base_;
c->unit_ = unit_;
return c;
}
/*= T_CamOverride ==============================================================*/
@ -998,6 +1068,24 @@ T_CamOverride::T_CamOverride(
camMode_( CM_INVALID )
{}
P_SyncOverride T_CamOverride::clone( ) const noexcept
{
auto c{ NewOwned< T_CamOverride >( &title_[ 0 ] ) };
c->location( ) = location( );
const auto n{ inputs_.size( ) };
for ( auto i = 0u ; i < n ; i ++ ) {
c->inputs_.add( inputs_[ i ] );
}
c->fovConfig_ = fovConfig_;
c->target_ = target_;
c->upVector_ = upVector_;
c->position_ = position_;
c->angles_ = angles_;
c->distance_ = distance_;
c->camMode_ = camMode_;
return c;
}
/*------------------------------------------------------------------------------*/
T_CamOverride::E_SetState T_CamOverride::setFieldOfView(

View file

@ -23,10 +23,18 @@ class A_Float : public A_SyncOverride
: A_SyncOverride( type , title )
{}
public:
A_Float( T_String const& input ,
T_String const& title ) noexcept;
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;
@ -52,6 +60,8 @@ class T_Float : public A_Float
public:
T_Float( T_String const& input ,
T_String const& title ) noexcept;
P_SyncOverride clone( ) const noexcept override;
};
// 2 float values
@ -65,6 +75,8 @@ class T_Float2 : public A_Float
T_Float2( T_String const& input0 ,
T_String const& input1 ,
T_String const& title ) noexcept;
P_SyncOverride clone( ) const noexcept override;
};
// 3 float values
@ -79,6 +91,8 @@ class T_Float3 : public A_Float
T_String const& input1 ,
T_String const& input2 ,
T_String const& title ) noexcept;
P_SyncOverride clone( ) const noexcept override;
};
// 4 float values
@ -94,6 +108,8 @@ class T_Float4 : public A_Float
T_String const& input2 ,
T_String const& input3 ,
T_String const& title ) noexcept;
P_SyncOverride clone( ) const noexcept override;
};
@ -114,10 +130,16 @@ class A_Integer : public A_SyncOverride
: A_SyncOverride( type , title )
{}
public:
A_Integer( T_String const& input ,
T_String const& title ) noexcept;
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;
@ -140,6 +162,8 @@ class T_Integer : public A_Integer
public:
T_Integer( T_String const& input ,
T_String const& title ) noexcept;
P_SyncOverride clone( ) const noexcept override;
};
// 2 integers
@ -153,6 +177,8 @@ class T_Integer2 : public A_Integer
T_Integer2( T_String const& input0 ,
T_String const& input1 ,
T_String const& title ) noexcept;
P_SyncOverride clone( ) const noexcept override;
};
// 3 integers
@ -167,6 +193,8 @@ class T_Integer3 : public A_Integer
T_String const& input1 ,
T_String const& input2 ,
T_String const& title ) noexcept;
P_SyncOverride clone( ) const noexcept override;
};
// 4 integers
@ -182,6 +210,8 @@ class T_Integer4 : public A_Integer
T_String const& input2 ,
T_String const& input3 ,
T_String const& title ) noexcept;
P_SyncOverride clone( ) const noexcept override;
};
@ -209,6 +239,8 @@ class T_ColorGrading : public A_SyncOverride
float base( ) const noexcept { return base_ ? *base_ : 0.f; }
float unit( ) const noexcept { return unit_ ? *unit_ : 1.f; }
P_SyncOverride clone( ) const noexcept override;
};
@ -272,6 +304,8 @@ class T_CamOverride : public A_SyncOverride , public virtual A_MouseCtrl
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(