From 00b1173e706c066b5266641daae44fabf42b30b3 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Wed, 29 Jun 2016 15:11:02 +0100 Subject: [PATCH] Added osg::ScissorIndexed that wraps up glScissorIndexed function --- include/osg/ScissorIndexed | 100 ++++++++++++++++++++++++++++++++++++ include/osg/StateAttribute | 2 + include/osg/ViewportIndexed | 2 +- src/osg/CMakeLists.txt | 2 + src/osg/ScissorIndexed.cpp | 57 ++++++++++++++++++++ 5 files changed, 162 insertions(+), 1 deletion(-) create mode 100644 include/osg/ScissorIndexed create mode 100644 src/osg/ScissorIndexed.cpp diff --git a/include/osg/ScissorIndexed b/include/osg/ScissorIndexed new file mode 100644 index 000000000..a77b615be --- /dev/null +++ b/include/osg/ScissorIndexed @@ -0,0 +1,100 @@ +/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2016 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_ScissorIndexed +#define OSG_ScissorIndexed 1 + +#include + +namespace osg { + +/** Encapsulates glScissorIndexed function : the index version of glDepth +*/ +class OSG_EXPORT ScissorIndexed : public osg::StateAttribute +{ + public : + + ScissorIndexed(); + + ScissorIndexed(unsigned int index, float x, float y, float width, float height): + _index(index), + _x(x), + _y(y), + _width(width), + _height(height) {} + + /** Copy constructor using CopyOp to manage deep vs shallow copy. */ + ScissorIndexed(const ScissorIndexed& dp,const CopyOp& copyop=CopyOp::SHALLOW_COPY): + StateAttribute(dp,copyop), + _index(dp._index), + _x(dp._x), + _y(dp._y), + _width(dp._width), + _height(dp._height) {} + + META_StateAttribute(osg, ScissorIndexed, SCISSORINDEXED); + + /** Return -1 if *this < *rhs, 0 if *this==*rhs, 1 if *this>*rhs. */ + virtual int compare(const StateAttribute& sa) const + { + // Check for equal types, then create the rhs variable + // used by the COMPARE_StateAttribute_Parameter macros below. + COMPARE_StateAttribute_Types(ScissorIndexed,sa) + + COMPARE_StateAttribute_Parameter(_index); + COMPARE_StateAttribute_Parameter(_x) + COMPARE_StateAttribute_Parameter(_y) + COMPARE_StateAttribute_Parameter(_width) + COMPARE_StateAttribute_Parameter(_height) + + return 0; + } + + /** Return the buffer index as the member identifier.*/ + virtual unsigned int getMember() const { return _index; } + + /** Set the index of the ScissorIndexed. */ + void setIndex(unsigned int index); + + /** Get the index of the ScissorIndexed. */ + unsigned int getIndex() const { return _index; } + + inline void setX(float x) { _x=x; } + inline float getX() const { return _x; } + + inline void setY(float y) { _y=y; } + inline float getY() const { return _y; } + + inline void setWidth(float w) { _width=w; } + inline float getWidth() const { return _width; } + + inline void setHeight(float height) { _height=height; } + inline float getHeight() const { return _height; } + + virtual void apply(State& state) const; + + protected: + + virtual ~ScissorIndexed(); + + unsigned int _index; + float _x; + float _y; + float _width; + float _height; + +}; + +} + +#endif diff --git a/include/osg/StateAttribute b/include/osg/StateAttribute index af297d09a..3a8420575 100644 --- a/include/osg/StateAttribute +++ b/include/osg/StateAttribute @@ -204,7 +204,9 @@ class OSG_EXPORT StateAttribute : public Object INDIRECTDRAWBUFFERBINDING, + VIEWPORTINDEXED, DEPTHRANGEINDEXED, + SCISSORINDEXED, CAPABILITY = 100 }; diff --git a/include/osg/ViewportIndexed b/include/osg/ViewportIndexed index 414cde690..1eda23114 100644 --- a/include/osg/ViewportIndexed +++ b/include/osg/ViewportIndexed @@ -35,7 +35,7 @@ class OSG_EXPORT ViewportIndexed : public Viewport Viewport(cm,copyop), _index(cm._index) {} - META_StateAttribute(osg, ViewportIndexed, VIEWPORT); + META_StateAttribute(osg, ViewportIndexed, VIEWPORTINDEXED); /** Return -1 if *this < *rhs, 0 if *this==*rhs, 1 if *this>*rhs. */ virtual int compare(const StateAttribute& sa) const diff --git a/src/osg/CMakeLists.txt b/src/osg/CMakeLists.txt index 54c8cde92..2564f4c5c 100644 --- a/src/osg/CMakeLists.txt +++ b/src/osg/CMakeLists.txt @@ -147,6 +147,7 @@ SET(TARGET_H ${HEADER_PATH}/RenderInfo ${HEADER_PATH}/SampleMaski ${HEADER_PATH}/Scissor + ${HEADER_PATH}/ScissorIndexed ${HEADER_PATH}/ScriptEngine ${HEADER_PATH}/Sequence ${HEADER_PATH}/ShadeModel @@ -348,6 +349,7 @@ SET(TARGET_SRC Referenced.cpp SampleMaski.cpp Scissor.cpp + ScissorIndexed.cpp ScriptEngine.cpp Sequence.cpp ShadeModel.cpp diff --git a/src/osg/ScissorIndexed.cpp b/src/osg/ScissorIndexed.cpp new file mode 100644 index 000000000..63b8a4e8d --- /dev/null +++ b/src/osg/ScissorIndexed.cpp @@ -0,0 +1,57 @@ +/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2014 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; + +ScissorIndexed::ScissorIndexed(): + _index(0), + _x(0.0f), + _y(0.0f), + _width(800.0f), + _height(600.0f) // defaults same as osg::Viewport and osg::Scissor +{ +} + +ScissorIndexed::~ScissorIndexed() +{ +} + +void ScissorIndexed::setIndex(unsigned int index) +{ + if (_index==index) return; + + ReassignToParents needToReassingToParentsWhenMemberValueChanges(this); + + _index = index; +} + +void ScissorIndexed::apply(State& state) const +{ + const GLExtensions* extensions = state.get(); + if (extensions->glScissorIndexed) + { + extensions->glScissorIndexed(static_cast(_index), + static_cast(_x), + static_cast(_y), + static_cast(_width), + static_cast(_height)); + } + else + { + OSG_WARN<<"Warning: ScissorIndexed::apply(..) failed, glScissorIndexed is not support by OpenGL driver."<