00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include "../common/exceptions/WPreconditionNotMet.h"
00026
00027 #include "WGETexture.h"
00028
00029 #include "WGETextureUtils.h"
00030
00031 void wge::unbindTexture( osg::ref_ptr< osg::Node > node, size_t unit, size_t count )
00032 {
00033 for( size_t i = unit; i < unit + count; ++i )
00034 {
00035 node->getOrCreateStateSet()->removeTextureAttribute( i, osg::StateAttribute::TEXTURE );
00036 node->getOrCreateStateSet()->removeTextureAttribute( i, osg::StateAttribute::TEXMAT );
00037 }
00038 }
00039
00040 size_t wge::getMaxTexUnits()
00041 {
00042
00043
00044
00045
00046 return 8;
00047 }
00048
00049 osg::ref_ptr< WGETexture< osg::Texture1D > > wge::genWhiteNoiseTexture( size_t sizeX, size_t channels )
00050 {
00051
00052 osg::ref_ptr< WGETexture1D > randTexture = new WGETexture1D( genWhiteNoiseImage( sizeX, 1, 1, channels ) );
00053 randTexture->setTextureWidth( sizeX );
00054 randTexture->setFilter( osg::Texture1D::MIN_FILTER, osg::Texture1D::NEAREST );
00055 randTexture->setFilter( osg::Texture1D::MAG_FILTER, osg::Texture1D::NEAREST );
00056 randTexture->setWrap( osg::Texture1D::WRAP_S, osg::Texture1D::REPEAT );
00057
00058 return randTexture;
00059 }
00060
00061 osg::ref_ptr< WGETexture< osg::Texture2D > > wge::genWhiteNoiseTexture( size_t sizeX, size_t sizeY, size_t channels )
00062 {
00063 osg::ref_ptr< WGETexture2D > randTexture = new WGETexture2D( genWhiteNoiseImage( sizeX, sizeY, 1, channels ) );
00064 randTexture->setTextureWidth( sizeX );
00065 randTexture->setTextureHeight( sizeY );
00066 randTexture->setFilter( osg::Texture2D::MIN_FILTER, osg::Texture2D::NEAREST );
00067 randTexture->setFilter( osg::Texture2D::MAG_FILTER, osg::Texture2D::NEAREST );
00068 randTexture->setWrap( osg::Texture2D::WRAP_S, osg::Texture2D::REPEAT );
00069 randTexture->setWrap( osg::Texture2D::WRAP_T, osg::Texture2D::REPEAT );
00070
00071 return randTexture;
00072 }
00073
00074 osg::ref_ptr< WGETexture< osg::Texture3D > > wge::genWhiteNoiseTexture( size_t sizeX, size_t sizeY, size_t sizeZ, size_t channels )
00075 {
00076 osg::ref_ptr< WGETexture3D > randTexture = new WGETexture3D( genWhiteNoiseImage( sizeX, sizeY, sizeZ, channels ) );
00077 randTexture->setTextureWidth( sizeX );
00078 randTexture->setTextureHeight( sizeY );
00079 randTexture->setTextureDepth( sizeZ );
00080 randTexture->setFilter( osg::Texture2D::MIN_FILTER, osg::Texture2D::NEAREST );
00081 randTexture->setFilter( osg::Texture2D::MAG_FILTER, osg::Texture2D::NEAREST );
00082 randTexture->setWrap( osg::Texture2D::WRAP_S, osg::Texture2D::REPEAT );
00083 randTexture->setWrap( osg::Texture2D::WRAP_T, osg::Texture2D::REPEAT );
00084 randTexture->setWrap( osg::Texture2D::WRAP_R, osg::Texture2D::REPEAT );
00085
00086 return randTexture;
00087 }
00088
00089 osg::ref_ptr< osg::Image > wge::genWhiteNoiseImage( size_t sizeX, size_t sizeY, size_t sizeZ, size_t channels )
00090 {
00091 WPrecond( ( channels == 1 ) || ( channels == 3 ) || ( channels == 4 ), "Invalid number of channels. Valid are: 1, 3 and 4." );
00092
00093
00094 std::srand( time( 0 ) );
00095 osg::ref_ptr< osg::Image > randImage = new osg::Image();
00096 GLenum type = GL_LUMINANCE;
00097 if( channels == 3 )
00098 {
00099 type = GL_RGB;
00100 }
00101 else if( channels == 4 )
00102 {
00103 type = GL_RGBA;
00104 }
00105 randImage->allocateImage( sizeX, sizeY, sizeZ, type, GL_UNSIGNED_BYTE );
00106 unsigned char *randomLuminance = randImage->data();
00107 for( size_t i = 0; i < channels * sizeX * sizeY * sizeZ; ++i )
00108 {
00109
00110 unsigned char r = static_cast< unsigned char >( std::rand() % 255 );
00111 randomLuminance[ i ] = r;
00112 }
00113
00114 return randImage;
00115 }
00116