10
votes

I have defined a shape using an array of vertices:

float[] points =  new float[]{50,60,50,70,60,70, 60,60,50,60};

And I am drawing this here:

shapeRenderer.polygon(floatNew);

This just gives an outline of the shape.
How do I fill it with colour?
Thanks

3

3 Answers

8
votes

Currently, ShapeRenderer supports polygon drawing (by line) but not filling.

This code is clipping the polygon on triangles, and then drawing each triangle separately.

Edit ShapeRenderer.java like this:

EarClippingTriangulator ear = new EarClippingTriangulator();

public void polygon(float[] vertices, int offset, int count)
{
    if (shapeType != ShapeType.Filled && shapeType != ShapeType.Line)
        throw new GdxRuntimeException("Must call begin(ShapeType.Filled) or begin(ShapeType.Line)");
    if (count < 6)
        throw new IllegalArgumentException("Polygons must contain at least 3 points.");
    if (count % 2 != 0)
        throw new IllegalArgumentException("Polygons must have an even number of vertices.");

    check(shapeType, null, count);

    final float firstX = vertices[0];
    final float firstY = vertices[1];
    if (shapeType == ShapeType.Line)
    {
        for (int i = offset, n = offset + count; i < n; i += 2)
        {
            final float x1 = vertices[i];
            final float y1 = vertices[i + 1];

            final float x2;
            final float y2;

            if (i + 2 >= count)
            {
                x2 = firstX;
                y2 = firstY;
            } else
            {
                x2 = vertices[i + 2];
                y2 = vertices[i + 3];
            }

            renderer.color(color);
            renderer.vertex(x1, y1, 0);
            renderer.color(color);
            renderer.vertex(x2, y2, 0);

        }
    } else
    {
        ShortArray arrRes = ear.computeTriangles(vertices);

        for (int i = 0; i < arrRes.size - 2; i = i + 3)
        {
            float x1 = vertices[arrRes.get(i) * 2];
            float y1 = vertices[(arrRes.get(i) * 2) + 1];

            float x2 = vertices[(arrRes.get(i + 1)) * 2];
            float y2 = vertices[(arrRes.get(i + 1) * 2) + 1];

            float x3 = vertices[arrRes.get(i + 2) * 2];
            float y3 = vertices[(arrRes.get(i + 2) * 2) + 1];

            this.triangle(x1, y1, x2, y2, x3, y3);
        }
    }
}
2
votes

You cant draw a filled Polygon with the shaperender yet. take a look at this from the bugtracker

You can also read that in the API.

public void polygon(float[] vertices)
Draws a polygon in the x/y plane. The vertices must contain at least 3 points (6 floats x,y). The ShapeRenderer.ShapeType passed to begin has to be ShapeRenderer.ShapeType.Line.


API ShapeRender
Sure if its with ShapeType.Line you just get the outlines.
You need to draw it yourself with Triangles in that case. It should be possible to fill at least Triangles.
Maybe take a look at this from Stackoverflow: drawing-filled-polygon-with-libgdx

-2
votes

Edit your ShapeRenderer.java class replacing polygon() method with the following code:

public void polygon(float[] vertices, int offset, int count) {
    if (currType != ShapeType.Filled && currType != ShapeType.Line)
        throw new GdxRuntimeException(
                "Must call begin(ShapeType.Filled) or begin(ShapeType.Line)");
    if (count < 6)
        throw new IllegalArgumentException(
                "Polygons must contain at least 3 points.");
    if (count % 2 != 0)
        throw new IllegalArgumentException(
                "Polygons must have an even number of vertices.");

    checkDirty();
    checkFlush(count);

    final float firstX = vertices[0];
    final float firstY = vertices[1];
    if (currType == ShapeType.Line) {
        for (int i = offset, n = offset + count; i < n; i += 2) {
            final float x1 = vertices[i];
            final float y1 = vertices[i + 1];

            final float x2;
            final float y2;

            if (i + 2 >= count) {
                x2 = firstX;
                y2 = firstY;
            } else {
                x2 = vertices[i + 2];
                y2 = vertices[i + 3];
            }

            renderer.color(color);
            renderer.vertex(x1, y1, 0);
            renderer.color(color);
            renderer.vertex(x2, y2, 0);

        }
    } else {

        for (int i = offset, n = offset + count; i < n; i += 4) {

            final float x1 = vertices[i];
            final float y1 = vertices[i + 1];

            if (i + 2 >= count) {
                break;
            }

            final float x2 = vertices[i + 2];
            final float y2 = vertices[i + 3];

            final float x3;
            final float y3;

            if (i + 4 >= count) {
                x3 = firstX;
                y3 = firstY;
            } else {
                x3 = vertices[i + 4];
                y3 = vertices[i + 5];
            }

            renderer.color(color);
            renderer.vertex(x1, y1, 0);
            renderer.color(color);
            renderer.vertex(x2, y2, 0);
            renderer.color(color);
            renderer.vertex(x3, y3, 0);


        }

    }
}

Usage:

    gdx_shape_renderer.begin(ShapeType.Filled);
    gdx_shape_renderer.setColor(fill_r, fill_g, fill_b, fill_a);
    gdx_shape_renderer.polygon(vertices);
    gdx_shape_renderer.end();

    gdx_shape_renderer.begin(ShapeType.Line);
    gdx_shape_renderer.setColor(border_r, border_g, border_b, border_a);
    gdx_shape_renderer.polygon(vertices);
    gdx_shape_renderer.end();