From ef4535a2a4db44b434206c94893dae6543708203 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Sat, 9 Aug 2003 00:46:48 +0000 Subject: [PATCH] Added s/getFastPathHint(). --- include/osg/Geometry | 10 +++- src/osg/Geometry.cpp | 116 +++++++++++++++++++++++++++++++++++++++---- 2 files changed, 116 insertions(+), 10 deletions(-) diff --git a/include/osg/Geometry b/include/osg/Geometry index e22e64970..2cea035b5 100644 --- a/include/osg/Geometry +++ b/include/osg/Geometry @@ -248,11 +248,17 @@ class SG_EXPORT Geometry : public Drawable unsigned int getPrimitiveSetIndex(const PrimitiveSet* primitiveset) const; + /** Set whether fast paths should be used when supported.*/ + void setFastPathHint(bool on) { _fastPathHint = on; } + + /** Get whether fast paths should be used when supported.*/ + bool getFastPathHint() const { return _fastPathHint; } + /** return true if OpenGL fast paths will be used with drawing this Geometry. * Fast paths use vertex arrays, and glDrawArrays/glDrawElements. Slow paths * use glBegin()/glVertex.../glEnd(). Use of per primitive bindings or per vertex indexed * arrays will drop the rendering path off the fast path.*/ - inline bool areFastPathsUsed() const { return _fastPath; } + inline bool areFastPathsUsed() const { return _fastPath && _fastPathHint; } bool computeFastPathsUsed(); @@ -344,6 +350,8 @@ class SG_EXPORT Geometry : public Drawable mutable bool _fastPath; + bool _fastPathHint; + ref_ptr _internalOptimizedGeometry; }; diff --git a/src/osg/Geometry.cpp b/src/osg/Geometry.cpp index e89ad92b8..afa313d5c 100644 --- a/src/osg/Geometry.cpp +++ b/src/osg/Geometry.cpp @@ -15,6 +15,46 @@ using namespace osg; +#if 1 +class DrawVertex +{ + public: + + DrawVertex(const Array* vertices,const IndexArray* indices): + _vertices(vertices), + _indices(indices) + { + _verticesType = _vertices->getType(); + } + + inline void operator () (unsigned int pos) + { + if (_indices) pos = _indices->index(pos); + + switch(_verticesType) + { + case(Array::Vec3ArrayType): + apply((*(static_cast(_vertices)))[pos]); + break; + case(Array::Vec2ArrayType): + apply((*(static_cast(_vertices)))[pos]); + break; + case(Array::Vec4ArrayType): + apply((*(static_cast(_vertices)))[pos]); + break; + } + + } + + inline void apply(const Vec2& v) { glVertex2fv(v.ptr()); } + inline void apply(const Vec3& v) { glVertex3fv(v.ptr()); } + inline void apply(const Vec4& v) { glVertex4fv(v.ptr()); } + + const Array* _vertices; + const IndexArray* _indices; + Array::Type _verticesType; +}; +#else class DrawVertex : public osg::ConstValueVisitor { public: @@ -23,7 +63,7 @@ class DrawVertex : public osg::ConstValueVisitor _vertices(vertices), _indices(indices) {} - void operator () (unsigned int pos) + inline void operator () (unsigned int pos) { if (_indices) _vertices->accept(_indices->index(pos),*this); else _vertices->accept(pos,*this); @@ -36,6 +76,7 @@ class DrawVertex : public osg::ConstValueVisitor const Array* _vertices; const IndexArray* _indices; }; +#endif class DrawNormal { @@ -55,6 +96,61 @@ class DrawNormal const IndexArray* _indices; }; +#if 1 +class DrawColor +{ + public: + + DrawColor(const Array* colors,const IndexArray* indices): + _colors(colors), + _indices(indices) + { + _colorsType = _colors->getType(); + _indicesType = _indices->getType(); + } + + inline unsigned int index(unsigned int pos) + { + switch(_indicesType) + { + case(Array::ByteArrayType): return (*static_cast(_indices))[pos]; + case(Array::ShortArrayType): return (*static_cast(_indices))[pos]; + case(Array::IntArrayType): return (*static_cast(_indices))[pos]; + case(Array::UByteArrayType): return (*static_cast(_indices))[pos]; + case(Array::UShortArrayType): return (*static_cast(_indices))[pos]; + case(Array::UIntArrayType): return (*static_cast(_indices))[pos]; + default: return 0; + } + } + + inline void operator () (unsigned int pos) + { + if (_indices) pos = index(pos); + + switch(_colorsType) + { + case(Array::Vec4ArrayType): + apply((*static_cast(_colors))[pos]); + break; + case(Array::UByte4ArrayType): + apply((*static_cast(_colors))[pos]); + break; + case(Array::Vec3ArrayType): + apply((*static_cast(_colors))[pos]); + break; + } + } + + inline void apply(const UByte4& v) { glColor4ubv(v.ptr()); } + inline void apply(const Vec3& v) { glColor3fv(v.ptr()); } + inline void apply(const Vec4& v) { glColor4fv(v.ptr()); } + + const Array* _colors; + const IndexArray* _indices; + Array::Type _colorsType; + Array::Type _indicesType; +}; +#else class DrawColor : public osg::ConstValueVisitor { public: @@ -63,7 +159,7 @@ class DrawColor : public osg::ConstValueVisitor _colors(colors), _indices(indices) {} - void operator () (unsigned int pos) + inline void operator () (unsigned int pos) { if (_indices) _colors->accept(_indices->index(pos),*this); else _colors->accept(pos,*this); @@ -76,7 +172,7 @@ class DrawColor : public osg::ConstValueVisitor const Array* _colors; const IndexArray* _indices; }; - +#endif class DrawVertexAttrib : public osg::Referenced, public osg::ConstValueVisitor { public: @@ -88,7 +184,7 @@ public: _attribcoords(attribcoords), _indices(indices) {;} - void operator () (unsigned int pos) + inline void operator () (unsigned int pos) { if (_indices) _attribcoords->accept(_indices->index(pos),*this); else _attribcoords->accept(pos,*this); @@ -141,7 +237,7 @@ class DrawTexCoord : public osg::Referenced, public osg::ConstValueVisitor _texcoords(texcoords), _indices(indices) {} - void operator () (unsigned int pos) + inline void operator () (unsigned int pos) { if (_indices) _texcoords->accept(_indices->index(pos),*this); else _texcoords->accept(pos,*this); @@ -167,7 +263,7 @@ class DrawMultiTexCoord : public osg::Referenced, public osg::ConstValueVisitor _indices(indices), _extensions(extensions) {} - void operator () (unsigned int pos) + inline void operator () (unsigned int pos) { if (_indices) _texcoords->accept(_indices->index(pos),*this); else _texcoords->accept(pos,*this); @@ -197,7 +293,7 @@ class DrawSecondaryColor : public osg::ConstValueVisitor _extensions(extensions) {} - void operator () (unsigned int pos) + inline void operator () (unsigned int pos) { if (_indices) _colors->accept(_indices->index(pos),*this); else _colors->accept(pos,*this); @@ -222,7 +318,7 @@ class DrawFogCoord : public osg::ConstValueVisitor _indices(indices), _extensions(extensions) {} - void operator () (unsigned int pos) + inline void operator () (unsigned int pos) { if (_indices) _fogcoords->accept(_indices->index(pos),*this); else _fogcoords->accept(pos,*this); @@ -245,6 +341,8 @@ Geometry::Geometry() _fogCoordBinding = BIND_OFF; _fastPath = false; + + _fastPathHint = true; } Geometry::Geometry(const Geometry& geometry,const CopyOp& copyop): @@ -267,7 +365,7 @@ Geometry::Geometry(const Geometry& geometry,const CopyOp& copyop): _fogCoordArray(dynamic_cast(copyop(geometry._fogCoordArray.get()))), _fogCoordIndices(dynamic_cast(copyop(geometry._fogCoordIndices.get()))), _fastPath(geometry._fastPath), - _internalOptimizedGeometry(geometry._internalOptimizedGeometry) + _fastPathHint(geometry._fastPathHint) { for(PrimitiveSetList::const_iterator pitr=geometry._primitives.begin(); pitr!=geometry._primitives.end();