summaryrefslogtreecommitdiffstats
path: root/src/graphics/common/water.h
blob: f5224a4b54c8f9729ad5e3c7943af766d1ed4e5d (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
// * 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/common/engine.h"
#include "graphics/common/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