Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

LIBGDX: How do I draw a filled polygon with the shaperenderer?

Tags:

java

libgdx

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

like image 961
dewijones92 Avatar asked Apr 19 '13 10:04

dewijones92


2 Answers

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);
        }
    }
}
like image 51
Anubitum Avatar answered Sep 29 '22 00:09

Anubitum


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

like image 41
BennX Avatar answered Sep 28 '22 23:09

BennX