]> git.jsancho.org Git - lugaru.git/blob - Source/Graphic/Decal.cpp
Fixes #74 Shadow glitch (was using decal.vertex instead of model.vertex)
[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 #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
75     placex = (float)whichx * terrain.scale;
76     placez = (float)whichy * terrain.scale + terrain.scale;
77
78     texcoords[2][0] = (placex - position.x) / size / 2 + .5;
79     texcoords[2][1] = (placez - position.z) / size / 2 + .5;
80
81     vertex[2].x = placex;
82     vertex[2].z = placez;
83     vertex[2].y = terrain.heightmap[whichx][whichy + 1] * terrain.scale + .01;
84
85     XYZ rot;
86     if (rotation) {
87         for (int i = 0; i < 3; i++) {
88             rot.y = 0;
89             rot.x = texcoords[i][0] - .5;
90             rot.z = texcoords[i][1] - .5;
91             rot = DoRotation(rot, 0, -rotation, 0);
92             texcoords[i][0] = rot.x + .5;
93             texcoords[i][1] = rot.z + .5;
94         }
95     }
96 }
97
98 Decal::Decal(XYZ _position, decal_type _type, float _opacity, float _rotation, float size, const Model& model, int i, int which) :
99     position(_position),
100     type(_type),
101     opacity(_opacity),
102     rotation(_rotation),
103     alivetime(0),
104     brightness(0)
105 {
106     float placex, placez;
107     if (which == 0) {
108         placex = model.vertex[model.Triangles[i].vertex[0]].x;
109         placez = model.vertex[model.Triangles[i].vertex[0]].z;
110
111         texcoords[0][0] = (placex - position.x) / (size) / 2 + .5;
112         texcoords[0][1] = (placez - position.z) / (size) / 2 + .5;
113
114         vertex[0].x = placex;
115         vertex[0].z = placez;
116         vertex[0].y = model.vertex[model.Triangles[i].vertex[0]].y;
117
118
119         placex = model.vertex[model.Triangles[i].vertex[1]].x;
120         placez = model.vertex[model.Triangles[i].vertex[1]].z;
121
122         texcoords[1][0] = (placex - position.x) / (size) / 2 + .5;
123         texcoords[1][1] = (placez - position.z) / (size) / 2 + .5;
124
125         vertex[1].x = placex;
126         vertex[1].z = placez;
127         vertex[1].y = model.vertex[model.Triangles[i].vertex[1]].y;
128
129
130         placex = model.vertex[model.Triangles[i].vertex[2]].x;
131         placez = model.vertex[model.Triangles[i].vertex[2]].z;
132
133         texcoords[2][0] = (placex - position.x) / (size) / 2 + .5;
134         texcoords[2][1] = (placez - position.z) / (size) / 2 + .5;
135
136         vertex[2].x = placex;
137         vertex[2].z = placez;
138         vertex[2].y = model.vertex[model.Triangles[i].vertex[2]].y;
139     } else if (which == 1) {
140         placex = model.vertex[model.Triangles[i].vertex[0]].y;
141         placez = model.vertex[model.Triangles[i].vertex[0]].z;
142
143         texcoords[0][0] = (placex - position.y) / (size) / 2 + .5;
144         texcoords[0][1] = (placez - position.z) / (size) / 2 + .5;
145
146         vertex[0].x = model.vertex[model.Triangles[i].vertex[0]].x;
147         vertex[0].z = placez;
148         vertex[0].y = placex;
149
150
151         placex = model.vertex[model.Triangles[i].vertex[1]].y;
152         placez = model.vertex[model.Triangles[i].vertex[1]].z;
153
154         texcoords[1][0] = (placex - position.y) / (size) / 2 + .5;
155         texcoords[1][1] = (placez - position.z) / (size) / 2 + .5;
156
157         vertex[1].x = model.vertex[model.Triangles[i].vertex[1]].x;
158         vertex[1].z = placez;
159         vertex[1].y = placex;
160
161
162         placex = model.vertex[model.Triangles[i].vertex[2]].y;
163         placez = model.vertex[model.Triangles[i].vertex[2]].z;
164
165         texcoords[2][0] = (placex - position.y) / (size) / 2 + .5;
166         texcoords[2][1] = (placez - position.z) / (size) / 2 + .5;
167
168         vertex[2].x = model.vertex[model.Triangles[i].vertex[2]].x;
169         vertex[2].z = placez;
170         vertex[2].y = placex;
171     } else {
172         placex = model.vertex[model.Triangles[i].vertex[0]].x;
173         placez = model.vertex[model.Triangles[i].vertex[0]].y;
174
175         texcoords[0][0] = (placex - position.x) / (size) / 2 + .5;
176         texcoords[0][1] = (placez - position.y) / (size) / 2 + .5;
177
178         vertex[0].x = placex;
179         vertex[0].z = model.vertex[model.Triangles[i].vertex[0]].z;
180         vertex[0].y = placez;
181
182
183         placex = model.vertex[model.Triangles[i].vertex[1]].x;
184         placez = model.vertex[model.Triangles[i].vertex[1]].y;
185
186         texcoords[1][0] = (placex - position.x) / (size) / 2 + .5;
187         texcoords[1][1] = (placez - position.y) / (size) / 2 + .5;
188
189         vertex[1].x = placex;
190         vertex[1].z = model.vertex[model.Triangles[i].vertex[1]].z;
191         vertex[1].y = placez;
192
193
194         placex = model.vertex[model.Triangles[i].vertex[2]].x;
195         placez = model.vertex[model.Triangles[i].vertex[2]].y;
196
197         texcoords[2][0] = (placex - position.x) / (size) / 2 + .5;
198         texcoords[2][1] = (placez - position.y) / (size) / 2 + .5;
199
200         vertex[2].x = placex;
201         vertex[2].z = model.vertex[model.Triangles[i].vertex[2]].z;
202         vertex[2].y = placez;
203     }
204 }