void ImageHFApp::updateData( ImageHFApp::ColorSwitch whichColor ) { Surface32f::Iter pixelIter = mImage.getIter(); auto vertPosIter = mVboMesh->mapAttrib3f( geom::POSITION ); auto vertColorIter = mVboMesh->mapAttrib3f( geom::COLOR ); while( pixelIter.line() ) { while( pixelIter.pixel() ) { Color color( pixelIter.r(), pixelIter.g(), pixelIter.b() ); float height; const float muteColor = 0.2f; // calculate the height based on a weighted average of the RGB, and emphasize either the red green or blue color in each of those modes switch( whichColor ) { case kColor: height = color.dot( Color( 0.3333f, 0.3333f, 0.3333f ) ); break; case kRed: height = color.dot( Color( 1, 0, 0 ) ); color *= Color( 1, muteColor, muteColor ); break; case kGreen: height = color.dot( Color( 0, 1, 0 ) ); color *= Color( muteColor, 1, muteColor ); break; case kBlue: height = color.dot( Color( 0, 0, 1 ) ); color *= Color( muteColor, muteColor, 1 ); break; } // the x and the z coordinates correspond to the pixel's x & y float x = pixelIter.x() - mWidth / 2.0f; float z = pixelIter.y() - mHeight / 2.0f; *vertPosIter++ = vec3( x, height * 30.0f, z ); *vertColorIter++ = vec3( color.r, color.g, color.b ); } } vertPosIter.unmap(); vertColorIter.unmap(); }
void BasicApp::updateData( BasicApp::ColorSwitch whichColor ) { Surface32f::Iter pixelIter = mImage.getIter(); dx::VboMesh::VertexIter vertexIter( mVboMesh ); while( pixelIter.line() ) { while( pixelIter.pixel() ) { Color color( pixelIter.r(), pixelIter.g(), pixelIter.b() ); float height; const float muteColor = 0.2f; // calculate the height based on a weighted average of the RGB, and emphasize either the red green or blue color in each of those modes switch( whichColor ) { case kColor: height = color.dot( Color( 0.3333f, 0.3333f, 0.3333f ) ); break; case kRed: height = color.dot( Color( 1, 0, 0 ) ); color *= Color( 1, muteColor, muteColor ); break; case kGreen: height = color.dot( Color( 0, 1, 0 ) ); color *= Color( muteColor, 1, muteColor ); break; case kBlue: height = color.dot( Color( 0, 0, 1 ) ); color *= Color( muteColor, muteColor, 1 ); break; } // the x and the z coordinates correspond to the pixel's x & y float x = pixelIter.x() - mWidth / 2.0f; float z = pixelIter.y() - mHeight / 2.0f; vertexIter.setPosition( x, height * 60.0f, z ); vertexIter.setColorRGB( color ); ++vertexIter; } } }
void triMeshApp::updateData() { Surface32f::Iter pixelIter = m_hfImage.getIter(); gl::VboMesh::VertexIter vertexIter( mVBOHeightfield ); while( pixelIter.line() ) { while( pixelIter.pixel() ) { Color color( pixelIter.r(), pixelIter.g(), pixelIter.b() ); float height; height = color.dot( Color( 0.3333f, 0.3333f, 0.3333f ) ); // the x and the z coordinates correspond to the pixel's x & y float x = (pixelIter.x() - m_hfImage.getWidth() / 2.0f); float z = (pixelIter.y() - m_hfImage.getHeight() / 2.0f); vertexIter.setPosition( x * HF_SCALE, height * HF_SCALEY, z * HF_SCALE); vertexIter.setColorRGB( color ); ++vertexIter; } } }
void RepulsionApp::setFboPositions( gl::Fbo &fbo ) { Surface32f pos( fbo.getTexture() ); Surface32f::Iter it = pos.getIter(); while( it.line() ){ while( it.pixel() ){ Vec3f r = mRoom.getRandRoomPos(); float mass = Rand::randFloat( 20.0f, 30.0f ); if( Rand::randFloat() < 0.05f ) mass = Rand::randFloat( 50.0f, 60.0f ); if( it.y() < 5 && it.x() < 50 ) mass = Rand::randFloat( 300.0f, 5000.0f ); else mass = Rand::randFloat( 50.0f, 300.0f ); it.r() = r.x; it.g() = r.y; it.b() = r.z; it.a() = 100.0f; } } gl::Texture posTexture( pos ); posTexture.bind(); gl::setMatricesWindow( mFboSize, false ); gl::setViewport( mFboBounds ); fbo.bindFramebuffer(); mPosInitShader.bind(); mPosInitShader.uniform( "initTex", 0 ); gl::drawSolidRect( mFboBounds ); mPosInitShader.unbind(); fbo.unbindFramebuffer(); }
void millionParticlesApp::setup() { gl::clear(); try { mPosShader = gl::GlslProg(ci::app::loadResource(POS_VS),ci::app::loadResource(POS_FS)); mVelShader = gl::GlslProg(ci::app::loadResource(VEL_VS),ci::app::loadResource(VEL_FS)); } catch( gl::GlslProgCompileExc &exc ) { std::cout << "Shader compile error: " << std::endl; std::cout << exc.what(); } catch( ... ) { std::cout << "Unable to load shader" << std::endl; } //controls mDrawTextures = false; mIsFullScreen = false; mFrameCounter = 0; mPerlin = Perlin(32,clock() * .1f); //initialize buffer Surface32f mPosSurface = Surface32f(PARTICLES,PARTICLES,true); Surface32f mVelSurface = Surface32f(PARTICLES,PARTICLES,true); Surface32f mInfoSurface = Surface32f(PARTICLES,PARTICLES,true); Surface32f mNoiseSurface = Surface32f(PARTICLES,PARTICLES,true); Surface32f::Iter iterator = mPosSurface.getIter(); while(iterator.line()) { while(iterator.pixel()) { mVertPos = Vec3f(Rand::randFloat(getWindowWidth()) / (float)getWindowWidth(), Rand::randFloat(getWindowHeight()) / (float)getWindowHeight(),0.0f); //velocity Vec2f vel = Vec2f(Rand::randFloat(-.005f,.005f),Rand::randFloat(-.005f,.005f)); float nX = iterator.x() * 0.005f; float nY = iterator.y() * 0.005f; float nZ = app::getElapsedSeconds() * 0.1f; Vec3f v( nX, nY, nZ ); float noise = mPerlin.fBm( v ); float angle = noise * 15.0f ; //vel = Vec3f( cos( angle ) * 6.28f, cos( angle ) * 6.28f, 0.0f ); //noise mNoiseSurface.setPixel(iterator.getPos(), Color( cos( angle ) * Rand::randFloat(.00005f,.0002f), sin( angle ) * Rand::randFloat(.00005f,.0002f), 0.0f )); //position + mass mPosSurface.setPixel(iterator.getPos(), ColorA(mVertPos.x,mVertPos.y,mVertPos.z, Rand::randFloat(.00005f,.0002f))); //forces + decay mVelSurface.setPixel(iterator.getPos(), Color(vel.x,vel.y, Rand::randFloat(.01f,1.00f))); //particle age mInfoSurface.setPixel(iterator.getPos(), ColorA(Rand::randFloat(.007f,1.0f), 1.0f,0.00f,1.00f)); } } //gl texture settings gl::Texture::Format tFormat; tFormat.setInternalFormat(GL_RGBA16F_ARB); gl::Texture::Format tFormatSmall; tFormat.setInternalFormat(GL_RGBA8); mSpriteTex = gl::Texture( loadImage( loadResource( "point.png" ) ), tFormatSmall); mNoiseTex = gl::Texture(mNoiseSurface, tFormatSmall); mNoiseTex.setWrap( GL_REPEAT, GL_REPEAT ); mNoiseTex.setMinFilter( GL_NEAREST ); mNoiseTex.setMagFilter( GL_NEAREST ); mPosTex = gl::Texture(mPosSurface, tFormat); mPosTex.setWrap( GL_REPEAT, GL_REPEAT ); mPosTex.setMinFilter( GL_NEAREST ); mPosTex.setMagFilter( GL_NEAREST ); mVelTex = gl::Texture(mVelSurface, tFormat); mVelTex.setWrap( GL_REPEAT, GL_REPEAT ); mVelTex.setMinFilter( GL_NEAREST ); mVelTex.setMagFilter( GL_NEAREST ); mInfoTex = gl::Texture(mInfoSurface, tFormatSmall); mInfoTex.setWrap( GL_REPEAT, GL_REPEAT ); mInfoTex.setMinFilter( GL_NEAREST ); mInfoTex.setMagFilter( GL_NEAREST ); //initialize fbo gl::Fbo::Format format; format.enableDepthBuffer(false); format.enableColorBuffer(true, 3); format.setMinFilter( GL_NEAREST ); format.setMagFilter( GL_NEAREST ); format.setWrap(GL_CLAMP,GL_CLAMP); format.setColorInternalFormat( GL_RGBA16F_ARB ); mFbo[0] = gl::Fbo(PARTICLES,PARTICLES, format); mFbo[1] = gl::Fbo(PARTICLES,PARTICLES, format); initFBO(); //fill dummy fbo vector<Vec2f> texCoords; vector<Vec3f> vertCoords, normCoords; vector<uint32_t> indices; gl::VboMesh::Layout layout; layout.setStaticIndices(); layout.setStaticPositions(); layout.setStaticTexCoords2d(); layout.setStaticNormals(); mVbo = gl::VboMesh(PARTICLES*PARTICLES,PARTICLES*PARTICLES,layout,GL_POINTS); for (int x = 0; x < PARTICLES; ++x) { for (int y = 0; y < PARTICLES; ++y) { indices.push_back( x * PARTICLES + y); texCoords.push_back( Vec2f( x/(float)PARTICLES, y/(float)PARTICLES)); } } mVbo.bufferIndices(indices); mVbo.bufferTexCoords2d(0, texCoords); }