]> git.jsancho.org Git - lugaru.git/blob - Source/Graphic/Decal.cpp
Cleaned Terrain Decal handling
[lugaru.git] / Source / Graphic / Decal.cpp
1 /*
2 Copyright (C) 2003, 2010 - Wolfire Games
3 Copyright (C) 2010-2016 - Lugaru contributors (see AUTHORS file)
4
5 This file is part of Lugaru.
6
7 Lugaru is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
11
12 Lugaru is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with Lugaru.  If not, see <http://www.gnu.org/licenses/>.
19 */
20
21 #include "Graphic/Decal.hpp"
22
23 #include "Environment/Terrain.hpp"
24
25 Decal::Decal() :
26     position(),
27     type(0),
28     opacity(0),
29     rotation(0),
30     alivetime(0),
31     brightness(0)
32 {
33 }
34
35 Decal::Decal(XYZ _position, int _type, float _opacity, float _rotation, float _brightness, int whichx, int whichy, float size, const Terrain& terrain, bool first) :
36     position(_position),
37     type(_type),
38     opacity(_opacity),
39     rotation(_rotation),
40     alivetime(0),
41     brightness(_brightness)
42 {
43     float placex, placez;
44     placex = (float)whichx * terrain.scale + terrain.scale;
45     placez = (float)whichy * terrain.scale;
46
47     texcoords[0][0] = (placex - position.x) / size / 2 + .5;
48     texcoords[0][1] = (placez - position.z) / size / 2 + .5;
49
50     vertex[0].x = placex;
51     vertex[0].z = placez;
52     vertex[0].y = terrain.heightmap[whichx + 1][whichy] * terrain.scale + .01;
53
54     if (first) {
55         placex = (float)whichx * terrain.scale + terrain.scale;
56         placez = (float)whichy * terrain.scale + terrain.scale;
57     } else {
58         placex = (float)whichx * terrain.scale;
59         placez = (float)whichy * terrain.scale;
60     }
61
62     texcoords[1][0] = (placex - position.x) / size / 2 + .5;
63     texcoords[1][1] = (placez - position.z) / size / 2 + .5;
64
65     vertex[1].x = placex;
66     vertex[1].z = placez;
67     if (first) {
68         vertex[1].y = terrain.heightmap[whichx + 1][whichy + 1] * terrain.scale + .01;
69     } else {
70         vertex[1].y = terrain.heightmap[whichx][whichy] * terrain.scale + .01;
71     }
72
73
74     placex = (float)whichx * terrain.scale;
75     placez = (float)whichy * terrain.scale + terrain.scale;
76
77     texcoords[2][0] = (placex - position.x) / size / 2 + .5;
78     texcoords[2][1] = (placez - position.z) / size / 2 + .5;
79
80     vertex[2].x = placex;
81     vertex[2].z = placez;
82     vertex[2].y = terrain.heightmap[whichx][whichy + 1] * terrain.scale + .01;
83
84     XYZ rot;
85     if (rotation) {
86         for (int i = 0; i < 3; i++) {
87             rot.y = 0;
88             rot.x = texcoords[i][0] - .5;
89             rot.z = texcoords[i][1] - .5;
90             rot = DoRotation(rot, 0, -rotation, 0);
91             texcoords[i][0] = rot.x + .5;
92             texcoords[i][1] = rot.z + .5;
93         }
94     }
95 }