Skip to content

Commit 7493ce8

Browse files
Сделали ганслингер-стайл эффекты выглядываний
Способ поворота матрицы с сохранением смещения подсказал @Zander-driver . Добавились новые параметры для оружия: ```ini lookout_enabled = true lookout_transition_time = 0.25 lookout_hud_offset_pos = 0.045, 0.0, 0.0 lookout_hud_offset_rot = 0.0, 0.0, 10.0 lookout_aim_enabled = true lookout_aim_transition_time = 0.15 lookout_aim_hud_offset_pos = 0.0, 0.0, 0.0 lookout_aim_hud_offset_rot = 0.0, 0.0, 15.0 ``` Co-Authored-By: Zander-driver <77239550+Zander-driver@users.noreply.github.com>
1 parent 039f307 commit 7493ce8

File tree

3 files changed

+179
-111
lines changed

3 files changed

+179
-111
lines changed

Game/Resources_SoC_1.0006/gamedata/config/external.ltx

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -155,9 +155,6 @@ default_allow_zoom_inertion = true
155155
; Инерция при прицеливании в присоединяемые нетекстурные прицелы (3д прицелы и тп)
156156
default_allow_scope_zoom_inertion = true
157157

158-
; Наклоны оружия при стрейфах.
159-
default_strafe_enabled = true
160-
161158
; Изменение HUD FOV когда игрок стоит вплотную к стене.
162159
default_nearwall_on = true
163160
;-------------------------------------------------------------------------------------

ogsr_engine/xrGame/Weapon.cpp

Lines changed: 175 additions & 106 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ extern ENGINE_API Fvector3 w_timers;
4343
// Construction/Destruction
4444
//////////////////////////////////////////////////////////////////////
4545

46-
CWeapon::CWeapon(LPCSTR name) : m_fLR_MovingFactor(0.f), m_strafe_offset{}
46+
CWeapon::CWeapon(LPCSTR name)
4747
{
4848
SetState (eHidden);
4949
SetNextState (eHidden);
@@ -539,28 +539,26 @@ void CWeapon::Load (LPCSTR section)
539539

540540
////////////////////////////////////////////
541541
//--#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 }));
544544

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 }));
546547

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+
////////////////////////////////////////////
550552

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 }));
554556

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 }));
560559

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
564562
////////////////////////////////////////////
565563

566564
if (!laser_light_render && pSettings->line_exist(section, "laser_light_section"))
@@ -1927,135 +1925,206 @@ u8 CWeapon::GetCurrentHudOffsetIdx()
19271925

19281926

19291927
// Обновление координат текущего худа
1930-
void CWeapon::UpdateHudAdditonal (Fmatrix& trans)
1928+
void CWeapon::UpdateHudAdditonal(Fmatrix& trans)
19311929
{
1932-
auto pActor = smart_cast<const CActor*>(H_Parent());
1933-
if(!pActor) return;
1930+
Fvector summary_offset{}, summary_rotate{};
19341931

1932+
attachable_hud_item* hi = HudItemData();
19351933
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];
19361937

1937-
//============= Поворот ствола во время аима =============//
1938-
if( (pActor->IsZoomAimingMode() && m_fZoomRotationFactor<=1.f) ||
1939-
(!pActor->IsZoomAimingMode() && m_fZoomRotationFactor>0.f))
1938+
//============ Поворот ствола во время аима ===========//
1939+
if(b_aiming)
19401940
{
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;
19481945

1949-
Fmatrix hud_rotation;
1950-
hud_rotation.identity();
1951-
hud_rotation.rotateX(curr_rot.x);
1946+
clamp(m_fZoomRotationFactor, 0.f, 1.f);
19521947

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);
19571950

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+
//====================================================//
19611954

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;
19641958

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;
19681981
}
19691982
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+
}
19721994
}
1973-
clamp(m_fZoomRotationFactor, 0.f, 1.f);
1974-
}
19751995

1976-
// Боковой стрейф с оружием
1977-
clamp(idx, 0ui8, 1ui8);
1996+
clamp(m_fLR_MovingFactor, -1.0f, 1.0f); // Фактор боковой ходьбы не должен превышать эти лимиты
19781997

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); // Умножаем на фактор стрейфа
19832001

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); // Умножаем на фактор стрейфа
19852006

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);
20032011
}
20042012
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);
20082016
}
2009-
}
20102017

2011-
clamp(m_fLR_MovingFactor, -1.0f, 1.0f); // Фактор боковой ходьбы не должен превышать эти лимиты
2018+
summary_offset.add(moving_offs);
2019+
summary_rotate.add(moving_rot);
2020+
}
2021+
//====================================================//
20122022

2013-
// Производим наклон ствола для нормального режима и аима
2014-
for (int _idx = 0; _idx <= 1; _idx++)
2023+
LOOKOUT_EFFECT:
2024+
//=============== Эффекты выглядываний ===============//
20152025
{
2016-
bool bEnabled = m_strafe_offset[2][_idx].x;
2026+
const bool bEnabled = m_lookout_offset[2][idx].x;
20172027
if (!bEnabled)
2018-
continue;
2028+
goto APPLY_EFFECTS;
20192029

2020-
Fvector curr_offs, curr_rot;
2030+
float fLookoutMaxTime = m_lookout_offset[2][idx].y; // Макс. время в секундах, за которое мы наклонимся из центрального положения
2031+
if (fLookoutMaxTime <= EPS)
2032+
fLookoutMaxTime = 0.01f;
20212033

2022-
// Смещение позиции худа в стрейфе
2023-
curr_offs = m_strafe_offset[0][_idx]; //pos
2024-
curr_offs.mul(m_fLR_MovingFactor); // Умножаем на фактор стрейфа
2034+
const float fStepPerUpdL = Device.fTimeDelta / fLookoutMaxTime; // Величина изменение фактора поворота
20252035

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); // Умножаем на фактор наклона
20302072

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)
20322080
{ // От бедра
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);
20352083
}
20362084
else
20372085
{ // Во время аима
2038-
curr_offs.mul(m_fZoomRotationFactor);
2039-
curr_rot.mul(m_fZoomRotationFactor);
2086+
lookout_offs.mul(m_fZoomRotationFactor);
2087+
lookout_rot.mul(m_fZoomRotationFactor);
20402088
}
20412089

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;
20442105

2106+
Fmatrix hud_rotation;
20452107
hud_rotation.identity();
2046-
hud_rotation.rotateX(curr_rot.x);
20472108

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);
20512112

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);
20552117

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);
20572125
trans.mulB_43(hud_rotation);
20582126
}
2127+
//====================================================//
20592128
}
20602129

20612130
void CWeapon::SetAmmoElapsed (int ammo_count)

ogsr_engine/xrGame/Weapon.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -346,9 +346,11 @@ class CWeapon : public CHudItemObject,
346346
virtual void UpdatePosition (const Fmatrix& transform); //.
347347
virtual void UpdateXForm ();
348348

349-
float m_fLR_MovingFactor; // !!!!
350-
Fvector m_strafe_offset[3][2]; //pos,rot,data/ normal,aim-GL --#SM+#--
349+
private:
350+
float m_fLR_MovingFactor{}, m_fLookout_MovingFactor{};
351+
Fvector m_strafe_offset[3][2]{}, m_lookout_offset[3][2]{};
351352

353+
protected:
352354
virtual u8 GetCurrentHudOffsetIdx () override;
353355
virtual void UpdateHudAdditonal (Fmatrix&);
354356
virtual bool IsHudModeNow ();

0 commit comments

Comments
 (0)