mirror of
https://github.com/isledecomp/isle-portable.git
synced 2026-05-13 15:26:34 +00:00
* Decouple 3rd person camera from player movement Arrow keys now move the player relative to the camera direction instead of using tank controls. The camera stays static unless explicitly controlled via right-click drag, mouse wheel, or touch gestures. Adds a single hook in CalculateNewPosDir that lets the extension take over movement computation. The extension manages its own velocity smoothing, computes camera-relative directions from an absolute yaw, and writes nav controller velocities via friend class access. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * Clean up ThirdPersonCamera: remove dead m_orbitYaw, extract helpers Remove m_orbitYaw (always DEFAULT_ORBIT_YAW) and pass yaw directly to ComputeOrbitVectors, eliminating save/restore blocks at all call sites. Extract GetLocalYaw() and InitAbsoluteYaw() helpers to deduplicate repeated atan2 patterns. Simplify SetupCamera by passing DEFAULT_ORBIT_YAW directly. Move TURN_RATE constant to file scope. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * Hide cursor while orbiting 3rd person camera with right mouse button Move SDL event handling from LegoInputManager::UpdateLastInputMethod to an exported function called at the end of SDL_AppEvent, so cursor state changes aren't overridden by isleapp's SDL_ShowCursor(). Use SDL_SetWindowRelativeMouseMode to hide the cursor and freeze its position while the right mouse button is held in 3rd person camera mode. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
182 lines
4.9 KiB
C++
182 lines
4.9 KiB
C++
#ifndef __LEGONAVCONTROLLER_H
|
|
#define __LEGONAVCONTROLLER_H
|
|
|
|
#include "decomp.h"
|
|
#include "mxcore.h"
|
|
#include "mxtypes.h"
|
|
|
|
struct LegoLocation;
|
|
class Vector3;
|
|
namespace Multiplayer
|
|
{
|
|
class ThirdPersonCamera;
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// LegoMouseController
|
|
|
|
// VTABLE: LEGO1 0x100d85b8
|
|
// VTABLE: BETA10 0x101bcc80
|
|
// SIZE 0x70
|
|
class LegoNavController : public MxCore {
|
|
public:
|
|
LegoNavController();
|
|
~LegoNavController() override;
|
|
|
|
MxLong Notify(MxParam& p_param) override; // vtable+0x04
|
|
|
|
// FUNCTION: LEGO1 0x10054b80
|
|
// FUNCTION: BETA10 0x1009e5f0
|
|
const char* ClassName() const override // vtable+0x0c
|
|
{
|
|
// STRING: LEGO1 0x100f66d8
|
|
return "LegoNavController";
|
|
}
|
|
|
|
// FUNCTION: LEGO1 0x10054b90
|
|
MxBool IsA(const char* p_name) const override // vtable+0x10
|
|
{
|
|
return !strcmp(p_name, ClassName()) || MxCore::IsA(p_name);
|
|
}
|
|
|
|
void SetTargets(int p_hPos, int p_vPos, MxBool p_accel);
|
|
void SetControlMax(int p_hMax, int p_vMax);
|
|
void SetToDefaultParams();
|
|
MxBool CalculateNewPosDir(
|
|
const Vector3& p_curPos,
|
|
const Vector3& p_curDir,
|
|
Vector3& p_newPos,
|
|
Vector3& p_newDir,
|
|
const Vector3* p_up
|
|
);
|
|
|
|
static void GetDefaults(
|
|
int* p_dz,
|
|
float* p_lv,
|
|
float* p_rv,
|
|
float* p_la,
|
|
float* p_ra,
|
|
float* p_ld,
|
|
float* p_rd,
|
|
float* p_lmina,
|
|
float* p_rmina,
|
|
float* p_rs,
|
|
MxBool* p_urs
|
|
);
|
|
static void SetDefaults(
|
|
int p_dz,
|
|
float p_lv,
|
|
float p_rv,
|
|
float p_la,
|
|
float p_ra,
|
|
float p_ld,
|
|
float p_rd,
|
|
float p_lmina,
|
|
float p_rmina,
|
|
float p_rs,
|
|
MxBool p_urs
|
|
);
|
|
static MxResult UpdateLocation(MxU32 p_location);
|
|
static MxResult UpdateLocation(const char* p_location);
|
|
static MxS32 GetNumLocations();
|
|
static LegoLocation* GetLocation(MxU32 p_location);
|
|
|
|
// FUNCTION: BETA10 0x100b0f40
|
|
void SetLinearVel(MxFloat p_linearVel) { m_linearVel = p_linearVel; }
|
|
|
|
// FUNCTION: BETA10 0x100c99e0
|
|
void SetDeadZone(MxS32 p_deadZone) { m_deadZone = p_deadZone; }
|
|
|
|
// FUNCTION: BETA10 0x100c7880
|
|
void SetTrackDefault(MxS32 p_trackDefault) { m_trackDefault = p_trackDefault; }
|
|
|
|
// FUNCTION: BETA10 0x100178a0
|
|
void Reset()
|
|
{
|
|
m_trackDefault = TRUE;
|
|
SetToDefaultParams();
|
|
}
|
|
|
|
MxFloat GetLinearVel() { return m_linearVel; }
|
|
MxFloat GetRotationalVel() { return m_rotationalVel; }
|
|
MxFloat GetMaxLinearVel() { return m_maxLinearVel; }
|
|
MxFloat GetMaxLinearAccel() { return m_maxLinearAccel; }
|
|
MxFloat GetMaxLinearDeccel() { return m_maxLinearDeccel; }
|
|
void ResetMaxLinearVel(MxFloat p_maxLinearVel)
|
|
{
|
|
m_maxLinearVel = p_maxLinearVel;
|
|
m_trackDefault = FALSE;
|
|
}
|
|
void ResetMaxLinearAccel(MxFloat p_maxLinearAccel)
|
|
{
|
|
m_maxLinearAccel = p_maxLinearAccel;
|
|
m_trackDefault = FALSE;
|
|
}
|
|
void ResetMaxLinearDeccel(MxFloat p_maxLinearDeccel)
|
|
{
|
|
m_maxLinearDeccel = p_maxLinearDeccel;
|
|
m_trackDefault = FALSE;
|
|
}
|
|
|
|
// FUNCTION: BETA10 0x100c9a10
|
|
int GetDefaultDeadZone() { return g_defdeadZone; }
|
|
|
|
// SYNTHETIC: LEGO1 0x10054c10
|
|
// LegoNavController::`scalar deleting destructor'
|
|
|
|
protected:
|
|
friend class Multiplayer::ThirdPersonCamera;
|
|
|
|
float CalculateNewVel(float p_targetVel, float p_currentVel, float p_accel, float p_time);
|
|
float CalculateNewTargetVel(int p_pos, int p_center, float p_max);
|
|
float CalculateNewAccel(int p_pos, int p_center, float p_max, int p_min);
|
|
|
|
MxResult ProcessJoystickInput(MxBool& p_rotatedY);
|
|
MxResult ProcessKeyboardInput();
|
|
|
|
int m_hMax; // 0x08
|
|
int m_vMax; // 0x0c
|
|
int m_deadZone; // 0x10
|
|
float m_zeroThreshold; // 0x14
|
|
float m_linearVel; // 0x18
|
|
float m_rotationalVel; // 0x1c
|
|
float m_targetLinearVel; // 0x20
|
|
float m_targetRotationalVel; // 0x24
|
|
float m_maxLinearVel; // 0x28
|
|
float m_maxRotationalVel; // 0x2c
|
|
float m_linearAccel; // 0x30
|
|
float m_rotationalAccel; // 0x34
|
|
float m_maxLinearAccel; // 0x38
|
|
float m_maxRotationalAccel; // 0x3c
|
|
float m_minLinearAccel; // 0x40
|
|
float m_minRotationalAccel; // 0x44
|
|
float m_maxLinearDeccel; // 0x48
|
|
float m_maxRotationalDeccel; // 0x4c
|
|
float m_rotSensitivity; // 0x50
|
|
MxBool m_useRotationalVel; // 0x54
|
|
MxTime m_lastTime; // 0x58
|
|
MxBool m_trackDefault; // 0x5c
|
|
MxBool m_keyPressed; // 0x5d
|
|
float m_additionalHeightOffset; // 0x60
|
|
float m_additionalScale; // 0x64
|
|
float m_additionalRotationY; // 0x68
|
|
MxBool m_isAccelerating; // 0x6c
|
|
|
|
// one copy of defaults (these can be set by App.)
|
|
static int g_defdeadZone;
|
|
static float g_defzeroThreshold;
|
|
static float g_defmaxLinearVel;
|
|
static float g_defmaxRotationalVel;
|
|
static float g_defmaxLinearAccel;
|
|
static float g_defmaxRotationalAccel;
|
|
static float g_defminLinearAccel;
|
|
static float g_defminRotationalAccel;
|
|
static float g_defmaxLinearDeccel;
|
|
static float g_defmaxRotationalDeccel;
|
|
static float g_defrotSensitivity;
|
|
static MxBool g_defuseRotationalVel;
|
|
};
|
|
|
|
#endif // __LEGOPOVCONTROLLER_H
|