Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

DebugDrawer improved. #2249

Merged
merged 4 commits into from Aug 20, 2014
Merged
Changes from all commits
Commits
File filter...
Filter file types
Jump to…
Jump to file
Failed to load files.

Always

Just for now

@@ -18,17 +18,28 @@

import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.Camera;
import com.badlogic.gdx.graphics.g2d.BitmapFont;
import com.badlogic.gdx.graphics.g2d.BitmapFont.TextBounds;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.graphics.glutils.ShapeRenderer;
import com.badlogic.gdx.graphics.glutils.ShapeRenderer.ShapeType;
import com.badlogic.gdx.math.Matrix4;
import com.badlogic.gdx.math.Vector3;
import com.badlogic.gdx.physics.bullet.linearmath.btIDebugDraw;
import com.badlogic.gdx.physics.bullet.linearmath.btVector3;
import com.badlogic.gdx.utils.Disposable;
import com.badlogic.gdx.utils.viewport.Viewport;

/** @author xoppa */
public class DebugDrawer extends btIDebugDraw {
public int debugMode = 0;
public ShapeRenderer shapeRenderer = new ShapeRenderer();
public class DebugDrawer extends btIDebugDraw implements Disposable {

private ShapeRenderer shapeRenderer = new ShapeRenderer();
private SpriteBatch spriteBatch;
private BitmapFont font;

private boolean ownsShapeRenderer = true, ownsSpriteBatch = true, ownsFont = true;

private Camera camera;
private Viewport viewport;
private int debugMode = btIDebugDraw.DebugDrawModes.DBG_NoDebug;

@Override
public void drawLine (Vector3 from, Vector3 to, Vector3 color) {
@@ -37,17 +48,56 @@ public void drawLine (Vector3 from, Vector3 to, Vector3 color) {
}

@Override
public void drawContactPoint (Vector3 PointOnB, Vector3 normalOnB, float distance, int lifeTime, Vector3 color) {
public void drawContactPoint (Vector3 pointOnB, Vector3 normalOnB, float distance, int lifeTime, Vector3 color) {
shapeRenderer.setColor(color.x, color.y, color.z, 1f);
shapeRenderer.point(pointOnB.x, pointOnB.y, pointOnB.z);

shapeRenderer.line(pointOnB, normalOnB.scl(distance).add(pointOnB));
}

@Override
public void drawTriangle (Vector3 v0, Vector3 v1, Vector3 v2, Vector3 color, float arg4) {
shapeRenderer.setColor(color.x, color.y, color.z, arg4);
shapeRenderer.line(v0, v1);
shapeRenderer.line(v1, v2);
shapeRenderer.line(v2, v0);
}

@Override
public void reportErrorWarning (String warningString) {
Gdx.app.error("Bullet", warningString);
}

@Override
public void draw3dText (Vector3 location, String textString) {
if (spriteBatch == null) {
spriteBatch = new SpriteBatch();
}
if (font == null) {
font = new BitmapFont();
}

// this check is necessary to avoid "mirrored" instances of the text
if (camera.frustum.pointInFrustum(location)) {
if (viewport != null) {
camera.project(location, viewport.getScreenX(), viewport.getScreenY(), viewport.getScreenWidth(),
viewport.getScreenHeight());
} else {
camera.project(location);
}

shapeRenderer.end();
spriteBatch.begin();

// the text will be centered on the position
TextBounds bounds = font.getBounds(textString);
font.draw(spriteBatch, textString, location.x - (bounds.width / 2), location.y + (bounds.height / 2));

spriteBatch.end();
shapeRenderer.begin(ShapeType.Line);
}
}

@Override
public void setDebugMode (int debugMode) {
this.debugMode = debugMode;
@@ -58,12 +108,79 @@ public int getDebugMode () {
return debugMode;
}

public void begin (Camera cam) {
shapeRenderer.setProjectionMatrix(cam.combined);
/** Use this in case no {@code glViewport} is in use. Otherwise please supply the used {@link Viewport} to
* {@link #begin(Viewport)}.
* @param camera The (perspective) camera to be used when doing the debug rendering. */
public void begin (Camera camera) {
this.camera = camera;

shapeRenderer.setProjectionMatrix(camera.combined);
shapeRenderer.begin(ShapeType.Line);
}

/** This has to be used in case the camera to be used is managed via a {@link Viewport}.
* @param viewport The currently used viewport with its managed (perspective) camera. */
public void begin (Viewport viewport) {
this.viewport = viewport;
begin(viewport.getCamera());
}

/** Ends the debug rendering process and leads to a flush. */
public void end () {
shapeRenderer.end();
}

public ShapeRenderer getShapeRenderer () {
return shapeRenderer;
}

/** Switches the {@link ShapeRenderer}. The given shape renderer won't be disposed when {@link #dispose()} is called. */
public void setShapeRenderer (ShapeRenderer shapeRenderer) {
if (ownsShapeRenderer) {
this.shapeRenderer.dispose();
}
this.shapeRenderer = shapeRenderer;
ownsShapeRenderer = false;
}

public SpriteBatch getSpriteBatch () {
return spriteBatch;
}

/** Switches the {@link SpriteBatch}. The given sprite batch won't be disposed when {@link #dispose()} is called. */
public void setSpriteBatch (SpriteBatch spriteBatch) {
if (ownsSpriteBatch && this.spriteBatch != null) {
this.spriteBatch.dispose();
}
this.spriteBatch = spriteBatch;
ownsSpriteBatch = false;
}

public BitmapFont getFont () {
return font;
}

/** Switches the {@link BitmapFont}. The given font won't be disposed when {@link #dispose()} is called. */
public void setFont (BitmapFont font) {
if (ownsFont && this.font != null) {
this.font.dispose();
}
this.font = font;
ownsFont = false;
}

@Override
public void dispose () {
super.dispose();
if (ownsShapeRenderer) {
shapeRenderer.dispose();
}
if (ownsSpriteBatch && spriteBatch != null) {
spriteBatch.dispose();
}
if (ownsFont && font != null) {
font.dispose();
}
}

}
ProTip! Use n and p to navigate between commits in a pull request.
You can’t perform that action at this time.