1 /*
2  Copyright (c) 2013 yvt
3 
4  This file is part of OpenSpades.
5 
6  OpenSpades is free software: you can redistribute it and/or modify
7  it under the terms of the GNU General Public License as published by
8  the Free Software Foundation, either version 3 of the License, or
9  (at your option) any later version.
10 
11  OpenSpades is distributed in the hope that it will be useful,
12  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  GNU General Public License for more details.
15 
16  You should have received a copy of the GNU General Public License
17  along with OpenSpades.  If not, see <http://www.gnu.org/licenses/>.
18 
19  */
20 
21 #include <cstdint>
22 
23 #include "IGLDevice.h"
24 #include "IGLShadowMapRenderer.h"
25 
26 namespace spades {
27 	namespace draw {
28 		class GLRenderer;
29 		class GLShadowShader;
30 		class GLSettings;
31 		class GLSparseShadowMapRenderer : public IGLShadowMapRenderer {
32 			friend class GLShadowMapShader;
33 			friend class GLShadowShader;
34 
35 			struct ModelRenderer;
36 			struct Internal;
37 
38 			enum { Tiles = 64 };
39 
40 			IGLDevice *device;
41 			GLSettings &settings;
42 
43 			int textureSize;
44 			int minLod;
45 			int maxLod;
46 
47 			uint32_t pagetable[Tiles][Tiles];
48 
49 			IGLDevice::UInteger framebuffer;
50 			IGLDevice::UInteger texture;
51 			IGLDevice::UInteger pagetableTexture;
52 
53 			// not used, but required
54 			IGLDevice::UInteger colorTexture;
55 
56 			Matrix4 matrix;
57 			OBB3 obb;
58 			float vpWidth, vpHeight; // used for culling
59 
60 			void BuildMatrix(float near, float far);
61 
62 		protected:
63 			void RenderShadowMapPass() override;
64 
65 		public:
66 			GLSparseShadowMapRenderer(GLRenderer *);
67 			~GLSparseShadowMapRenderer();
68 			void Render() override;
69 
70 			bool Cull(const AABB3 &) override;
71 			bool SphereCull(const Vector3 &center, float rad) override;
72 		};
73 	}
74 }
75