28 #include <boost/random.hpp>
30 #include "../common/exceptions/WPreconditionNotMet.h"
32 #include "WGETexture.h"
34 #include "WGETextureUtils.h"
38 for(
size_t i = unit; i < unit + count; ++i )
40 node->getOrCreateStateSet()->removeTextureAttribute( i, osg::StateAttribute::TEXTURE );
41 node->getOrCreateStateSet()->removeTextureAttribute( i, osg::StateAttribute::TEXMAT );
58 randTexture->setTextureWidth( sizeX );
59 randTexture->setFilter( osg::Texture1D::MIN_FILTER, osg::Texture1D::NEAREST );
60 randTexture->setFilter( osg::Texture1D::MAG_FILTER, osg::Texture1D::NEAREST );
61 randTexture->setWrap( osg::Texture1D::WRAP_S, osg::Texture1D::REPEAT );
69 randTexture->setTextureWidth( sizeX );
70 randTexture->setTextureHeight( sizeY );
71 randTexture->setFilter( osg::Texture2D::MIN_FILTER, osg::Texture2D::NEAREST );
72 randTexture->setFilter( osg::Texture2D::MAG_FILTER, osg::Texture2D::NEAREST );
73 randTexture->setWrap( osg::Texture2D::WRAP_S, osg::Texture2D::REPEAT );
74 randTexture->setWrap( osg::Texture2D::WRAP_T, osg::Texture2D::REPEAT );
82 randTexture->setTextureWidth( sizeX );
83 randTexture->setTextureHeight( sizeY );
84 randTexture->setTextureDepth( sizeZ );
85 randTexture->setFilter( osg::Texture2D::MIN_FILTER, osg::Texture2D::NEAREST );
86 randTexture->setFilter( osg::Texture2D::MAG_FILTER, osg::Texture2D::NEAREST );
87 randTexture->setWrap( osg::Texture2D::WRAP_S, osg::Texture2D::REPEAT );
88 randTexture->setWrap( osg::Texture2D::WRAP_T, osg::Texture2D::REPEAT );
89 randTexture->setWrap( osg::Texture2D::WRAP_R, osg::Texture2D::REPEAT );
96 WPrecond( ( channels == 1 ) || ( channels == 3 ) || ( channels == 4 ),
"Invalid number of channels. Valid are: 1, 3 and 4." );
99 std::srand( time( 0 ) );
100 osg::ref_ptr< osg::Image > randImage =
new osg::Image();
101 GLenum type = GL_LUMINANCE;
106 else if( channels == 4 )
110 randImage->allocateImage( sizeX, sizeY, sizeZ, type, GL_UNSIGNED_BYTE );
111 unsigned char *randomLuminance = randImage->data();
112 for(
size_t i = 0; i < channels * sizeX * sizeY * sizeZ; ++i )
115 unsigned char r =
static_cast< unsigned char >( std::rand() % 255 );
116 randomLuminance[ i ] = r;
123 std::size_t sizeZ, std::size_t channels )
125 WPrecond( channels == 1 || channels == 3 || channels == 4,
"Invalid number of channels. Valid are: 1, 3 and 4." );
128 float const spotIrregularity = 0.05f;
129 std::size_t
const iterations = 200;
130 float const spotSize = 0.5;
131 float const spotFactor = ( 0.02f + 0.58f * ( 1.0f - spotSize ) ) / 15.0f;
132 float const d1 = 0.125f;
133 float const d2 = 0.03125f;
134 float const speed = 1.0f;
136 osg::ref_ptr< osg::Image > img =
new osg::Image;
137 GLenum type = GL_LUMINANCE;
142 else if( channels == 4 )
147 std::vector< float > concentration1( sizeX * sizeY * sizeZ, 4.0 );
148 std::vector< float > concentration2( sizeX * sizeY * sizeZ, 4.0 );
149 std::vector< float > delta1( sizeX * sizeY * sizeZ, 0.0 );
150 std::vector< float > delta2( sizeX * sizeY * sizeZ, 0.0 );
151 std::vector< float > noise( sizeX * sizeY * sizeZ );
153 boost::mt19937 generator( std::time( 0 ) );
155 float noiseRange = 0.1f + 4.9f * spotIrregularity;
157 boost::uniform_real< float > dist( 12.0 - noiseRange, 12.0 + noiseRange );
158 boost::variate_generator< boost::mt19937&, boost::uniform_real< float > > rand( generator, dist );
161 for( std::size_t i = 0; i < sizeX; ++i )
163 for( std::size_t j = 0; j < sizeY; ++j )
165 for( std::size_t k = 0; k < sizeZ; ++k )
167 std::size_t idx = i + j * sizeX + k * sizeX * sizeY;
168 noise[ idx ] = rand();
174 for( std::size_t iter = 0; iter < iterations; ++iter )
176 std::cout <<
"iterations: " << iter << std::endl;
178 for( std::size_t i = 0; i < sizeX; ++i )
180 std::size_t iNext = ( i + 1 ) % sizeX;
181 std::size_t iPrev = ( i + sizeX - 1 ) % sizeX;
183 for( std::size_t j = 0; j < sizeY; ++j )
185 std::size_t jNext = ( j + 1 ) % sizeY;
186 std::size_t jPrev = ( j + sizeY - 1 ) % sizeY;
188 for( std::size_t k = 0; k < sizeZ; ++k )
190 std::size_t kNext = ( k + 1 ) % sizeZ;
191 std::size_t kPrev = ( k + sizeZ - 1 ) % sizeZ;
193 std::size_t idx = i + j * sizeX + k * sizeX * sizeY;
198 dc1 += concentration1[ iPrev + j * sizeX + k * sizeX * sizeY ];
199 dc1 += concentration1[ iNext + j * sizeX + k * sizeX * sizeY ];
200 dc1 += concentration1[ i + jPrev * sizeX + k * sizeX * sizeY ];
201 dc1 += concentration1[ i + jNext * sizeX + k * sizeX * sizeY ];
202 dc1 += concentration1[ i + j * sizeX + kPrev * sizeX * sizeY ];
203 dc1 += concentration1[ i + j * sizeX + kNext * sizeX * sizeY ];
204 dc1 -= 6.0f * concentration1[ idx ];
207 dc2 += concentration2[ iPrev + j * sizeX + k * sizeX * sizeY ];
208 dc2 += concentration2[ iNext + j * sizeX + k * sizeX * sizeY ];
209 dc2 += concentration2[ i + jPrev * sizeX + k * sizeX * sizeY ];
210 dc2 += concentration2[ i + jNext * sizeX + k * sizeX * sizeY ];
211 dc2 += concentration2[ i + j * sizeX + kPrev * sizeX * sizeY ];
212 dc2 += concentration2[ i + j * sizeX + kNext * sizeX * sizeY ];
213 dc2 -= 6.0f * concentration2[ idx ];
216 delta1[ idx ] = spotFactor * ( 16.0f - concentration1[ idx ] * concentration2[ idx ] ) + d1 * dc1;
217 delta2[ idx ] = spotFactor * ( concentration1[ idx ] * concentration2[ idx ] - concentration2[ idx ] - noise[ idx ] ) + d2 * dc2;
222 for( std::size_t i = 0; i < sizeX; ++i )
224 for( std::size_t j = 0; j < sizeY; ++j )
226 for( std::size_t k = 0; k < sizeZ; ++k )
228 std::size_t idx = i + j * sizeX + k * sizeX * sizeY;
230 concentration1[ idx ] += speed * delta1[ idx ];
231 concentration2[ idx ] += speed * delta2[ idx ];
237 img->allocateImage( sizeX, sizeY, sizeZ, type, GL_UNSIGNED_BYTE );
240 float c1min = *std::min_element( concentration1.begin(), concentration1.end() );
241 float c1max = *std::max_element( concentration1.begin(), concentration1.end() );
244 for( std::size_t i = 0; i < sizeX; ++i )
246 for( std::size_t j = 0; j < sizeY; ++j )
248 for( std::size_t k = 0; k < sizeZ; ++k )
250 std::size_t idx = i + j * sizeX + k * sizeX * sizeY;
251 img->data()[ idx ] = 255.0f * ( concentration1[ idx ] - c1min ) / ( c1max - c1min );
This calls serves a simple purpose: have a texture and its scaling information together which allows ...
osg::ref_ptr< WGETexture< osg::Texture3D > > genTuringNoiseTexture(std::size_t sizeX, std::size_t sizeY, std::size_t sizeZ, std::size_t channels=1)
Generates a 3D turing noise texture.
osg::ref_ptr< WGETexture< osg::Texture1D > > genWhiteNoiseTexture(size_t sizeX, size_t channels)
This generates an 1D texture only containing white noise in its channels.
osg::ref_ptr< osg::Image > genWhiteNoiseImage(size_t sizeX, size_t sizeY, size_t sizeZ, size_t channels=1)
Generates an image only containing white noise in its channels.
size_t getMaxTexUnits()
Returns the maximum number of textures that can be bound to a node.
void unbindTexture(osg::ref_ptr< osg::Node > node, size_t unit, size_t count=1)
Removes the binding associated with the specified unit.