8000 Merge pull request #624 from neph1/fix_spatial_update · jMonkeyEngine/sdk@3edabe7 · GitHub
[go: up one dir, main page]

Skip to content

Commit 3edabe7

Browse files
authored
Merge pull request #624 from neph1/fix_spatial_update
speculative fix for failed spatial updates in scenecomposer window
2 parents 290ba52 + 105b783 commit 3edabe7

File tree

3 files changed

+96
-68
lines changed

3 files changed

+96
-68
lines changed

jme3-core/src/com/jme3/gde/core/assets/ExternalChangeScanner.java

Lines changed: 13 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2003-2012 jMonkeyEngine
2+
* Copyright (c) 2003-2024 jMonkeyEngine
33
* All rights reserved.
44
*
55
* Redistribution and use in source and binary forms, with or without
@@ -36,7 +36,6 @@
3636
import com.jme3.gde.core.scene.SceneApplication;
3737
import com.jme3.gde.core.sceneexplorer.SceneExplorerTopComponent;
3838
import com.jme3.gde.core.sceneexplorer.nodes.JmeNode;
39-
import com.jme3.gde.core.sceneexplorer.nodes.JmeSpatial;
4039
import com.jme3.gde.core.util.SpatialUtil;
4140
import com.jme3.gde.core.util.TaggedSpatialFinder;
4241
import com.jme3.gde.core.util.datatransfer.CopyAnimationDataFromOriginal;
@@ -186,9 +185,7 @@ private void notifyUser() {
186185

187186
private void applyExternalData(final boolean onlyMeshData,
188187
final boolean onlyAnimData) {
189-
final ProgressHandle handle = ProgressHandle.createHandle("Updating "
190-
+ "file "
191-
+ "data");
188+
final ProgressHandle handle = ProgressHandle.createHandle("Updating file data");
192189
handle.start();
193190
try {
194191
final Spatial original = loadOriginalSpatial();
@@ -207,13 +204,11 @@ private void applyExternalData(final boolean onlyMeshData,
207204
new CopyTransformDataFromOriginal(finder).update(spat, original);
208205
new CopyMaterialDataFromOriginal(finder).update(spat, original);
209206
}
210-
// Do a complicated recurse refresh since AbstractSceneExplorerNode:refresh() isn't working
207+
211208
SwingUtilities.invokeLater(() -> {
212209
Node rootNode = SceneExplorerTopComponent.findInstance().getExplorerManager().getRootContext();
213-
if (rootNode instanceof JmeNode) {
214-
SceneApplication.getApplication().enqueue((Runnable) () -> {
215-
refreshNamedSpatial((JmeNode) rootNode, spat.getName());
216-
});
210+
if (rootNode instanceof JmeNode jmeNode) {
211+
SceneApplication.getApplication().enqueue(new RefreshJmeSpatial(jmeNode, spat.getName()));
217212
}
218213
});
219214

@@ -228,46 +223,15 @@ private void applyExternalData(final boolean onlyMeshData,
228223
}
229224
}
230225

231-
/**
232-
* Look for the spatial to update using the name of the asset
233-
* @param spatial
234-
* @param name
235-
*/
236-
private void refreshNamedSpatial(JmeSpatial spatial, String name){
237-
if(spatial.getName().equals(name)){
238-
recurseRefresh(spatial);
239-
} else {
240-
for(Node s: spatial.getChildren().getNodes()){
241-
if(s instanceof JmeSpatial){
242-
refreshNamedSpatial((JmeSpatial) s, name);
243-
}
244-
245-
}
246-
}
247-
}
248-
249-
/**
250-
* Refreshes the spatial and all children
251-
* @param spatial
252-
*/
253-
private void recurseRefresh(JmeSpatial spatial){
254-
spatial.refresh(false);
255-
for(Node s: spatial.getChildren().getNodes()){
256-
if(s instanceof JmeSpatial){
257-
recurseRefresh((JmeSpatial) s);
258-
}
259-
}
260-
}
261-
262226
private Spatial loadOriginalSpatial() {
263227
try {
264228
final DataObject dobj = DataObject.find(originalObject);
265229
final AssetData originalAssetData =
266230
dobj.getLookup().lookup(AssetData.class);
267231
if (originalAssetData != null) {
268232
final Savable sav = originalAssetData.loadAsset();
269-
if (sav instanceof Spatial) {
270-
return (Spatial) sav;
233+
if (sav instanceof Spatial spatial) {
234+
return spatial;
271235
} else {
272236
LOGGER.log(Level.SEVERE, "Trying to load original for {0}"
273237
+ " but it is not a Spatial: {1}",
@@ -352,18 +316,22 @@ public void assetDataPropertyChanged(final String property,
352316
}
353317
}
354318

319+
@Override
355320
public void fileFolderCreated(FileEvent fe) {
356321
}
357322

323+
@Override
358324
public void fileDataCreated(FileEvent fe) {
359325
}
360326

327+
@Override
361328
public void fileChanged(FileEvent fe) {
362329
LOGGER.log(Level.INFO, "External file {0} for {1} changed!",
363330
new Object[]{fe.getFile(), assetDataObject.getName()});
364331
notifyUser();
365332
}
366333

334+
@Override
367335
public void fileDeleted(FileEvent fe) {
368336
LOGGER.log(Level.INFO, "External file {0} for {1} deleted!",
369337
new Object[]{fe.getFile(), assetDataObject.getName()});
@@ -377,6 +345,7 @@ public void fileDeleted(FileEvent fe) {
377345
//TODO: add folder listener for when recreated
378346
}
379347

348+
@Override
380349
public void fileRenamed(FileRenameEvent fe) {
381350
LOGGER.log(Level.INFO, "External file {0} for {1} renamed!",
382351
new Object[]{fe.getFile(), assetDataObject.getName()});
@@ -388,6 +357,7 @@ public void fileRenamed(FileRenameEvent fe) {
388357
}
389358
}
390359

360+
@Override
391361
public void fileAttributeChanged(FileAttributeEvent fe) {
392362
}
393363
}
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
2+
package com.jme3.gde.core.assets;
3+
4+
import com.jme3.gde.core.sceneexplorer.nodes.JmeNode;
5+
import org.openide.nodes.Node;
6+
7+
import com.jme3.gde.core.sceneexplorer.nodes.JmeSpatial;
8+
9+
/**
10+
* Work around for refresh not working recursively on JmeSpatial
11+
* @author rickard
12+
*/
13+
public class RefreshJmeSpatial implements Runnable {
14+
15+
private final JmeNode rootNode;
16+
private final String spatialName;
17+
18+
public RefreshJmeSpatial(JmeNode rootNode, String spatialName) {
19+
this.rootNode = rootNode;
20+
this.spatialName = spatialName;
21+
}
22+
23+
@Override
24+
public void run() {
25+
refreshNamedSpatial(rootNode, spatialName);
26+
}
27+
/**
28+
* Look for the spatial to update using the name of the asset
29+
* @param spatial
30+
* @param name
31+
*/
32+
private void refreshNamedSpatial(JmeSpatial spatial, String name){
33+
if(spatial.getName().equals(name)){
34+
recurseRefresh(spatial);
35+
} else {
36+
for(Node s: spatial.getChildren().getNodes()){
37+
if(s instanceof JmeSpatial jmeSpatial){
38+
refreshNamedSpatial(jmeSpatial, name);
39+
}
40+
41+
}
42+
}
43+
}
44+
45+
/**
46+
* Refreshes the spatial and all children
47+
* @param spatial
48+
*/
49+
private void recurseRefresh(JmeSpatial spatial){
50+
spatial.refresh(false);
51+
for(Node s: spatial.getChildren().getNodes()){
52+
if(s instanceof JmeSpatial jmeSpatial){
53+
recurseRefresh(jmeSpatial);
54+
}
55+
}
56+
}
57+
58+
}

jme3-core/src/com/jme3/gde/core/sceneexplorer/SceneExplorerTopComponent.java

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2009-2010 jMonkeyEngine
2+
* Copyright (c) 2009-2024 jMonkeyEngine
33
* All rights reserved.
44
*
55
* Redistribution and use in source and binary forms, with or without
@@ -31,6 +31,7 @@
3131
*/
3232
package com.jme3.gde.core.sceneexplorer;
3333

34+
import com.jme3.gde.core.assets.RefreshJmeSpatial;
3435
import com.jme3.gde.core.icons.IconList;
3536
import com.jme3.g 10000 de.core.scene.PreviewRequest;
3637
import com.jme3.gde.core.scene.SceneApplication;
@@ -48,6 +49,7 @@
4849
import java.util.Map;
4950
import java.util.logging.Level;
5051
import java.util.logging.Logger;
52+
import javax.swing.SwingUtilities;
5153
import org.netbeans.api.settings.ConvertAsProperties;
5254
import org.openide.actions.CopyAction;
5355
import org.openide.actions.CutAction;
@@ -80,8 +82,9 @@ public final class SceneExplorerTopComponent extends TopComponent implements Exp
8082
// private final Result<AbstractSceneExplorerNode> nodeSelectionResult;
8183
private AbstractSceneExplorerNode selectedSpatial;
8284
private AbstractSceneExplorerNode lastSelected;
83-
private Map<String, MaterialChangeProvider> materialChangeProviders = new HashMap<String, MaterialChangeProvider>();
84-
private Map<String, List<MaterialChangeListener>> materialChangeListeners = new HashMap<String, List<MaterialChangeListener>>();
85+
private final Map<String, MaterialChangeProvider> materialChangeProviders = new HashMap<>();
86+
private final Map<String, List<MaterialChangeListener>> materialChangeListeners = new HashMap<>();
87+
private transient ExplorerManager explorerManager = new ExplorerManager();
8588

8689
public SceneExplorerTopComponent() {
8790
initComponents();
@@ -90,8 +93,6 @@ public SceneExplorerTopComponent() {
9093
setToolTipText(NbBundle.getMessage(SceneExplorerTopComponent.class, "HINT_SceneExplorerTopComponent"));
9194
setIcon(IconList.jmeLogo.getImage());
9295
associateLookup(ExplorerUtils.createLookup(explorerManager, getActionMap()));
93-
// nodeSelectionResult = Utilities.actionsGlobalContext().lookupResult(AbstractSceneExplorerNode.class);
94-
// nodeSelectionResult.addLookupListener(this);
9596
}
9697

9798
private void initActions() {
@@ -151,7 +152,15 @@ private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRS
151152
if (selectedSpatial == null) {
152153
return;
153154
}
154-
selectedSpatial.refresh(false);
155+
SwingUtilities.invokeLater(() -> {
156+
Node rootNode = SceneExplorerTopComponent.findInstance().getExplorerManager().getRootContext();
157+
if (rootNode instanceof JmeNode jmeNode) {
158+
SceneApplication.getApplication().enqueue(new RefreshJmeSpatial(jmeNode, selectedSpatial.getName()));
159+
} else {
160+
selectedSpatial.refresh(false);
161+
}
162+
});
163+
155164
}//GEN-LAST:event_jButton1ActionPerformed
156165
// Variables declaration - do not modify//GEN-BEGIN:variables
157166
private javax.swing.JScrollPane explorerScrollPane;
@@ -164,6 +173,7 @@ private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRS
164173
* only, i.e. deserialization routines; otherwise you could get a
165174
* non-deserialized instance. To obtain the singleton instance, use
166175
* {@link #findInstance}.
176+
* @return
167177
*/
168178
public static synchronized SceneExplorerTopComponent getDefault() {
169179
if (instance == null) {
@@ -175,6 +185,7 @@ public static synchronized SceneExplorerTopComponent getDefault() {
175185
/**
176186
* Obtain the SceneExplorerTopComponent instance. Never call
177187
* {@link #getDefault} directly!
188+
* @return
178189
*/
179190
public static synchronized SceneExplorerTopComponent findInstance() {
180191
TopComponent win = WindowManager.getDefault().findTopComponent(PREFERRED_ID);
@@ -183,8 +194,8 @@ public static synchronized SceneExplorerTopComponent findInstance() {
183194
"Cannot find " + PREFERRED_ID + " component. It will not be located properly in the window system.");
184195
return getDefault();
185196
}
186-
if (win instanceof SceneExplorerTopComponent) {
187-
return (SceneExplorerTopComponent) win;
197+
if (win instanceof SceneExplorerTopComponent sceneExplorerTopComponent) {
198+
return sceneExplorerTopComponent;
188199
}
189200
logger.warning(
190201
"There seem to be multiple components with the '" + PREFERRED_ID
@@ -233,8 +244,8 @@ Object readProperties(java.util.Properties p) {
233244
}
234245

235246
private void readPropertiesImpl(java.util.Properties p) {
236-
String version = p.getProperty("version");
237247
// TODO read your settings according to their version
248+
238249
}
239250

240251
@Override
@@ -246,7 +257,6 @@ protected String preferredID() {
246257
public UndoRedo getUndoRedo() {
247258
return Lookup.getDefault().lookup(UndoRedo.class);
248259
}
249-
private transient ExplorerManager explorerManager = new ExplorerManager();
250260

251261
@Override
252262
public ExplorerManager getExplorerManager() {
@@ -266,26 +276,15 @@ public void setSelectedNode(AbstractSceneExplorerNode node) {
266276
explorerManager.setSelectedNodes(new Node[]{});
267277
// setActivatedNodes(new Node[]{});
268278
}
269-
} catch (Exception ex) {
279+
} catch (PropertyVetoException ex) {
270280
Exceptions.printStackTrace(ex);
271281
}
272282
}
273283

274-
// public void resultChanged(LookupEvent ev) {
275-
// Collection collection = nodeSelectionResult.allInstances();
276-
// for (Iterator it = collection.iterator(); it.hasNext();) {
277-
// Object object = it.next();
278-
// if (object instanceof AbstractSceneExplorerNode) {
279-
// return;
280-
// }
281-
// }
282-
// selectedSpatial = null;
283-
// }
284284
@Override
285285
public void sceneOpened(SceneRequest request) {
286286
final JmeNode node = request.getJmeNode();
287-
for (Iterator it = materialChangeProviders.values().iterator(); it.hasNext();) {
288-
MaterialChangeProvider provider = (MaterialChangeProvider) it.next();
287+
for (MaterialChangeProvider provider : materialChangeProviders.values()) {
289288
provider.clearMaterialChangeListeners();
290289
}
291290
if (node != null) {
@@ -339,7 +338,7 @@ public void addMaterialChangeListener(MaterialChangeListener listener) {
339338
logger.log(Level.FINE, "New material listener for : {0}", listener.getKey());
340339
List<MaterialChangeListener> listeners = materialChangeListeners.get(listener.getKey());
341340
if (listeners == null) {
342-
listeners = new ArrayList<MaterialChangeListener>();
341+
listeners = new ArrayList<>();
343342
materialChangeListeners.put(listener.getKey(), listeners);
344343
}
345344
listeners.add(listener);
@@ -383,7 +382,7 @@ public void swapMaterialChangeListener(MaterialChangeListener listener, String o
383382
// assert newKey.equals(listener.getKey());
384383
List<MaterialChangeListener> listeners = materialChangeListeners.get(newKey);
385384
if (listeners == null) {
386-
listeners = new ArrayList<MaterialChangeListener>();
385+
listeners = new ArrayList<>();
387386
materialChangeListeners.put(newKey, listeners);
388387
}
389388
listeners.add(listener);
@@ -397,6 +396,7 @@ public void swapMaterialChangeListener(MaterialChangeListener listener, String o
397396

398397
/**
399398
* Terrain has a LOD control that requires the camera to function.
399+
* @param jmeRootNode
400400
*/
401401
protected void setTerrainLodCamera(JmeNode jmeRootNode) {
402402
Camera camera = SceneApplication.getApplication().getCamera();

0 commit comments

Comments
 (0)
0