1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
|
#pragma once
#include "camera/camera.h"
class LabCamera {
public:
LabCamera(camid cam) {
FS_camera = cam;
}
virtual ~LabCamera() = 0;
camid FS_camera;
/// <summary>
/// Returns a string explaining the camera controls
/// </summary>
/// <returns></returns>
virtual SCP_string getUsageInfo() = 0;
/// <summary>
/// Returns a string containing miscellaneous info
/// </summary>
/// <returns></returns>
virtual SCP_string getOnFrameInfo() = 0;
/// <summary>
/// Called by the Lab Manager each frame to handle input events.
/// </summary>
/// <param name="dx">Mouse delta on the x axis</param>
/// <param name="dy">Mouse delta on the y axis</param>
/// <param name="lmbDown">State of the left mouse button</param>
/// <param name="rmbDown">State of the right mouse button</param>
/// <param name="modifierKeys">State of the various modifier keys. See keys.h</param>
virtual void handleInput(int dx, int dy, bool lmbDown, bool rmbDown, int modifierKeys) = 0;
/// <summary>
/// Called by the lab manager when the displayed object changes
/// </summary>
virtual void displayedObjectChanged() = 0;
/// <summary>
/// Returns true if this camera also handles object placement
/// </summary>
/// <returns></returns>
virtual bool handlesObjectPlacement() = 0;
};
class OrbitCamera : public LabCamera {
public:
OrbitCamera() : LabCamera(cam_create("Lab orbit camera")) {}
SCP_string getUsageInfo() override {
return "Hold RMB to rotate the Camera. Hold Shift + RMB to zoom in or out.";
}
SCP_string getOnFrameInfo() override {
SCP_stringstream ss;
ss.setf(std::ios::fixed);
ss << "Phi: " << phi << " Theta: " << theta << " Distance: " << distance;
return ss.str();
}
void handleInput(int dx, int dy, bool /*lmbDown*/, bool rmbDown, int modifierKeys) override;
void displayedObjectChanged() override;
bool handlesObjectPlacement() override { return false; }
private:
float distance = 100.0f;
float phi = 1.24f;
float theta = 2.25f;
void updateCamera();
};
|