* entity keys: prefer "angles" over "angle", "modelscale_vec" over "modelscale" if both are set
This commit is contained in:
parent
da98f5f9d9
commit
5c3b7d842c
|
|
@ -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 ){
|
||||
if( !m_entity.hasKeyValue( "angles" ) || m_anglesCB == KeyObserver() ){ // no "angles" set or supported
|
||||
read_angle( m_angles, value );
|
||||
m_anglesChanged();
|
||||
}
|
||||
typedef MemberCaller1<AnglesKey, const char*, &AnglesKey::angleChanged> AngleChangedCaller;
|
||||
}
|
||||
KeyObserver getAngleChangedCallback(){
|
||||
return m_angleCB = MemberCaller1<AnglesKey, const char*, &AnglesKey::angleChanged>( *this );
|
||||
}
|
||||
|
||||
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 );
|
||||
if( !m_entity.hasKeyValue( "angles" ) || m_anglesCB == KeyObserver() ){ // no "angles" set or supported
|
||||
read_group_angle( m_angles, value );
|
||||
m_anglesChanged();
|
||||
}
|
||||
typedef MemberCaller1<AnglesKey, const char*, &AnglesKey::groupAngleChanged> GroupAngleChangedCaller;
|
||||
}
|
||||
KeyObserver getGroupAngleChangedCallback(){
|
||||
return m_angleCB = MemberCaller1<AnglesKey, const char*, &AnglesKey::groupAngleChanged>( *this );
|
||||
}
|
||||
|
||||
void anglesChanged( const char* value ){
|
||||
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();
|
||||
}
|
||||
typedef MemberCaller1<AnglesKey, const char*, &AnglesKey::anglesChanged> AnglesChangedCaller;
|
||||
else // "angles" key removed // improvable: also do this on invalid "angles" key
|
||||
m_angleCB( m_entity.getKeyValue( "angle" ) );
|
||||
}
|
||||
KeyObserver getAnglesChangedCallback(){
|
||||
return m_anglesCB = MemberCaller1<AnglesKey, const char*, &AnglesKey::anglesChanged>( *this );
|
||||
}
|
||||
|
||||
void write( Entity* entity ) const {
|
||||
write_angles( m_angles, entity );
|
||||
|
|
|
|||
|
|
@ -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 ),
|
||||
|
|
|
|||
|
|
@ -90,10 +90,10 @@ class GenericEntity :
|
|||
m_keyObservers.insert( "classname", ClassnameFilter::ClassnameChangedCaller( m_filter ) );
|
||||
m_keyObservers.insert( Static<KeyIsName>::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 ),
|
||||
|
|
|
|||
|
|
@ -84,8 +84,8 @@ class Group
|
|||
m_keyObservers.insert( "classname", ClassnameFilter::ClassnameChangedCaller( m_filter ) );
|
||||
m_keyObservers.insert( Static<KeyIsName>::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 ){
|
||||
|
|
|
|||
|
|
@ -162,8 +162,8 @@ class MiscModel :
|
|||
m_keyObservers.insert( Static<KeyIsName>::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 ),
|
||||
|
|
|
|||
|
|
@ -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 ){
|
||||
if( !m_entity.hasKeyValue( "modelscale_vec" ) ){
|
||||
read_scale( m_scale, value );
|
||||
m_scaleChanged();
|
||||
}
|
||||
}
|
||||
typedef MemberCaller1<ScaleKey, const char*, &ScaleKey::uniformScaleChanged> UniformScaleChangedCaller;
|
||||
|
||||
void scaleChanged( const char* 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<ScaleKey, const char*, &ScaleKey::scaleChanged> ScaleChangedCaller;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user