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