summaryrefslogtreecommitdiffstats
path: root/src/physics/physics.h
blob: 584ebc4f590bb8eed6c7a1f5f0d843caeb82f735 (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
// * 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/.

// physics.h

#pragma once


#include "graphics/d3d/d3dengine.h"
#include "common/misc.h"
#include "object/object.h"


class CInstanceManager;
class CD3DEngine;
class CLight;
class CParticule;
class CTerrain;
class CWater;
class CCamera;
class CObject;
class CBrain;
class CMotion;
class CSound;


enum PhysicsType
{
	TYPE_ROLLING	= 1,
	TYPE_FLYING		= 2,
};

enum PhysicsMode
{
	MO_ADVACCEL		= 0,
	MO_RECACCEL		= 1,
	MO_STOACCEL		= 2,
	MO_MOTACCEL		= 3,
	MO_ADVSPEED		= 4,
	MO_RECSPEED		= 5,
	MO_MOTSPEED		= 6,
	MO_CURSPEED		= 7,
	MO_TERFORCE		= 8,
	MO_TERSPEED		= 9,
	MO_TERSLIDE		= 10,
	MO_REASPEED		= 11,
};


struct Motion
{
	D3DVECTOR	advanceAccel;	// acceleration starting (+)
	D3DVECTOR	recedeAccel;	// acceleration starting (+)
	D3DVECTOR	stopAccel;	// acceleration stoping (+)
	D3DVECTOR	motorAccel;	// current acceleration (+/-)

	D3DVECTOR	advanceSpeed;	// forward speed (+)
	D3DVECTOR	recedeSpeed;	// reversing speed (+)
	D3DVECTOR	motorSpeed;	// desired speed (+/-)
	D3DVECTOR	currentSpeed;	// current speed (+/-)

	D3DVECTOR	terrainForce;	// power of resistance of the ground (+)
	D3DVECTOR	terrainSpeed;	// speed of the ground (+/-)
	D3DVECTOR	terrainSlide;	// limit sliding speed (+)

	D3DVECTOR	realSpeed;	// real speed(+/-)

	D3DVECTOR	finalInclin;	// final inclination
};




class CPhysics
{
public:
	CPhysics(CInstanceManager* iMan, CObject* object);
	~CPhysics();

	void		DeleteObject(bool bAll=false);

	bool		EventProcess(const Event &event);

	void		SetBrain(CBrain* brain);
	void		SetMotion(CMotion* motion);

	void		SetType(PhysicsType type);
	PhysicsType	RetType();

	bool		Write(char *line);
	bool		Read(char *line);

	void		SetGravity(float value);
	float		RetGravity();

	float		RetFloorHeight();

	void		SetLinMotion(PhysicsMode mode, D3DVECTOR value);
	D3DVECTOR	RetLinMotion(PhysicsMode mode);
	void		SetLinMotionX(PhysicsMode mode, float value);
	void		SetLinMotionY(PhysicsMode mode, float value);
	void		SetLinMotionZ(PhysicsMode mode, float value);
	float		RetLinMotionX(PhysicsMode mode);
	float		RetLinMotionY(PhysicsMode mode);
	float		RetLinMotionZ(PhysicsMode mode);

	void		SetCirMotion(PhysicsMode mode, D3DVECTOR value);
	D3DVECTOR	RetCirMotion(PhysicsMode mode);
	void		SetCirMotionX(PhysicsMode mode, float value);
	void		SetCirMotionY(PhysicsMode mode, float value);
	void		SetCirMotionZ(PhysicsMode mode, float value);
	float		RetCirMotionX(PhysicsMode mode);
	float		RetCirMotionY(PhysicsMode mode);
	float		RetCirMotionZ(PhysicsMode mode);

	float		RetLinStopLength(PhysicsMode sMode=MO_ADVSPEED, PhysicsMode aMode=MO_STOACCEL);
	float		RetCirStopLength();
	float		RetLinMaxLength(float dir);
	float		RetLinTimeLength(float dist, float dir=1.0f);
	float		RetLinLength(float dist);

	void		SetMotor(bool bState);
	bool		RetMotor();
	void		SetLand(bool bState);
	bool		RetLand();
	void		SetSwim(bool bState);
	bool		RetSwim();
	void		SetCollision(bool bCollision);
	bool		RetCollision();
	void		SetFreeze(bool bFreeze);
	bool		RetFreeze();
	void		SetReactorRange(float range);
	float		RetReactorRange();

	void		SetMotorSpeed(D3DVECTOR speed);
	void		SetMotorSpeedX(float speed);
	void		SetMotorSpeedY(float speed);
	void		SetMotorSpeedZ(float speed);
	D3DVECTOR	RetMotorSpeed();
	float		RetMotorSpeedX();
	float		RetMotorSpeedY();
	float		RetMotorSpeedZ();

	void		CreateInterface(bool bSelect);
	Error		RetError();

protected:
	bool		EventFrame(const Event &event);
	void		WaterFrame(float aTime, float rTime);
	void		SoundMotor(float rTime);
	void		SoundMotorFull(float rTime, ObjectType type);
	void		SoundMotorSlow(float rTime, ObjectType type);
	void		SoundMotorStop(float rTime, ObjectType type);
	void		SoundReactorFull(float rTime, ObjectType type);
	void		SoundReactorStop(float rTime, ObjectType type);
	void		FrameParticule(float aTime, float rTime);
	void		MotorUpdate(float aTime, float rTime);
	void		EffectUpdate(float aTime, float rTime);
	void		UpdateMotionStruct(float rTime, Motion &motion);
	void		FloorAdapt(float aTime, float rTime, D3DVECTOR &pos, D3DVECTOR &angle);
	void		FloorAngle(const D3DVECTOR &pos, D3DVECTOR &angle);
	int			ObjectAdapt(const D3DVECTOR &pos, const D3DVECTOR &angle);
	bool		JostleObject(CObject* pObj, D3DVECTOR iPos, float iRad, D3DVECTOR oPos, float oRad);
	bool		JostleObject(CObject* pObj, float force);
	bool		ExploOther(ObjectType iType, CObject *pObj, ObjectType oType, float force);
	int			ExploHimself(ObjectType iType, ObjectType oType, float force);

	void		PowerParticule(float factor, bool bBreak);
	void		CrashParticule(float crash);
	void		MotorParticule(float aTime, float rTime);
	void		WaterParticule(float aTime, D3DVECTOR pos, ObjectType type, float floor, float advance, float turn);
	void		WheelParticule(int color, float width);

protected:
	CInstanceManager* m_iMan;
	CD3DEngine*	m_engine;
	CLight*		m_light;
	CParticule*	m_particule;
	CTerrain*	m_terrain;
	CWater*		m_water;
	CCamera*	m_camera;
	CObject*	m_object;
	CBrain*		m_brain;
	CMotion*	m_motion;
	CSound*		m_sound;

	PhysicsType	m_type;			// TYPE_*
	float		m_gravity;		// force of gravity
	float		m_time;			// absolute time
	D3DVECTOR	m_motorSpeed;		// motor speed (-1..1)
	Motion		m_linMotion;		// linear motion
	Motion		m_cirMotion;		// circular motion
	bool		m_bMotor;
	bool		m_bLand;
	bool		m_bSwim;
	bool		m_bCollision;
	bool		m_bObstacle;
	bool		m_bFreeze;
	int			m_repeatCollision;
	float		m_linVibrationFactor;
	float		m_cirVibrationFactor;
	float		m_inclinaisonFactor;
	float		m_lastPowerParticule;
	float		m_lastSlideParticule;
	float		m_lastMotorParticule;
	float		m_lastWaterParticule;
	float		m_lastUnderParticule;
	float		m_lastPloufParticule;
	float		m_lastFlameParticule;
	bool		m_bWheelParticuleBrake;
	D3DVECTOR	m_wheelParticulePos[2];
	float		m_absorbWater;
	float		m_reactorTemperature;
	float		m_reactorRange;
	float		m_timeReactorFail;
	float		m_timeUnderWater;
	float		m_lastEnergy;
	float		m_lastSoundWater;
	float		m_lastSoundInsect;
	float		m_restBreakParticule;
	float		m_floorLevel;		// ground level
	float		m_floorHeight;		// height above the ground
	int		m_soundChannel;
	int		m_soundChannelSlide;
	float		m_soundTimePshhh;
	float		m_soundTimeJostle;
	float		m_soundTimeBoum;
	bool		m_bSoundSlow;
	bool		m_bForceUpdate;
	bool		m_bLowLevel;
};