mirror of
https://github.com/OpenMW/openmw.git
synced 2025-03-03 21:09:41 +00:00
Make it possible to reinstate FFP state easily
This commit is contained in:
parent
b8ee32e317
commit
9be258d260
5 changed files with 64 additions and 1 deletions
|
@ -258,6 +258,8 @@ namespace MWRender
|
||||||
// Keep link to original mesh to keep it in cache
|
// Keep link to original mesh to keep it in cache
|
||||||
group->getOrCreateUserDataContainer()->addUserObject(new Resource::TemplateRef(temp));
|
group->getOrCreateUserDataContainer()->addUserObject(new Resource::TemplateRef(temp));
|
||||||
|
|
||||||
|
mSceneManager->reinstateRemovedState(node);
|
||||||
|
|
||||||
InstancingVisitor visitor(pair.second, worldCenter);
|
InstancingVisitor visitor(pair.second, worldCenter);
|
||||||
node->accept(visitor);
|
node->accept(visitor);
|
||||||
group->addChild(node);
|
group->addChild(node);
|
||||||
|
|
|
@ -257,6 +257,12 @@ namespace Resource
|
||||||
node->accept(*shaderVisitor);
|
node->accept(*shaderVisitor);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SceneManager::reinstateRemovedState(osg::ref_ptr<osg::Node> node)
|
||||||
|
{
|
||||||
|
osg::ref_ptr<Shader::ReinstateRemovedStateVisitor> reinstateRemovedStateVisitor = new Shader::ReinstateRemovedStateVisitor(false);
|
||||||
|
node->accept(*reinstateRemovedStateVisitor);
|
||||||
|
}
|
||||||
|
|
||||||
void SceneManager::setClampLighting(bool clamp)
|
void SceneManager::setClampLighting(bool clamp)
|
||||||
{
|
{
|
||||||
mClampLighting = clamp;
|
mClampLighting = clamp;
|
||||||
|
|
|
@ -75,9 +75,14 @@ namespace Resource
|
||||||
|
|
||||||
Shader::ShaderManager& getShaderManager();
|
Shader::ShaderManager& getShaderManager();
|
||||||
|
|
||||||
/// Re-create shaders for this node, need to call this if texture stages or vertex color mode have changed.
|
/// Re-create shaders for this node, need to call this if alpha testing, texture stages or vertex color mode have changed.
|
||||||
void recreateShaders(osg::ref_ptr<osg::Node> node, const std::string& shaderPrefix = "objects", bool translucentFramebuffer = false, bool forceShadersForNode = false);
|
void recreateShaders(osg::ref_ptr<osg::Node> node, const std::string& shaderPrefix = "objects", bool translucentFramebuffer = false, bool forceShadersForNode = false);
|
||||||
|
|
||||||
|
/// Applying shaders to a node may replace some fixed-function state.
|
||||||
|
/// This restores it.
|
||||||
|
/// When editing such state, it should be reinstated before the edits, and shaders should be recreated afterwards.
|
||||||
|
void reinstateRemovedState(osg::ref_ptr<osg::Node> node);
|
||||||
|
|
||||||
/// @see ShaderVisitor::setForceShaders
|
/// @see ShaderVisitor::setForceShaders
|
||||||
void setForceShaders(bool force);
|
void setForceShaders(bool force);
|
||||||
bool getForceShaders() const;
|
bool getForceShaders() const;
|
||||||
|
|
|
@ -614,4 +614,43 @@ namespace Shader
|
||||||
mTranslucentFramebuffer = translucent;
|
mTranslucentFramebuffer = translucent;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ReinstateRemovedStateVisitor::ReinstateRemovedStateVisitor(bool allowedToModifyStateSets)
|
||||||
|
: osg::NodeVisitor(TRAVERSE_ALL_CHILDREN)
|
||||||
|
, mAllowedToModifyStateSets(allowedToModifyStateSets)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void ReinstateRemovedStateVisitor::apply(osg::Node& node)
|
||||||
|
{
|
||||||
|
if (node.getStateSet())
|
||||||
|
{
|
||||||
|
osg::ref_ptr<osg::StateSet> removedState = getRemovedState(*node.getStateSet());
|
||||||
|
if (removedState)
|
||||||
|
{
|
||||||
|
osg::ref_ptr<osg::StateSet> writableStateSet;
|
||||||
|
if (mAllowedToModifyStateSets)
|
||||||
|
writableStateSet = node.getStateSet();
|
||||||
|
else
|
||||||
|
writableStateSet = getWritableStateSet(node);
|
||||||
|
|
||||||
|
// user data is normally shallow copied so shared with the original stateset
|
||||||
|
osg::ref_ptr<osg::UserDataContainer> writableUserData;
|
||||||
|
if (mAllowedToModifyStateSets)
|
||||||
|
writableUserData = writableStateSet->getUserDataContainer();
|
||||||
|
else
|
||||||
|
writableUserData = getWritableUserDataContainer(*writableStateSet);
|
||||||
|
unsigned int index = writableUserData->getUserObjectIndex("removedState");
|
||||||
|
writableUserData->removeUserObject(index);
|
||||||
|
|
||||||
|
for (const auto&[mode, value] : removedState->getModeList())
|
||||||
|
writableStateSet->setMode(mode, value);
|
||||||
|
|
||||||
|
for (const auto& attribute : removedState->getAttributeList())
|
||||||
|
writableStateSet->setAttribute(attribute.second.first, attribute.second.second);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
traverse(node);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -112,6 +112,17 @@ namespace Shader
|
||||||
bool adjustGeometry(osg::Geometry& sourceGeometry, const ShaderRequirements& reqs);
|
bool adjustGeometry(osg::Geometry& sourceGeometry, const ShaderRequirements& reqs);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class ReinstateRemovedStateVisitor : public osg::NodeVisitor
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
ReinstateRemovedStateVisitor(bool allowedToModifyStateSets);
|
||||||
|
|
||||||
|
void apply(osg::Node& node) override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
bool mAllowedToModifyStateSets;
|
||||||
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in a new issue