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 ¢er, float radius); 227 }; 228 } 229 } 230