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
|
// * 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/.
// water.h
#pragma once
#include "graphics/engine/engine.h"
#include "graphics/engine/particle.h"
#include "common/event.h"
class CInstanceManager;
class CSound;
namespace Gfx {
class CTerrain;
const short MAXWATERLINE = 500;
struct WaterLine
{
short x, y; // beginning
short len; // length by x
float px1, px2, pz;
};
const short MAXWATVAPOR = 10;
struct WaterVapor
{
bool bUsed;
ParticleType type;
Math::Vector pos;
float delay;
float time;
float last;
};
enum WaterType
{
WATER_NULL = 0, // no water
WATER_TT = 1, // transparent texture
WATER_TO = 2, // opaque texture
WATER_CT = 3, // transparent color
WATER_CO = 4, // opaque color
};
class CWater
{
public:
CWater(CInstanceManager* iMan, Gfx::CEngine* engine);
~CWater();
void SetGLDevice(Gfx::CDevice device);
bool EventProcess(const Event &event);
void Flush();
bool Create(WaterType type1, WaterType type2, const char *filename, Gfx::Color diffuse, Gfx::Color ambient, float level, float glint, Math::Vector eddy);
void DrawBack();
void DrawSurf();
bool SetLevel(float level);
float RetLevel();
float RetLevel(CObject* object);
void SetLava(bool bLava);
bool RetLava();
void AdjustEye(Math::Vector &eye);
protected:
bool EventFrame(const Event &event);
void LavaFrame(float rTime);
void AdjustLevel(Math::Vector &pos, Math::Vector &norm, Math::Point &uv1, Math::Point &uv2);
bool RetWater(int x, int y);
bool CreateLine(int x, int y, int len);
void VaporFlush();
bool VaporCreate(ParticleType type, Math::Vector pos, float delay);
void VaporFrame(int i, float rTime);
protected:
CInstanceManager* m_iMan;
CEngine* m_engine;
CDevice* m_pDevice;
CTerrain* m_terrain;
CParticle* m_particule;
CSound* m_sound;
WaterType m_type[2];
char m_filename[100];
float m_level; // overall level
float m_glint; // amplitude of reflections
Math::Vector m_eddy; // amplitude of swirls
Gfx::Color m_diffuse; // diffuse color
Gfx::Color m_ambient; // ambient color
float m_time;
float m_lastLava;
int m_subdiv;
int m_brick; // number of brick*mosaics
float m_size; // size of a item in an brick
int m_lineUsed;
WaterLine m_line[MAXWATERLINE];
WaterVapor m_vapor[MAXWATVAPOR];
bool m_bDraw;
bool m_bLava;
long m_color;
};
}; // namespace Gfx
|