aboutsummaryrefslogtreecommitdiff
path: root/engines/titanic/star_control/star_camera.h
blob: f2d27212fef61500e8ba28d6e23b3c26341258c6 (plain)
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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
/* ScummVM - Graphic Adventure Engine
 *
 * ScummVM is the legal property of its developers, whose names
 * are too numerous to list here. Please refer to the COPYRIGHT
 * file distributed with this source distribution.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 *
 */

#ifndef TITANIC_STAR_CAMERA_H
#define TITANIC_STAR_CAMERA_H

#include "titanic/star_control/fmatrix.h"
#include "titanic/star_control/base_stars.h"
#include "titanic/star_control/viewport.h"

namespace Titanic {

class CCameraMover;
class CErrorCode;
struct CNavigationInfo;
class FPoint;
class SimpleFile;

enum StarLockState { ZERO_LOCKED=0, ONE_LOCKED=1, TWO_LOCKED=2, THREE_LOCKED=3 };

/**
 * Implements a reference point from which the starmap can be viewed
 */
class CStarCamera {
private:
	static FMatrix *_priorOrientation;
	static FMatrix *_newOrientation;
private:
	StarLockState _starLockState;
	FMatrix _lockedStarsPos; // Each row represents the location of a locked star
	CCameraMover *_mover; // A marked or unmarked camera mover, contains an automover
	CViewport _viewport;
	bool _isMoved; // Used in CPetStarfield to determine if a star destination can be set
	bool _isInLockingProcess; // The mover/view is homing in on a new star
private:
	/**
	 * Set Mover type to be unmarked or marked camera mover based on 
	 * the number of stars currently locked (_starLockState)
	 * The CNavigationInfo data is used to initialize the mover
	 */
	bool setMoverType(const CNavigationInfo *src);

	/**
	 * Deletes the previous mover handle
	 */
	void removeMover();

	/**
	 * Return whether the handler is locked
	 */
	bool isLocked();
public:
	static void init();
	static void deinit();
public:
	CStarCamera(const CNavigationInfo *data);
	CStarCamera(CViewport *src);
	virtual ~CStarCamera();

	virtual void proc2(const CViewport *src);
	virtual void proc3(const CNavigationInfo *src);

	/**
	 * The mover/view is not currently homing in on a new star
	 * This can mean it is unmarked, or that it is fully locked 
	 * onto one star or more (but not in the process of doing so)
	 */
	bool isNotInLockingProcess();

	/**
	 * Set the camera position
	 */
	virtual void setPosition(const FVector &v);

	/**
	 * Sets the camera orientation
	 */
	virtual void setOrientation(const FVector &v);

	virtual void proc6(int v);
	virtual void proc7(int v);
	virtual void proc8(int v);
	virtual void setCenterYAngle(int v);
	virtual void setCenterZAngle(int v);
	virtual void randomizeOrientation();
	virtual void proc12(StarMode mode, double v2);
	virtual void proc13(CViewport *dest);

	/**
	 * Sets the destination to move the camera to
	 */
	virtual void setDestination(const FVector &v);

	/**
	 * Updates the camera position
	 */
	virtual void updatePosition(CErrorCode *errorCode);

	/**
	 * Increases movement speed in forward direction
	 */
	virtual void increaseForwardSpeed();

	/**
	 * Increases movement speed in backward direction
	 */
	virtual void increaseBackwardSpeed();

	/**
	 * Increase to full speed
	 */
	virtual void fullSpeed();

	/**
	 * Completely stop
	 */
	virtual void stop();

	virtual void reposition(double factor);

	/**
	 * Set the camera position
	 */
	virtual void setPosition(const FPose &pose);

	virtual void changeOrientation(FMatrix &m);

	/**
	 * Get the position and direction of the camera
	 */
	virtual FPose getPose();

	virtual FPose getRawPose();
	virtual double getThreshold() const;

	virtual double proc26() const;
	virtual StarColor getStarColor() const;

	/**
	 * Return the passed vector relative to the center of the viewpoint
	 */
	virtual FVector getRelativePos(int index, const FVector &src);

	virtual FVector getRelativePosNoCentering(int index, const FVector &src);
	virtual FVector proc30(int index, const FVector &v);
	virtual FVector proc31(int index, const FVector &v);

	/**
	 * Sets the viewport position within the starfield
	 */
	virtual void setViewportAngle(const FPoint &angles);

	/**
	 * How many stars are currently locked onto
	 */
	virtual StarLockState getStarLockState() const { return _starLockState; }

	/**
	 * Adds the row for a locked in marker/star
	 * @remarks		This can't be a pass-by-reference, since adding
	 * the vector for the star destroys the calling star vector
	 */
	virtual bool addLockedStar(const FVector v);

	/**
	 * Removes the most recent locked in marker/star
	 * @remarks		This can't be a pass-by-reference, since adding
	 * the vector for the star destroys the calling star vector
	 */
	virtual bool removeLockedStar();

	/**
	 * All arguments are return values
	 * First is the x center coordinate relative to y
	 * Second is the x center coordinate relative to z
	 * Third is the first x center pixel offset
	 * Fourth is the second x center pixel offset
	 */	
	virtual void getRelativeXCenterPixels(double *v1, double *v2, double *v3, double *v4);

	/**
	 * Load the data for the class from file
	 */
	virtual void load(SimpleFile *file, int param);

	/**
	 * Save the data for the class to file
	 */
	virtual void save(SimpleFile *file, int indent);

	/**
	 * Calculates the angle of rotation of y that achieves
	 * the minimum distance to x. 
	 * The angle is in degrees.
	 * Also returns the minimum distance calculated
	 */
	float calcAngleForMinDist(FVector &x, FVector &y, float &minDistance);

	/**
	 * Returns true for whether the camera has been moved
	 */
	bool isMoved() const { return _isMoved; }

	/**
	 * Sets the camera as having been moved
	 */
	void setIsMoved() { _isMoved = true; }

	/**
	 * Resets the flag for whether the camera has moved
	 */
	void clearIsMoved() { _isMoved = false; }

	/**
	 * Lock in the first matched star marker
	 */
	bool lockMarker1(FVector v1, FVector v2, FVector v3);
	
	/**
	 * Lock in the second matched star marker
	 */
	bool lockMarker2(CViewport *viewport, const FVector &v);

	/**
	 * Lock in the third and final matched star marker
	 */
	bool lockMarker3(CViewport *viewport, const FVector &v);
};

} // End of namespace Titanic

#endif /* TITANIC_STAR_CAMERA_H */