1 #ifndef OPENMW_MWRENDER_RENDERINGMANAGER_H
2 #define OPENMW_MWRENDER_RENDERINGMANAGER_H
3 
4 #include <osg/ref_ptr>
5 #include <osg/Light>
6 #include <osg/Camera>
7 
8 #include <components/settings/settings.hpp>
9 
10 #include <osgUtil/IncrementalCompileOperation>
11 
12 #include "objects.hpp"
13 
14 #include "renderinginterface.hpp"
15 #include "rendermode.hpp"
16 
17 #include <deque>
18 #include <memory>
19 
20 namespace osg
21 {
22     class Group;
23     class PositionAttitudeTransform;
24 }
25 
26 namespace osgUtil
27 {
28     class IntersectionVisitor;
29     class Intersector;
30 }
31 
32 namespace Resource
33 {
34     class ResourceSystem;
35 }
36 
37 namespace osgViewer
38 {
39     class Viewer;
40 }
41 
42 namespace ESM
43 {
44     struct Cell;
45     struct RefNum;
46 }
47 
48 namespace Terrain
49 {
50     class World;
51 }
52 
53 namespace Fallback
54 {
55     class Map;
56 }
57 
58 namespace SceneUtil
59 {
60     class ShadowManager;
61     class WorkQueue;
62     class UnrefQueue;
63 }
64 
65 namespace DetourNavigator
66 {
67     struct Navigator;
68     struct Settings;
69 }
70 
71 namespace MWRender
72 {
73     class GroundcoverUpdater;
74     class StateUpdater;
75 
76     class EffectManager;
77     class ScreenshotManager;
78     class FogManager;
79     class SkyManager;
80     class NpcAnimation;
81     class Pathgrid;
82     class Camera;
83     class ViewOverShoulderController;
84     class Water;
85     class TerrainStorage;
86     class LandManager;
87     class NavMesh;
88     class ActorsPaths;
89     class RecastMesh;
90     class ObjectPaging;
91     class Groundcover;
92 
93     class RenderingManager : public MWRender::RenderingInterface
94     {
95     public:
96         RenderingManager(osgViewer::Viewer* viewer, osg::ref_ptr<osg::Group> rootNode,
97                          Resource::ResourceSystem* resourceSystem, SceneUtil::WorkQueue* workQueue,
98                          const std::string& resourcePath, DetourNavigator::Navigator& navigator);
99         ~RenderingManager();
100 
101         osgUtil::IncrementalCompileOperation* getIncrementalCompileOperation();
102 
103         MWRender::Objects& getObjects() override;
104 
105         Resource::ResourceSystem* getResourceSystem();
106 
107         SceneUtil::WorkQueue* getWorkQueue();
108         SceneUtil::UnrefQueue* getUnrefQueue();
109         Terrain::World* getTerrain();
110 
111         osg::Uniform* mUniformNear;
112         osg::Uniform* mUniformFar;
113 
114         void preloadCommonAssets();
115 
116         double getReferenceTime() const;
117 
118         osg::Group* getLightRoot();
119 
120         void setNightEyeFactor(float factor);
121 
122         void setAmbientColour(const osg::Vec4f& colour);
123 
124         void skySetDate(int day, int month);
125         int skyGetMasserPhase() const;
126         int skyGetSecundaPhase() const;
127         void skySetMoonColour(bool red);
128 
129         void setSunDirection(const osg::Vec3f& direction);
130         void setSunColour(const osg::Vec4f& diffuse, const osg::Vec4f& specular);
131 
132         void configureAmbient(const ESM::Cell* cell);
133         void configureFog(const ESM::Cell* cell);
134         void configureFog(float fogDepth, float underwaterFog, float dlFactor, float dlOffset, const osg::Vec4f& colour);
135 
136         void addCell(const MWWorld::CellStore* store);
137         void removeCell(const MWWorld::CellStore* store);
138 
139         void enableTerrain(bool enable);
140 
141         void updatePtr(const MWWorld::Ptr& old, const MWWorld::Ptr& updated);
142 
143         void rotateObject(const MWWorld::Ptr& ptr, const osg::Quat& rot);
144         void moveObject(const MWWorld::Ptr& ptr, const osg::Vec3f& pos);
145         void scaleObject(const MWWorld::Ptr& ptr, const osg::Vec3f& scale);
146 
147         void removeObject(const MWWorld::Ptr& ptr);
148 
149         void setWaterEnabled(bool enabled);
150         void setWaterHeight(float level);
151 
152         /// Take a screenshot of w*h onto the given image, not including the GUI.
153         void screenshot(osg::Image* image, int w, int h);
154         bool screenshot360(osg::Image* image);
155 
156         struct RayResult
157         {
158             bool mHit;
159             osg::Vec3f mHitNormalWorld;
160             osg::Vec3f mHitPointWorld;
161             MWWorld::Ptr mHitObject;
162             ESM::RefNum mHitRefnum;
163             float mRatio;
164         };
165 
166         RayResult castRay(const osg::Vec3f& origin, const osg::Vec3f& dest, bool ignorePlayer, bool ignoreActors=false);
167 
168         /// Return the object under the mouse cursor / crosshair position, given by nX and nY normalized screen coordinates,
169         /// where (0,0) is the top left corner.
170         RayResult castCameraToViewportRay(const float nX, const float nY, float maxDistance, bool ignorePlayer, bool ignoreActors=false);
171 
172         /// Get the bounding box of the given object in screen coordinates as (minX, minY, maxX, maxY), with (0,0) being the top left corner.
173         osg::Vec4f getScreenBounds(const osg::BoundingBox &worldbb);
174 
175         void setSkyEnabled(bool enabled);
176 
177         bool toggleRenderMode(RenderMode mode);
178 
179         SkyManager* getSkyManager();
180 
181         void spawnEffect(const std::string &model, const std::string &texture, const osg::Vec3f &worldPosition, float scale = 1.f, bool isMagicVFX = true);
182 
183         /// Clear all savegame-specific data
184         void clear();
185 
186         /// Clear all worldspace-specific data
187         void notifyWorldSpaceChanged();
188 
189         void update(float dt, bool paused);
190 
191         Animation* getAnimation(const MWWorld::Ptr& ptr);
192         const Animation* getAnimation(const MWWorld::ConstPtr& ptr) const;
193 
194         void addWaterRippleEmitter(const MWWorld::Ptr& ptr);
195         void removeWaterRippleEmitter(const MWWorld::Ptr& ptr);
196         void emitWaterRipple(const osg::Vec3f& pos);
197 
198         void updatePlayerPtr(const MWWorld::Ptr &ptr);
199 
200         void removePlayer(const MWWorld::Ptr& player);
201         void setupPlayer(const MWWorld::Ptr& player);
202         void renderPlayer(const MWWorld::Ptr& player);
203 
204         void rebuildPtr(const MWWorld::Ptr& ptr);
205 
206         void processChangedSettings(const Settings::CategorySettingVector& settings);
207 
208         float getNearClipDistance() const;
209 
210         float getTerrainHeightAt(const osg::Vec3f& pos);
211 
212         // camera stuff
getCamera()213         Camera* getCamera() { return mCamera.get(); }
getCameraPosition() const214         const osg::Vec3f& getCameraPosition() const { return mCurrentCameraPos; }
215 
216         /// temporarily override the field of view with given value.
217         void overrideFieldOfView(float val);
218         /// reset a previous overrideFieldOfView() call, i.e. revert to field of view specified in the settings file.
219         void resetFieldOfView();
220 
221         osg::Vec3f getHalfExtents(const MWWorld::ConstPtr& object) const;
222 
223         void exportSceneGraph(const MWWorld::Ptr& ptr, const std::string& filename, const std::string& format);
224 
225         LandManager* getLandManager() const;
226 
227         bool toggleBorders();
228 
229         void updateActorPath(const MWWorld::ConstPtr& actor, const std::deque<osg::Vec3f>& path,
230                 const osg::Vec3f& halfExtents, const osg::Vec3f& start, const osg::Vec3f& end) const;
231 
232         void removeActorPath(const MWWorld::ConstPtr& actor) const;
233 
234         void setNavMeshNumber(const std::size_t value);
235 
236         void setActiveGrid(const osg::Vec4i &grid);
237 
238         bool pagingEnableObject(int type, const MWWorld::ConstPtr& ptr, bool enabled);
239         void pagingBlacklistObject(int type, const MWWorld::ConstPtr &ptr);
240         bool pagingUnlockCache();
241         void getPagedRefnums(const osg::Vec4i &activeGrid, std::set<ESM::RefNum> &out);
242 
243     private:
244         void updateProjectionMatrix();
245         void updateTextureFiltering();
246         void updateAmbient();
247         void setFogColor(const osg::Vec4f& color);
248         void updateThirdPersonViewMode();
249 
250         void reportStats() const;
251 
252         void updateNavMesh();
253 
254         void updateRecastMesh();
255 
256         osg::ref_ptr<osgUtil::IntersectionVisitor> getIntersectionVisitor(osgUtil::Intersector* intersector, bool ignorePlayer, bool ignoreActors);
257 
258         osg::ref_ptr<osgUtil::IntersectionVisitor> mIntersectionVisitor;
259 
260         osg::ref_ptr<osgViewer::Viewer> mViewer;
261         osg::ref_ptr<osg::Group> mRootNode;
262         osg::ref_ptr<osg::Group> mSceneRoot;
263         Resource::ResourceSystem* mResourceSystem;
264 
265         osg::ref_ptr<GroundcoverUpdater> mGroundcoverUpdater;
266 
267         osg::ref_ptr<SceneUtil::WorkQueue> mWorkQueue;
268         osg::ref_ptr<SceneUtil::UnrefQueue> mUnrefQueue;
269 
270         osg::ref_ptr<osg::Light> mSunLight;
271 
272         DetourNavigator::Navigator& mNavigator;
273         std::unique_ptr<NavMesh> mNavMesh;
274         std::size_t mNavMeshNumber = 0;
275         std::unique_ptr<ActorsPaths> mActorsPaths;
276         std::unique_ptr<RecastMesh> mRecastMesh;
277         std::unique_ptr<Pathgrid> mPathgrid;
278         std::unique_ptr<Objects> mObjects;
279         std::unique_ptr<Water> mWater;
280         std::unique_ptr<Terrain::World> mTerrain;
281         std::unique_ptr<Terrain::World> mGroundcoverWorld;
282         std::unique_ptr<TerrainStorage> mTerrainStorage;
283         std::unique_ptr<ObjectPaging> mObjectPaging;
284         std::unique_ptr<Groundcover> mGroundcover;
285         std::unique_ptr<SkyManager> mSky;
286         std::unique_ptr<FogManager> mFog;
287         std::unique_ptr<ScreenshotManager> mScreenshotManager;
288         std::unique_ptr<EffectManager> mEffectManager;
289         std::unique_ptr<SceneUtil::ShadowManager> mShadowManager;
290         osg::ref_ptr<NpcAnimation> mPlayerAnimation;
291         osg::ref_ptr<SceneUtil::PositionAttitudeTransform> mPlayerNode;
292         std::unique_ptr<Camera> mCamera;
293         std::unique_ptr<ViewOverShoulderController> mViewOverShoulderController;
294         osg::Vec3f mCurrentCameraPos;
295 
296         osg::ref_ptr<StateUpdater> mStateUpdater;
297 
298         osg::Vec4f mAmbientColor;
299         float mMinimumAmbientLuminance;
300         float mNightEyeFactor;
301 
302         float mNearClip;
303         float mViewDistance;
304         bool mFieldOfViewOverridden;
305         float mFieldOfViewOverride;
306         float mFieldOfView;
307         float mFirstPersonFieldOfView;
308 
309         void operator = (const RenderingManager&);
310         RenderingManager(const RenderingManager&);
311     };
312 
313 }
314 
315 #endif
316