]> git.jsancho.org Git - lugaru.git/blob - Source/Graphic/Decal.cpp
Update copyright year to 2017
[lugaru.git] / Source / Graphic / Decal.cpp
1 /*
2 Copyright (C) 2003, 2010 - Wolfire Games
3 Copyright (C) 2010-2017 - 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 #include "Graphic/Models.hpp"
25
26 Decal::Decal()
27     : position()
28     , type(shadowdecal)
29     , opacity(0)
30     , rotation(0)
31     , alivetime(0)
32     , brightness(0)
33 {
34 }
35
36 Decal::Decal(XYZ _position, decal_type _type, float _opacity, float _rotation, float _brightness, int whichx, int whichy, float size, const Terrain& terrain, bool first)
37     : position(_position)
38     , type(_type)
39     , opacity(_opacity)
40     , rotation(_rotation)
41     , alivetime(0)
42     , brightness(_brightness)
43 {
44     float placex, placez;
45     placex = (float)whichx * terrain.scale + terrain.scale;
46     placez = (float)whichy * terrain.scale;
47
48     texcoords[0][0] = (placex - position.x) / size / 2 + .5;
49     texcoords[0][1] = (placez - position.z) / size / 2 + .5;
50
51     vertex[0].x = placex;
52     vertex[0].z = placez;
53     vertex[0].y = terrain.heightmap[whichx + 1][whichy] * terrain.scale + .01;
54
55     if (first) {
56         placex = (float)whichx * terrain.scale + terrain.scale;
57         placez = (float)whichy * terrain.scale + terrain.scale;
58     } else {
59         placex = (float)whichx * terrain.scale;
60         placez = (float)whichy * terrain.scale;
61     }
62
63     texcoords[1][0] = (placex - position.x) / size / 2 + .5;
64     texcoords[1][1] = (placez - position.z) / size / 2 + .5;
65
66     vertex[1].x = placex;
67     vertex[1].z = placez;
68     if (first) {
69         vertex[1].y = terrain.heightmap[whichx + 1][whichy + 1] * terrain.scale + .01;
70     } else {
71         vertex[1].y = terrain.heightmap[whichx][whichy] * terrain.scale + .01;
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 }
96
97 Decal::Decal(XYZ _position, decal_type _type, float _opacity, float _rotation, float size, const Model& model, int i, int which)
98     : position(_position)
99     , type(_type)
100     , opacity(_opacity)
101     , rotation(_rotation)
102     , alivetime(0)
103     , brightness(0)
104 {
105     float placex, placez;
106     if (which == 0) {
107         placex = model.getTriangleVertex(i, 0).x;
108         placez = model.getTriangleVertex(i, 0).z;
109
110         texcoords[0][0] = (placex - position.x) / (size) / 2 + .5;
111         texcoords[0][1] = (placez - position.z) / (size) / 2 + .5;
112
113         vertex[0].x = placex;
114         vertex[0].z = placez;
115         vertex[0].y = model.getTriangleVertex(i, 0).y;
116
117         placex = model.getTriangleVertex(i, 1).x;
118         placez = model.getTriangleVertex(i, 1).z;
119
120         texcoords[1][0] = (placex - position.x) / (size) / 2 + .5;
121         texcoords[1][1] = (placez - position.z) / (size) / 2 + .5;
122
123         vertex[1].x = placex;
124         vertex[1].z = placez;
125         vertex[1].y = model.getTriangleVertex(i, 1).y;
126
127         placex = model.getTriangleVertex(i, 2).x;
128         placez = model.getTriangleVertex(i, 2).z;
129
130         texcoords[2][0] = (placex - position.x) / (size) / 2 + .5;
131         texcoords[2][1] = (placez - position.z) / (size) / 2 + .5;
132
133         vertex[2].x = placex;
134         vertex[2].z = placez;
135         vertex[2].y = model.getTriangleVertex(i, 2).y;
136     } else if (which == 1) {
137         placex = model.getTriangleVertex(i, 0).y;
138         placez = model.getTriangleVertex(i, 0).z;
139
140         texcoords[0][0] = (placex - position.y) / (size) / 2 + .5;
141         texcoords[0][1] = (placez - position.z) / (size) / 2 + .5;
142
143         vertex[0].x = model.getTriangleVertex(i, 0).x;
144         vertex[0].z = placez;
145         vertex[0].y = placex;
146
147         placex = model.getTriangleVertex(i, 1).y;
148         placez = model.getTriangleVertex(i, 1).z;
149
150         texcoords[1][0] = (placex - position.y) / (size) / 2 + .5;
151         texcoords[1][1] = (placez - position.z) / (size) / 2 + .5;
152
153         vertex[1].x = model.getTriangleVertex(i, 1).x;
154         vertex[1].z = placez;
155         vertex[1].y = placex;
156
157         placex = model.getTriangleVertex(i, 2).y;
158         placez = model.getTriangleVertex(i, 2).z;
159
160         texcoords[2][0] = (placex - position.y) / (size) / 2 + .5;
161         texcoords[2][1] = (placez - position.z) / (size) / 2 + .5;
162
163         vertex[2].x = model.getTriangleVertex(i, 2).x;
164         vertex[2].z = placez;
165         vertex[2].y = placex;
166     } else {
167         placex = model.getTriangleVertex(i, 0).x;
168         placez = model.getTriangleVertex(i, 0).y;
169
170         texcoords[0][0] = (placex - position.x) / (size) / 2 + .5;
171         texcoords[0][1] = (placez - position.y) / (size) / 2 + .5;
172
173         vertex[0].x = placex;
174         vertex[0].z = model.getTriangleVertex(i, 0).z;
175         vertex[0].y = placez;
176
177         placex = model.getTriangleVertex(i, 1).x;
178         placez = model.getTriangleVertex(i, 1).y;
179
180         texcoords[1][0] = (placex - position.x) / (size) / 2 + .5;
181         texcoords[1][1] = (placez - position.y) / (size) / 2 + .5;
182
183         vertex[1].x = placex;
184         vertex[1].z = model.getTriangleVertex(i, 1).z;
185         vertex[1].y = placez;
186
187         placex = model.getTriangleVertex(i, 2).x;
188         placez = model.getTriangleVertex(i, 2).y;
189
190         texcoords[2][0] = (placex - position.x) / (size) / 2 + .5;
191         texcoords[2][1] = (placez - position.y) / (size) / 2 + .5;
192
193         vertex[2].x = placex;
194         vertex[2].z = model.getTriangleVertex(i, 2).z;
195         vertex[2].y = placez;
196     }
197 }