Skip to content

Commit 87f581c

Browse files
committed
Vector field addon
1 parent 9953646 commit 87f581c

10 files changed

Lines changed: 979 additions & 32 deletions

File tree

CHANGES

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
- Improve fonts and zoom in/out visualization
44
- Interactive timeline
55
- Timeline scrolls
6+
- Vector Fields Addon (read and generate .fga)
67

78
[1.5.3]
89
- Update Spine 4.2.10

src/main/games/rednblack/talos/editor/UIStage.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -488,6 +488,8 @@ public void swapToAddonContent(Table left, Table right, Table bottom) {
488488
leftTable.clearChildren();
489489
rightTable.clearChildren();
490490
bottomTable.clearChildren();
491+
verticalPane.setMaxSplitAmount(0.70f);
492+
verticalPane.setSplitAmount(0.7f);
491493
TalosMain.Instance().disableNodeStage();
492494

493495
leftTable.add(left).grow();
@@ -503,10 +505,16 @@ public void swapToAddonContent(Table left, Table right, Table bottom) {
503505
verticalPane.setVisible(false);
504506
}
505507

508+
if(left != null && right != null && bottom == null) {
509+
verticalPane.setMaxSplitAmount(1);
510+
verticalPane.setSplitAmount(1);
511+
}
506512
}
507513

