diff --git a/spine-libgdx/spine-skeletonviewer/src/com/esotericsoftware/spine/SkeletonViewer.java b/spine-libgdx/spine-skeletonviewer/src/com/esotericsoftware/spine/SkeletonViewer.java index 3798efefc..4eac15514 100644 --- a/spine-libgdx/spine-skeletonviewer/src/com/esotericsoftware/spine/SkeletonViewer.java +++ b/spine-libgdx/spine-skeletonviewer/src/com/esotericsoftware/spine/SkeletonViewer.java @@ -95,6 +95,7 @@ public class SkeletonViewer extends ApplicationAdapter { FileHandle skeletonFile; long lastModified; float lastModifiedCheck, reloadTimer; + Preferences prefs; public void create () { Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandler() { @@ -104,16 +105,20 @@ public class SkeletonViewer extends ApplicationAdapter { } }); + prefs = Gdx.app.getPreferences("spine-skeletonviewer"); ui = new UI(); batch = new PolygonSpriteBatch(); renderer = new SkeletonMeshRenderer(); debugRenderer = new SkeletonRendererDebug(); skeletonX = (int)(ui.window.getWidth() + (Gdx.graphics.getWidth() - ui.window.getWidth()) / 2); skeletonY = Gdx.graphics.getHeight() / 4; + ui.loadPrefs(); loadSkeleton( Gdx.files.internal(Gdx.app.getPreferences("spine-skeletonviewer").getString("lastFile", "spineboy/spineboy.json")), false); + + ui.loadPrefs(); } void loadSkeleton (final FileHandle skeletonFile, boolean reload) { @@ -180,7 +185,6 @@ public class SkeletonViewer extends ApplicationAdapter { }); this.skeletonFile = skeletonFile; - Preferences prefs = Gdx.app.getPreferences("spine-skeletonviewer"); prefs.putString("lastFile", skeletonFile.path()); prefs.flush(); lastModified = skeletonFile.lastModified(); @@ -205,12 +209,13 @@ public class SkeletonViewer extends ApplicationAdapter { // Configure skeleton from UI. if (ui.skinList.getSelected() != null) skeleton.setSkin(ui.skinList.getSelected()); - if (ui.animationList.getSelected() != null) setAnimation(); + setAnimation(); if (reload) ui.toast("Reloaded."); } void setAnimation () { + if (ui.animationList.getSelected() == null) return; TrackEntry current = state.getCurrent(0); if (current == null) { state.setEmptyAnimation(0, 0); @@ -228,6 +233,7 @@ public class SkeletonViewer extends ApplicationAdapter { float delta = Gdx.graphics.getDeltaTime(); + // Draw skeleton origin lines. ShapeRenderer shapes = debugRenderer.getShapeRenderer(); if (state != null) { shapes.setColor(Color.DARK_GRAY); @@ -238,6 +244,7 @@ public class SkeletonViewer extends ApplicationAdapter { } if (skeleton != null) { + // Reload if skeleton file was modified. if (reloadTimer <= 0) { lastModifiedCheck -= delta; if (lastModifiedCheck < 0) { @@ -250,6 +257,7 @@ public class SkeletonViewer extends ApplicationAdapter { if (reloadTimer <= 0) loadSkeleton(skeletonFile, true); } + // Pose and render skeleton. state.getData().setDefaultMix(ui.mixSlider.getValue()); renderer.setPremultipliedAlpha(ui.premultipliedCheckbox.isChecked()); @@ -277,6 +285,7 @@ public class SkeletonViewer extends ApplicationAdapter { debugRenderer.draw(skeleton); } + // Render UI. ui.stage.act(); ui.stage.draw(); @@ -340,10 +349,9 @@ public class SkeletonViewer extends ApplicationAdapter { TextButton slotsSetupPoseButton = new TextButton("Slots", skin); TextButton setupPoseButton = new TextButton("Both", skin); WidgetGroup toasts = new WidgetGroup(); + boolean prefsLoaded; public UI () { - // Configure widgets. - animationList.getSelection().setRequired(false); premultipliedCheckbox.setChecked(true); @@ -430,8 +438,6 @@ public class SkeletonViewer extends ApplicationAdapter { table.add(toasts); } - // Events. - window.addListener(new InputListener() { public boolean touchDown (InputEvent event, float x, float y, int pointer, int button) { event.cancel(); @@ -548,7 +554,31 @@ public class SkeletonViewer extends ApplicationAdapter { skeletonY = Gdx.graphics.getHeight() - screenY; return false; } + + public boolean touchUp (int screenX, int screenY, int pointer, int button) { + savePrefs(); + return false; + } })); + + ChangeListener savePrefsListener = new ChangeListener() { + public void changed (ChangeEvent event, Actor actor) { + if (actor instanceof Slider && ((Slider)actor).isDragging()) return; + savePrefs(); + } + }; + debugBonesCheckbox.addListener(savePrefsListener); + debugRegionsCheckbox.addListener(savePrefsListener); + debugMeshHullCheckbox.addListener(savePrefsListener); + debugMeshTrianglesCheckbox.addListener(savePrefsListener); + debugPathsCheckbox.addListener(savePrefsListener); + premultipliedCheckbox.addListener(savePrefsListener); + loopCheckbox.addListener(savePrefsListener); + speedSlider.addListener(savePrefsListener); + mixSlider.addListener(savePrefsListener); + scaleSlider.addListener(savePrefsListener); + animationList.addListener(savePrefsListener); + skinList.addListener(savePrefsListener); } private Table table (Actor... actors) { @@ -575,6 +605,43 @@ public class SkeletonViewer extends ApplicationAdapter { toasts.addActor(table); toasts.getParent().toFront(); } + + void savePrefs () { + if (!prefsLoaded) return; + prefs.putBoolean("debugBones", debugBonesCheckbox.isChecked()); + prefs.putBoolean("debugRegions", debugRegionsCheckbox.isChecked()); + prefs.putBoolean("debugMeshHull", debugMeshHullCheckbox.isChecked()); + prefs.putBoolean("debugMeshTriangles", debugMeshTrianglesCheckbox.isChecked()); + prefs.putBoolean("debugPaths", debugPathsCheckbox.isChecked()); + prefs.putBoolean("premultiplied", premultipliedCheckbox.isChecked()); + prefs.putBoolean("loop", loopCheckbox.isChecked()); + prefs.putFloat("speed", speedSlider.getValue()); + prefs.putFloat("mix", mixSlider.getValue()); + prefs.putFloat("scale", scaleSlider.getValue()); + prefs.putInteger("x", skeletonX); + prefs.putInteger("y", skeletonY); + if (animationList.getSelected() != null) prefs.putString("animationName", animationList.getSelected()); + if (skinList.getSelected() != null)prefs.putString("skinName", skinList.getSelected()); + prefs.flush(); + } + + void loadPrefs () { + debugBonesCheckbox.setChecked(prefs.getBoolean("debugBones", true)); + debugRegionsCheckbox.setChecked(prefs.getBoolean("debugRegions", false)); + debugMeshHullCheckbox.setChecked(prefs.getBoolean("debugMeshHull", false)); + debugMeshTrianglesCheckbox.setChecked(prefs.getBoolean("debugMeshTriangles", false)); + debugPathsCheckbox.setChecked(prefs.getBoolean("debugPaths", true)); + premultipliedCheckbox.setChecked(prefs.getBoolean("premultiplied", true)); + loopCheckbox.setChecked(prefs.getBoolean("loop", false)); + speedSlider.setValue(prefs.getFloat("speed", 0.3f)); + mixSlider.setValue(prefs.getFloat("mix", 0.3f)); + scaleSlider.setValue(prefs.getFloat("scale", 1)); + skeletonX = prefs.getInteger("x", 0); + skeletonY = prefs.getInteger("y", 0); + animationList.setSelected(prefs.getString("animationName", null)); + skinList.setSelected(prefs.getString("skinName", null)); + prefsLoaded = true; + } } static public void main (String[] args) throws Exception {