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 <array>
24 #include <map>
25 #include <memory>
26 #include <vector>
27 
28 #include "SWFeatureLevel.h"
29 #include <Client/IGameMapListener.h>
30 #include <Client/IRenderer.h>
31 #include <Client/SceneDefinition.h>
32 #include <Core/Math.h>
33 #include <Core/Stopwatch.h>
34 
35 namespace spades {
36 	namespace draw {
37 
38 		class SWPort;
39 		class SWImageManager;
40 		class SWModelManager;
41 		class SWImageRenderer;
42 		class SWModelRenderer;
43 		class SWFlatMapRenderer;
44 		class SWMapRenderer;
45 		class SWImage;
46 		class SWModel;
47 
48 		class SWRenderer : public client::IRenderer, public client::IGameMapListener {
49 			friend class SWFlatMapRenderer;
50 			friend class SWModelRenderer;
51 			friend class SWMapRenderer;
52 
53 			SWFeatureLevel featureLevel;
54 
55 			Handle<SWPort> port;
56 			Handle<client::GameMap> map;
57 
58 			Handle<Bitmap> fb;
59 			std::vector<float> depthBuffer;
60 
61 			std::shared_ptr<SWImageManager> imageManager;
62 			std::shared_ptr<SWModelManager> modelManager;
63 
64 			std::shared_ptr<SWImageRenderer> imageRenderer;
65 			std::shared_ptr<SWModelRenderer> modelRenderer;
66 
67 			std::shared_ptr<SWFlatMapRenderer> flatMapRenderer;
68 			std::shared_ptr<SWMapRenderer> mapRenderer;
69 
70 			struct Sprite {
71 				Handle<SWImage> img;
72 				Vector3 center;
73 				float radius;
74 				float rotation;
75 				Vector4 color;
76 			};
77 			std::vector<Sprite> sprites;
78 
79 			struct LongSprite {
80 				Handle<SWImage> img;
81 				Vector3 start;
82 				Vector3 end;
83 				float radius;
84 				Vector4 color;
85 			};
86 			std::vector<LongSprite> longSprites;
87 
88 			struct Model {
89 				Handle<SWModel> model;
90 				client::ModelRenderParam param;
91 			};
92 			std::vector<Model> models;
93 
94 			struct DynamicLight {
95 				client::DynamicLightParam param;
96 				int minX, maxX, minY, maxY;
97 			};
98 			std::vector<DynamicLight> lights;
99 
100 			bool inited;
101 			bool sceneUsedInThisFrame;
102 
103 			client::SceneDefinition sceneDef;
104 			std::array<Plane3, 6> frustrum;
105 
106 			struct DebugLine {
107 				Vector3 v1, v2;
108 				Vector4 color;
109 			};
110 
111 			std::vector<DebugLine> debugLines;
112 
113 			float fogDistance;
114 			Vector3 fogColor;
115 
116 			Matrix4 projectionMatrix;
117 			Matrix4 viewMatrix;
118 			Matrix4 projectionViewMatrix;
119 
120 			Vector4 drawColorAlphaPremultiplied;
121 			bool legacyColorPremultiply;
122 
123 			unsigned int lastTime;
124 
125 			Stopwatch renderStopwatch;
126 
127 			bool duringSceneRendering;
128 
129 			void BuildProjectionMatrix();
130 			void BuildView();
131 			void BuildFrustrum();
132 
133 			void RenderDebugLines();
134 
135 			void RenderObjects();
136 
137 			void EnsureInitialized();
138 			void EnsureSceneStarted();
139 			void EnsureSceneNotStarted();
140 			void EnsureValid();
141 
142 			void SetFramebuffer(Bitmap *);
143 
144 			template <SWFeatureLevel> void ApplyFog();
145 
146 			template <SWFeatureLevel> void ApplyDynamicLight(const DynamicLight &);
147 
148 		protected:
149 			~SWRenderer();
150 
151 		public:
152 			SWRenderer(SWPort *port, SWFeatureLevel featureLevel = DetectFeatureLevel());
153 
154 			void Init() override;
155 			void Shutdown() override;
156 
157 			client::IImage *RegisterImage(const char *filename) override;
158 			client::IModel *RegisterModel(const char *filename) override;
159 
160 			client::IImage *CreateImage(Bitmap *) override;
161 			client::IModel *CreateModel(VoxelModel *) override;
162 			/*
163 			GLProgram *RegisterProgram(const std::string& name) override;
164 			GLShader *RegisterShader(const std::string& name) override;
165 			*/
166 			void SetGameMap(client::GameMap *) override;
167 			void SetFogColor(Vector3 v) override;
SetFogDistance(float f)168 			void SetFogDistance(float f) override { fogDistance = f; }
169 
GetFogColor()170 			Vector3 GetFogColor() { return fogColor; }
GetFogDistance()171 			float GetFogDistance() { return fogDistance; }
172 
173 			void StartScene(const client::SceneDefinition &) override;
174 
175 			void RenderModel(client::IModel *, const client::ModelRenderParam &) override;
176 
177 			void AddLight(const client::DynamicLightParam &light) override;
178 
179 			void AddDebugLine(Vector3 a, Vector3 b, Vector4 color) override;
180 
181 			void AddSprite(client::IImage *, Vector3 center, float radius, float rotation) override;
182 			void AddLongSprite(client::IImage *, Vector3 p1, Vector3 p2, float radius) override;
183 
184 			void EndScene() override;
185 
186 			void MultiplyScreenColor(Vector3) override;
187 
188 			void SetColor(Vector4) override;
189 			void SetColorAlphaPremultiplied(Vector4) override;
190 
191 			void DrawImage(client::IImage *, const Vector2 &outTopLeft) override;
192 			void DrawImage(client::IImage *, const AABB2 &outRect) override;
193 			void DrawImage(client::IImage *, const Vector2 &outTopLeft,
194 			               const AABB2 &inRect) override;
195 			void DrawImage(client::IImage *, const AABB2 &outRect, const AABB2 &inRect) override;
196 			void DrawImage(client::IImage *, const Vector2 &outTopLeft, const Vector2 &outTopRight,
197 			               const Vector2 &outBottomLeft, const AABB2 &inRect) override;
198 
199 			void DrawFlatGameMap(const AABB2 &outRect, const AABB2 &inRect) override;
200 
201 			void FrameDone() override;
202 			void Flip() override;
203 			Bitmap *ReadBitmap() override;
204 
205 			float ScreenWidth() override;
206 			float ScreenHeight() override;
207 
GetProjectionMatrix()208 			const Matrix4 &GetProjectionMatrix() const { return projectionMatrix; }
GetProjectionViewMatrix()209 			const Matrix4 &GetProjectionViewMatrix() const { return projectionViewMatrix; }
GetViewMatrix()210 			const Matrix4 &GetViewMatrix() const { return viewMatrix; }
211 
212 			void GameMapChanged(int x, int y, int z, client::GameMap *) override;
213 
GetSceneDef()214 			const client::SceneDefinition &GetSceneDef() const { return sceneDef; }
215 
216 			bool BoxFrustrumCull(const AABB3 &);
217 			bool SphereFrustrumCull(const Vector3 &center, float radius);
218 		};
219 	}
220 }
221