Skip to content
Snippets Groups Projects
Point 5.93 KiB
Newer Older
  • Learn to ignore specific revisions
  • Lorenz Meier's avatar
    Lorenz Meier committed
    /* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2006 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_POINT
    #define OSG_POINT 1
    
    #include <osg/Vec3>
    #include <osg/StateAttribute>
    
    #ifndef GL_POINT_SMOOTH
        #define GL_POINT_SMOOTH     0x0B10
    #endif
    
    #ifndef GL_POINT_SMOOTH_HINT
        #define GL_POINT_SMOOTH_HINT 0x0C51
    #endif
    
    namespace osg {
    
    /** Point - encapsulates the OpenGL point smoothing and size state.*/
    class OSG_EXPORT Point : public StateAttribute
    {
        public :
    
            Point();
    
            Point(float size);
    
            /** Copy constructor using CopyOp to manage deep vs shallow copy.*/
            Point(const Point& point,const CopyOp& copyop=CopyOp::SHALLOW_COPY):
                StateAttribute(point,copyop),
                _size(point._size),
                _fadeThresholdSize(point._fadeThresholdSize),
                _distanceAttenuation(point._distanceAttenuation),
                _minSize(point._minSize),
                _maxSize(point._maxSize) {}
    
            META_StateAttribute(osg, Point, POINT);
            
            /** return -1 if *this < *rhs, 0 if *this==*rhs, 1 if *this>*rhs.*/
            virtual int compare(const StateAttribute& sa) const
            {
                // check the types are equal and then create the rhs variable
                // used by the COMPARE_StateAttribute_Parameter macros below.
                COMPARE_StateAttribute_Types(Point,sa)
    
                // compare each parameter in turn against the rhs.
                COMPARE_StateAttribute_Parameter(_size)
                COMPARE_StateAttribute_Parameter(_fadeThresholdSize)
                COMPARE_StateAttribute_Parameter(_distanceAttenuation)
                COMPARE_StateAttribute_Parameter(_minSize)
                COMPARE_StateAttribute_Parameter(_maxSize)
    
                return 0; // passed all the above comparison macros, must be equal.
            }
    
            virtual bool getModeUsage(StateAttribute::ModeUsage& usage) const
            {
                usage.usesMode(GL_POINT_SMOOTH);
                return true;
            }
    
            void setSize(float size);
            inline float getSize() const { return _size; }
    
            void setFadeThresholdSize(float fadeThresholdSize);
            inline float getFadeThresholdSize() const { return _fadeThresholdSize; }
    
            void setDistanceAttenuation(const Vec3& distanceAttenuation);
            inline const Vec3& getDistanceAttenuation() const { return _distanceAttenuation; }
    
            void setMinSize(float minSize);
            inline float getMinSize() const {return _minSize;}
    
            void setMaxSize(float maxSize);
            inline float getMaxSize() const {return _maxSize;}
    
            virtual void apply(State& state) const;
    
            /** Encapsulates queries of extension availability, obtains extension
              * function pointers, and provides convenience wrappers for
              * calling extension functions. */        
            class OSG_EXPORT Extensions : public osg::Referenced
            {
                public:
                    Extensions(unsigned int contextID);
    
                    Extensions(const Extensions& rhs);
                    
                    void lowestCommonDenominator(const Extensions& rhs);
                    
                    void setupGLExtensions(unsigned int contextID);
    
                    void setPointParametersSupported(bool flag) { _isPointParametersSupported=flag; }
                    bool isPointParametersSupported() const { return _isPointParametersSupported; }
    
                    void setPointSpriteCoordOriginSupported(bool flag) { _isPointSpriteCoordOriginSupported=flag; }
                    bool isPointSpriteCoordOriginSupported() const { return _isPointSpriteCoordOriginSupported; }
    
                    void glPointParameteri(GLenum pname, GLint param) const;
                    void glPointParameterf(GLenum pname, GLfloat param) const;
                    void glPointParameterfv(GLenum pname, const GLfloat *params) const;
    
                protected:
    
                    ~Extensions() {}
                    
                    bool _isPointParametersSupported;
                    bool _isPointSpriteCoordOriginSupported;
    
                    typedef void (GL_APIENTRY * GLPointParameteriProc) (GLenum pname, GLint param);
                    typedef void (GL_APIENTRY * GLPointParameterfProc) (GLenum pname, GLfloat param);
                    typedef void (GL_APIENTRY * GLPointParameterfvProc) (GLenum pname, const GLfloat *params);
    
                    GLPointParameteriProc   _glPointParameteri;
                    GLPointParameterfProc   _glPointParameterf;
                    GLPointParameterfvProc  _glPointParameterfv;
    
            };
            
            /** Returns the Extensions object for the given context.
              * If createIfNotInitalized is true and the Extensions object doesn't
              * exist, getExtensions() creates it on the given context.
              * Returns NULL if createIfNotInitalized is false and the Extensions
              * object doesn't exist. */
            static Extensions* getExtensions(unsigned int contextID,bool createIfNotInitalized);
    
            /** setExtensions() allows users to override the extensions across graphics contexts.
              * Typically used when you have different extensions supported across graphics pipes,
              * but need to ensure that they all use the same low common denominator extensions. */
            static void setExtensions(unsigned int contextID,Extensions* extensions);
    
        protected :
    
            virtual ~Point();
    
            float       _size;
            float       _fadeThresholdSize;
            Vec3        _distanceAttenuation;
            float        _minSize;
            float        _maxSize;
    
    };
    
    }
    
    #endif