[libgdx] Physics debug rendering for Skeleton Viewer.

This commit is contained in:
Nathan Sweet 2022-10-05 22:42:19 -04:00
parent 95487552dc
commit 23729f8eee
3 changed files with 36 additions and 9 deletions

View File

@ -38,6 +38,8 @@ import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.utils.Array;
import com.badlogic.gdx.utils.FloatArray;
import com.esotericsoftware.spine.PhysicsConstraintData.Node;
import com.esotericsoftware.spine.PhysicsConstraintData.Spring;
import com.esotericsoftware.spine.attachments.Attachment;
import com.esotericsoftware.spine.attachments.BoundingBoxAttachment;
import com.esotericsoftware.spine.attachments.ClippingAttachment;
@ -55,7 +57,7 @@ public class SkeletonRendererDebug {
private final ShapeRenderer shapes;
private boolean drawBones = true, drawRegionAttachments = true, drawBoundingBoxes = true, drawPoints = true;
private boolean drawMeshHull = true, drawMeshTriangles = true, drawPaths = true, drawClipping = true;
private boolean drawMeshHull = true, drawMeshTriangles = true, drawPaths = true, drawClipping = true, drawPhysics = true;
private final SkeletonBounds bounds = new SkeletonBounds();
private final FloatArray vertices = new FloatArray(32);
private float scale = 1;
@ -236,6 +238,22 @@ public class SkeletonRendererDebug {
}
}
if (drawPhysics) {
Array<PhysicsConstraint> physicsConstraints = skeleton.physicsConstraints;
for (int i = 0, n = physicsConstraints.size; i < n; i++) {
PhysicsConstraint constraint = physicsConstraints.get(i);
if (constraint.mix <= 0) continue;
for (Spring spring : constraint.springs) {
shapes.setColor(Color.GOLDENROD);
shapes.line(spring.node1.x, spring.node1.y, spring.node2.x, spring.node2.y);
}
for (Node node : constraint.nodes) {
shapes.setColor(Color.GREEN);
shapes.circle(node.x, node.y, 8);
}
}
}
shapes.end();
shapes.begin(ShapeType.Filled);
@ -277,31 +295,35 @@ public class SkeletonRendererDebug {
}
public void setRegionAttachments (boolean regionAttachments) {
this.drawRegionAttachments = regionAttachments;
drawRegionAttachments = regionAttachments;
}
public void setBoundingBoxes (boolean boundingBoxes) {
this.drawBoundingBoxes = boundingBoxes;
drawBoundingBoxes = boundingBoxes;
}
public void setMeshHull (boolean meshHull) {
this.drawMeshHull = meshHull;
drawMeshHull = meshHull;
}
public void setMeshTriangles (boolean meshTriangles) {
this.drawMeshTriangles = meshTriangles;
drawMeshTriangles = meshTriangles;
}
public void setPaths (boolean paths) {
this.drawPaths = paths;
drawPaths = paths;
}
public void setPoints (boolean points) {
this.drawPoints = points;
drawPoints = points;
}
public void setClipping (boolean clipping) {
this.drawClipping = clipping;
drawClipping = clipping;
}
public void setPhysics (boolean physics) {
drawPhysics = physics;
}
public void setPremultipliedAlpha (boolean premultipliedAlpha) {

View File

@ -283,6 +283,7 @@ public class SkeletonViewer extends ApplicationAdapter {
debugRenderer.setPaths(ui.debugPathsCheckbox.isChecked());
debugRenderer.setPoints(ui.debugPointsCheckbox.isChecked());
debugRenderer.setClipping(ui.debugClippingCheckbox.isChecked());
debugRenderer.setClipping(ui.debugPhysicsCheckbox.isChecked());
debugRenderer.draw(skeleton);
}

View File

@ -112,6 +112,7 @@ class SkeletonViewerUI {
CheckBox debugPathsCheckbox = new CheckBox("Paths", skin);
CheckBox debugPointsCheckbox = new CheckBox("Points", skin);
CheckBox debugClippingCheckbox = new CheckBox("Clipping", skin);
CheckBox debugPhysicsCheckbox = new CheckBox("Physics", skin);
CheckBox pmaCheckbox = new CheckBox("Premultiplied", skin);
@ -257,7 +258,7 @@ class SkeletonViewerUI {
root.add();
root.add(table(debugPathsCheckbox, debugPointsCheckbox, debugClippingCheckbox)).row();
root.add();
root.add(table(debugMeshHullCheckbox, debugMeshTrianglesCheckbox)).row();
root.add(table(debugMeshHullCheckbox, debugMeshTrianglesCheckbox, debugPhysicsCheckbox)).row();
root.add("Atlas alpha:");
{
Table table = table();
@ -626,6 +627,7 @@ class SkeletonViewerUI {
debugPathsCheckbox.addListener(savePrefsListener);
debugPointsCheckbox.addListener(savePrefsListener);
debugClippingCheckbox.addListener(savePrefsListener);
debugPhysicsCheckbox.addListener(savePrefsListener);
pmaCheckbox.addListener(savePrefsListener);
linearCheckbox.addListener(savePrefsListener);
bonesSetupPoseButton.addListener(savePrefsListener);
@ -698,6 +700,7 @@ class SkeletonViewerUI {
prefs.putBoolean("debugPaths", debugPathsCheckbox.isChecked());
prefs.putBoolean("debugPoints", debugPointsCheckbox.isChecked());
prefs.putBoolean("debugClipping", debugClippingCheckbox.isChecked());
prefs.putBoolean("debugPhysics", debugPhysicsCheckbox.isChecked());
prefs.putBoolean("premultiplied", pmaCheckbox.isChecked());
prefs.putBoolean("linear", linearCheckbox.isChecked());
if (bonesSetupPoseButton.isChecked())
@ -740,6 +743,7 @@ class SkeletonViewerUI {
debugPathsCheckbox.setChecked(prefs.getBoolean("debugPaths", true));
debugPointsCheckbox.setChecked(prefs.getBoolean("debugPoints", true));
debugClippingCheckbox.setChecked(prefs.getBoolean("debugClipping", true));
debugPhysicsCheckbox.setChecked(prefs.getBoolean("debugPhysics", true));
pmaCheckbox.setChecked(prefs.getBoolean("premultiplied", true));
linearCheckbox.setChecked(prefs.getBoolean("linear", true));
String setupPose = prefs.getString("setupPose", "");