void Layer::beginClip( View *view, Renderer *ren ) { Rectf viewWorldBounds = view->getWorldBounds(); vec2 lowerLeft = viewWorldBounds.getLowerLeft(); if( mRootView->mRendersToFrameBuffer ) { // get bounds of view relative to framebuffer. // TODO: need a method like convertPointToView( view, point ); Rectf frameBufferWorldBounds = mRootView->getWorldBounds(); Rectf viewBoundsInFrameBuffer = viewWorldBounds - frameBufferWorldBounds.getUpperLeft(); // Take lower left relative to FrameBuffer, which might actually be larger than mFrameBufferBounds lowerLeft = viewBoundsInFrameBuffer.getLowerLeft(); lowerLeft.y = mFrameBuffer->getHeight() - lowerLeft.y; // TODO: reason through if this makes sense in general // - needed to add it when rendering to virtual canvas but stroked rect went beyond borders lowerLeft.y += mFrameBufferBounds.y1; } else { // rendering to window, flip y relative to Graph's bottom left using its clipping size ivec2 clippingSize = mRootView->getGraph()->getClippingSize(); lowerLeft.y = clippingSize.y - lowerLeft.y; } auto ctx = gl::context(); ctx->pushBoolState( GL_SCISSOR_TEST, GL_TRUE ); ctx->pushScissor( std::pair<ivec2, ivec2>( lowerLeft, view->getSize() ) ); }
void BloomingNeonApp::drawStrokedRect( const Rectf &rect ) { // we don't want any texture on our lines glDisable(GL_TEXTURE_2D); gl::drawLine(rect.getUpperLeft(), rect.getUpperRight()); gl::drawLine(rect.getUpperRight(), rect.getLowerRight()); gl::drawLine(rect.getLowerRight(), rect.getLowerLeft()); gl::drawLine(rect.getLowerLeft(), rect.getUpperLeft()); }
void RenderMesh2D::setAsBox( const Rectf &bounds ) { if( vertices.size() != 4 ){ vertices.assign( 4, Vertex() ); } vertices[0].position = bounds.getUpperRight(); vertices[1].position = bounds.getUpperLeft(); vertices[2].position = bounds.getLowerRight(); vertices[3].position = bounds.getLowerLeft(); }
void SmilesApp::mouseDown( MouseEvent event ){ if(mSmileRect.getUpperLeft().distance(event.getPos())<10){mSmileRectDraggingCorner=0;} if(mSmileRect.getUpperRight().distance(event.getPos())<10){mSmileRectDraggingCorner=1;} if(mSmileRect.getLowerLeft().distance(event.getPos())<10){mSmileRectDraggingCorner=2;} if(mSmileRect.getLowerRight().distance(event.getPos())<10){mSmileRectDraggingCorner=3;} }
void TouchUi::setMask( const Rectf& bounds ) { mMask.clear(); mMask.moveTo( bounds.getUpperLeft() ); mMask.lineTo( bounds.getUpperRight() ); mMask.lineTo( bounds.getLowerRight() ); mMask.lineTo( bounds.getLowerLeft() ); mMask.close(); }
void ShapeTesselator::add(const Rectf &rect) { vector<Vec2f> polygon; polygon.emplace_back(rect.getUpperLeft()); polygon.emplace_back(rect.getUpperRight()); polygon.emplace_back(rect.getLowerRight()); polygon.emplace_back(rect.getLowerLeft()); add(polygon); }
void TextLabels::renderString( const std::u16string &str, vec2 *cursor, float stretch ) { std::u16string::const_iterator itr; for( itr = str.begin(); itr != str.end(); ++itr ) { // retrieve character code uint16_t id = (uint16_t)*itr; if( mFont->contains( id ) ) { // get metrics for this character to speed up measurements Font::Metrics m = mFont->getMetrics( id ); // skip whitespace characters if( !isWhitespaceUtf16( id ) ) { size_t index = mVertices.size(); Rectf bounds = mFont->getBounds( m, mFontSize ); mVertices.push_back( vec3( *cursor + bounds.getUpperLeft(), 0 ) ); mVertices.push_back( vec3( *cursor + bounds.getUpperRight(), 0 ) ); mVertices.push_back( vec3( *cursor + bounds.getLowerRight(), 0 ) ); mVertices.push_back( vec3( *cursor + bounds.getLowerLeft(), 0 ) ); bounds = mFont->getTexCoords( m ); mTexcoords.push_back( bounds.getUpperLeft() ); mTexcoords.push_back( bounds.getUpperRight() ); mTexcoords.push_back( bounds.getLowerRight() ); mTexcoords.push_back( bounds.getLowerLeft() ); mIndices.push_back( index + 0 ); mIndices.push_back( index + 3 ); mIndices.push_back( index + 1 ); mIndices.push_back( index + 1 ); mIndices.push_back( index + 3 ); mIndices.push_back( index + 2 ); mOffsets.insert( mOffsets.end(), 4, mOffset ); } if( id == 32 ) cursor->x += stretch * mFont->getAdvance( m, mFontSize ); else cursor->x += mFont->getAdvance( m, mFontSize ); } } // mBoundsInvalid = true; }
void SmilesApp::draw() { gl::enableAlphaBlending(); gl::clear( Color::black() ); gl::color(1.0f, 1.0f, 1.0f); // draw webcam capture if( !mCapture || !mSurface ) return; gl::draw( gl::Texture(mSurface) ); if(mGreyChannel){ gl::pushMatrices();{ gl::translate(mSmileRect.getUpperLeft()); gl::draw( gl::Texture(mGreyChannel) ); }gl::popMatrices(); } // draw rect that actually gets analysed: gl::color(ColorA(0.0f, 1.0f, 0.0f, 1.0f)); gl::drawStrokedRect(mSmileRect); gl::drawStrokedCircle(mSmileRect.getUpperLeft(), 10); gl::drawStrokedCircle(mSmileRect.getUpperRight(), 10); gl::drawStrokedCircle(mSmileRect.getLowerLeft(), 10); gl::drawStrokedCircle(mSmileRect.getLowerRight(), 10); //draw mSmileThreshold gl::pushMatrices();{ gl::color(ColorA(1.0f, 0.0f, 0.0f, 0.3f)); gl::drawSolidRect(Rectf( 0, (1-mSmileThreshold)*getWindowHeight(), getWindowWidth(), getWindowHeight() ) ); gl::drawStrokedRect( Rectf(0, 0, getWindowWidth(), getWindowHeight() ) ); }gl::popMatrices(); //draw faces if(!mFaces.empty()){ gl::pushMatrices();{ gl::translate(mSmileRect.getUpperLeft()); gl::color(1.0f, 1.0f, 1.0f); for(list<VisualObject *>::iterator it = mFaces.begin(); it != mFaces.end(); ++it) { mFace = static_cast<FaceObject*>(*it); gl::drawStrokedRect(Rectf(mFace->x, mFace->y, mFace->x+mFace->xSize, mFace->y+mFace->ySize )); } }gl::popMatrices(); } mParams.draw(); }
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() ); } }