mirror of
https://github.com/OpenMW/openmw.git
synced 2025-03-31 07:06:45 +00:00
fixes wireframe is broken (#3123)
* renderingmanager.cpp [ci skip] * groundcover.hpp [ci skip] * groundcover.cpp * renderingmanager.cpp [ci skip] * renderingmanager.hpp
This commit is contained in:
parent
15bcbb5844
commit
99df1c695c
4 changed files with 39 additions and 71 deletions
|
@ -27,36 +27,6 @@ namespace MWRender
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void GroundcoverUpdater::setWindSpeed(float windSpeed)
|
|
||||||
{
|
|
||||||
mWindSpeed = windSpeed;
|
|
||||||
}
|
|
||||||
|
|
||||||
void GroundcoverUpdater::setPlayerPos(osg::Vec3f playerPos)
|
|
||||||
{
|
|
||||||
mPlayerPos = playerPos;
|
|
||||||
}
|
|
||||||
|
|
||||||
void GroundcoverUpdater::setDefaults(osg::StateSet *stateset)
|
|
||||||
{
|
|
||||||
osg::ref_ptr<osg::Uniform> windUniform = new osg::Uniform("windSpeed", 0.0f);
|
|
||||||
stateset->addUniform(windUniform.get());
|
|
||||||
|
|
||||||
osg::ref_ptr<osg::Uniform> playerPosUniform = new osg::Uniform("playerPos", osg::Vec3f(0.f, 0.f, 0.f));
|
|
||||||
stateset->addUniform(playerPosUniform.get());
|
|
||||||
}
|
|
||||||
|
|
||||||
void GroundcoverUpdater::apply(osg::StateSet *stateset, osg::NodeVisitor *nv)
|
|
||||||
{
|
|
||||||
osg::ref_ptr<osg::Uniform> windUniform = stateset->getUniform("windSpeed");
|
|
||||||
if (windUniform != nullptr)
|
|
||||||
windUniform->set(mWindSpeed);
|
|
||||||
|
|
||||||
osg::ref_ptr<osg::Uniform> playerPosUniform = stateset->getUniform("playerPos");
|
|
||||||
if (playerPosUniform != nullptr)
|
|
||||||
playerPosUniform->set(mPlayerPos);
|
|
||||||
}
|
|
||||||
|
|
||||||
class InstancingVisitor : public osg::NodeVisitor
|
class InstancingVisitor : public osg::NodeVisitor
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
|
@ -3,32 +3,10 @@
|
||||||
|
|
||||||
#include <components/terrain/quadtreeworld.hpp>
|
#include <components/terrain/quadtreeworld.hpp>
|
||||||
#include <components/resource/scenemanager.hpp>
|
#include <components/resource/scenemanager.hpp>
|
||||||
#include <components/sceneutil/statesetupdater.hpp>
|
|
||||||
#include <components/esm/loadcell.hpp>
|
#include <components/esm/loadcell.hpp>
|
||||||
|
|
||||||
namespace MWRender
|
namespace MWRender
|
||||||
{
|
{
|
||||||
class GroundcoverUpdater : public SceneUtil::StateSetUpdater
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
GroundcoverUpdater()
|
|
||||||
: mWindSpeed(0.f)
|
|
||||||
, mPlayerPos(osg::Vec3f())
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void setWindSpeed(float windSpeed);
|
|
||||||
void setPlayerPos(osg::Vec3f playerPos);
|
|
||||||
|
|
||||||
protected:
|
|
||||||
void setDefaults(osg::StateSet *stateset) override;
|
|
||||||
void apply(osg::StateSet *stateset, osg::NodeVisitor *nv) override;
|
|
||||||
|
|
||||||
private:
|
|
||||||
float mWindSpeed;
|
|
||||||
osg::Vec3f mPlayerPos;
|
|
||||||
};
|
|
||||||
|
|
||||||
typedef std::tuple<osg::Vec2f, float> GroundcoverChunkId; // Center, Size
|
typedef std::tuple<osg::Vec2f, float> GroundcoverChunkId; // Center, Size
|
||||||
class Groundcover : public Resource::GenericResourceManager<GroundcoverChunkId>, public Terrain::QuadTreeWorld::ChunkManager
|
class Groundcover : public Resource::GenericResourceManager<GroundcoverChunkId>, public Terrain::QuadTreeWorld::ChunkManager
|
||||||
{
|
{
|
||||||
|
|
|
@ -77,10 +77,12 @@ namespace MWRender
|
||||||
class SharedUniformStateUpdater : public SceneUtil::StateSetUpdater
|
class SharedUniformStateUpdater : public SceneUtil::StateSetUpdater
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
SharedUniformStateUpdater()
|
SharedUniformStateUpdater(bool usePlayerUniforms)
|
||||||
: mLinearFac(0.f)
|
: mLinearFac(0.f)
|
||||||
, mNear(0.f)
|
, mNear(0.f)
|
||||||
, mFar(0.f)
|
, mFar(0.f)
|
||||||
|
, mUsePlayerUniforms(usePlayerUniforms)
|
||||||
|
, mWindSpeed(0.f)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -90,6 +92,11 @@ namespace MWRender
|
||||||
stateset->addUniform(new osg::Uniform("linearFac", 0.f));
|
stateset->addUniform(new osg::Uniform("linearFac", 0.f));
|
||||||
stateset->addUniform(new osg::Uniform("near", 0.f));
|
stateset->addUniform(new osg::Uniform("near", 0.f));
|
||||||
stateset->addUniform(new osg::Uniform("far", 0.f));
|
stateset->addUniform(new osg::Uniform("far", 0.f));
|
||||||
|
if (mUsePlayerUniforms)
|
||||||
|
{
|
||||||
|
stateset->addUniform(new osg::Uniform("windSpeed", 0.0f));
|
||||||
|
stateset->addUniform(new osg::Uniform("playerPos", osg::Vec3f(0.f, 0.f, 0.f)));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void apply(osg::StateSet* stateset, osg::NodeVisitor* nv) override
|
void apply(osg::StateSet* stateset, osg::NodeVisitor* nv) override
|
||||||
|
@ -110,6 +117,16 @@ namespace MWRender
|
||||||
if (uFar)
|
if (uFar)
|
||||||
uFar->set(mFar);
|
uFar->set(mFar);
|
||||||
|
|
||||||
|
if (mUsePlayerUniforms)
|
||||||
|
{
|
||||||
|
auto* windSpeed = stateset->getUniform("windSpeed");
|
||||||
|
if (windSpeed)
|
||||||
|
windSpeed->set(mWindSpeed);
|
||||||
|
|
||||||
|
auto* playerPos = stateset->getUniform("playerPos");
|
||||||
|
if (playerPos)
|
||||||
|
playerPos->set(mPlayerPos);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void setProjectionMatrix(const osg::Matrixf& projectionMatrix)
|
void setProjectionMatrix(const osg::Matrixf& projectionMatrix)
|
||||||
|
@ -132,11 +149,25 @@ namespace MWRender
|
||||||
mFar = far;
|
mFar = far;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void setWindSpeed(float windSpeed)
|
||||||
|
{
|
||||||
|
mWindSpeed = windSpeed;
|
||||||
|
}
|
||||||
|
|
||||||
|
void setPlayerPos(osg::Vec3f playerPos)
|
||||||
|
{
|
||||||
|
mPlayerPos = playerPos;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
osg::Matrixf mProjectionMatrix;
|
osg::Matrixf mProjectionMatrix;
|
||||||
float mLinearFac;
|
float mLinearFac;
|
||||||
float mNear;
|
float mNear;
|
||||||
float mFar;
|
float mFar;
|
||||||
|
bool mUsePlayerUniforms;
|
||||||
|
float mWindSpeed;
|
||||||
|
osg::Vec3f mPlayerPos;
|
||||||
};
|
};
|
||||||
|
|
||||||
class StateUpdater : public SceneUtil::StateSetUpdater
|
class StateUpdater : public SceneUtil::StateSetUpdater
|
||||||
|
@ -400,16 +431,11 @@ namespace MWRender
|
||||||
mTerrain->setTargetFrameRate(Settings::Manager::getFloat("target framerate", "Cells"));
|
mTerrain->setTargetFrameRate(Settings::Manager::getFloat("target framerate", "Cells"));
|
||||||
mTerrain->setWorkQueue(mWorkQueue.get());
|
mTerrain->setWorkQueue(mWorkQueue.get());
|
||||||
|
|
||||||
osg::ref_ptr<SceneUtil::CompositeStateSetUpdater> composite = new SceneUtil::CompositeStateSetUpdater;
|
|
||||||
|
|
||||||
if (groundcover)
|
if (groundcover)
|
||||||
{
|
{
|
||||||
float density = Settings::Manager::getFloat("density", "Groundcover");
|
float density = Settings::Manager::getFloat("density", "Groundcover");
|
||||||
density = std::clamp(density, 0.f, 1.f);
|
density = std::clamp(density, 0.f, 1.f);
|
||||||
|
|
||||||
mGroundcoverUpdater = new GroundcoverUpdater;
|
|
||||||
composite->addController(mGroundcoverUpdater);
|
|
||||||
|
|
||||||
mGroundcover.reset(new Groundcover(mResourceSystem->getSceneManager(), density));
|
mGroundcover.reset(new Groundcover(mResourceSystem->getSceneManager(), density));
|
||||||
static_cast<Terrain::QuadTreeWorld*>(mTerrain.get())->addChunkManager(mGroundcover.get());
|
static_cast<Terrain::QuadTreeWorld*>(mTerrain.get())->addChunkManager(mGroundcover.get());
|
||||||
mResourceSystem->addResourceManager(mGroundcover.get());
|
mResourceSystem->addResourceManager(mGroundcover.get());
|
||||||
|
@ -419,10 +445,9 @@ namespace MWRender
|
||||||
}
|
}
|
||||||
|
|
||||||
mStateUpdater = new StateUpdater;
|
mStateUpdater = new StateUpdater;
|
||||||
composite->addController(mStateUpdater);
|
sceneRoot->addUpdateCallback(mStateUpdater);
|
||||||
sceneRoot->addUpdateCallback(composite);
|
|
||||||
|
|
||||||
mSharedUniformStateUpdater = new SharedUniformStateUpdater;
|
mSharedUniformStateUpdater = new SharedUniformStateUpdater(groundcover);
|
||||||
rootNode->addUpdateCallback(mSharedUniformStateUpdater);
|
rootNode->addUpdateCallback(mSharedUniformStateUpdater);
|
||||||
|
|
||||||
mPostProcessor = new PostProcessor(*this, viewer, mRootNode);
|
mPostProcessor = new PostProcessor(*this, viewer, mRootNode);
|
||||||
|
@ -791,15 +816,12 @@ namespace MWRender
|
||||||
mSky->update(dt);
|
mSky->update(dt);
|
||||||
mWater->update(dt);
|
mWater->update(dt);
|
||||||
|
|
||||||
if (mGroundcoverUpdater)
|
const MWWorld::Ptr& player = mPlayerAnimation->getPtr();
|
||||||
{
|
osg::Vec3f playerPos(player.getRefData().getPosition().asVec3());
|
||||||
const MWWorld::Ptr& player = mPlayerAnimation->getPtr();
|
|
||||||
osg::Vec3f playerPos(player.getRefData().getPosition().asVec3());
|
|
||||||
|
|
||||||
float windSpeed = mSky->getBaseWindSpeed();
|
float windSpeed = mSky->getBaseWindSpeed();
|
||||||
mGroundcoverUpdater->setWindSpeed(windSpeed);
|
mSharedUniformStateUpdater->setWindSpeed(windSpeed);
|
||||||
mGroundcoverUpdater->setPlayerPos(playerPos);
|
mSharedUniformStateUpdater->setPlayerPos(playerPos);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
updateNavMesh();
|
updateNavMesh();
|
||||||
|
|
|
@ -70,7 +70,6 @@ namespace DetourNavigator
|
||||||
|
|
||||||
namespace MWRender
|
namespace MWRender
|
||||||
{
|
{
|
||||||
class GroundcoverUpdater;
|
|
||||||
class StateUpdater;
|
class StateUpdater;
|
||||||
class SharedUniformStateUpdater;
|
class SharedUniformStateUpdater;
|
||||||
|
|
||||||
|
@ -279,7 +278,6 @@ namespace MWRender
|
||||||
std::unique_ptr<TerrainStorage> mTerrainStorage;
|
std::unique_ptr<TerrainStorage> mTerrainStorage;
|
||||||
std::unique_ptr<ObjectPaging> mObjectPaging;
|
std::unique_ptr<ObjectPaging> mObjectPaging;
|
||||||
std::unique_ptr<Groundcover> mGroundcover;
|
std::unique_ptr<Groundcover> mGroundcover;
|
||||||
osg::ref_ptr<GroundcoverUpdater> mGroundcoverUpdater;
|
|
||||||
std::unique_ptr<SkyManager> mSky;
|
std::unique_ptr<SkyManager> mSky;
|
||||||
std::unique_ptr<FogManager> mFog;
|
std::unique_ptr<FogManager> mFog;
|
||||||
std::unique_ptr<ScreenshotManager> mScreenshotManager;
|
std::unique_ptr<ScreenshotManager> mScreenshotManager;
|
||||||
|
|
Loading…
Reference in a new issue