You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
312 lines
14 KiB
312 lines
14 KiB
/* -*-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_FRAGMENTPROGRAM |
|
#define OSG_FRAGMENTPROGRAM 1 |
|
|
|
#include <osg/StateAttribute> |
|
#include <osg/Vec4> |
|
#include <osg/Matrix> |
|
#include <osg/buffered_value> |
|
|
|
#include <map> |
|
#include <string> |
|
|
|
// if not defined by gl.h use the definition found in: |
|
// http://oss.sgi.com/projects/ogl-sample/registry/ARB/fragment_program.txt |
|
#ifndef GL_ARB_fragment_program |
|
#define GL_FRAGMENT_PROGRAM_ARB 0x8804 |
|
#define GL_PROGRAM_FORMAT_ASCII_ARB 0x8875 |
|
#define GL_PROGRAM_LENGTH_ARB 0x8627 |
|
#define GL_PROGRAM_FORMAT_ARB 0x8876 |
|
#define GL_PROGRAM_BINDING_ARB 0x8677 |
|
#define GL_PROGRAM_INSTRUCTIONS_ARB 0x88A0 |
|
#define GL_MAX_PROGRAM_INSTRUCTIONS_ARB 0x88A1 |
|
#define GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A2 |
|
#define GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A3 |
|
#define GL_PROGRAM_TEMPORARIES_ARB 0x88A4 |
|
#define GL_MAX_PROGRAM_TEMPORARIES_ARB 0x88A5 |
|
#define GL_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A6 |
|
#define GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A7 |
|
#define GL_PROGRAM_PARAMETERS_ARB 0x88A8 |
|
#define GL_MAX_PROGRAM_PARAMETERS_ARB 0x88A9 |
|
#define GL_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AA |
|
#define GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AB |
|
#define GL_PROGRAM_ATTRIBS_ARB 0x88AC |
|
#define GL_MAX_PROGRAM_ATTRIBS_ARB 0x88AD |
|
#define GL_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AE |
|
#define GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AF |
|
#define GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB 0x88B4 |
|
#define GL_MAX_PROGRAM_ENV_PARAMETERS_ARB 0x88B5 |
|
#define GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB 0x88B6 |
|
#define GL_PROGRAM_ALU_INSTRUCTIONS_ARB 0x8805 |
|
#define GL_PROGRAM_TEX_INSTRUCTIONS_ARB 0x8806 |
|
#define GL_PROGRAM_TEX_INDIRECTIONS_ARB 0x8807 |
|
#define GL_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x8808 |
|
#define GL_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x8809 |
|
#define GL_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x880A |
|
#define GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB 0x880B |
|
#define GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB 0x880C |
|
#define GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB 0x880D |
|
#define GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x880E |
|
#define GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x880F |
|
#define GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x8810 |
|
#define GL_PROGRAM_STRING_ARB 0x8628 |
|
#define GL_PROGRAM_ERROR_POSITION_ARB 0x864B |
|
#define GL_CURRENT_MATRIX_ARB 0x8641 |
|
#define GL_TRANSPOSE_CURRENT_MATRIX_ARB 0x88B7 |
|
#define GL_CURRENT_MATRIX_STACK_DEPTH_ARB 0x8640 |
|
#define GL_MAX_PROGRAM_MATRICES_ARB 0x862F |
|
#define GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB 0x862E |
|
#define GL_MAX_TEXTURE_COORDS_ARB 0x8871 |
|
#define GL_MAX_TEXTURE_IMAGE_UNITS_ARB 0x8872 |
|
#define GL_PROGRAM_ERROR_STRING_ARB 0x8874 |
|
#define GL_MATRIX0_ARB 0x88C0 |
|
#define GL_MATRIX1_ARB 0x88C1 |
|
#define GL_MATRIX2_ARB 0x88C2 |
|
#define GL_MATRIX3_ARB 0x88C3 |
|
#define GL_MATRIX4_ARB 0x88C4 |
|
#define GL_MATRIX5_ARB 0x88C5 |
|
#define GL_MATRIX6_ARB 0x88C6 |
|
#define GL_MATRIX7_ARB 0x88C7 |
|
#define GL_MATRIX8_ARB 0x88C8 |
|
#define GL_MATRIX9_ARB 0x88C9 |
|
#define GL_MATRIX10_ARB 0x88CA |
|
#define GL_MATRIX11_ARB 0x88CB |
|
#define GL_MATRIX12_ARB 0x88CC |
|
#define GL_MATRIX13_ARB 0x88CD |
|
#define GL_MATRIX14_ARB 0x88CE |
|
#define GL_MATRIX15_ARB 0x88CF |
|
#define GL_MATRIX16_ARB 0x88D0 |
|
#define GL_MATRIX17_ARB 0x88D1 |
|
#define GL_MATRIX18_ARB 0x88D2 |
|
#define GL_MATRIX19_ARB 0x88D3 |
|
#define GL_MATRIX20_ARB 0x88D4 |
|
#define GL_MATRIX21_ARB 0x88D5 |
|
#define GL_MATRIX22_ARB 0x88D6 |
|
#define GL_MATRIX23_ARB 0x88D7 |
|
#define GL_MATRIX24_ARB 0x88D8 |
|
#define GL_MATRIX25_ARB 0x88D9 |
|
#define GL_MATRIX26_ARB 0x88DA |
|
#define GL_MATRIX27_ARB 0x88DB |
|
#define GL_MATRIX28_ARB 0x88DC |
|
#define GL_MATRIX29_ARB 0x88DD |
|
#define GL_MATRIX30_ARB 0x88DE |
|
#define GL_MATRIX31_ARB 0x88DF |
|
|
|
#endif |
|
|
|
|
|
namespace osg { |
|
|
|
|
|
|
|
/** FragmentProgram - encapsulates the OpenGL ARB fragment program state.*/ |
|
class OSG_EXPORT FragmentProgram : public StateAttribute |
|
{ |
|
public: |
|
|
|
FragmentProgram(); |
|
|
|
/** Copy constructor using CopyOp to manage deep vs shallow copy.*/ |
|
FragmentProgram(const FragmentProgram& vp,const CopyOp& copyop=CopyOp::SHALLOW_COPY); |
|
|
|
META_StateAttribute(osg, FragmentProgram, FRAGMENTPROGRAM); |
|
|
|
/** return -1 if *this < *rhs, 0 if *this==*rhs, 1 if *this>*rhs.*/ |
|
virtual int compare(const osg::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(FragmentProgram,sa) |
|
|
|
// compare each parameter in turn against the rhs. |
|
COMPARE_StateAttribute_Parameter(_fragmentProgram) |
|
|
|
return 0; // passed all the above comparison macros, must be equal. |
|
} |
|
|
|
virtual bool getModeUsage(StateAttribute::ModeUsage& usage) const |
|
{ |
|
usage.usesMode(GL_FRAGMENT_PROGRAM_ARB); |
|
return true; |
|
} |
|
|
|
// data access methods. |
|
|
|
/** Get the handle to the fragment program id for the current context.*/ |
|
inline GLuint& getFragmentProgramID(unsigned int contextID) const |
|
{ |
|
return _fragmentProgramIDList[contextID]; |
|
} |
|
|
|
|
|
/** Set the fragment program using a C style string.*/ |
|
inline void setFragmentProgram( const char* program ) |
|
{ |
|
_fragmentProgram = program; |
|
dirtyFragmentProgramObject(); |
|
} |
|
|
|
/** Set the fragment program using C++ style string.*/ |
|
inline void setFragmentProgram( const std::string& program ) |
|
{ |
|
_fragmentProgram = program; |
|
dirtyFragmentProgramObject(); |
|
} |
|
|
|
/** Get the fragment program.*/ |
|
inline const std::string& getFragmentProgram() const { return _fragmentProgram; } |
|
|
|
/** Set Program Parameters */ |
|
inline void setProgramLocalParameter(const GLuint index, const Vec4& p) |
|
{ |
|
_programLocalParameters[index] = p; |
|
} |
|
|
|
typedef std::map<GLuint,Vec4> LocalParamList; |
|
|
|
/** Set list of Program Parameters */ |
|
inline void setLocalParameters(const LocalParamList& lpl) { _programLocalParameters = lpl; } |
|
|
|
/** Get list of Program Parameters */ |
|
inline LocalParamList& getLocalParameters() { return _programLocalParameters; } |
|
|
|
/** Get const list of Program Parameters */ |
|
inline const LocalParamList& getLocalParameters() const { return _programLocalParameters; } |
|
|
|
/** Matrix */ |
|
inline void setMatrix(const GLenum mode, const Matrix& matrix) |
|
{ |
|
_matrixList[mode] = matrix; |
|
} |
|
|
|
typedef std::map<GLenum,Matrix> MatrixList; |
|
|
|
/** Set list of Matrices */ |
|
inline void setMatrices(const MatrixList& matrices) { _matrixList = matrices; } |
|
|
|
/** Get list of Matrices */ |
|
inline MatrixList& getMatrices() { return _matrixList; } |
|
|
|
/** Get list of Matrices */ |
|
inline const MatrixList& getMatrices() const { return _matrixList; } |
|
|
|
|
|
/** Force a recompile on next apply() of associated OpenGL vertex program objects.*/ |
|
void dirtyFragmentProgramObject(); |
|
|
|
/** use deleteFragmentProgramObject instead of glDeletePrograms to allow |
|
* OpenGL Fragment Program objects to be cached until they can be deleted |
|
* by the OpenGL context in which they were created, specified |
|
* by contextID.*/ |
|
static void deleteFragmentProgramObject(unsigned int contextID,GLuint handle); |
|
|
|
/** flush all the cached fragment programs which need to be deleted |
|
* in the OpenGL context related to contextID.*/ |
|
static void flushDeletedFragmentProgramObjects(unsigned int contextID,double currentTime, double& availableTime); |
|
|
|
/** discard all the cached fragment programs which need to be deleted |
|
* in the OpenGL context related to contextID. |
|
* Note, unlike flush no OpenGL calls are made, instead the handles are all removed. |
|
* this call is useful for when an OpenGL context has been destroyed. */ |
|
static void discardDeletedFragmentProgramObjects(unsigned int contextID); |
|
|
|
virtual void apply(State& state) const; |
|
|
|
virtual void compileGLObjects(State& state) const { apply(state); } |
|
|
|
/** Resize any per context GLObject buffers to specified size. */ |
|
virtual void resizeGLObjectBuffers(unsigned int maxSize); |
|
|
|
/** release an 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* state=0) const; |
|
|
|
/** Extensions class which encapsulates the querying of extensions and |
|
* associated function pointers, and provide convenience wrappers to |
|
* check for the extensions or use the associated 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 setFragmentProgramSupported(bool flag) { _isFragmentProgramSupported=flag; } |
|
bool isFragmentProgramSupported() const { return _isFragmentProgramSupported; } |
|
|
|
void glBindProgram(GLenum target, GLuint id) const; |
|
void glGenPrograms(GLsizei n, GLuint *programs) const; |
|
void glDeletePrograms(GLsizei n, GLuint *programs) const; |
|
void glProgramString(GLenum target, GLenum format, GLsizei len, const void *string) const; |
|
void glProgramLocalParameter4fv(GLenum target, GLuint index, const GLfloat *params) const; |
|
|
|
protected: |
|
|
|
~Extensions() {} |
|
|
|
bool _isFragmentProgramSupported; |
|
|
|
typedef void (GL_APIENTRY * BindProgramProc) (GLenum target, GLuint id); |
|
typedef void (GL_APIENTRY * GenProgramsProc) (GLsizei n, GLuint *programs); |
|
typedef void (GL_APIENTRY * DeleteProgramsProc) (GLsizei n, GLuint *programs); |
|
typedef void (GL_APIENTRY * ProgramStringProc) (GLenum target, GLenum format, GLsizei len, const void *string); |
|
typedef void (GL_APIENTRY * ProgramLocalParameter4fvProc) (GLenum target, GLuint index, const GLfloat *params); |
|
|
|
BindProgramProc _glBindProgram; |
|
GenProgramsProc _glGenPrograms; |
|
DeleteProgramsProc _glDeletePrograms; |
|
ProgramStringProc _glProgramString; |
|
ProgramLocalParameter4fvProc _glProgramLocalParameter4fv; |
|
}; |
|
|
|
/** Function to call to get the extension of a specified context. |
|
* If the Extension object for that context has not yet been created and the |
|
* 'createIfNotInitalized' flag has been set to false then returns NULL. |
|
* If 'createIfNotInitalized' is true then the Extensions object is |
|
* automatically created. However, in this case the extension object will |
|
* only be created with the graphics context associated with ContextID..*/ |
|
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 ~FragmentProgram(); |
|
|
|
typedef buffered_value<GLuint> FragmentProgramIDList; |
|
mutable FragmentProgramIDList _fragmentProgramIDList; |
|
|
|
std::string _fragmentProgram; |
|
|
|
LocalParamList _programLocalParameters; |
|
MatrixList _matrixList; |
|
}; |
|
|
|
|
|
|
|
} |
|
|
|
#endif |
|
|
|
|