File: lab_cameras.h

package info (click to toggle)
freespace2 24.2.0%2Brepack-1
  • links: PTS, VCS
  • area: non-free
  • in suites: forky, sid
  • size: 43,716 kB
  • sloc: cpp: 595,001; ansic: 21,741; python: 1,174; sh: 457; makefile: 248; xml: 181
file content (77 lines) | stat: -rw-r--r-- 2,014 bytes parent folder | download | duplicates (2)
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();
};