From ae0f93010fc0019ecaa3bd2d80ab4b2aa4915c83 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Tue, 1 Feb 2005 22:36:05 +0000 Subject: [PATCH] Added support for modulating alpha values --- examples/osgvolume/osgvolume.cpp | 175 ++++++++++++++++++++++++------- 1 file changed, 136 insertions(+), 39 deletions(-) diff --git a/examples/osgvolume/osgvolume.cpp b/examples/osgvolume/osgvolume.cpp index e5468c753..022756ff4 100644 --- a/examples/osgvolume/osgvolume.cpp +++ b/examples/osgvolume/osgvolume.cpp @@ -25,15 +25,15 @@ typedef std::vector< osg::ref_ptr > ImageList; - -struct ReadOperator -{ - inline void luminance(float l) const { rgba(l,l,l,1.0f); } - inline void alpha(float a) const { rgba(1.0f,1.0f,1.0f,a); } - inline void luminance_alpha(float l,float a) const { rgba(l,l,l,a); } - inline void rgb(float r,float g,float b) const { rgba(r,g,b,1.0f); } - inline void rgba(float r,float g,float b,float a) const { std::cout<<"pixel("< @@ -46,6 +46,8 @@ void _readRow(unsigned int num, GLenum pixelFormat, T* data,float scale, const O case(GL_LUMINANCE_ALPHA): { for(unsigned int i=0;i +void readImage(osg::Image* image, const O& operation) { - inline void luminance(float& l) const {} - inline void alpha(float& a) const {} - inline void luminance_alpha(float& l,float& a) const {} - inline void rgb(float& r,float& g,float& b) const {} - inline void rgba(float& r,float& g,float& b,float& a) const {} -}; + if (!image) return; + + for(int r=0;rr();++r) + { + for(int t=0;tt();++t) + { + readRow(image->s(), image->getPixelFormat(), image->getDataType(), image->data(0,t,r), operation); + } + } +} + +// example ModifyOperator +// struct ModifyOperator +// { +// inline void luminance(float& l) const {} +// inline void alpha(float& a) const {} +// inline void luminance_alpha(float& l,float& a) const {} +// inline void rgb(float& r,float& g,float& b) const {} +// inline void rgba(float& r,float& g,float& b,float& a) const {} +// }; template @@ -86,9 +101,9 @@ void _modifyRow(unsigned int num, GLenum pixelFormat, T* data,float scale, const case(GL_ALPHA): { for(unsigned int i=0;i +void modifyImage(osg::Image* image, const M& operation) +{ + if (!image) return; + + for(int r=0;rr();++r) + { + for(int t=0;tt();++t) + { + modifyRow(image->s(), image->getPixelFormat(), image->getDataType(), image->data(0,t,r), operation); + } + } +} struct PassThroughTransformFunction { @@ -508,6 +536,7 @@ osg::Image* createNormalMapTexture(osg::Image* image_3d) normalmap_3d->allocateImage(image_3d->s(),image_3d->t(),image_3d->r(), GL_RGBA,GL_UNSIGNED_BYTE); + if (osg::getCpuByteOrder()==osg::LittleEndian) alphaOffset = sourcePixelIncrement-alphaOffset-1; for(int r=1;rr()-1;++r) { @@ -861,8 +890,12 @@ struct FindRangeOperator struct ScaleOperator { + ScaleOperator():_scale(1.0f) {} ScaleOperator(float scale):_scale(scale) {} + ScaleOperator(const ScaleOperator& so):_scale(so._scale) {} + ScaleOperator& operator = (const ScaleOperator& so) { _scale = so._scale; return *this; } + float _scale; inline void luminance(float& l) const { l*= _scale; } @@ -941,7 +974,7 @@ osg::Image* readRaw(int sizeX, int sizeY, int sizeZ, int numberBytesPerComponent image->allocateImage(sizeS, sizeT, sizeR, pixelFormat, dataType); - bool endianSwap = (osg::getCpuByteOrder()==osg::BigEndian) ? (endian=="big") : (endian!="big"); + bool endianSwap = (osg::getCpuByteOrder()==osg::BigEndian) ? (endian!="big") : (endian=="big"); unsigned int r_offset = (sizeZdata(0,t,r), rangeOp); - } - } - - // scale the values - for(int r=0;rdata(0,t,r), ScaleOperator(1.0f/rangeOp._rmax)); - } - } + readImage(image.get(), rangeOp); + modifyImage(image.get(),ScaleOperator(1.0f/rangeOp._rmax)); } @@ -1035,11 +1054,73 @@ osg::Image* readRaw(int sizeX, int sizeY, int sizeZ, int numberBytesPerComponent } +enum ColourSpaceOperation +{ + NO_COLOUR_SPACE_OPERATION, + MODULATE_ALPHA_BY_LUMINANCE, + MODULATE_ALPHA_BY_COLOUR, + REPLACE_ALPHA_WITH_LUMINACE +}; + +struct ModulatAlphaByLuminanceOperator +{ + ModulatAlphaByLuminanceOperator() {} + + inline void luminance(float&) const {} + inline void alpha(float&) const {} + inline void luminance_alpha(float& l,float& a) const { a*= l; } + inline void rgb(float&,float&,float&) const {} + inline void rgba(float& r,float& g,float& b,float& a) const { float l = (r+g+b)*0.3333333; a *= l;} +}; + +struct ModulatAlphaByColourOperator +{ + ModulatAlphaByColourOperator(const osg::Vec4& colour):_colour(colour) { _lum = _colour.length(); } + + osg::Vec4 _colour; + float _lum; + + inline void luminance(float&) const {} + inline void alpha(float&) const {} + inline void luminance_alpha(float& l,float& a) const { a*= l*_lum; } + inline void rgb(float&,float&,float&) const {} + inline void rgba(float& r,float& g,float& b,float& a) const { a = (r*_colour.red()+g*_colour.green()+b*_colour.blue()+a*_colour.alpha()); } +}; + +struct ReplaceAlphaWithLuminanceOperator +{ + ReplaceAlphaWithLuminanceOperator() {} + + inline void luminance(float&) const {} + inline void alpha(float&) const {} + inline void luminance_alpha(float& l,float& a) const { a= l; } + inline void rgb(float&,float&,float&) const { } + inline void rgba(float& r,float& g,float& b,float& a) const { float l = (r+g+b)*0.3333333; a = l; } +}; + +void doColourSpaceConversion(ColourSpaceOperation op, osg::Image* image, osg::Vec4& colour) +{ + switch(op) + { + case (MODULATE_ALPHA_BY_LUMINANCE): + std::cout<<"doing conversion MODULATE_ALPHA_BY_LUMINANCE"<addCommandLineOption("--compressed-dxt1","Enable the usage of S3TC DXT1 compressed textures"); arguments.getApplicationUsage()->addCommandLineOption("--compressed-dxt3","Enable the usage of S3TC DXT3 compressed textures"); arguments.getApplicationUsage()->addCommandLineOption("--compressed-dxt5","Enable the usage of S3TC DXT5 compressed textures"); + arguments.getApplicationUsage()->addCommandLineOption("--modulate-alpha-by-luminance","For each pixel multiple the alpha value by the luminance."); + arguments.getApplicationUsage()->addCommandLineOption("--replace-alpha-with-luminance","For each pixel mSet the alpha value to the luminance"); // arguments.getApplicationUsage()->addCommandLineOption("--raw ","read a raw image data"); // construct the viewer. @@ -1132,6 +1215,15 @@ int main( int argc, char **argv ) while(arguments.read("--compressed-dxt3")) { internalFormatMode = osg::Texture::USE_S3TC_DXT3_COMPRESSION; } while(arguments.read("--compressed-dxt5")) { internalFormatMode = osg::Texture::USE_S3TC_DXT5_COMPRESSION; } + + // set up colour space operation. + ColourSpaceOperation colourSpaceOperation = NO_COLOUR_SPACE_OPERATION; + osg::Vec4 colourModulate(0.25f,0.25f,0.25f,0.25f); + while(arguments.read("--modulate-alpha-by-luminance")) { colourSpaceOperation = MODULATE_ALPHA_BY_LUMINANCE; } + while(arguments.read("--modulate-alpha-by-colour", colourModulate.x(),colourModulate.y(),colourModulate.z(),colourModulate.w() )) { colourSpaceOperation = MODULATE_ALPHA_BY_COLOUR; } + while(arguments.read("--replace-alpha-with-luminance")) { colourSpaceOperation = REPLACE_ALPHA_WITH_LUMINACE; } + + osg::ref_ptr image_3d; int sizeX, sizeY, sizeZ, numberBytesPerComponent, numberOfComponents; @@ -1183,6 +1275,11 @@ int main( int argc, char **argv ) if (!image_3d) return 0; + if (colourSpaceOperation!=NO_COLOUR_SPACE_OPERATION) + { + doColourSpaceConversion(colourSpaceOperation, image_3d.get(), colourModulate); + } + osg::ref_ptr normalmap_3d = createNormalMap ? createNormalMapTexture(image_3d.get()) : 0;