mirror of
				https://github.com/OpenMW/openmw.git
				synced 2025-11-04 07:56:40 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			207 lines
		
	
	
	
		
			7.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			207 lines
		
	
	
	
		
			7.2 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
 |