diff --git a/include/osg/Drawable b/include/osg/Drawable index cddd4fdf6..73bdad856 100644 --- a/include/osg/Drawable +++ b/include/osg/Drawable @@ -8,7 +8,6 @@ #include #include #include -#include #include #include @@ -20,6 +19,7 @@ namespace osg { class Vec2; class Vec3; class Vec4; +class UByte4; class Node; // this is define to alter the way display lists are compiled inside the @@ -218,50 +218,54 @@ class SG_EXPORT Drawable : public Object * in the OpenGL context related to contextID.*/ static void flushDeletedDisplayLists(uint contextID); - typedef uint AttributeBitMask; - - enum AttributeBitMaskValues + enum AttributeType { - COORDS = 0x1, - NORMALS = 0x2, - COLORS = 0x4, - TEXTURE_COORDS = 0x8, + VERTICES, + NORMALS, + COLORS, + TEXTURE_COORDS, TEXTURE_COORDS_0 = TEXTURE_COORDS, - TEXTURE_COORDS_1 = 0x10, - TEXTURE_COORDS_2 = 0x20, - TEXTURE_COORDS_3 = 0x40 + TEXTURE_COORDS_1 = TEXTURE_COORDS_0+1, + TEXTURE_COORDS_2 = TEXTURE_COORDS_0+2, + TEXTURE_COORDS_3 = TEXTURE_COORDS_0+3, + TEXTURE_COORDS_4 = TEXTURE_COORDS_0+4, + TEXTURE_COORDS_5 = TEXTURE_COORDS_0+5, + TEXTURE_COORDS_6 = TEXTURE_COORDS_0+6, + TEXTURE_COORDS_7 = TEXTURE_COORDS_0+7 + // only eight texture coord examples provided here, but underlying code can handle any no of texure units, + // simply co them as (TEXTURE_COORDS_0+unit). }; class AttributeFunctor { public: - AttributeFunctor(AttributeBitMask abm):_abm(abm) {} virtual ~AttributeFunctor() {} - - void setAttributeBitMask(AttributeBitMask abm) { _abm=abm; } - AttributeBitMask getAttributeBitMask() const { return _abm; } - - virtual bool apply(AttributeBitMask,Vec2*,Vec2*) { return false; } - virtual bool apply(AttributeBitMask,Vec3*,Vec3*) { return false; } - virtual bool apply(AttributeBitMask,Vec4*,Vec4*) { return false; } - protected: - - AttributeBitMask _abm; + virtual void apply(AttributeType,unsigned int,GLbyte*) {} + virtual void apply(AttributeType,unsigned int,GLshort*) {} + virtual void apply(AttributeType,unsigned int,GLint*) {} + + virtual void apply(AttributeType,unsigned int,GLubyte*) {} + virtual void apply(AttributeType,unsigned int,GLushort*) {} + virtual void apply(AttributeType,unsigned int,GLuint*) {} + + virtual void apply(AttributeType,unsigned int,float*) {} + virtual void apply(AttributeType,unsigned int,Vec2*) {} + virtual void apply(AttributeType,unsigned int,Vec3*) {} + virtual void apply(AttributeType,unsigned int,Vec4*) {} + virtual void apply(AttributeType,unsigned int,UByte4*) {} }; - /** return the attributes supported by applyAttrbuteOperation() as an AttributeBitMask.*/ - virtual AttributeBitMask suppportsAttributeOperation() const { return (AttributeBitMask)0; } - - /** return the attributes successully applied in applyAttributeUpdate.*/ - virtual AttributeBitMask applyAttributeOperation(AttributeFunctor&) { return 0; } + /** accept an AttributeFunctor and call its methods to tell it about the interal attributes that this Drawable has.*/ + virtual void accept(AttributeFunctor&) {} - class PrimitiveFunctor { public: + virtual ~PrimitiveFunctor() {} + virtual void setVertexArray(unsigned int count,Vec3* vertices) = 0; virtual void drawArrays(GLenum mode,GLint first,GLsizei count) = 0; @@ -276,8 +280,8 @@ class SG_EXPORT Drawable : public Object }; - /** apply the internal geometry as basic primitives to a PrimitiveFunctor.*/ - virtual void applyPrimitiveOperation(PrimitiveFunctor&) {} + /** accept a PrimtiveFunctor and call its methods to tell it about the interal primtives that this Drawable has.*/ + virtual void accept(PrimitiveFunctor&) {} protected: diff --git a/include/osg/GeoSet b/include/osg/GeoSet index 015c191d3..307e641ff 100644 --- a/include/osg/GeoSet +++ b/include/osg/GeoSet @@ -329,14 +329,11 @@ class SG_EXPORT GeoSet : public Drawable /** get the current AttributeDeleteFunction to handle attribute arrays attached to this Geoset.*/ const AttributeDeleteFunctor* getAttributeDeleteFunctor() const { return _adf.get(); } - /** return the attributes supported by applyAttrbuteUpdate() as an AttributeBitMask.*/ - virtual AttributeBitMask suppportsAttributeOperation() const; + /** accept an AttributeFunctor and call its methods to tell it about the interal attributes that this Drawable has.*/ + virtual void accept(AttributeFunctor& af); - /** return the attributes successully applied in applyAttributeUpdate.*/ - virtual AttributeBitMask applyAttributeOperation(AttributeFunctor& auf); - - /** apply the internal geometry as basic primitives to a PrimitiveFunctor.*/ - virtual void applyPrimitiveOperation(PrimitiveFunctor& functor); + /** accept a PrimtiveFunctor and call its methods to tell it about the interal primtives that this Drawable has.*/ + virtual void accept(PrimitiveFunctor& pf); /** convinience function for converting GeoSet's to equivilant Geometry nodes.*/ Geometry* convertToGeometry(); diff --git a/include/osg/Geometry b/include/osg/Geometry index f28649f6a..616b4a695 100644 --- a/include/osg/Geometry +++ b/include/osg/Geometry @@ -91,14 +91,11 @@ class SG_EXPORT Geometry : public Drawable */ virtual void drawImmediateMode(State& state); + /** accept an AttributeFunctor and call its methods to tell it about the interal attributes that this Drawable has.*/ + virtual void accept(AttributeFunctor& af); - /** return the attributes supported by applyAttrbuteUpdate() as an AttributeBitMask.*/ - virtual AttributeBitMask suppportsAttributeOperation() const; - - /** return the attributes successully applied in applyAttributeUpdate.*/ - virtual AttributeBitMask applyAttributeOperation(AttributeFunctor& auf); - - virtual void applyPrimitiveOperation(PrimitiveFunctor&); + /** accept a PrimtiveFunctor and call its methods to tell it about the interal primtives that this Drawable has.*/ + virtual void accept(PrimitiveFunctor& pf); protected: diff --git a/include/osg/ImpostorSprite b/include/osg/ImpostorSprite index d1ce91c04..541b607fe 100644 --- a/include/osg/ImpostorSprite +++ b/include/osg/ImpostorSprite @@ -116,6 +116,12 @@ class SG_EXPORT ImpostorSprite : public Drawable /** draw ImpostorSprite directly. */ virtual void drawImmediateMode(State& state); + /** accept an AttributeFunctor and call its methods to tell it about the interal attributes that this Drawable has.*/ + virtual void accept(AttributeFunctor& af); + + /** accept a PrimtiveFunctor and call its methods to tell it about the interal primtives that this Drawable has.*/ + virtual void accept(PrimitiveFunctor& pf); + protected: ImpostorSprite(const ImpostorSprite&):Drawable() {} diff --git a/include/osg/Primitive b/include/osg/Primitive index 949b172f5..6e27992b3 100644 --- a/include/osg/Primitive +++ b/include/osg/Primitive @@ -123,7 +123,7 @@ class Primitive : public Object virtual void draw() const = 0; - virtual void applyPrimitiveOperation(Drawable::PrimitiveFunctor&) {} + virtual void accept(Drawable::PrimitiveFunctor&) {} virtual void offsetIndices(int offset) = 0; @@ -174,7 +174,7 @@ class SG_EXPORT DrawArrays : public Primitive virtual void draw() const; - virtual void applyPrimitiveOperation(Drawable::PrimitiveFunctor& functor); + virtual void accept(Drawable::PrimitiveFunctor& functor); virtual void offsetIndices(int offset) { _first += offset; } @@ -225,7 +225,7 @@ class SG_EXPORT DrawArrayLengths : public Primitive, public VectorSizei virtual void draw() const; - virtual void applyPrimitiveOperation(Drawable::PrimitiveFunctor& functor); + virtual void accept(Drawable::PrimitiveFunctor& functor); virtual void offsetIndices(int offset) { _first += offset; } @@ -266,7 +266,7 @@ class SG_EXPORT DrawElementsUByte : public Primitive, public VectorUByte virtual void draw() const ; - virtual void applyPrimitiveOperation(Drawable::PrimitiveFunctor& functor); + virtual void accept(Drawable::PrimitiveFunctor& functor); virtual void offsetIndices(int offset); }; @@ -304,7 +304,7 @@ class SG_EXPORT DrawElementsUShort : public Primitive, public VectorUShort virtual void draw() const; - virtual void applyPrimitiveOperation(Drawable::PrimitiveFunctor& functor); + virtual void accept(Drawable::PrimitiveFunctor& functor); virtual void offsetIndices(int offset); }; @@ -341,7 +341,7 @@ class SG_EXPORT DrawElementsUInt : public Primitive, public VectorUInt virtual void draw() const; - virtual void applyPrimitiveOperation(Drawable::PrimitiveFunctor& functor); + virtual void accept(Drawable::PrimitiveFunctor& functor); virtual void offsetIndices(int offset); }; diff --git a/src/Demos/osggeometry/osggeometry.cpp b/src/Demos/osggeometry/osggeometry.cpp index 65fa3af86..0277f4a48 100644 --- a/src/Demos/osggeometry/osggeometry.cpp +++ b/src/Demos/osggeometry/osggeometry.cpp @@ -52,7 +52,7 @@ void printTriangles(const std::string& name, osg::Drawable& drawable) std::cout< tf; - drawable.applyPrimitiveOperation(tf); + drawable.accept(tf); std::cout<applyAttributeOperation(*this); + drawable->accept(*this); drawable->dirtyBound(); osg::Geometry* geometry = dynamic_cast(drawable); @@ -245,13 +244,14 @@ class MyGeometryCallback : } - virtual bool apply(osg::Drawable::AttributeBitMask abm,osg::Vec3* begin,osg::Vec3* end) + virtual void apply(osg::Drawable::AttributeType type,unsigned int count,osg::Vec3* begin) { - if (abm == osg::Drawable::COORDS) + if (type == osg::Drawable::VERTICES) { const float TwoPI=2.0f*osg::PI; const float phase = -_time/_period; + osg::Vec3* end = begin+count; for (osg::Vec3* itr=begin;itrempty()) + if (_vertexArray.valid() && !_vertexArray->empty()) { - if (auf.apply(COORDS,&(*(_vertexArray->begin())),&(*(_vertexArray->end())))) ramb = COORDS; + af.apply(VERTICES,_vertexArray->size(),&(_vertexArray->front())); } - if ((amb & NORMALS) && _normalArray.valid() && !_normalArray->empty()) + if (_normalArray.valid() && !_normalArray->empty()) { - if (auf.apply(NORMALS,&(*(_normalArray->begin())),&(*(_normalArray->end())))) ramb = NORMALS; + af.apply(NORMALS,_normalArray->size(),&(_normalArray->front())); } - - // colors and texture coords to implement... - - return ramb; + // need to add other attriubtes } -void Geometry::applyPrimitiveOperation(PrimitiveFunctor& functor) +void Geometry::accept(PrimitiveFunctor& functor) { if (!_vertexArray.valid() || _vertexArray->empty()) return; @@ -230,7 +217,7 @@ void Geometry::applyPrimitiveOperation(PrimitiveFunctor& functor) itr!=_primitives.end(); ++itr) { - (*itr)->applyPrimitiveOperation(functor); + (*itr)->accept(functor); } } diff --git a/src/osg/ImpostorSprite.cpp b/src/osg/ImpostorSprite.cpp index c89707a50..63e32c603 100644 --- a/src/osg/ImpostorSprite.cpp +++ b/src/osg/ImpostorSprite.cpp @@ -115,6 +115,20 @@ void ImpostorSprite::setTexture(Texture* tex,int s,int t) } +void ImpostorSprite::accept(AttributeFunctor& af) +{ + af.apply(VERTICES,4,_coords); + af.apply(TEXTURE_COORDS_0,4,_texcoords); +} + +void ImpostorSprite::accept(PrimitiveFunctor& functor) +{ + functor.setVertexArray(4,_coords); + functor.drawArrays( GL_QUADS, 0, 4); + +} + + /////////////////////////////////////////////////////////////////////////// // Helper class for managing the reuse of ImpostorSprite resources. /////////////////////////////////////////////////////////////////////////// @@ -267,3 +281,4 @@ ImpostorSprite* ImpostorSpriteManager::createOrReuseImpostorSprite(int s,int t,i return is; } + diff --git a/src/osg/Primitive.cpp b/src/osg/Primitive.cpp index 2ae37fca6..b505d66bb 100644 --- a/src/osg/Primitive.cpp +++ b/src/osg/Primitive.cpp @@ -7,7 +7,7 @@ void DrawArrays::draw() const glDrawArrays(_mode,_first,_count); } -void DrawArrays::applyPrimitiveOperation(Drawable::PrimitiveFunctor& functor) +void DrawArrays::accept(Drawable::PrimitiveFunctor& functor) { functor.drawArrays(_mode,_first,_count); } @@ -24,7 +24,7 @@ void DrawArrayLengths::draw() const } } -void DrawArrayLengths::applyPrimitiveOperation(Drawable::PrimitiveFunctor& functor) +void DrawArrayLengths::accept(Drawable::PrimitiveFunctor& functor) { GLint first = _first; for(VectorSizei::iterator itr=begin(); @@ -43,7 +43,7 @@ void DrawElementsUByte::draw() const glDrawElements(_mode,size(),GL_UNSIGNED_BYTE,&front()); } -void DrawElementsUByte::applyPrimitiveOperation(Drawable::PrimitiveFunctor& functor) +void DrawElementsUByte::accept(Drawable::PrimitiveFunctor& functor) { if (!empty()) functor.drawElements(_mode,size(),&front()); } @@ -64,7 +64,7 @@ void DrawElementsUShort::draw() const glDrawElements(_mode,size(),GL_UNSIGNED_SHORT,&front()); } -void DrawElementsUShort::applyPrimitiveOperation(Drawable::PrimitiveFunctor& functor) +void DrawElementsUShort::accept(Drawable::PrimitiveFunctor& functor) { if (!empty()) functor.drawElements(_mode,size(),&front()); } @@ -85,7 +85,7 @@ void DrawElementsUInt::draw() const glDrawElements(_mode,size(),GL_UNSIGNED_INT,&front()); } -void DrawElementsUInt::applyPrimitiveOperation(Drawable::PrimitiveFunctor& functor) +void DrawElementsUInt::accept(Drawable::PrimitiveFunctor& functor) { if (!empty()) functor.drawElements(_mode,size(),&front()); } diff --git a/src/osgUtil/IntersectVisitor.cpp b/src/osgUtil/IntersectVisitor.cpp index 923f8eed7..dd5db6be3 100644 --- a/src/osgUtil/IntersectVisitor.cpp +++ b/src/osgUtil/IntersectVisitor.cpp @@ -449,7 +449,7 @@ bool IntersectVisitor::intersect(Drawable& drawable) TriangleFunctor ti; ti.set(*sitr->second); - drawable.applyPrimitiveOperation(ti); + drawable.accept(ti); if (ti._hit) { diff --git a/src/osgUtil/Optimizer.cpp b/src/osgUtil/Optimizer.cpp index b86e9568d..6b30ff04b 100644 --- a/src/osgUtil/Optimizer.cpp +++ b/src/osgUtil/Optimizer.cpp @@ -99,8 +99,7 @@ class TransformFunctor : public osg::Drawable::AttributeFunctor osg::Matrix _m; osg::Matrix _im; - TransformFunctor(const osg::Matrix& m): - osg::Drawable::AttributeFunctor(osg::Drawable::COORDS|osg::Drawable::NORMALS) + TransformFunctor(const osg::Matrix& m) { _m = m; _im.invert(_m); @@ -108,28 +107,26 @@ class TransformFunctor : public osg::Drawable::AttributeFunctor virtual ~TransformFunctor() {} - virtual bool apply(osg::Drawable::AttributeBitMask abm,osg::Vec3* begin,osg::Vec3* end) + virtual void apply(osg::Drawable::AttributeType type,unsigned int count,osg::Vec3* begin) { - if (abm == osg::Drawable::COORDS) + if (type == osg::Drawable::VERTICES) { + osg::Vec3* end = begin+count; for (osg::Vec3* itr=begin;itrapplyAttributeOperation(tf); + drawable->accept(tf); drawable->dirtyBound(); return; } @@ -498,7 +495,7 @@ void Optimizer::FlattenStaticTransformsVisitor::doTransform(osg::Object* obj,osg for(unsigned int i=0;igetNumDrawables();++i) { billboard->setPos(i,billboard->getPos(i)*matrix); - billboard->getDrawable(i)->applyAttributeOperation(tf); + billboard->getDrawable(i)->accept(tf); } billboard->dirtyBound(); @@ -717,7 +714,7 @@ void Optimizer::RemoveLowestStaticTransformsVisitor::doTransform(osg::Object* ob if (drawable) { TransformFunctor tf(matrix); - drawable->applyAttributeOperation(tf); + drawable->accept(tf); drawable->dirtyBound(); return; } @@ -760,7 +757,7 @@ void Optimizer::RemoveLowestStaticTransformsVisitor::doTransform(osg::Object* ob for(unsigned int i=0;igetNumDrawables();++i) { billboard->setPos(i,billboard->getPos(i)*matrix); - billboard->getDrawable(i)->applyAttributeOperation(tf); + billboard->getDrawable(i)->accept(tf); } billboard->dirtyBound(); diff --git a/src/osgUtil/RenderBin.cpp b/src/osgUtil/RenderBin.cpp index a01c3ecd7..c49593d4c 100644 --- a/src/osgUtil/RenderBin.cpp +++ b/src/osgUtil/RenderBin.cpp @@ -191,7 +191,7 @@ bool RenderBin::getStats(osg::Statistics* primStats) if (dw) { // then tot up the primtive types and no vertices. - dw->applyPrimitiveOperation(*primStats); // use sub-class to find the stats for each drawable + dw->accept(*primStats); // use sub-class to find the stats for each drawable } } somestats=true; diff --git a/src/osgUtil/SmoothingVisitor.cpp b/src/osgUtil/SmoothingVisitor.cpp index 89fc86e6a..d64a9f422 100644 --- a/src/osgUtil/SmoothingVisitor.cpp +++ b/src/osgUtil/SmoothingVisitor.cpp @@ -111,7 +111,7 @@ void SmoothingVisitor::smooth(osg::Geometry& geom) TriangleFunctor stf; stf.set(&(coords->front()),coords->size(),&(normals->front())); - geom.applyPrimitiveOperation(stf); + geom.accept(stf); for(nitr= normals->begin(); nitr!=normals->end(); diff --git a/src/osgUtil/TriStripVisitor.cpp b/src/osgUtil/TriStripVisitor.cpp index dbd5cc684..d0e0f0539 100644 --- a/src/osgUtil/TriStripVisitor.cpp +++ b/src/osgUtil/TriStripVisitor.cpp @@ -82,7 +82,7 @@ void TriStripVisitor::stripify(Geometry& geom) case(Primitive::QUADS): case(Primitive::QUAD_STRIP): case(Primitive::POLYGON): - (*itr)->applyPrimitiveOperation(taf); + (*itr)->accept(taf); break; default: new_primitives.push_back(*itr);