void BufferStorePartlyRoundedRectVertices(GG::GL2DVertexBuffer& buffer, const GG::Pt& ul, const GG::Pt& lr, int radius, bool ur_round, bool ul_round, bool ll_round, bool lr_round) { const double PI = 3.141594; buffer.store(lr.x, ul.y + radius); if (ur_round) BufferStoreCircleArcVertices(buffer, GG::Pt(lr.x - 2 * radius, ul.y), GG::Pt(lr.x, ul.y + 2 * radius), 0.0, PI / 2.0, false); else buffer.store(lr.x, ul.y); if (ul_round) BufferStoreCircleArcVertices(buffer, ul, GG::Pt(ul.x + 2 * radius, ul.y + 2 * radius), PI / 2.0, PI, false); else buffer.store(ul.x, ul.y); if (ll_round) BufferStoreCircleArcVertices(buffer, GG::Pt(ul.x, lr.y - 2 * radius), GG::Pt(ul.x + 2 * radius, lr.y), PI, 3.0 * PI / 2.0, false); else buffer.store(ul.x, lr.y); if (lr_round) BufferStoreCircleArcVertices(buffer, GG::Pt(lr.x - 2 * radius, lr.y - 2 * radius), lr, 3.0 * PI / 2.0, 0.0, false); else buffer.store(lr.x, lr.y); buffer.store(lr.x, ul.y + radius); }
void CircleArc(const GG::Pt& ul, const GG::Pt& lr, double theta1, double theta2, bool filled_shape) { //std::cout << "CircleArc ul: " << ul << " lr: " << lr << " theta1: " << theta1 << " theta2: " << theta2 << " filled: " << filled_shape << std::flush << std::endl; GG::GL2DVertexBuffer vert_buf; vert_buf.reserve(50); // max number that BufferStoreCircleArcVertices might add BufferStoreCircleArcVertices(vert_buf, ul, lr, theta1, theta2, filled_shape, 0, true); //glDisable(GL_TEXTURE_2D); glPushClientAttrib(GL_CLIENT_ALL_ATTRIB_BITS); glEnableClientState(GL_VERTEX_ARRAY); glDisableClientState(GL_COLOR_ARRAY); glDisableClientState(GL_TEXTURE_COORD_ARRAY); vert_buf.activate(); if (filled_shape) glDrawArrays(GL_TRIANGLE_FAN, 0, vert_buf.size()); else glDrawArrays(GL_LINE_STRIP, 0, vert_buf.size()); glPopClientAttrib(); //glEnable(GL_TEXTURE_2D); }
void CircleArc(const GG::Pt& ul, const GG::Pt& lr, double theta1, double theta2, bool filled_shape) { GG::GL2DVertexBuffer vert_buf; vert_buf.reserve(50); // max number that BufferStoreCircleArcVertices might add BufferStoreCircleArcVertices(vert_buf, ul, lr, theta1, theta2, filled_shape, 0, true); //glDisable(GL_TEXTURE_2D); glPushClientAttrib(GL_CLIENT_ALL_ATTRIB_BITS); glEnableClientState(GL_VERTEX_ARRAY); vert_buf.activate(); if (filled_shape) glDrawArrays(GL_TRIANGLE_FAN, 0, vert_buf.size()); else glDrawArrays(GL_LINE_STRIP, 0, vert_buf.size()); glPopClientAttrib(); //glEnable(GL_TEXTURE_2D); }