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 #pragma once
22 
23 #include <map>
24 #include <memory>
25 
26 #include "GLCameraBlurFilter.h"
27 #include "GLDynamicLight.h"
28 #include "GLSettings.h"
29 #include <Client/IGameMapListener.h>
30 #include <Client/IRenderer.h>
31 #include <Client/SceneDefinition.h>
32 #include <Core/Math.h>
33 
34 namespace spades {
35 	namespace draw {
36 
37 		class IGLDevice;
38 		class GLShader;
39 		class GLProgram;
40 		class GLProgramManager;
41 		class GLImageManager;
42 		class GLMapRenderer;
43 		class GLModelManager;
44 		class GLImageRenderer;
45 		class GLFlatMapRenderer;
46 		class IGLSpriteRenderer;
47 		class GLLongSpriteRenderer;
48 		class GLFramebufferManager;
49 		class GLMapShadowRenderer;
50 		class GLModelRenderer;
51 		class IGLShadowMapRenderer;
52 		class GLWaterRenderer;
53 		class GLAmbientShadowRenderer;
54 		class GLRadiosityRenderer;
55 		class GLLensDustFilter;
56 		class GLSoftLitSpriteRenderer;
57 		class GLAutoExposureFilter;
58 		class GLProfiler;
59 
60 		class GLRenderer : public client::IRenderer, public client::IGameMapListener {
61 			friend class GLShadowShader;
62 			friend class IGLShadowMapRenderer;
63 			friend class GLRadiosityRenderer;
64 			friend class GLSoftLitSpriteRenderer;
65 
66 			struct DebugLine {
67 				Vector3 v1, v2;
68 				Vector4 color;
69 			};
70 
71 			Handle<IGLDevice> device;
72 			GLFramebufferManager *fbManager;
73 			client::GameMap *map;
74 			GLSettings settings;
75 
76 			std::unique_ptr<GLProfiler> profiler;
77 
78 			bool inited;
79 			bool sceneUsedInThisFrame;
80 
81 			client::SceneDefinition sceneDef;
82 			Plane3 frustrum[6];
83 
84 			std::vector<DebugLine> debugLines;
85 			std::vector<GLDynamicLight> lights;
86 
87 			GLProgramManager *programManager;
88 			GLImageManager *imageManager;
89 			GLModelManager *modelManager;
90 
91 			IGLShadowMapRenderer *shadowMapRenderer;
92 			GLMapShadowRenderer *mapShadowRenderer;
93 			GLMapRenderer *mapRenderer;
94 			GLImageRenderer *imageRenderer;
95 			GLFlatMapRenderer *flatMapRenderer;
96 			GLModelRenderer *modelRenderer;
97 			IGLSpriteRenderer *spriteRenderer;
98 			GLLongSpriteRenderer *longSpriteRenderer;
99 			GLWaterRenderer *waterRenderer;
100 			GLAmbientShadowRenderer *ambientShadowRenderer;
101 			GLRadiosityRenderer *radiosityRenderer;
102 
103 			GLCameraBlurFilter *cameraBlur;
104 			GLLensDustFilter *lensDustFilter;
105 			GLAutoExposureFilter *autoExposureFilter;
106 
107 			// used when r_ssao = 1. only valid while rendering objects
108 			IGLDevice::UInteger ssaoBufferTexture;
109 
110 			// used when r_srgb = 1
111 			IGLDevice::UInteger lastColorBufferTexture;
112 
113 			float fogDistance;
114 			Vector3 fogColor;
115 
116 			// used for color correction
117 			Vector3 smoothedFogColor;
118 
119 			Matrix4 projectionMatrix;
120 			Matrix4 viewMatrix;
121 			Matrix4 projectionViewMatrix;
122 			bool renderingMirror;
123 
124 			Vector4 drawColorAlphaPremultiplied;
125 			bool legacyColorPremultiply;
126 
127 			unsigned int lastTime;
128 
129 			bool duringSceneRendering;
130 
131 			void BuildProjectionMatrix();
132 			void BuildView();
133 			void BuildFrustrum();
134 
135 			void RenderDebugLines();
136 
137 			void RenderObjects();
138 
139 			void EnsureInitialized();
140 			void EnsureSceneStarted();
141 			void EnsureSceneNotStarted();
142 
143 		protected:
144 			~GLRenderer();
145 
146 		public:
147 			GLRenderer(IGLDevice *glDevice);
148 
149 			void Init() override;
150 			void Shutdown() override;
151 
152 			client::IImage *RegisterImage(const char *filename) override;
153 			client::IModel *RegisterModel(const char *filename) override;
154 
155 			client::IImage *CreateImage(Bitmap *) override;
156 			client::IModel *CreateModel(VoxelModel *) override;
157 			client::IModel *CreateModelOptimized(VoxelModel *);
158 
159 			GLProgram *RegisterProgram(const std::string &name);
160 			GLShader *RegisterShader(const std::string &name);
161 
162 			void SetGameMap(client::GameMap *) override;
163 			void SetFogColor(Vector3 v) override;
SetFogDistance(float f)164 			void SetFogDistance(float f) override { fogDistance = f; }
165 
GetFogColor()166 			Vector3 GetFogColor() { return fogColor; }
GetFogDistance()167 			float GetFogDistance() { return fogDistance; }
168 			Vector3 GetFogColorForSolidPass();
169 
170 			void StartScene(const client::SceneDefinition &) override;
171 
172 			void RenderModel(client::IModel *, const client::ModelRenderParam &) override;
173 
174 			void AddLight(const client::DynamicLightParam &light) override;
175 
176 			void AddDebugLine(Vector3 a, Vector3 b, Vector4 color) override;
177 
178 			void AddSprite(client::IImage *, Vector3 center, float radius, float rotation) override;
179 			void AddLongSprite(client::IImage *, Vector3 p1, Vector3 p2, float radius) override;
180 
181 			void EndScene() override;
182 
183 			void MultiplyScreenColor(Vector3) override;
184 
185 			void SetColor(Vector4) override;
186 			void SetColorAlphaPremultiplied(Vector4) override;
187 
188 			void DrawImage(client::IImage *, const Vector2 &outTopLeft) override;
189 			void DrawImage(client::IImage *, const AABB2 &outRect) override;
190 			void DrawImage(client::IImage *, const Vector2 &outTopLeft,
191 			               const AABB2 &inRect) override;
192 			void DrawImage(client::IImage *, const AABB2 &outRect, const AABB2 &inRect) override;
193 			void DrawImage(client::IImage *, const Vector2 &outTopLeft, const Vector2 &outTopRight,
194 			               const Vector2 &outBottomLeft, const AABB2 &inRect) override;
195 
196 			void DrawFlatGameMap(const AABB2 &outRect, const AABB2 &inRect) override;
197 
198 			void FrameDone() override;
199 			void Flip() override;
200 			Bitmap *ReadBitmap() override;
201 
202 			float ScreenWidth() override;
203 			float ScreenHeight() override;
204 
GetSettings()205 			GLSettings &GetSettings() { return settings; }
GetGLDevice()206 			IGLDevice *GetGLDevice() { return device; }
GetGLProfiler()207 			GLProfiler &GetGLProfiler() { return *profiler; }
GetFramebufferManager()208 			GLFramebufferManager *GetFramebufferManager() { return fbManager; }
GetShadowMapRenderer()209 			IGLShadowMapRenderer *GetShadowMapRenderer() { return shadowMapRenderer; }
GetAmbientShadowRenderer()210 			GLAmbientShadowRenderer *GetAmbientShadowRenderer() { return ambientShadowRenderer; }
GetMapShadowRenderer()211 			GLMapShadowRenderer *GetMapShadowRenderer() { return mapShadowRenderer; }
GetRadiosityRenderer()212 			GLRadiosityRenderer *GetRadiosityRenderer() { return radiosityRenderer; }
GetModelRenderer()213 			GLModelRenderer *GetModelRenderer() { return modelRenderer; }
214 
GetProjectionMatrix()215 			const Matrix4 &GetProjectionMatrix() const { return projectionMatrix; }
GetProjectionViewMatrix()216 			const Matrix4 &GetProjectionViewMatrix() const { return projectionViewMatrix; }
GetViewMatrix()217 			const Matrix4 &GetViewMatrix() const { return viewMatrix; }
218 
IsRenderingMirror()219 			bool IsRenderingMirror() const { return renderingMirror; }
220 
221 			void GameMapChanged(int x, int y, int z, client::GameMap *) override;
222 
GetSceneDef()223 			const client::SceneDefinition &GetSceneDef() const { return sceneDef; }
224 
225 			bool BoxFrustrumCull(const AABB3 &);
226 			bool SphereFrustrumCull(const Vector3 &center, float radius);
227 		};
228 	}
229 }
230