Updated the Optimzer::FatternStaticTransform visit so by default it ignores

all dynamic transforms, previously it flattened dynamic transforms as well.
This commit is contained in:
Robert Osfield
2001-12-17 15:05:06 +00:00
parent 61643f2ae9
commit bc49a83c51
4 changed files with 34 additions and 20 deletions

View File

@@ -80,6 +80,9 @@ Henry Maddocks <henryj@paradise.net.nz>
Paul Fredrikson
- new Matrix implementation.
Sasa Bistrivic <sasa.bistrovic@zg.hinet.hr>
- option for detailed calculation of the near clipping plane during cull traversal.
Indirect Contributors
---------------------

View File

@@ -49,12 +49,16 @@ class OSGUTIL_EXPORT Optimizer
public:
typedef std::vector<osg::Matrix> MatrixStack;
MatrixStack _matrixStack;
typedef std::set<osg::Transform*> TransformList;
TransformList _transformList;
MatrixStack _matrixStack;
TransformList _transformList;
bool _ignoreDynamicTransforms;
FlattenStaticTransformsVisitor():osg::NodeVisitor(osg::NodeVisitor::TRAVERSE_ALL_CHILDREN) {}
FlattenStaticTransformsVisitor(bool ignoreDynamicTransforms=true):
osg::NodeVisitor(osg::NodeVisitor::TRAVERSE_ALL_CHILDREN),
_ignoreDynamicTransforms(ignoreDynamicTransforms) {}
virtual void apply(osg::Geode& geode);
virtual void apply(osg::Billboard& billboard);

View File

@@ -77,8 +77,8 @@ bool Transform_writeLocalData(const Object& obj, Output& fw)
switch(transform.getType())
{
case(osg::Transform::STATIC): fw.indent() << "Type STATIC" << std::endl;
default: fw.indent() << "Type DYNAMIC" << std::endl;
case(osg::Transform::STATIC): fw.indent() << "Type STATIC" << std::endl;break;
default: fw.indent() << "Type DYNAMIC" << std::endl;break;
}
fw.writeObject(transform.getMatrix());

View File

@@ -353,25 +353,32 @@ void Optimizer::FlattenStaticTransformsVisitor::apply(osg::LOD& lod)
void Optimizer::FlattenStaticTransformsVisitor::apply(osg::Transform& transform)
{
if (_matrixStack.empty())
if (_ignoreDynamicTransforms && transform.getType()==osg::Transform::DYNAMIC)
{
_matrixStack.push_back(transform.getMatrix());
// simple traverse the children as if this Transform didn't exist.
traverse(transform);
}
else
{
_matrixStack.push_back(transform.getMatrix()*_matrixStack.back());
{
if (_matrixStack.empty())
{
_matrixStack.push_back(transform.getMatrix());
}
else
{
_matrixStack.push_back(transform.getMatrix()*_matrixStack.back());
}
_transformList.insert(&transform);
// simple traverse the children as if this Transform didn't exist.
traverse(transform);
// reset the matrix to identity.
transform.setMatrix(osg::Matrix::identity());
_matrixStack.pop_back();
}
traverse(transform);
_transformList.insert(&transform);
// reset the matrix to identity.
transform.setMatrix(osg::Matrix::identity());
transform.dirtyBound();
_matrixStack.pop_back();
}
void Optimizer::FlattenStaticTransformsVisitor::removeTransforms()