From 1bf7e5be9936f52d6b3492bba0e4631126def25d Mon Sep 17 00:00:00 2001 From: fgnm Date: Sun, 26 Dec 2021 23:58:51 +0100 Subject: [PATCH] Rework `ResourceManager` and related to completely detach extensions from runtime. * Removed `SpineDataComponent` * Removed `TalosDataComponent` --- ...atch-0.0.8.jar => plugin-9patch-0.1.0.jar} | Bin 22812 -> 22812 bytes ...0.0.8.jar => plugin-performance-0.1.0.jar} | Bin 5898 -> 5898 bytes ...0.8.jar => plugin-skin-composer-0.1.0.jar} | Bin 9943 -> 9943 bytes ...tiled-0.0.8.jar => plugin-tiled-0.1.0.jar} | Bin 103069 -> 103204 bytes h2d-libgdx-spine-extension | 2 +- h2d-libgdx-talos-extension | 2 +- h2d-libgdx-typinglabel-extension | 2 +- hyperlap2d-runtime-libgdx | 2 +- plugin-9patch/build.gradle | 2 +- plugin-performance/build.gradle | 2 +- plugin-skin-composer/build.gradle | 2 +- plugin-tiled/build.gradle | 2 +- .../plugin/tiled/TiledPanelMediator.java | 5 +- .../plugin/tiled/TilesResourceFilter.java | 3 +- .../tiled/manager/ResourcesManager.java | 3 +- .../plugin/tiled/tools/DrawTileTool.java | 3 +- .../tools/drawStrategy/SpineDrawStrategy.java | 9 +-- .../tiled/view/tabs/AbstractGridTilesTab.java | 7 ++- .../component/ReplaceSpineCommand.java | 59 +++++++++--------- .../component/UpdateSpineDataCommand.java | 19 +++--- .../component/UpdateTalosDataCommand.java | 11 +--- .../resource/ExportLibraryItemCommand.java | 2 + .../data/migrations/data020/CompositeVO.java | 2 + .../rednblack/editor/factory/ItemFactory.java | 6 +- .../editor/proxy/ResourceManager.java | 21 ++++--- .../editor/system/TalosContinuousSystem.java | 3 +- .../editor/utils/asset/impl/SpineAsset.java | 5 +- .../utils/asset/impl/TalosVFXAsset.java | 8 +-- .../editor/utils/runtime/EntityUtils.java | 10 +-- .../ui/box/UIMultiPropertyBoxMediator.java | 6 +- .../UIAnimationsTabMediator.java | 4 +- .../UIParticleEffectsTabMediator.java | 4 +- .../draggable/box/SpineResource.java | 2 +- .../view/ui/followers/FollowerFactory.java | 6 +- .../view/ui/followers/SpineFollower.java | 6 +- ...ISpineAnimationItemPropertiesMediator.java | 15 ++--- .../panels/UITalosPropertiesMediator.java | 6 +- .../view/ui/widget/actors/SpineActor.java | 3 +- 38 files changed, 125 insertions(+), 119 deletions(-) rename assets/plugins/{plugin-9patch-0.0.8.jar => plugin-9patch-0.1.0.jar} (91%) rename assets/plugins/{plugin-performance-0.0.8.jar => plugin-performance-0.1.0.jar} (84%) rename assets/plugins/{plugin-skin-composer-0.0.8.jar => plugin-skin-composer-0.1.0.jar} (88%) rename assets/plugins/{plugin-tiled-0.0.8.jar => plugin-tiled-0.1.0.jar} (68%) diff --git a/assets/plugins/plugin-9patch-0.0.8.jar b/assets/plugins/plugin-9patch-0.1.0.jar similarity index 91% rename from assets/plugins/plugin-9patch-0.0.8.jar rename to assets/plugins/plugin-9patch-0.1.0.jar index 8044429dfe5a86c078422881573df14c8f7d16e0..42476fe6ecc94f66c3c91366cca44ec6f3acbf1f 100644 GIT binary patch delta 295 zcmbQUiE+**M&1B#W)?061`ZB}<2z%eR0gIEf(^lRN-)F;i-MiN{O7@*VA?n&7)*DDRDfxg&bK&OPN delta 295 zcmbQUiE+**M&1B#W)?061`ZB}G#Af_yv58Qs#zIKt<(imH%&m)WC2ENFzv_a3Zgep zW3*ueGp;g;v4I)yIE;D03>C2>>|n-g*kV)jDV(b*5@MdP=VqoClU^u>G)(b*5@MdP=VqoClU`TWEoXA_u45FHq!PH7!Fm=-eL`@c8v3087PxC~5(iWq|FP7#RK<04LAK98s;n2rz)1=AZubHKE`7});F HQ^iUFa hJ;CanRl>mZ9F+pFIKOHxn66jN0@H6)A>#3B6#$WkQb+&* delta 191 zcmccad)=2ez?+$ci-CcIgCWhub0TjsGl*(d22(3_!PHF?5H(qV(HczqF?xXL%`+K$ z`N0fLK^9gp!$7Q)3C!3d;S3RBk~_o#5}ABlsSHdzC>w(55@m>Co0Ofv{O`)1VA@$F c3{1~aDFD;_s<~jgUNs9$zfpyV$E#HU0D~Dg{r~^~ diff --git a/assets/plugins/plugin-tiled-0.0.8.jar b/assets/plugins/plugin-tiled-0.1.0.jar similarity index 68% rename from assets/plugins/plugin-tiled-0.0.8.jar rename to assets/plugins/plugin-tiled-0.1.0.jar index 9930452c06c790452c7944b01b3a17500ba6bbce..034c75ab909d283a7258b1ec54dde31039a5d3a5 100644 GIT binary patch delta 27056 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 delta 26881 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 diff --git a/h2d-libgdx-spine-extension b/h2d-libgdx-spine-extension index b6ecaca3..dc01b4d6 160000 --- a/h2d-libgdx-spine-extension +++ b/h2d-libgdx-spine-extension @@ -1 +1 @@ -Subproject commit b6ecaca39d3ef8d9e8b78ac2943a97d9258bed15 +Subproject commit dc01b4d6f53b1a80258592eab11cbd904c7e89c0 diff --git a/h2d-libgdx-talos-extension b/h2d-libgdx-talos-extension index 35f0a1ed..0cc2a1e4 160000 --- a/h2d-libgdx-talos-extension +++ b/h2d-libgdx-talos-extension @@ -1 +1 @@ -Subproject commit 35f0a1ed8c739150078c12df6a2cb9954300402f +Subproject commit 0cc2a1e49168c857816c7326601fc3748ff7671f diff --git a/h2d-libgdx-typinglabel-extension b/h2d-libgdx-typinglabel-extension index 40d2d963..867d7703 160000 --- a/h2d-libgdx-typinglabel-extension +++ b/h2d-libgdx-typinglabel-extension @@ -1 +1 @@ -Subproject commit 40d2d9637ae8b4c7f4c7c3119b1e1454eb471a4d +Subproject commit 867d770366aa901651842d2244026cf1959f45e1 diff --git a/hyperlap2d-runtime-libgdx b/hyperlap2d-runtime-libgdx index d15fc11c..91b18cc5 160000 --- a/hyperlap2d-runtime-libgdx +++ b/hyperlap2d-runtime-libgdx @@ -1 +1 @@ -Subproject commit d15fc11cc2bcd9e2e57ca3e18297ebef9aaa6830 +Subproject commit 91b18cc5cf8bb79bf81ac61294016594c3bddedd diff --git a/plugin-9patch/build.gradle b/plugin-9patch/build.gradle index 579dce9e..9eb6accb 100644 --- a/plugin-9patch/build.gradle +++ b/plugin-9patch/build.gradle @@ -3,7 +3,7 @@ plugins { } group 'games.rednblack' -version '0.0.8' +version '0.1.0' repositories { mavenCentral() diff --git a/plugin-performance/build.gradle b/plugin-performance/build.gradle index 579dce9e..9eb6accb 100644 --- a/plugin-performance/build.gradle +++ b/plugin-performance/build.gradle @@ -3,7 +3,7 @@ plugins { } group 'games.rednblack' -version '0.0.8' +version '0.1.0' repositories { mavenCentral() diff --git a/plugin-skin-composer/build.gradle b/plugin-skin-composer/build.gradle index 784a0c26..6a26ecaa 100644 --- a/plugin-skin-composer/build.gradle +++ b/plugin-skin-composer/build.gradle @@ -3,7 +3,7 @@ plugins { } group 'games.rednblack' -version '0.0.8' +version '0.1.0' repositories { mavenCentral() diff --git a/plugin-tiled/build.gradle b/plugin-tiled/build.gradle index bf2b3e9c..594abeaf 100644 --- a/plugin-tiled/build.gradle +++ b/plugin-tiled/build.gradle @@ -3,7 +3,7 @@ plugins { } group 'games.rednblack' -version '0.0.8' +version '0.1.0' ext { pack = ["assets/textures", "assets/pack/", "tiled"] diff --git a/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/TiledPanelMediator.java b/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/TiledPanelMediator.java index b3dd8b81..51478435 100644 --- a/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/TiledPanelMediator.java +++ b/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/TiledPanelMediator.java @@ -23,6 +23,7 @@ import java.util.HashMap; import java.util.Iterator; import games.rednblack.editor.renderer.data.TexturePackVO; +import games.rednblack.h2d.extension.spine.SpineItemType; import org.puremvc.java.interfaces.INotification; import org.puremvc.java.patterns.mediator.Mediator; @@ -197,7 +198,7 @@ public class TiledPanelMediator extends Mediator { height = r.getRegionHeight() / TiledPlugin.AUTO_TILE_ROWS; } else { TileVO t = tiledPlugin.dataToSave.getTile(notification.getBody()); - if (t.entityType == EntityFactory.SPINE_TYPE) { + if (t.entityType == SpineItemType.SPINE_TYPE) { SpineDrawable spineDrawable = tiledPlugin.pluginRM.getSpineDrawable(t.regionName); width = spineDrawable.width; height = spineDrawable.height; @@ -404,7 +405,7 @@ public class TiledPanelMediator extends Mediator { else if (className.endsWith(".SpriteResource")) return EntityFactory.SPRITE_TYPE; else if (className.endsWith(".SpineResource")) - return EntityFactory.SPINE_TYPE; + return SpineItemType.SPINE_TYPE; return EntityFactory.UNKNOWN_TYPE; } diff --git a/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/TilesResourceFilter.java b/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/TilesResourceFilter.java index db747bc5..2071fc1d 100644 --- a/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/TilesResourceFilter.java +++ b/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/TilesResourceFilter.java @@ -2,6 +2,7 @@ package games.rednblack.editor.plugin.tiled; import games.rednblack.editor.renderer.factory.EntityFactory; import games.rednblack.h2d.common.filters.IAbstractResourceFilter; +import games.rednblack.h2d.extension.spine.SpineItemType; public class TilesResourceFilter extends IAbstractResourceFilter { @@ -16,7 +17,7 @@ public class TilesResourceFilter extends IAbstractResourceFilter { public boolean filterResource(String resName, int entityType) { if (entityType == EntityFactory.IMAGE_TYPE || entityType == EntityFactory.SPRITE_TYPE - || entityType == EntityFactory.SPINE_TYPE) { + || entityType == SpineItemType.SPINE_TYPE) { return tiledPlugin.dataToSave.containsAutoTile(resName) || tiledPlugin.dataToSave.containsTile(resName); } return false; diff --git a/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/manager/ResourcesManager.java b/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/manager/ResourcesManager.java index 7731319f..43d8efed 100644 --- a/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/manager/ResourcesManager.java +++ b/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/manager/ResourcesManager.java @@ -15,6 +15,7 @@ import games.rednblack.editor.plugin.tiled.TiledPlugin; import games.rednblack.editor.plugin.tiled.view.SpineDrawable; import games.rednblack.editor.renderer.factory.EntityFactory; import games.rednblack.h2d.extension.spine.ResourceRetrieverAttachmentLoader; +import games.rednblack.h2d.extension.spine.SpineItemType; import java.io.File; import java.io.FileOutputStream; @@ -98,7 +99,7 @@ public class ResourcesManager { if (spineDrawableCache.get(name) == null) { ResourceRetrieverAttachmentLoader atlasAttachmentLoader = new ResourceRetrieverAttachmentLoader(name, tiledPlugin.getAPI().getSceneLoader().getRm()); SkeletonJson skeletonJson = new SkeletonJson(atlasAttachmentLoader); - SkeletonData skeletonData = skeletonJson.readSkeletonData(tiledPlugin.getAPI().getSceneLoader().getRm().getSkeletonJSON(name)); + SkeletonData skeletonData = skeletonJson.readSkeletonData(tiledPlugin.getAPI().getSceneLoader().getRm().getExternalItemType(SpineItemType.SPINE_TYPE, name)); Skeleton skeleton = new Skeleton(skeletonData); spineDrawableCache.put(name, new SpineDrawable(skeleton, skeletonRenderer)); diff --git a/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/tools/DrawTileTool.java b/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/tools/DrawTileTool.java index 3623c243..1ce144e9 100644 --- a/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/tools/DrawTileTool.java +++ b/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/tools/DrawTileTool.java @@ -1,5 +1,6 @@ package games.rednblack.editor.plugin.tiled.tools; +import games.rednblack.h2d.extension.spine.SpineItemType; import org.puremvc.java.interfaces.INotification; import com.badlogic.gdx.Input; @@ -169,7 +170,7 @@ public class DrawTileTool implements Tool { case EntityFactory.SPRITE_TYPE: currentDrawStrategy = spriteDrawStrategy; break; - case EntityFactory.SPINE_TYPE: + case SpineItemType.SPINE_TYPE: currentDrawStrategy = spineDrawStrategy; break; default: diff --git a/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/tools/drawStrategy/SpineDrawStrategy.java b/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/tools/drawStrategy/SpineDrawStrategy.java index cfac5566..c6ae2e85 100644 --- a/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/tools/drawStrategy/SpineDrawStrategy.java +++ b/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/tools/drawStrategy/SpineDrawStrategy.java @@ -4,11 +4,12 @@ import com.esotericsoftware.spine.Skeleton; import com.esotericsoftware.spine.SkeletonData; import com.esotericsoftware.spine.SkeletonJson; import games.rednblack.editor.plugin.tiled.TiledPlugin; -import games.rednblack.editor.renderer.components.SpineDataComponent; import games.rednblack.editor.renderer.utils.ComponentRetriever; import games.rednblack.h2d.common.command.ReplaceSpineCommandBuilder; import games.rednblack.h2d.common.factory.IFactory; import games.rednblack.h2d.extension.spine.ResourceRetrieverAttachmentLoader; +import games.rednblack.h2d.extension.spine.SpineComponent; +import games.rednblack.h2d.extension.spine.SpineItemType; public class SpineDrawStrategy extends BasicDrawStrategy { @@ -39,15 +40,15 @@ public class SpineDrawStrategy extends BasicDrawStrategy { public void updateTile(int entity) { if (!checkValidTile(entity)) return; - SpineDataComponent spineDataComponent = ComponentRetriever.get(entity, SpineDataComponent.class, tiledPlugin.getAPI().getEngine()); - if (!spineDataComponent.animationName.equals(tiledPlugin.getSelectedTileName())) { + SpineComponent spineComponent = ComponentRetriever.get(entity, SpineComponent.class, tiledPlugin.getAPI().getEngine()); + if (!spineComponent.animationName.equals(tiledPlugin.getSelectedTileName())) { replaceSpineCommandBuilder.begin(entity); String animName = tiledPlugin.getSelectedTileName(); replaceSpineCommandBuilder.setAnimationName(animName); ResourceRetrieverAttachmentLoader atlasAttachmentLoader = new ResourceRetrieverAttachmentLoader(animName, tiledPlugin.getAPI().getSceneLoader().getRm()); SkeletonJson skeletonJson = new SkeletonJson(atlasAttachmentLoader); replaceSpineCommandBuilder.setSkeletonJson(skeletonJson); - SkeletonData skeletonData = skeletonJson.readSkeletonData((tiledPlugin.getAPI().getSceneLoader().getRm().getSkeletonJSON(animName))); + SkeletonData skeletonData = skeletonJson.readSkeletonData((tiledPlugin.getAPI().getSceneLoader().getRm().getExternalItemType(SpineItemType.SPINE_TYPE, animName))); replaceSpineCommandBuilder.setSkeleton(new Skeleton(skeletonData)); replaceSpineCommandBuilder.execute(tiledPlugin.facade); } diff --git a/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/view/tabs/AbstractGridTilesTab.java b/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/view/tabs/AbstractGridTilesTab.java index f299fece..ffe22378 100644 --- a/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/view/tabs/AbstractGridTilesTab.java +++ b/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/view/tabs/AbstractGridTilesTab.java @@ -19,6 +19,7 @@ import games.rednblack.editor.plugin.tiled.view.SpineDrawable; import games.rednblack.editor.plugin.tiled.view.tabs.listener.GridTabInputListener; import games.rednblack.editor.renderer.factory.EntityFactory; import games.rednblack.h2d.common.view.ui.StandardWidgetsFactory; +import games.rednblack.h2d.extension.spine.SpineItemType; public abstract class AbstractGridTilesTab extends DefaultTab { @@ -115,7 +116,7 @@ public abstract class AbstractGridTilesTab extends De protected void setGridSizeToFirstTileSize(String tileName, int type) { float width = 0; float height = 0; - if (type == EntityFactory.SPINE_TYPE) { + if (type == SpineItemType.SPINE_TYPE) { SpineDrawable spineDrawable = tiledPlugin.pluginRM.getSpineDrawable(tileName); width = spineDrawable.width; height = spineDrawable.height; @@ -157,14 +158,14 @@ public abstract class AbstractGridTilesTab extends De Drawable tileDrawable = null; if (i < savedTiles.size) { int t = savedTiles.get(i).getEntityType(); - if (t == EntityFactory.SPINE_TYPE) { + if (t == SpineItemType.SPINE_TYPE) { tileDrawable = resourcesManager.getSpineDrawable(savedTiles.get(i).getRegionName()); } else { tileDrawable = new TextureRegionDrawable(resourcesManager.getTextureRegion(savedTiles.get(i).getRegionName(), t)); } } else if (!tileName.equals("")) { if (i == tileIndex) { - if (type == EntityFactory.SPINE_TYPE) { + if (type == SpineItemType.SPINE_TYPE) { tileDrawable = resourcesManager.getSpineDrawable(tileName); } else { tileDrawable = new TextureRegionDrawable(resourcesManager.getTextureRegion(tileName, type)); diff --git a/src/main/java/games/rednblack/editor/controller/commands/component/ReplaceSpineCommand.java b/src/main/java/games/rednblack/editor/controller/commands/component/ReplaceSpineCommand.java index d1e22769..102ed299 100644 --- a/src/main/java/games/rednblack/editor/controller/commands/component/ReplaceSpineCommand.java +++ b/src/main/java/games/rednblack/editor/controller/commands/component/ReplaceSpineCommand.java @@ -4,12 +4,11 @@ import com.esotericsoftware.spine.*; import games.rednblack.editor.HyperLap2DFacade; import games.rednblack.editor.controller.commands.EntityModifyRevertibleCommand; import games.rednblack.editor.renderer.components.DimensionsComponent; -import games.rednblack.editor.renderer.components.SpineDataComponent; import games.rednblack.editor.renderer.components.TransformComponent; import games.rednblack.editor.utils.runtime.EntityUtils; import games.rednblack.editor.utils.runtime.SandboxComponentRetriever; import games.rednblack.h2d.common.MsgAPI; -import games.rednblack.h2d.extension.spine.SpineObjectComponent; +import games.rednblack.h2d.extension.spine.SpineComponent; public class ReplaceSpineCommand extends EntityModifyRevertibleCommand { @@ -29,33 +28,32 @@ public class ReplaceSpineCommand extends EntityModifyRevertibleCommand { entityId = EntityUtils.getEntityId(entity); - SpineDataComponent spineDataComponent = SandboxComponentRetriever.get(entity, SpineDataComponent.class); - SpineObjectComponent spineObjectComponent = SandboxComponentRetriever.get(entity, SpineObjectComponent.class); + SpineComponent spineComponent = SandboxComponentRetriever.get(entity, SpineComponent.class); DimensionsComponent dimensionsComponent = SandboxComponentRetriever.get(entity, DimensionsComponent.class); TransformComponent transformComponent = SandboxComponentRetriever.get(entity, TransformComponent.class); - backupAnimName = spineDataComponent.animationName; - backupSkeletonJson = spineObjectComponent.skeletonJson; - backupSkeleton = spineObjectComponent.skeleton; + backupAnimName = spineComponent.animationName; + backupSkeletonJson = spineComponent.skeletonJson; + backupSkeleton = spineComponent.skeleton; - spineDataComponent.animationName = animName; - spineObjectComponent.skeletonJson = skeletonJson; - spineObjectComponent.skeletonData = skeletonData; - spineObjectComponent.skeleton = skeleton; + spineComponent.animationName = animName; + spineComponent.skeletonJson = skeletonJson; + spineComponent.skeletonData = skeletonData; + spineComponent.skeleton = skeleton; AnimationStateData stateData = new AnimationStateData(skeletonData); - spineObjectComponent.state = new AnimationState(stateData); + spineComponent.state = new AnimationState(stateData); - spineObjectComponent.computeBoundBox(dimensionsComponent); - dimensionsComponent.width *= spineObjectComponent.worldMultiplier; - dimensionsComponent.height *= spineObjectComponent.worldMultiplier; + spineComponent.computeBoundBox(dimensionsComponent); + dimensionsComponent.width *= spineComponent.worldMultiplier; + dimensionsComponent.height *= spineComponent.worldMultiplier; transformComponent.originX = dimensionsComponent.width / 2f; transformComponent.originY = dimensionsComponent.height / 2f; String currentAnimName = skeletonData.getAnimations().get(0).getName(); - spineDataComponent.currentAnimationName = currentAnimName; - spineObjectComponent.setAnimation(currentAnimName); + spineComponent.currentAnimationName = currentAnimName; + spineComponent.setAnimation(currentAnimName); HyperLap2DFacade.getInstance().sendNotification(MsgAPI.ITEM_DATA_UPDATED, entity); } @@ -64,29 +62,28 @@ public class ReplaceSpineCommand extends EntityModifyRevertibleCommand { public void undoAction() { int entity = EntityUtils.getByUniqueId(entityId); - SpineDataComponent spineDataComponent = SandboxComponentRetriever.get(entity, SpineDataComponent.class); - SpineObjectComponent spineObjectComponent = SandboxComponentRetriever.get(entity, SpineObjectComponent.class); + SpineComponent spineComponent = SandboxComponentRetriever.get(entity, SpineComponent.class); DimensionsComponent dimensionsComponent = SandboxComponentRetriever.get(entity, DimensionsComponent.class); TransformComponent transformComponent = SandboxComponentRetriever.get(entity, TransformComponent.class); - spineDataComponent.animationName = backupAnimName; - spineObjectComponent.skeletonJson = backupSkeletonJson; - spineObjectComponent.skeletonData = backupSkeleton.getData(); - spineObjectComponent.skeleton = backupSkeleton; + spineComponent.animationName = backupAnimName; + spineComponent.skeletonJson = backupSkeletonJson; + spineComponent.skeletonData = backupSkeleton.getData(); + spineComponent.skeleton = backupSkeleton; - AnimationStateData stateData = new AnimationStateData(spineObjectComponent.skeletonData); - spineObjectComponent.state = new AnimationState(stateData); + AnimationStateData stateData = new AnimationStateData(spineComponent.skeletonData); + spineComponent.state = new AnimationState(stateData); - spineObjectComponent.computeBoundBox(dimensionsComponent); - dimensionsComponent.width *= spineObjectComponent.worldMultiplier; - dimensionsComponent.height *= spineObjectComponent.worldMultiplier; + spineComponent.computeBoundBox(dimensionsComponent); + dimensionsComponent.width *= spineComponent.worldMultiplier; + dimensionsComponent.height *= spineComponent.worldMultiplier; transformComponent.originX = dimensionsComponent.width / 2f; transformComponent.originY = dimensionsComponent.height / 2f; - String currentAnimName = spineObjectComponent.skeletonData.getAnimations().get(0).getName(); - spineDataComponent.currentAnimationName = currentAnimName; - spineObjectComponent.setAnimation(currentAnimName); + String currentAnimName = spineComponent.skeletonData.getAnimations().get(0).getName(); + spineComponent.currentAnimationName = currentAnimName; + spineComponent.setAnimation(currentAnimName); HyperLap2DFacade.getInstance().sendNotification(MsgAPI.ITEM_DATA_UPDATED, entity); } diff --git a/src/main/java/games/rednblack/editor/controller/commands/component/UpdateSpineDataCommand.java b/src/main/java/games/rednblack/editor/controller/commands/component/UpdateSpineDataCommand.java index 076a1d32..4df51feb 100644 --- a/src/main/java/games/rednblack/editor/controller/commands/component/UpdateSpineDataCommand.java +++ b/src/main/java/games/rednblack/editor/controller/commands/component/UpdateSpineDataCommand.java @@ -2,12 +2,11 @@ package games.rednblack.editor.controller.commands.component; import games.rednblack.editor.HyperLap2DFacade; import games.rednblack.editor.controller.commands.EntityModifyRevertibleCommand; -import games.rednblack.editor.renderer.components.SpineDataComponent; -import games.rednblack.editor.renderer.data.SpineVO; +import games.rednblack.h2d.extension.spine.SpineVO; import games.rednblack.editor.utils.runtime.EntityUtils; import games.rednblack.editor.utils.runtime.SandboxComponentRetriever; import games.rednblack.h2d.common.MsgAPI; -import games.rednblack.h2d.extension.spine.SpineObjectComponent; +import games.rednblack.h2d.extension.spine.SpineComponent; public class UpdateSpineDataCommand extends EntityModifyRevertibleCommand { @@ -24,11 +23,10 @@ public class UpdateSpineDataCommand extends EntityModifyRevertibleCommand { backup = new SpineVO(); backup.loadFromEntity(entity, sandbox.getEngine(), sandbox.sceneControl.sceneLoader.getEntityFactory()); - SpineDataComponent spineDataComponent = SandboxComponentRetriever.get(entity, SpineDataComponent.class); - SpineObjectComponent spineObjectComponent = SandboxComponentRetriever.get(entity, SpineObjectComponent.class); + SpineComponent spineComponent = SandboxComponentRetriever.get(entity, SpineComponent.class); - spineDataComponent.currentAnimationName = vo.currentAnimationName; - spineObjectComponent.setAnimation(vo.currentAnimationName); + spineComponent.currentAnimationName = vo.currentAnimationName; + spineComponent.setAnimation(vo.currentAnimationName); HyperLap2DFacade.getInstance().sendNotification(MsgAPI.ITEM_DATA_UPDATED, entity); } @@ -36,11 +34,10 @@ public class UpdateSpineDataCommand extends EntityModifyRevertibleCommand { @Override public void undoAction() { int entity = EntityUtils.getByUniqueId(entityId); - SpineDataComponent spineDataComponent = SandboxComponentRetriever.get(entity, SpineDataComponent.class); - SpineObjectComponent spineObjectComponent = SandboxComponentRetriever.get(entity, SpineObjectComponent.class); + SpineComponent spineComponent = SandboxComponentRetriever.get(entity, SpineComponent.class); - spineDataComponent.currentAnimationName = backup.currentAnimationName; - spineObjectComponent.setAnimation(backup.currentAnimationName); + spineComponent.currentAnimationName = backup.currentAnimationName; + spineComponent.setAnimation(backup.currentAnimationName); HyperLap2DFacade.getInstance().sendNotification(MsgAPI.ITEM_DATA_UPDATED, entity); } diff --git a/src/main/java/games/rednblack/editor/controller/commands/component/UpdateTalosDataCommand.java b/src/main/java/games/rednblack/editor/controller/commands/component/UpdateTalosDataCommand.java index 98bb02a4..4160f845 100644 --- a/src/main/java/games/rednblack/editor/controller/commands/component/UpdateTalosDataCommand.java +++ b/src/main/java/games/rednblack/editor/controller/commands/component/UpdateTalosDataCommand.java @@ -2,8 +2,7 @@ package games.rednblack.editor.controller.commands.component; import games.rednblack.editor.HyperLap2DFacade; import games.rednblack.editor.controller.commands.EntityModifyRevertibleCommand; -import games.rednblack.editor.renderer.components.particle.TalosDataComponent; -import games.rednblack.editor.renderer.data.TalosVO; +import games.rednblack.h2d.extension.talos.TalosVO; import games.rednblack.editor.utils.runtime.EntityUtils; import games.rednblack.editor.utils.runtime.SandboxComponentRetriever; import games.rednblack.h2d.common.MsgAPI; @@ -24,10 +23,8 @@ public class UpdateTalosDataCommand extends EntityModifyRevertibleCommand { backup = new TalosVO(); backup.loadFromEntity(entity, sandbox.getEngine(), sandbox.sceneControl.sceneLoader.getEntityFactory()); - TalosDataComponent dataComponent = SandboxComponentRetriever.get(entity, TalosDataComponent.class); - dataComponent.transform = vo.transform; - TalosComponent talosComponent = SandboxComponentRetriever.get(entity, TalosComponent.class); + talosComponent.transform = vo.transform; talosComponent.effect.setPosition(0, 0); HyperLap2DFacade.getInstance().sendNotification(MsgAPI.ITEM_DATA_UPDATED, entity); @@ -37,11 +34,9 @@ public class UpdateTalosDataCommand extends EntityModifyRevertibleCommand { public void undoAction() { int entity = EntityUtils.getByUniqueId(entityId); - TalosDataComponent particleComponent = SandboxComponentRetriever.get(entity, TalosDataComponent.class); - particleComponent.transform = backup.transform; - TalosComponent talosComponent = SandboxComponentRetriever.get(entity, TalosComponent.class); talosComponent.effect.setPosition(0, 0); + talosComponent.transform = backup.transform; HyperLap2DFacade.getInstance().sendNotification(MsgAPI.ITEM_DATA_UPDATED, entity); } diff --git a/src/main/java/games/rednblack/editor/controller/commands/resource/ExportLibraryItemCommand.java b/src/main/java/games/rednblack/editor/controller/commands/resource/ExportLibraryItemCommand.java index f693b0e7..047e794e 100644 --- a/src/main/java/games/rednblack/editor/controller/commands/resource/ExportLibraryItemCommand.java +++ b/src/main/java/games/rednblack/editor/controller/commands/resource/ExportLibraryItemCommand.java @@ -19,6 +19,8 @@ import games.rednblack.editor.utils.ZipUtils; import games.rednblack.h2d.common.MsgAPI; import games.rednblack.h2d.common.vo.ExportMapperVO; import games.rednblack.h2d.common.vo.ExportMapperVO.ExportedAsset; +import games.rednblack.h2d.extension.spine.SpineVO; +import games.rednblack.h2d.extension.talos.TalosVO; import org.apache.commons.io.FileUtils; import org.lwjgl.PointerBuffer; import org.lwjgl.system.MemoryStack; diff --git a/src/main/java/games/rednblack/editor/data/migrations/data020/CompositeVO.java b/src/main/java/games/rednblack/editor/data/migrations/data020/CompositeVO.java index 852ebe20..b8ce8ab4 100644 --- a/src/main/java/games/rednblack/editor/data/migrations/data020/CompositeVO.java +++ b/src/main/java/games/rednblack/editor/data/migrations/data020/CompositeVO.java @@ -1,6 +1,8 @@ package games.rednblack.editor.data.migrations.data020; import games.rednblack.editor.renderer.data.*; +import games.rednblack.h2d.extension.spine.SpineVO; +import games.rednblack.h2d.extension.talos.TalosVO; import java.util.ArrayList; import java.util.HashMap; diff --git a/src/main/java/games/rednblack/editor/factory/ItemFactory.java b/src/main/java/games/rednblack/editor/factory/ItemFactory.java index 598b5382..ac612a88 100644 --- a/src/main/java/games/rednblack/editor/factory/ItemFactory.java +++ b/src/main/java/games/rednblack/editor/factory/ItemFactory.java @@ -18,6 +18,8 @@ import games.rednblack.editor.view.stage.tools.TextTool; import games.rednblack.editor.view.ui.box.UILayerBoxMediator; import games.rednblack.h2d.common.MsgAPI; import games.rednblack.h2d.common.factory.IFactory; +import games.rednblack.h2d.extension.spine.SpineItemType; +import games.rednblack.h2d.extension.talos.TalosItemType; import java.util.HashMap; @@ -142,7 +144,7 @@ public class ItemFactory implements IFactory { } data.data = animationName; - createdEntity = entityFactory.createEntity(sandbox.getCurrentViewingEntity(), EntityFactory.SPINE_TYPE, data); + createdEntity = entityFactory.createEntity(sandbox.getCurrentViewingEntity(), SpineItemType.SPINE_TYPE, data); HyperLap2DFacade.getInstance().sendNotification(MsgAPI.ACTION_CREATE_ITEM, createdEntity); Pools.free(data); @@ -244,7 +246,7 @@ public class ItemFactory implements IFactory { return -1; } data.data = particleName; - int entity = entityFactory.createEntity(sandbox.getCurrentViewingEntity(), EntityFactory.TALOS_TYPE, data); + int entity = entityFactory.createEntity(sandbox.getCurrentViewingEntity(), TalosItemType.TALOS_TYPE, data); HyperLap2DFacade.getInstance().sendNotification(MsgAPI.ACTION_CREATE_ITEM, entity); diff --git a/src/main/java/games/rednblack/editor/proxy/ResourceManager.java b/src/main/java/games/rednblack/editor/proxy/ResourceManager.java index 4e925683..1c814491 100644 --- a/src/main/java/games/rednblack/editor/proxy/ResourceManager.java +++ b/src/main/java/games/rednblack/editor/proxy/ResourceManager.java @@ -25,7 +25,9 @@ import games.rednblack.editor.renderer.utils.H2DSkinLoader; import games.rednblack.editor.renderer.utils.HyperJson; import games.rednblack.editor.renderer.utils.ShadedDistanceFieldFont; import games.rednblack.editor.view.ui.widget.actors.basic.WhitePixel; +import games.rednblack.h2d.extension.spine.SpineItemType; import games.rednblack.h2d.extension.talos.ResourceRetrieverAssetProvider; +import games.rednblack.h2d.extension.talos.TalosItemType; import org.apache.commons.io.FileUtils; import org.apache.commons.io.FilenameUtils; import org.puremvc.java.patterns.proxy.Proxy; @@ -150,11 +152,6 @@ public class ResourceManager extends Proxy implements IResourceRetriever { return new ParticleEffect(particleEffects.get(name)); } - @Override - public FileHandle getTalosVFX(String name) { - return talosVFXsFiles.get(name); - } - /** * Sets working resolution, please set before doing any loading * @param resolution String resolution name, default is "orig" later use resolution names created in editor @@ -166,11 +163,17 @@ public class ResourceManager extends Proxy implements IResourceRetriever { } } - @Override - public FileHandle getSkeletonJSON(String animationName) { - SpineAnimData animData = spineAnimAtlases.get(animationName); - return animData.jsonFile; + public FileHandle getExternalItemType(int itemType, String name) { + switch (itemType) { + case SpineItemType.SPINE_TYPE: + SpineAnimData animData = spineAnimAtlases.get(name); + return animData.jsonFile; + case TalosItemType.TALOS_TYPE: + return talosVFXsFiles.get(name); + default: + return null; + } } @Override diff --git a/src/main/java/games/rednblack/editor/system/TalosContinuousSystem.java b/src/main/java/games/rednblack/editor/system/TalosContinuousSystem.java index d262d528..4b50c567 100644 --- a/src/main/java/games/rednblack/editor/system/TalosContinuousSystem.java +++ b/src/main/java/games/rednblack/editor/system/TalosContinuousSystem.java @@ -2,7 +2,6 @@ package games.rednblack.editor.system; import com.artemis.annotations.All; import com.talosvfx.talos.runtime.ParticleEffectInstance; -import games.rednblack.editor.renderer.components.particle.TalosDataComponent; import games.rednblack.h2d.extension.talos.TalosComponent; import games.rednblack.h2d.extension.talos.TalosSystem; @@ -11,7 +10,7 @@ import games.rednblack.h2d.extension.talos.TalosSystem; * This system will make sure they look continuous while in editor, so user will find and see them easily. * */ -@All({TalosComponent.class, TalosDataComponent.class}) +@All({TalosComponent.class}) public class TalosContinuousSystem extends TalosSystem { @Override diff --git a/src/main/java/games/rednblack/editor/utils/asset/impl/SpineAsset.java b/src/main/java/games/rednblack/editor/utils/asset/impl/SpineAsset.java index 0dbee2d0..8fae2e44 100644 --- a/src/main/java/games/rednblack/editor/utils/asset/impl/SpineAsset.java +++ b/src/main/java/games/rednblack/editor/utils/asset/impl/SpineAsset.java @@ -8,7 +8,6 @@ import com.badlogic.gdx.utils.JsonValue; import com.kotcrab.vis.ui.util.dialog.Dialogs; import games.rednblack.editor.proxy.ProjectManager; import games.rednblack.editor.proxy.SceneDataManager; -import games.rednblack.editor.renderer.components.SpineDataComponent; import games.rednblack.editor.renderer.data.*; import games.rednblack.editor.renderer.utils.Version; import games.rednblack.editor.utils.HyperLap2DUtils; @@ -18,7 +17,9 @@ import games.rednblack.editor.utils.runtime.EntityUtils; import games.rednblack.editor.utils.runtime.SandboxComponentRetriever; import games.rednblack.editor.view.stage.Sandbox; import games.rednblack.h2d.common.ProgressHandler; +import games.rednblack.h2d.extension.spine.SpineComponent; import games.rednblack.h2d.extension.spine.SpineItemType; +import games.rednblack.h2d.extension.spine.SpineVO; import org.apache.commons.io.FileUtils; import org.apache.commons.io.FilenameUtils; @@ -242,7 +243,7 @@ public class SpineAsset extends Asset { private void deleteEntitiesWithSpineAnimation(int rootEntity, String spineName) { tmpEntityList.clear(); Consumer action = (root) -> { - SpineDataComponent spineDataComponent = SandboxComponentRetriever.get(root, SpineDataComponent.class); + SpineComponent spineDataComponent = SandboxComponentRetriever.get(root, SpineComponent.class); if (spineDataComponent != null && spineDataComponent.animationName.equals(spineName)) { tmpEntityList.add(root); } diff --git a/src/main/java/games/rednblack/editor/utils/asset/impl/TalosVFXAsset.java b/src/main/java/games/rednblack/editor/utils/asset/impl/TalosVFXAsset.java index f8eb83ad..86c39966 100644 --- a/src/main/java/games/rednblack/editor/utils/asset/impl/TalosVFXAsset.java +++ b/src/main/java/games/rednblack/editor/utils/asset/impl/TalosVFXAsset.java @@ -8,11 +8,10 @@ import com.talosvfx.talos.runtime.ParticleEmitterDescriptor; import games.rednblack.editor.proxy.ProjectManager; import games.rednblack.editor.proxy.ResolutionManager; import games.rednblack.editor.proxy.SceneDataManager; -import games.rednblack.editor.renderer.components.particle.TalosDataComponent; import games.rednblack.editor.renderer.data.CompositeItemVO; import games.rednblack.editor.renderer.data.SceneVO; -import games.rednblack.editor.renderer.data.SpriteAnimationVO; -import games.rednblack.editor.renderer.data.TalosVO; +import games.rednblack.h2d.extension.talos.TalosComponent; +import games.rednblack.h2d.extension.talos.TalosVO; import games.rednblack.editor.utils.ImportUtils; import games.rednblack.editor.utils.asset.Asset; import games.rednblack.editor.utils.runtime.EntityUtils; @@ -25,7 +24,6 @@ import org.apache.commons.io.FilenameUtils; import java.io.File; import java.io.IOException; -import java.util.ArrayList; import java.util.function.Consumer; public class TalosVFXAsset extends Asset { @@ -231,7 +229,7 @@ public class TalosVFXAsset extends Asset { private void deleteEntitiesWithParticleEffects(int rootEntity, String particleName) { tmpEntityList.clear(); Consumer action = (root) -> { - TalosDataComponent particleComponent = SandboxComponentRetriever.get(root, TalosDataComponent.class); + TalosComponent particleComponent = SandboxComponentRetriever.get(root, TalosComponent.class); if (particleComponent != null && particleComponent.particleName.equals(particleName)) { tmpEntityList.add(root); } diff --git a/src/main/java/games/rednblack/editor/utils/runtime/EntityUtils.java b/src/main/java/games/rednblack/editor/utils/runtime/EntityUtils.java index cf115cd7..9c97b2ed 100644 --- a/src/main/java/games/rednblack/editor/utils/runtime/EntityUtils.java +++ b/src/main/java/games/rednblack/editor/utils/runtime/EntityUtils.java @@ -34,6 +34,8 @@ import games.rednblack.editor.renderer.data.*; import games.rednblack.editor.renderer.factory.EntityFactory; import games.rednblack.editor.renderer.utils.HyperJson; import games.rednblack.editor.view.stage.Sandbox; +import games.rednblack.h2d.extension.spine.SpineItemType; +import games.rednblack.h2d.extension.talos.TalosItemType; import java.util.*; import java.util.function.Consumer; @@ -55,10 +57,10 @@ public class EntityUtils { itemTypeNameMap.put(IMAGE_TYPE, "Image"); itemTypeNameMap.put(NINE_PATCH, "9-Patch Image"); itemTypeNameMap.put(LIGHT_TYPE, "Light"); - itemTypeNameMap.put(SPINE_TYPE, "Spine Animation"); + itemTypeNameMap.put(SpineItemType.SPINE_TYPE, "Spine Animation"); itemTypeNameMap.put(SPRITE_TYPE, "Sprite Animation"); itemTypeNameMap.put(COLOR_PRIMITIVE, "Primitive"); - itemTypeNameMap.put(TALOS_TYPE, "Talos VFX"); + itemTypeNameMap.put(TalosItemType.TALOS_TYPE, "Talos VFX"); itemTypeIconMap.put(UNKNOWN_TYPE, "icon-unknown"); itemTypeIconMap.put(COMPOSITE_TYPE, "icon-root"); @@ -67,10 +69,10 @@ public class EntityUtils { itemTypeIconMap.put(IMAGE_TYPE, "icon-image"); itemTypeIconMap.put(NINE_PATCH, "icon-image"); itemTypeIconMap.put(LIGHT_TYPE, "icon-particle-white"); - itemTypeIconMap.put(SPINE_TYPE, "icon-spine"); + itemTypeIconMap.put(SpineItemType.SPINE_TYPE, "icon-spine"); itemTypeIconMap.put(SPRITE_TYPE, "icon-animation"); itemTypeIconMap.put(COLOR_PRIMITIVE, "icon-image"); - itemTypeIconMap.put(TALOS_TYPE, "icon-particle-white"); + itemTypeIconMap.put(TalosItemType.TALOS_TYPE, "icon-particle-white"); } public static String getItemName(int entity) { diff --git a/src/main/java/games/rednblack/editor/view/ui/box/UIMultiPropertyBoxMediator.java b/src/main/java/games/rednblack/editor/view/ui/box/UIMultiPropertyBoxMediator.java index 8904fb93..88f6022b 100644 --- a/src/main/java/games/rednblack/editor/view/ui/box/UIMultiPropertyBoxMediator.java +++ b/src/main/java/games/rednblack/editor/view/ui/box/UIMultiPropertyBoxMediator.java @@ -40,6 +40,8 @@ import games.rednblack.editor.view.ui.properties.UIAbstractProperties; import games.rednblack.editor.view.ui.properties.UIAbstractPropertiesMediator; import games.rednblack.editor.view.ui.properties.panels.*; import games.rednblack.h2d.common.MsgAPI; +import games.rednblack.h2d.extension.spine.SpineItemType; +import games.rednblack.h2d.extension.talos.TalosItemType; import games.rednblack.h2d.extension.typinglabel.TypingLabelComponent; import org.puremvc.java.interfaces.IMediator; import org.puremvc.java.interfaces.INotification; @@ -173,7 +175,7 @@ public class UIMultiPropertyBoxMediator extends PanelMediator strings, Class resourceClass, BiFunction factoryFunction, String searchText) { for (String animationName : strings) { if (!animationName.toLowerCase().contains(searchText) - || filterResource(animationName, resourceClass == SpineResource.class ? EntityFactory.SPINE_TYPE : EntityFactory.SPRITE_TYPE)) + || filterResource(animationName, resourceClass == SpineResource.class ? SpineItemType.SPINE_TYPE : EntityFactory.SPRITE_TYPE)) continue; try { diff --git a/src/main/java/games/rednblack/editor/view/ui/box/resourcespanel/UIParticleEffectsTabMediator.java b/src/main/java/games/rednblack/editor/view/ui/box/resourcespanel/UIParticleEffectsTabMediator.java index a01a9130..b6e6103b 100644 --- a/src/main/java/games/rednblack/editor/view/ui/box/resourcespanel/UIParticleEffectsTabMediator.java +++ b/src/main/java/games/rednblack/editor/view/ui/box/resourcespanel/UIParticleEffectsTabMediator.java @@ -79,7 +79,7 @@ public class UIParticleEffectsTabMediator extends UIResourcesTabMediator strings, Class resourceClass, BiFunction factoryFunction, String searchText) { for (String particleName : strings) { if (!particleName.toLowerCase().contains(searchText) - || filterResource(particleName, resourceClass == TalosResource.class ? EntityFactory.TALOS_TYPE : EntityFactory.PARTICLE_TYPE)) continue; + || filterResource(particleName, resourceClass == TalosResource.class ? TalosItemType.TALOS_TYPE : EntityFactory.PARTICLE_TYPE)) continue; try { Constructor constructor = resourceClass.getConstructor(String.class); DraggableResource draggableResource = new DraggableResource((DraggableResourceView) constructor.newInstance(particleName)); diff --git a/src/main/java/games/rednblack/editor/view/ui/box/resourcespanel/draggable/box/SpineResource.java b/src/main/java/games/rednblack/editor/view/ui/box/resourcespanel/draggable/box/SpineResource.java index bca1b76d..f942eb05 100644 --- a/src/main/java/games/rednblack/editor/view/ui/box/resourcespanel/draggable/box/SpineResource.java +++ b/src/main/java/games/rednblack/editor/view/ui/box/resourcespanel/draggable/box/SpineResource.java @@ -22,7 +22,7 @@ import com.badlogic.gdx.Gdx; import com.badlogic.gdx.scenes.scene2d.Actor; import com.badlogic.gdx.scenes.scene2d.InputEvent; import com.badlogic.gdx.scenes.scene2d.utils.ClickListener; -import games.rednblack.editor.renderer.data.SpineVO; +import games.rednblack.h2d.extension.spine.SpineVO; import games.rednblack.editor.view.ui.box.UIResourcesBoxMediator; import games.rednblack.editor.view.ui.widget.actors.SpineActor; import games.rednblack.h2d.common.ResourcePayloadObject; diff --git a/src/main/java/games/rednblack/editor/view/ui/followers/FollowerFactory.java b/src/main/java/games/rednblack/editor/view/ui/followers/FollowerFactory.java index 2e21508a..75b67d4b 100644 --- a/src/main/java/games/rednblack/editor/view/ui/followers/FollowerFactory.java +++ b/src/main/java/games/rednblack/editor/view/ui/followers/FollowerFactory.java @@ -20,6 +20,8 @@ package games.rednblack.editor.view.ui.followers; import games.rednblack.editor.renderer.factory.EntityFactory; import games.rednblack.editor.utils.runtime.EntityUtils; +import games.rednblack.h2d.extension.spine.SpineItemType; +import games.rednblack.h2d.extension.talos.TalosItemType; /** * Created by azakhary on 5/21/2015. @@ -32,10 +34,10 @@ public class FollowerFactory { return new ImageFollower(entity); case EntityFactory.LIGHT_TYPE: return new LightFollower(entity); - case EntityFactory.TALOS_TYPE: + case TalosItemType.TALOS_TYPE: case EntityFactory.PARTICLE_TYPE: return new ParticleFollower(entity); - case EntityFactory.SPINE_TYPE: + case SpineItemType.SPINE_TYPE: return new SpineFollower(entity); } diff --git a/src/main/java/games/rednblack/editor/view/ui/followers/SpineFollower.java b/src/main/java/games/rednblack/editor/view/ui/followers/SpineFollower.java index 0eece3b5..43d0dcc0 100644 --- a/src/main/java/games/rednblack/editor/view/ui/followers/SpineFollower.java +++ b/src/main/java/games/rednblack/editor/view/ui/followers/SpineFollower.java @@ -7,17 +7,17 @@ import com.badlogic.gdx.math.Matrix4; import com.esotericsoftware.spine.SkeletonRendererDebug; import games.rednblack.editor.utils.runtime.SandboxComponentRetriever; import games.rednblack.editor.view.stage.Sandbox; -import games.rednblack.h2d.extension.spine.SpineObjectComponent; +import games.rednblack.h2d.extension.spine.SpineComponent; public class SpineFollower extends NormalSelectionFollower { - private final SpineObjectComponent spineObjectComponent; + private final SpineComponent spineObjectComponent; private final SkeletonRendererDebug skeletonRendererDebug; private final Matrix4 matrix = new Matrix4(); public SpineFollower(int entity) { super(entity); - spineObjectComponent = SandboxComponentRetriever.get(entity, SpineObjectComponent.class); + spineObjectComponent = SandboxComponentRetriever.get(entity, SpineComponent.class); skeletonRendererDebug = new SkeletonRendererDebug(); skeletonRendererDebug.setScale(2f); skeletonRendererDebug.setBoundingBoxes(false); diff --git a/src/main/java/games/rednblack/editor/view/ui/properties/panels/UISpineAnimationItemPropertiesMediator.java b/src/main/java/games/rednblack/editor/view/ui/properties/panels/UISpineAnimationItemPropertiesMediator.java index b1b40eff..d4a4847c 100644 --- a/src/main/java/games/rednblack/editor/view/ui/properties/panels/UISpineAnimationItemPropertiesMediator.java +++ b/src/main/java/games/rednblack/editor/view/ui/properties/panels/UISpineAnimationItemPropertiesMediator.java @@ -21,19 +21,17 @@ package games.rednblack.editor.view.ui.properties.panels; import com.badlogic.gdx.utils.Array; import com.esotericsoftware.spine.Animation; import games.rednblack.editor.controller.commands.component.UpdateSpineDataCommand; -import games.rednblack.editor.renderer.components.SpineDataComponent; -import games.rednblack.editor.renderer.data.SpineVO; +import games.rednblack.h2d.extension.spine.SpineVO; import games.rednblack.editor.utils.runtime.SandboxComponentRetriever; import games.rednblack.editor.view.ui.properties.UIItemPropertiesMediator; import games.rednblack.h2d.common.MsgAPI; -import games.rednblack.h2d.extension.spine.SpineObjectComponent; +import games.rednblack.h2d.extension.spine.SpineComponent; public class UISpineAnimationItemPropertiesMediator extends UIItemPropertiesMediator { private static final String TAG = UISpineAnimationItemPropertiesMediator.class.getCanonicalName(); public static final String NAME = TAG; - private SpineDataComponent spineDataComponent; - private SpineObjectComponent spineObjectComponent; + private SpineComponent spineComponent; public UISpineAnimationItemPropertiesMediator() { super(NAME, new UISpineAnimationItemProperties()); @@ -41,16 +39,15 @@ public class UISpineAnimationItemPropertiesMediator extends UIItemPropertiesMedi @Override protected void translateObservableDataToView(int entity) { - spineObjectComponent = SandboxComponentRetriever.get(entity, SpineObjectComponent.class); - spineDataComponent = SandboxComponentRetriever.get(entity, SpineDataComponent.class); + spineComponent = SandboxComponentRetriever.get(entity, SpineComponent.class); Array animations = new Array<>(); - for (Animation animation : spineObjectComponent.getAnimations()) { + for (Animation animation : spineComponent.getAnimations()) { animations.add(animation.getName()); } viewComponent.setAnimations(animations); - viewComponent.setSelectedAnimation(spineDataComponent.currentAnimationName); + viewComponent.setSelectedAnimation(spineComponent.currentAnimationName); } @Override diff --git a/src/main/java/games/rednblack/editor/view/ui/properties/panels/UITalosPropertiesMediator.java b/src/main/java/games/rednblack/editor/view/ui/properties/panels/UITalosPropertiesMediator.java index bb82dabc..94d685a0 100644 --- a/src/main/java/games/rednblack/editor/view/ui/properties/panels/UITalosPropertiesMediator.java +++ b/src/main/java/games/rednblack/editor/view/ui/properties/panels/UITalosPropertiesMediator.java @@ -1,8 +1,8 @@ package games.rednblack.editor.view.ui.properties.panels; import games.rednblack.editor.controller.commands.component.UpdateTalosDataCommand; -import games.rednblack.editor.renderer.components.particle.TalosDataComponent; -import games.rednblack.editor.renderer.data.TalosVO; +import games.rednblack.h2d.extension.talos.TalosComponent; +import games.rednblack.h2d.extension.talos.TalosVO; import games.rednblack.editor.utils.runtime.SandboxComponentRetriever; import games.rednblack.editor.view.ui.properties.UIItemPropertiesMediator; import games.rednblack.h2d.common.MsgAPI; @@ -18,7 +18,7 @@ public class UITalosPropertiesMediator extends UIItemPropertiesMediator