javalibgdxjbox2d

LibGDX Box2D: Cannot get Fixture to render


I have been recently trying to get back into LibGDX's version of Box2D, and I looked back at a demo I created a few months back, and my code looks fine, and from my Google search results, my code is fine, but for the life of me, I cannot get the Fixture to render.

Here is my (Minimalist example) code, and for the life of me, I cannot get it to work Note: I built a wrapper around the LibGDX Game class, should be self-explanatory:

public class TestBox2D extends EGGame {

    int width;
    int height;

    static final Vector2 ZERO_GRAVITY = new Vector2(0f, 0f);

    OrthographicCamera camera;
    World world;
    Body body;
    Box2DDebugRenderer box2dDebugRenderer;
    RayHandler rayHandler;

    ... // Removed Constructor, nothing special here.

    @Override
    protected void init() {
        width = Gdx.graphics.getWidth() / 2;
        height = Gdx.graphics.getHeight() / 2;
        camera = new OrthographicCamera(width, height);
        camera.position.set(width / 2, height / 2, 0);
        camera.update();

        world = new World(ZERO_GRAVITY, true);
        box2dDebugRenderer = new Box2DDebugRenderer();
        rayHandler = new RayHandler(world);
        rayHandler.setCombinedMatrix(camera.combined);

        // creating Body
        BodyDef bodyDef = new BodyDef();
        bodyDef.type = BodyDef.BodyType.StaticBody;
        bodyDef.position.set(width/2, height/2);

        body = world.createBody(bodyDef);

        CircleShape shape = new CircleShape();
        shape.setRadius(1f);

        FixtureDef fixtureDef = new FixtureDef();
        fixtureDef.shape = shape;
        body.createFixture(fixtureDef);

    }

    @Override
    protected void updateGame() {
        world.step(1f / 30f, 6, 2);
        rayHandler.update();
    }

    @Override
    protected void renderGame() {
        box2dDebugRenderer.render(world, camera.combined);
        rayHandler.render();
    }

    @Override
    public void dispose() {
        world.dispose();
    }

    ... // Removed main method, nothing special here.
}

Note that world.getBodyCount(); and world.getFixtureCount(); both return 1.


Solution

  • Fixed.

    The issue was that I was attempting to call RayHandler#render() after Box2DDebugRenderer.render(...) while the RayHandler didn't have any Light objects (Adding a PointLight allowed it to render), but whatever the reason for it is, it's weird, but calling the RayHandler#render() first allows it to work. This might be a bug in LibGDX that I will report.