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