From fa84f280f6dc766005ce5f2fb9045624ada86a20 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Thu, 3 Sep 2009 13:40:50 +0000 Subject: [PATCH] Renamed the osgVolume::Layer/ImageDetails parameters RescaleIntercept and RescaleSlope to more general TexelOffset and TexelScale, and changed type to Vec4. Refactored the transfer function set up in RayTracedTechnique to prepare for new scale and offset uniforms. Updated wrappers --- examples/osgvolume/osgvolume.cpp | 4 +- include/osgVolume/Layer | 24 ++--- src/osgPlugins/dicom/ReaderWriterDICOM.cpp | 30 ++++-- src/osgVolume/Layer.cpp | 54 +++++++++-- src/osgVolume/RayTracedTechnique.cpp | 59 ++++------- src/osgWrappers/osgVolume/Layer.cpp | 108 +++++++++++++++++++++ 6 files changed, 205 insertions(+), 74 deletions(-) diff --git a/examples/osgvolume/osgvolume.cpp b/examples/osgvolume/osgvolume.cpp index e2dc85202..c6c0d3265 100644 --- a/examples/osgvolume/osgvolume.cpp +++ b/examples/osgvolume/osgvolume.cpp @@ -1353,8 +1353,8 @@ int main( int argc, char **argv ) if (details) { - layer->setRescaleIntercept(details->getRescaleIntercept()); - layer->setRescaleSlope(details->getRescaleSlope()); + layer->setTexelOffset(details->getTexelOffset()); + layer->setTexelScale(details->getTexelScale()); } switch(rescaleOperation) diff --git a/include/osgVolume/Layer b/include/osgVolume/Layer index 9801413b1..cc9a04e64 100644 --- a/include/osgVolume/Layer +++ b/include/osgVolume/Layer @@ -34,11 +34,11 @@ class OSGVOLUME_EXPORT ImageDetails : public osg::Object META_Object(osgVolume, ImageDetails); - void setRescaleIntercept(double intercept) { _rescaleIntercept = intercept; } - double getRescaleIntercept() const { return _rescaleIntercept; } + void setTexelOffset(const osg::Vec4& offset) { _texelOffset = offset; } + const osg::Vec4& getTexelOffset() const { return _texelOffset; } - void setRescaleSlope(double slope) { _rescaleSlope = slope; } - double getRescaleSlope() const { return _rescaleSlope; } + void setTexelScale(const osg::Vec4& scale) { _texelScale = scale; } + const osg::Vec4& getTexelScale() const { return _texelScale; } void setMatrix(osg::RefMatrix* matrix) { _matrix = matrix; } osg::RefMatrix* getMatrix() { return _matrix.get(); } @@ -46,8 +46,8 @@ class OSGVOLUME_EXPORT ImageDetails : public osg::Object protected: - double _rescaleIntercept; - double _rescaleSlope; + osg::Vec4 _texelOffset; + osg::Vec4 _texelScale; osg::ref_ptr _matrix; }; @@ -163,11 +163,11 @@ class OSGVOLUME_EXPORT ImageLayer : public Layer virtual const osg::Image* getImage() const { return _image.get(); } - void setRescaleIntercept(double intercept) { _rescaleIntercept = intercept; } - double getRescaleIntercept() const { return _rescaleIntercept; } + void setTexelOffset(const osg::Vec4& offset) { _texelOffset = offset; } + const osg::Vec4& getTexelOffset() const { return _texelOffset; } - void setRescaleSlope(double slope) { _rescaleSlope = slope; } - double setRescaleSlope() const { return _rescaleSlope; } + void setTexelScale(const osg::Vec4& scale) { _texelScale = scale; } + const osg::Vec4& getTexelScale() const { return _texelScale; } /** Compute the min and max pixel colors.*/ @@ -194,8 +194,8 @@ class OSGVOLUME_EXPORT ImageLayer : public Layer virtual ~ImageLayer() {} - double _rescaleIntercept; - double _rescaleSlope; + osg::Vec4 _texelOffset; + osg::Vec4 _texelScale; osg::ref_ptr _image; }; diff --git a/src/osgPlugins/dicom/ReaderWriterDICOM.cpp b/src/osgPlugins/dicom/ReaderWriterDICOM.cpp index 11f001582..97f933ad6 100644 --- a/src/osgPlugins/dicom/ReaderWriterDICOM.cpp +++ b/src/osgPlugins/dicom/ReaderWriterDICOM.cpp @@ -212,8 +212,8 @@ class ReaderWriterDICOM : public osgDB::ReaderWriter if (details) { - layer->setRescaleIntercept(details->getRescaleIntercept()); - layer->setRescaleSlope(details->getRescaleSlope()); + layer->setTexelOffset(details->getTexelOffset()); + layer->setTexelScale(details->getTexelScale()); } if (matrix) @@ -593,10 +593,10 @@ class ReaderWriterDICOM : public osgDB::ReaderWriter const char *classUID = NULL; if (fileformat.getDataset()->findAndGetString(DCM_SOPClassUID, classUID).good()) { - osg::notify(osg::NOTICE)<<" classUID = "< tf_texture = new osg::Texture1D; + tf_texture->setImage(tf->getImage()); + tf_texture->setResizeNonPowerOfTwoHint(false); + tf_texture->setFilter(osg::Texture::MIN_FILTER, osg::Texture::LINEAR); + tf_texture->setFilter(osg::Texture::MAG_FILTER, osg::Texture::LINEAR); + tf_texture->setWrap(osg::Texture::WRAP_R,osg::Texture::CLAMP_TO_EDGE); + + osg::ref_ptr tf_sampler = new osg::Uniform("tfTexture",1); + + stateset->setTextureAttributeAndModes(1, tf_texture.get(), osg::StateAttribute::ON); + stateset->addUniform(tf_sampler.get()); + + } + if (shadingModel==MaximumIntensityProjection) { enableBlending = true; if (tf) { - osg::Texture1D* texture1D = new osg::Texture1D; - texture1D->setImage(tf->getImage()); - stateset->setTextureAttributeAndModes(1,texture1D,osg::StateAttribute::ON); - osg::Shader* fragmentShader = osgDB::readShaderFile(osg::Shader::FRAGMENT, "shaders/volume_tf_mip.frag"); if (fragmentShader) { @@ -295,17 +307,6 @@ void RayTracedTechnique::init() if (tf) { - osg::Texture1D* texture1D = new osg::Texture1D; - texture1D->setImage(tf->getImage()); - texture1D->setResizeNonPowerOfTwoHint(false); - texture1D->setFilter(osg::Texture::MIN_FILTER, osg::Texture::LINEAR); - texture1D->setFilter(osg::Texture::MAG_FILTER, osg::Texture::LINEAR); - texture1D->setWrap(osg::Texture::WRAP_R,osg::Texture::CLAMP_TO_EDGE); - stateset->setTextureAttributeAndModes(1,texture1D,osg::StateAttribute::ON); - - osg::Uniform* tfTextureSampler = new osg::Uniform("tfTexture",1); - stateset->addUniform(tfTextureSampler); - osg::Shader* fragmentShader = osgDB::readShaderFile(osg::Shader::FRAGMENT, "shaders/volume_tf_iso.frag"); if (fragmentShader) { @@ -341,17 +342,6 @@ void RayTracedTechnique::init() if (tf) { - osg::Texture1D* texture1D = new osg::Texture1D; - texture1D->setImage(tf->getImage()); - texture1D->setResizeNonPowerOfTwoHint(false); - texture1D->setFilter(osg::Texture::MIN_FILTER, osg::Texture::LINEAR); - texture1D->setFilter(osg::Texture::MAG_FILTER, osg::Texture::LINEAR); - texture1D->setWrap(osg::Texture::WRAP_R,osg::Texture::CLAMP_TO_EDGE); - stateset->setTextureAttributeAndModes(1,texture1D,osg::StateAttribute::ON); - - osg::Uniform* tfTextureSampler = new osg::Uniform("tfTexture",1); - stateset->addUniform(tfTextureSampler); - osg::Shader* fragmentShader = osgDB::readShaderFile(osg::Shader::FRAGMENT, "shaders/volume_lit_tf.frag"); if (fragmentShader) { @@ -366,7 +356,6 @@ void RayTracedTechnique::init() } else { - osg::Shader* fragmentShader = osgDB::readShaderFile(osg::Shader::FRAGMENT, "shaders/volume_lit.frag"); if (fragmentShader) { @@ -385,19 +374,6 @@ void RayTracedTechnique::init() if (tf) { - osg::notify(osg::INFO)<<"Setting up TF path"<setImage(tf->getImage()); - texture1D->setResizeNonPowerOfTwoHint(false); - texture1D->setFilter(osg::Texture::MIN_FILTER, osg::Texture::LINEAR); - texture1D->setFilter(osg::Texture::MAG_FILTER, osg::Texture::LINEAR); - texture1D->setWrap(osg::Texture::WRAP_R,osg::Texture::CLAMP_TO_EDGE); - stateset->setTextureAttributeAndModes(1,texture1D,osg::StateAttribute::ON); - - osg::Uniform* tfTextureSampler = new osg::Uniform("tfTexture",1); - stateset->addUniform(tfTextureSampler); - osg::Shader* fragmentShader = osgDB::readShaderFile(osg::Shader::FRAGMENT, "shaders/volume_tf.frag"); if (fragmentShader) { @@ -412,7 +388,6 @@ void RayTracedTechnique::init() } else { - osg::Shader* fragmentShader = osgDB::readShaderFile(osg::Shader::FRAGMENT, "shaders/volume.frag"); if (fragmentShader) { @@ -425,7 +400,7 @@ void RayTracedTechnique::init() } } } - + if (cpv._sampleDensityProperty.valid()) stateset->addUniform(cpv._sampleDensityProperty->getUniform()); else diff --git a/src/osgWrappers/osgVolume/Layer.cpp b/src/osgWrappers/osgVolume/Layer.cpp index 4f5443ac6..11ac87d01 100644 --- a/src/osgWrappers/osgVolume/Layer.cpp +++ b/src/osgWrappers/osgVolume/Layer.cpp @@ -13,6 +13,7 @@ #include #include #include +#include #include #include #include @@ -132,6 +133,87 @@ BEGIN_OBJECT_REFLECTOR(osgVolume::CompositeLayer) __void__removeLayer__unsigned_int); END_REFLECTOR +BEGIN_OBJECT_REFLECTOR(osgVolume::ImageDetails) + I_DeclaringFile("osgVolume/Layer"); + I_BaseType(osg::Object); + I_Constructor0(____ImageDetails, + "", + ""); + I_ConstructorWithDefaults2(IN, const osgVolume::ImageDetails &, x, , IN, const osg::CopyOp &, copyop, osg::CopyOp::SHALLOW_COPY, + ____ImageDetails__C5_ImageDetails_R1__C5_osg_CopyOp_R1, + "Copy constructor using CopyOp to manage deep vs shallow copy. ", + ""); + I_Method0(osg::Object *, cloneType, + Properties::VIRTUAL, + __osg_Object_P1__cloneType, + "Clone the type of an object, with Object* return type. ", + "Must be defined by derived classes. "); + I_Method1(osg::Object *, clone, IN, const osg::CopyOp &, x, + Properties::VIRTUAL, + __osg_Object_P1__clone__C5_osg_CopyOp_R1, + "Clone an object, with Object* return type. ", + "Must be defined by derived classes. "); + I_Method1(bool, isSameKindAs, IN, const osg::Object *, obj, + Properties::VIRTUAL, + __bool__isSameKindAs__C5_osg_Object_P1, + "", + ""); + I_Method0(const char *, libraryName, + Properties::VIRTUAL, + __C5_char_P1__libraryName, + "return the name of the object's library. ", + "Must be defined by derived classes. The OpenSceneGraph convention is that the namespace of a library is the same as the library name. "); + I_Method0(const char *, className, + Properties::VIRTUAL, + __C5_char_P1__className, + "return the name of the object's class type. ", + "Must be defined by derived classes. "); + I_Method1(void, setTexelOffset, IN, const osg::Vec4 &, offset, + Properties::NON_VIRTUAL, + __void__setTexelOffset__C5_osg_Vec4_R1, + "", + ""); + I_Method0(const osg::Vec4 &, getTexelOffset, + Properties::NON_VIRTUAL, + __C5_osg_Vec4_R1__getTexelOffset, + "", + ""); + I_Method1(void, setTexelScale, IN, const osg::Vec4 &, scale, + Properties::NON_VIRTUAL, + __void__setTexelScale__C5_osg_Vec4_R1, + "", + ""); + I_Method0(const osg::Vec4 &, getTexelScale, + Properties::NON_VIRTUAL, + __C5_osg_Vec4_R1__getTexelScale, + "", + ""); + I_Method1(void, setMatrix, IN, osg::RefMatrix *, matrix, + Properties::NON_VIRTUAL, + __void__setMatrix__osg_RefMatrix_P1, + "", + ""); + I_Method0(osg::RefMatrix *, getMatrix, + Properties::NON_VIRTUAL, + __osg_RefMatrix_P1__getMatrix, + "", + ""); + I_Method0(const osg::RefMatrix *, getMatrix, + Properties::NON_VIRTUAL, + __C5_osg_RefMatrix_P1__getMatrix, + "", + ""); + I_SimpleProperty(osg::RefMatrix *, Matrix, + __osg_RefMatrix_P1__getMatrix, + __void__setMatrix__osg_RefMatrix_P1); + I_SimpleProperty(const osg::Vec4 &, TexelOffset, + __C5_osg_Vec4_R1__getTexelOffset, + __void__setTexelOffset__C5_osg_Vec4_R1); + I_SimpleProperty(const osg::Vec4 &, TexelScale, + __C5_osg_Vec4_R1__getTexelScale, + __void__setTexelScale__C5_osg_Vec4_R1); +END_REFLECTOR + BEGIN_OBJECT_REFLECTOR(osgVolume::ImageLayer) I_DeclaringFile("osgVolume/Layer"); I_BaseType(osgVolume::Layer); @@ -194,6 +276,26 @@ BEGIN_OBJECT_REFLECTOR(osgVolume::ImageLayer) __C5_osg_Image_P1__getImage, "Return const image associated with layer. ", ""); + I_Method1(void, setTexelOffset, IN, const osg::Vec4 &, offset, + Properties::NON_VIRTUAL, + __void__setTexelOffset__C5_osg_Vec4_R1, + "", + ""); + I_Method0(const osg::Vec4 &, getTexelOffset, + Properties::NON_VIRTUAL, + __C5_osg_Vec4_R1__getTexelOffset, + "", + ""); + I_Method1(void, setTexelScale, IN, const osg::Vec4 &, scale, + Properties::NON_VIRTUAL, + __void__setTexelScale__C5_osg_Vec4_R1, + "", + ""); + I_Method0(const osg::Vec4 &, getTexelScale, + Properties::NON_VIRTUAL, + __C5_osg_Vec4_R1__getTexelScale, + "", + ""); I_Method2(bool, computeMinMax, IN, osg::Vec4 &, min, IN, osg::Vec4 &, max, Properties::NON_VIRTUAL, __bool__computeMinMax__osg_Vec4_R1__osg_Vec4_R1, @@ -248,6 +350,12 @@ BEGIN_OBJECT_REFLECTOR(osgVolume::ImageLayer) I_SimpleProperty(unsigned int, ModifiedCount, __unsigned_int__getModifiedCount, __void__setModifiedCount__unsigned_int); + I_SimpleProperty(const osg::Vec4 &, TexelOffset, + __C5_osg_Vec4_R1__getTexelOffset, + __void__setTexelOffset__C5_osg_Vec4_R1); + I_SimpleProperty(const osg::Vec4 &, TexelScale, + __C5_osg_Vec4_R1__getTexelScale, + __void__setTexelScale__C5_osg_Vec4_R1); END_REFLECTOR BEGIN_OBJECT_REFLECTOR(osgVolume::Layer)