2 Copyright (C) 2003, 2010 - Wolfire Games
3 Copyright (C) 2010-2016 - Lugaru contributors (see AUTHORS file)
5 This file is part of Lugaru.
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.
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.
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/>.
21 #include "Graphic/Decal.hpp"
23 #include "Environment/Terrain.hpp"
24 #include "Graphic/Models.hpp"
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) :
42 brightness(_brightness)
45 placex = (float)whichx * terrain.scale + terrain.scale;
46 placez = (float)whichy * terrain.scale;
48 texcoords[0][0] = (placex - position.x) / size / 2 + .5;
49 texcoords[0][1] = (placez - position.z) / size / 2 + .5;
53 vertex[0].y = terrain.heightmap[whichx + 1][whichy] * terrain.scale + .01;
56 placex = (float)whichx * terrain.scale + terrain.scale;
57 placez = (float)whichy * terrain.scale + terrain.scale;
59 placex = (float)whichx * terrain.scale;
60 placez = (float)whichy * terrain.scale;
63 texcoords[1][0] = (placex - position.x) / size / 2 + .5;
64 texcoords[1][1] = (placez - position.z) / size / 2 + .5;
69 vertex[1].y = terrain.heightmap[whichx + 1][whichy + 1] * terrain.scale + .01;
71 vertex[1].y = terrain.heightmap[whichx][whichy] * terrain.scale + .01;
75 placex = (float)whichx * terrain.scale;
76 placez = (float)whichy * terrain.scale + terrain.scale;
78 texcoords[2][0] = (placex - position.x) / size / 2 + .5;
79 texcoords[2][1] = (placez - position.z) / size / 2 + .5;
83 vertex[2].y = terrain.heightmap[whichx][whichy + 1] * terrain.scale + .01;
87 for (int i = 0; i < 3; i++) {
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;
98 Decal::Decal(XYZ _position, decal_type _type, float _opacity, float _rotation, float size, const Model& model, int i, int which) :
106 float placex, placez;
108 placex = vertex[model.Triangles[i].vertex[0]].x;
109 placez = vertex[model.Triangles[i].vertex[0]].z;
111 texcoords[0][0] = (placex - position.x) / (size) / 2 + .5;
112 texcoords[0][1] = (placez - position.z) / (size) / 2 + .5;
114 vertex[0].x = placex;
115 vertex[0].z = placez;
116 vertex[0].y = vertex[model.Triangles[i].vertex[0]].y;
119 placex = vertex[model.Triangles[i].vertex[1]].x;
120 placez = vertex[model.Triangles[i].vertex[1]].z;
122 texcoords[1][0] = (placex - position.x) / (size) / 2 + .5;
123 texcoords[1][1] = (placez - position.z) / (size) / 2 + .5;
125 vertex[1].x = placex;
126 vertex[1].z = placez;
127 vertex[1].y = vertex[model.Triangles[i].vertex[1]].y;
130 placex = vertex[model.Triangles[i].vertex[2]].x;
131 placez = vertex[model.Triangles[i].vertex[2]].z;
133 texcoords[2][0] = (placex - position.x) / (size) / 2 + .5;
134 texcoords[2][1] = (placez - position.z) / (size) / 2 + .5;
136 vertex[2].x = placex;
137 vertex[2].z = placez;
138 vertex[2].y = vertex[model.Triangles[i].vertex[2]].y;
139 } else if (which == 1) {
140 placex = vertex[model.Triangles[i].vertex[0]].y;
141 placez = vertex[model.Triangles[i].vertex[0]].z;
143 texcoords[0][0] = (placex - position.y) / (size) / 2 + .5;
144 texcoords[0][1] = (placez - position.z) / (size) / 2 + .5;
146 vertex[0].x = vertex[model.Triangles[i].vertex[0]].x;
147 vertex[0].z = placez;
148 vertex[0].y = placex;
151 placex = vertex[model.Triangles[i].vertex[1]].y;
152 placez = vertex[model.Triangles[i].vertex[1]].z;
154 texcoords[1][0] = (placex - position.y) / (size) / 2 + .5;
155 texcoords[1][1] = (placez - position.z) / (size) / 2 + .5;
157 vertex[1].x = vertex[model.Triangles[i].vertex[1]].x;
158 vertex[1].z = placez;
159 vertex[1].y = placex;
162 placex = vertex[model.Triangles[i].vertex[2]].y;
163 placez = vertex[model.Triangles[i].vertex[2]].z;
165 texcoords[2][0] = (placex - position.y) / (size) / 2 + .5;
166 texcoords[2][1] = (placez - position.z) / (size) / 2 + .5;
168 vertex[2].x = vertex[model.Triangles[i].vertex[2]].x;
169 vertex[2].z = placez;
170 vertex[2].y = placex;
172 placex = vertex[model.Triangles[i].vertex[0]].x;
173 placez = vertex[model.Triangles[i].vertex[0]].y;
175 texcoords[0][0] = (placex - position.x) / (size) / 2 + .5;
176 texcoords[0][1] = (placez - position.y) / (size) / 2 + .5;
178 vertex[0].x = placex;
179 vertex[0].z = vertex[model.Triangles[i].vertex[0]].z;
180 vertex[0].y = placez;
183 placex = vertex[model.Triangles[i].vertex[1]].x;
184 placez = vertex[model.Triangles[i].vertex[1]].y;
186 texcoords[1][0] = (placex - position.x) / (size) / 2 + .5;
187 texcoords[1][1] = (placez - position.y) / (size) / 2 + .5;
189 vertex[1].x = placex;
190 vertex[1].z = vertex[model.Triangles[i].vertex[1]].z;
191 vertex[1].y = placez;
194 placex = vertex[model.Triangles[i].vertex[2]].x;
195 placez = vertex[model.Triangles[i].vertex[2]].y;
197 texcoords[2][0] = (placex - position.x) / (size) / 2 + .5;
198 texcoords[2][1] = (placez - position.y) / (size) / 2 + .5;
200 vertex[2].x = placex;
201 vertex[2].z = vertex[model.Triangles[i].vertex[2]].z;
202 vertex[2].y = placez;