* .ent: "direction" attribute presence enables -1/-2 angle support for EclassModel, GenericEntity

* .ent: "angles" attribute presence enables angles support for EclassModel
This commit is contained in:
Garux 2021-05-15 23:38:41 +03:00
parent 155c2624b1
commit ed04f90497
5 changed files with 39 additions and 23 deletions

View File

@ -115,6 +115,8 @@ public:
bool miscmodel_is; // also definable via model attribute presence in xml .ent definition
CopiedString m_miscmodel_key;
bool has_angles; // definable via "angle"/"angles"/"direction" attribute presence in xml .ent definition, only affects rendering of group entities angles arrow now
bool has_angles_key; // definable via "angles" attribute presence in xml .ent definition, enables angles support for EclassModel (only angle by default)
bool has_direction_key; // definable via "direction" attribute presence in xml .ent definition, enables -1/-2 angle support for EclassModel, GenericEntity
Vector3 mins;
Vector3 maxs;
@ -261,6 +263,8 @@ inline EntityClass* Eclass_Alloc(){
e->miscmodel_is = false;
e->m_miscmodel_key = "model";
e->has_angles = false;
e->has_angles_key = false;
e->has_direction_key = false;
memset( e->flagnames, 0, MAX_FLAGS * 32 );
memset( e->flagAttributes, 0, MAX_FLAGS * sizeof( EntityClassAttribute* ) );

View File

@ -99,7 +99,7 @@ inline Matrix4 matrix4_rotation_for_euler_xyz_degrees_quantised( const Vector3&
}
inline Vector3 angles_snapped_to_zero( const Vector3& angles ){
float epsilon = ( fabs( angles[0] ) > 0.001f || fabs( angles[1] ) > 0.001f || fabs( angles[2] ) > 0.001f ) ? 5e-5 : 1e-6;
const float epsilon = ( fabs( angles[0] ) > 0.001f || fabs( angles[1] ) > 0.001f || fabs( angles[2] ) > 0.001f ) ? 5e-5 : 1e-6;
return Vector3( fabs( angles[0] ) < epsilon ? 0.f : angles[0],
fabs( angles[1] ) < epsilon ? 0.f : angles[1],
fabs( angles[2] ) < epsilon ? 0.f : angles[2]

View File

@ -43,7 +43,7 @@
#include "targetable.h"
#include "origin.h"
#include "angle.h"
#include "angles.h"
#include "rotation.h"
#include "model.h"
#include "filters.h"
@ -67,8 +67,8 @@ class EclassModel :
OriginKey m_originKey;
Vector3 m_origin;
AngleKey m_angleKey;
float m_angle;
AnglesKey m_anglesKey;
Vector3 m_angles;
RotationKey m_rotationKey;
Float9 m_rotation;
SingletonModel m_model;
@ -100,7 +100,12 @@ class EclassModel :
}
else
{
m_keyObservers.insert( "angle", AngleKey::AngleChangedCaller( m_angleKey ) );
if( m_entity.getEntityClass().has_direction_key )
m_keyObservers.insert( "angle", AnglesKey::GroupAngleChangedCaller( m_anglesKey ) );
else
m_keyObservers.insert( "angle", AnglesKey::AngleChangedCaller( m_anglesKey ) );
if( m_entity.getEntityClass().has_angles_key )
m_keyObservers.insert( "angles", AnglesKey::AnglesChangedCaller( m_anglesKey ) );
}
m_keyObservers.insert( "origin", OriginKey::OriginChangedCaller( m_originKey ) );
}
@ -111,17 +116,14 @@ public:
#endif
void updateTransform(){
m_transform.localToParent() = g_matrix4_identity;
matrix4_translate_by_vec3( m_transform.localToParent(), m_origin );
m_translation = m_transform.localToParent();
m_translation = m_transform.localToParent() = matrix4_translation_for_vec3( m_origin );
if ( g_gameType == eGameTypeDoom3 ) {
matrix4_multiply_by_matrix4( m_transform.localToParent(), rotation_toMatrix( m_rotation ) );
}
else
{
matrix4_multiply_by_matrix4( m_transform.localToParent(), matrix4_rotation_for_z_degrees( m_angle ) );
matrix4_multiply_by_matrix4( m_transform.localToParent(), matrix4_rotation_for_euler_xyz_degrees( m_angles ) );
}
m_transformChanged();
@ -133,11 +135,11 @@ public:
updateTransform();
}
typedef MemberCaller<EclassModel, &EclassModel::originChanged> OriginChangedCaller;
void angleChanged(){
m_angle = m_angleKey.m_angle;
void anglesChanged(){
m_angles = m_anglesKey.m_angles;
updateTransform();
}
typedef MemberCaller<EclassModel, &EclassModel::angleChanged> AngleChangedCaller;
typedef MemberCaller<EclassModel, &EclassModel::anglesChanged> AnglesChangedCaller;
void rotationChanged(){
rotation_assign( m_rotation, m_rotationKey.m_rotation );
updateTransform();
@ -158,8 +160,8 @@ public:
m_entity( eclass ),
m_originKey( OriginChangedCaller( *this ) ),
m_origin( ORIGINKEY_IDENTITY ),
m_angleKey( AngleChangedCaller( *this ) ),
m_angle( ANGLEKEY_IDENTITY ),
m_anglesKey( AnglesChangedCaller( *this ) ),
m_angles( ANGLESKEY_IDENTITY ),
m_rotationKey( RotationChangedCaller( *this ) ),
m_filter( m_entity, node ),
m_named( m_entity ),
@ -176,8 +178,8 @@ public:
m_entity( other.m_entity ),
m_originKey( OriginChangedCaller( *this ) ),
m_origin( ORIGINKEY_IDENTITY ),
m_angleKey( AngleChangedCaller( *this ) ),
m_angle( ANGLEKEY_IDENTITY ),
m_anglesKey( AnglesChangedCaller( *this ) ),
m_angles( ANGLESKEY_IDENTITY ),
m_rotationKey( RotationChangedCaller( *this ) ),
m_filter( m_entity, node ),
m_named( m_entity ),
@ -271,7 +273,9 @@ public:
}
else
{
m_angle = angle_rotated( m_angle, rotation );
m_angles = angles_rotated( m_angles, rotation );
if( !m_entity.getEntityClass().has_angles_key ) // yaw angle only
m_angles[0] = m_angles[1] = 0;
}
}
void snapto( float snap ){
@ -285,7 +289,7 @@ public:
}
else
{
m_angle = m_angleKey.m_angle;
m_angles = m_anglesKey.m_angles;
}
}
void freezeTransform(){
@ -295,10 +299,10 @@ public:
rotation_assign( m_rotationKey.m_rotation, m_rotation );
m_rotationKey.write( &m_entity );
}
else if( m_angleKey.m_angle != m_angle )
else if( m_anglesKey.m_angles != m_angles )
{
m_angleKey.m_angle = m_angle;
m_angleKey.write( &m_entity );
m_anglesKey.m_angles = m_angles;
m_anglesKey.write( &m_entity );
}
}
void transformChanged(){

View File

@ -89,7 +89,10 @@ class GenericEntity :
m_keyObservers.insert( "classname", ClassnameFilter::ClassnameChangedCaller( m_filter ) );
m_keyObservers.insert( Static<KeyIsName>::instance().m_nameKey, NamedEntity::IdentifierChangedCaller( m_named ) );
m_keyObservers.insert( "angle", AnglesKey::AngleChangedCaller( m_anglesKey ) );
if( m_entity.getEntityClass().has_direction_key )
m_keyObservers.insert( "angle", AnglesKey::GroupAngleChangedCaller( m_anglesKey ) );
else
m_keyObservers.insert( "angle", AnglesKey::AngleChangedCaller( m_anglesKey ) );
m_keyObservers.insert( "angles", AnglesKey::AnglesChangedCaller( m_anglesKey ) );
m_keyObservers.insert( "origin", OriginKey::OriginChangedCaller( m_originKey ) );
}

View File

@ -220,6 +220,11 @@ public:
}
else if( string_equal( type, "angle" ) || string_equal( type, "angles" ) || string_equal( type, "direction" ) ){
entityClass->has_angles = true;
if( string_equal( type, "angles" ) )
entityClass->has_angles_key = true;
else if( string_equal( type, "direction" ) )
entityClass->has_direction_key = true;
}
m_comment << key;