diff --git a/VisualStudio/osg/osg.dsp b/VisualStudio/osg/osg.dsp index 00c6aaea2..fd5f727b8 100755 --- a/VisualStudio/osg/osg.dsp +++ b/VisualStudio/osg/osg.dsp @@ -292,6 +292,10 @@ SOURCE=..\..\src\osg\LOD.cpp # End Source File # Begin Source File +SOURCE=..\..\src\osg\LogicOp.cpp +# End Source File +# Begin Source File + SOURCE=..\..\src\osg\Material.cpp # End Source File # Begin Source File @@ -713,7 +717,11 @@ SOURCE=..\..\Include\Osg\LineWidth # End Source File # Begin Source File -SOURCE=..\..\Include\Osg\Lod +SOURCE=..\..\Include\Osg\LOD +# End Source File +# Begin Source File + +SOURCE=..\..\Include\Osg\LogicOp # End Source File # Begin Source File diff --git a/include/osg/LogicOp b/include/osg/LogicOp new file mode 100644 index 000000000..37759b167 --- /dev/null +++ b/include/osg/LogicOp @@ -0,0 +1,119 @@ +/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2003 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_LOGICOP +#define OSG_LOGICOP 1 + +#include + +#ifndef GL_VERSION_1_2 +/* Logic Ops */ +#define GL_LOGIC_OP 0x0BF1 +#define GL_INDEX_LOGIC_OP 0x0BF1 +#define GL_COLOR_LOGIC_OP 0x0BF2 +#define GL_LOGIC_OP_MODE 0x0BF0 +#define GL_CLEAR 0x1500 +#define GL_SET 0x150F +#define GL_COPY 0x1503 +#define GL_COPY_INVERTED 0x150C +#define GL_NOOP 0x1505 +#define GL_INVERT 0x150A +#define GL_AND 0x1501 +#define GL_NAND 0x150E +#define GL_OR 0x1507 +#define GL_NOR 0x1508 +#define GL_XOR 0x1506 +#define GL_EQUIV 0x1509 +#define GL_AND_REVERSE 0x1502 +#define GL_AND_INVERTED 0x1504 +#define GL_OR_REVERSE 0x150B +#define GL_OR_INVERTED 0x150D +#endif + + + +namespace osg { + +/** Encapsulates OpenGL LogicOp state. */ +class SG_EXPORT LogicOp : public StateAttribute +{ + public : + + LogicOp(); + + LogicOp(GLenum opcode); + + /** Copy constructor using CopyOp to manage deep vs shallow copy. */ + LogicOp(const LogicOp& trans,const CopyOp& copyop=CopyOp::SHALLOW_COPY): + StateAttribute(trans,copyop), + _opcode(trans._opcode){} + + META_StateAttribute(osg, LogicOp,LOGICOP); + + /** 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_Paramter macros below. + COMPARE_StateAttribute_Types(LogicOp,sa) + + // Compare each parameter in turn against the rhs. + COMPARE_StateAttribute_Parameter(_opcode) + + return 0; // Passed all the above comparison macros, so must be equal. + } + + virtual bool getModeUsage(ModeUsage& usage) const + { + usage.usesMode(GL_COLOR_LOGIC_OP); + return true; + } + + enum LogicOpOpcode { + CLEAR = GL_CLEAR, + SET = GL_SET, + COPY = GL_COPY, + COPY_INVERTED = GL_COPY_INVERTED, + NOOP = GL_NOOP, + INVERT = GL_INVERT, + AND = GL_AND, + NAND = GL_NAND, + OR = GL_OR, + NOR = GL_NOR, + XOR = GL_XOR, + EQUIV = GL_EQUIV, + AND_REVERSE = GL_AND_REVERSE, + AND_INVERTED = GL_AND_INVERTED, + OR_REVERSE = GL_OR_REVERSE, + OR_INVERTED = GL_OR_INVERTED + }; + + inline void setOpcode( GLenum opcode ) + { + _opcode = opcode; + } + + inline GLenum getOpcode() const { return _opcode; } + + virtual void apply(State& state) const; + + protected : + + virtual ~LogicOp(); + + GLenum _opcode; +}; + +} + +#endif diff --git a/include/osg/StateAttribute b/include/osg/StateAttribute index 2d56737fd..9681cf06b 100644 --- a/include/osg/StateAttribute +++ b/include/osg/StateAttribute @@ -141,6 +141,7 @@ class SG_EXPORT StateAttribute : public Object TEXMAT, LIGHTMODEL, BLENDFUNC, + LOGICOP, STENCIL, COLORMASK, DEPTH, diff --git a/src/osg/GNUmakefile b/src/osg/GNUmakefile index 001561158..1fc9e0e46 100644 --- a/src/osg/GNUmakefile +++ b/src/osg/GNUmakefile @@ -46,6 +46,7 @@ CXXFILES =\ Impostor.cpp\ ImpostorSprite.cpp\ LOD.cpp\ + LogicOp.cpp\ Light.cpp\ LightModel.cpp\ LightSource.cpp\ diff --git a/src/osg/LogicOp.cpp b/src/osg/LogicOp.cpp new file mode 100644 index 000000000..34262b635 --- /dev/null +++ b/src/osg/LogicOp.cpp @@ -0,0 +1,35 @@ +/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2003 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 + +using namespace osg; + +LogicOp::LogicOp(): + _opcode(COPY) +{ +} + +LogicOp::LogicOp(GLenum opcode): + _opcode(opcode) +{ +} + +LogicOp::~LogicOp() +{ +} + +void LogicOp::apply(State&) const +{ + glLogicOp(_opcode); +} +