Better armature debugger

monkanim
Rémy Bouquet 7 years ago committed by Nehon
parent 34114f5a82
commit 84276ce099
  1. 24
      jme3-core/src/main/java/com/jme3/scene/debug/custom/ArmatureDebugAppState.java
  2. 8
      jme3-core/src/main/java/com/jme3/scene/debug/custom/ArmatureDebugger.java
  3. 16
      jme3-core/src/main/java/com/jme3/scene/debug/custom/ArmatureNode.java

@ -30,6 +30,8 @@ public class ArmatureDebugAppState extends BaseAppState {
private Application app;
private boolean displayAllJoints = false;
private float clickDelay = -1;
Vector3f tmp = new Vector3f();
Vector3f tmp2 = new Vector3f();
ViewPort vp;
@Override
@ -84,10 +86,15 @@ public class ArmatureDebugAppState extends BaseAppState {
public ArmatureDebugger addArmatureFrom(Armature armature, Spatial forSpatial) {
ArmatureDebugger ad = armatures.get(armature);
if(ad != null){
return ad;
}
JointInfoVisitor visitor = new JointInfoVisitor(armature);
forSpatial.depthFirstTraversal(visitor);
ArmatureDebugger ad = new ArmatureDebugger(forSpatial.getName() + "_Armature", armature, visitor.deformingJoints);
ad = new ArmatureDebugger(forSpatial.getName() + "_Armature", armature, visitor.deformingJoints);
ad.setLocalTransform(forSpatial.getWorldTransform());
if (forSpatial instanceof Node) {
List<Geometry> geoms = new ArrayList<>();
@ -122,18 +129,11 @@ public class ArmatureDebugAppState extends BaseAppState {
if (name.equals("shoot") && !isPressed && clickDelay < CLICK_MAX_DELAY) {
Vector2f click2d = app.getInputManager().getCursorPosition();
CollisionResults results = new CollisionResults();
//first check 2d collision with joints
for (ArmatureDebugger ad : armatures.values()) {
ad.pick(click2d, results);
}
if (results.size() == 0) {
//no result, let's ray cast for bone geometries
Vector3f click3d = app.getCamera().getWorldCoordinates(new Vector2f(click2d.x, click2d.y), 0f).clone();
Vector3f dir = app.getCamera().getWorldCoordinates(new Vector2f(click2d.x, click2d.y), 1f).subtractLocal(click3d);
Ray ray = new Ray(click3d, dir);
debugNode.collideWith(ray, results);
}
Vector3f click3d = app.getCamera().getWorldCoordinates(new Vector2f(click2d.x, click2d.y), 0f, tmp);
Vector3f dir = app.getCamera().getWorldCoordinates(new Vector2f(click2d.x, click2d.y), 1f, tmp2).subtractLocal(click3d);
Ray ray = new Ray(click3d, dir);
debugNode.collideWith(ray, results);
if (results.size() == 0) {
for (ArmatureDebugger ad : armatures.values()) {

@ -121,7 +121,7 @@ public class ArmatureDebugger extends Node {
((Node) wires.getChild(1)).getChild(0).setCullHint(display ? CullHint.Dynamic : CullHint.Always);
}
protected void initialize(AssetManager assetManager, Camera camera) {
public void initialize(AssetManager assetManager, Camera camera) {
armatureNode.setCamera(camera);
@ -153,10 +153,6 @@ public class ArmatureDebugger extends Node {
}
public int pick(Vector2f cursor, CollisionResults results) {
return armatureNode.pick(cursor, results);
}
public Armature getArmature() {
return armature;
}
@ -169,9 +165,7 @@ public class ArmatureDebugger extends Node {
@Override
public int collideWith(Collidable other, CollisionResults results) {
return armatureNode.collideWith(other, results);
}
protected Joint select(Geometry g) {

@ -62,6 +62,7 @@ public class ArmatureNode extends Node {
private Map<Geometry, Joint> geomToJoint = new HashMap<>();
private Joint selectedJoint = null;
private Vector3f tmp = new Vector3f();
private Vector2f tmpv2 = new Vector2f();
private final static ColorRGBA selectedColor = ColorRGBA.Orange;
private final static ColorRGBA selectedColorJ = ColorRGBA.Yellow;
private final static ColorRGBA outlineColor = ColorRGBA.LightGray;
@ -262,7 +263,16 @@ public class ArmatureNode extends Node {
if (!(other instanceof Ray)) {
return 0;
}
int nbCol = 0;
// first try a 2D pick;
camera.getScreenCoordinates(((Ray)other).getOrigin(),tmp);
tmpv2.x = tmp.x;
tmpv2.y = tmp.y;
int nbHit = pick(tmpv2, results);
if (nbHit > 0) {
return nbHit;
}
for (Geometry g : geomToJoint.keySet()) {
if (g.getMesh() instanceof JointShape) {
continue;
@ -275,11 +285,11 @@ public class ArmatureNode extends Node {
CollisionResult res = new CollisionResult();
res.setGeometry(g);
results.addCollision(res);
nbCol++;
nbHit++;
}
}
}
return nbCol;
return nbHit;
}
private void updateBoneMesh(Geometry geom, Vector3f start, Vector3f[] ends) {

Loading…
Cancel
Save