/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2003 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_STATEATTRIBUTE #define OSG_STATEATTRIBUTE 1 #include #include #include #include #include namespace osg { // forward declare State & StateSet class State; class StateSet; /** META_StateAttribute macro define the standard clone, isSameKindAs, * className and getType methods. * Use when subclassing from Object to make it more convenient to define * the standard pure virtual methods which are required for all Object * subclasses.*/ #define META_StateAttribute(library,name,type) \ virtual osg::Object* cloneType() const { return new name(); } \ virtual osg::Object* clone(const osg::CopyOp& copyop) const { return new name (*this,copyop); } \ virtual bool isSameKindAs(const osg::Object* obj) const { return dynamic_cast(obj)!=NULL; } \ virtual const char* libraryName() const { return #library; } \ virtual const char* className() const { return #name; } \ virtual Type getType() const { return type; } /** COMPARE_StateAttribute_Types macro is a helper for implementing the StateAtribute::compare(..) method.*/ #define COMPARE_StateAttribute_Types(TYPE,rhs_attribute) \ if (this==&rhs_attribute) return 0;\ const std::type_info* type_lhs = &typeid(*this);\ const std::type_info* type_rhs = &typeid(rhs_attribute);\ if (type_lhs->before(*type_rhs)) return -1;\ if (*type_lhs != *type_rhs) return 1;\ const TYPE& rhs = static_cast(rhs_attribute); /** COMPARE_StateAttribute_Parameter macro is a helper for implementing the StatateAtribute::compare(..) method. * Macro assumes that variable rhs has been correctly defined by preceding code * macro.*/ #define COMPARE_StateAttribute_Parameter(parameter) \ if (parameter TypeMemberPair; /* struct TypeMember { inline TypeMember(Type type, unsigned int member=0): _type(type), _member(member) {} inline bool operator < (const TypeMember& tm) const { return (_type(obj)!=NULL; } /** Return the name of the attribute's library.*/ virtual const char* libraryName() const { return "osg"; } /** Return the name of the attribute's class type.*/ virtual const char* className() const { return "StateAttribute"; } /** Return the Type identifier of the attribute's class type.*/ virtual Type getType() const = 0; /** Return the member identifier within the attribute's class type. Used for light number/clip plane number etc.*/ virtual unsigned int getMember() const { return 0; } /** Return the TypeMemberPair that uniquely identifies this type member.*/ inline TypeMemberPair getTypeMemberPair() const { return TypeMemberPair(getType(),getMember()); } /** Return true if StateAttribute is a type which controls texturing and needs to be issued w.r.t to specific texture unit.*/ virtual bool isTextureAttribute() const { return false; } /** Return -1 if *this < *rhs, 0 if *this==*rhs, 1 if *this>*rhs.*/ virtual int compare(const StateAttribute& sa) const = 0; bool operator < (const StateAttribute& rhs) const { return compare(rhs)<0; } bool operator == (const StateAttribute& rhs) const { return compare(rhs)==0; } bool operator != (const StateAttribute& rhs) const { return compare(rhs)!=0; } struct ModeUsage { virtual void usesMode(GLMode mode) = 0; virtual void usesTextureMode(GLMode mode) = 0; }; /** Return the modes associated with this StateAttribute.*/ virtual bool getModeUsage(ModeUsage&) const { // default to no GLMode's associated with use of the StateAttribute. return false; } /** apply the OpenGL state attributes. * The global state for the current OpenGL context is passed * in to allow the StateAttribute to obtain details on the * the current context and state. */ virtual void apply(State&) const = 0; /** default to nothing to compile - all state is applied immediately. */ virtual void compileGLObjects(State&) const {} /** release OpenGL objects in specified graphics context if State object is passed, otherwise release OpenGL objexts for all graphics context if State object pointer NULL.*/ virtual void releaseGLObjects(State* =0) const {} protected: virtual ~StateAttribute() {} }; } #endif