Skip to content

Commit 5749b5d

Browse files
committed
Revert posOverride from 900c327, offset camera instead of body to resolve IK bugs
1 parent 0360ce5 commit 5749b5d

File tree

8 files changed

+40
-44
lines changed

8 files changed

+40
-44
lines changed

src/xrGame/Actor.cpp

Lines changed: 12 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,6 @@ constexpr float default_feedback_duration = 0.2f;
8383

8484
extern float cammera_into_collision_shift;
8585
extern int g_first_person_death;
86-
extern float g_first_person_body_offset;
8786

8887
string32 ACTOR_DEFS::g_quick_use_slots[4] = {};
8988
// skeleton
@@ -1517,16 +1516,7 @@ void CActor::shedule_Update(u32 DT)
15171516
void CActor::renderable_Render(u32 context_id, IRenderable* root)
15181517
{
15191518
VERIFY(_valid(XFORM()));
1520-
1521-
if (FirstPersonBodyActive())
1522-
{
1523-
ScopeLock lock{ &render_lock };
1524-
GEnv.Render->add_Visual(context_id, root, Visual(), firstPersonBodyXform);
1525-
Visual()->getVisData().hom_frame = Device.dwFrame;
1526-
}
1527-
else
1528-
inherited::renderable_Render(context_id, root);
1529-
1519+
inherited::renderable_Render(context_id, root);
15301520
CInventoryOwner::renderable_Render(context_id, root);
15311521
}
15321522

@@ -1567,11 +1557,10 @@ void CActor::RenderFirstPersonBody(u32 context_id, IRenderable* root)
15671557

15681558
// adjust body position
15691559
Fvector camdir = { cam_Active()->Direction().x, 0.f, cam_Active()->Direction().z }; // ignore Y (vertical) value
1570-
firstPersonBodyXform = XFORM();
1571-
firstPersonBodyXform.translate_add(camdir.normalize().mul(g_first_person_body_offset));
1560+
m_firstPersonBodyXform = XFORM();
15721561

15731562
// Add body to render
1574-
GEnv.Render->add_Visual(context_id, root, m_firstPersonBody, firstPersonBodyXform);
1563+
GEnv.Render->add_Visual(context_id, root, m_firstPersonBody, m_firstPersonBodyXform);
15751564
m_firstPersonBody->getVisData().hom_frame = Device.dwFrame;
15761565

15771566
// Copy transforms from actual body visual, excluding bones we don't want to animate
@@ -1588,23 +1577,25 @@ void CActor::RenderFirstPersonBody(u32 context_id, IRenderable* root)
15881577
for (auto [boneId, vis] : m_firstPersonBodyBonesToHide)
15891578
kinematics->LL_SetBoneVisible(boneId, !vis, true);
15901579

1591-
// Update head position
1592-
headPosition.set(firstPersonBodyXform);
1593-
headPosition.mulB_43(realBodyK->LL_GetTransform_R(realBodyK->LL_BoneID("bip01_head")));
1580+
// Update camera position
1581+
m_firstPersonCameraXform.set(m_firstPersonBodyXform);
1582+
m_firstPersonCameraXform.mulB_43(realBodyK->LL_GetTransform(realBodyK->LL_BoneID("eyelid_1"))); // should be a bone that is inbetween the eye bones (maybe more accurate than using bip01_head)
15941583

15951584
#ifdef DEBUG
15961585
Fvector ypr;
1597-
firstPersonBodyXform.getHPB(ypr);
1586+
m_firstPersonBodyXform.getHPB(ypr);
15981587
string1024 text;
15991588
CGameFont* F = UI().Font().pFontArial14;
16001589
F->SetAligment(CGameFont::alLeft);
16011590
F->OutSetI(-.9, 0);
16021591
F->SetColor(color_rgba(255, 0, 0, 255));
1603-
xr_sprintf(text, "first person body position [%3.3f %3.3f %3.3f]", firstPersonBodyXform.c.x, firstPersonBodyXform.c.y, firstPersonBodyXform.c.z);
1592+
xr_sprintf(text, "first person body position [%3.3f %3.3f %3.3f]", m_firstPersonBodyXform.c.x, m_firstPersonBodyXform.c.y, m_firstPersonBodyXform.c.z);
1593+
F->OutNext(text);
1594+
xr_sprintf(text, "first person body direction [%3.3f %3.3f %3.3f]", m_firstPersonBodyXform.k.x, m_firstPersonBodyXform.k.y, m_firstPersonBodyXform.k.z);
16041595
F->OutNext(text);
1605-
xr_sprintf(text, "first person body direction [%3.3f %3.3f %3.3f]", firstPersonBodyXform.k.x, firstPersonBodyXform.k.y, firstPersonBodyXform.k.z);
1596+
xr_sprintf(text, "head position [%3.3f %3.3f %3.3f]", m_firstPersonCameraXform.c.x, m_firstPersonCameraXform.c.y, m_firstPersonCameraXform.c.z);
16061597
F->OutNext(text);
1607-
xr_sprintf(text, "head position [%3.3f %3.3f %3.3f]", headPosition.c.x, headPosition.c.y, headPosition.c.z);
1598+
xr_sprintf(text, "head direction [%3.3f %3.3f %3.3f]", m_firstPersonCameraXform.k.x, m_firstPersonCameraXform.k.y, m_firstPersonCameraXform.k.z);
16081599
F->OutNext(text);
16091600
xr_sprintf(text, "camera position [%3.3f %3.3f %3.3f]", cam_Active()->Position().x, cam_Active()->Position().y, cam_Active()->Position().z);
16101601
F->OutNext(text);

