/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2005 Robert Osfield * * This library is open source and may be redistributed and/or modified under * the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or * (at your option) any later version. The full license is in LICENSE file * included with this distribution, and on the openscenegraph.org website. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * OpenSceneGraph Public License for more details. */ #ifndef OSG_SHAPEDRAWABLE #define OSG_SHAPEDRAWABLE 1 #include #include #include #include #include #include namespace osg { /** Describe several hints that can be passed to a tesselator (like the one used * by \c ShapeDrawable) as a mean to try to influence the way it works. */ class TessellationHints : public Object { public: TessellationHints(): _TessellationMode(USE_SHAPE_DEFAULTS), _detailRatio(1.0f), _targetNumFaces(100), _createFrontFace(true), _createBackFace(false), _createNormals(true), _createTextureCoords(false), _createTop(true), _createBody(true), _createBottom(true) {} TessellationHints(const TessellationHints& tess, const CopyOp& copyop=CopyOp::SHALLOW_COPY): Object(tess,copyop), _TessellationMode(tess._TessellationMode), _detailRatio(tess._detailRatio), _targetNumFaces(tess._targetNumFaces), _createFrontFace(tess._createFrontFace), _createBackFace(tess._createBackFace), _createNormals(tess._createNormals), _createTextureCoords(tess._createTextureCoords), _createTop(tess._createTop), _createBody(tess._createBody), _createBottom(tess._createBottom) {} META_Object(osg,TessellationHints); enum TessellationMode { USE_SHAPE_DEFAULTS, USE_TARGET_NUM_FACES }; inline void setTessellationMode(TessellationMode mode) { _TessellationMode=mode; } inline TessellationMode getTessellationMode() const { return _TessellationMode; } inline void setDetailRatio(float ratio) { _detailRatio = ratio; } inline float getDetailRatio() const { return _detailRatio; } inline void setTargetNumFaces(unsigned int target) { _targetNumFaces=target; } inline unsigned int getTargetNumFaces() const { return _targetNumFaces; } inline void setCreateFrontFace(bool on) { _createFrontFace=on; } inline bool getCreateFrontFace() const { return _createFrontFace; } inline void setCreateBackFace(bool on) { _createBackFace=on; } inline bool getCreateBackFace() const { return _createBackFace; } inline void setCreateNormals(bool on) { _createNormals=on; } inline bool getCreateNormals() const { return _createNormals; } inline void setCreateTextureCoords(bool on) { _createTextureCoords=on; } inline bool getCreateTextureCoords() const { return _createTextureCoords; } inline void setCreateTop(bool on) { _createTop=on; } inline bool getCreateTop() const { return _createTop; } inline void setCreateBody(bool on) { _createBody=on; } inline bool getCreateBody() const { return _createBody; } inline void setCreateBottom(bool on) { _createBottom=on; } inline bool getCreateBottom() const { return _createBottom; } protected: ~TessellationHints() {} TessellationMode _TessellationMode; float _detailRatio; unsigned int _targetNumFaces; bool _createFrontFace; bool _createBackFace; bool _createNormals; bool _createTextureCoords; bool _createTop; bool _createBody; bool _createBottom; }; /** Allow the use of Shapes as Drawables, so that they can * be rendered with reduced effort. The implementation of \c ShapeDrawable is * not geared to efficiency; it's better to think of it as a convenience to * render Shapes easily (perhaps for test or debugging purposes) than * as the right way to render basic shapes in some efficiency-critical section * of code. * @todo \c ShapeDrawable currently doesn't render InfinitePlanes. */ class OSG_EXPORT ShapeDrawable : public Drawable { public: ShapeDrawable(); ShapeDrawable(Shape* shape, TessellationHints* hints=0); /** Copy constructor using CopyOp to manage deep vs shallow copy.*/ ShapeDrawable(const ShapeDrawable& pg,const CopyOp& copyop=CopyOp::SHALLOW_COPY); virtual Object* cloneType() const { return new ShapeDrawable(); } virtual Object* clone(const CopyOp& copyop) const { return new ShapeDrawable(*this,copyop); } virtual bool isSameKindAs(const Object* obj) const { return dynamic_cast(obj)!=NULL; } virtual const char* libraryName() const { return "osg"; } virtual const char* className() const { return "ShapeDrawable"; } /** Set the color of the shape.*/ void setColor(const Vec4& color); /** Get the color of the shape.*/ const Vec4& getColor() const { return _color; } void setTessellationHints(TessellationHints* hints); TessellationHints* getTessellationHints() { return _tessellationHints.get(); } const TessellationHints* getTessellationHints() const { return _tessellationHints.get(); } /** Draw ShapeDrawable directly ignoring an OpenGL display list which * could be attached. This is the internal draw method which does the * drawing itself, and is the method to override when deriving from * ShapeDrawable for user-drawn objects. */ virtual void drawImplementation(State& state) const; /** Return false, osg::ShapeDrawable does not support accept(AttributeFunctor&).*/ virtual bool supports(const AttributeFunctor&) const { return false; } /** Return true, osg::ShapeDrawable does support accept(ConstAttributeFunctor&).*/ virtual bool supports(const ConstAttributeFunctor&) const { return true; } /** Accept a ConstAttributeFunctor and call its methods to tell it about the interal attributes that this Drawable has.*/ virtual void accept(ConstAttributeFunctor& af) const; /** Return true, osg::ShapeDrawable does support accept(PrimitiveFunctor&) .*/ virtual bool supports(const PrimitiveFunctor&) const { return true; } /** Accept a PrimitiveFunctor and call its methods to tell it about the internal primitives that this Drawable has.*/ virtual void accept(PrimitiveFunctor& pf) const; virtual BoundingBox computeBound() const; protected: ShapeDrawable& operator = (const ShapeDrawable&) { return *this;} virtual ~ShapeDrawable(); Vec4 _color; ref_ptr _tessellationHints; }; } #endif