mirror of
				https://github.com/OpenMW/openmw.git
				synced 2025-11-04 05:26:39 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			280 lines
		
	
	
	
		
			8.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			280 lines
		
	
	
	
		
			8.1 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 setAmbientColor(const osg::Vec4f& color) { mData.get<AmbientColor>() = color; }
 | 
						|
 | 
						|
        void setSkyColor(const osg::Vec4f& color) { mData.get<SkyColor>() = 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 = std::move(buffer);
 | 
						|
        }
 | 
						|
 | 
						|
        static const std::string& getStructDefinition() { return sDefinition; }
 | 
						|
 | 
						|
        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 AmbientColor : std140::Vec4
 | 
						|
        {
 | 
						|
            static constexpr std::string_view sName = "ambientColor";
 | 
						|
        };
 | 
						|
 | 
						|
        struct SkyColor : std140::Vec4
 | 
						|
        {
 | 
						|
            static constexpr std::string_view sName = "skyColor";
 | 
						|
        };
 | 
						|
 | 
						|
        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, AmbientColor, SkyColor, 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;
 | 
						|
 | 
						|
        static std::string sDefinition;
 | 
						|
 | 
						|
        std::shared_ptr<SceneUtil::PPLightBuffer> mPointLightBuffer;
 | 
						|
    };
 | 
						|
}
 | 
						|
 | 
						|
#endif
 |