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
|
// * This file is part of the COLOBOT source code
// * Copyright (C) 2001-2008, Daniel ROUX & EPSITEC SA, www.epsitec.ch
// * Copyright (C) 2012, Polish Portal of Colobot (PPC)
// *
// * 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/.
/**
* \file graphics/engine/water.h
* \brief Water rendering - CWater class
*/
#pragma once
#include "common/event.h"
#include "graphics/engine/particle.h"
class CSoundInterface;
// Graphics module namespace
namespace Gfx {
class CEngine;
class CTerrain;
/**
* \struct WaterLine
* \brief Water strip
*/
struct WaterLine
{
//@{
//! Beginning of line (terrain coordinates)
short x, y;
//@}
//! Length in X direction (terrain coordinates)
short len;
//! X (1, 2) and Z coordinates (world coordinates)
float px1, px2, pz;
WaterLine()
{
x = y = 0;
len = 0;
px1 = px2 = pz = 0.0f;
}
};
/**
* \struct WaterVapor
* \brief Water particle effect
*/
struct WaterVapor
{
bool used;
ParticleType type;
Math::Vector pos;
float delay;
float time;
float last;
WaterVapor()
{
used = false;
type = PARTIWATER;
delay = time = last = 0.0f;
}
};
/**
* \enum WaterType
* \brief Mode of water display
*/
enum WaterType
{
//! No water
WATER_NULL = 0,
//! Transparent texture
WATER_TT = 1,
//! Opaque texture
WATER_TO = 2,
//! Transparent color
WATER_CT = 3,
//! Opaque color
WATER_CO = 4,
};
/**
* \class CWater
* \brief Water manager/renderer
*
* Water is drawn where the terrain is below specified level. The mapping
* is based on terrain coordinates - for each "brick" coordinate, the level
* of terrain is tested. For every Y coordinate, many lines in X direction
* are created (WaterLines).
*
* There are two parts of drawing process: drawing the background image
* blocking the normal sky layer and drawing the surface of water.
* The surface is drawn with texture, so with proper texture it can be lava.
*/
class CWater
{
public:
CWater(CEngine* engine);
virtual ~CWater();
void SetDevice(CDevice* device);
bool EventProcess(const Event &event);
//! Removes all the water
void Flush();
//! Creates all expanses of water
void Create(WaterType type1, WaterType type2, const std::string& fileName,
Color diffuse, Color ambient, float level, float glint, Math::Vector eddy);
//! Draw the back surface of the water
void DrawBack();
//! Draws the flat surface of the water
void DrawSurf();
//! Changes the level of the water
void SetLevel(float level);
//! Returns the current level of water
float GetLevel();
//! Returns the current level of water for a given object
float GetLevel(CObject* object);
//@{
//! Management of the mode of lava/water
void SetLava(bool lava);
bool GetLava();
//@}
//! Adjusts the eye of the camera, not to be in the water
void AdjustEye(Math::Vector &eye);
protected:
//! Makes water evolve
bool EventFrame(const Event &event);
//! Makes evolve the steam jets on the lava
void LavaFrame(float rTime);
//! Adjusts the position to normal, to imitate reflections on an expanse of water at rest
void AdjustLevel(Math::Vector &pos, Math::Vector &norm, Math::Point &uv1, Math::Point &uv2);
//! Indicates if there is water in a given position
bool GetWater(int x, int y);
//! Updates the positions, relative to the ground
void CreateLine(int x, int y, int len);
//! Removes all the steam jets
void VaporFlush();
//! Creates a new steam
bool VaporCreate(ParticleType type, Math::Vector pos, float delay);
//! Makes evolve a steam jet
void VaporFrame(int i, float rTime);
protected:
CEngine* m_engine;
CDevice* m_device;
CTerrain* m_terrain;
CParticle* m_particle;
CSoundInterface* m_sound;
WaterType m_type[2];
std::string m_fileName;
//! Overall level
float m_level;
//! Amplitude of reflections
float m_glint;
//! Amplitude of swirls
Math::Vector m_eddy;
//! Diffuse color
Color m_diffuse;
//! Ambient color
Color m_ambient;
float m_time;
float m_lastLava;
int m_subdiv;
//! Number of brick*mosaics
int m_brickCount;
//! Size of a item in an brick
float m_brickSize;
std::vector<WaterLine> m_lines;
std::vector<WaterVapor> m_vapors;
bool m_draw;
bool m_lava;
Color m_color;
};
} // namespace Gfx
|