Merge pull request #213 from marchelbling/bug/osg-fixes

Bug/osg fixes
This commit is contained in:
OpenSceneGraph git repository
2017-03-11 15:08:57 +00:00
committed by GitHub
5 changed files with 21 additions and 30 deletions

View File

@@ -2257,21 +2257,18 @@ class MergeArrayVisitor : public osg::ArrayVisitor
{
protected:
osg::Array* _lhs;
int _offset;
public:
MergeArrayVisitor() :
_lhs(0),
_offset(0) {}
_lhs(0) {}
/// try to merge the content of two arrays.
bool merge(osg::Array* lhs,osg::Array* rhs, int offset=0)
bool merge(osg::Array* lhs,osg::Array* rhs)
{
if (lhs==0 || rhs==0) return true;
if (lhs->getType()!=rhs->getType()) return false;
_lhs = lhs;
_offset = offset;
rhs->accept(*this);
return true;
@@ -2284,30 +2281,23 @@ class MergeArrayVisitor : public osg::ArrayVisitor
lhs->insert(lhs->end(),rhs.begin(),rhs.end());
}
template<typename T>
void _mergeAndOffset(T& rhs)
{
T* lhs = static_cast<T*>(_lhs);
typename T::iterator itr;
for(itr = rhs.begin();
itr != rhs.end();
++itr)
{
lhs->push_back(*itr + _offset);
}
}
virtual void apply(osg::Array&) { OSG_WARN << "Warning: Optimizer's MergeArrayVisitor cannot merge Array type." << std::endl; }
virtual void apply(osg::ByteArray& rhs) { if (_offset) _mergeAndOffset(rhs); else _merge(rhs); }
virtual void apply(osg::ShortArray& rhs) { if (_offset) _mergeAndOffset(rhs); else _merge(rhs); }
virtual void apply(osg::IntArray& rhs) { if (_offset) _mergeAndOffset(rhs); else _merge(rhs); }
virtual void apply(osg::UByteArray& rhs) { if (_offset) _mergeAndOffset(rhs); else _merge(rhs); }
virtual void apply(osg::UShortArray& rhs) { if (_offset) _mergeAndOffset(rhs); else _merge(rhs); }
virtual void apply(osg::UIntArray& rhs) { if (_offset) _mergeAndOffset(rhs); else _merge(rhs); }
virtual void apply(osg::ByteArray& rhs) { _merge(rhs); }
virtual void apply(osg::ShortArray& rhs) { _merge(rhs); }
virtual void apply(osg::IntArray& rhs) { _merge(rhs); }
virtual void apply(osg::UByteArray& rhs) { _merge(rhs); }
virtual void apply(osg::UShortArray& rhs) { _merge(rhs); }
virtual void apply(osg::UIntArray& rhs) { _merge(rhs); }
virtual void apply(osg::Vec4ubArray& rhs) { _merge(rhs); }
virtual void apply(osg::Vec3ubArray& rhs) { _merge(rhs); }
virtual void apply(osg::Vec2ubArray& rhs) { _merge(rhs); }
virtual void apply(osg::Vec4usArray& rhs) { _merge(rhs); }
virtual void apply(osg::Vec3usArray& rhs) { _merge(rhs); }
virtual void apply(osg::Vec2usArray& rhs) { _merge(rhs); }
virtual void apply(osg::FloatArray& rhs) { _merge(rhs); }
virtual void apply(osg::Vec2Array& rhs) { _merge(rhs); }
virtual void apply(osg::Vec3Array& rhs) { _merge(rhs); }
@@ -2321,6 +2311,7 @@ class MergeArrayVisitor : public osg::ArrayVisitor
virtual void apply(osg::Vec2bArray& rhs) { _merge(rhs); }
virtual void apply(osg::Vec3bArray& rhs) { _merge(rhs); }
virtual void apply(osg::Vec4bArray& rhs) { _merge(rhs); }
virtual void apply(osg::Vec2sArray& rhs) { _merge(rhs); }
virtual void apply(osg::Vec3sArray& rhs) { _merge(rhs); }
virtual void apply(osg::Vec4sArray& rhs) { _merge(rhs); }