void Fluid2DTextureApp::draw() { // clear out the window with black gl::clear( Color( 0, 0, 0 ) ); gl::setMatricesWindow( getWindowWidth(), getWindowHeight() ); // Update the positions and tex coords Rectf drawRect = getWindowBounds(); int limX = mFluid2D.resX() - 1; int limY = mFluid2D.resY() - 1; float dx = drawRect.getWidth()/(float)limX; float dy = drawRect.getHeight()/(float)limY; for( int j = 0; j < mFluid2D.resY(); ++j ) { for( int i = 0; i < mFluid2D.resX(); ++i ) { vec2 P = vec2( i*dx, j*dy ); vec2 uv = mFluid2D.texCoordAt( i, j ); int idx = j*mFluid2D.resX() + i; mTriMesh->getPositions<2>()[idx] = P; mTriMesh->getTexCoords0<2>()[idx] = uv; } } mTex->bind(); gl::bindStockShader( gl::ShaderDef().color().texture() ); gl::draw( gl::VboMesh::create(*mTriMesh) ); mTex->unbind(); mParams.draw(); }
void Fluid2DTextureApp::draw() { // clear out the window with black gl::clear( Color( 0, 0, 0 ) ); gl::setMatricesWindow( getWindowWidth(), getWindowHeight() ); // Update the positions and tex coords Rectf drawRect = getWindowBounds(); int limX = mFluid2D.resX() - 1; int limY = mFluid2D.resY() - 1; float dx = drawRect.getWidth()/(float)limX; float dy = drawRect.getHeight()/(float)limY; for( int j = 0; j < mFluid2D.resY(); ++j ) { for( int i = 0; i < mFluid2D.resX(); ++i ) { Vec2f P = Vec2f( i*dx, j*dy ); Vec2f uv = mFluid2D.texCoordAt( i, j ); int idx = j*mFluid2D.resX() + i; mTriMesh.getVertices()[idx] = P; mTriMesh.getTexCoords()[idx] = uv; } } mTex.bind(); gl::draw( mTriMesh ); mTex.unbind(); mParams.draw(); }
void Fluid2DParticlesApp::touchesMoved( TouchEvent event ) { float s = 10; const std::vector<TouchEvent::Touch>& touches = event.getTouches(); for( std::vector<TouchEvent::Touch>::const_iterator cit = touches.begin(); cit != touches.end(); ++cit ) { if( mTouchColors.find( cit->getId() ) == mTouchColors.end() ) continue; vec2 prevPos = cit->getPrevPos(); vec2 pos = cit->getPos(); float x = (pos.x/(float)getWindowWidth())*mFluid2D.resX(); float y = (pos.y/(float)getWindowHeight())*mFluid2D.resY(); vec2 dv = pos - prevPos; mFluid2D.splatVelocity( x, y, mVelScale*dv ); mFluid2D.splatRgb( x, y, mRgbScale*mTouchColors[cit->getId()] ); if( mFluid2D.isBuoyancyEnabled() ) { mFluid2D.splatDensity( x, y, mDenScale ); } for( int i = 0; i < 5; ++i ) { vec2 partPos = pos + vec2( Rand::randFloat( -s, s ), Rand::randFloat( -s, s ) ); float life = Rand::randFloat( 3.0f, 6.0f ); mParticles.append( Particle( partPos, life, mTouchColors[cit->getId()] ) ); } } }
void Fluid2DBasicApp::draw() { // clear out the window with black gl::clear( Color( 0, 0, 0 ) ); Channel32f chan( mFluid2D.resX(), mFluid2D.resY(), mFluid2D.resX()*sizeof(float), 1, const_cast<float*>( mFluid2D.density().data() ) ); if( ! mTex ) { mTex = gl::Texture( chan ); } else { mTex.update( chan ); } gl::color( Color( 1, 1, 1 ) ); gl::draw( mTex, getWindowBounds() ); mParams.draw(); }
void Fluid2DRGBApp::draw() { // clear out the window with black gl::clear( Color( 0, 0, 0 ) ); //RenderFluidRgb( mFluid2D, getWindowBounds() ); float* data = const_cast<float*>( (float*)mFluid2D.rgb().data() ); Surface32f surf( data, mFluid2D.resX(), mFluid2D.resY(), mFluid2D.resX()*sizeof(Colorf), SurfaceChannelOrder::RGB ); if ( ! mTex ) { mTex = gl::Texture::create( surf ); } else { mTex->update( surf ); } gl::draw( mTex, getWindowBounds() ); mParams.draw(); }
void Fluid2DCamAppApp::mouseDrag( MouseEvent event ) { float x = (event.getX()/(float)getWindowWidth())*mFluid2D.resX(); float y = (event.getY()/(float)getWindowHeight())*mFluid2D.resY(); if( event.isLeftDown() ) { Vec2f dv = event.getPos() - mPrevPos; mFluid2D.splatVelocity( x, y, mVelScale*dv ); mFluid2D.splatDensity( x, y, mDenScale ); } mPrevPos = event.getPos(); }
void Fluid2DBasicApp::touchesMoved( TouchEvent event ) { const std::vector<TouchEvent::Touch>& touches = event.getTouches(); for( std::vector<TouchEvent::Touch>::const_iterator cit = touches.begin(); cit != touches.end(); ++cit ) { Vec2f prevPos = cit->getPrevPos(); Vec2f pos = cit->getPos(); float x = (pos.x/(float)getWindowWidth())*mFluid2D.resX(); float y = (pos.y/(float)getWindowHeight())*mFluid2D.resY(); Vec2f dv = pos - prevPos; mFluid2D.splatVelocity( x, y, mVelScale*dv ); mFluid2D.splatDensity( x, y, mDenScale ); } }
void Fluid2DParticlesApp::setup() { glEnable( GL_TEXTURE_2D ); gl::enableAlphaBlending(); gl::enableAdditiveBlending(); mRgbScale = 50; mDenScale = 50; mFluid2D.set( 192, 192 ); mFluid2D.setDensityDissipation( 0.99f ); mFluid2D.setRgbDissipation( 0.99f ); mVelScale = 3.0f*std::max( mFluid2D.resX(), mFluid2D.resY() ); mParams = params::InterfaceGl( "Params", ivec2( 300, 400 ) ); mParams.addParam( "Stam Step", mFluid2D.stamStepAddr() ); mParams.addSeparator(); mParams.addParam( "Velocity Input Scale", &mVelScale, "min=0 max=10000 step=1" ); mParams.addParam( "Density Input Scale", &mDenScale, "min=0 max=1000 step=1" ); mParams.addParam( "Rgb Input Scale", &mRgbScale, "min=0 max=1000 step=1" ); mParams.addSeparator(); mParams.addParam( "Velocity Dissipation", mFluid2D.velocityDissipationAddr(), "min=0.0001 max=1 step=0.0001" ); mParams.addParam( "Density Dissipation", mFluid2D.densityDissipationAddr(), "min=0.0001 max=1 step=0.0001" ); mParams.addParam( "Rgb Dissipation", mFluid2D.rgbDissipationAddr(), "min=0.0001 max=1 step=0.0001" ); mParams.addSeparator(); mParams.addParam( "Velocity Viscosity", mFluid2D.velocityViscosityAddr(), "min=0.000001 max=10 step=0.000001" ); mParams.addParam( "Density Viscosity", mFluid2D.densityViscosityAddr(), "min=0.000001 max=10 step=0.000001" ); mParams.addParam( "Rgb Viscosity", mFluid2D.rgbViscosityAddr(), "min=0.000001 max=10 step=0.000001" ); mParams.addSeparator(); mParams.addSeparator(); mParams.addParam( "Vorticity Confinement", mFluid2D.enableVorticityConfinementAddr() ); mParams.addSeparator(); std::vector<std::string> boundaries; boundaries.push_back( "None" ); boundaries.push_back( "Wall" ); boundaries.push_back( "Wrap" ); mParams.addParam( "Boundary Type", boundaries, mFluid2D.boundaryTypeAddr() ); mParams.addSeparator(); mParams.addParam( "Enable Buoyancy", mFluid2D.enableBuoyancyAddr() ); mParams.addParam( "Buoyancy Scale", mFluid2D.buoyancyScaleAddr(), "min=0 max=100 step=0.001" ); mParams.addParam( "Vorticity Scale", mFluid2D.vorticityScaleAddr(), "min=0 max=1 step=0.001" ); mFluid2D.setDt( 0.1f ); mFluid2D.enableDensity(); mFluid2D.enableRgb(); mFluid2D.enableVorticityConfinement(); mParticles.setup( getWindowBounds(), &mFluid2D ); }
void Fluid2DTextureApp::mouseDrag( MouseEvent event ) { float x = (event.getX()/(float)getWindowWidth())*mFluid2D.resX(); float y = (event.getY()/(float)getWindowHeight())*mFluid2D.resY(); if( event.isLeftDown() ) { vec2 dv = vec2( event.getPos() ) - mPrevPos; mFluid2D.splatVelocity( x, y, mVelScale*dv ); if( mFluid2D.isBuoyancyEnabled() ) { mFluid2D.splatDensity( x, y, mDenScale ); } } mPrevPos = event.getPos(); }
void Fluid2DParticleSoupApp::mouseDrag( MouseEvent event ) { float x = (event.getX()/(float)getWindowWidth())*mFluid2D.resX(); float y = (event.getY()/(float)getWindowHeight())*mFluid2D.resY(); if( event.isLeftDown() ) { Vec2f dv = event.getPos() - mPrevPos; mFluid2D.splatVelocity( x, y, mVelScale*dv ); mFluid2D.splatRgb( x, y, mRgbScale*mColor ); if( mFluid2D.isBuoyancyEnabled() ) { mFluid2D.splatDensity( x, y, mDenScale ); } } mPrevPos = event.getPos(); }
void Fluid2DParticleSoupApp::touchesMoved( TouchEvent event ) { const std::vector<TouchEvent::Touch>& touches = event.getTouches(); for( std::vector<TouchEvent::Touch>::const_iterator cit = touches.begin(); cit != touches.end(); ++cit ) { vec2 prevPos = cit->getPrevPos(); vec2 pos = cit->getPos(); float x = (pos.x/(float)getWindowWidth())*mFluid2D.resX(); float y = (pos.y/(float)getWindowHeight())*mFluid2D.resY(); vec2 dv = pos - prevPos; mFluid2D.splatVelocity( x, y, mVelScale*dv ); mFluid2D.splatRgb( x, y, mRgbScale*mColor ); if( mFluid2D.isBuoyancyEnabled() ) { mFluid2D.splatDensity( x, y, mDenScale ); } } }
void Fluid2DParticleSoupApp::setup() { glEnable( GL_TEXTURE_2D ); mDenScale = 50; mRgbScale = 40; mFluid2D.set( 192, 192 ); mFluid2D.setDensityDissipation( 0.99f ); mFluid2D.setRgbDissipation( 0.99f ); mVelScale = 3.0f*std::max( mFluid2D.resX(), mFluid2D.resY() ); mParams = params::InterfaceGl( "Params", Vec2i( 300, 400 ) ); mParams.addParam( "Stam Step", mFluid2D.stamStepAddr() ); mParams.addSeparator(); mParams.addParam( "Velocity Input Scale", &mVelScale, "min=0 max=10000 step=1" ); mParams.addParam( "Density Input Scale", &mDenScale, "min=0 max=1000 step=1" ); mParams.addParam( "Rgb Input Scale", &mRgbScale, "min=0 max=1000 step=1" ); mParams.addSeparator(); mParams.addParam( "Velocity Dissipation", mFluid2D.velocityDissipationAddr(), "min=0.0001 max=1 step=0.0001" ); mParams.addParam( "Density Dissipation", mFluid2D.densityDissipationAddr(), "min=0.0001 max=1 step=0.0001" ); mParams.addParam( "Rgb Dissipation", mFluid2D.rgbDissipationAddr(), "min=0.0001 max=1 step=0.0001" ); mParams.addSeparator(); mParams.addParam( "Velocity Viscosity", mFluid2D.velocityViscosityAddr(), "min=0.000001 max=10 step=0.000001" ); mParams.addParam( "Density Viscosity", mFluid2D.densityViscosityAddr(), "min=0.000001 max=10 step=0.000001" ); mParams.addParam( "Rgb Viscosity", mFluid2D.rgbViscosityAddr(), "min=0.000001 max=10 step=0.000001" ); mParams.addSeparator(); mParams.addParam( "Vorticity Confinement", mFluid2D.enableVorticityConfinementAddr() ); mParams.addSeparator(); std::vector<std::string> boundaries; boundaries.push_back( "None" ); boundaries.push_back( "Wall" ); boundaries.push_back( "Wrap" ); mParams.addParam( "Boundary Type", boundaries, mFluid2D.boundaryTypeAddr() ); mParams.addSeparator(); mParams.addParam( "Enable Buoyancy", mFluid2D.enableBuoyancyAddr() ); mParams.addParam( "Buoyancy Scale", mFluid2D.buoyancyScaleAddr(), "min=0 max=100 step=0.001" ); mParams.addParam( "Vorticity Scale", mFluid2D.vorticityScaleAddr(), "min=0 max=1 step=0.001" ); mFluid2D.setRgbDissipation( 0.9930f ); mFluid2D.enableDensity(); mFluid2D.enableRgb(); mFluid2D.enableVorticityConfinement(); mFluid2D.initSimData(); mParticleSoup.setup( &mFluid2D ); mColor = Colorf( 0.98f, 0.7f, 0.4f ); }
void Fluid2DParticlesApp::mouseDrag( MouseEvent event ) { float x = (event.getX()/(float)getWindowWidth())*mFluid2D.resX(); float y = (event.getY()/(float)getWindowHeight())*mFluid2D.resY(); float s = 10; if( event.isLeftDown() ) { vec2 dv = vec2( event.getPos() ) - mPrevPos; mFluid2D.splatVelocity( x, y, mVelScale*dv ); mFluid2D.splatRgb( x, y, mRgbScale*mColor ); if( mFluid2D.isBuoyancyEnabled() ) { mFluid2D.splatDensity( x, y, mDenScale ); } // for( int i = 0; i < 10; ++i ) { vec2 partPos = vec2( event.getPos() ) + vec2( Rand::randFloat( -s, s ), Rand::randFloat( -s, s ) ); float life = Rand::randFloat( 2.0f, 4.0f ); mParticles.append( Particle( partPos, life, mColor ) ); } } mPrevPos = event.getPos(); }
void Fluid2DTextureApp::setup() { mFrameRate = 0.0f; mTex = gl::Texture::create( loadImage( loadResource( RES_IMAGE ) ) ); mFluid2D.enableTexCoord(); mFluid2D.setTexCoordViscosity( 1.0f ); mDenScale = 50; mFluid2D.set( 192, 192 ); mFluid2D.setDensityDissipation( 0.99f ); mVelScale = 0.50f*std::max( mFluid2D.resX(), mFluid2D.resY() ); mParams = params::InterfaceGl( "Params", ivec2( 300, 400 ) ); mParams.addParam( "Stam Step", mFluid2D.stamStepAddr() ); mParams.addSeparator(); mParams.addParam( "Velocity Input Scale", &mVelScale, "min=0 max=10000 step=1" ); mParams.addParam( "Density Input Scale", &mDenScale, "min=0 max=1000 step=1" ); mParams.addSeparator(); mParams.addParam( "Velocity Dissipation", mFluid2D.velocityDissipationAddr(), "min=0.0001 max=1 step=0.0001" ); mParams.addParam( "Density Dissipation", mFluid2D.densityDissipationAddr(), "min=0.0001 max=1 step=0.0001" ); mParams.addParam( "TexCoord Dissipation", mFluid2D.texCoordDissipationAddr(), "min=0.0001 max=1 step=0.0001" ); mParams.addSeparator(); mParams.addParam( "Velocity Viscosity", mFluid2D.velocityViscosityAddr(), "min=0.000001 max=10 step=0.000001" ); mParams.addParam( "Density Viscosity", mFluid2D.densityViscosityAddr(), "min=0.000001 max=10 step=0.000001" ); mParams.addParam( "TexCoord Viscosity", mFluid2D.texCoordViscosityAddr(), "min=0.000001 max=10 step=0.000001" ); mParams.addSeparator(); //mParams.addParam( "Vorticity Confinement", mFluid2D.enableVorticityConfinementAddr() ); //mParams.addSeparator(); std::vector<std::string> boundaries; boundaries.push_back( "None" ); boundaries.push_back( "Wall" ); boundaries.push_back( "Wrap" ); mParams.addParam( "Boundary Type", boundaries, mFluid2D.boundaryTypeAddr() ); mParams.addSeparator(); mParams.addParam( "Enable Buoyancy", mFluid2D.enableBuoyancyAddr() ); mParams.addParam( "Buoyancy Scale", mFluid2D.buoyancyScaleAddr(), "min=0 max=100 step=0.001" ); mParams.addParam( "Vorticity Scale", mFluid2D.vorticityScaleAddr(), "min=0 max=1 step=0.001" ); mTriMesh = ci::TriMesh::create( TriMesh::Format().positions(2).texCoords0(2) ); // Points and texture coordinates for( int j = 0; j < mFluid2D.resY(); ++j ) { for( int i = 0; i < mFluid2D.resX(); ++i ) { mTriMesh->appendPosition( vec2( 0.0f, 0.0f ) ); mTriMesh->appendTexCoord0( vec2( 0.0f, 0.0f ) ); } } // Triangles for( int j = 0; j < mFluid2D.resY() - 1; ++j ) { for( int i = 0; i < mFluid2D.resX() - 1; ++i ) { int idx0 = (j + 0)*mFluid2D.resX() + (i + 0 ); int idx1 = (j + 1)*mFluid2D.resX() + (i + 0 ); int idx2 = (j + 1)*mFluid2D.resX() + (i + 1 ); int idx3 = (j + 0)*mFluid2D.resX() + (i + 1 ); mTriMesh->appendTriangle( idx0, idx1, idx2 ); mTriMesh->appendTriangle( idx0, idx2, idx3 ); } } //console() << mFluid2D << std::endl; }