Introduced new osg::PatchParameter StateAttribute class to wrap up glPatchParameter associated state.

Note, osg::Program::setParameter(GL_PATCH_VERTICES,num); is nolonger support and should be replaced by using the new PatchParameter class.
This commit is contained in:
Robert Osfield
2013-06-11 10:52:37 +00:00
parent 4623c251bb
commit 1a7f2fcb3e
8 changed files with 155 additions and 58 deletions

View File

@@ -117,6 +117,7 @@ SET(TARGET_H
${HEADER_PATH}/OccluderNode
${HEADER_PATH}/OcclusionQueryNode
${HEADER_PATH}/OperationThread
${HEADER_PATH}/PatchParameter
${HEADER_PATH}/PagedLOD
${HEADER_PATH}/Plane
${HEADER_PATH}/Point
@@ -301,6 +302,7 @@ SET(TARGET_SRC
OccluderNode.cpp
OcclusionQueryNode.cpp
OperationThread.cpp
PatchParameter.cpp
PagedLOD.cpp
Point.cpp
PointSprite.cpp

View File

@@ -0,0 +1,42 @@
/* -*-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.
*/
#include <osg/PatchParameter>
#include <osg/State>
#include <osg/Notify>
#include <osg/io_utils>
using namespace osg;
PatchParameter::PatchParameter(GLint vertices):
_vertices(vertices),
_patchDefaultInnerLevel(1.0f,1.0f),
_patchDefaultOuterLevel(1.0f,1.0f,1.0f,1.0f)
{
}
PatchParameter::~PatchParameter()
{
}
void PatchParameter::apply(State& state) const
{
GL2Extensions* extensions = GL2Extensions::Get( state.getContextID(), true );
if (extensions->areTessellationShadersSupported() )
{
extensions->glPatchParameteri( GL_PATCH_VERTICES, _vertices );
extensions->glPatchParameterfv( GL_PATCH_DEFAULT_INNER_LEVEL, _patchDefaultInnerLevel.ptr() );
extensions->glPatchParameterfv( GL_PATCH_DEFAULT_OUTER_LEVEL, _patchDefaultOuterLevel.ptr() );
}
}

View File

@@ -137,7 +137,6 @@ void Program::ProgramBinary::assign(unsigned int size, const unsigned char* data
Program::Program() :
_geometryVerticesOut(1), _geometryInputType(GL_TRIANGLES),
_geometryOutputType(GL_TRIANGLE_STRIP),
_patchVertices(3),
_numGroupsX(0), _numGroupsY(0), _numGroupsZ(0)
{
}
@@ -167,8 +166,6 @@ Program::Program(const Program& rhs, const osg::CopyOp& copyop):
_geometryInputType = rhs._geometryInputType;
_geometryOutputType = rhs._geometryOutputType;
_patchVertices = rhs._patchVertices;
_numGroupsX = rhs._numGroupsX;
_numGroupsY = rhs._numGroupsY;
_numGroupsZ = rhs._numGroupsZ;
@@ -206,9 +203,6 @@ int Program::compare(const osg::StateAttribute& sa) const
if( _geometryOutputType < rhs._geometryOutputType ) return -1;
if( rhs._geometryOutputType < _geometryOutputType ) return 1;
if( _patchVertices < rhs._patchVertices ) return -1;
if( rhs._patchVertices < _patchVertices ) return 1;
if( _numGroupsX < rhs._numGroupsX ) return -1;
if( rhs._numGroupsX < _numGroupsX ) return 1;
@@ -360,44 +354,14 @@ void Program::setParameter( GLenum pname, GLint value )
//dirtyProgram(); // needed?
break;
case GL_PATCH_VERTICES:
_patchVertices = value;
dirtyProgram();
OSG_WARN << "Program::setParameter invalid param " << GL_PATCH_VERTICES << ", use osg::PatchParameter when setting GL_PATCH_VERTICES."<<std::endl;
break;
default:
OSG_WARN << "setParameter invalid param " << pname << std::endl;
OSG_WARN << "Program::setParameter invalid param " << pname << std::endl;
break;
}
}
void Program::setParameterfv( GLenum pname, const GLfloat* /*value*/ )
{
switch( pname )
{
// todo tessellation default level
case GL_PATCH_DEFAULT_INNER_LEVEL:
break;
case GL_PATCH_DEFAULT_OUTER_LEVEL:
break;
default:
OSG_WARN << "setParameter invalid param " << pname << std::endl;
break;
}
}
const GLfloat* Program::getParameterfv( GLenum pname ) const
{
/*switch( pname )
{
;
// todo tessellation default level
// case GL_PATCH_DEFAULT_INNER_LEVEL: return _patchDefaultInnerLevel;
// case GL_PATCH_DEFAULT_OUTER_LEVEL: return _patchDefaultOuterLevel;
}*/
OSG_WARN << "getParameter invalid param " << pname << std::endl;
return 0;
}
GLint Program::getParameter( GLenum pname ) const
{
switch( pname )
@@ -405,7 +369,6 @@ GLint Program::getParameter( GLenum pname ) const
case GL_GEOMETRY_VERTICES_OUT_EXT: return _geometryVerticesOut;
case GL_GEOMETRY_INPUT_TYPE_EXT: return _geometryInputType;
case GL_GEOMETRY_OUTPUT_TYPE_EXT: return _geometryOutputType;
case GL_PATCH_VERTICES: return _patchVertices;
}
OSG_WARN << "getParameter invalid param " << pname << std::endl;
return 0;
@@ -604,13 +567,7 @@ void Program::PerContextProgram::linkProgram(osg::State& state)
_extensions->glProgramParameteri( _glProgramHandle, GL_GEOMETRY_INPUT_TYPE_EXT, _program->_geometryInputType );
_extensions->glProgramParameteri( _glProgramHandle, GL_GEOMETRY_OUTPUT_TYPE_EXT, _program->_geometryOutputType );
}
if (_extensions->areTessellationShadersSupported() )
{
_extensions->glPatchParameteri( GL_PATCH_VERTICES, _program->_patchVertices );
// todo: add default tessellation level
}
// Detach removed shaders
for( unsigned int i=0; i < _shadersToDetach.size(); ++i )
{

View File

@@ -0,0 +1,14 @@
#include <osg/PatchParameter>
#include <osgDB/ObjectWrapper>
#include <osgDB/InputStream>
#include <osgDB/OutputStream>
REGISTER_OBJECT_WRAPPER( PatchParameter,
new osg::PatchParameter,
osg::PatchParameter,
"osg::Object osg::StateAttribute osg::PatchParameter" )
{
ADD_INT_SERIALIZER( Vertices, 3);
ADD_VEC2_SERIALIZER( PatchDefaultInnerLevel, osg::Vec2(1.0f,1.0f));
ADD_VEC4_SERIALIZER( PatchDefaultOuterLevel, osg::Vec4(1.0f,1.0f,1.0f,1.0f));
}