508514
public void swapToTalosContent() {
509515
hideCustomLayout();
516+
verticalPane.setMaxSplitAmount(0.70f);
517+
verticalPane.setSplitAmount(0.7f);
510518
verticalPane.setVisible(true);
511519
horizontalPane.setVisible(true);
512520

src/main/games/rednblack/talos/editor/addons/AddonController.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import com.kotcrab.vis.ui.widget.MenuBar;
66
import games.rednblack.talos.editor.addons.bvb.BvBAddon;
77
import games.rednblack.talos.editor.addons.shader.ShaderAddon;
8+
import games.rednblack.talos.editor.addons.vectorfield.VectorFieldAddon;
89
import games.rednblack.talos.editor.dialogs.SettingsDialog;
910

1011
public class AddonController {
@@ -14,6 +15,7 @@ public class AddonController {
1415
public AddonController() {
1516
registerAddon(new BvBAddon());
1617
registerAddon(new ShaderAddon());
18+
registerAddon(new VectorFieldAddon());
1719
}
1820

1921
private void registerAddon(IAddon addon) {

src/main/games/rednblack/talos/editor/addons/shader/ShaderTimeline.java

Lines changed: 0 additions & 16 deletions
This file was deleted.
Lines changed: 152 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,152 @@
1+
package games.rednblack.talos.editor.addons.vectorfield;
2+
3+
import com.badlogic.gdx.Gdx;
4+
import com.badlogic.gdx.files.FileHandle;
5+
import com.badlogic.gdx.scenes.scene2d.InputEvent;
6+
import com.badlogic.gdx.scenes.scene2d.ui.Image;
7+
import com.badlogic.gdx.scenes.scene2d.utils.ClickListener;
8+
import com.badlogic.gdx.utils.Array;
9+
import com.kotcrab.vis.ui.widget.Menu;
10+
import com.kotcrab.vis.ui.widget.MenuBar;
11+
import com.kotcrab.vis.ui.widget.MenuItem;
12+
import com.kotcrab.vis.ui.widget.file.FileChooserAdapter;
13+
import games.rednblack.talos.TalosMain;
14+
import games.rednblack.talos.editor.addons.IAddon;
15+
import games.rednblack.talos.editor.dialogs.SettingsDialog;
16+
import games.rednblack.talos.editor.project.IProject;
17+
18+
public class VectorFieldAddon implements IAddon {
19+
20+
public static VectorFieldProject VF_PROJECT;
21+
22+
private VectorFieldWorkspace workspace;
23+
private VectorFieldPropertiesPanel propertiesPanel;
24+
25+
@Override
26+
public void init () {
27+
VF_PROJECT = new VectorFieldProject(this);
28+
workspace = new VectorFieldWorkspace();
29+
propertiesPanel = new VectorFieldPropertiesPanel(TalosMain.Instance().UIStage().getSkin(), workspace);
30+
}
31+
32+
@Override
33+
public void initUIContent () {
34+
TalosMain.Instance().UIStage().swapToAddonContent(propertiesPanel, workspace, null);
35+
TalosMain.Instance().disableNodeStage();
36+
TalosMain.Instance().UIStage().Menu().disableTalosSpecific();
37+
TalosMain.Instance().UIStage().getStage().setKeyboardFocus(workspace);
38+
}
39+
40+
@Override
41+
public boolean projectFileDrop (FileHandle handle) {
42+
if (handle.extension().equals("tvf")) {
43+
TalosMain.Instance().ProjectController().setProject(getProjectType());
44+
TalosMain.Instance().ProjectController().loadProject(handle);
45+
return true;
46+
}
47+
48+
IProject currProjectType = TalosMain.Instance().ProjectController().getProject();
49+
50+
if (currProjectType == VF_PROJECT) {
51+
if (handle.extension().equals("fga")) {
52+
String data = handle.readString();
53+
workspace.importFGA(data);
54+
propertiesPanel.syncFromWorkspace();
55+
return true;
56+
}
57+
}
58+
59+
return false;
60+
}
61+
62+
@Override
63+
public IProject getProjectType () {
64+
return VF_PROJECT;
65+
}
66+
67+
@Override
68+
public void announceLocalSettings (SettingsDialog settingsDialog) {
69+
}
70+
71+
@Override
72+
public void buildMenu (MenuBar menuBar) {
73+
Menu menu = new Menu("Vector Field");
74+
75+
MenuItem newFile = new MenuItem("New Vector Field", icon("ic-file-new"));
76+
menu.addItem(newFile);
77+
MenuItem openFile = new MenuItem("Open Vector Field", icon("ic-folder"));
78+
menu.addItem(openFile);
79+
MenuItem importFga = new MenuItem("Import .fga");
80+
menu.addItem(importFga);
81+
MenuItem exportFga = new MenuItem("Export .fga");
82+
menu.addItem(exportFga);
83+
84+
newFile.addListener(new ClickListener() {
85+
@Override
86+
public void clicked (InputEvent event, float x, float y) {
87+
TalosMain.Instance().ProjectController().newProject(VF_PROJECT);
88+
}
89+
});
90+
91+
openFile.addListener(new ClickListener() {
92+
@Override
93+
public void clicked (InputEvent event, float x, float y) {
94+
TalosMain.Instance().UIStage().openProjectAction(VF_PROJECT);
95+
}
96+
});
97+
98+
importFga.addListener(new ClickListener() {
99+
@Override
100+
public void clicked (InputEvent event, float x, float y) {
101+
TalosMain.Instance().UIStage().showFileChooser(".fga", new FileChooserAdapter() {
102+
@Override
103+
public void selected (Array<FileHandle> files) {
104+
if (files.size > 0) {
105+
// ensure we're in VF project mode
106+
IProject currProject = TalosMain.Instance().ProjectController().getProject();
107+
if (currProject != VF_PROJECT) {
108+
TalosMain.Instance().ProjectController().newProject(VF_PROJECT);
109+
}
110+
String data = files.get(0).readString();
111+
workspace.importFGA(data);
112+
propertiesPanel.syncFromWorkspace();
113+
}
114+
}
115+
});
116+
}
117+
});
118+
119+
exportFga.addListener(new ClickListener() {
120+
@Override
121+
public void clicked (InputEvent event, float x, float y) {
122+
TalosMain.Instance().UIStage().showSaveFileChooser(".fga", new FileChooserAdapter() {
123+
@Override
124+
public void selected (Array<FileHandle> files) {
125+
if (files.size > 0) {
126+
String fgaData = workspace.exportFGA();
127+
files.get(0).writeString(fgaData, false);
128+
}
129+
}
130+
});
131+
}
132+
});
133+
134+
menuBar.addMenu(menu);
135+
}
136+
137+
@Override
138+
public void dispose () {
139+
}
140+
141+
public VectorFieldWorkspace getWorkspace () {
142+
return workspace;
143+
}
144+
145+
public VectorFieldPropertiesPanel getPropertiesPanel () {
146+
return propertiesPanel;
147+
}
148+
149+
private Image icon (String name) {
150+
return new Image(TalosMain.Instance().UIStage().getSkin().getDrawable(name));
151+
}
152+
}
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
package games.rednblack.talos.editor.addons.vectorfield;
2+
3+
import com.badlogic.gdx.files.FileHandle;
4+
import com.badlogic.gdx.utils.*;
5+
import games.rednblack.talos.editor.project.IProject;
6+
7+
import java.io.StringWriter;
8+
9+
public class VectorFieldProject implements IProject {
10+
11+
private final VectorFieldAddon addon;
12+
13+
public VectorFieldProject (VectorFieldAddon addon) {
14+
this.addon = addon;
15+
}
16+
17+
@Override
18+
public void loadProject (FileHandle projectFileHandle, String data, boolean fromMemory) {
19+
Json json = new Json();
20+
JsonValue root = new JsonReader().parse(data);
21+
22+
addon.getWorkspace().read(json, root.get("workspace"));
23+
}
24+
25+
@Override
26+
public String getProjectString (boolean toMemory) {
27+
Json json = new Json();
28+
json.setOutputType(JsonWriter.OutputType.json);
29+
30+
StringWriter writer = new StringWriter();
31+
json.setWriter(new JsonWriter(writer));
32+
33+
json.writeObjectStart();
34+
json.writeValue("workspace", addon.getWorkspace());
35+
json.writeObjectEnd();
36+
37+
return writer.toString();
38+
}
39+
40+
@Override
41+
public void resetToNew () {
42+
addon.getWorkspace().initField(16, 16);
43+
}
44+
45+
@Override
46+
public String getExtension () {
47+
return ".tvf";
48+
}
49+
50+
@Override
51+
public String getExportExtension () {
52+
return ".fga";
53+
}
54+
55+
@Override
56+
public String getProjectNameTemplate () {
57+
return "VectorField";
58+
}
59+
60+
@Override
61+
public void initUIContent () {
62+
addon.initUIContent();
63+
}
64+
65+
@Override
66+
public FileHandle findFileInDefaultPaths (String fileName) {
67+
return null;
68+
}
69+
70+
@Override
71+
public Array<String> getSavedResourcePaths () {
72+
return null;
73+
}
74+
75+
@Override
76+
public String exportProject () {
77+
return addon.getWorkspace().exportFGA();
78+
}
79+
80+
@Override
81+
public String getProjectTypeName () {
82+
return "Vector Field";
83+
}
84+
85+
@Override
86+
public boolean requiresWorkspaceLocation () {
87+
return false;
88+
}
89+
90+
@Override
91+
public void createWorkspaceEnvironment (String path, String name) {
92+
}
93+
}

0 commit comments

Comments
 (0)