1 /* Copyright (C) 2013 Wildfire Games.
2  * This file is part of 0 A.D.
3  *
4  * 0 A.D. is free software: you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation, either version 2 of the License, or
7  * (at your option) any later version.
8  *
9  * 0 A.D. is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with 0 A.D.  If not, see <http://www.gnu.org/licenses/>.
16  */
17 
18 #ifndef INCLUDED_DECAL
19 #define INCLUDED_DECAL
20 
21 #include "graphics/Material.h"
22 #include "graphics/ModelAbstract.h"
23 #include "graphics/Texture.h"
24 
25 class CTerrain;
26 
27 /**
28  * Terrain decal definition.
29  * Decals are rectangular textures that are projected vertically downwards
30  * onto the terrain.
31  */
32 struct SDecal
33 {
SDecalSDecal34 	SDecal(const CMaterial& material, float sizeX, float sizeZ, float angle,
35 			float offsetX, float offsetZ, bool floating)
36 		: m_Material(material), m_SizeX(sizeX), m_SizeZ(sizeZ), m_Angle(angle),
37 		  m_OffsetX(offsetX), m_OffsetZ(offsetZ), m_Floating(floating)
38 	{
39 	}
40 
41 	CMaterial m_Material;
42 	float m_SizeX;
43 	float m_SizeZ;
44 	float m_Angle;
45 	float m_OffsetX;
46 	float m_OffsetZ;
47 	bool m_Floating;
48 };
49 
50 class CModelDecal : public CModelAbstract
51 {
52 public:
CModelDecal(CTerrain * terrain,const SDecal & decal)53 	CModelDecal(CTerrain* terrain, const SDecal& decal)
54 		: m_Terrain(terrain), m_Decal(decal)
55 	{
56 		ENSURE(terrain != NULL);
57 	}
58 
59 	/// Dynamic cast
ToCModelDecal()60 	virtual CModelDecal* ToCModelDecal()
61 	{
62 		return this;
63 	}
64 
65 	virtual CModelAbstract* Clone() const;
66 
SetDirtyRec(int dirtyflags)67 	virtual void SetDirtyRec(int dirtyflags)
68 	{
69 		SetDirty(dirtyflags);
70 	}
71 
72 	virtual void SetTerrainDirty(ssize_t i0, ssize_t j0, ssize_t i1, ssize_t j1);
73 
74 	virtual void CalcBounds();
75 	virtual void ValidatePosition();
76 	virtual void InvalidatePosition();
77 	virtual void SetTransform(const CMatrix3D& transform);
78 
79 	// remove shadow receiving
80 	void RemoveShadows();
81 
82 	/**
83 	 * Compute the terrain vertex indexes that bound the decal's
84 	 * projection onto the terrain.
85 	 * The returned indexes are clamped to the terrain size.
86 	 */
87 	void CalcVertexExtents(ssize_t& i0, ssize_t& j0, ssize_t& i1, ssize_t& j1);
88 
89 	CTerrain* m_Terrain;
90 	SDecal m_Decal;
91 };
92 
93 #endif // INCLUDED_DECAL
94