mirror of
				https://github.com/OpenMW/openmw.git
				synced 2025-10-31 21:26:41 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			264 lines
		
	
	
	
		
			7.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			264 lines
		
	
	
	
		
			7.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| #ifndef OPENMW_COMPONENTS_FX_STATEUPDATER_H
 | |
| #define OPENMW_COMPONENTS_FX_STATEUPDATER_H
 | |
| 
 | |
| #include <osg/BufferTemplate>
 | |
| 
 | |
| #include <components/sceneutil/lightmanager.hpp>
 | |
| #include <components/sceneutil/statesetupdater.hpp>
 | |
| #include <components/std140/ubo.hpp>
 | |
| 
 | |
| namespace fx
 | |
| {
 | |
|     class StateUpdater : public SceneUtil::StateSetUpdater
 | |
|     {
 | |
|     public:
 | |
|         StateUpdater(bool useUBO);
 | |
| 
 | |
|         void setProjectionMatrix(const osg::Matrixf& matrix)
 | |
|         {
 | |
|             mData.get<ProjectionMatrix>() = matrix;
 | |
|             mData.get<InvProjectionMatrix>() = osg::Matrixf::inverse(matrix);
 | |
|         }
 | |
| 
 | |
|         void setViewMatrix(const osg::Matrixf& matrix)
 | |
|         {
 | |
|             mData.get<ViewMatrix>() = matrix;
 | |
|             mData.get<InvViewMatrix>() = osg::Matrixf::inverse(matrix);
 | |
|         }
 | |
| 
 | |
|         void setPrevViewMatrix(const osg::Matrixf& matrix) { mData.get<PrevViewMatrix>() = matrix; }
 | |
| 
 | |
|         void setEyePos(const osg::Vec3f& pos) { mData.get<EyePos>() = osg::Vec4f(pos, 0.f); }
 | |
| 
 | |
|         void setEyeVec(const osg::Vec3f& vec) { mData.get<EyeVec>() = osg::Vec4f(vec, 0.f); }
 | |
| 
 | |
|         void setFogColor(const osg::Vec4f& color) { mData.get<FogColor>() = color; }
 | |
| 
 | |
|         void setSunColor(const osg::Vec4f& color) { mData.get<SunColor>() = color; }
 | |
| 
 | |
|         void setSunPos(const osg::Vec4f& pos, bool night)
 | |
|         {
 | |
|             mData.get<SunPos>() = pos;
 | |
| 
 | |
|             if (night)
 | |
|                 mData.get<SunPos>().z() *= -1.f;
 | |
|         }
 | |
| 
 | |
|         void setResolution(const osg::Vec2f& size)
 | |
|         {
 | |
|             mData.get<Resolution>() = size;
 | |
|             mData.get<RcpResolution>() = { 1.f / size.x(), 1.f / size.y() };
 | |
|         }
 | |
| 
 | |
|         void setSunVis(float vis) { mData.get<SunVis>() = vis; }
 | |
| 
 | |
|         void setFogRange(float near, float far)
 | |
|         {
 | |
|             mData.get<FogNear>() = near;
 | |
|             mData.get<FogFar>() = far;
 | |
|         }
 | |
| 
 | |
|         void setNearFar(float near, float far)
 | |
|         {
 | |
|             mData.get<Near>() = near;
 | |
|             mData.get<Far>() = far;
 | |
|         }
 | |
| 
 | |
|         void setIsUnderwater(bool underwater) { mData.get<IsUnderwater>() = underwater; }
 | |
| 
 | |
|         void setIsInterior(bool interior) { mData.get<IsInterior>() = interior; }
 | |
| 
 | |
|         void setFov(float fov) { mData.get<Fov>() = fov; }
 | |
| 
 | |
|         void setGameHour(float hour) { mData.get<GameHour>() = hour; }
 | |
| 
 | |
|         void setWeatherId(int id) { mData.get<WeatherID>() = id; }
 | |
| 
 | |
|         void setNextWeatherId(int id) { mData.get<NextWeatherID>() = id; }
 | |
| 
 | |
|         void setWaterHeight(float height) { mData.get<WaterHeight>() = height; }
 | |
| 
 | |
|         void setIsWaterEnabled(bool enabled) { mData.get<IsWaterEnabled>() = enabled; }
 | |
| 
 | |
|         void setSimulationTime(float time) { mData.get<SimulationTime>() = time; }
 | |
| 
 | |
|         void setDeltaSimulationTime(float time) { mData.get<DeltaSimulationTime>() = time; }
 | |
| 
 | |
|         void setWindSpeed(float speed) { mData.get<WindSpeed>() = speed; }
 | |
| 
 | |
|         void setWeatherTransition(float transition)
 | |
|         {
 | |
|             mData.get<WeatherTransition>() = transition > 0 ? 1 - transition : 0;
 | |
|         }
 | |
| 
 | |
|         void bindPointLights(std::shared_ptr<SceneUtil::PPLightBuffer> buffer) { mPointLightBuffer = buffer; }
 | |
| 
 | |
|         static std::string getStructDefinition()
 | |
|         {
 | |
|             static std::string definition = UniformData::getDefinition("_omw_data");
 | |
|             return definition;
 | |
|         }
 | |
| 
 | |
|         void setDefaults(osg::StateSet* stateset) override;
 | |
| 
 | |
|         void apply(osg::StateSet* stateset, osg::NodeVisitor* nv) override;
 | |
| 
 | |
|     private:
 | |
|         struct ProjectionMatrix : std140::Mat4
 | |
|         {
 | |
|             static constexpr std::string_view sName = "projectionMatrix";
 | |
|         };
 | |
| 
 | |
|         struct InvProjectionMatrix : std140::Mat4
 | |
|         {
 | |
|             static constexpr std::string_view sName = "invProjectionMatrix";
 | |
|         };
 | |
| 
 | |
|         struct ViewMatrix : std140::Mat4
 | |
|         {
 | |
|             static constexpr std::string_view sName = "viewMatrix";
 | |
|         };
 | |
| 
 | |
|         struct PrevViewMatrix : std140::Mat4
 | |
|         {
 | |
|             static constexpr std::string_view sName = "prevViewMatrix";
 | |
|         };
 | |
| 
 | |
|         struct InvViewMatrix : std140::Mat4
 | |
|         {
 | |
|             static constexpr std::string_view sName = "invViewMatrix";
 | |
|         };
 | |
| 
 | |
|         struct EyePos : std140::Vec4
 | |
|         {
 | |
|             static constexpr std::string_view sName = "eyePos";
 | |
|         };
 | |
| 
 | |
|         struct EyeVec : std140::Vec4
 | |
|         {
 | |
|             static constexpr std::string_view sName = "eyeVec";
 | |
|         };
 | |
| 
 | |
|         struct FogColor : std140::Vec4
 | |
|         {
 | |
|             static constexpr std::string_view sName = "fogColor";
 | |
|         };
 | |
| 
 | |
|         struct SunColor : std140::Vec4
 | |
|         {
 | |
|             static constexpr std::string_view sName = "sunColor";
 | |
|         };
 | |
| 
 | |
|         struct SunPos : std140::Vec4
 | |
|         {
 | |
|             static constexpr std::string_view sName = "sunPos";
 | |
|         };
 | |
| 
 | |
|         struct Resolution : std140::Vec2
 | |
|         {
 | |
|             static constexpr std::string_view sName = "resolution";
 | |
|         };
 | |
| 
 | |
|         struct RcpResolution : std140::Vec2
 | |
|         {
 | |
|             static constexpr std::string_view sName = "rcpResolution";
 | |
|         };
 | |
| 
 | |
|         struct FogNear : std140::Float
 | |
|         {
 | |
|             static constexpr std::string_view sName = "fogNear";
 | |
|         };
 | |
| 
 | |
|         struct FogFar : std140::Float
 | |
|         {
 | |
|             static constexpr std::string_view sName = "fogFar";
 | |
|         };
 | |
| 
 | |
|         struct Near : std140::Float
 | |
|         {
 | |
|             static constexpr std::string_view sName = "near";
 | |
|         };
 | |
| 
 | |
|         struct Far : std140::Float
 | |
|         {
 | |
|             static constexpr std::string_view sName = "far";
 | |
|         };
 | |
| 
 | |
|         struct Fov : std140::Float
 | |
|         {
 | |
|             static constexpr std::string_view sName = "fov";
 | |
|         };
 | |
| 
 | |
|         struct GameHour : std140::Float
 | |
|         {
 | |
|             static constexpr std::string_view sName = "gameHour";
 | |
|         };
 | |
| 
 | |
|         struct SunVis : std140::Float
 | |
|         {
 | |
|             static constexpr std::string_view sName = "sunVis";
 | |
|         };
 | |
| 
 | |
|         struct WaterHeight : std140::Float
 | |
|         {
 | |
|             static constexpr std::string_view sName = "waterHeight";
 | |
|         };
 | |
| 
 | |
|         struct IsWaterEnabled : std140::Bool
 | |
|         {
 | |
|             static constexpr std::string_view sName = "isWaterEnabled";
 | |
|         };
 | |
| 
 | |
|         struct SimulationTime : std140::Float
 | |
|         {
 | |
|             static constexpr std::string_view sName = "simulationTime";
 | |
|         };
 | |
| 
 | |
|         struct DeltaSimulationTime : std140::Float
 | |
|         {
 | |
|             static constexpr std::string_view sName = "deltaSimulationTime";
 | |
|         };
 | |
| 
 | |
|         struct WindSpeed : std140::Float
 | |
|         {
 | |
|             static constexpr std::string_view sName = "windSpeed";
 | |
|         };
 | |
| 
 | |
|         struct WeatherTransition : std140::Float
 | |
|         {
 | |
|             static constexpr std::string_view sName = "weatherTransition";
 | |
|         };
 | |
| 
 | |
|         struct WeatherID : std140::Int
 | |
|         {
 | |
|             static constexpr std::string_view sName = "weatherID";
 | |
|         };
 | |
| 
 | |
|         struct NextWeatherID : std140::Int
 | |
|         {
 | |
|             static constexpr std::string_view sName = "nextWeatherID";
 | |
|         };
 | |
| 
 | |
|         struct IsUnderwater : std140::Bool
 | |
|         {
 | |
|             static constexpr std::string_view sName = "isUnderwater";
 | |
|         };
 | |
| 
 | |
|         struct IsInterior : std140::Bool
 | |
|         {
 | |
|             static constexpr std::string_view sName = "isInterior";
 | |
|         };
 | |
| 
 | |
|         using UniformData = std140::UBO<ProjectionMatrix, InvProjectionMatrix, ViewMatrix, PrevViewMatrix,
 | |
|             InvViewMatrix, EyePos, EyeVec, FogColor, SunColor, SunPos, Resolution, RcpResolution, FogNear, FogFar, Near,
 | |
|             Far, Fov, GameHour, SunVis, WaterHeight, IsWaterEnabled, SimulationTime, DeltaSimulationTime, WindSpeed,
 | |
|             WeatherTransition, WeatherID, NextWeatherID, IsUnderwater, IsInterior>;
 | |
| 
 | |
|         UniformData mData;
 | |
|         bool mUseUBO;
 | |
| 
 | |
|         std::shared_ptr<SceneUtil::PPLightBuffer> mPointLightBuffer;
 | |
|     };
 | |
| }
 | |
| 
 | |
| #endif
 |