From 3c81af5be5f05ec9bdc03035da4276529f3f9663 Mon Sep 17 00:00:00 2001 From: fgnm Date: Sat, 25 Dec 2021 00:46:22 +0100 Subject: [PATCH] * Rework `CompositeItemVO` class to support general entities type. * Remove `CompositeVO` * Upgrade Project Version to `1.0.0` (support migration) * Bump HyperLap2D version to `0.1.0` --- assets/configs/app.properties | 2 +- build.gradle | 2 +- h2d-libgdx-spine-extension | 2 +- h2d-libgdx-talos-extension | 2 +- h2d-libgdx-typinglabel-extension | 2 +- hyperlap2d-common-api | 2 +- hyperlap2d-runtime-libgdx | 2 +- .../plugin/tiled/save/SaveDataManager.java | 3 +- .../games/rednblack/editor/HyperLap2DApp.java | 2 +- .../commands/AddToLibraryCommand.java | 2 +- .../controller/commands/CutItemsCommand.java | 7 +- .../commands/DeleteItemsCommand.java | 7 +- .../commands/DeleteLayerAtomCommand.java | 2 +- .../EntityModifyRevertibleCommand.java | 4 +- .../commands/PasteItemsCommand.java | 78 +++---- .../component/UpdateCompositeDataCommand.java | 2 +- .../component/UpdateLightDataCommand.java | 2 +- .../component/UpdateParticleDataCommand.java | 2 +- .../component/UpdateSpineDataCommand.java | 2 +- .../component/UpdateTalosDataCommand.java | 2 +- .../resource/DuplicateLibraryAction.java | 3 +- .../resource/ExportLibraryItemCommand.java | 26 +-- .../migrations/ProjectVersionMigrator.java | 12 +- .../migrations/data020/CompositeItemVO.java | 18 ++ .../data/migrations/data020/CompositeVO.java | 23 ++ .../migrations/data020/ProjectInfoVO.java | 22 ++ .../data/migrations/data020/SceneVO.java | 18 ++ .../migrations/migrators/VersionMigTo100.java | 202 ++++++++++++++++++ .../rednblack/editor/factory/ItemFactory.java | 5 +- .../editor/proxy/ProjectManager.java | 11 +- .../editor/proxy/ResourceManager.java | 26 +-- .../editor/proxy/SceneDataManager.java | 16 +- .../editor/proxy/SettingsManager.java | 5 +- .../rednblack/editor/utils/asset/Asset.java | 3 +- .../asset/impl/HyperLap2DActionAsset.java | 3 +- .../impl/HyperLap2DInternalLibraryAsset.java | 5 +- .../asset/impl/HyperLap2DLibraryAsset.java | 4 +- .../editor/utils/asset/impl/ImageAsset.java | 35 +-- .../utils/asset/impl/ParticleEffectAsset.java | 21 +- .../editor/utils/asset/impl/SpineAsset.java | 27 +-- .../asset/impl/SpriteAnimationAtlasAsset.java | 18 +- .../utils/asset/impl/TalosVFXAsset.java | 22 +- .../editor/utils/runtime/EntityUtils.java | 172 +++------------ .../rednblack/editor/view/stage/Sandbox.java | 26 +-- .../view/ui/box/UILayerBoxMediator.java | 13 +- .../UICompositeItemPropertiesMediator.java | 2 +- .../panels/UILightItemPropertiesMediator.java | 4 +- 47 files changed, 500 insertions(+), 371 deletions(-) create mode 100644 src/main/java/games/rednblack/editor/data/migrations/data020/CompositeItemVO.java create mode 100644 src/main/java/games/rednblack/editor/data/migrations/data020/CompositeVO.java create mode 100644 src/main/java/games/rednblack/editor/data/migrations/data020/ProjectInfoVO.java create mode 100644 src/main/java/games/rednblack/editor/data/migrations/data020/SceneVO.java create mode 100644 src/main/java/games/rednblack/editor/data/migrations/migrators/VersionMigTo100.java diff --git a/assets/configs/app.properties b/assets/configs/app.properties index 779e0e69..ff26befb 100644 --- a/assets/configs/app.properties +++ b/assets/configs/app.properties @@ -1 +1 @@ -version=0.0.8-SNAPSHOT \ No newline at end of file +version=0.1.0-SNAPSHOT \ No newline at end of file diff --git a/build.gradle b/build.gradle index 2ee2d6ef..8e762973 100644 --- a/build.gradle +++ b/build.gradle @@ -14,7 +14,7 @@ plugins { } group 'games.rednblack' -version '0.0.8' +version '0.1.0' repositories { mavenCentral() diff --git a/h2d-libgdx-spine-extension b/h2d-libgdx-spine-extension index 30f16945..b6ecaca3 160000 --- a/h2d-libgdx-spine-extension +++ b/h2d-libgdx-spine-extension @@ -1 +1 @@ -Subproject commit 30f169459e635c99f1b1f164d78864e1590d1cf9 +Subproject commit b6ecaca39d3ef8d9e8b78ac2943a97d9258bed15 diff --git a/h2d-libgdx-talos-extension b/h2d-libgdx-talos-extension index 9a1dfeb3..35f0a1ed 160000 --- a/h2d-libgdx-talos-extension +++ b/h2d-libgdx-talos-extension @@ -1 +1 @@ -Subproject commit 9a1dfeb358b52b428353dde89f5680f6ecac963c +Subproject commit 35f0a1ed8c739150078c12df6a2cb9954300402f diff --git a/h2d-libgdx-typinglabel-extension b/h2d-libgdx-typinglabel-extension index 185801e5..40d2d963 160000 --- a/h2d-libgdx-typinglabel-extension +++ b/h2d-libgdx-typinglabel-extension @@ -1 +1 @@ -Subproject commit 185801e5451310429637d6695a2c6b51e92841dd +Subproject commit 40d2d9637ae8b4c7f4c7c3119b1e1454eb471a4d diff --git a/hyperlap2d-common-api b/hyperlap2d-common-api index 25457b5d..c1d4e0df 160000 --- a/hyperlap2d-common-api +++ b/hyperlap2d-common-api @@ -1 +1 @@ -Subproject commit 25457b5d12521e09903275ccf90a8f962226433f +Subproject commit c1d4e0df74c32f7a588b8874831d9abd1f178433 diff --git a/hyperlap2d-runtime-libgdx b/hyperlap2d-runtime-libgdx index 711e9939..ffa02723 160000 --- a/hyperlap2d-runtime-libgdx +++ b/hyperlap2d-runtime-libgdx @@ -1 +1 @@ -Subproject commit 711e9939eac7deb6af0d5bece061f22eb2310dde +Subproject commit ffa02723257b0e72db1135810733ad17d9cfe4c2 diff --git a/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/save/SaveDataManager.java b/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/save/SaveDataManager.java index d1f9429e..077e4c6a 100644 --- a/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/save/SaveDataManager.java +++ b/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/save/SaveDataManager.java @@ -3,6 +3,7 @@ package games.rednblack.editor.plugin.tiled.save; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.files.FileHandle; import com.badlogic.gdx.utils.Json; +import games.rednblack.editor.renderer.utils.HyperJson; /** * Created by mariam on 3/24/16. @@ -16,7 +17,7 @@ public class SaveDataManager { public SaveDataManager(String projectPath) { - json = new Json(); + json = HyperJson.getJson(); fileHandle = Gdx.files.absolute(projectPath + "/tiled_plugin.dt"); load(); } diff --git a/src/main/java/games/rednblack/editor/HyperLap2DApp.java b/src/main/java/games/rednblack/editor/HyperLap2DApp.java index 6943b13b..e8a21754 100644 --- a/src/main/java/games/rednblack/editor/HyperLap2DApp.java +++ b/src/main/java/games/rednblack/editor/HyperLap2DApp.java @@ -60,7 +60,7 @@ public class HyperLap2DApp extends ApplicationAdapter { hyperlap2D = new HyperLap2D(settingsManager); Lwjgl3ApplicationConfiguration config = new Lwjgl3ApplicationConfiguration(); - config.setTitle("HyperLap2D - Public Alpha v" + AppConfig.getInstance().versionString); + config.setTitle("HyperLap2D - Beta v" + AppConfig.getInstance().versionString); config.setResizable(true); config.setWindowedMode((int) (windowWidth), (int) (windowHeight)); config.setIdleFPS(60); diff --git a/src/main/java/games/rednblack/editor/controller/commands/AddToLibraryCommand.java b/src/main/java/games/rednblack/editor/controller/commands/AddToLibraryCommand.java index 3e49abb2..3de6c23c 100644 --- a/src/main/java/games/rednblack/editor/controller/commands/AddToLibraryCommand.java +++ b/src/main/java/games/rednblack/editor/controller/commands/AddToLibraryCommand.java @@ -57,7 +57,7 @@ public class AddToLibraryCommand extends RevertibleCommand { } CompositeItemVO newVO = new CompositeItemVO(); - newVO.loadFromEntity(item, sandbox.getEngine()); + newVO.loadFromEntity(item, sandbox.getEngine(), sandbox.sceneControl.sceneLoader.getEntityFactory()); newVO.cleanIds(); libraryItems.put(createdLibraryItemName, newVO); diff --git a/src/main/java/games/rednblack/editor/controller/commands/CutItemsCommand.java b/src/main/java/games/rednblack/editor/controller/commands/CutItemsCommand.java index 4d935c6f..e068ca16 100644 --- a/src/main/java/games/rednblack/editor/controller/commands/CutItemsCommand.java +++ b/src/main/java/games/rednblack/editor/controller/commands/CutItemsCommand.java @@ -20,7 +20,8 @@ package games.rednblack.editor.controller.commands; import com.badlogic.gdx.utils.Json; import games.rednblack.editor.HyperLap2DFacade; -import games.rednblack.editor.renderer.data.CompositeVO; +import games.rednblack.editor.renderer.data.CompositeItemVO; +import games.rednblack.editor.renderer.utils.HyperJson; import games.rednblack.editor.utils.runtime.EntityUtils; import games.rednblack.editor.view.stage.Sandbox; import games.rednblack.h2d.common.MsgAPI; @@ -47,8 +48,8 @@ public class CutItemsCommand extends EntityModifyRevertibleCommand { @Override public void undoAction() { - Json json = new Json(); - CompositeVO compositeVO = json.fromJson(CompositeVO.class, backup); + Json json = HyperJson.getJson(); + CompositeItemVO compositeVO = json.fromJson(CompositeItemVO.class, backup); Set newEntitiesList = PasteItemsCommand.createEntitiesFromVO(compositeVO); sandbox.getEngine().process(); diff --git a/src/main/java/games/rednblack/editor/controller/commands/DeleteItemsCommand.java b/src/main/java/games/rednblack/editor/controller/commands/DeleteItemsCommand.java index 7b285c95..8b765440 100644 --- a/src/main/java/games/rednblack/editor/controller/commands/DeleteItemsCommand.java +++ b/src/main/java/games/rednblack/editor/controller/commands/DeleteItemsCommand.java @@ -21,7 +21,8 @@ package games.rednblack.editor.controller.commands; import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.Json; import games.rednblack.editor.HyperLap2DFacade; -import games.rednblack.editor.renderer.data.CompositeVO; +import games.rednblack.editor.renderer.data.CompositeItemVO; +import games.rednblack.editor.renderer.utils.HyperJson; import games.rednblack.editor.utils.runtime.EntityUtils; import games.rednblack.editor.view.ui.FollowersUIMediator; import games.rednblack.h2d.common.MsgAPI; @@ -73,8 +74,8 @@ public class DeleteItemsCommand extends EntityModifyRevertibleCommand { @Override public void undoAction() { - Json json = new Json(); - CompositeVO compositeVO = json.fromJson(CompositeVO.class, backup); + Json json = HyperJson.getJson(); + CompositeItemVO compositeVO = json.fromJson(CompositeItemVO.class, backup); Set newEntitiesList = PasteItemsCommand.createEntitiesFromVO(compositeVO); sandbox.getEngine().process(); diff --git a/src/main/java/games/rednblack/editor/controller/commands/DeleteLayerAtomCommand.java b/src/main/java/games/rednblack/editor/controller/commands/DeleteLayerAtomCommand.java index 0e7bf4c0..a46faff5 100644 --- a/src/main/java/games/rednblack/editor/controller/commands/DeleteLayerAtomCommand.java +++ b/src/main/java/games/rednblack/editor/controller/commands/DeleteLayerAtomCommand.java @@ -26,7 +26,7 @@ public class DeleteLayerAtomCommand extends EntityModifyRevertibleCommand { int viewingEntity = Sandbox.getInstance().getCurrentViewingEntity(); LayerMapComponent layerMapComponent = SandboxComponentRetriever.get(viewingEntity, LayerMapComponent.class); - if(layerMapComponent.getLayers().size() > 1) { + if(layerMapComponent.getLayers().size > 1) { layerMapComponent.deleteLayer(layerName); } else { cancel(); diff --git a/src/main/java/games/rednblack/editor/controller/commands/EntityModifyRevertibleCommand.java b/src/main/java/games/rednblack/editor/controller/commands/EntityModifyRevertibleCommand.java index bc2cb597..2c248aa4 100644 --- a/src/main/java/games/rednblack/editor/controller/commands/EntityModifyRevertibleCommand.java +++ b/src/main/java/games/rednblack/editor/controller/commands/EntityModifyRevertibleCommand.java @@ -59,7 +59,7 @@ public abstract class EntityModifyRevertibleCommand extends RevertibleCommand { HashMap libraryItems = projectManager.currentProjectInfoVO.libraryItems; if (libraryItems.containsKey(mainItemComponent.libraryLink)) { CompositeItemVO itemVO = new CompositeItemVO(); - itemVO.loadFromEntity(entity, sandbox.getEngine()); + itemVO.loadFromEntity(entity, sandbox.getEngine(), sandbox.sceneControl.sceneLoader.getEntityFactory()); itemVO.cleanIds(); libraryItems.put(mainItemComponent.libraryLink, itemVO); } @@ -75,7 +75,7 @@ public abstract class EntityModifyRevertibleCommand extends RevertibleCommand { sandbox.getEngine().process(); EntityFactory factory = sandbox.getSceneControl().sceneLoader.getEntityFactory(); - factory.initAllChildren(dependable, libraryItems.get(link).composite); + factory.initAllChildren(dependable, libraryItems.get(link)); } } } diff --git a/src/main/java/games/rednblack/editor/controller/commands/PasteItemsCommand.java b/src/main/java/games/rednblack/editor/controller/commands/PasteItemsCommand.java index 9a661d12..3ef9003c 100644 --- a/src/main/java/games/rednblack/editor/controller/commands/PasteItemsCommand.java +++ b/src/main/java/games/rednblack/editor/controller/commands/PasteItemsCommand.java @@ -24,9 +24,10 @@ import com.badlogic.gdx.utils.Json; import games.rednblack.editor.HyperLap2DFacade; import games.rednblack.editor.renderer.components.TransformComponent; import games.rednblack.editor.renderer.components.ZIndexComponent; -import games.rednblack.editor.renderer.data.CompositeVO; +import games.rednblack.editor.renderer.data.CompositeItemVO; import games.rednblack.editor.renderer.data.MainItemVO; import games.rednblack.editor.renderer.factory.EntityFactory; +import games.rednblack.editor.renderer.utils.HyperJson; import games.rednblack.editor.utils.runtime.EntityUtils; import games.rednblack.editor.utils.runtime.SandboxComponentRetriever; import games.rednblack.editor.view.stage.Sandbox; @@ -34,7 +35,6 @@ import games.rednblack.editor.view.ui.FollowersUIMediator; import games.rednblack.editor.view.ui.box.UILayerBoxMediator; import games.rednblack.h2d.common.MsgAPI; -import java.util.ArrayList; import java.util.HashSet; import java.util.Set; @@ -60,9 +60,10 @@ public class PasteItemsCommand extends EntityModifyRevertibleCommand { Vector2 diff = cameraCurrPosition.sub(cameraPrevPosition); - Json json = new Json(); - CompositeVO compositeVO = json.fromJson(CompositeVO.class, (String) payload[1]); - forceIdChange(compositeVO); + Json json = HyperJson.getJson(); + CompositeItemVO compositeVO = json.fromJson(CompositeItemVO.class, (String) payload[1]); + compositeVO.cleanIds(); + Set newEntitiesList = createEntitiesFromVO(compositeVO); sandbox.getEngine().process(); for (int entity : newEntitiesList) { @@ -91,60 +92,31 @@ public class PasteItemsCommand extends EntityModifyRevertibleCommand { pastedEntityIds.clear(); } - public static void forceIdChange(CompositeVO compositeVO) { - ArrayList items = compositeVO.getAllItems(); - for(MainItemVO item: items) { - item.uniqueId = -1; - } - } - - - public static Set createEntitiesFromVO(CompositeVO compositeVO) { + public static Set createEntitiesFromVO(CompositeItemVO compositeVO) { Set entities = new HashSet<>(); EntityFactory factory = Sandbox.getInstance().sceneControl.sceneLoader.getEntityFactory(); int parentEntity = Sandbox.getInstance().getCurrentViewingEntity(); - for (int i = 0; i < compositeVO.sImages.size(); i++) { - int child = factory.createEntity(parentEntity, compositeVO.sImages.get(i)); - entities.add(child); + + for (String key : compositeVO.content.keys()) { + if (key.equals(CompositeItemVO.class.getName())) continue; + + Array vos = compositeVO.content.get(key); + for (MainItemVO mainItemVO : vos) { + int entity = factory.createEntity(parentEntity, mainItemVO); + entities.add(entity); + } } - for (int i = 0; i < compositeVO.sImage9patchs.size(); i++) { - int child = factory.createEntity(parentEntity, compositeVO.sImage9patchs.get(i)); - entities.add(child); - } - for (int i = 0; i < compositeVO.sLabels.size(); i++) { - int child = factory.createEntity(parentEntity, compositeVO.sLabels.get(i)); - entities.add(child); - } - for (int i = 0; i < compositeVO.sParticleEffects.size(); i++) { - int child = factory.createEntity(parentEntity, compositeVO.sParticleEffects.get(i)); - entities.add(child); - } - for (int i = 0; i < compositeVO.sTalosVFX.size(); i++) { - int child = factory.createEntity(parentEntity, compositeVO.sTalosVFX.get(i)); - entities.add(child); - } - for (int i = 0; i < compositeVO.sLights.size(); i++) { - int child = factory.createEntity(parentEntity, compositeVO.sLights.get(i)); - entities.add(child); - } - for (int i = 0; i < compositeVO.sSpineAnimations.size(); i++) { - int child = factory.createEntity(parentEntity, compositeVO.sSpineAnimations.get(i)); - entities.add(child); - } - for (int i = 0; i < compositeVO.sSpriteAnimations.size(); i++) { - int child = factory.createEntity(parentEntity, compositeVO.sSpriteAnimations.get(i)); - entities.add(child); - } - for (int i = 0; i < compositeVO.sColorPrimitives.size(); i++) { - int child = factory.createEntity(parentEntity, compositeVO.sColorPrimitives.get(i)); - entities.add(child); - } - for (int i = 0; i < compositeVO.sComposites.size(); i++) { - int child = factory.createEntity(parentEntity, compositeVO.sComposites.get(i)); - entities.add(child); - factory.initAllChildren(child, compositeVO.sComposites.get(i).composite); + + Array compositeVOs = compositeVO.content.get(CompositeItemVO.class.getName()); + if (compositeVOs != null) { + for (MainItemVO mainItemVO : compositeVOs) { + CompositeItemVO compositeItemVO = (CompositeItemVO) mainItemVO; + int composite = factory.createEntity(parentEntity, compositeItemVO); + entities.add(composite); + factory.initAllChildren(composite, compositeItemVO); + } } return entities; diff --git a/src/main/java/games/rednblack/editor/controller/commands/component/UpdateCompositeDataCommand.java b/src/main/java/games/rednblack/editor/controller/commands/component/UpdateCompositeDataCommand.java index f3af7d4c..27ac9a09 100644 --- a/src/main/java/games/rednblack/editor/controller/commands/component/UpdateCompositeDataCommand.java +++ b/src/main/java/games/rednblack/editor/controller/commands/component/UpdateCompositeDataCommand.java @@ -21,7 +21,7 @@ public class UpdateCompositeDataCommand extends EntityModifyRevertibleCommand { entityId = EntityUtils.getEntityId(entity); backup = new CompositeItemVO(); - backup.loadFromEntity(entity, sandbox.getEngine()); + backup.loadFromEntity(entity, sandbox.getEngine(), sandbox.sceneControl.sceneLoader.getEntityFactory()); CompositeTransformComponent transformComponent = SandboxComponentRetriever.get(entity, CompositeTransformComponent.class); transformComponent.automaticResize = vo.automaticResize; diff --git a/src/main/java/games/rednblack/editor/controller/commands/component/UpdateLightDataCommand.java b/src/main/java/games/rednblack/editor/controller/commands/component/UpdateLightDataCommand.java index e110c737..0445bb20 100644 --- a/src/main/java/games/rednblack/editor/controller/commands/component/UpdateLightDataCommand.java +++ b/src/main/java/games/rednblack/editor/controller/commands/component/UpdateLightDataCommand.java @@ -39,7 +39,7 @@ public class UpdateLightDataCommand extends EntityModifyRevertibleCommand { entityId = EntityUtils.getEntityId(entity); backup = new LightVO(); - backup.loadFromEntity(entity, sandbox.getEngine()); + backup.loadFromEntity(entity, sandbox.getEngine(), sandbox.sceneControl.sceneLoader.getEntityFactory()); LightObjectComponent lightObjectComponent = SandboxComponentRetriever.get(entity, LightObjectComponent.class); diff --git a/src/main/java/games/rednblack/editor/controller/commands/component/UpdateParticleDataCommand.java b/src/main/java/games/rednblack/editor/controller/commands/component/UpdateParticleDataCommand.java index b7bd488e..03d1a9e8 100644 --- a/src/main/java/games/rednblack/editor/controller/commands/component/UpdateParticleDataCommand.java +++ b/src/main/java/games/rednblack/editor/controller/commands/component/UpdateParticleDataCommand.java @@ -21,7 +21,7 @@ public class UpdateParticleDataCommand extends EntityModifyRevertibleCommand { entityId = EntityUtils.getEntityId(entity); backup = new ParticleEffectVO(); - backup.loadFromEntity(entity, sandbox.getEngine()); + backup.loadFromEntity(entity, sandbox.getEngine(), sandbox.sceneControl.sceneLoader.getEntityFactory()); ParticleComponent particleComponent = SandboxComponentRetriever.get(entity, ParticleComponent.class); particleComponent.transform = vo.transform; 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 343c593e..076a1d32 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 @@ -22,7 +22,7 @@ public class UpdateSpineDataCommand extends EntityModifyRevertibleCommand { entityId = EntityUtils.getEntityId(entity); backup = new SpineVO(); - backup.loadFromEntity(entity, sandbox.getEngine()); + backup.loadFromEntity(entity, sandbox.getEngine(), sandbox.sceneControl.sceneLoader.getEntityFactory()); SpineDataComponent spineDataComponent = SandboxComponentRetriever.get(entity, SpineDataComponent.class); SpineObjectComponent spineObjectComponent = SandboxComponentRetriever.get(entity, SpineObjectComponent.class); 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 58372dc5..98bb02a4 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 @@ -22,7 +22,7 @@ public class UpdateTalosDataCommand extends EntityModifyRevertibleCommand { entityId = EntityUtils.getEntityId(entity); backup = new TalosVO(); - backup.loadFromEntity(entity, sandbox.getEngine()); + backup.loadFromEntity(entity, sandbox.getEngine(), sandbox.sceneControl.sceneLoader.getEntityFactory()); TalosDataComponent dataComponent = SandboxComponentRetriever.get(entity, TalosDataComponent.class); dataComponent.transform = vo.transform; diff --git a/src/main/java/games/rednblack/editor/controller/commands/resource/DuplicateLibraryAction.java b/src/main/java/games/rednblack/editor/controller/commands/resource/DuplicateLibraryAction.java index 0d15ce8d..557a611b 100644 --- a/src/main/java/games/rednblack/editor/controller/commands/resource/DuplicateLibraryAction.java +++ b/src/main/java/games/rednblack/editor/controller/commands/resource/DuplicateLibraryAction.java @@ -8,6 +8,7 @@ import games.rednblack.editor.controller.commands.AddToLibraryAction; import games.rednblack.editor.controller.commands.NonRevertibleCommand; import games.rednblack.editor.proxy.ProjectManager; import games.rednblack.editor.renderer.data.GraphVO; +import games.rednblack.editor.renderer.utils.HyperJson; import games.rednblack.editor.view.stage.Sandbox; import games.rednblack.editor.view.ui.validator.StringNameValidator; import games.rednblack.h2d.common.MsgAPI; @@ -36,7 +37,7 @@ public class DuplicateLibraryAction extends NonRevertibleCommand { return; } - Json json = new Json(); + Json json = HyperJson.getJson(); GraphVO duplicated = json.fromJson(GraphVO.class, json.toJson(actionToDuplicate)); Object[] payload = AddToLibraryAction.getPayload(input, duplicated); 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 5de5af35..f693b0e7 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 @@ -6,7 +6,6 @@ import com.badlogic.gdx.graphics.g2d.ParticleEffect; import com.badlogic.gdx.graphics.g2d.ParticleEmitter; import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.Json; -import com.badlogic.gdx.utils.JsonWriter; import com.talosvfx.talos.runtime.ParticleEffectDescriptor; import com.talosvfx.talos.runtime.ParticleEmitterDescriptor; import com.talosvfx.talos.runtime.modules.*; @@ -14,6 +13,7 @@ import games.rednblack.editor.controller.commands.NonRevertibleCommand; import games.rednblack.editor.proxy.ProjectManager; import games.rednblack.editor.proxy.ResourceManager; import games.rednblack.editor.renderer.data.*; +import games.rednblack.editor.renderer.utils.HyperJson; import games.rednblack.editor.utils.ImportUtils; import games.rednblack.editor.utils.ZipUtils; import games.rednblack.h2d.common.MsgAPI; @@ -33,7 +33,7 @@ public class ExportLibraryItemCommand extends NonRevertibleCommand { private static final String CLASS_NAME = "games.rednblack.editor.controller.commands.resource.ExportLibraryItemCommand"; public static final String DONE = CLASS_NAME + "DONE"; - private final Json json = new Json(JsonWriter.OutputType.json); + private final Json json = HyperJson.getJson(); private final String currentProjectPath; private final ResourceManager resourceManager; @@ -106,7 +106,7 @@ public class ExportLibraryItemCommand extends NonRevertibleCommand { FileUtils.writeStringToFile(new File(tempDir.getPath() + File.separator + libraryItemName + ".lib"), json.toJson(compositeItemVO), "utf-8"); - exportAllAssets(compositeItemVO.composite, tempDir); + exportAllAssets(compositeItemVO, tempDir); exportMapperVO.mapper.add(new ExportedAsset(ImportUtils.TYPE_HYPERLAP2D_INTERNAL_LIBRARY, libraryItemName + ".lib")); @@ -116,36 +116,36 @@ public class ExportLibraryItemCommand extends NonRevertibleCommand { FileUtils.deleteDirectory(tempDir); } - private void exportAllAssets(CompositeVO compositeVO, File tmpDir) throws IOException { - for (SimpleImageVO imageVO : compositeVO.sImages) { + private void exportAllAssets(CompositeItemVO compositeVO, File tmpDir) throws IOException { + for (SimpleImageVO imageVO : compositeVO.getElementsArray(SimpleImageVO.class)) { File fileSrc = new File(currentProjectPath + ProjectManager.IMAGE_DIR_PATH + File.separator + imageVO.imageName + ".png"); FileUtils.copyFileToDirectory(fileSrc, tmpDir); exportMapperVO.mapper.add(new ExportedAsset(ImportUtils.TYPE_IMAGE, fileSrc.getName())); copyShader(imageVO.shaderName, tmpDir); } - for (Image9patchVO imageVO : compositeVO.sImage9patchs) { + for (Image9patchVO imageVO : compositeVO.getElementsArray(Image9patchVO.class)) { File fileSrc = new File(currentProjectPath + ProjectManager.IMAGE_DIR_PATH + File.separator + imageVO.imageName + ".9.png"); FileUtils.copyFileToDirectory(fileSrc, tmpDir); exportMapperVO.mapper.add(new ExportedAsset(ImportUtils.TYPE_IMAGE, fileSrc.getName())); copyShader(imageVO.shaderName, tmpDir); } - for (SpineVO imageVO : compositeVO.sSpineAnimations) { + for (SpineVO imageVO : compositeVO.getElementsArray(SpineVO.class)) { File fileSrc = new File(currentProjectPath + ProjectManager.SPINE_DIR_PATH + File.separator + imageVO.animationName); FileUtils.copyDirectory(fileSrc, tmpDir); exportMapperVO.mapper.add(new ExportedAsset(ImportUtils.TYPE_SPINE_ANIMATION, fileSrc.getName() + ".json")); copyShader(imageVO.shaderName, tmpDir); } - for (SpriteAnimationVO imageVO : compositeVO.sSpriteAnimations) { + for (SpriteAnimationVO imageVO : compositeVO.getElementsArray(SpriteAnimationVO.class)) { File fileSrc = new File(currentProjectPath + ProjectManager.SPRITE_DIR_PATH + File.separator + imageVO.animationName); FileUtils.copyDirectory(fileSrc, tmpDir); exportMapperVO.mapper.add(new ExportedAsset(ImportUtils.TYPE_SPRITE_ANIMATION_ATLAS, fileSrc.getName() + ".atlas")); copyShader(imageVO.shaderName, tmpDir); } - for (ParticleEffectVO imageVO : compositeVO.sParticleEffects) { + for (ParticleEffectVO imageVO : compositeVO.getElementsArray(ParticleEffectVO.class)) { File fileSrc = new File(currentProjectPath + ProjectManager.PARTICLE_DIR_PATH + File.separator + imageVO.particleName); FileUtils.copyFileToDirectory(fileSrc, tmpDir); exportMapperVO.mapper.add(new ExportedAsset(ImportUtils.TYPE_PARTICLE_EFFECT, fileSrc.getName())); @@ -159,7 +159,7 @@ public class ExportLibraryItemCommand extends NonRevertibleCommand { copyShader(imageVO.shaderName, tmpDir); } - for (TalosVO imageVO : compositeVO.sTalosVFX) { + for (TalosVO imageVO : compositeVO.getElementsArray(TalosVO.class)) { File fileSrc = new File(currentProjectPath + ProjectManager.TALOS_VFX_DIR_PATH + File.separator + imageVO.particleName); FileUtils.copyFileToDirectory(fileSrc, tmpDir); exportMapperVO.mapper.add(new ExportedAsset(ImportUtils.TYPE_TALOS_VFX, fileSrc.getName())); @@ -194,8 +194,8 @@ public class ExportLibraryItemCommand extends NonRevertibleCommand { copyShader(imageVO.shaderName, tmpDir); } - for (CompositeItemVO compositeItemVO : compositeVO.sComposites) { - exportAllAssets(compositeItemVO.composite, tmpDir); + for (CompositeItemVO compositeItemVO : compositeVO.getElementsArray(CompositeItemVO.class)) { + exportAllAssets(compositeItemVO, tmpDir); } } @@ -214,7 +214,7 @@ public class ExportLibraryItemCommand extends NonRevertibleCommand { } private void adjustPPWCoordinates(CompositeItemVO compositeItemVO) { - for (MainItemVO item : compositeItemVO.composite.getAllItems()) { + for (MainItemVO item : compositeItemVO.getAllItems()) { item.originX = item.originX * projectManager.getCurrentProjectInfoVO().pixelToWorld; item.originY = item.originY * projectManager.getCurrentProjectInfoVO().pixelToWorld; item.x = item.x * projectManager.getCurrentProjectInfoVO().pixelToWorld; diff --git a/src/main/java/games/rednblack/editor/data/migrations/ProjectVersionMigrator.java b/src/main/java/games/rednblack/editor/data/migrations/ProjectVersionMigrator.java index 53f2c1de..7dd8e358 100644 --- a/src/main/java/games/rednblack/editor/data/migrations/ProjectVersionMigrator.java +++ b/src/main/java/games/rednblack/editor/data/migrations/ProjectVersionMigrator.java @@ -24,6 +24,7 @@ import com.badlogic.gdx.utils.Json; import com.badlogic.gdx.utils.JsonWriter; import games.rednblack.editor.data.migrations.migrators.*; import games.rednblack.editor.renderer.data.ProjectInfoVO; +import games.rednblack.editor.renderer.utils.HyperJson; import games.rednblack.h2d.common.vo.ProjectVO; import org.apache.commons.io.FileUtils; @@ -43,9 +44,9 @@ public class ProjectVersionMigrator { /** * this is the current supported version, change when data format is changed, and add migration script */ - public static String dataFormatVersion = "0.2.0"; + public static String dataFormatVersion = "1.0.0"; - private final Json json = new Json(); + private final Json json = HyperJson.getJson(); public ProjectVersionMigrator (String projectPath, ProjectVO projectVo) { this.projectPath = projectPath; @@ -58,7 +59,8 @@ public class ProjectVersionMigrator { } catch (IOException e) { e.printStackTrace(); } - projectInfoVO = json.fromJson(ProjectInfoVO.class, projectInfoContents); + if (!projectVo.projectVersion.equals("0.2.0")) + projectInfoVO = json.fromJson(ProjectInfoVO.class, projectInfoContents); json.setOutputType(JsonWriter.OutputType.json); } @@ -104,6 +106,10 @@ public class ProjectVersionMigrator { IVersionMigrator vmt = new VersionMigTo020(); doMigration(vmt, "0.2.0"); } + if (projectVo.projectVersion.equals("0.2.0")) { + IVersionMigrator vmt = new VersionMigTo100(); + doMigration(vmt, "1.0.0"); + } } private void doMigration (IVersionMigrator vmt, String nextVersion) { diff --git a/src/main/java/games/rednblack/editor/data/migrations/data020/CompositeItemVO.java b/src/main/java/games/rednblack/editor/data/migrations/data020/CompositeItemVO.java new file mode 100644 index 00000000..acdef726 --- /dev/null +++ b/src/main/java/games/rednblack/editor/data/migrations/data020/CompositeItemVO.java @@ -0,0 +1,18 @@ +package games.rednblack.editor.data.migrations.data020; + +import games.rednblack.editor.renderer.data.MainItemVO; + +public class CompositeItemVO extends MainItemVO { + public CompositeVO composite; + + public float width; + public float height; + public boolean automaticResize = true; + public boolean scissorsEnabled = false; + public boolean renderToFBO = false; + + @Override + public String getResourceName() { + return null; + } +} 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 new file mode 100644 index 00000000..852ebe20 --- /dev/null +++ b/src/main/java/games/rednblack/editor/data/migrations/data020/CompositeVO.java @@ -0,0 +1,23 @@ +package games.rednblack.editor.data.migrations.data020; + +import games.rednblack.editor.renderer.data.*; + +import java.util.ArrayList; +import java.util.HashMap; + +public class CompositeVO { + public ArrayList sImages = new ArrayList<>(1); + public ArrayList sImage9patchs = new ArrayList<>(1); + public ArrayList sLabels = new ArrayList<>(1); + public ArrayList sComposites = new ArrayList<>(1); + public ArrayList sParticleEffects = new ArrayList<>(1); + public ArrayList sTalosVFX = new ArrayList<>(1); + public ArrayList sLights = new ArrayList<>(1); + public ArrayList sSpineAnimations = new ArrayList<>(1); + public ArrayList sSpriteAnimations = new ArrayList<>(1); + public ArrayList sColorPrimitives = new ArrayList<>(1); + + public ArrayList layers = new ArrayList(); + + public HashMap sStickyNotes = new HashMap<>(1); +} diff --git a/src/main/java/games/rednblack/editor/data/migrations/data020/ProjectInfoVO.java b/src/main/java/games/rednblack/editor/data/migrations/data020/ProjectInfoVO.java new file mode 100644 index 00000000..2cd8a395 --- /dev/null +++ b/src/main/java/games/rednblack/editor/data/migrations/data020/ProjectInfoVO.java @@ -0,0 +1,22 @@ +package games.rednblack.editor.data.migrations.data020; + +import com.badlogic.gdx.utils.Array; +import games.rednblack.editor.renderer.data.*; + +import java.util.ArrayList; +import java.util.HashMap; + +public class ProjectInfoVO { + public int pixelToWorld = 1; + + public ResolutionEntryVO originalResolution = new ResolutionEntryVO(); + + public Array resolutions = new Array(); + public ArrayList scenes = new ArrayList(); + + public HashMap libraryItems = new HashMap<>(); + public HashMap libraryActions = new HashMap<>(); + + public HashMap imagesPacks = new HashMap<>(); + public HashMap animationsPacks = new HashMap<>(); +} diff --git a/src/main/java/games/rednblack/editor/data/migrations/data020/SceneVO.java b/src/main/java/games/rednblack/editor/data/migrations/data020/SceneVO.java new file mode 100644 index 00000000..9d0699f6 --- /dev/null +++ b/src/main/java/games/rednblack/editor/data/migrations/data020/SceneVO.java @@ -0,0 +1,18 @@ +package games.rednblack.editor.data.migrations.data020; + +import games.rednblack.editor.renderer.data.LightsPropertiesVO; +import games.rednblack.editor.renderer.data.PhysicsPropertiesVO; + +import java.util.ArrayList; + +public class SceneVO { + public String sceneName = ""; + + public CompositeVO composite; + + public PhysicsPropertiesVO physicsPropertiesVO = new PhysicsPropertiesVO(); + public LightsPropertiesVO lightsPropertiesVO = new LightsPropertiesVO(); + + public ArrayList verticalGuides = new ArrayList(); + public ArrayList horizontalGuides = new ArrayList(); +} diff --git a/src/main/java/games/rednblack/editor/data/migrations/migrators/VersionMigTo100.java b/src/main/java/games/rednblack/editor/data/migrations/migrators/VersionMigTo100.java new file mode 100644 index 00000000..a94238b2 --- /dev/null +++ b/src/main/java/games/rednblack/editor/data/migrations/migrators/VersionMigTo100.java @@ -0,0 +1,202 @@ +package games.rednblack.editor.data.migrations.migrators; + +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.files.FileHandle; +import com.badlogic.gdx.math.Circle; +import com.badlogic.gdx.utils.Json; +import com.badlogic.gdx.utils.JsonWriter; +import games.rednblack.editor.data.migrations.IVersionMigrator; +import games.rednblack.editor.data.migrations.data020.CompositeVO; +import games.rednblack.editor.renderer.data.*; +import games.rednblack.h2d.common.vo.ProjectVO; +import org.apache.commons.io.FileUtils; + +import java.io.File; +import java.io.IOException; +import java.util.Arrays; +import java.util.HashMap; + +public class VersionMigTo100 implements IVersionMigrator { + private final Json json = new Json(); + + private String projectPath; + private ProjectVO projectVO; + private games.rednblack.editor.data.migrations.data020.ProjectInfoVO projectInfoVO; + + @Override + public void setProject(String path, ProjectVO vo, ProjectInfoVO projectInfoVO) { + projectPath = path; + projectVO = vo; + + json.setOutputType(JsonWriter.OutputType.json); + String prjInfoFilePath = projectPath + "/project.dt"; + FileHandle projectInfoFile = Gdx.files.internal(prjInfoFilePath); + String projectInfoContents = "{}"; + try { + projectInfoContents = FileUtils.readFileToString(projectInfoFile.file(), "utf-8"); + } catch (IOException e) { + e.printStackTrace(); + } + this.projectInfoVO = json.fromJson(games.rednblack.editor.data.migrations.data020.ProjectInfoVO.class, projectInfoContents); + } + + @Override + public boolean doMigration() { + String srcPath = projectPath + File.separator + "scenes"; + FileHandle scenesDirectoryHandle = Gdx.files.absolute(srcPath); + try { + for (File scene : scenesDirectoryHandle.file().listFiles()) { + games.rednblack.editor.data.migrations.data020.SceneVO sceneToExport = json.fromJson(games.rednblack.editor.data.migrations.data020.SceneVO.class, FileUtils.readFileToString(scene, "utf-8")); + + SceneVO newVO = new SceneVO(); + newVO.sceneName = sceneToExport.sceneName; + newVO.lightsPropertiesVO = sceneToExport.lightsPropertiesVO; + newVO.physicsPropertiesVO = sceneToExport.physicsPropertiesVO; + newVO.verticalGuides = sceneToExport.verticalGuides; + newVO.horizontalGuides = sceneToExport.horizontalGuides; + CompositeItemVO compositeItemVO = new CompositeItemVO(); + compositeItemVO.automaticResize = false; + newVO.composite = compositeItemVO; + + copyRecursiveElements(sceneToExport.composite, newVO.composite); + + FileUtils.writeStringToFile(new File(projectPath + File.separator + "scenes" + File.separator + newVO.sceneName + ".dt"), + newVO.constructJsonString(), "utf-8"); + } + } catch (IOException e) { + e.printStackTrace(); + } + + ProjectInfoVO newProjectInfoVO = new ProjectInfoVO(); + newProjectInfoVO.pixelToWorld = projectInfoVO.pixelToWorld; + newProjectInfoVO.originalResolution = projectInfoVO.originalResolution; + newProjectInfoVO.resolutions = projectInfoVO.resolutions; + for (games.rednblack.editor.data.migrations.data020.SceneVO sceneVO : projectInfoVO.scenes) { + SceneVO newSceneVO = new SceneVO(); + newSceneVO.sceneName = sceneVO.sceneName; + newProjectInfoVO.scenes.add(newSceneVO); + } + newProjectInfoVO.libraryActions = projectInfoVO.libraryActions; + newProjectInfoVO.imagesPacks = projectInfoVO.imagesPacks; + newProjectInfoVO.animationsPacks = projectInfoVO.animationsPacks; + + HashMap libraryItems = projectInfoVO.libraryItems; + for (String key : libraryItems.keySet()) { + games.rednblack.editor.data.migrations.data020.CompositeItemVO item = libraryItems.get(key); + CompositeItemVO newLibraryItem = new CompositeItemVO(); + copyMainItemField(item, newLibraryItem); + newLibraryItem.width = item.width; + newLibraryItem.height = item.height; + newLibraryItem.automaticResize = item.automaticResize; + newLibraryItem.scissorsEnabled = item.scissorsEnabled; + newLibraryItem.renderToFBO = item.renderToFBO; + newProjectInfoVO.libraryItems.put(key, newLibraryItem); + copyRecursiveElements(item.composite, newLibraryItem); + } + + try { + FileUtils.writeStringToFile(new File(projectPath + File.separator + "project.dt"), + newProjectInfoVO.constructJsonString(), "utf-8"); + } catch (IOException e) { + e.printStackTrace(); + } + return true; + } + + private void copyRecursiveElements(CompositeVO vo, CompositeItemVO target) { + for (int i = 0; i < vo.sImages.size(); i++) { + target.addItem(vo.sImages.get(i)); + } + for (int i = 0; i < vo.sImage9patchs.size(); i++) { + target.addItem(vo.sImage9patchs.get(i)); + } + for (int i = 0; i < vo.sLabels.size(); i++) { + target.addItem(vo.sLabels.get(i)); + } + for (int i = 0; i < vo.sParticleEffects.size(); i++) { + target.addItem(vo.sParticleEffects.get(i)); + } + for (int i = 0; i < vo.sTalosVFX.size(); i++) { + target.addItem(vo.sTalosVFX.get(i)); + } + for (int i = 0; i < vo.sImages.size(); i++) { + target.addItem(vo.sImages.get(i)); + } + for (int i = 0; i < vo.sLights.size(); i++) { + target.addItem(vo.sLights.get(i)); + } + for (int i = 0; i < vo.sSpineAnimations.size(); i++) { + target.addItem(vo.sSpineAnimations.get(i)); + } + for (int i = 0; i < vo.sSpriteAnimations.size(); i++) { + target.addItem(vo.sSpriteAnimations.get(i)); + } + for (int i = 0; i < vo.sColorPrimitives.size(); i++) { + target.addItem(vo.sColorPrimitives.get(i)); + } + for (String key : vo.sStickyNotes.keySet()) { + target.sStickyNotes.put(key, vo.sStickyNotes.get(key)); + } + for (int i = 0; i < vo.layers.size(); i++) { + target.layers.add(vo.layers.get(i)); + } + for (int i = 0; i < vo.sComposites.size(); i++) { + games.rednblack.editor.data.migrations.data020.CompositeItemVO compositeItemVO = vo.sComposites.get(i); + CompositeItemVO newCompositeItemVO = new CompositeItemVO(); + copyMainItemField(compositeItemVO, newCompositeItemVO); + newCompositeItemVO.width = compositeItemVO.width; + newCompositeItemVO.height = compositeItemVO.height; + newCompositeItemVO.automaticResize = compositeItemVO.automaticResize; + newCompositeItemVO.scissorsEnabled = compositeItemVO.scissorsEnabled; + newCompositeItemVO.renderToFBO = compositeItemVO.renderToFBO; + target.addItem(newCompositeItemVO); + copyRecursiveElements(compositeItemVO.composite, newCompositeItemVO); + } + } + + private void copyMainItemField(MainItemVO vo, MainItemVO target) { + target.uniqueId = vo.uniqueId; + target.itemIdentifier = vo.itemIdentifier; + target.itemName = vo.itemName; + if(vo.tags != null) target.tags = Arrays.copyOf(vo.tags, vo.tags.length); + target.customVars = vo.customVars; + target.x = vo.x; + target.y = vo.y; + target.rotation = vo.rotation; + target.zIndex = vo.zIndex; + target.layerName = vo.layerName; + if(vo.tint != null) target.tint = Arrays.copyOf(vo.tint, vo.tint.length); + target.scaleX = vo.scaleX; + target.scaleY = vo.scaleY; + target.originX = vo.originX; + target.originY = vo.originY; + target.flipX = vo.flipX; + target.flipY = vo.flipY; + + if(vo.shape != null) { + target.shape = vo.shape.clone(); + } + + if(vo.circle != null) { + target.circle = new Circle(vo.circle); + } + + if(vo.physics != null){ + target.physics = new PhysicsBodyDataVO(vo.physics); + } + + if (vo.sensor != null) { + target.sensor = new SensorDataVO(vo.sensor); + } + + if(vo.light != null){ + target.light = new LightBodyDataVO(vo.light); + } + + target.shaderName = vo.shaderName; + target.shaderUniforms.clear(); + target.shaderUniforms.putAll(vo.shaderUniforms); + + target.renderingLayer = vo.renderingLayer; + } +} diff --git a/src/main/java/games/rednblack/editor/factory/ItemFactory.java b/src/main/java/games/rednblack/editor/factory/ItemFactory.java index 827e6385..598b5382 100644 --- a/src/main/java/games/rednblack/editor/factory/ItemFactory.java +++ b/src/main/java/games/rednblack/editor/factory/ItemFactory.java @@ -168,8 +168,7 @@ public class ItemFactory implements IFactory { HashMap libraryItems = projectManager.currentProjectInfoVO.libraryItems; CompositeItemVO itemVO = libraryItems.get(libraryName); - itemVO.uniqueId = -1; - PasteItemsCommand.forceIdChange(itemVO.composite); + itemVO.cleanIds(); createdEntity = createCompositeItem(itemVO, position); if (createdEntity == -1) return false; @@ -188,7 +187,7 @@ public class ItemFactory implements IFactory { int entity = entityFactory.createEntity(sandbox.getCurrentViewingEntity(), vo); EntityFactory factory = sceneLoader.getEntityFactory(); - factory.initAllChildren(entity, vo.composite); + factory.initAllChildren(entity, vo); return entity; } diff --git a/src/main/java/games/rednblack/editor/proxy/ProjectManager.java b/src/main/java/games/rednblack/editor/proxy/ProjectManager.java index 50b32ad3..579c6837 100755 --- a/src/main/java/games/rednblack/editor/proxy/ProjectManager.java +++ b/src/main/java/games/rednblack/editor/proxy/ProjectManager.java @@ -32,6 +32,7 @@ import games.rednblack.editor.data.manager.PreferencesManager; import games.rednblack.editor.data.migrations.ProjectVersionMigrator; import games.rednblack.editor.renderer.data.*; import games.rednblack.editor.renderer.resources.FontSizePair; +import games.rednblack.editor.renderer.utils.HyperJson; import games.rednblack.editor.utils.HyperLap2DUtils; import games.rednblack.editor.utils.RecursiveFileSuffixFilter; import games.rednblack.editor.view.menu.HyperLap2DMenuBar; @@ -202,7 +203,7 @@ public class ProjectManager extends Proxy { String projectContents = null; try { projectContents = FileUtils.readFileToString(projectFile.file(), "utf-8"); - Json json = new Json(); + Json json = HyperJson.getJson(); json.setIgnoreUnknownFields(true); ProjectVO vo = json.fromJson(ProjectVO.class, projectContents); goThroughVersionMigrationProtocol(projectPath, vo); @@ -289,15 +290,15 @@ public class ProjectManager extends Proxy { FileHandle sourceDir = new FileHandle(projectPath + "/scenes/"); for (FileHandle entry : sourceDir.list(HyperLap2DUtils.DT_FILTER)) { if (!entry.file().isDirectory()) { - Json json = new Json(); + Json json = HyperJson.getJson(); json.setIgnoreUnknownFields(true); SceneVO sceneVO = json.fromJson(SceneVO.class, entry); if (sceneVO.composite == null) continue; - ArrayList items = sceneVO.composite.getAllItems(); + Array items = sceneVO.composite.getAllItems(); for (CompositeItemVO libraryItem : currentProjectInfoVO.libraryItems.values()) { - if (libraryItem.composite == null) continue; - items = libraryItem.composite.getAllItems(); + if (libraryItem == null) continue; + items = libraryItem.getAllItems(); } } } diff --git a/src/main/java/games/rednblack/editor/proxy/ResourceManager.java b/src/main/java/games/rednblack/editor/proxy/ResourceManager.java index 9e5c35dd..4e925683 100644 --- a/src/main/java/games/rednblack/editor/proxy/ResourceManager.java +++ b/src/main/java/games/rednblack/editor/proxy/ResourceManager.java @@ -11,10 +11,7 @@ import com.badlogic.gdx.graphics.g2d.*; import com.badlogic.gdx.graphics.g2d.freetype.FreeTypeFontGenerator; import com.badlogic.gdx.graphics.glutils.ShaderProgram; import com.badlogic.gdx.scenes.scene2d.ui.Skin; -import com.badlogic.gdx.utils.Align; -import com.badlogic.gdx.utils.Array; -import com.badlogic.gdx.utils.Json; -import com.badlogic.gdx.utils.ObjectMap; +import com.badlogic.gdx.utils.*; import com.kotcrab.vis.ui.VisUI; import com.talosvfx.talos.runtime.ParticleEffectDescriptor; import com.talosvfx.talos.runtime.utils.ShaderDescriptor; @@ -25,6 +22,7 @@ import games.rednblack.editor.renderer.data.*; import games.rednblack.editor.renderer.resources.FontSizePair; import games.rednblack.editor.renderer.resources.IResourceRetriever; 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.talos.ResourceRetrieverAssetProvider; @@ -209,8 +207,7 @@ public class ResourceManager extends Proxy implements IResourceRetriever { SceneDataManager sceneDataManager = facade.retrieveProxy(SceneDataManager.NAME); // TODO: this should be cached FileHandle file = Gdx.files.internal(sceneDataManager.getCurrProjectScenePathByName(name)); - Json json = new Json(); - json.setIgnoreUnknownFields(true); + Json json = HyperJson.getJson(); return json.fromJson(SceneVO.class, file.readString()); } @@ -343,23 +340,26 @@ public class ResourceManager extends Proxy implements IResourceRetriever { } public ArrayList getProjectRequiredFontsList() { - HashSet fontsToLoad = new HashSet<>(); + ObjectSet fontsToLoad = new ObjectSet<>(); for (int i = 0; i < getProjectVO().scenes.size(); i++) { SceneVO scene = getSceneVO(getProjectVO().scenes.get(i).sceneName); - CompositeVO composite = scene.composite; + CompositeItemVO composite = scene.composite; if (composite == null) { continue; } - FontSizePair[] fonts = composite.getRecursiveFontList(); + Array fonts = composite.getRecursiveFontList(); for (CompositeItemVO library : getProjectVO().libraryItems.values()) { - FontSizePair[] libFonts = library.composite.getRecursiveFontList(); - Collections.addAll(fontsToLoad, libFonts); + Array libFonts = library.getRecursiveFontList(); + fontsToLoad.addAll(libFonts); } - Collections.addAll(fontsToLoad, fonts); + fontsToLoad.addAll(fonts); } - return new ArrayList<>(fontsToLoad); + ArrayList result = new ArrayList<>(); + for (FontSizePair fontSizePair : fontsToLoad) + result.add(fontSizePair); + return result; } public void loadCurrentProjectBitmapFonts(String path, String curResolution) { diff --git a/src/main/java/games/rednblack/editor/proxy/SceneDataManager.java b/src/main/java/games/rednblack/editor/proxy/SceneDataManager.java index 269cbb8c..d0bb5146 100644 --- a/src/main/java/games/rednblack/editor/proxy/SceneDataManager.java +++ b/src/main/java/games/rednblack/editor/proxy/SceneDataManager.java @@ -20,11 +20,13 @@ package games.rednblack.editor.proxy; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.files.FileHandle; +import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.Json; import games.rednblack.editor.HyperLap2DFacade; import games.rednblack.editor.renderer.data.CompositeItemVO; -import games.rednblack.editor.renderer.data.CompositeVO; +import games.rednblack.editor.renderer.data.MainItemVO; import games.rednblack.editor.renderer.data.SceneVO; +import games.rednblack.editor.renderer.utils.HyperJson; import org.apache.commons.io.FileUtils; import org.puremvc.java.patterns.proxy.Proxy; @@ -121,7 +123,7 @@ public class SceneDataManager extends Proxy { try { for (File scene : scenesDirectoryHandle.file().listFiles()) { File fileTarget = new File(targetPath + File.separator + scenesDirectoryHandle.name() + File.separator + scene.getName()); - Json json = new Json(); + Json json = HyperJson.getJson(); SceneVO sceneToExport = json.fromJson(SceneVO.class, FileUtils.readFileToString(scene, "utf-8")); clearCompositesForExport(sceneToExport.composite); FileUtils.writeStringToFile(fileTarget, sceneToExport.constructJsonString(), "utf-8"); @@ -137,13 +139,17 @@ public class SceneDataManager extends Proxy { } } - private void clearCompositesForExport(CompositeVO compositeVO) { + private void clearCompositesForExport(CompositeItemVO compositeVO) { if (compositeVO == null) return; compositeVO.sStickyNotes.clear(); - for (CompositeItemVO c : compositeVO.sComposites) { - clearCompositesForExport(c.composite); + Array sComposites = compositeVO.content.get(CompositeItemVO.class.getName()); + if (sComposites != null) { + for (MainItemVO mainItemVO : sComposites) { + CompositeItemVO c = (CompositeItemVO) mainItemVO; + clearCompositesForExport(c); + } } } } diff --git a/src/main/java/games/rednblack/editor/proxy/SettingsManager.java b/src/main/java/games/rednblack/editor/proxy/SettingsManager.java index 80d6c8f8..ab349379 100644 --- a/src/main/java/games/rednblack/editor/proxy/SettingsManager.java +++ b/src/main/java/games/rednblack/editor/proxy/SettingsManager.java @@ -5,6 +5,7 @@ import com.badlogic.gdx.utils.Json; import games.rednblack.editor.CustomExceptionHandler; import games.rednblack.editor.HyperLap2DFacade; import games.rednblack.editor.Main; +import games.rednblack.editor.renderer.utils.HyperJson; import games.rednblack.editor.utils.HyperLap2DUtils; import games.rednblack.editor.utils.KeyBindingsLayout; import games.rednblack.h2d.common.vo.EditorConfigVO; @@ -99,11 +100,11 @@ public class SettingsManager extends Proxy { e.printStackTrace(); } } else { - Json gson = new Json(); + Json json = HyperJson.getJson(); String editorConfigJson; try { editorConfigJson = FileUtils.readFileToString(configFile, "utf-8"); - editorConfig = gson.fromJson(EditorConfigVO.class, editorConfigJson); + editorConfig = json.fromJson(EditorConfigVO.class, editorConfigJson); } catch (IOException e) { e.printStackTrace(); } diff --git a/src/main/java/games/rednblack/editor/utils/asset/Asset.java b/src/main/java/games/rednblack/editor/utils/asset/Asset.java index 25cd8885..b7f5b589 100644 --- a/src/main/java/games/rednblack/editor/utils/asset/Asset.java +++ b/src/main/java/games/rednblack/editor/utils/asset/Asset.java @@ -6,7 +6,6 @@ import games.rednblack.editor.HyperLap2DFacade; import games.rednblack.editor.proxy.ProjectManager; import games.rednblack.editor.proxy.ResolutionManager; import games.rednblack.editor.proxy.ResourceManager; -import games.rednblack.editor.renderer.data.MainItemVO; import games.rednblack.editor.renderer.data.SceneVO; import games.rednblack.editor.utils.ImportUtils; import games.rednblack.editor.view.stage.Sandbox; @@ -25,7 +24,7 @@ public abstract class Asset implements IAsset { protected ResourceManager resourceManager; protected final ArrayList tmpEntityList = new ArrayList<>(); - protected final ArrayList tmpImageList = new ArrayList<>(); + protected final Array tmpImageList = new Array<>(); public Asset() { facade = HyperLap2DFacade.getInstance(); diff --git a/src/main/java/games/rednblack/editor/utils/asset/impl/HyperLap2DActionAsset.java b/src/main/java/games/rednblack/editor/utils/asset/impl/HyperLap2DActionAsset.java index 6543373d..9526e3e8 100644 --- a/src/main/java/games/rednblack/editor/utils/asset/impl/HyperLap2DActionAsset.java +++ b/src/main/java/games/rednblack/editor/utils/asset/impl/HyperLap2DActionAsset.java @@ -4,6 +4,7 @@ import com.badlogic.gdx.files.FileHandle; import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.Json; import games.rednblack.editor.renderer.data.GraphVO; +import games.rednblack.editor.renderer.utils.HyperJson; import games.rednblack.editor.utils.ImportUtils; import games.rednblack.editor.utils.asset.Asset; import games.rednblack.h2d.common.ProgressHandler; @@ -11,7 +12,7 @@ import games.rednblack.h2d.common.ProgressHandler; import java.util.HashMap; public class HyperLap2DActionAsset extends Asset { - private final Json json = new Json(); + private final Json json = HyperJson.getJson(); @Override protected boolean matchMimeType(FileHandle file) { diff --git a/src/main/java/games/rednblack/editor/utils/asset/impl/HyperLap2DInternalLibraryAsset.java b/src/main/java/games/rednblack/editor/utils/asset/impl/HyperLap2DInternalLibraryAsset.java index e2cdb722..4d3530d1 100644 --- a/src/main/java/games/rednblack/editor/utils/asset/impl/HyperLap2DInternalLibraryAsset.java +++ b/src/main/java/games/rednblack/editor/utils/asset/impl/HyperLap2DInternalLibraryAsset.java @@ -7,6 +7,7 @@ import games.rednblack.editor.renderer.data.CompositeItemVO; import games.rednblack.editor.renderer.data.Image9patchVO; import games.rednblack.editor.renderer.data.LabelVO; import games.rednblack.editor.renderer.data.MainItemVO; +import games.rednblack.editor.renderer.utils.HyperJson; import games.rednblack.editor.utils.ImportUtils; import games.rednblack.editor.utils.asset.Asset; import games.rednblack.h2d.common.ProgressHandler; @@ -34,7 +35,7 @@ public class HyperLap2DInternalLibraryAsset extends Asset { @Override public void importAsset(Array files, ProgressHandler progressHandler, boolean skipRepack) { for (FileHandle handle : new Array.ArrayIterator<>(files)) { - Json json = new Json(); + Json json = HyperJson.getJson(); String projectInfoContents = null; try { projectInfoContents = FileUtils.readFileToString(handle.file(), "utf-8"); @@ -58,7 +59,7 @@ public class HyperLap2DInternalLibraryAsset extends Asset { private void adjustPPWCoordinates(CompositeItemVO compositeItemVO) { int ppwu = projectManager.getCurrentProjectInfoVO().pixelToWorld; - for (MainItemVO item : compositeItemVO.composite.getAllItems()) { + for (MainItemVO item : compositeItemVO.getAllItems()) { item.originX = item.originX / ppwu; item.originY = item.originY / ppwu; item.x = item.x / ppwu; diff --git a/src/main/java/games/rednblack/editor/utils/asset/impl/HyperLap2DLibraryAsset.java b/src/main/java/games/rednblack/editor/utils/asset/impl/HyperLap2DLibraryAsset.java index ee11aeb6..980a23e1 100644 --- a/src/main/java/games/rednblack/editor/utils/asset/impl/HyperLap2DLibraryAsset.java +++ b/src/main/java/games/rednblack/editor/utils/asset/impl/HyperLap2DLibraryAsset.java @@ -9,6 +9,7 @@ import games.rednblack.editor.proxy.ResolutionManager; import games.rednblack.editor.renderer.components.MainItemComponent; import games.rednblack.editor.renderer.data.CompositeItemVO; import games.rednblack.editor.renderer.data.SceneVO; +import games.rednblack.editor.renderer.utils.HyperJson; import games.rednblack.editor.utils.AssetImporter; import games.rednblack.editor.utils.ImportUtils; import games.rednblack.editor.utils.ZipUtils; @@ -73,8 +74,7 @@ public class HyperLap2DLibraryAsset extends Asset { FileUtils.deleteDirectory(tmpDir); FileUtils.forceMkdir(tmpDir); FileHandle mapper = ZipUtils.saveZipContent(fileHandle.file(), tmpDir); - Json json = new Json(); - json.setIgnoreUnknownFields(true); + Json json = HyperJson.getJson(); ExportMapperVO exportMapperVO = json.fromJson(ExportMapperVO.class, mapper); recursiveProgressHandler = new ProgressHandler() { diff --git a/src/main/java/games/rednblack/editor/utils/asset/impl/ImageAsset.java b/src/main/java/games/rednblack/editor/utils/asset/impl/ImageAsset.java index ec0f2671..18044d68 100644 --- a/src/main/java/games/rednblack/editor/utils/asset/impl/ImageAsset.java +++ b/src/main/java/games/rednblack/editor/utils/asset/impl/ImageAsset.java @@ -128,11 +128,10 @@ public class ImageAsset extends Asset { } for (SceneVO scene : projectManager.currentProjectInfoVO.scenes) { - CompositeItemVO tmpVo = new CompositeItemVO(); SceneVO loadedScene = resourceManager.getSceneVO(scene.sceneName); - tmpVo.composite = loadedScene.composite; + CompositeItemVO tmpVo = new CompositeItemVO(loadedScene.composite); deleteAllImagesOfItem(tmpVo, imageName); - loadedScene.composite = tmpVo.composite; + loadedScene.composite = tmpVo; SceneDataManager sceneDataManager = facade.retrieveProxy(SceneDataManager.NAME); sceneDataManager.saveScene(loadedScene); } @@ -145,23 +144,25 @@ public class ImageAsset extends Asset { private void deleteCurrentItemImage(CompositeItemVO compositeItemVO, String imageName) { tmpImageList.clear(); - if (compositeItemVO.composite != null && compositeItemVO.composite.sImages.size() != 0) { - ArrayList simpleImageVOs = compositeItemVO.composite.sImages; - tmpImageList.addAll(simpleImageVOs - .stream() - .filter(simpleImageVO -> simpleImageVO.imageName.equals(imageName)) - .collect(Collectors.toList())); - simpleImageVOs.removeAll(tmpImageList); + if (compositeItemVO != null && compositeItemVO.getElementsArray(SimpleImageVO.class).size != 0) { + Array simpleImageVOs = compositeItemVO.getElementsArray(SimpleImageVO.class); + + for (SimpleImageVO simpleImageVO : simpleImageVOs) + if (simpleImageVO.getResourceName().equals(imageName)) + tmpImageList.add(simpleImageVO); + + simpleImageVOs.removeAll(tmpImageList, true); } tmpImageList.clear(); - if (compositeItemVO.composite != null && compositeItemVO.composite.sImage9patchs.size() != 0) { - ArrayList simple9PatchesVOs = compositeItemVO.composite.sImage9patchs; - tmpImageList.addAll(simple9PatchesVOs - .stream() - .filter(simple9PatchVO -> simple9PatchVO.imageName.equals(imageName)) - .collect(Collectors.toList())); - simple9PatchesVOs.removeAll(tmpImageList); + if (compositeItemVO != null && compositeItemVO.getElementsArray(Image9patchVO.class).size != 0) { + Array simple9PatchesVOs = compositeItemVO.getElementsArray(Image9patchVO.class); + + for (Image9patchVO simpleImageVO : simple9PatchesVOs) + if (simpleImageVO.getResourceName().equals(imageName)) + tmpImageList.add(simpleImageVO); + + simple9PatchesVOs.removeAll(tmpImageList, true); } } diff --git a/src/main/java/games/rednblack/editor/utils/asset/impl/ParticleEffectAsset.java b/src/main/java/games/rednblack/editor/utils/asset/impl/ParticleEffectAsset.java index dcdf1521..a1cd6890 100644 --- a/src/main/java/games/rednblack/editor/utils/asset/impl/ParticleEffectAsset.java +++ b/src/main/java/games/rednblack/editor/utils/asset/impl/ParticleEffectAsset.java @@ -158,11 +158,10 @@ public class ParticleEffectAsset extends Asset { } for (SceneVO scene : projectManager.currentProjectInfoVO.scenes) { - CompositeItemVO tmpVo = new CompositeItemVO(); SceneVO loadedScene = resourceManager.getSceneVO(scene.sceneName); - tmpVo.composite = loadedScene.composite; + CompositeItemVO tmpVo = new CompositeItemVO(loadedScene.composite); deleteAllParticles(tmpVo, name); - loadedScene.composite = tmpVo.composite; + loadedScene.composite = tmpVo; SceneDataManager sceneDataManager = facade.retrieveProxy(SceneDataManager.NAME); sceneDataManager.saveScene(loadedScene); } @@ -175,14 +174,14 @@ public class ParticleEffectAsset extends Asset { private void getParticles(CompositeItemVO compositeItemVO, String name) { tmpImageList.clear(); - if (compositeItemVO.composite != null && compositeItemVO.composite.sParticleEffects.size() != 0) { - ArrayList particleEffectList = compositeItemVO.composite.sParticleEffects; - for (ParticleEffectVO particleEffectVO : particleEffectList) { - if (particleEffectVO.particleName.equals(name)) { - tmpImageList.add(particleEffectVO); - } - } - particleEffectList.removeAll(tmpImageList); + if (compositeItemVO != null && compositeItemVO.getElementsArray(ParticleEffectVO.class).size != 0) { + Array particleEffectList = compositeItemVO.getElementsArray(ParticleEffectVO.class); + + for (ParticleEffectVO spriteVO :particleEffectList) + if (spriteVO.getResourceName().equals(name)) + tmpImageList.add(spriteVO); + + particleEffectList.removeAll(tmpImageList, true); } } 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 42c3b8af..0dbee2d0 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 @@ -9,10 +9,7 @@ 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.CompositeItemVO; -import games.rednblack.editor.renderer.data.ResolutionEntryVO; -import games.rednblack.editor.renderer.data.SceneVO; -import games.rednblack.editor.renderer.data.SpineVO; +import games.rednblack.editor.renderer.data.*; import games.rednblack.editor.renderer.utils.Version; import games.rednblack.editor.utils.HyperLap2DUtils; import games.rednblack.editor.utils.ImportUtils; @@ -27,11 +24,9 @@ import org.apache.commons.io.FilenameUtils; import java.io.File; import java.io.IOException; -import java.util.ArrayList; import java.util.function.Consumer; import java.util.regex.Matcher; import java.util.regex.Pattern; -import java.util.stream.Collectors; public class SpineAsset extends Asset { @Override @@ -217,11 +212,10 @@ public class SpineAsset extends Asset { } for (SceneVO scene : projectManager.currentProjectInfoVO.scenes) { - CompositeItemVO tmpVo = new CompositeItemVO(); SceneVO loadedScene = resourceManager.getSceneVO(scene.sceneName); - tmpVo.composite = loadedScene.composite; + CompositeItemVO tmpVo = new CompositeItemVO(loadedScene.composite); deleteAllSpineAnimationsOfItem(tmpVo, spineAnimationName); - loadedScene.composite = tmpVo.composite; + loadedScene.composite = tmpVo; SceneDataManager sceneDataManager = facade.retrieveProxy(SceneDataManager.NAME); sceneDataManager.saveScene(loadedScene); } @@ -234,13 +228,14 @@ public class SpineAsset extends Asset { private void deleteCurrentItemSpineAnimations(CompositeItemVO compositeItemVO, String spineAnimationName) { tmpImageList.clear(); - if (compositeItemVO.composite != null && compositeItemVO.composite.sSpineAnimations.size() != 0) { - ArrayList spineAnimations = compositeItemVO.composite.sSpineAnimations; - tmpImageList.addAll(spineAnimations - .stream() - .filter(spineVO -> spineVO.animationName.equals(spineAnimationName)) - .collect(Collectors.toList())); - spineAnimations.removeAll(tmpImageList); + if (compositeItemVO != null && compositeItemVO.getElementsArray(SpineVO.class).size != 0) { + Array spineAnimations = compositeItemVO.getElementsArray(SpineVO.class); + + for (SpineVO spriteVO :spineAnimations) + if (spriteVO.getResourceName().equals(spineAnimationName)) + tmpImageList.add(spriteVO); + + spineAnimations.removeAll(tmpImageList, true); } } diff --git a/src/main/java/games/rednblack/editor/utils/asset/impl/SpriteAnimationAtlasAsset.java b/src/main/java/games/rednblack/editor/utils/asset/impl/SpriteAnimationAtlasAsset.java index bae7102b..58c85375 100644 --- a/src/main/java/games/rednblack/editor/utils/asset/impl/SpriteAnimationAtlasAsset.java +++ b/src/main/java/games/rednblack/editor/utils/asset/impl/SpriteAnimationAtlasAsset.java @@ -140,11 +140,10 @@ public class SpriteAnimationAtlasAsset extends Asset { } for (SceneVO scene : projectManager.currentProjectInfoVO.scenes) { - CompositeItemVO tmpVo = new CompositeItemVO(); SceneVO loadedScene = resourceManager.getSceneVO(scene.sceneName); - tmpVo.composite = loadedScene.composite; + CompositeItemVO tmpVo = new CompositeItemVO(loadedScene.composite); deleteAllSpriteAnimationsOfItem(tmpVo, spriteAnimationName); - loadedScene.composite = tmpVo.composite; + loadedScene.composite = tmpVo; SceneDataManager sceneDataManager = facade.retrieveProxy(SceneDataManager.NAME); sceneDataManager.saveScene(loadedScene); } @@ -157,15 +156,14 @@ public class SpriteAnimationAtlasAsset extends Asset { private void deleteCurrentItemSpriteAnimations(CompositeItemVO compositeItemVO, String spriteAnimationName) { tmpImageList.clear(); - if (compositeItemVO.composite != null && compositeItemVO.composite.sSpriteAnimations.size() != 0) { - ArrayList spriteAnimations = compositeItemVO.composite.sSpriteAnimations; + if (compositeItemVO != null && compositeItemVO.getElementsArray(SpriteAnimationVO.class).size != 0) { + Array spriteAnimations = compositeItemVO.getElementsArray(SpriteAnimationVO.class); - tmpImageList.addAll(spriteAnimations - .stream() - .filter(spriteVO -> spriteVO.animationName.equals(spriteAnimationName)) - .collect(Collectors.toList())); + for (SpriteAnimationVO spriteVO :spriteAnimations) + if (spriteVO.getResourceName().equals(spriteAnimationName)) + tmpImageList.add(spriteVO); - spriteAnimations.removeAll(tmpImageList); + spriteAnimations.removeAll(tmpImageList, true); } } 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 d6c5013e..f8eb83ad 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 @@ -11,6 +11,7 @@ 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.editor.utils.ImportUtils; import games.rednblack.editor.utils.asset.Asset; @@ -200,11 +201,10 @@ public class TalosVFXAsset extends Asset { } for (SceneVO scene : projectManager.currentProjectInfoVO.scenes) { - CompositeItemVO tmpVo = new CompositeItemVO(); SceneVO loadedScene = resourceManager.getSceneVO(scene.sceneName); - tmpVo.composite = loadedScene.composite; + CompositeItemVO tmpVo = new CompositeItemVO(loadedScene.composite); deleteAllParticles(tmpVo, name); - loadedScene.composite = tmpVo.composite; + loadedScene.composite = tmpVo; SceneDataManager sceneDataManager = facade.retrieveProxy(SceneDataManager.NAME); sceneDataManager.saveScene(loadedScene); } @@ -217,14 +217,14 @@ public class TalosVFXAsset extends Asset { private void getParticles(CompositeItemVO compositeItemVO, String name) { tmpImageList.clear(); - if (compositeItemVO.composite != null && compositeItemVO.composite.sTalosVFX.size() != 0) { - ArrayList particleEffectList = compositeItemVO.composite.sTalosVFX; - for (TalosVO particleEffectVO : particleEffectList) { - if (particleEffectVO.particleName.equals(name)) { - tmpImageList.add(particleEffectVO); - } - } - particleEffectList.removeAll(tmpImageList); + if (compositeItemVO != null && compositeItemVO.getElementsArray(TalosVO.class).size != 0) { + Array particleEffectList = compositeItemVO.getElementsArray(TalosVO.class); + + for (TalosVO spriteVO :particleEffectList) + if (spriteVO.getResourceName().equals(name)) + tmpImageList.add(spriteVO); + + particleEffectList.removeAll(tmpImageList, true); } } 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 f2b8fded..cf115cd7 100644 --- a/src/main/java/games/rednblack/editor/utils/runtime/EntityUtils.java +++ b/src/main/java/games/rednblack/editor/utils/runtime/EntityUtils.java @@ -25,12 +25,14 @@ import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.scenes.scene2d.utils.Drawable; import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.Json; +import com.badlogic.gdx.utils.reflect.ReflectionException; import com.kotcrab.vis.ui.VisUI; import games.rednblack.editor.renderer.components.*; import games.rednblack.editor.renderer.components.light.LightBodyComponent; import games.rednblack.editor.renderer.components.physics.PhysicsBodyComponent; 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 java.util.*; @@ -301,8 +303,8 @@ public class EntityUtils { public static void applyActionRecursivelyOnLibraryItems(CompositeItemVO rootCompositeItemVo, Consumer action) { action.accept(rootCompositeItemVo); - if (rootCompositeItemVo.composite != null && rootCompositeItemVo.composite.sComposites.size() != 0) { - for (CompositeItemVO currentCompositeItemVo : rootCompositeItemVo.composite.sComposites) { + if (rootCompositeItemVo != null && rootCompositeItemVo.getElementsArray(CompositeItemVO.class).size != 0) { + for (CompositeItemVO currentCompositeItemVo : rootCompositeItemVo.getElementsArray(CompositeItemVO.class)) { applyActionRecursivelyOnLibraryItems(currentCompositeItemVo, action); } } @@ -333,167 +335,41 @@ public class EntityUtils { } public static int getEntityFromJson(String jsonString, int entityType, EntityFactory factory, int parent) { - Json json = new Json(); - if(entityType == EntityFactory.COMPOSITE_TYPE) { - CompositeItemVO vo = json.fromJson(CompositeItemVO.class, jsonString); - return factory.createEntity(parent, vo); - } - if(entityType == EntityFactory.IMAGE_TYPE) { - SimpleImageVO vo = json.fromJson(SimpleImageVO.class, jsonString); - return factory.createEntity(parent, vo); - } - if(entityType == EntityFactory.NINE_PATCH) { - Image9patchVO vo = json.fromJson(Image9patchVO.class, jsonString); - return factory.createEntity(parent, vo); - } - if(entityType == EntityFactory.LABEL_TYPE) { - LabelVO vo = json.fromJson(LabelVO.class, jsonString); - return factory.createEntity(parent, vo); - } - if(entityType == EntityFactory.PARTICLE_TYPE) { - ParticleEffectVO vo = json.fromJson(ParticleEffectVO.class, jsonString); - return factory.createEntity(parent, vo); - } - if(entityType == EntityFactory.TALOS_TYPE) { - TalosVO vo = json.fromJson(TalosVO.class, jsonString); - return factory.createEntity(parent, vo); - } - if(entityType == EntityFactory.SPRITE_TYPE) { - SpriteAnimationVO vo = json.fromJson(SpriteAnimationVO.class, jsonString); - return factory.createEntity(parent, vo); - } - if(entityType == EntityFactory.SPINE_TYPE) { - SpineVO vo = json.fromJson(SpineVO.class, jsonString); - return factory.createEntity(parent, vo); - } - if(entityType == EntityFactory.COLOR_PRIMITIVE) { - ColorPrimitiveVO vo = json.fromJson(ColorPrimitiveVO.class, jsonString); - return factory.createEntity(parent, vo); - } - if(entityType == EntityFactory.LIGHT_TYPE) { - LightVO vo = json.fromJson(LightVO.class, jsonString); - return factory.createEntity(parent, vo); - } - return -1; + return factory.createEntity(parent, factory.instantiateVOFromJson(jsonString, entityType)); } public static String getJsonStringFromEntity(int entity) { - Json json = new Json(); + Json json = HyperJson.getJson(); com.artemis.World engine = Sandbox.getInstance().getEngine(); + EntityFactory entityFactory = Sandbox.getInstance().sceneControl.sceneLoader.getEntityFactory(); int entityType = SandboxComponentRetriever.get(entity, MainItemComponent.class).entityType; - if(entityType == EntityFactory.COMPOSITE_TYPE) { - CompositeItemVO vo = new CompositeItemVO(); - vo.loadFromEntity(entity, engine); - return json.toJson(vo); - } - if(entityType == EntityFactory.IMAGE_TYPE) { - SimpleImageVO vo = new SimpleImageVO(); - vo.loadFromEntity(entity, engine); - return json.toJson(vo); - } - if(entityType == EntityFactory.NINE_PATCH) { - Image9patchVO vo = new Image9patchVO(); - vo.loadFromEntity(entity, engine); - return json.toJson(vo); - } - if(entityType == EntityFactory.LABEL_TYPE) { - LabelVO vo = new LabelVO(); - vo.loadFromEntity(entity, engine); - return json.toJson(vo); - } - if(entityType == EntityFactory.PARTICLE_TYPE) { - ParticleEffectVO vo = new ParticleEffectVO(); - vo.loadFromEntity(entity, engine); - return json.toJson(vo); - } - if(entityType == EntityFactory.TALOS_TYPE) { - TalosVO vo = new TalosVO(); - vo.loadFromEntity(entity, engine); - return json.toJson(vo); - } - if(entityType == EntityFactory.SPRITE_TYPE) { - SpriteAnimationVO vo = new SpriteAnimationVO(); - vo.loadFromEntity(entity, engine); - return json.toJson(vo); - } - if(entityType == EntityFactory.SPINE_TYPE) { - SpineVO vo = new SpineVO(); - vo.loadFromEntity(entity, engine); - return json.toJson(vo); - } - if(entityType == EntityFactory.COLOR_PRIMITIVE) { - ColorPrimitiveVO vo = new ColorPrimitiveVO(); - vo.loadFromEntity(entity, engine); - return json.toJson(vo); - } - if(entityType == EntityFactory.LIGHT_TYPE) { - LightVO vo = new LightVO(); - vo.loadFromEntity(entity, engine); - return json.toJson(vo); + try { + MainItemVO entityVO = entityFactory.instantiateEmptyVO(entityType); + entityVO.loadFromEntity(entity, engine, entityFactory); + return json.toJson(entityVO); + } catch (ReflectionException e) { + e.printStackTrace(); } return null; } public static String getJsonStringFromEntities(Set entities) { - CompositeVO holderComposite = new CompositeVO(); + CompositeItemVO holderComposite = new CompositeItemVO(); com.artemis.World engine = Sandbox.getInstance().getEngine(); - for(int entity : entities) { + EntityFactory entityFactory = Sandbox.getInstance().sceneControl.sceneLoader.getEntityFactory(); + for (int entity : entities) { int entityType = SandboxComponentRetriever.get(entity, MainItemComponent.class).entityType; - if(entityType == EntityFactory.COMPOSITE_TYPE) { - CompositeItemVO vo = new CompositeItemVO(); - vo.loadFromEntity(entity, engine); - holderComposite.sComposites.add(vo); - } - if(entityType == EntityFactory.IMAGE_TYPE) { - SimpleImageVO vo = new SimpleImageVO(); - vo.loadFromEntity(entity, engine); - holderComposite.sImages.add(vo); - } - if(entityType == EntityFactory.NINE_PATCH) { - Image9patchVO vo = new Image9patchVO(); - vo.loadFromEntity(entity, engine); - holderComposite.sImage9patchs.add(vo); - } - if(entityType == EntityFactory.LABEL_TYPE) { - LabelVO vo = new LabelVO(); - vo.loadFromEntity(entity, engine); - holderComposite.sLabels.add(vo); - } - if(entityType == EntityFactory.PARTICLE_TYPE) { - ParticleEffectVO vo = new ParticleEffectVO(); - vo.loadFromEntity(entity, engine); - holderComposite.sParticleEffects.add(vo); - } - if(entityType == EntityFactory.TALOS_TYPE) { - TalosVO vo = new TalosVO(); - vo.loadFromEntity(entity, engine); - holderComposite.sTalosVFX.add(vo); - } - if(entityType == EntityFactory.SPRITE_TYPE) { - SpriteAnimationVO vo = new SpriteAnimationVO(); - vo.loadFromEntity(entity, engine); - holderComposite.sSpriteAnimations.add(vo); - } - if(entityType == EntityFactory.SPINE_TYPE) { - SpineVO vo = new SpineVO(); - vo.loadFromEntity(entity, engine); - holderComposite.sSpineAnimations.add(vo); - } - if(entityType == EntityFactory.COLOR_PRIMITIVE) { - ColorPrimitiveVO vo = new ColorPrimitiveVO(); - vo.loadFromEntity(entity, engine); - holderComposite.sColorPrimitives.add(vo); - } - if(entityType == EntityFactory.LIGHT_TYPE) { - LightVO vo = new LightVO(); - vo.loadFromEntity(entity, engine); - holderComposite.sLights.add(vo); + try { + MainItemVO entityVO = entityFactory.instantiateEmptyVO(entityType); + entityVO.loadFromEntity(entity, engine, entityFactory); + holderComposite.addItem(entityVO); + } catch (ReflectionException e) { + e.printStackTrace(); } } - Json json = new Json(); - String result = json.toJson(holderComposite); + Json json = HyperJson.getJson(); - return result; + return json.toJson(holderComposite); } } diff --git a/src/main/java/games/rednblack/editor/view/stage/Sandbox.java b/src/main/java/games/rednblack/editor/view/stage/Sandbox.java index a9525c73..b4e1562c 100644 --- a/src/main/java/games/rednblack/editor/view/stage/Sandbox.java +++ b/src/main/java/games/rednblack/editor/view/stage/Sandbox.java @@ -39,12 +39,13 @@ import games.rednblack.editor.renderer.SceneConfiguration; import games.rednblack.editor.renderer.SceneLoader; import games.rednblack.editor.renderer.components.ViewPortComponent; import games.rednblack.editor.renderer.components.additional.ButtonComponent; -import games.rednblack.editor.renderer.data.CompositeVO; +import games.rednblack.editor.renderer.data.CompositeItemVO; import games.rednblack.editor.renderer.data.SceneVO; import games.rednblack.editor.renderer.physics.PhysicsBodyLoader; import games.rednblack.editor.renderer.systems.LightSystem; import games.rednblack.editor.renderer.systems.ParticleSystem; import games.rednblack.editor.renderer.systems.PhysicsSystem; +import games.rednblack.editor.renderer.utils.HyperJson; import games.rednblack.editor.system.ParticleContinuousSystem; import games.rednblack.editor.system.PhysicsAdjustSystem; import games.rednblack.editor.system.TalosContinuousSystem; @@ -313,26 +314,11 @@ public class Sandbox { * @return SceneVO */ public SceneVO sceneVoFromItems() { - CompositeVO newVo = new CompositeVO(); - newVo.loadFromEntity(getRootEntity(), getEngine()); + CompositeItemVO newVo = new CompositeItemVO(); + newVo.loadFromEntity(getRootEntity(), getEngine(), sceneControl.sceneLoader.getEntityFactory()); newVo.sStickyNotes.putAll(sceneControl.getCurrentSceneVO().composite.sStickyNotes); sceneControl.getCurrentSceneVO().composite = newVo; - //TODO WIP Artemis serialization - /*try { - //Serialize - FileOutputStream fos = new FileOutputStream("level.json"); - manager.save(fos, new SaveFileFormat(getEngine().getAspectSubscriptionManager().get(Aspect.all()))); - fos.close(); - - //Deserialize - final InputStream is = new FileInputStream("level.json"); - SaveFileFormat sff = manager.load(is, SaveFileFormat.class); - sceneLoader.getEntityFactoryV2().loadEntities(getCurrentViewingEntity(), sff.entities); - } catch (IOException e) { - e.printStackTrace(); - }*/ - return sceneControl.getCurrentSceneVO(); } @@ -519,13 +505,13 @@ public class Sandbox { payload[1] = data; Lwjgl3Application app = (Lwjgl3Application) Gdx.app; - Json json = new Json(); + Json json = HyperJson.getJson(); app.getClipboard().setContents(json.toJson(payload)); } public static Object retrieveFromClipboard() { Lwjgl3Application app = (Lwjgl3Application) Gdx.app; - Json json = new Json(); + Json json = HyperJson.getJson(); Object[] data = null; try { data = json.fromJson(Object[].class, app.getClipboard().getContents()); diff --git a/src/main/java/games/rednblack/editor/view/ui/box/UILayerBoxMediator.java b/src/main/java/games/rednblack/editor/view/ui/box/UILayerBoxMediator.java index 35021ac0..6727b9c5 100644 --- a/src/main/java/games/rednblack/editor/view/ui/box/UILayerBoxMediator.java +++ b/src/main/java/games/rednblack/editor/view/ui/box/UILayerBoxMediator.java @@ -18,6 +18,7 @@ package games.rednblack.editor.view.ui.box; +import com.badlogic.gdx.utils.Array; import com.kotcrab.vis.ui.util.dialog.Dialogs; import com.kotcrab.vis.ui.util.dialog.InputDialogListener; import games.rednblack.editor.HyperLap2DFacade; @@ -46,7 +47,7 @@ public class UILayerBoxMediator extends PanelMediator { private static final String TAG = UILayerBoxMediator.class.getCanonicalName(); public static final String NAME = TAG; - private ArrayList layers; + private Array layers; public UILayerBoxMediator() { super(NAME, new UILayerBox()); @@ -214,7 +215,7 @@ public class UILayerBoxMediator extends PanelMediator { private void setSelectedByName(String name) { String deletedLayerName = name; - for (int i = 0; i < layers.size(); i++) { + for (int i = 0; i < layers.size; i++) { if (layers.get(i).layerName.equals(deletedLayerName)) { viewComponent.setCurrentSelectedLayer(i); viewComponent.currentSelectedLayerIndex = i; @@ -289,7 +290,7 @@ public class UILayerBoxMediator extends PanelMediator { } private int findLayerByName(String name) { - for (int i = 0; i < layers.size(); i++) { + for (int i = 0; i < layers.size; i++) { if (layers.get(i).layerName.equals(name)) { return i; } @@ -299,7 +300,7 @@ public class UILayerBoxMediator extends PanelMediator { } private boolean checkIfNameIsUnique(String name) { - for (int i = 0; i < layers.size(); i++) { + for (int i = 0; i < layers.size; i++) { if (layers.get(i).layerName.equals(name)) { return false; } @@ -309,7 +310,7 @@ public class UILayerBoxMediator extends PanelMediator { } private int getFirstFreeLayer() { - for(int i = 0; i < layers.size(); i++) { + for(int i = 0; i < layers.size; i++) { if(!layers.get(i).isLocked) { return i; } @@ -325,7 +326,7 @@ public class UILayerBoxMediator extends PanelMediator { viewComponent.clearItems(); - for (int i = (layers.size()-1); i >=0; i--) { + for (int i = (layers.size-1); i >=0; i--) { viewComponent.addItem(layers.get(i)); } } diff --git a/src/main/java/games/rednblack/editor/view/ui/properties/panels/UICompositeItemPropertiesMediator.java b/src/main/java/games/rednblack/editor/view/ui/properties/panels/UICompositeItemPropertiesMediator.java index d261c672..c46c0d2c 100644 --- a/src/main/java/games/rednblack/editor/view/ui/properties/panels/UICompositeItemPropertiesMediator.java +++ b/src/main/java/games/rednblack/editor/view/ui/properties/panels/UICompositeItemPropertiesMediator.java @@ -54,7 +54,7 @@ public class UICompositeItemPropertiesMediator extends UIItemPropertiesMediator< @Override protected void translateViewToItemData() { CompositeItemVO payloadVo = new CompositeItemVO(); - payloadVo.loadFromEntity(observableReference, sandbox.getEngine()); + payloadVo.loadFromEntity(observableReference, sandbox.getEngine(), sandbox.sceneControl.sceneLoader.getEntityFactory()); payloadVo.automaticResize = viewComponent.isAutomaticResizeIsEnabled(); payloadVo.scissorsEnabled = viewComponent.isScissorsEnabled(); diff --git a/src/main/java/games/rednblack/editor/view/ui/properties/panels/UILightItemPropertiesMediator.java b/src/main/java/games/rednblack/editor/view/ui/properties/panels/UILightItemPropertiesMediator.java index a8836786..ec8e45c0 100644 --- a/src/main/java/games/rednblack/editor/view/ui/properties/panels/UILightItemPropertiesMediator.java +++ b/src/main/java/games/rednblack/editor/view/ui/properties/panels/UILightItemPropertiesMediator.java @@ -60,10 +60,10 @@ public class UILightItemPropertiesMediator extends UIItemPropertiesMediator