Skip to content

Box2DDebugRenderer draws incorrectly positioned AABBs for CircleShapes #2710

@dermetfan

Description

@dermetfan

The Box2DDebugRenderer draws the AABBs for CircleShapes in the wrong place if they have a position set (other than 0:0) and their body is rotated. Here's a simple test:

b2bug

import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Screen;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.physics.box2d.BodyDef;
import com.badlogic.gdx.physics.box2d.BodyDef.BodyType;
import com.badlogic.gdx.physics.box2d.Box2DDebugRenderer;
import com.badlogic.gdx.physics.box2d.CircleShape;
import com.badlogic.gdx.physics.box2d.World;
import com.badlogic.gdx.utils.viewport.ScreenViewport;
import com.badlogic.gdx.utils.viewport.Viewport;
import com.badlogic.gdx.tests.utils.GdxTest;

public class Box2DDebugRendererBug extends GdxTest implements Screen {

    World world;
    Viewport viewport;
    Box2DDebugRenderer renderer;

    public Box2DDebugRendererBug() {
        ScreenViewport sv = new ScreenViewport();
        sv.setUnitsPerPixel(1 / 32f);
        viewport = sv;
    }

    @Override
    public void create() {
        world = new World(Vector2.Zero, true);
        renderer = new Box2DDebugRenderer();
        renderer.setDrawAABBs(true);

        BodyDef bodyDef = new BodyDef();
        bodyDef.type = BodyType.DynamicBody;
        CircleShape shape = new CircleShape();
        shape.setRadius(1);
        shape.setPosition(new Vector2(0, 1)); // this causes the issue
        world.createBody(bodyDef).createFixture(shape, 1).getBody().applyTorque(200, true);
        shape.dispose();
    }

    @Override
    public void render() {
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
        world.step(1 / 60f, 8, 3);
        renderer.render(world, viewport.getCamera().combined);
    }


    @Override
    public void resize(int width, int height) {
        viewport.update(width, height);
    }

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

    // if used as Screen

    @Override
    public void show() {
        create();
    }

    @Override
    public void render(float delta) {
        render();
    }

    @Override
    public void hide() {}

}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions