void UserManager::setBounds( const Rectf &rect ) { mOutputRect = rect; Rectf kRect( 0, 0, 640, 480 ); // kinect image rect Rectf dRect = kRect.getCenteredFit( mOutputRect, true ); if( mOutputRect.getAspectRatio() > dRect.getAspectRatio() ) dRect.scaleCentered( mOutputRect.getWidth() / dRect.getWidth() ); else dRect.scaleCentered( mOutputRect.getHeight() / dRect.getHeight() ); mOutputMapping = RectMapping( kRect, dRect, true ); }
Rectf getCoveringRect(gl::Texture texture, Area containerArea) { float scale; Rectf bounds = texture.getBounds(); bounds = bounds.getCenteredFit(containerArea, true); int container_h = containerArea.getHeight(), container_w = containerArea.getWidth(), texture_h = bounds.getHeight(), texture_w = bounds.getWidth(); if (abs(container_h - texture_h) > abs(container_w - texture_w)) scale = (float) container_h/texture_h; else scale = (float) container_w/texture_w; bounds.scaleCentered(scale + .05); return bounds; }
// Just create the latest thing void svvimApp::draw() { // SvvimLogo if (mSvvimLogoPng) mSvvimLogoPng.bind(0); // Mask if (mMaskTexture) mMaskTexture.bind(1); // if (mImageTexture) mImageTexture.bind(2); // Clear to black gl::clear(); /* if (mMaskTexture) { Area bounds = mMaskTexture.getBounds(); Area displayArea = getWindowBounds(); // displayArea.y1 = displayArea.y1 + displayArea.getHeight() * .05; // displayArea.y2 = displayArea.y2 - displayArea.getHeight() * .05; Rectf centeredRect = Rectf(mMaskTexture.getBounds()).getCenteredFit(displayArea, false); float coverAspectRatio = mMaskTexture.getAspectRatio(); float windowAspectRatio = getWindowAspectRatio(); if (coverAspectRatio > windowAspectRatio) { float scale = displayArea.getHeight()/centeredRect.getHeight(); centeredRect.scaleCentered(scale); } else { float scale = displayArea.getWidth()/centeredRect.getWidth(); centeredRect.scaleCentered(scale); } gl::draw(mMaskTexture, centeredRect); } */ // Draw pool-water background cover if (mImageTexture) { Area bounds = mImageTexture.getBounds(); Area displayArea = getWindowBounds(); displayArea.y1 = displayArea.y1 + displayArea.getHeight() * .05; displayArea.y2 = displayArea.y2 - displayArea.getHeight() * .05; Rectf centeredRect = Rectf(mImageTexture.getBounds()).getCenteredFit(displayArea, true); float coverAspectRatio = mImageTexture.getAspectRatio(); float windowAspectRatio = getWindowAspectRatio(); if (coverAspectRatio > windowAspectRatio) { float scale = displayArea.getHeight()/centeredRect.getHeight(); centeredRect.scaleCentered(scale); } else { float scale = displayArea.getWidth()/centeredRect.getWidth(); centeredRect.scaleCentered(scale); } gl::draw(mCurrentBgTexture, centeredRect); } if (mShader) { float displacement = 10. - min(mAlpha * 300.0, 10.0); mShader.bind(); mShader.uniform("displacement", displacement); mShader.uniform("maskTexture", 0); mShader.uniform("innerTexture", 2); mShader.uniform("fillColor", Vec3f(0.3, 0.3, 0.3)); mShader.uniform("bounds", Vec2f(getWindowWidth(), getWindowHeight())); mShader.uniform("alpha", 6 * mAlpha); } if (mSvvimLogoPng) { Rectf centeredRect = Rectf(mSvvimLogoPng.getBounds()).getCenteredFit(getWindowBounds(), true); Rectf topRect = centeredRect; gl::draw(mSvvimLogoPng, centeredRect); centeredRect.y1 -= 200; centeredRect.y2 -= 200; //gl::draw(mSvvimLogoPng, centeredRect); centeredRect.y1 += 400; centeredRect.y2 += 400; //gl::draw(mSvvimLogoPng, centeredRect); } if (mShader) mShader.unbind(); if (mMaskTexture) mMaskTexture.unbind(); if (mImageTexture) mImageTexture.unbind(); if (mSvvimLogoPng) mSvvimLogoPng.unbind(); }
void Grove::createMenuModal( const std::string &name, ci::Rectf *rect, ci::vec2 *offset, const WidgetRef &menu, const std::function<void()> &cancel, const std::function<void()> &confirm, bool adaptBackgroundColor ) { // create the layout Rectf fullRect = *rect; fullRect.include( vec2( fullRect.getCenter().x, fullRect.getLowerRight().y + 180 ) ); fullRect = fullRect.getCenteredFit( getWindowBounds(), false ); // get the window bounds #if defined( CINDER_COCOA_TOUCH ) Rectf windowBounds = toPixels( Rectf( vec2( 0.0f ), vec2( getWindowHeight(), getWindowWidth() ) ) ); #else Rectf windowBounds = toPixels( getWindowBounds() ); #endif // if the screen is really small, add some extra margins if( abs( fullRect.getWidth() - windowBounds.getWidth() ) < 300 ) fullRect.scaleCentered( (float) ( windowBounds.getWidth() - 300 ) / (float) fullRect.getWidth() ); if( abs( fullRect.getHeight() - windowBounds.getHeight() ) < 300 ) fullRect.scaleCentered( (float) ( windowBounds.getHeight() - 300 ) / (float) fullRect.getHeight() ); *rect = (*rect).getCenteredFit( fullRect, false ); (*rect).offset( vec2( 0.0f, -( fullRect.getHeight() - (*rect).getHeight() ) / 2.0f ) ); *offset = vec2( 0.0f, -fullRect.getLowerLeft().y ); auto fadeIn = [this](){ timeline().applyPtr( &mFogDensity, 1.0f, 2.0f, EaseInAtan() ); timeline().applyPtr( &mSunIntensity, 0.0f, 2.0f, EaseInAtan() ) .updateFn( [this](){ mTerrain->setFogDensity( mFogDensity ); mTerrain->setSunIntensity( mSunIntensity ); } ); }; auto fadeOut = [this](){ timeline().applyPtr( &mFogDensity, 0.129f, 6.0f, EaseOutAtan() ); timeline().applyPtr( &mSunIntensity, 0.166f, 6.0f, EaseOutAtan() ) .updateFn( [this](){ mTerrain->setFogDensity( mFogDensity ); mTerrain->setSunIntensity( mSunIntensity ); } ); }; // add events if( menu ){ menu->onPressed( name, [=]( WidgetEvent event ) { if( adaptBackgroundColor ) fadeIn(); mModal = true; event.getWidget()->close( true, event.getItem() ); // wait for the menu to close timeline().add( [=](){ timeline().applyPtr( offset, vec2(0), 1.0f, EaseInQuad() ) .finishFn( [=]() { vector<string> items; if( confirm ) items = { "ConfirmWire", "QuitWire" }; else items = { "QuitWire" }; mWidget = Widget::create( Widget::Format() .items( items ) .position( (*rect).getLowerLeft() + vec2( (*rect).getWidth() / 2 + ( confirm ? 69 : 0 ), ( fullRect.getHeight() - (*rect).getHeight() ) / 2 ) ) .autoClose( false ) ); mWidget->onClose( [=]( WidgetEvent event ){ timeline().applyPtr( offset, vec2( 0, -fullRect.getLowerLeft().y ), 1.0f, EaseOutQuad() ); if( adaptBackgroundColor ) fadeOut(); } ); mWidget->onCloseEnded( [=]( WidgetEvent event ){ mOpenMenuButton->open(); } ); if( confirm ){ mWidget->onPressed( "ConfirmWire", [=]( WidgetEvent event ) { event.getWidget()->close(); timeline().add( [=](){ mModal = false; }, timeline().getCurrentTime() + 1.5f ); confirm(); } ); } mWidget->onPressed( "QuitWire", [=]( WidgetEvent event ) { event.getWidget()->close(); timeline().add( [=](){ mModal = false; }, timeline().getCurrentTime() + 1.5f ); if( cancel ) cancel(); } ); } ); }, timeline().getCurrentTime() + 1.0f ); } ); } else { vector<string> items; if( confirm ) items = { "ConfirmWire", "QuitWire" }; else items = { "QuitWire" }; mWidget = Widget::create( Widget::Format() .items( items ) .position( (*rect).getLowerLeft() + vec2( (*rect).getWidth() / 2 + ( confirm ? 69 : 0 ), ( fullRect.getHeight() - (*rect).getHeight() ) / 2 ) ) .autoClose( false ) ); mWidget->onClose( [=]( WidgetEvent event ){ timeline().applyPtr( offset, vec2( 0, -fullRect.getLowerLeft().y ), 1.0f, EaseOutQuad() ); if( adaptBackgroundColor ) fadeOut(); } ); mWidget->onCloseEnded( [=]( WidgetEvent event ){ mOpenMenuButton->open(); } ); if( confirm ){ mWidget->onPressed( "ConfirmWire", [=]( WidgetEvent event ) { event.getWidget()->close(); timeline().add( [=](){ mModal = false; }, timeline().getCurrentTime() + 1.5f ); confirm(); } ); } mWidget->onPressed( "QuitWire", [=]( WidgetEvent event ) { event.getWidget()->close(); timeline().add( [=](){ mModal = false; }, timeline().getCurrentTime() + 1.5f ); if( cancel ) cancel(); } ); if( adaptBackgroundColor ) fadeIn(); mModal = true; timeline().applyPtr( offset, vec2(0), 1.0f, EaseInQuad() ); } }
void Gallery::Picture::render( const Rectf &rect ) { Rectf txtRect; Rectf outRect = rect; gl::pushModelView(); Vec2f flipScale( 1, 1 ); double currentTime = app::getElapsedSeconds(); if ( zooming ) { Rectf zoomRect; if ( mTexture ) zoomRect = mTexture.getBounds(); else zoomRect = Rectf( 0, 0, 1024, 768 ); Rectf screenRect( app::getWindowBounds() ); zoomRect = zoomRect.getCenteredFit( screenRect, true ); if ( screenRect.getAspectRatio() > zoomRect.getAspectRatio() ) zoomRect.scaleCentered( screenRect.getWidth() / zoomRect.getWidth() ); else zoomRect.scaleCentered( screenRect.getHeight() / zoomRect.getHeight() ); Vec2f center = lerp< Vec2f >( zoomRect.getCenter(), outRect.getCenter(), mZoom ); float scale = lerp< float >( zoomRect.getWidth(), outRect.getWidth(), mZoom ) / outRect.getWidth(); outRect.offsetCenterTo( center ); outRect.scaleCentered( scale ); if ( mZoom == 1. ) zooming = false; } else if ( currentTime < appearanceTime ) { flipScale = Vec2f( 0, 1 ); } else if ( currentTime < appearanceTime + sFlipDuration * .5 ) { float flipU = easeOutQuart( ( currentTime - appearanceTime ) / ( sFlipDuration * .5 ) ); flipScale = Vec2f( flipU, 1 ); } else if ( flipping ) { float flipU = easeInOutQuart( math<float>::clamp( ( currentTime - flipStart ) / sFlipDuration ) ); if ( ( flipU >= .5 ) && !flipTextureChanged ) { setRandomTexture(); flipTextureChanged = true; } flipScale = Vec2f( math<float>::abs( flipU * 2 - 1 ), 1 ); if ( flipU >= 1 ) flipping = false; } if ( mTexture ) { txtRect = mTexture.getBounds(); mTexture.bind(); gl::color( Color::white() ); } else { txtRect = Rectf( 0, 0, 1024, 768 ); gl::color( Color::black() ); } txtRect = txtRect.getCenteredFit( outRect, true ); gl::translate( txtRect.getCenter() ); gl::scale( flipScale ); gl::translate( -txtRect.getCenter() ); gl::drawSolidRect( txtRect ); if ( mTexture ) mTexture.unbind(); else gl::color( Color::white() ); gl::popModelView(); }