From 87cd4530f562bee9498a1362f1da2d959deadf21 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Tue, 20 Jan 2009 12:39:26 +0000 Subject: [PATCH] Added AlphaFunc support into osgVolume::AlphaFuncProperty. --- examples/osgvolume/osgvolume.cpp | 6 +++++- include/osgVolume/Property | 12 +++++++++++- src/osgVolume/FixedFunctionTechnique.cpp | 10 +++++++++- src/osgVolume/Property.cpp | 8 ++++++++ src/osgVolume/ShaderTechnique.cpp | 6 ++++-- src/osgVolume/Shaders/volume_frag.cpp | 6 +++--- src/osgVolume/Shaders/volume_mip_frag.cpp | 4 ++-- src/osgVolume/Shaders/volume_n_frag.cpp | 4 ++-- src/osgVolume/Shaders/volume_tf_frag.cpp | 6 +++--- src/osgVolume/Shaders/volume_tf_mip_frag.cpp | 4 ++-- src/osgVolume/Shaders/volume_tf_n_frag.cpp | 4 ++-- 11 files changed, 51 insertions(+), 19 deletions(-) diff --git a/examples/osgvolume/osgvolume.cpp b/examples/osgvolume/osgvolume.cpp index bcba2bec5..981ad107b 100644 --- a/examples/osgvolume/osgvolume.cpp +++ b/examples/osgvolume/osgvolume.cpp @@ -782,6 +782,7 @@ class FollowMouseCallback : public osgGA::GUIEventHandler, public osg::StateSet: if (_updateAlphaCutOff && cpv._afProperty.valid()) { + osg::notify(osg::NOTICE)<<"Setting afProperty to "<setValue(v); } } @@ -1345,24 +1346,27 @@ int main( int argc, char **argv ) switch(shadingModel) { case(Standard): + layer->addProperty(new osgVolume::AlphaFuncProperty(alphaFunc)); break; case(Light): + layer->addProperty(new osgVolume::AlphaFuncProperty(alphaFunc)); layer->addProperty(new osgVolume::LightingProperty); break; case(Isosurface): layer->addProperty(new osgVolume::IsoSurfaceProperty(alphaFunc)); break; case(MaximumIntensityProjection): + layer->addProperty(new osgVolume::AlphaFuncProperty(alphaFunc)); layer->addProperty(new osgVolume::MaximumIntensityProjectionProperty); break; } - layer->addProperty(new osgVolume::AlphaFuncProperty(alphaFunc)); tile->setVolumeTechnique(new osgVolume::ShaderTechnique); } else { + layer->addProperty(new osgVolume::AlphaFuncProperty(alphaFunc)); tile->setVolumeTechnique(new osgVolume::FixedFunctionTechnique); } diff --git a/include/osgVolume/Property b/include/osgVolume/Property index 3e0727bc3..42dced1bf 100644 --- a/include/osgVolume/Property +++ b/include/osgVolume/Property @@ -16,6 +16,7 @@ #include #include +#include #include @@ -150,7 +151,7 @@ class OSGVOLUME_EXPORT ScalarProperty : public Property virtual void accept(PropertyVisitor& pv) { pv.apply(*this); } /** Set the value.*/ - void setValue(float v) { _uniform->set(v); } + virtual void setValue(float v) { _uniform->set(v); } /** Get the value.*/ float getValue() const { float v; _uniform->get(v); return v; } @@ -198,9 +199,18 @@ class OSGVOLUME_EXPORT AlphaFuncProperty : public ScalarProperty virtual void accept(PropertyVisitor& pv) { pv.apply(*this); } + virtual void setValue(float v); + + osg::AlphaFunc* getAlphaFunc() { return _alphaFunc.get(); } + + const osg::AlphaFunc* getAlphaFunc() const { return _alphaFunc.get(); } + + protected: virtual ~AlphaFuncProperty() {} + + osg::ref_ptr _alphaFunc; }; class OSGVOLUME_EXPORT MaximumIntensityProjectionProperty : public Property diff --git a/src/osgVolume/FixedFunctionTechnique.cpp b/src/osgVolume/FixedFunctionTechnique.cpp index 8a1d04ef9..d3885f340 100644 --- a/src/osgVolume/FixedFunctionTechnique.cpp +++ b/src/osgVolume/FixedFunctionTechnique.cpp @@ -183,7 +183,15 @@ void FixedFunctionTechnique::init() stateset->setMode(GL_LIGHTING,osg::StateAttribute::ON); stateset->setMode(GL_BLEND,osg::StateAttribute::ON); - stateset->setAttributeAndModes(new osg::AlphaFunc(osg::AlphaFunc::GREATER,alphaFuncValue), osg::StateAttribute::ON); + + if (cpv._afProperty.valid()) + { + stateset->setAttributeAndModes(cpv._afProperty->getAlphaFunc(), osg::StateAttribute::ON); + } + else + { + stateset->setAttributeAndModes(new osg::AlphaFunc(osg::AlphaFunc::GREATER,alphaFuncValue), osg::StateAttribute::ON); + } osg::Material* material = new osg::Material; material->setDiffuse(osg::Material::FRONT_AND_BACK,osg::Vec4(1.0f,1.0f,1.0f,1.0f)); diff --git a/src/osgVolume/Property.cpp b/src/osgVolume/Property.cpp index ca0e45199..0a256b340 100644 --- a/src/osgVolume/Property.cpp +++ b/src/osgVolume/Property.cpp @@ -106,11 +106,19 @@ IsoSurfaceProperty::IsoSurfaceProperty(const IsoSurfaceProperty& isp,const osg:: AlphaFuncProperty::AlphaFuncProperty(float value): ScalarProperty("AlphaFuncValue",value) { + _alphaFunc = new osg::AlphaFunc(osg::AlphaFunc::GREATER, value); } AlphaFuncProperty::AlphaFuncProperty(const AlphaFuncProperty& afp,const osg::CopyOp& copyop): ScalarProperty(afp, copyop) { + _alphaFunc = new osg::AlphaFunc(osg::AlphaFunc::GREATER, getValue()); +} + +void AlphaFuncProperty::setValue(float v) +{ + _uniform->set(v); + _alphaFunc->setReferenceValue(v); } ///////////////////////////////////////////////////////////////////////////// diff --git a/src/osgVolume/ShaderTechnique.cpp b/src/osgVolume/ShaderTechnique.cpp index 7d6119abd..cd78fbcb3 100644 --- a/src/osgVolume/ShaderTechnique.cpp +++ b/src/osgVolume/ShaderTechnique.cpp @@ -300,8 +300,10 @@ void ShaderTechnique::init() osg::Uniform* transpancy = new osg::Uniform("transparency",0.5f); stateset->addUniform(transpancy); - osg::Uniform* alphaCutOff = new osg::Uniform("alphaCutOff",alphaFuncValue); - stateset->addUniform(alphaCutOff); + if (cpv._afProperty.valid()) + { + stateset->addUniform(cpv._afProperty->getUniform()); + } stateset->setMode(GL_CULL_FACE, osg::StateAttribute::ON); diff --git a/src/osgVolume/Shaders/volume_frag.cpp b/src/osgVolume/Shaders/volume_frag.cpp index ec4c98d82..711e30de0 100644 --- a/src/osgVolume/Shaders/volume_frag.cpp +++ b/src/osgVolume/Shaders/volume_frag.cpp @@ -1,7 +1,7 @@ char volume_frag[] = "uniform sampler3D baseTexture;\n" "uniform float sampleDensity;\n" "uniform float transparency;\n" - "uniform float alphaCutOff;\n" + "uniform float AlphaFuncValue;\n" "\n" "varying vec4 cameraPos;\n" "varying vec4 vertexPos;\n" @@ -74,7 +74,7 @@ char volume_frag[] = "uniform sampler3D baseTexture;\n" " {\n" " vec4 color = texture3D( baseTexture, texcoord);\n" " float r = color[3]*transparency;\n" - " if (r>alphaCutOff)\n" + " if (r>AlphaFuncValue)\n" " {\n" " fragColor.xyz = fragColor.xyz*(1.0-r)+color.xyz*r;\n" " fragColor.w += r;\n" @@ -92,7 +92,7 @@ char volume_frag[] = "uniform sampler3D baseTexture;\n" " fragColor.w *= transparency;\n" "\n" " if (fragColor.w>1.0) fragColor.w = 1.0; \n" - " if (fragColor.w1.0) fragColor.w = 1.0; \n" - " if (fragColor.walphaCutOff)\n" + " if (r>AlphaFuncValue)\n" " {\n" " fragColor.xyz = fragColor.xyz*(1.0-r)+color.xyz*r;\n" " fragColor.w += r;\n" diff --git a/src/osgVolume/Shaders/volume_tf_frag.cpp b/src/osgVolume/Shaders/volume_tf_frag.cpp index b0d0729d2..726693831 100644 --- a/src/osgVolume/Shaders/volume_tf_frag.cpp +++ b/src/osgVolume/Shaders/volume_tf_frag.cpp @@ -2,7 +2,7 @@ char volume_tf_frag[] = "uniform sampler3D baseTexture;\n" "uniform sampler1D tfTexture;\n" "uniform float sampleDensity;\n" "uniform float transparency;\n" - "uniform float alphaCutOff;\n" + "uniform float AlphaFuncValue;\n" "\n" "varying vec4 cameraPos;\n" "varying vec4 vertexPos;\n" @@ -77,7 +77,7 @@ char volume_tf_frag[] = "uniform sampler3D baseTexture;\n" " vec4 color = texture1D( tfTexture, v);\n" "\n" " float r = color[3]*transparency;\n" - " if (r>alphaCutOff)\n" + " if (r>AlphaFuncValue)\n" " {\n" " fragColor.xyz = fragColor.xyz*(1.0-r)+color.xyz*r;\n" " fragColor.w += r;\n" @@ -95,7 +95,7 @@ char volume_tf_frag[] = "uniform sampler3D baseTexture;\n" " fragColor.w *= transparency;\n" "\n" " if (fragColor.w>1.0) fragColor.w = 1.0; \n" - " if (fragColor.w1.0) fragColor.w = 1.0; \n" - " if (fragColor.walphaCutOff)\n" + " if (r>AlphaFuncValue)\n" " {\n" " fragColor.xyz = fragColor.xyz*(1.0-r)+color.xyz*r;\n" " fragColor.w += r;\n"