| 5 | namespace EE { namespace UI { |
| 6 | |
| 7 | static void borderAddArc( VertexBuffer* vbo, Vector2f pos, Float radiW, Float radiH, |
| 8 | double arcStartAngle, double arcEndAngle, Color color, Float lineW, |
| 9 | Vector2f basePos, bool decrease = false, bool addInnerVertex = true ) { |
| 10 | // TODO: Add segment count parameter to change the arc precision (num of vertex). |
| 11 | Float angleShift = 1; |
| 12 | double startAngle = eemin( arcStartAngle, arcEndAngle ); |
| 13 | double endAngle = eemax( arcStartAngle, arcEndAngle ); |
| 14 | Vector2f startPos = ( radiW > lineW ) ? pos : basePos; |
| 15 | double lastAngle = startAngle; |
| 16 | double i; |
| 17 | |
| 18 | if ( decrease ) { |
| 19 | for ( i = endAngle; i >= startAngle; i -= angleShift ) { |
| 20 | vbo->addVertex( |
| 21 | Vector2f( pos.x + radiW * Math::cosAng( i ), pos.y + radiH * Math::sinAng( i ) ) ); |
| 22 | vbo->addColor( color ); |
| 23 | |
| 24 | if ( addInnerVertex ) { |
| 25 | if ( radiW > lineW ) { |
| 26 | vbo->addVertex( Vector2f( pos.x + ( radiW - lineW ) * Math::cosAng( i ), |
| 27 | pos.y + ( radiH - lineW ) * Math::sinAng( i ) ) ); |
| 28 | } else { |
| 29 | vbo->addVertex( startPos ); |
| 30 | } |
| 31 | |
| 32 | vbo->addColor( color ); |
| 33 | } |
| 34 | |
| 35 | lastAngle = i; |
| 36 | } |
| 37 | |
| 38 | if ( lastAngle != endAngle ) { |
| 39 | i = endAngle; |
| 40 | vbo->addVertex( |
| 41 | Vector2f( pos.x + radiW * Math::cosAng( i ), pos.y + radiH * Math::sinAng( i ) ) ); |
| 42 | vbo->addColor( color ); |
| 43 | |
| 44 | if ( addInnerVertex ) { |
| 45 | if ( radiW > lineW ) { |
| 46 | vbo->addVertex( Vector2f( pos.x + ( radiW - lineW ) * Math::cosAng( i ), |
| 47 | pos.y + ( radiH - lineW ) * Math::sinAng( i ) ) ); |
| 48 | } else { |
| 49 | vbo->addVertex( startPos ); |
| 50 | } |
| 51 | vbo->addColor( color ); |
| 52 | } |
| 53 | } |
| 54 | } else { |
| 55 | for ( i = startAngle; i <= endAngle; i += angleShift ) { |
| 56 | if ( addInnerVertex ) { |
| 57 | if ( radiW > lineW ) { |
| 58 | vbo->addVertex( Vector2f( pos.x + ( radiW - lineW ) * Math::cosAng( i ), |
| 59 | pos.y + ( radiH - lineW ) * Math::sinAng( i ) ) ); |
| 60 | } else { |
| 61 | vbo->addVertex( startPos ); |
| 62 | } |
| 63 | |
| 64 | vbo->addColor( color ); |