From 78d075eb24390aba2cfbb64b4554ff0d6f7be131 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Mon, 14 Jun 2004 19:11:04 +0000 Subject: [PATCH] Added new TexGenNode class for positioning tex gens. --- VisualStudio/osg/osg.dsp | 8 +++++ include/osg/NodeVisitor | 2 ++ include/osg/TexGenNode | 60 +++++++++++++++++++++++++++++++++++++ include/osgUtil/CullVisitor | 1 + src/osg/GNUmakefile | 1 + src/osg/TexGenNode.cpp | 54 +++++++++++++++++++++++++++++++++ src/osgUtil/CullVisitor.cpp | 17 +++++++++++ 7 files changed, 143 insertions(+) create mode 100644 include/osg/TexGenNode create mode 100644 src/osg/TexGenNode.cpp diff --git a/VisualStudio/osg/osg.dsp b/VisualStudio/osg/osg.dsp index 49523e671..2ef473911 100755 --- a/VisualStudio/osg/osg.dsp +++ b/VisualStudio/osg/osg.dsp @@ -151,6 +151,10 @@ SOURCE=..\..\src\osg\ClipPlane.cpp # End Source File # Begin Source File +SOURCE=..\..\src\osg\TexGenNode.cpp +# End Source File +# Begin Source File + SOURCE=..\..\src\osg\CollectOccludersVisitor.cpp # End Source File # Begin Source File @@ -543,6 +547,10 @@ SOURCE=..\..\Include\Osg\ClipPlane # End Source File # Begin Source File +SOURCE=..\..\Include\Osg\TexGenNode +# End Source File +# Begin Source File + SOURCE=..\..\Include\Osg\CollectOccludersVisitor # End Source File # Begin Source File diff --git a/include/osg/NodeVisitor b/include/osg/NodeVisitor index 0de01a8c4..f67ba72ca 100644 --- a/include/osg/NodeVisitor +++ b/include/osg/NodeVisitor @@ -24,6 +24,7 @@ class Geode; class Billboard; class LightSource; class ClipNode; +class TexGenNode; class Group; class Transform; class MatrixTransform; @@ -225,6 +226,7 @@ class SG_EXPORT NodeVisitor : public virtual Referenced virtual void apply(CoordinateSystemNode& node) { apply((Group&)node); } virtual void apply(ClipNode& node) { apply((Group&)node); } + virtual void apply(TexGenNode& node) { apply((Group&)node); } virtual void apply(LightSource& node) { apply((Group&)node); } virtual void apply(Transform& node) { apply((Group&)node); } diff --git a/include/osg/TexGenNode b/include/osg/TexGenNode new file mode 100644 index 000000000..7ea5de01e --- /dev/null +++ b/include/osg/TexGenNode @@ -0,0 +1,60 @@ +/* -*-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_TexGenNode +#define OSG_TexGenNode 1 + +#include +#include + +namespace osg { + +/** Node for defining the position of TexGen in the scene.*/ +class SG_EXPORT TexGenNode : public Group +{ + + public: + + TexGenNode(); + TexGenNode(TexGen* texgen); + + TexGenNode(const TexGenNode& tgb, const CopyOp& copyop=CopyOp::SHALLOW_COPY); + + META_Node(osg, TexGenNode); + + /** Set the TexGen.*/ + void setTexGen(TexGen* texgen); + + /** Get the TexGen.*/ + inline TexGen* getTexGen() { return _texgen.get(); } + + /** Get the const TexGen.*/ + inline const TexGen* getTexGen() const { return _texgen.get(); } + + /** Set the GLModes on StateSet associated with the TexGen.*/ + void setStateSetModes(StateSet&,StateAttribute::GLModeValue) const; + + /** Set up the local StateSet */ + void setLocalStateSetModes(StateAttribute::GLModeValue=StateAttribute::ON); + + protected: + + virtual ~TexGenNode(); + + StateAttribute::GLModeValue _value; + osg::ref_ptr _texgen; +}; + +} + +#endif diff --git a/include/osgUtil/CullVisitor b/include/osgUtil/CullVisitor index 26e9de050..d26c6886b 100644 --- a/include/osgUtil/CullVisitor +++ b/include/osgUtil/CullVisitor @@ -69,6 +69,7 @@ class OSGUTIL_EXPORT CullVisitor : public osg::NodeVisitor, public osg::CullStac virtual void apply(osg::Billboard& node); virtual void apply(osg::LightSource& node); virtual void apply(osg::ClipNode& node); + virtual void apply(osg::TexGenNode& node); virtual void apply(osg::Group& node); virtual void apply(osg::Transform& node); diff --git a/src/osg/GNUmakefile b/src/osg/GNUmakefile index 61c80d274..127964c90 100644 --- a/src/osg/GNUmakefile +++ b/src/osg/GNUmakefile @@ -85,6 +85,7 @@ CXXFILES =\ TexEnv.cpp\ TexEnvCombine.cpp\ TexGen.cpp\ + TexGenNode.cpp\ TexMat.cpp\ Texture.cpp\ Texture2D.cpp\ diff --git a/src/osg/TexGenNode.cpp b/src/osg/TexGenNode.cpp new file mode 100644 index 000000000..b40a53165 --- /dev/null +++ b/src/osg/TexGenNode.cpp @@ -0,0 +1,54 @@ +/* -*-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; + +TexGenNode::TexGenNode() +{ + _value = StateAttribute::ON; + _stateset = new StateSet; + _texgen = new TexGen; + setLocalStateSetModes(_value); +} + +TexGenNode::TexGenNode(const TexGenNode& cn, const CopyOp& copyop): + Group(cn,copyop), + _value(cn._value), + _texgen(static_cast(copyop(cn._texgen.get()))) +{ +} + +TexGenNode::~TexGenNode() +{ +} + +void TexGenNode::setTexGen(TexGen* texgen) +{ + _texgen = texgen; + setLocalStateSetModes(_value); +} + +// Set the GLModes on StateSet associated with the TexGen. +void TexGenNode::setStateSetModes(StateSet& stateset,const StateAttribute::GLModeValue value) const +{ + if (_texgen.valid()) + stateset.setAssociatedModes(_texgen.get(),value); +} + +void TexGenNode::setLocalStateSetModes(const StateAttribute::GLModeValue value) +{ + if (!_stateset) _stateset = new StateSet; + _stateset->setAllToInherit(); + setStateSetModes(*_stateset,value); +} diff --git a/src/osgUtil/CullVisitor.cpp b/src/osgUtil/CullVisitor.cpp index 609a1977d..08a96eecf 100644 --- a/src/osgUtil/CullVisitor.cpp +++ b/src/osgUtil/CullVisitor.cpp @@ -17,6 +17,7 @@ #include #include #include +#include #include #include #include @@ -874,6 +875,22 @@ void CullVisitor::apply(ClipNode& node) if (node_state) popStateSet(); } +void CullVisitor::apply(TexGenNode& node) +{ + // push the node's state. + StateSet* node_state = node.getStateSet(); + if (node_state) pushStateSet(node_state); + + RefMatrix& matrix = getModelViewMatrix(); + + addPositionedAttribute(&matrix,node.getTexGen()); + + handle_cull_callbacks_and_traverse(node); + + // pop the node's state off the geostate stack. + if (node_state) popStateSet(); +} + void CullVisitor::apply(Group& node) { if (isCulled(node)) return;