Added beginnings of shader composition with the shells of the ShaderComposer and ShaderAttribute classes. This aren't
functional yet, but a useful placeholders for future fucntionality.
This commit is contained in:
parent
83ea076d8b
commit
5cac233764
82
include/osg/ShaderAttribute
Normal file
82
include/osg/ShaderAttribute
Normal file
@ -0,0 +1,82 @@
|
|||||||
|
/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2004 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_SHADERATTRIBUTE
|
||||||
|
#define OSG_SHADERATTRIBUTE 1
|
||||||
|
|
||||||
|
#include <osg/StateAttribute>
|
||||||
|
#include <osg/Shader>
|
||||||
|
#include <osg/Uniform>
|
||||||
|
|
||||||
|
namespace osg {
|
||||||
|
|
||||||
|
class OSG_EXPORT ShaderAttribute : public StateAttribute
|
||||||
|
{
|
||||||
|
public :
|
||||||
|
|
||||||
|
ShaderAttribute();
|
||||||
|
|
||||||
|
/** Copy constructor using CopyOp to manage deep vs shallow copy. */
|
||||||
|
ShaderAttribute(const ShaderAttribute& sa,const CopyOp& copyop=CopyOp::SHALLOW_COPY);
|
||||||
|
|
||||||
|
META_Object(osg, ShaderAttribute);
|
||||||
|
|
||||||
|
/** return -1 if *this < *rhs, 0 if *this==*rhs, 1 if *this>*rhs. */
|
||||||
|
virtual int compare(const StateAttribute& sa) const;
|
||||||
|
|
||||||
|
|
||||||
|
void setType(Type type);
|
||||||
|
virtual Type getType() const { return _type; }
|
||||||
|
|
||||||
|
unsigned int addShader(Shader* shader);
|
||||||
|
void removeShader(unsigned int i);
|
||||||
|
unsigned int getNumShaders() const { return _shaders.size(); }
|
||||||
|
Shader* getShader(unsigned int i) { return _shaders[i].get(); }
|
||||||
|
Shader* getShader(unsigned int i) const { return _shaders[i].get(); }
|
||||||
|
|
||||||
|
|
||||||
|
unsigned int addUniform(Uniform* uniform);
|
||||||
|
void removeUniform(unsigned int i);
|
||||||
|
unsigned int getNumUniforms() const { return _uniforms.size(); }
|
||||||
|
Uniform* getUniform(unsigned int i) { return _uniforms[i].get(); }
|
||||||
|
const Uniform* getUniform(unsigned int i) const { return _uniforms[i].get(); }
|
||||||
|
|
||||||
|
|
||||||
|
virtual bool getModeUsage(StateAttribute::ModeUsage& usage) const;
|
||||||
|
|
||||||
|
virtual void apply(State& state) const;
|
||||||
|
|
||||||
|
virtual void compose(ShaderComposer& composer) const;
|
||||||
|
|
||||||
|
virtual void compileGLObjects(State& state) const;
|
||||||
|
|
||||||
|
virtual void resizeGLObjectBuffers(unsigned int maxSize);
|
||||||
|
|
||||||
|
virtual void releaseGLObjects(State* state=0) const;
|
||||||
|
|
||||||
|
protected :
|
||||||
|
|
||||||
|
virtual ~ShaderAttribute();
|
||||||
|
|
||||||
|
typedef std::vector< osg::ref_ptr<osg::Shader> > Shaders;
|
||||||
|
typedef std::vector< osg::ref_ptr<osg::Uniform> > Uniforms;
|
||||||
|
|
||||||
|
Type _type;
|
||||||
|
Shaders _shaders;
|
||||||
|
Uniforms _uniforms;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
43
include/osg/ShaderComposer
Normal file
43
include/osg/ShaderComposer
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
/* -*-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_SHADERCOMPOSER
|
||||||
|
#define OSG_SHADERCOMPOSER 1
|
||||||
|
|
||||||
|
#include <osg/Object>
|
||||||
|
#include <osg/StateAttribute>
|
||||||
|
#include <osg/Program>
|
||||||
|
|
||||||
|
namespace osg {
|
||||||
|
|
||||||
|
// forward declare osg::State
|
||||||
|
class State;
|
||||||
|
|
||||||
|
class OSG_EXPORT ShaderComposer : public osg::Object
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
ShaderComposer();
|
||||||
|
ShaderComposer(const ShaderComposer& sa,const CopyOp& copyop=CopyOp::SHALLOW_COPY);
|
||||||
|
META_Object(osg, ShaderComposer)
|
||||||
|
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
virtual ~ShaderComposer();
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
@ -21,6 +21,7 @@
|
|||||||
#include <osg/BufferObject>
|
#include <osg/BufferObject>
|
||||||
#include <osg/Observer>
|
#include <osg/Observer>
|
||||||
|
|
||||||
|
#include <osg/ShaderComposer>
|
||||||
#include <osg/FrameStamp>
|
#include <osg/FrameStamp>
|
||||||
#include <osg/DisplaySettings>
|
#include <osg/DisplaySettings>
|
||||||
#include <osg/Polytope>
|
#include <osg/Polytope>
|
||||||
@ -140,6 +141,17 @@ class OSG_EXPORT State : public Referenced, public Observer
|
|||||||
/** Get the current OpenGL context unique ID.*/
|
/** Get the current OpenGL context unique ID.*/
|
||||||
inline unsigned int getContextID() const { return _contextID; }
|
inline unsigned int getContextID() const { return _contextID; }
|
||||||
|
|
||||||
|
|
||||||
|
/** Set the ShaderComposor object that implements shader composition.*/
|
||||||
|
void setShaderComposer(ShaderComposer* sc) { _shaderComposer = sc; }
|
||||||
|
|
||||||
|
/** Get the ShaderComposor object.*/
|
||||||
|
ShaderComposer* getShaderComposer() { return _shaderComposer.get(); }
|
||||||
|
|
||||||
|
/** Get the const ShaderComposor object.*/
|
||||||
|
const ShaderComposer* getShaderComposer() const { return _shaderComposer.get(); }
|
||||||
|
|
||||||
|
|
||||||
/** Push stateset onto state stack.*/
|
/** Push stateset onto state stack.*/
|
||||||
void pushStateSet(const StateSet* dstate);
|
void pushStateSet(const StateSet* dstate);
|
||||||
|
|
||||||
@ -1339,6 +1351,8 @@ class OSG_EXPORT State : public Referenced, public Observer
|
|||||||
|
|
||||||
GraphicsContext* _graphicsContext;
|
GraphicsContext* _graphicsContext;
|
||||||
unsigned int _contextID;
|
unsigned int _contextID;
|
||||||
|
osg::ref_ptr<ShaderComposer> _shaderComposer;
|
||||||
|
|
||||||
ref_ptr<FrameStamp> _frameStamp;
|
ref_ptr<FrameStamp> _frameStamp;
|
||||||
|
|
||||||
ref_ptr<const RefMatrix> _identity;
|
ref_ptr<const RefMatrix> _identity;
|
||||||
|
@ -35,6 +35,7 @@ namespace osg {
|
|||||||
// forward declare NodeVisitor, State & StateSet
|
// forward declare NodeVisitor, State & StateSet
|
||||||
class NodeVisitor;
|
class NodeVisitor;
|
||||||
class State;
|
class State;
|
||||||
|
class ShaderComposer;
|
||||||
class StateSet;
|
class StateSet;
|
||||||
class Texture;
|
class Texture;
|
||||||
|
|
||||||
@ -315,6 +316,9 @@ class OSG_EXPORT StateAttribute : public Object
|
|||||||
*/
|
*/
|
||||||
virtual void apply(State&) const {}
|
virtual void apply(State&) const {}
|
||||||
|
|
||||||
|
/* compose associated shaders via the ShaderComposer. */
|
||||||
|
virtual void compose(ShaderComposer& composer) const {}
|
||||||
|
|
||||||
/** Default to nothing to compile - all state is applied immediately. */
|
/** Default to nothing to compile - all state is applied immediately. */
|
||||||
virtual void compileGLObjects(State&) const {}
|
virtual void compileGLObjects(State&) const {}
|
||||||
|
|
||||||
|
@ -137,6 +137,8 @@ SET(LIB_PUBLIC_HEADERS
|
|||||||
${HEADER_PATH}/Sequence
|
${HEADER_PATH}/Sequence
|
||||||
${HEADER_PATH}/ShadeModel
|
${HEADER_PATH}/ShadeModel
|
||||||
${HEADER_PATH}/Shader
|
${HEADER_PATH}/Shader
|
||||||
|
${HEADER_PATH}/ShaderAttribute
|
||||||
|
${HEADER_PATH}/ShaderComposer
|
||||||
${HEADER_PATH}/ShadowVolumeOccluder
|
${HEADER_PATH}/ShadowVolumeOccluder
|
||||||
${HEADER_PATH}/Shape
|
${HEADER_PATH}/Shape
|
||||||
${HEADER_PATH}/ShapeDrawable
|
${HEADER_PATH}/ShapeDrawable
|
||||||
@ -301,6 +303,8 @@ ADD_LIBRARY(${LIB_NAME}
|
|||||||
Sequence.cpp
|
Sequence.cpp
|
||||||
ShadeModel.cpp
|
ShadeModel.cpp
|
||||||
Shader.cpp
|
Shader.cpp
|
||||||
|
ShaderAttribute.cpp
|
||||||
|
ShaderComposer.cpp
|
||||||
ShadowVolumeOccluder.cpp
|
ShadowVolumeOccluder.cpp
|
||||||
Shape.cpp
|
Shape.cpp
|
||||||
ShapeDrawable.cpp
|
ShapeDrawable.cpp
|
||||||
|
118
src/osg/ShaderAttribute.cpp
Normal file
118
src/osg/ShaderAttribute.cpp
Normal file
@ -0,0 +1,118 @@
|
|||||||
|
/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2004 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <osg/ShaderAttribute>
|
||||||
|
#include <osg/Notify>
|
||||||
|
|
||||||
|
using namespace osg;
|
||||||
|
|
||||||
|
|
||||||
|
ShaderAttribute::ShaderAttribute()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
ShaderAttribute::ShaderAttribute(const ShaderAttribute& sa,const CopyOp& copyop):
|
||||||
|
StateAttribute(sa,copyop),
|
||||||
|
_type(sa._type)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
ShaderAttribute::~ShaderAttribute()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
int ShaderAttribute::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(ShaderAttribute,sa)
|
||||||
|
|
||||||
|
// check if types are same
|
||||||
|
if (_type < rhs._type) return -1;
|
||||||
|
if (_type > rhs._type) return 1;
|
||||||
|
|
||||||
|
// all properties are the equal so return 0.
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ShaderAttribute::setType(Type type)
|
||||||
|
{
|
||||||
|
_type = type;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned int ShaderAttribute::addShader(Shader* shader)
|
||||||
|
{
|
||||||
|
// check to see if shader already add, if so return the index of it
|
||||||
|
for(unsigned int i=0; i<_shaders.size(); ++i)
|
||||||
|
{
|
||||||
|
if (_shaders[i] == shader) return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
// add shader and return it's position
|
||||||
|
_shaders.push_back(shader);
|
||||||
|
return _shaders.size()-1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ShaderAttribute::removeShader(unsigned int i)
|
||||||
|
{
|
||||||
|
_shaders.erase(_shaders.begin()+i);
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned int ShaderAttribute::addUniform(Uniform* uniform)
|
||||||
|
{
|
||||||
|
// check to see if uniform already add, if so return the index of it
|
||||||
|
for(unsigned int i=0; i<_uniforms.size(); ++i)
|
||||||
|
{
|
||||||
|
if (_uniforms[i] == uniform) return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
// add uniform and return it's position
|
||||||
|
_uniforms.push_back(uniform);
|
||||||
|
return _uniforms.size()-1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ShaderAttribute::removeUniform(unsigned int i)
|
||||||
|
{
|
||||||
|
_uniforms.erase(_uniforms.begin()+i);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ShaderAttribute::getModeUsage(StateAttribute::ModeUsage& usage) const
|
||||||
|
{
|
||||||
|
OSG_NOTICE<<"ShaderAttribute::getModeUsage(..)"<<std::endl;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ShaderAttribute::apply(State& state) const
|
||||||
|
{
|
||||||
|
OSG_NOTICE<<"ShaderAttribute::apply(..)"<<std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ShaderAttribute::compose(ShaderComposer& composer) const
|
||||||
|
{
|
||||||
|
OSG_NOTICE<<"ShaderAttribute::compose(..)"<<std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ShaderAttribute::compileGLObjects(State&) const
|
||||||
|
{
|
||||||
|
OSG_NOTICE<<"ShaderAttribute::compileGLObjects(..)"<<std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ShaderAttribute::resizeGLObjectBuffers(unsigned int maxSize)
|
||||||
|
{
|
||||||
|
OSG_NOTICE<<"ShaderAttribute::resizeGLObjectBuffers(..)"<<std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ShaderAttribute::releaseGLObjects(State* state) const
|
||||||
|
{
|
||||||
|
OSG_NOTICE<<"ShaderAttribute::releaseGLObjects(..)"<<std::endl;
|
||||||
|
}
|
@ -41,6 +41,9 @@ State::State():
|
|||||||
{
|
{
|
||||||
_graphicsContext = 0;
|
_graphicsContext = 0;
|
||||||
_contextID = 0;
|
_contextID = 0;
|
||||||
|
|
||||||
|
_shaderComposer = new ShaderComposer;
|
||||||
|
|
||||||
_identity = new osg::RefMatrix(); // default RefMatrix constructs to identity.
|
_identity = new osg::RefMatrix(); // default RefMatrix constructs to identity.
|
||||||
_initialViewMatrix = _identity;
|
_initialViewMatrix = _identity;
|
||||||
_projection = _identity;
|
_projection = _identity;
|
||||||
|
Loading…
Reference in New Issue
Block a user