mirror of
https://gitlab.com/OpenMW/openmw.git
synced 2025-02-04 12:39:55 +00:00
Merge branch '5463_op_normal_maps' into 'master'
#5463: Optimizer fix, problem was indeed related to tangents not being transformd properly. See merge request OpenMW/openmw!229
This commit is contained in:
commit
d529cf4a81
@ -358,6 +358,21 @@ void CollectLowestTransformsVisitor::doTransform(osg::Object* obj,osg::Matrix& m
|
|||||||
{
|
{
|
||||||
osgUtil::TransformAttributeFunctor tf(matrix);
|
osgUtil::TransformAttributeFunctor tf(matrix);
|
||||||
drawable->accept(tf);
|
drawable->accept(tf);
|
||||||
|
|
||||||
|
osg::Geometry *geom = drawable->asGeometry();
|
||||||
|
osg::Vec4Array* tangents = geom ? dynamic_cast<osg::Vec4Array*>(geom->getTexCoordArray(7)) : nullptr;
|
||||||
|
if (tangents)
|
||||||
|
{
|
||||||
|
for (unsigned int i=0; i<tangents->size(); ++i)
|
||||||
|
{
|
||||||
|
osg::Vec4f& itr = (*tangents)[i];
|
||||||
|
osg::Vec3f vec3 (itr.x(), itr.y(), itr.z());
|
||||||
|
vec3 = osg::Matrix::transform3x3(tf._im, vec3);
|
||||||
|
vec3.normalize();
|
||||||
|
itr = osg::Vec4f(vec3.x(), vec3.y(), vec3.z(), itr.w());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
drawable->dirtyBound();
|
drawable->dirtyBound();
|
||||||
drawable->dirtyDisplayList();
|
drawable->dirtyDisplayList();
|
||||||
|
|
||||||
@ -614,12 +629,12 @@ void Optimizer::FlattenStaticTransformsVisitor::apply(osg::Drawable& drawable)
|
|||||||
if((geometry) && (isOperationPermissibleForObject(&drawable)))
|
if((geometry) && (isOperationPermissibleForObject(&drawable)))
|
||||||
{
|
{
|
||||||
osg::VertexBufferObject* vbo = nullptr;
|
osg::VertexBufferObject* vbo = nullptr;
|
||||||
if(geometry->getVertexArray() && geometry->getVertexArray()->referenceCount() > 1) {
|
if(geometry->getVertexArray() && geometry->getVertexArray()->referenceCount() > 1)
|
||||||
geometry->setVertexArray(cloneArray(geometry->getVertexArray(), vbo, geometry));
|
geometry->setVertexArray(cloneArray(geometry->getVertexArray(), vbo, geometry));
|
||||||
}
|
if(geometry->getNormalArray() && geometry->getNormalArray()->referenceCount() > 1)
|
||||||
if(geometry->getNormalArray() && geometry->getNormalArray()->referenceCount() > 1) {
|
|
||||||
geometry->setNormalArray(cloneArray(geometry->getNormalArray(), vbo, geometry));
|
geometry->setNormalArray(cloneArray(geometry->getNormalArray(), vbo, geometry));
|
||||||
}
|
if(geometry->getTexCoordArray(7) && geometry->getTexCoordArray(7)->referenceCount() > 1) // tangents
|
||||||
|
geometry->setTexCoordArray(7, cloneArray(geometry->getTexCoordArray(7), vbo, geometry));
|
||||||
}
|
}
|
||||||
_drawableSet.insert(&drawable);
|
_drawableSet.insert(&drawable);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user