Files
librw/skeleton/camera.h
T
aap da98dab4a5 skeleton: tracked input state, analog pad api, camera manipulator, file paths
EventHandler now keeps keys/mouse/pad state so apps don't have to;
sk::Camera is an orbit/dolly/pan manipulator over an rw::Camera;
GetFilePath mangles paths for cdrom0:/host:/host0: on ps2.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-26 17:52:52 +02:00

76 lines
2.0 KiB
C++

#ifndef SKELCAMERA_H
#define SKELCAMERA_H
namespace sk {
// Manipulator around an rw::Camera. Keeps position/target/up and
// drives the rw camera's frame from them in update().
struct Camera
{
rw::Camera *m_rwcam;
rw::V3d m_position;
rw::V3d m_target;
rw::V3d m_up;
rw::V3d m_localup;
float m_fov, m_aspectRatio;
float m_near, m_far;
void init(void);
void attach(rw::Camera *cam);
void setTarget(rw::V3d target);
float getHeading(void);
void turn(float yaw, float pitch);
void orbit(float yaw, float pitch);
void dolly(float dist);
void zoom(float dist);
void pan(float x, float y);
void update(void);
float distanceTo(rw::V3d v);
float distanceToTarget(void);
rw::bool32 isSphereVisible(rw::Sphere *sph, rw::Matrix *xform);
};
/*
* Controls.
*
* Two kinds of input, and they must not be treated alike:
*
* displacement - mouse motion, wheel. Already frame rate independent,
* a given hand movement gives the same delta at any fps.
* Scale by a constant gain, never by dt.
* rate - held keys, stick deflection. A speed, so scale by dt.
*
* Mouse deltas are normalized by the viewport, so sensitivity does not
* change with resolution.
*/
struct CameraControls
{
float mouseSens; // gain for mouse displacement
float wheelSens; // gain for wheel displacement
float stickSens; // radians/sec for stick look
float moveSpeed; // units/sec
float speedUpMult; // while shift/R1 held
};
extern CameraControls cameraControls;
void CameraControlsInit(void);
// Editor style: orbit/pan/zoom about the target.
// mouse: left orbit, middle pan, right zoom, wheel zoom
// pad: left stick orbit, right stick pan, L1/R1 zoom
void CameraEditorControls(Camera *cam, float dt);
// First person style: look with the mouse/right stick, fly with the keys.
// mouse: left drag look
// keys: WASD move, Q/E down/up, shift faster
// pad: right stick look, left stick move, L2/R2 down/up, R1 faster
void CameraFlyControls(Camera *cam, float dt);
}
#endif