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 ¢er, float radius); 218 }; 219 } 220 } 221