summaryrefslogtreecommitdiffstats
path: root/src/graphics/common/camera.h
blob: 7723dfc0990d671f76e021bb40949020b6b30982 (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
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
// * This file is part of the COLOBOT source code
// * Copyright (C) 2001-2008, Daniel ROUX & EPSITEC SA, www.epsitec.ch
// *
// * 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 3 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, see  http://www.gnu.org/licenses/.

// camera.h

#pragma once


#include "graphics/d3d/d3dengine.h"
#include "common/struct.h"


class CInstanceManager;
class CD3DEngine;
class CTerrain;
class CWater;
class CObject;


enum CameraType
{
	CAMERA_NULL		= 0,	// camera undefined
	CAMERA_FREE		= 1,	// camera free (never in principle)
	CAMERA_EDIT		= 2,	// camera while editing a program
	CAMERA_ONBOARD		= 3,	// camera on board a robot
	CAMERA_BACK		= 4,	// camera behind a robot
	CAMERA_FIX		= 5,	// static camera following robot
	CAMERA_EXPLO		= 6,	// camera steady after explosion
	CAMERA_SCRIPT		= 7,	// camera during a film script
	CAMERA_INFO		= 8,	// camera for displaying information
	CAMERA_VISIT		= 9,	// visit instead of an error
	CAMERA_DIALOG		= 10,	// camera for dialogue
	CAMERA_PLANE		= 11,	// static camera height
};

enum CameraSmooth
{
	CS_NONE			= 0,	// sharp
	CS_NORM			= 1,	// normal
	CS_HARD			= 2,	// hard
	CS_SPEC			= 3,	// special
};

enum CenteringPhase
{
	CP_NULL			= 0,
	CP_START		= 1,
	CP_WAIT			= 2,
	CP_STOP			= 3,
};

enum CameraEffect
{
	CE_NULL			= 0,	// no effect
	CE_TERRAFORM		= 1,	// digging in
	CE_CRASH		= 2,	// Vehicle driving is severely
	CE_EXPLO		= 3,	// explosion
	CE_SHOT			= 4,	// not mortal shot
	CE_VIBRATION		= 5,	// vibration during construction
	CE_PET			= 6,	// spleen reactor
};

enum OverEffect
{
	OE_NULL			= 0,	// no effect
	OE_BLOOD		= 1,	// flash red
	OE_FADEINw		= 2,	// white -> nothing
	OE_FADEOUTw		= 3,	// nothing -> white
	OE_FADEOUTb		= 4,	// nothing -> blue
	OE_BLITZ		= 5,	// lightning
};



class CCamera
{
public:
	CCamera(CInstanceManager* iMan);
	~CCamera();

	BOOL		EventProcess(const Event &event);

	void		Init(D3DVECTOR eye, D3DVECTOR lookat, float delay);

	void		SetObject(CObject* object);
	CObject*	RetObject();

	void		SetType(CameraType type);
	CameraType	RetType();

	void		SetSmooth(CameraSmooth type);
	CameraSmooth RetSmoth();

	void		SetDist(float dist);
	float		RetDist();

	void		SetFixDirection(float angle);
	float		RetFixDirection();

	void		SetRemotePan(float value);
	float		RetRemotePan();

	void		SetRemoteZoom(float value);
	float		RetRemoteZoom();

	void		StartVisit(D3DVECTOR goal, float dist);
	void		StopVisit();

	void		RetCamera(D3DVECTOR &eye, D3DVECTOR &lookat);

	BOOL		StartCentering(CObject *object, float angleH, float angleV, float dist, float time);
	BOOL		StopCentering(CObject *object, float time);
	void		AbortCentering();

	void		FlushEffect();
	void		StartEffect(CameraEffect effect, D3DVECTOR pos, float force);

	void		FlushOver();
	void		SetOverBaseColor(D3DCOLORVALUE color);
	void		StartOver(OverEffect effect, D3DVECTOR pos, float force);

	void		FixCamera();
	void		SetScriptEye(D3DVECTOR eye);
	void		SetScriptLookat(D3DVECTOR lookat);

	void		SetEffect(BOOL bEnable);
	void		SetCameraScroll(BOOL bScroll);
	void		SetCameraInvertX(BOOL bInvert);
	void		SetCameraInvertY(BOOL bInvert);

	float		RetMotorTurn();
	D3DMouse	RetMouseDef(FPOINT pos);

protected:
	BOOL		EventMouseMove(const Event &event);
	void		EventMouseWheel(int dir);
	BOOL		EventFrame(const Event &event);
	BOOL		EventFrameFree(const Event &event);
	BOOL		EventFrameEdit(const Event &event);
	BOOL		EventFrameDialog(const Event &event);
	BOOL		EventFrameBack(const Event &event);
	BOOL		EventFrameFix(const Event &event);
	BOOL		EventFrameExplo(const Event &event);
	BOOL		EventFrameOnBoard(const Event &event);
	BOOL		EventFrameInfo(const Event &event);
	BOOL		EventFrameVisit(const Event &event);
	BOOL		EventFrameScript(const Event &event);

	void		SetViewTime(const D3DVECTOR &vEyePt, const D3DVECTOR &vLookatPt, float rTime);
	BOOL		IsCollision(D3DVECTOR &eye, D3DVECTOR lookat);
	BOOL		IsCollisionBack(D3DVECTOR &eye, D3DVECTOR lookat);
	BOOL		IsCollisionFix(D3DVECTOR &eye, D3DVECTOR lookat);

	D3DVECTOR	ExcludeTerrain(D3DVECTOR eye, D3DVECTOR lookat, float &angleH, float &angleV);
	D3DVECTOR	ExcludeObject(D3DVECTOR eye, D3DVECTOR lookat, float &angleH, float &angleV);

	void		SetViewParams(const D3DVECTOR &eye, const D3DVECTOR &lookat, const D3DVECTOR &up);
	void		EffectFrame(const Event &event);
	void		OverFrame(const Event &event);

protected:
	CInstanceManager* m_iMan;
	CD3DEngine*	m_engine;
	CTerrain*	m_terrain;
	CWater*		m_water;

	CameraType	m_type;			// the type of camera (CAMERA *)
	CameraSmooth	m_smooth;		// type of smoothing
	CObject*	m_cameraObj;		// object linked to the camera

	float		m_eyeDistance;		// distance between the eyes
	float		m_initDelay;		// time of initial centering

	D3DVECTOR	m_actualEye;		// current eye
	D3DVECTOR	m_actualLookat;		// aim current
	D3DVECTOR	m_finalEye;		// final eye
	D3DVECTOR	m_finalLookat;		// aim final
	D3DVECTOR	m_normEye;		// normal eye
	D3DVECTOR	m_normLookat;		// aim normal
	float		m_focus;

	BOOL		m_bRightDown;
	FPOINT		m_rightPosInit;
	FPOINT		m_rightPosCenter;
	FPOINT		m_rightPosMove;

	D3DVECTOR	m_eyePt;		// CAMERA_FREE: eye
	float		m_directionH;		// CAMERA_FREE: horizontal direction
	float		m_directionV;		// CAMERA_FREE: vertical direction
	float		m_heightEye;		// CAMERA_FREE: height above the ground
	float		m_heightLookat;		// CAMERA_FREE: height above the ground
	float		m_speed;		// CAMERA_FREE: speed of movement

	float		m_backDist;		// CAMERA_BACK: distance
	float		m_backMin;		// CAMERA_BACK: distance minimal
	float		m_addDirectionH;	// CAMERA_BACK: additional direction
	float		m_addDirectionV;	// CAMERA_BACK: additional direction
	BOOL		m_bTransparency;

	float		m_fixDist;		// CAMERA_FIX: distance
	float		m_fixDirectionH;	// CAMERA_FIX: direction
	float		m_fixDirectionV;	// CAMERA_FIX: direction

	D3DVECTOR	m_visitGoal;		// CAMERA_VISIT: target position
	float		m_visitDist;		// CAMERA_VISIT: distance
	float		m_visitTime;		// CAMERA_VISIT: relative time
	CameraType	m_visitType;		// CAMERA_VISIT: initial type
	float		m_visitDirectionH;	// CAMERA_VISIT: direction
	float		m_visitDirectionV;	// CAMERA_VISIT: direction

	float		m_editHeight;		// CAMERA_EDIT: height

	float		m_remotePan;
	float		m_remoteZoom;

	FPOINT		m_mousePos;
	float		m_mouseDirH;
	float		m_mouseDirV;
	float		m_mouseMarging;

	float		m_motorTurn;

	CenteringPhase m_centeringPhase;
	float		m_centeringAngleH;
	float		m_centeringAngleV;
	float		m_centeringDist;
	float		m_centeringCurrentH;
	float		m_centeringCurrentV;
	float		m_centeringTime;
	float		m_centeringProgress;

	CameraEffect m_effectType;
	D3DVECTOR	m_effectPos;
	float		m_effectForce;
	float		m_effectProgress;
	D3DVECTOR	m_effectOffset;

	OverEffect	m_overType;
	float		m_overForce;
	float		m_overTime;
	D3DCOLORVALUE m_overColorBase;
	D3DCOLORVALUE m_overColor;
	int			m_overMode;
	float		m_overFadeIn;
	float		m_overFadeOut;

	D3DVECTOR	m_scriptEye;
	D3DVECTOR	m_scriptLookat;

	BOOL		m_bEffect;		// shocks if explosion?
	BOOL		m_bCameraScroll;	// scroll in the edges?
	BOOL		m_bCameraInvertX;	// X inversion in the edges?
	BOOL		m_bCameraInvertY;	// Y inversion in the edges?
};