@@ -43,7 +43,7 @@ extern ENGINE_API Fvector3 w_timers;
43
43
// Construction/Destruction
44
44
// ////////////////////////////////////////////////////////////////////
45
45
46
- CWeapon::CWeapon (LPCSTR name) : m_fLR_MovingFactor( 0 .f), m_strafe_offset{}
46
+ CWeapon::CWeapon (LPCSTR name)
47
47
{
48
48
SetState (eHidden);
49
49
SetNextState (eHidden);
@@ -539,28 +539,26 @@ void CWeapon::Load (LPCSTR section)
539
539
540
540
// //////////////////////////////////////////
541
541
// --#SM+# Begin--
542
- string16 _prefix = { " " } ;
543
- // xr_sprintf(_prefix, "%s ", UI()->is_widescreen() ? "_16x9" : ""); //KRodin: на мой взгляд это лишнее.
542
+ m_strafe_offset[ 0 ][ 0 ] = READ_IF_EXISTS (pSettings, r_fvector3, section, " strafe_hud_offset_pos " , (Fvector{ 0 . 015f , 0 . f , 0 . f })) ;
543
+ m_strafe_offset[ 1 ][ 0 ] = READ_IF_EXISTS (pSettings, r_fvector3, section, " strafe_hud_offset_rot " , (Fvector{ 0 . f , 0 . f , 4 . 5f }));
544
544
545
- string128 val_name;
545
+ m_strafe_offset[0 ][1 ] = READ_IF_EXISTS (pSettings, r_fvector3, section, " strafe_aim_hud_offset_pos" , (Fvector{ 0 .f , 0 .f , 0 .f }));
546
+ m_strafe_offset[1 ][1 ] = READ_IF_EXISTS (pSettings, r_fvector3, section, " strafe_aim_hud_offset_rot" , (Fvector{ 0 .f , 0 .f , 2 .5f }));
546
547
547
- // Смещение в стрейфе
548
- m_strafe_offset[0 ][0 ] = READ_IF_EXISTS (pSettings, r_fvector3, section, xr_strconcat (val_name, " strafe_hud_offset_pos" , _prefix), Fvector ().set (0 .015f , 0 .f , 0 .f ));
549
- m_strafe_offset[1 ][0 ] = READ_IF_EXISTS (pSettings, r_fvector3, section, xr_strconcat (val_name, " strafe_hud_offset_rot" , _prefix), Fvector ().set (0 .f , 0 .f , 4 .5f ));
548
+ m_strafe_offset[2 ][0 ].set (READ_IF_EXISTS (pSettings, r_bool, section, " strafe_enabled" , true ), READ_IF_EXISTS (pSettings, r_float, section, " strafe_transition_time" , 0 .25f ), 0 .f ); // normal
549
+ m_strafe_offset[2 ][1 ].set (READ_IF_EXISTS (pSettings, r_bool, section, " strafe_aim_enabled" , true ), READ_IF_EXISTS (pSettings, r_float, section, " strafe_aim_transition_time" , 0 .15f ), 0 .f ); // aim-GL
550
+ // --#SM+# End--
551
+ // //////////////////////////////////////////
550
552
551
- // Поворот в стрейфе
552
- m_strafe_offset [0 ][1 ] = READ_IF_EXISTS (pSettings, r_fvector3, section, xr_strconcat (val_name, " strafe_aim_hud_offset_pos " , _prefix), Fvector (). set ( 0 . 005f , 0 .f , 0 .f ));
553
- m_strafe_offset [1 ][1 ] = READ_IF_EXISTS (pSettings, r_fvector3, section, xr_strconcat (val_name, " strafe_aim_hud_offset_rot " , _prefix), Fvector (). set ( 0 .f , 0 .f , 2 . 5f ));
553
+ // //////////////////////////////////////////
554
+ m_lookout_offset [0 ][0 ] = READ_IF_EXISTS (pSettings, r_fvector3, section, " lookout_hud_offset_pos " , (Fvector{ 0 . 045f , 0 .f , 0 .f } ));
555
+ m_lookout_offset [1 ][0 ] = READ_IF_EXISTS (pSettings, r_fvector3, section, " lookout_hud_offset_rot " , (Fvector{ 0 .f , 0 .f , 10 . f } ));
554
556
555
- // Параметры стрейфа
556
- float fFullStrafeTime = READ_IF_EXISTS (pSettings, r_float, section, " strafe_transition_time" , 0 .25f );
557
- float fFullStrafeTime_aim = READ_IF_EXISTS (pSettings, r_float, section, " strafe_aim_transition_time" , 0 .15f );
558
- bool bStrafeEnabled = READ_IF_EXISTS (pSettings, r_bool, section, " strafe_enabled" , READ_IF_EXISTS (pSettings, r_bool, " features" , " default_strafe_enabled" , true ));
559
- bool bStrafeEnabled_aim = READ_IF_EXISTS (pSettings, r_bool, section, " strafe_aim_enabled" , false );
557
+ m_lookout_offset[0 ][1 ] = READ_IF_EXISTS (pSettings, r_fvector3, section, " lookout_aim_hud_offset_pos" , (Fvector{ 0 .f , 0 .f , 0 .f }));
558
+ m_lookout_offset[1 ][1 ] = READ_IF_EXISTS (pSettings, r_fvector3, section, " lookout_aim_hud_offset_rot" , (Fvector{ 0 .f , 0 .f , 15 .f }));
560
559
561
- m_strafe_offset[2 ][0 ].set (bStrafeEnabled, fFullStrafeTime , 0 .f ); // normal
562
- m_strafe_offset[2 ][1 ].set (bStrafeEnabled_aim, fFullStrafeTime_aim , 0 .f ); // aim-GL
563
- // --#SM+# End--
560
+ m_lookout_offset[2 ][0 ].set (READ_IF_EXISTS (pSettings, r_bool, section, " lookout_enabled" , true ), READ_IF_EXISTS (pSettings, r_float, section, " lookout_transition_time" , 0 .25f ), 0 .f ); // normal
561
+ m_lookout_offset[2 ][1 ].set (READ_IF_EXISTS (pSettings, r_bool, section, " lookout_aim_enabled" , true ), READ_IF_EXISTS (pSettings, r_float, section, " lookout_aim_transition_time" , 0 .15f ), 0 .f ); // aim-GL
564
562
// //////////////////////////////////////////
565
563
566
564
if (!laser_light_render && pSettings->line_exist (section, " laser_light_section" ))
@@ -1927,135 +1925,206 @@ u8 CWeapon::GetCurrentHudOffsetIdx()
1927
1925
1928
1926
1929
1927
// Обновление координат текущего худа
1930
- void CWeapon::UpdateHudAdditonal (Fmatrix& trans)
1928
+ void CWeapon::UpdateHudAdditonal (Fmatrix& trans)
1931
1929
{
1932
- auto pActor = smart_cast<const CActor*>(H_Parent ());
1933
- if (!pActor) return ;
1930
+ Fvector summary_offset{}, summary_rotate{};
1934
1931
1932
+ attachable_hud_item* hi = HudItemData ();
1935
1933
u8 idx = GetCurrentHudOffsetIdx ();
1934
+ const bool b_aiming = idx != hud_item_measures::m_hands_offset_type_normal;
1935
+ Fvector zr_offs = hi->m_measures .m_hands_offset [hud_item_measures::m_hands_offset_pos][idx];
1936
+ Fvector zr_rot = hi->m_measures .m_hands_offset [hud_item_measures::m_hands_offset_rot][idx];
1936
1937
1937
- // ============= Поворот ствола во время аима =============//
1938
- if ( (pActor->IsZoomAimingMode () && m_fZoomRotationFactor<=1 .f ) ||
1939
- (!pActor->IsZoomAimingMode () && m_fZoomRotationFactor>0 .f ))
1938
+ // ============ Поворот ствола во время аима ===========//
1939
+ if (b_aiming)
1940
1940
{
1941
- attachable_hud_item* hi = HudItemData ();
1942
- R_ASSERT (hi);
1943
- Fvector curr_offs, curr_rot;
1944
- curr_offs = hi->m_measures .m_hands_offset [hud_item_measures::m_hands_offset_pos][idx];
1945
- curr_rot = hi->m_measures .m_hands_offset [hud_item_measures::m_hands_offset_rot][idx];
1946
- curr_offs.mul (m_fZoomRotationFactor);
1947
- curr_rot.mul (m_fZoomRotationFactor);
1941
+ if (IsZoomed ())
1942
+ m_fZoomRotationFactor += Device.fTimeDelta /m_fZoomRotateTime;
1943
+ else
1944
+ m_fZoomRotationFactor -= Device.fTimeDelta /m_fZoomRotateTime;
1948
1945
1949
- Fmatrix hud_rotation;
1950
- hud_rotation.identity ();
1951
- hud_rotation.rotateX (curr_rot.x );
1946
+ clamp (m_fZoomRotationFactor, 0 .f , 1 .f );
1952
1947
1953
- Fmatrix hud_rotation_y;
1954
- hud_rotation_y.identity ();
1955
- hud_rotation_y.rotateY (curr_rot.y );
1956
- hud_rotation.mulA_43 (hud_rotation_y);
1948
+ zr_offs.mul (m_fZoomRotationFactor);
1949
+ zr_rot.mul (m_fZoomRotationFactor);
1957
1950
1958
- hud_rotation_y. identity ( );
1959
- hud_rotation_y. rotateZ (curr_rot. z );
1960
- hud_rotation. mulA_43 (hud_rotation_y);
1951
+ summary_offset. add (zr_offs );
1952
+ }
1953
+ // ====================================================//
1961
1954
1962
- hud_rotation.translate_over (curr_offs);
1963
- trans.mulB_43 (hud_rotation);
1955
+ auto pActor = smart_cast<const CActor*>(H_Parent ());
1956
+ const u32 iMovingState = pActor->MovingState ();
1957
+ idx = b_aiming ? 1ui8 : 0ui8;
1964
1958
1965
- if (pActor->IsZoomAimingMode ())
1966
- {
1967
- m_fZoomRotationFactor += Device.fTimeDelta /m_fZoomRotateTime;
1959
+ // ============= Боковой стрейф с оружием =============//
1960
+ {
1961
+ const bool bEnabled = m_strafe_offset[2 ][idx].x ;
1962
+ if (!bEnabled)
1963
+ goto LOOKOUT_EFFECT;
1964
+
1965
+ // Рассчитываем фактор боковой ходьбы
1966
+ float fStrafeMaxTime = m_strafe_offset[2 ][idx].y ; // Макс. время в секундах, за которое мы наклонимся из центрального положения
1967
+ if (fStrafeMaxTime <= EPS)
1968
+ fStrafeMaxTime = 0 .01f ;
1969
+
1970
+ const float fStepPerUpd = Device.fTimeDelta / fStrafeMaxTime ; // Величина изменение фактора поворота
1971
+
1972
+ if (iMovingState & mcLStrafe)
1973
+ { // Движемся влево
1974
+ float fVal = (m_fLR_MovingFactor > 0 .f ? fStepPerUpd * 3 : fStepPerUpd );
1975
+ m_fLR_MovingFactor -= fVal ;
1976
+ }
1977
+ else if (iMovingState & mcRStrafe)
1978
+ { // Движемся вправо
1979
+ float fVal = (m_fLR_MovingFactor < 0 .f ? fStepPerUpd * 3 : fStepPerUpd );
1980
+ m_fLR_MovingFactor += fVal ;
1968
1981
}
1969
1982
else
1970
- {
1971
- m_fZoomRotationFactor -= Device.fTimeDelta /m_fZoomRotateTime;
1983
+ { // Двигаемся в любом другом направлении
1984
+ if (m_fLR_MovingFactor < 0 .0f )
1985
+ {
1986
+ m_fLR_MovingFactor += fStepPerUpd ;
1987
+ clamp (m_fLR_MovingFactor, -1 .0f , 0 .0f );
1988
+ }
1989
+ else
1990
+ {
1991
+ m_fLR_MovingFactor -= fStepPerUpd ;
1992
+ clamp (m_fLR_MovingFactor, 0 .0f , 1 .0f );
1993
+ }
1972
1994
}
1973
- clamp (m_fZoomRotationFactor, 0 .f , 1 .f );
1974
- }
1975
1995
1976
- // Боковой стрейф с оружием
1977
- clamp (idx, 0ui8, 1ui8);
1996
+ clamp (m_fLR_MovingFactor, -1 .0f , 1 .0f ); // Фактор боковой ходьбы не должен превышать эти лимиты
1978
1997
1979
- // Рассчитываем фактор боковой ходьбы
1980
- float fStrafeMaxTime = /* hi->m_measures.*/ m_strafe_offset[2 ][idx].y ; // Макс. время в секундах, за которое мы наклонимся из центрального положения
1981
- if (fStrafeMaxTime <= EPS)
1982
- fStrafeMaxTime = 0 .01f ;
1998
+ // Смещение позиции худа в стрейфе
1999
+ Fvector moving_offs = m_strafe_offset[0 ][idx]; // pos
2000
+ moving_offs.mul (m_fLR_MovingFactor); // Умножаем на фактор стрейфа
1983
2001
1984
- float fStepPerUpd = Device.fTimeDelta / fStrafeMaxTime ; // Величина изменение фактора поворота
2002
+ // Поворот худа в стрейфе
2003
+ Fvector moving_rot = m_strafe_offset[1 ][idx]; // rot
2004
+ moving_rot.mul (-PI / 180 .f ); // Преобразуем углы в радианы
2005
+ moving_rot.mul (m_fLR_MovingFactor); // Умножаем на фактор стрейфа
1985
2006
1986
- u32 iMovingState = pActor->MovingState ();
1987
- if ((iMovingState & mcLStrafe) != 0 )
1988
- { // Движемся влево
1989
- float fVal = (m_fLR_MovingFactor > 0 .f ? fStepPerUpd * 3 : fStepPerUpd );
1990
- m_fLR_MovingFactor -= fVal ;
1991
- }
1992
- else if ((iMovingState & mcRStrafe) != 0 )
1993
- { // Движемся вправо
1994
- float fVal = (m_fLR_MovingFactor < 0 .f ? fStepPerUpd * 3 : fStepPerUpd );
1995
- m_fLR_MovingFactor += fVal ;
1996
- }
1997
- else
1998
- { // Двигаемся в любом другом направлении
1999
- if (m_fLR_MovingFactor < 0 .0f )
2000
- {
2001
- m_fLR_MovingFactor += fStepPerUpd ;
2002
- clamp (m_fLR_MovingFactor, -1 .0f , 0 .0f );
2007
+ if (idx == 0 )
2008
+ { // От бедра
2009
+ moving_offs.mul (1 .f - m_fZoomRotationFactor);
2010
+ moving_rot.mul (1 .f - m_fZoomRotationFactor);
2003
2011
}
2004
2012
else
2005
- {
2006
- m_fLR_MovingFactor -= fStepPerUpd ;
2007
- clamp (m_fLR_MovingFactor, 0 . 0f , 1 . 0f );
2013
+ { // Во время аима
2014
+ moving_offs. mul (m_fZoomRotationFactor) ;
2015
+ moving_rot. mul (m_fZoomRotationFactor );
2008
2016
}
2009
- }
2010
2017
2011
- clamp (m_fLR_MovingFactor, -1 .0f , 1 .0f ); // Фактор боковой ходьбы не должен превышать эти лимиты
2018
+ summary_offset.add (moving_offs);
2019
+ summary_rotate.add (moving_rot);
2020
+ }
2021
+ // ====================================================//
2012
2022
2013
- // Производим наклон ствола для нормального режима и аима
2014
- for ( int _idx = 0 ; _idx <= 1 ; _idx++)
2023
+ LOOKOUT_EFFECT:
2024
+ // =============== Эффекты выглядываний ===============//
2015
2025
{
2016
- bool bEnabled = m_strafe_offset [2 ][_idx ].x ;
2026
+ const bool bEnabled = m_lookout_offset [2 ][idx ].x ;
2017
2027
if (!bEnabled)
2018
- continue ;
2028
+ goto APPLY_EFFECTS ;
2019
2029
2020
- Fvector curr_offs, curr_rot;
2030
+ float fLookoutMaxTime = m_lookout_offset[2 ][idx].y ; // Макс. время в секундах, за которое мы наклонимся из центрального положения
2031
+ if (fLookoutMaxTime <= EPS)
2032
+ fLookoutMaxTime = 0 .01f ;
2021
2033
2022
- // Смещение позиции худа в стрейфе
2023
- curr_offs = m_strafe_offset[0 ][_idx]; // pos
2024
- curr_offs.mul (m_fLR_MovingFactor); // Умножаем на фактор стрейфа
2034
+ const float fStepPerUpdL = Device.fTimeDelta / fLookoutMaxTime ; // Величина изменение фактора поворота
2025
2035
2026
- // Поворот худа в стрейфе
2027
- curr_rot = m_strafe_offset[1 ][_idx]; // rot
2028
- curr_rot.mul (-PI / 180 .f ); // Преобразуем углы в радианы
2029
- curr_rot.mul (m_fLR_MovingFactor); // Умножаем на фактор стрейфа
2036
+ if ((iMovingState & mcLLookout) && !(iMovingState & mcRLookout))
2037
+ { // Выглядываем влево
2038
+ float fVal = (m_fLookout_MovingFactor > 0 .f ? fStepPerUpdL * 3 : fStepPerUpdL );
2039
+ m_fLookout_MovingFactor -= fVal ;
2040
+ }
2041
+ else if ((iMovingState & mcRLookout) && !(iMovingState & mcLLookout))
2042
+ { // Выглядываем вправо
2043
+ float fVal = (m_fLookout_MovingFactor < 0 .f ? fStepPerUpdL * 3 : fStepPerUpdL );
2044
+ m_fLookout_MovingFactor += fVal ;
2045
+ }
2046
+ else
2047
+ { // Двигаемся в любом другом направлении
2048
+ if (m_fLookout_MovingFactor < 0 .0f )
2049
+ {
2050
+ m_fLookout_MovingFactor += fStepPerUpdL ;
2051
+ clamp (m_fLookout_MovingFactor, -1 .0f , 0 .0f );
2052
+ }
2053
+ else
2054
+ {
2055
+ m_fLookout_MovingFactor -= fStepPerUpdL ;
2056
+ clamp (m_fLookout_MovingFactor, 0 .0f , 1 .0f );
2057
+ }
2058
+ }
2059
+
2060
+ clamp (m_fLookout_MovingFactor, -1 .0f , 1 .0f ); // не должен превышать эти лимиты
2061
+
2062
+ float koef{ 1 .f };
2063
+ if ((iMovingState & mcCrouch) && (iMovingState & mcAccel))
2064
+ koef = 0.5 ; // во сколько раз менять амплитуду при полном присяде
2065
+ else if (iMovingState & mcCrouch)
2066
+ koef = 0.75 ; // во сколько раз менять амплитуду при присяде
2067
+
2068
+ // Смещение позиции худа
2069
+ Fvector lookout_offs = m_lookout_offset[0 ][idx]; // pos
2070
+ lookout_offs.mul (koef);
2071
+ lookout_offs.mul (m_fLookout_MovingFactor); // Умножаем на фактор наклона
2030
2072
2031
- if (_idx == 0 )
2073
+ // Поворот худа
2074
+ Fvector lookout_rot = m_lookout_offset[1 ][idx]; // rot
2075
+ lookout_rot.mul (koef);
2076
+ lookout_rot.mul (-PI / 180 .f ); // Преобразуем углы в радианы
2077
+ lookout_rot.mul (m_fLookout_MovingFactor); // Умножаем на фактор наклона
2078
+
2079
+ if (idx == 0 )
2032
2080
{ // От бедра
2033
- curr_offs .mul (1 .f - m_fZoomRotationFactor);
2034
- curr_rot .mul (1 .f - m_fZoomRotationFactor);
2081
+ lookout_offs .mul (1 .f - m_fZoomRotationFactor);
2082
+ lookout_rot .mul (1 .f - m_fZoomRotationFactor);
2035
2083
}
2036
2084
else
2037
2085
{ // Во время аима
2038
- curr_offs .mul (m_fZoomRotationFactor);
2039
- curr_rot .mul (m_fZoomRotationFactor);
2086
+ lookout_offs .mul (m_fZoomRotationFactor);
2087
+ lookout_rot .mul (m_fZoomRotationFactor);
2040
2088
}
2041
2089
2042
- Fmatrix hud_rotation;
2043
- Fmatrix hud_rotation_y;
2090
+ summary_offset.add (lookout_offs);
2091
+ summary_rotate.add (lookout_rot);
2092
+ }
2093
+ // ====================================================//
2094
+
2095
+ APPLY_EFFECTS:
2096
+ // ================ Применение эффектов ===============//
2097
+ {
2098
+ // поворот с сохранением смещения by Zander
2099
+ Fvector _angle{}, _pos{ trans.c };
2100
+ trans.getHPB (_angle);
2101
+ _angle.add (-summary_rotate);
2102
+ // Msg("##[%s] summary_rotate: [%f,%f,%f]", __FUNCTION__, summary_rotate.x, summary_rotate.y, summary_rotate.z);
2103
+ trans.setHPB (_angle.x , _angle.y , _angle.z );
2104
+ trans.c = _pos;
2044
2105
2106
+ Fmatrix hud_rotation;
2045
2107
hud_rotation.identity ();
2046
- hud_rotation.rotateX (curr_rot.x );
2047
2108
2048
- hud_rotation_y. identity ();
2049
- hud_rotation_y. rotateY (curr_rot. y );
2050
- hud_rotation.mulA_43 (hud_rotation_y );
2109
+ if (b_aiming)
2110
+ {
2111
+ hud_rotation.rotateX (zr_rot. x );
2051
2112
2052
- hud_rotation_y.identity ();
2053
- hud_rotation_y.rotateZ (curr_rot.z );
2054
- hud_rotation.mulA_43 (hud_rotation_y);
2113
+ Fmatrix hud_rotation_y;
2114
+ hud_rotation_y.identity ();
2115
+ hud_rotation_y.rotateY (zr_rot.y );
2116
+ hud_rotation.mulA_43 (hud_rotation_y);
2055
2117
2056
- hud_rotation.translate_over (curr_offs);
2118
+ hud_rotation_y.identity ();
2119
+ hud_rotation_y.rotateZ (zr_rot.z );
2120
+ hud_rotation.mulA_43 (hud_rotation_y);
2121
+ // Msg("~~[%s] zr_rot: [%f,%f,%f]", __FUNCTION__, zr_rot.x, zr_rot.y, zr_rot.z);
2122
+ }
2123
+ // Msg("--[%s] summary_offset: [%f,%f,%f]", __FUNCTION__, summary_offset.x, summary_offset.y, summary_offset.z);
2124
+ hud_rotation.translate_over (summary_offset);
2057
2125
trans.mulB_43 (hud_rotation);
2058
2126
}
2127
+ // ====================================================//
2059
2128
}
2060
2129
2061
2130
void CWeapon::SetAmmoElapsed (int ammo_count)
0 commit comments