From 5c3b7d842cbffee115ea94398c3f2abbaa84c575 Mon Sep 17 00:00:00 2001 From: Garux Date: Sun, 16 May 2021 21:50:09 +0300 Subject: [PATCH] * entity keys: prefer "angles" over "angle", "modelscale_vec" over "modelscale" if both are set --- plugins/entity/angles.h | 52 +++++++++++++++++++++++----------- plugins/entity/eclassmodel.cpp | 10 +++---- plugins/entity/generic.cpp | 10 +++---- plugins/entity/group.cpp | 8 +++--- plugins/entity/miscmodel.cpp | 12 ++++---- plugins/entity/scale.h | 16 +++++++---- 6 files changed, 67 insertions(+), 41 deletions(-) diff --git a/plugins/entity/angles.h b/plugins/entity/angles.h index 8c2d877a..58010a1a 100644 --- a/plugins/entity/angles.h +++ b/plugins/entity/angles.h @@ -53,6 +53,14 @@ inline void read_angle( Vector3& angles, const char* value ){ normalise_angles( angles ); } } +inline void read_group_angle( Vector3& angles, const char* value ){ + if( string_equal( value, "-1" ) ) + angles = Vector3( 0, -90, 0 ); + else if( string_equal( value, "-2" ) ) + angles = Vector3( 0, 90, 0 ); + else + read_angle( angles, value ); +} inline void read_angles( Vector3& angles, const char* value ){ if ( !string_parse_vector3( value, angles ) ) { default_angles( angles ); @@ -131,36 +139,48 @@ inline Vector3 angles_rotated_for_rotated_pivot( const Vector3& angles, const Qu class AnglesKey { Callback m_anglesChanged; + KeyObserver m_angleCB; + KeyObserver m_anglesCB; + const Entity& m_entity; public: Vector3 m_angles; - AnglesKey( const Callback& anglesChanged ) - : m_anglesChanged( anglesChanged ), m_angles( ANGLESKEY_IDENTITY ){ + AnglesKey( const Callback& anglesChanged, const Entity& entity ) + : m_anglesChanged( anglesChanged ), m_angleCB(), m_anglesCB(), m_entity( entity ), m_angles( ANGLESKEY_IDENTITY ){ } void angleChanged( const char* value ){ - read_angle( m_angles, value ); - m_anglesChanged(); + if( !m_entity.hasKeyValue( "angles" ) || m_anglesCB == KeyObserver() ){ // no "angles" set or supported + read_angle( m_angles, value ); + m_anglesChanged(); + } + } + KeyObserver getAngleChangedCallback(){ + return m_angleCB = MemberCaller1( *this ); } - typedef MemberCaller1 AngleChangedCaller; void groupAngleChanged( const char* value ){ - if( strlen( value ) == 2 && value[0] == '-' && value[1] == '1' ) - m_angles = Vector3( 0, -90, 0 ); - else if( strlen( value ) == 2 && value[0] == '-' && value[1] == '2' ) - m_angles = Vector3( 0, 90, 0 ); - else - read_angle( m_angles, value ); - m_anglesChanged(); + if( !m_entity.hasKeyValue( "angles" ) || m_anglesCB == KeyObserver() ){ // no "angles" set or supported + read_group_angle( m_angles, value ); + m_anglesChanged(); + } + } + KeyObserver getGroupAngleChangedCallback(){ + return m_angleCB = MemberCaller1( *this ); } - typedef MemberCaller1 GroupAngleChangedCaller; void anglesChanged( const char* value ){ - read_angles( m_angles, value ); - m_anglesChanged(); + if( m_entity.hasKeyValue( "angles" ) ){ // check actual key presence, as this may be notified by default value on key removal + read_angles( m_angles, value ); + m_anglesChanged(); + } + else // "angles" key removed // improvable: also do this on invalid "angles" key + m_angleCB( m_entity.getKeyValue( "angle" ) ); + } + KeyObserver getAnglesChangedCallback(){ + return m_anglesCB = MemberCaller1( *this ); } - typedef MemberCaller1 AnglesChangedCaller; void write( Entity* entity ) const { write_angles( m_angles, entity ); diff --git a/plugins/entity/eclassmodel.cpp b/plugins/entity/eclassmodel.cpp index 1cc31e7f..790dbd0b 100644 --- a/plugins/entity/eclassmodel.cpp +++ b/plugins/entity/eclassmodel.cpp @@ -101,11 +101,11 @@ class EclassModel : else { if( m_entity.getEntityClass().has_direction_key ) - m_keyObservers.insert( "angle", AnglesKey::GroupAngleChangedCaller( m_anglesKey ) ); + m_keyObservers.insert( "angle", m_anglesKey.getGroupAngleChangedCallback() ); else - m_keyObservers.insert( "angle", AnglesKey::AngleChangedCaller( m_anglesKey ) ); + m_keyObservers.insert( "angle", m_anglesKey.getAngleChangedCallback() ); if( m_entity.getEntityClass().has_angles_key ) - m_keyObservers.insert( "angles", AnglesKey::AnglesChangedCaller( m_anglesKey ) ); + m_keyObservers.insert( "angles", m_anglesKey.getAnglesChangedCallback() ); } m_keyObservers.insert( "origin", OriginKey::OriginChangedCaller( m_originKey ) ); } @@ -160,7 +160,7 @@ public: m_entity( eclass ), m_originKey( OriginChangedCaller( *this ) ), m_origin( ORIGINKEY_IDENTITY ), - m_anglesKey( AnglesChangedCaller( *this ) ), + m_anglesKey( AnglesChangedCaller( *this ), m_entity ), m_angles( ANGLESKEY_IDENTITY ), m_rotationKey( RotationChangedCaller( *this ) ), m_filter( m_entity, node ), @@ -178,7 +178,7 @@ public: m_entity( other.m_entity ), m_originKey( OriginChangedCaller( *this ) ), m_origin( ORIGINKEY_IDENTITY ), - m_anglesKey( AnglesChangedCaller( *this ) ), + m_anglesKey( AnglesChangedCaller( *this ), m_entity ), m_angles( ANGLESKEY_IDENTITY ), m_rotationKey( RotationChangedCaller( *this ) ), m_filter( m_entity, node ), diff --git a/plugins/entity/generic.cpp b/plugins/entity/generic.cpp index 59384a98..b7eab734 100644 --- a/plugins/entity/generic.cpp +++ b/plugins/entity/generic.cpp @@ -90,10 +90,10 @@ class GenericEntity : m_keyObservers.insert( "classname", ClassnameFilter::ClassnameChangedCaller( m_filter ) ); m_keyObservers.insert( Static::instance().m_nameKey, NamedEntity::IdentifierChangedCaller( m_named ) ); if( m_entity.getEntityClass().has_direction_key ) - m_keyObservers.insert( "angle", AnglesKey::GroupAngleChangedCaller( m_anglesKey ) ); + m_keyObservers.insert( "angle", m_anglesKey.getGroupAngleChangedCallback() ); else - m_keyObservers.insert( "angle", AnglesKey::AngleChangedCaller( m_anglesKey ) ); - m_keyObservers.insert( "angles", AnglesKey::AnglesChangedCaller( m_anglesKey ) ); + m_keyObservers.insert( "angle", m_anglesKey.getAngleChangedCallback() ); + m_keyObservers.insert( "angles", m_anglesKey.getAnglesChangedCallback() ); m_keyObservers.insert( "origin", OriginKey::OriginChangedCaller( m_originKey ) ); } @@ -124,7 +124,7 @@ public: m_entity( eclass ), m_originKey( OriginChangedCaller( *this ) ), m_origin( ORIGINKEY_IDENTITY ), - m_anglesKey( AnglesChangedCaller( *this ) ), + m_anglesKey( AnglesChangedCaller( *this ), m_entity ), m_angles( ANGLESKEY_IDENTITY ), m_filter( m_entity, node ), m_named( m_entity ), @@ -141,7 +141,7 @@ public: m_entity( other.m_entity ), m_originKey( OriginChangedCaller( *this ) ), m_origin( ORIGINKEY_IDENTITY ), - m_anglesKey( AnglesChangedCaller( *this ) ), + m_anglesKey( AnglesChangedCaller( *this ), m_entity ), m_angles( ANGLESKEY_IDENTITY ), m_filter( m_entity, node ), m_named( m_entity ), diff --git a/plugins/entity/group.cpp b/plugins/entity/group.cpp index 60d4e644..d69c1cf2 100644 --- a/plugins/entity/group.cpp +++ b/plugins/entity/group.cpp @@ -84,8 +84,8 @@ class Group m_keyObservers.insert( "classname", ClassnameFilter::ClassnameChangedCaller( m_filter ) ); m_keyObservers.insert( Static::instance().m_nameKey, NamedEntity::IdentifierChangedCaller( m_named ) ); m_keyObservers.insert( "origin", OriginKey::OriginChangedCaller( m_originKey ) ); - m_keyObservers.insert( "angle", AnglesKey::GroupAngleChangedCaller( m_anglesKey ) ); - m_keyObservers.insert( "angles", AnglesKey::AnglesChangedCaller( m_anglesKey ) ); + m_keyObservers.insert( "angle", m_anglesKey.getGroupAngleChangedCallback() ); + m_keyObservers.insert( "angles", m_anglesKey.getAnglesChangedCallback() ); updateAnglesDraw(); } @@ -99,7 +99,7 @@ public: m_origin( ORIGINKEY_IDENTITY ), m_name_origin( g_vector3_identity ), m_renderName( m_named, m_name_origin, EXCLUDE_NAME ), - m_anglesKey( UpdateAnglesDrawCaller( *this ) ), + m_anglesKey( UpdateAnglesDrawCaller( *this ), m_entity ), m_arrow( m_name_origin, m_anglesKey.m_angles ), m_transformChanged( transformChanged ), m_evaluateTransform( evaluateTransform ){ @@ -114,7 +114,7 @@ public: m_origin( ORIGINKEY_IDENTITY ), m_name_origin( g_vector3_identity ), m_renderName( m_named, m_name_origin, EXCLUDE_NAME ), - m_anglesKey( UpdateAnglesDrawCaller( *this ) ), + m_anglesKey( UpdateAnglesDrawCaller( *this ), m_entity ), m_arrow( m_name_origin, m_anglesKey.m_angles ), m_transformChanged( transformChanged ), m_evaluateTransform( evaluateTransform ){ diff --git a/plugins/entity/miscmodel.cpp b/plugins/entity/miscmodel.cpp index f05d38ac..f905a606 100644 --- a/plugins/entity/miscmodel.cpp +++ b/plugins/entity/miscmodel.cpp @@ -162,8 +162,8 @@ class MiscModel : m_keyObservers.insert( Static::instance().m_nameKey, NamedEntity::IdentifierChangedCaller( m_named ) ); m_keyObservers.insert( m_entity.getEntityClass().miscmodel_key(), SingletonModel::ModelChangedCaller( m_model ) ); m_keyObservers.insert( "origin", OriginKey::OriginChangedCaller( m_originKey ) ); - m_keyObservers.insert( "angle", AnglesKey::AngleChangedCaller( m_anglesKey ) ); - m_keyObservers.insert( "angles", AnglesKey::AnglesChangedCaller( m_anglesKey ) ); + m_keyObservers.insert( "angle", m_anglesKey.getAngleChangedCallback() ); + m_keyObservers.insert( "angles", m_anglesKey.getAnglesChangedCallback() ); m_keyObservers.insert( "modelscale", ScaleKey::UniformScaleChangedCaller( m_scaleKey ) ); m_keyObservers.insert( "modelscale_vec", ScaleKey::ScaleChangedCaller( m_scaleKey ) ); } @@ -210,9 +210,9 @@ public: m_remapKeysObserver( SkinChangedCaller( *this ) ), m_originKey( OriginChangedCaller( *this ) ), m_origin( ORIGINKEY_IDENTITY ), - m_anglesKey( AnglesChangedCaller( *this ) ), + m_anglesKey( AnglesChangedCaller( *this ), m_entity ), m_angles( ANGLESKEY_IDENTITY ), - m_scaleKey( ScaleChangedCaller( *this ) ), + m_scaleKey( ScaleChangedCaller( *this ), m_entity ), m_scale( SCALEKEY_IDENTITY ), m_filter( m_entity, node ), m_named( m_entity ), @@ -227,9 +227,9 @@ public: m_remapKeysObserver( SkinChangedCaller( *this ) ), m_originKey( OriginChangedCaller( *this ) ), m_origin( ORIGINKEY_IDENTITY ), - m_anglesKey( AnglesChangedCaller( *this ) ), + m_anglesKey( AnglesChangedCaller( *this ), m_entity ), m_angles( ANGLESKEY_IDENTITY ), - m_scaleKey( ScaleChangedCaller( *this ) ), + m_scaleKey( ScaleChangedCaller( *this ), m_entity ), m_scale( SCALEKEY_IDENTITY ), m_filter( m_entity, node ), m_named( m_entity ), diff --git a/plugins/entity/scale.h b/plugins/entity/scale.h index 3e60bd39..1d578a51 100644 --- a/plugins/entity/scale.h +++ b/plugins/entity/scale.h @@ -87,22 +87,28 @@ inline Vector3 scale_scaled( const Vector3& scale, const Vector3& scaling ){ class ScaleKey { Callback m_scaleChanged; + const Entity& m_entity; public: Vector3 m_scale; - ScaleKey( const Callback& scaleChanged ) - : m_scaleChanged( scaleChanged ), m_scale( SCALEKEY_IDENTITY ){ + ScaleKey( const Callback& scaleChanged, const Entity& entity ) + : m_scaleChanged( scaleChanged ), m_entity( entity ), m_scale( SCALEKEY_IDENTITY ){ } void uniformScaleChanged( const char* value ){ - read_scale( m_scale, value ); - m_scaleChanged(); + if( !m_entity.hasKeyValue( "modelscale_vec" ) ){ + read_scale( m_scale, value ); + m_scaleChanged(); + } } typedef MemberCaller1 UniformScaleChangedCaller; void scaleChanged( const char* value ){ - read_scalevec( m_scale, value ); + if( m_entity.hasKeyValue( "modelscale_vec" ) ) // check actual key presence, as this may be notified by default value on key removal + read_scalevec( m_scale, value ); + else // "modelscale_vec" removed // improvable: also do this on invalid "modelscale_vec" key + read_scale( m_scale, m_entity.getKeyValue( "modelscale" ) ); m_scaleChanged(); } typedef MemberCaller1 ScaleChangedCaller;