diff options
| author | navewindre <boneyaard@gmail.com> | 2018-09-12 23:07:32 +0200 |
|---|---|---|
| committer | navewindre <boneyaard@gmail.com> | 2018-09-12 23:07:32 +0200 |
| commit | 3c72119a3c474e11f9ee819def492dcbfd1e8f84 (patch) | |
| tree | b7e52c422fbc8e96874a2876c9b82f96e7767f09 /internal_rewrite/visual_player.cpp | |
| parent | e8bff3fb5f484e2fb98bf157f4b85b61fdbd0620 (diff) | |
asd
Diffstat (limited to 'internal_rewrite/visual_player.cpp')
| -rw-r--r-- | internal_rewrite/visual_player.cpp | 110 |
1 files changed, 76 insertions, 34 deletions
diff --git a/internal_rewrite/visual_player.cpp b/internal_rewrite/visual_player.cpp index 645417d..eeb5cca 100644 --- a/internal_rewrite/visual_player.cpp +++ b/internal_rewrite/visual_player.cpp @@ -22,6 +22,11 @@ namespace features }
}
+ void c_visuals::reset_position( ) {
+ for( size_t i{ }; i < 65; ++i )
+ m_anim_progress[ i ] = 0.f;
+ }
+
void c_visuals::store_hit( ) {
if( !g_settings.visuals.hitmarkers )
return;
@@ -96,49 +101,64 @@ namespace features int x, y, w, h;
};
- box_t get_box( c_base_player* ent ) {
+ box_t get_box( c_base_player* ent, vec3_t stored_origin ) {
const matrix3x4& matrix = ent->m_CoordinateFrame( );
- vec3_t min = ent->m_vecMins( );
- vec3_t max = ent->m_vecMaxs( );
-
- std::array< vec3_t, 8 > point_list = {
- vec3_t{ min.x, min.y, min.z },
- vec3_t{ min.x, max.y, min.z },
- vec3_t{ max.x, max.y, min.z },
- vec3_t{ max.x, min.y, min.z },
- vec3_t{ max.x, max.y, max.z },
- vec3_t{ min.x, max.y, max.z },
- vec3_t{ min.x, min.y, max.z },
- vec3_t{ max.x, min.y, max.z }
- };
+ vec2_t min_corner{ FLT_MAX, FLT_MAX };
+ vec2_t max_corner{ FLT_MIN, FLT_MIN };
+
+ vec3_t min_pos;
+ vec3_t max_pos;
+
+ matrix3x4 bone_matrix[ 128 ];
+ memcpy( bone_matrix, ent->m_CachedBoneData( ).GetElements( ), ent->m_CachedBoneData( ).GetSize( ) * sizeof( matrix3x4 ) );
+
+ auto hdr = g_csgo.m_model_info( )->GetStudiomodel( ent->ce( )->GetModel( ) );
+
+ for( size_t i{ }; i < hdr->numbones; ++i ) {
+ auto bone = hdr->GetBone( i );
- std::array< float, 8 > x_points;
- std::array< float, 8 > y_points;
+ if( bone && bone->parent != -1 && bone->flags & 0x100 ) {
+ auto& matrix = bone_matrix[ i ];
+ vec3_t hitbox = vec3_t( matrix[ 0 ][ 3 ], matrix[ 1 ][ 3 ], matrix[ 2 ][ 3 ] );
+ hitbox -= ent->m_vecOrigin( );
+ hitbox += stored_origin;
- vec2_t origin = util::screen_transform( ent->m_vecOrigin( ) );
- for( auto& it : point_list ) {
- vec3_t backup = it;
- for( int i{ }; i < 3; ++i ) {
- it[ i ] = backup.dot( ( const vec3_t& )( matrix[ i ] ) ) + matrix[ i ][ 3 ];
+ vec2_t pos = util::screen_transform( hitbox );
+
+ if( pos.x < min_corner.x )
+ min_corner.x = pos.x;
+
+ if( pos.x > max_corner.x )
+ max_corner.x = pos.x;
+
+ if( pos.y < min_corner.y )
+ min_corner.y = pos.y;
+
+ if( pos.y > max_corner.y )
+ max_corner.y = pos.y;
}
}
- for( size_t i{ }; i < 8; ++i ) {
- vec2_t w2s = util::screen_transform( point_list[ i ] );
- x_points[ i ] = w2s.x;
- y_points[ i ] = w2s.y;
- }
+ vec2_t origin = util::screen_transform( stored_origin );
+
+ vec3_t origin_zoffset = stored_origin;
+ origin_zoffset.z += 10;
- std::sort( x_points.begin( ), x_points.end( ) );
- std::sort( y_points.begin( ), y_points.end( ) );
+ vec2_t delta = util::screen_transform( origin_zoffset ) - origin;
- int x = ( int )x_points.front( );
- int w = ( int )x_points.back( ) - x;
+ min_corner.x += delta.y;
+ max_corner.x -= delta.y;
- int y = ( int )y_points.front( );
- int h = ( int )y_points.back( ) - y;
+ min_corner.y += delta.y;
+ max_corner.y -= delta.y;
+
+ int x = ( int )min_corner.x;
+ int w = ( int )( max_corner.x - min_corner.x );
+
+ int y = ( int )min_corner.y;
+ int h = ( int )( max_corner.y - min_corner.y );
return { x - ( int )origin.x, y - ( int )origin.y, w, h };
}
@@ -322,6 +342,24 @@ namespace features return ret;
}
+ void c_visuals::update_positions( ) {
+ CUtlVector< CSndInfo > sound_info{ };
+
+ g_csgo.m_engine_sound( )->GetActiveSounds( sound_info );
+
+ for( size_t i{ }; i < sound_info.GetSize( ); ++i ) {
+ auto& snd = sound_info.GetElements( )[ i ];
+
+ if( snd.origin ) {
+ int idx = snd.sound_source;
+ auto ent = g_csgo.m_entlist( )->GetClientEntity( idx );
+
+ if( ent && ent->is_player( ) && ent->ce( )->IsDormant( ) )
+ update_position( idx, snd.origin[ 0 ] );
+ }
+ }
+ }
+
void c_visuals::draw_players( ) {
static constexpr float anim_rate = 1.0f / 0.3f;
static float pov_progress[ 65 ]{ };
@@ -346,8 +384,7 @@ namespace features float alpha = anim;
bool dormant = ent->ce( )->IsDormant( ) || !ent->has_valid_anim( );
int health = ent->m_iHealth( );
- auto origin = ent->m_vecOrigin( );
- auto box = get_box( ent );
+ auto origin = ent->ce( )->GetRenderOrigin( );
int right_pos = 0;
int bottom_pos = 0;
bool too_distant = true;
@@ -367,6 +404,8 @@ namespace features continue;
}
+ auto box = get_box( ent, m_stored_pos[ i ] );
+
clr_t col = ent->m_iTeamNum( ) == g_ctx.m_local->m_iTeamNum( ) ?
g_settings.visuals.box_friendly : g_settings.visuals.box_enemy;
@@ -856,6 +895,8 @@ namespace features }
void c_visuals::on_round_start( ) {
+ reset_position( );
+
m_last_roundstart = g_csgo.m_globals->m_curtime;
for( size_t i{ }; i < 65; ++i ) {
m_ent_dmg[ i ] = 0;
@@ -967,6 +1008,7 @@ namespace features }
if( g_settings.visuals.active ) {
+ update_positions( );
draw_players( );
}
|
