mirror of
https://github.com/OpenMW/openmw.git
synced 2025-06-24 18:41:34 +00:00
Fix NiFlipController
NiFlipControllers *always* affect the base texture, even if no base texture is bound. When no base texture is bound, they default to UV set zero and to having wrapped UV coordinates, instead of using the settings for the disabled base texture.
This commit is contained in:
parent
8390ba0a0c
commit
b2cb98d30e
2 changed files with 46 additions and 33 deletions
|
@ -449,7 +449,7 @@ void MaterialColorController::apply(osg::StateSet *stateset, osg::NodeVisitor *n
|
|||
}
|
||||
|
||||
FlipController::FlipController(const Nif::NiFlipController *ctrl, const std::vector<osg::ref_ptr<osg::Texture2D> >& textures)
|
||||
: mTexSlot(ctrl->mTexSlot)
|
||||
: mTexSlot(0) // always affects diffuse
|
||||
, mDelta(ctrl->mDelta)
|
||||
, mTextures(textures)
|
||||
{
|
||||
|
|
|
@ -799,22 +799,23 @@ namespace NifOsg
|
|||
{
|
||||
const Nif::NiFlipController* flipctrl = static_cast<const Nif::NiFlipController*>(ctrl.getPtr());
|
||||
std::vector<osg::ref_ptr<osg::Texture2D> > textures;
|
||||
for (unsigned int i=0; i<flipctrl->mSources.length(); ++i)
|
||||
{
|
||||
Nif::NiSourceTexturePtr st = flipctrl->mSources[i];
|
||||
if (st.empty())
|
||||
continue;
|
||||
|
||||
// inherit wrap settings from the target slot
|
||||
osg::Texture2D* inherit = dynamic_cast<osg::Texture2D*>(stateset->getTextureAttribute(flipctrl->mTexSlot, osg::StateAttribute::TEXTURE));
|
||||
osg::Texture2D::WrapMode wrapS = osg::Texture2D::CLAMP_TO_EDGE;
|
||||
osg::Texture2D::WrapMode wrapT = osg::Texture2D::CLAMP_TO_EDGE;
|
||||
osg::Texture2D* inherit = dynamic_cast<osg::Texture2D*>(stateset->getTextureAttribute(0, osg::StateAttribute::TEXTURE));
|
||||
osg::Texture2D::WrapMode wrapS = osg::Texture2D::REPEAT;
|
||||
osg::Texture2D::WrapMode wrapT = osg::Texture2D::REPEAT;
|
||||
if (inherit)
|
||||
{
|
||||
wrapS = inherit->getWrap(osg::Texture2D::WRAP_S);
|
||||
wrapT = inherit->getWrap(osg::Texture2D::WRAP_T);
|
||||
}
|
||||
|
||||
for (unsigned int i=0; i<flipctrl->mSources.length(); ++i)
|
||||
{
|
||||
Nif::NiSourceTexturePtr st = flipctrl->mSources[i];
|
||||
if (st.empty())
|
||||
continue;
|
||||
|
||||
osg::ref_ptr<osg::Image> image (handleSourceTexture(st.getPtr(), imageManager));
|
||||
osg::ref_ptr<osg::Texture2D> texture (new osg::Texture2D(image));
|
||||
if (image)
|
||||
|
@ -1451,7 +1452,7 @@ namespace NifOsg
|
|||
// If this loop is changed such that the base texture isn't guaranteed to end up in texture unit 0, the shadow casting shader will need to be updated accordingly.
|
||||
for (size_t i=0; i<texprop->textures.size(); ++i)
|
||||
{
|
||||
if (texprop->textures[i].inUse)
|
||||
if (texprop->textures[i].inUse || (i == Nif::NiTexturingProperty::BaseTexture && !texprop->controller.empty()))
|
||||
{
|
||||
switch(i)
|
||||
{
|
||||
|
@ -1477,6 +1478,11 @@ namespace NifOsg
|
|||
}
|
||||
}
|
||||
|
||||
unsigned int uvSet = 0;
|
||||
// create a new texture, will later attempt to share using the SharedStateManager
|
||||
osg::ref_ptr<osg::Texture2D> texture2d;
|
||||
if (texprop->textures[i].inUse)
|
||||
{
|
||||
const Nif::NiTexturingProperty::Texture& tex = texprop->textures[i];
|
||||
if(tex.texture.empty() && texprop->controller.empty())
|
||||
{
|
||||
|
@ -1485,8 +1491,6 @@ namespace NifOsg
|
|||
continue;
|
||||
}
|
||||
|
||||
// create a new texture, will later attempt to share using the SharedStateManager
|
||||
osg::ref_ptr<osg::Texture2D> texture2d;
|
||||
if (!tex.texture.empty())
|
||||
{
|
||||
const Nif::NiSourceTexture *st = tex.texture.getPtr();
|
||||
|
@ -1503,6 +1507,15 @@ namespace NifOsg
|
|||
|
||||
texture2d->setWrap(osg::Texture::WRAP_S, wrapS ? osg::Texture::REPEAT : osg::Texture::CLAMP_TO_EDGE);
|
||||
texture2d->setWrap(osg::Texture::WRAP_T, wrapT ? osg::Texture::REPEAT : osg::Texture::CLAMP_TO_EDGE);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Texture only comes from NiFlipController, so tex is ignored, set defaults
|
||||
texture2d = new osg::Texture2D;
|
||||
texture2d->setWrap(osg::Texture::WRAP_S, osg::Texture::REPEAT);
|
||||
texture2d->setWrap(osg::Texture::WRAP_T, osg::Texture::REPEAT);
|
||||
uvSet = 0;
|
||||
}
|
||||
|
||||
unsigned int texUnit = boundTextures.size();
|
||||
|
||||
|
@ -1590,7 +1603,7 @@ namespace NifOsg
|
|||
break;
|
||||
}
|
||||
|
||||
boundTextures.push_back(tex.uvSet);
|
||||
boundTextures.push_back(uvSet);
|
||||
}
|
||||
}
|
||||
handleTextureControllers(texprop, composite, imageManager, stateset, animflags);
|
||||
|
|
Loading…
Reference in a new issue