src/xrGame/Actor.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -109,8 +109,8 @@ class CActor : public CEntityAlive,
109109
IRenderVisual* m_firstPersonBody{};
110110
xr_unordered_map<u16, bool> m_firstPersonBodyBonesToHide;
111111
xr_unordered_map<u16, bool> m_firstPersonBodyBonesToIgnoreAnims;
112-
Fmatrix firstPersonBodyXform{};
113-
Fmatrix headPosition{};
112+
Fmatrix m_firstPersonBodyXform{};
113+
Fmatrix m_firstPersonCameraXform{};
114114
Lock render_lock{};
115115

116116
void feel_sound_new(IGameObject* who, int type, const CSound_UserDataPtr& user_data,

src/xrGame/ActorCameras.cpp

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,9 @@
2424
#include "xrPhysics/ActorCameraCollision.h"
2525
#include "IKLimbsController.h"
2626
#include "GamePersistent.h"
27+
#include "Actor.h"
28+
29+
extern Fvector g_first_person_cam_offset;
2730

2831
void CActor::cam_Set(EActorCameras style)
2932
{
@@ -318,7 +321,6 @@ void CActor::cam_Update(float dt, float fFOV)
318321
}
319322

320323
Fvector point = { 0, CurrentHeight + current_ik_cam_shift, 0 };
321-
322324
Fvector dangle = {0, 0, 0};
323325
Fmatrix xform;
324326
xform.setXYZ(0, r_torso.yaw, 0);
@@ -360,6 +362,22 @@ void CActor::cam_Update(float dt, float fFOV)
360362

361363
CCameraBase* C = cam_Active();
362364

365+
if (psActorFlags.test(AF_FIRST_PERSON_BODY) && eacFirstEye == cam_active) // override camera position / direction for first person body
366+
{
367+
if (!g_Alive()) //first person death cam
368+
{
369+
point = m_firstPersonCameraXform.c;
370+
dangle = m_firstPersonCameraXform.k;
371+
}
372+
else
373+
{
374+
point = m_firstPersonCameraXform.c;
375+
point.y += g_first_person_cam_offset.y;
376+
Fvector camdir = { cam_Active()->Direction().x, 0.f, cam_Active()->Direction().z }; // ignore Y (vertical) value
377+
point.add(camdir.normalize().mul(g_first_person_cam_offset.z));
378+
}
379+
}
380+
363381
C->Update(point, dangle);
364382
C->f_fov = fFOV;
365383

@@ -370,10 +388,7 @@ void CActor::cam_Update(float dt, float fFOV)
370388
}
371389
if (Level().CurrentEntity() == this)
372390
{
373-
if (m_firstPersonBody)
374-
collide_camera(*cameras[eacFirstEye], _viewport_near, this, headPosition.c);
375-
else
376-
collide_camera(*cameras[eacFirstEye], _viewport_near, this);
391+
collide_camera(*cameras[eacFirstEye], _viewport_near, this);
377392
}
378393
if (psActorFlags.test(AF_PSP))
379394
{

src/xrGame/CameraFirstEye.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ class CCameraFirstEye : public CCameraBase
99
Fvector lookat_point;
1010
bool lookat_active;
1111
void UpdateLookat();
12+
void UpdateFirstPerson(Fvector& point, Fvector& noise_dangle);
1213

1314
public:
1415
CCameraFirstEye(IGameObject* p, u32 flags = 0);

src/xrGame/Weapon.cpp

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@
3232
#define ROTATION_TIME 0.25f
3333

3434
BOOL b_toggle_weapon_aim = FALSE;
35-
extern float g_first_person_body_offset;
3635

3736
static class CUIWpnScopeXmlManager : public CUIResetNotifier, public pureAppEnd
3837
{
@@ -189,13 +188,6 @@ void CWeapon::UpdateXForm()
189188
mRes.mulA_43(E->XFORM());
190189
}
191190

192-
if (auto actorOwner = smart_cast<CActor*>(H_Parent()))
193-
if (actorOwner->FirstPersonBodyActive())
194-
{
195-
Fvector camdir = { actorOwner->cam_Active()->Direction().x, 0.f, actorOwner->cam_Active()->Direction().z }; // ignore Y (vertical) value
196-
mRes.c.add(camdir.normalize().mul(g_first_person_body_offset)); // push model back so it doesn't look weird (default value: -0.75f)
197-
}
198-
199191
UpdatePosition(mRes);
200192
}
201193

