Skip to content

Commit d47ce70

Browse files
Vladimir PetrenkoJavaSaBr
authored andcommitted
Merged in vp-byte/jme3-spaceshift-editor/master (pull request #2)
Issue #107 Supports for AssetLinkNode Approved-by: Aliaksandr Brui
2 parents 50ea7bf + 9030d71 commit d47ce70

File tree

11 files changed

+208
-27
lines changed

11 files changed

+208
-27
lines changed

resources/messages/messages.properties

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,7 @@ ModelNodeTreeActionCreatePrimitiveBox=Box
174174
ModelNodeTreeActionCreatePrimitiveSphere=Sphere
175175
ModelNodeTreeActionCreatePrimitiveQuad=Quad
176176
ModelNodeTreeActionLoadModel=Load model
177+
ModelNodeTreeActionLinkModel=Link model
177178
ModelNodeTreeActionTangentGenerator=Generate tangents
178179
ModelNodeTreeActionLoDGenerator=Generate levels of details
179180
ModelNodeTreeActionLight=Light

resources/messages/messages_ru.properties

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,7 @@ ModelNodeTreeActionCreatePrimitiveBox=Куб
174174
ModelNodeTreeActionCreatePrimitiveSphere=Сфера
175175
ModelNodeTreeActionCreatePrimitiveQuad=Плоскость
176176
ModelNodeTreeActionLoadModel=Загрузить модель
177+
ModelNodeTreeActionLinkModel=Создать ссылку на модель
177178
ModelNodeTreeActionTangentGenerator=Сгенерировать тангенты
178179
ModelNodeTreeActionLoDGenerator=Сгенерировать уровни детализации
179180
ModelNodeTreeActionLight=Источник света
384 Bytes
Loading
Lines changed: 38 additions & 0 deletions
Loading

src/com/ss/editor/Messages.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,7 @@ public class Messages {
192192
public static final String MODEL_NODE_TREE_ACTION_CREATE_PRIMITIVE_SPHERE;
193193
public static final String MODEL_NODE_TREE_ACTION_CREATE_PRIMITIVE_QUAD;
194194
public static final String MODEL_NODE_TREE_ACTION_LOAD_MODEL;
195+
public static final String MODEL_NODE_TREE_ACTION_LINK_MODEL;
195196
public static final String MODEL_NODE_TREE_ACTION_TANGENT_GENERATOR;
196197
public static final String MODEL_NODE_TREE_ACTION_LOD_GENERATOR;
197198
public static final String MODEL_NODE_TREE_ACTION_LIGHT;
@@ -758,6 +759,7 @@ public class Messages {
758759
MODEL_NODE_TREE_ACTION_CREATE_PRIMITIVE_SPHERE = bundle.getString("ModelNodeTreeActionCreatePrimitiveSphere");
759760
MODEL_NODE_TREE_ACTION_CREATE_PRIMITIVE_QUAD = bundle.getString("ModelNodeTreeActionCreatePrimitiveQuad");
760761
MODEL_NODE_TREE_ACTION_LOAD_MODEL = bundle.getString("ModelNodeTreeActionLoadModel");
762+
MODEL_NODE_TREE_ACTION_LINK_MODEL = bundle.getString("ModelNodeTreeActionLinkModel");
761763
MODEL_NODE_TREE_ACTION_TANGENT_GENERATOR = bundle.getString("ModelNodeTreeActionTangentGenerator");
762764
MODEL_NODE_TREE_ACTION_LOD_GENERATOR = bundle.getString("ModelNodeTreeActionLoDGenerator");
763765
MODEL_NODE_TREE_ACTION_LIGHT = bundle.getString("ModelNodeTreeActionLight");

src/com/ss/editor/ui/Icons.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,8 @@ public interface Icons {
8888
Image WAY_POINT_16 = ICON_MANAGER.getImage("/ui/icons/actions/svg/placeholder.svg", 16, false);
8989
Image VERTEX_16 = ICON_MANAGER.getImage("/ui/icons/actions/svg/graphene.svg", 16, false);
9090
Image DATA_16 = ICON_MANAGER.getImage("/ui/icons/actions/svg/database.svg", 16, false);
91+
Image LINKNODE_16 = ICON_MANAGER.getImage("/ui/icons/actions/16/linknode.png");
92+
Image LINK_FILE_16 = ICON_MANAGER.getImage("/ui/icons/actions/svg/link-folder-with-document.svg");
9193

9294
Image REFRESH_18 = ICON_MANAGER.getImage("/ui/icons/actions/18/refresh.png", 18);
9395
Image CLOSE_18 = ICON_MANAGER.getImage("/ui/icons/actions/18/close.png", 18);

src/com/ss/editor/ui/component/editor/impl/scene/AbstractSceneFileEditor.java

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,5 @@
11
package com.ss.editor.ui.component.editor.impl.scene;
22

3-
import static com.ss.editor.control.transform.SceneEditorControl.LOADED_MODEL_KEY;
4-
import static com.ss.editor.util.EditorUtil.*;
5-
import static com.ss.editor.util.MaterialUtils.saveIfNeedTextures;
6-
import static com.ss.editor.util.MaterialUtils.updateMaterialIdNeed;
7-
import static java.util.Objects.requireNonNull;
8-
import static rlib.util.ClassUtils.unsafeCast;
93
import com.jme3.asset.AssetManager;
104
import com.jme3.asset.MaterialKey;
115
import com.jme3.asset.ModelKey;
@@ -15,6 +9,7 @@
159
import com.jme3.material.Material;
1610
import com.jme3.math.Vector3f;
1711
import com.jme3.renderer.Camera;
12+
import com.jme3.scene.AssetLinkNode;
1813
import com.jme3.scene.Geometry;
1914
import com.jme3.scene.Node;
2015
import com.jme3.scene.Spatial;
@@ -85,6 +80,13 @@
8580
import java.util.function.Consumer;
8681
import java.util.function.Supplier;
8782

83+
import static com.ss.editor.control.transform.SceneEditorControl.LOADED_MODEL_KEY;
84+
import static com.ss.editor.util.EditorUtil.*;
85+
import static com.ss.editor.util.MaterialUtils.saveIfNeedTextures;
86+
import static com.ss.editor.util.MaterialUtils.updateMaterialIdNeed;
87+
import static java.util.Objects.requireNonNull;
88+
import static rlib.util.ClassUtils.unsafeCast;
89+
8890
/**
8991
* The base implementation of a model file editor.
9092
*
@@ -1033,7 +1035,7 @@ protected void processChangeTool(@Nullable final Number oldValue, @NotNull final
10331035
FXUtils.removeFromParent(modelNodeTree, modelNodeTreeParent);
10341036
}
10351037

1036-
final int oldIndex = oldValue == null? -1 : oldValue.intValue();
1038+
final int oldIndex = oldValue == null ? -1 : oldValue.intValue();
10371039
final int newIndex = newValue.intValue();
10381040

10391041
if (newIndex == OBJECTS_TOOL) {
@@ -1130,14 +1132,18 @@ private void addNewModel(final @NotNull DragEvent dragEvent, @NotNull final Path
11301132

11311133
final AssetManager assetManager = EDITOR.getAssetManager();
11321134
final Spatial loadedModel = assetManager.loadModel(modelKey);
1133-
loadedModel.setUserData(LOADED_MODEL_KEY, true);
1134-
loadedModel.setLocalTranslation(editorAppState.getScenePosByScreenPos(sceneX, sceneY));
1135+
1136+
final AssetLinkNode assetLinkNode = new AssetLinkNode(modelKey);
1137+
assetLinkNode.attachLinkedChild(loadedModel, modelKey);
1138+
assetLinkNode.setUserData(LOADED_MODEL_KEY, true);
11351139

11361140
if (defaultLayer != null) {
1137-
SceneLayer.setLayer(defaultLayer, loadedModel);
1141+
SceneLayer.setLayer(defaultLayer, assetLinkNode);
11381142
}
1143+
assetLinkNode.setLocalTranslation(editorAppState.getScenePosByScreenPos(sceneX, sceneY));
1144+
11391145

1140-
execute(new AddChildOperation(loadedModel, (Node) currentModel));
1146+
execute(new AddChildOperation(assetLinkNode, (Node) currentModel));
11411147
});
11421148
}
11431149

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package com.ss.editor.ui.control.model.node.spatial;
2+
3+
import com.jme3.scene.AssetLinkNode;
4+
import com.jme3.scene.Node;
5+
import com.ss.editor.ui.Icons;
6+
import javafx.scene.image.Image;
7+
import org.jetbrains.annotations.NotNull;
8+
import org.jetbrains.annotations.Nullable;
9+
10+
/**
11+
* The implementation of the {@link SpatialModelNode} for representing the {@link Node} in the editor.
12+
*
13+
* @author vp-byte
14+
*/
15+
public class AssetLinkNodeModelNode extends NodeModelNode<AssetLinkNode> {
16+
17+
public AssetLinkNodeModelNode(@NotNull AssetLinkNode element, long objectId) {
18+
super(element, objectId);
19+
}
20+
21+
@Nullable
22+
@Override
23+
public Image getIcon() {
24+
return Icons.LINKNODE_16;
25+
}
26+
27+
}

src/com/ss/editor/ui/control/model/node/spatial/NodeModelNode.java

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import static com.ss.editor.ui.control.tree.node.ModelNodeFactory.createFor;
55
import static com.ss.editor.util.EditorUtil.*;
66
import static java.util.Objects.requireNonNull;
7+
78
import com.jme3.asset.AssetManager;
89
import com.jme3.scene.Node;
910
import com.jme3.scene.Spatial;
@@ -12,10 +13,7 @@
1213
import com.ss.editor.model.undo.editor.ChangeConsumer;
1314
import com.ss.editor.ui.Icons;
1415
import com.ss.editor.ui.control.model.tree.ModelNodeTree;
15-
import com.ss.editor.ui.control.model.tree.action.CreateNodeAction;
16-
import com.ss.editor.ui.control.model.tree.action.CreateSkyAction;
17-
import com.ss.editor.ui.control.model.tree.action.LoadModelAction;
18-
import com.ss.editor.ui.control.model.tree.action.OptimizeGeometryAction;
16+
import com.ss.editor.ui.control.model.tree.action.*;
1917
import com.ss.editor.ui.control.model.tree.action.audio.CreateAudioNodeAction;
2018
import com.ss.editor.ui.control.model.tree.action.emitter.CreateTonegodEmitterAction;
2119
import com.ss.editor.ui.control.model.tree.action.emitter.CreateTonegodSoftEmitterAction;
@@ -83,9 +81,10 @@ protected Menu createCreationMenu(@NotNull final AbstractNodeTree<?> nodeTree) {
8381
new CreateAmbientLightAction(nodeTree, this), new CreateDirectionLightAction(nodeTree, this));
8482

8583
menu.getItems().addAll(new CreateNodeAction(nodeTree, this), new LoadModelAction(nodeTree, this),
86-
new CreateSkyAction(nodeTree, this), new CreateTonegodEmitterAction(nodeTree, this),
87-
new CreateTonegodSoftEmitterAction(nodeTree, this), new CreateAudioNodeAction(nodeTree, this),
88-
new CreateTerrainAction(nodeTree, this), createPrimitiveMenu, addLightMenu);
84+
new LinkModelAction(nodeTree, this), new CreateSkyAction(nodeTree, this),
85+
new CreateTonegodEmitterAction(nodeTree, this), new CreateTonegodSoftEmitterAction(nodeTree, this),
86+
new CreateAudioNodeAction(nodeTree, this), new CreateTerrainAction(nodeTree, this),
87+
createPrimitiveMenu, addLightMenu);
8988

9089
return menu;
9190
}
Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
package com.ss.editor.ui.control.model.tree.action;
2+
3+
import com.jme3.asset.AssetManager;
4+
import com.jme3.asset.ModelKey;
5+
import com.jme3.scene.AssetLinkNode;
6+
import com.jme3.scene.Node;
7+
import com.jme3.scene.Spatial;
8+
import com.ss.editor.FileExtensions;
9+
import com.ss.editor.Messages;
10+
import com.ss.editor.model.undo.editor.ChangeConsumer;
11+
import com.ss.editor.model.undo.editor.ModelChangeConsumer;
12+
import com.ss.editor.model.undo.editor.SceneChangeConsumer;
13+
import com.ss.editor.ui.Icons;
14+
import com.ss.editor.ui.component.asset.tree.context.menu.action.DeleteFileAction;
15+
import com.ss.editor.ui.component.asset.tree.context.menu.action.NewFileAction;
16+
import com.ss.editor.ui.component.asset.tree.context.menu.action.RenameFileAction;
17+
import com.ss.editor.ui.control.model.tree.action.operation.AddChildOperation;
18+
import com.ss.editor.ui.control.tree.AbstractNodeTree;
19+
import com.ss.editor.ui.control.tree.node.ModelNode;
20+
import com.ss.editor.ui.util.UIUtils;
21+
import com.ss.extension.scene.SceneLayer;
22+
import com.ss.extension.scene.SceneNode;
23+
import javafx.scene.image.Image;
24+
import org.jetbrains.annotations.NotNull;
25+
import org.jetbrains.annotations.Nullable;
26+
import rlib.util.array.Array;
27+
import rlib.util.array.ArrayFactory;
28+
29+
import java.nio.file.Path;
30+
import java.util.function.Predicate;
31+
32+
import static com.ss.editor.control.transform.SceneEditorControl.LOADED_MODEL_KEY;
33+
import static com.ss.editor.util.EditorUtil.getAssetFile;
34+
import static com.ss.editor.util.EditorUtil.toAssetPath;
35+
import static java.util.Objects.requireNonNull;
36+
37+
/**
38+
* The implementation of the {@link AbstractNodeAction} for loading the {@link Spatial} to the editor.
39+
*
40+
* @author vp-byte
41+
*/
42+
public class LinkModelAction extends AbstractNodeAction<ModelChangeConsumer> {
43+
44+
private static final Predicate<Class<?>> ACTION_TESTER = type -> type == NewFileAction.class ||
45+
type == DeleteFileAction.class ||
46+
type == RenameFileAction.class;
47+
48+
private static final Array<String> MODEL_EXTENSIONS = ArrayFactory.newArray(String.class);
49+
50+
static {
51+
MODEL_EXTENSIONS.add(FileExtensions.JME_OBJECT);
52+
}
53+
54+
public LinkModelAction(@NotNull final AbstractNodeTree<?> nodeTree, @NotNull final ModelNode<?> node) {
55+
super(nodeTree, node);
56+
}
57+
58+
@Nullable
59+
@Override
60+
protected Image getIcon() {
61+
return Icons.LINK_FILE_16;
62+
}
63+
64+
@NotNull
65+
@Override
66+
protected String getName() {
67+
return Messages.MODEL_NODE_TREE_ACTION_LINK_MODEL;
68+
}
69+
70+
@Override
71+
protected void process() {
72+
UIUtils.openAssetDialog(this::processOpen, MODEL_EXTENSIONS, ACTION_TESTER);
73+
}
74+
75+
/**
76+
* The process of opening file.
77+
*/
78+
protected void processOpen(@NotNull final Path file) {
79+
80+
final AbstractNodeTree<?> nodeTree = getNodeTree();
81+
final ChangeConsumer consumer = requireNonNull(nodeTree.getChangeConsumer());
82+
83+
final SceneNode sceneNode = consumer instanceof SceneChangeConsumer ?
84+
((SceneChangeConsumer) consumer).getCurrentModel() : null;
85+
86+
final SceneLayer defaultLayer = sceneNode == null ? null : sceneNode.getLayers().first();
87+
88+
final Path assetFile = requireNonNull(getAssetFile(file), "Not found asset file for " + file);
89+
final String assetPath = toAssetPath(assetFile);
90+
91+
final ModelKey modelKey = new ModelKey(assetPath);
92+
93+
final AssetManager assetManager = EDITOR.getAssetManager();
94+
final Spatial loadedModel = assetManager.loadModel(modelKey);
95+
96+
final AssetLinkNode assetLinkNode = new AssetLinkNode(modelKey);
97+
assetLinkNode.attachLinkedChild(loadedModel, modelKey);
98+
assetLinkNode.setUserData(LOADED_MODEL_KEY, true);
99+
100+
if (defaultLayer != null) {
101+
SceneLayer.setLayer(defaultLayer, assetLinkNode);
102+
}
103+
104+
final ModelNode<?> modelNode = getNode();
105+
final Node parent = (Node) modelNode.getElement();
106+
consumer.execute(new AddChildOperation(assetLinkNode, parent));
107+
}
108+
}

0 commit comments

Comments
 (0)