summaryrefslogtreecommitdiffstats
path: root/src/old/water.h
blob: 8a68dd66faf38bc419862823aee94440e6fb9587 (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
// * 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/.

// water.h

#pragma once


#include "common/event.h"
#include "old/d3dengine.h"
#include "old/particule.h"


class CInstanceManager;
class CTerrain;
class CSound;



const int MAXWATERLINE = 500;

struct WaterLine
{
    short       x, y;       // beginning
    short       len;        // length by x
    float       px1, px2, pz;
};


const int MAXWATVAPOR = 10;

struct WaterVapor
{
    bool            bUsed;
    ParticuleType   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, CD3DEngine* engine);
    ~CWater();

    void        SetD3DDevice(LPDIRECT3DDEVICE7 device);
    bool        EventProcess(const Event &event);
    void        Flush();
    bool        Create(WaterType type1, WaterType type2, const char *filename, D3DCOLORVALUE diffuse, D3DCOLORVALUE 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(ParticuleType type, Math::Vector pos, float delay);
    void        VaporFrame(int i, float rTime);

protected:
    CInstanceManager*   m_iMan;
    CD3DEngine*         m_engine;
    LPDIRECT3DDEVICE7   m_pD3DDevice;
    CTerrain*           m_terrain;
    CParticule*         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
    D3DCOLORVALUE       m_diffuse;      // diffuse color
    D3DCOLORVALUE       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;
    D3DCOLOR        m_color;
};