src/xrGame/console_commands.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ int g_first_person_death = 0;
112112
int g_normalize_mouse_sens = 0;
113113
int g_normalize_upgrade_mouse_sens = 0;
114114

115-
float g_first_person_body_offset = -0.75f;
115+
Fvector g_first_person_cam_offset = { 0.f, 0.f, 0.f };
116116

117117
void register_mp_console_commands();
118118
//-----------------------------------------------------------
@@ -2298,7 +2298,7 @@ void CCC_RegisterCommands()
22982298

22992299
CMD3(CCC_Mask, "ai_use_torch_dynamic_lights", &g_uCommonFlags, flAiUseTorchDynamicLights);
23002300

2301-
CMD4(CCC_Float, "g_first_person_body_offset", &g_first_person_body_offset, -10.f, 10.f);
2301+
CMD4(CCC_Vector3, "g_first_person_cam_offset", &g_first_person_cam_offset, Fvector().set(-10, -10, -10), Fvector().set(10, 10, 10));
23022302

23032303
#ifndef MASTER_GOLD
23042304
CMD4(CCC_Vector3, "psp_cam_offset", &CCameraLook2::m_cam_offset, Fvector().set(-1000, -1000, -1000),

src/xrPhysics/ActorCameraCollision.cpp

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -332,7 +332,7 @@ bool test_camera_collide(
332332
return test_camera_box(box_size, xform, l_actor);
333333
}
334334

335-
void collide_camera(CCameraBase& camera, float _viewport_near, IPhysicsShellHolder* l_actor, Fvector posOverride)
335+
void collide_camera(CCameraBase& camera, float _viewport_near, IPhysicsShellHolder* l_actor)
336336
{
337337
// CPhysicsShellHolder* l_actor = smart_cast<CPhysicsShellHolder*>( Level().CurrentEntity() );
338338
VERIFY(l_actor);
@@ -366,9 +366,6 @@ void collide_camera(CCameraBase& camera, float _viewport_near, IPhysicsShellHold
366366
if (dbg_draw_camera_collision)
367367
shell->dbg_draw_geometry(1, color_xrgb(0, 255, 0));
368368
#endif
369-
if (posOverride.magnitude() > 0.f)
370-
roote->GetGlobalPositionDynamic(&posOverride);
371-
else
372-
roote->GetGlobalPositionDynamic(&camera.vPosition);
369+
roote->GetGlobalPositionDynamic(&camera.vPosition);
373370
camera.vPosition.mad(camera.Direction(), -_viewport_near / 2.f);
374371
}

src/xrPhysics/ActorCameraCollision.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,4 @@ extern XRPHYSICS_API float camera_collision_character_shift_z;
1010
#endif
1111
XRPHYSICS_API bool test_camera_box(const Fvector& box_size, const Fmatrix& xform, IPhysicsShellHolder* l_actor);
1212
XRPHYSICS_API bool test_camera_collide(CCameraBase& camera, float _viewport_near, IPhysicsShellHolder* l_actor, Fvector& vPosOffset, float fBoxSizeMod); //--#SM+#--
13-
XRPHYSICS_API void collide_camera(CCameraBase& camera, float _viewport_near, IPhysicsShellHolder* l_actor, Fvector posOverride = Fvector{});
13+
XRPHYSICS_API void collide_camera(CCameraBase& camera, float _viewport_near, IPhysicsShellHolder* l_actor);

0 commit comments

Comments
 (0)