OpenGL—ES 1.0 2d rounded rectangle

后端 未结 7 453
生来不讨喜
生来不讨喜 2020-12-28 09:46

How to make rounded rectangle in OpenGL, or any polygon with rounded corners?

7条回答
  •  一向
    一向 (楼主)
    2020-12-28 10:30

    #define PI_2   1.57079632679490f
    
    #define SIN(x) SDL_sinf (x)
    #define COS(x) SDL_cosf (x)
    
    typedef struct _g2d_vertex_t g2d_vertex_t;
    
    struct _g2d_vertex_t {
    
        float x, y;
    };
    
    // pVertices - destination buffer
    // nVertices - buffer size
    // dx - width
    // dy - height
    // r - radius
    // returnes the number of used vertices
    int
    __cdecl buildRoundedRect (g2d_vertex_t * pVertices, int nVertices, float dx, float dy, float r) {
    
        float a, da;
        int i1, i2, i3, i4, n;
    
        if (nVertices < 4) { return 0; }
    
        if (nVertices == 4) {
    
            pVertices [0].x = 0.f; pVertices [0].y = 0.f;
            pVertices [1].x = dx;  pVertices [1].y = 0.f;
            pVertices [2].x = dx;  pVertices [2].y = dy;
            pVertices [3].x = 0.f; pVertices [3].y = dy;
    
            return nVertices;
        }
    
        n = nVertices >> 2;
    
        if (r > dx / 2.f) { r = dx / 2.f; }
        if (r > dy / 2.f) { r = dy / 2.f; }
    
        a = 0.f;
        da = PI_2 / (float) (n - 1);
    
        for (i1 = 0, i2 = (n << 1) - 1, i3 = n << 1, i4 = (n << 2) - 1; i1 < n; i1++, i2--, i3++, i4--, a += da) {
    
            float cosA = COS (a), sinA = SIN (a);
    
            pVertices [i1].x = (dx - r) + r * cosA; pVertices [i1].y = (dy - r) + r * sinA;
            pVertices [i2].x =     r    - r * cosA; pVertices [i2].y = (dy - r) + r * sinA;
            pVertices [i3].x =     r    - r * cosA; pVertices [i3].y =     r    - r * sinA;
            pVertices [i4].x = (dx - r) + r * cosA; pVertices [i4].y =     r    - r * sinA;
        }
    
        return n << 2;
    }
    
    void drawRoundedRect () {
    
        g2d_vertex_t vertices [50];
    
        glColor3f (0.3f, 0.5f, 0.2f);
    
        glVertexPointer (2, GL_FLOAT, 0, vertices);
        glEnableClientState (GL_VERTEX_ARRAY);
    
        glDrawArrays (GL_LINE_LOOP, 0, buildRoundedRect (vertices, 50 /* max count of vertices to use: 4 - 50 */, 150.f, 80.f, 20.f));
    }
    

提交回复
热议问题