From b4cd40cf7c37e20bb6fac7327785b10680424ce4 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Tue, 30 Jun 2015 09:11:00 +0000 Subject: [PATCH] From Mathias Froehlich, "Attached a new state attribute implementing the glClipControl that appeared with GL4.5." git-svn-id: http://svn.openscenegraph.org/osg/OpenSceneGraph/trunk@14928 16af8721-9629-0410-8352-f15c8da7e697 --- include/osg/ClipControl | 85 ++++++++++++++++++++++++++++++++++++++ include/osg/GLExtensions | 2 + include/osg/StateAttribute | 1 + src/osg/CMakeLists.txt | 2 + src/osg/ClipControl.cpp | 44 ++++++++++++++++++++ src/osg/GLExtensions.cpp | 5 +++ 6 files changed, 139 insertions(+) create mode 100644 include/osg/ClipControl create mode 100644 src/osg/ClipControl.cpp diff --git a/include/osg/ClipControl b/include/osg/ClipControl new file mode 100644 index 000000000..5d7eb485a --- /dev/null +++ b/include/osg/ClipControl @@ -0,0 +1,85 @@ +/* -*-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_CLIPCONTROL +#define OSG_CLIPCONTROL 1 + +#include + +#ifndef GL_VERSION_4_5 + #define GL_NEGATIVE_ONE_TO_ONE 0x935E + #define GL_ZERO_TO_ONE 0x935F +#endif + +namespace osg { + +/** Encapsulate OpenGL glClipControl functions. +*/ +class OSG_EXPORT ClipControl : public StateAttribute +{ + public : + + enum Origin + { + LOWER_LEFT = GL_LOWER_LEFT, + UPPER_LEFT = GL_UPPER_LEFT + }; + + enum DepthMode + { + NEGATIVE_ONE_TO_ONE = GL_NEGATIVE_ONE_TO_ONE, + ZERO_TO_ONE = GL_ZERO_TO_ONE + }; + + + ClipControl(Origin origin=LOWER_LEFT, DepthMode depthMode=NEGATIVE_ONE_TO_ONE); + + /** Copy constructor using CopyOp to manage deep vs shallow copy.*/ + ClipControl(const ClipControl& clipControl,const CopyOp& copyop=CopyOp::SHALLOW_COPY); + + + META_StateAttribute(osg, ClipControl, CLIPCONTROL); + + /** return -1 if *this < *rhs, 0 if *this==*rhs, 1 if *this>*rhs.*/ + virtual int 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(ClipControl,sa) + + // compare each parameter in turn against the rhs. + COMPARE_StateAttribute_Parameter(_origin) + COMPARE_StateAttribute_Parameter(_depthMode) + + return 0; // passed all the above comparison macros, must be equal. + } + + void setOrigin(Origin origin) { _origin = origin; } + Origin getOrigin() const { return _origin; } + + void setDepthMode(DepthMode depthMode) { _depthMode = depthMode; } + DepthMode getDepthMode() const { return _depthMode; } + + virtual void apply(State& state) const; + + protected: + + virtual ~ClipControl(); + + Origin _origin; + DepthMode _depthMode; +}; + +} + +#endif diff --git a/include/osg/GLExtensions b/include/osg/GLExtensions index ff0bb3ba8..31b8c7b34 100644 --- a/include/osg/GLExtensions +++ b/include/osg/GLExtensions @@ -167,6 +167,7 @@ class OSG_EXPORT GLExtensions : public osg::Referenced bool isShaderAtomicCountersSupported; bool isRectangleSupported; bool isCubeMapSupported; + bool isClipControlSupported; void (GL_APIENTRY * glDrawBuffers)(GLsizei n, const GLenum *bufs); void (GL_APIENTRY * glAttachShader)(GLuint program, GLuint shader); @@ -267,6 +268,7 @@ class OSG_EXPORT GLExtensions : public osg::Referenced void (GL_APIENTRY * glUniformMatrix4x2fv)( GLint location, GLsizei count, GLboolean transpose, const GLfloat* value ); void (GL_APIENTRY * glUniformMatrix3x4fv)( GLint location, GLsizei count, GLboolean transpose, const GLfloat* value ); void (GL_APIENTRY * glUniformMatrix4x3fv)( GLint location, GLsizei count, GLboolean transpose, const GLfloat* value ); + void (GL_APIENTRY * glClipControl)( GLenum origin, GLenum depthMode ); void (GL_APIENTRY * glProgramParameteri)( GLuint program, GLenum pname, GLint value ); void (GL_APIENTRY * glPatchParameteri)( GLenum pname, GLint value ); void (GL_APIENTRY * glPatchParameterfv)( GLenum pname, const GLfloat* values ); diff --git a/include/osg/StateAttribute b/include/osg/StateAttribute index da01efa15..ff325f321 100644 --- a/include/osg/StateAttribute +++ b/include/osg/StateAttribute @@ -166,6 +166,7 @@ class OSG_EXPORT StateAttribute : public Object HINT, SAMPLEMASKI, PRIMITIVERESTARTINDEX, + CLIPCONTROL, /// osgFX namespace VALIDATOR, diff --git a/src/osg/CMakeLists.txt b/src/osg/CMakeLists.txt index 34958569d..627f6edba 100644 --- a/src/osg/CMakeLists.txt +++ b/src/osg/CMakeLists.txt @@ -46,6 +46,7 @@ SET(TARGET_H ${HEADER_PATH}/Capability ${HEADER_PATH}/ClampColor ${HEADER_PATH}/ClearNode + ${HEADER_PATH}/ClipControl ${HEADER_PATH}/ClipNode ${HEADER_PATH}/ClipPlane ${HEADER_PATH}/ClusterCullingCallback @@ -246,6 +247,7 @@ SET(TARGET_SRC CameraView.cpp ClampColor.cpp ClearNode.cpp + ClipControl.cpp ClipNode.cpp ClipPlane.cpp ClusterCullingCallback.cpp diff --git a/src/osg/ClipControl.cpp b/src/osg/ClipControl.cpp new file mode 100644 index 000000000..645a0280c --- /dev/null +++ b/src/osg/ClipControl.cpp @@ -0,0 +1,44 @@ +/* -*-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 + +#include +#include + +using namespace osg; + +ClipControl::ClipControl(Origin origin, DepthMode depthMode): + _origin(origin), + _depthMode(depthMode) +{ +} + +ClipControl::ClipControl(const ClipControl& clipControl, const CopyOp& copyop): + StateAttribute(clipControl, copyop), + _origin(clipControl._origin), + _depthMode(clipControl._depthMode) +{ +} + +ClipControl::~ClipControl() +{ +} + +void ClipControl::apply(State& state) const +{ + const GLExtensions* extensions = state.get(); + + if (!extensions->isClipControlSupported) return; + + extensions->glClipControl((GLenum)_origin, (GLenum)_depthMode); +} diff --git a/src/osg/GLExtensions.cpp b/src/osg/GLExtensions.cpp index c26677425..82939aef7 100644 --- a/src/osg/GLExtensions.cpp +++ b/src/osg/GLExtensions.cpp @@ -467,6 +467,8 @@ GLExtensions::GLExtensions(unsigned int contextID) isGLExtensionSupported(contextID,"GL_EXT_texture_cube_map") || (glVersion >= 1.3f); + isClipControlSupported = isGLExtensionSupported(contextID,"GL_ARB_clip_control") || + (glVersion >= 4.5f); isGlslSupported = ( glVersion >= 2.0f ) || @@ -601,6 +603,9 @@ GLExtensions::GLExtensions(unsigned int contextID) setGLExtensionFuncPtr(glUniformMatrix3x4fv, "glUniformMatrix3x4fv" ); setGLExtensionFuncPtr(glUniformMatrix4x3fv, "glUniformMatrix4x3fv" ); + // ARB_clip_control + setGLExtensionFuncPtr(glClipControl, "glClipControl"); + // EXT_geometry_shader4 setGLExtensionFuncPtr(glProgramParameteri, "glProgramParameteri", "glProgramParameteriEXT" );