123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404 |
- /* -*-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_STATEATTRIBUTE
- #define OSG_STATEATTRIBUTE 1
- #include <osg/Export>
- #include <osg/Object>
- #include <osg/Callback>
- #include <osg/Shader>
- #include <osg/GL>
- #include <typeinfo>
- #include <utility>
- #include <vector>
- // define for the GL_EXT_secondary_color extension, GL_COLOR_SUM is OpenGL
- // mode to be used to enable and disable the second color.
- #ifndef GL_COLOR_SUM
- #define GL_COLOR_SUM 0x8458
- #endif
- namespace osg {
- // forward declare NodeVisitor, State & StateSet
- class NodeVisitor;
- class State;
- class ShaderComposer;
- class StateSet;
- class Texture;
- /** 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<const name *>(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<const TYPE&>(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<rhs.parameter) return -1; \
- if (rhs.parameter<parameter) return 1;
- /** Base class for state attributes.
- */
- class OSG_EXPORT StateAttribute : public Object
- {
- public :
- /** GLMode is the value used in glEnable/glDisable(mode) */
- typedef GLenum GLMode;
- /** GLModeValue is used to specify whether a mode is enabled (ON) or disabled (OFF).
- * GLMoveValue is also used to specify the override behavior of modes from parent to children.
- * See enum Value description for more details.*/
- typedef unsigned int GLModeValue;
- /** Override is used to specify the override behavior of StateAttributes
- * from parent to children.
- * See enum Value description for more details.*/
- typedef unsigned int OverrideValue;
- /** list values which can be used to set either GLModeValues or OverrideValues.
- * When using in conjunction with GLModeValues, all Values have meaning.
- * When using in conjunction with StateAttribute OverrideValue only
- * OFF,OVERRIDE and INHERIT are meaningful.
- * However, they are useful when using GLModeValue
- * and OverrideValue in conjunction with each other as when using
- * StateSet::setAttributeAndModes(..).*/
- enum Values
- {
- /** means that associated GLMode and Override is disabled.*/
- OFF = 0x0,
- /** means that associated GLMode is enabled and Override is disabled.*/
- ON = 0x1,
- /** Overriding of GLMode's or StateAttributes is enabled, so that state below it is overridden.*/
- OVERRIDE = 0x2,
- /** Protecting of GLMode's or StateAttributes is enabled, so that state from above cannot override this and below state.*/
- PROTECTED = 0x4,
- /** means that GLMode or StateAttribute should be inherited from above.*/
- INHERIT = 0x8
- };
- /** Type identifier to differentiate between different state types. */
- // typedef unsigned int Type;
- /** Values of StateAttribute::Type used to aid identification
- * of different StateAttribute subclasses. Each subclass defines
- * its own value in the virtual Type getType() method. When
- * extending the osg's StateAttribute's simply define your
- * own Type value which is unique, using the StateAttribute::Type
- * enum as a guide of what values to use. If your new subclass
- * needs to override a standard StateAttribute then simply use
- * that type's value. */
- enum Type
- {
- TEXTURE,
- POLYGONMODE,
- POLYGONOFFSET,
- MATERIAL,
- ALPHAFUNC,
- ANTIALIAS,
- COLORTABLE,
- CULLFACE,
- FOG,
- FRONTFACE,
- LIGHT,
- POINT,
- LINEWIDTH,
- LINESTIPPLE,
- POLYGONSTIPPLE,
- SHADEMODEL,
- TEXENV,
- TEXENVFILTER,
- TEXGEN,
- TEXMAT,
- LIGHTMODEL,
- BLENDFUNC,
- BLENDEQUATION,
- LOGICOP,
- STENCIL,
- COLORMASK,
- DEPTH,
- VIEWPORT,
- SCISSOR,
- BLENDCOLOR,
- MULTISAMPLE,
- CLIPPLANE,
- COLORMATRIX,
- VERTEXPROGRAM,
- FRAGMENTPROGRAM,
- POINTSPRITE,
- PROGRAM,
- CLAMPCOLOR,
- HINT,
- SAMPLEMASKI,
- PRIMITIVERESTARTINDEX,
- CLIPCONTROL,
- /// osgFX namespace
- VALIDATOR,
- VIEWMATRIXEXTRACTOR,
- /// osgNV namespace
- OSGNV_PARAMETER_BLOCK,
- // osgNVExt namespace
- OSGNVEXT_TEXTURE_SHADER,
- OSGNVEXT_VERTEX_PROGRAM,
- OSGNVEXT_REGISTER_COMBINERS,
- /// osgNVCg namespace
- OSGNVCG_PROGRAM,
- // osgNVSlang namespace
- OSGNVSLANG_PROGRAM,
- // osgNVParse
- OSGNVPARSE_PROGRAM_PARSER,
- UNIFORMBUFFERBINDING,
- TRANSFORMFEEDBACKBUFFERBINDING,
- ATOMICCOUNTERBUFFERBINDING,
- PATCH_PARAMETER,
- FRAME_BUFFER_OBJECT,
- VERTEX_ATTRIB_DIVISOR,
- SHADERSTORAGEBUFFERBINDING,
- INDIRECTDRAWBUFFERBINDING,
- VIEWPORTINDEXED,
- DEPTHRANGEINDEXED,
- SCISSORINDEXED,
- BINDIMAGETEXTURE,
- SAMPLER,
- CAPABILITY = 100
- };
- /** Simple pairing between an attribute type and the member within that attribute type group.*/
- typedef std::pair<Type,unsigned int> TypeMemberPair;
- StateAttribute();
- StateAttribute(const StateAttribute& sa,const CopyOp& copyop=CopyOp::SHALLOW_COPY):
- Object(sa,copyop),
- _shaderComponent(sa._shaderComponent),
- _updateCallback(copyop(sa._updateCallback.get())),
- _eventCallback(copyop(sa._eventCallback.get()))
- {}
- /** Clone the type of an attribute, with Object* return type.
- Must be defined by derived classes.*/
- virtual Object* cloneType() const = 0;
- /** Clone an attribute, with Object* return type.
- Must be defined by derived classes.*/
- virtual Object* clone(const CopyOp&) const = 0;
- /** Return true if this and obj are of the same kind of object.*/
- virtual bool isSameKindAs(const Object* obj) const { return dynamic_cast<const StateAttribute*>(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"; }
- /** Convert 'this' into a StateAttribute pointer if Object is a StateAttribute, otherwise return 0.
- * Equivalent to dynamic_cast<StateAttribute*>(this).*/
- virtual StateAttribute* asStateAttribute() { return this; }
- /** convert 'const this' into a const StateAttribute pointer if Object is a StateAttribute, otherwise return 0.
- * Equivalent to dynamic_cast<const StateAttribute*>(this).*/
- virtual const StateAttribute* asStateAttribute() const { return this; }
- /** Fast alternative to dynamic_cast<> for determining if state attribute is a Texture.*/
- virtual Texture* asTexture() { return 0; }
- /** Fast alternative to dynamic_cast<> for determining if state attribute is a Texture.*/
- virtual const Texture* asTexture() const { return 0; }
- /** 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; }
- /** A vector of osg::StateSet pointers which is used to store the parent(s) of this StateAttribute.*/
- typedef std::vector<StateSet*> ParentList;
- /** Get the parent list of this StateAttribute. */
- inline const ParentList& getParents() const { return _parents; }
- inline StateSet* getParent(unsigned int i) { return _parents[i]; }
- /**
- * Get a single const parent of this StateAttribute.
- * @param i index of the parent to get.
- * @return the parent i.
- */
- inline const StateSet* getParent(unsigned int i) const { return _parents[i]; }
- /**
- * Get the number of parents of this StateAttribute.
- * @return the number of parents of this StateAttribute.
- */
- inline unsigned int getNumParents() const { return static_cast<unsigned int>(_parents.size()); }
- void setShaderComponent(ShaderComponent* sc) { _shaderComponent = sc; }
- ShaderComponent* getShaderComponent() { return _shaderComponent.get(); }
- const ShaderComponent* getShaderComponent() const { return _shaderComponent.get(); }
- struct ModeUsage
- {
- virtual ~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;
- }
- /** Check the modes associated with this StateAttribute are supported by current OpenGL drivers,
- * and if not set the associated mode in osg::State to be black listed/invalid.
- * Return true if all associated modes are valid.*/
- virtual bool checkValidityOfAssociatedModes(osg::State&) const
- {
- // default to no black listed GLMode's associated with use of the StateAttribute.
- return true;
- }
- // provide callback for backwards compatibility.
- typedef osg::StateAttributeCallback Callback;
- /** Set the UpdateCallback which allows users to attach customize the updating of an object during the update traversal.*/
- void setUpdateCallback(StateAttributeCallback* uc);
- /** Get the non const UpdateCallback.*/
- StateAttributeCallback* getUpdateCallback() { return _updateCallback.get(); }
- /** Get the const UpdateCallback.*/
- const StateAttributeCallback* getUpdateCallback() const { return _updateCallback.get(); }
- /** Set the EventCallback which allows users to attach customize the updating of an object during the Event traversal.*/
- void setEventCallback(StateAttributeCallback* ec);
- /** Get the non const EventCallback.*/
- StateAttributeCallback* getEventCallback() { return _eventCallback.get(); }
- /** Get the const EventCallback.*/
- const StateAttributeCallback* getEventCallback() const { return _eventCallback.get(); }
- /** apply the OpenGL state attributes.
- * The render info 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 {}
- /** Default to nothing to compile - all state is applied immediately. */
- virtual void compileGLObjects(State&) const {}
- /** Resize any per context GLObject buffers to specified size. */
- virtual void resizeGLObjectBuffers(unsigned int /*maxSize*/) {}
- /** Release OpenGL objects in specified graphics context if State
- object is passed, otherwise release OpenGL objects for all graphics context if
- State object pointer NULL.*/
- virtual void releaseGLObjects(State* =0) const {}
- protected:
- virtual ~StateAttribute() {}
- void addParent(osg::StateSet* object);
- void removeParent(osg::StateSet* object);
- ParentList _parents;
- friend class osg::StateSet;
- /** Helper class that make is easy to handle changes in a member value.*/
- struct ReassignToParents
- {
- /** Constructor caches and then removes attribute for all of it's parents.*/
- ReassignToParents(osg::StateAttribute* att);
- /** Destructor then reassigns the attribute to all of the parents.*/
- ~ReassignToParents();
- ref_ptr<StateAttribute> attribute;
- ParentList parents;
- };
- ref_ptr<ShaderComponent> _shaderComponent;
- ref_ptr<StateAttributeCallback> _updateCallback;
- ref_ptr<StateAttributeCallback> _eventCallback;
- };
- }
- #endif
|