SDK:
- more threading fixes in Scene(Composer)ToolController - change order of calls in Application (first SceneApplication sets up your SceneRequest, then plugin sceneOpened is called, for sceneClosed the scene is destructed after the call) git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@8627 75d07b2b-3a1a-0410-a2c5-0572b91ccdca
This commit is contained in:
parent
b90d093ef0
commit
b43b9efe18
@ -209,7 +209,7 @@ public class SceneApplication extends Application implements LookupProvider {
|
|||||||
guiViewPort.setClearFlags(false, false, false);
|
guiViewPort.setClearFlags(false, false, false);
|
||||||
}
|
}
|
||||||
getProgressHandle().progress("Setup Camera Controller", 2);
|
getProgressHandle().progress("Setup Camera Controller", 2);
|
||||||
//create camera controler
|
//create camera controller
|
||||||
camController = new SceneCameraController(cam, inputManager);
|
camController = new SceneCameraController(cam, inputManager);
|
||||||
//create preview view
|
//create preview view
|
||||||
getProgressHandle().progress("Setup Preview Scene", 3);
|
getProgressHandle().progress("Setup Preview Scene", 3);
|
||||||
@ -305,10 +305,10 @@ public class SceneApplication extends Application implements LookupProvider {
|
|||||||
listeners.remove(listener);
|
listeners.remove(listener);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void notifyOpen() {
|
private void notifyOpen(final SceneRequest opened) {
|
||||||
for (Iterator<SceneListener> it = listeners.iterator(); it.hasNext();) {
|
for (Iterator<SceneListener> it = listeners.iterator(); it.hasNext();) {
|
||||||
SceneListener sceneViewerListener = it.next();
|
SceneListener sceneViewerListener = it.next();
|
||||||
sceneViewerListener.sceneOpened(currentSceneRequest);
|
sceneViewerListener.sceneOpened(opened);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -337,13 +337,16 @@ public class SceneApplication extends Application implements LookupProvider {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* method to display the node tree of a plugin (threadsafe)
|
* method to display the node tree of a plugin (threadsafe)
|
||||||
* @param tree
|
* @param request
|
||||||
*/
|
*/
|
||||||
public void openScene(final SceneRequest request) {
|
public void openScene(final SceneRequest request) {
|
||||||
closeScene(currentSceneRequest);
|
closeScene(currentSceneRequest, request);
|
||||||
java.awt.EventQueue.invokeLater(new Runnable() {
|
java.awt.EventQueue.invokeLater(new Runnable() {
|
||||||
|
|
||||||
public void run() {
|
public void run() {
|
||||||
|
if (request == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
currentSceneRequest = request;
|
currentSceneRequest = request;
|
||||||
if (request.getDataObject() != null) {
|
if (request.getDataObject() != null) {
|
||||||
setCurrentFileNode(request.getDataObject().getNodeDelegate());
|
setCurrentFileNode(request.getDataObject().getNodeDelegate());
|
||||||
@ -352,7 +355,6 @@ public class SceneApplication extends Application implements LookupProvider {
|
|||||||
}
|
}
|
||||||
setHelpContext(request.getHelpCtx());
|
setHelpContext(request.getHelpCtx());
|
||||||
setWindowTitle(request.getWindowTitle());
|
setWindowTitle(request.getWindowTitle());
|
||||||
notifyOpen();
|
|
||||||
enqueue(new Callable() {
|
enqueue(new Callable() {
|
||||||
|
|
||||||
public Object call() throws Exception {
|
public Object call() throws Exception {
|
||||||
@ -373,38 +375,45 @@ public class SceneApplication extends Application implements LookupProvider {
|
|||||||
if (request.getToolNode() != null) {
|
if (request.getToolNode() != null) {
|
||||||
toolsNode.attachChild(request.getToolNode());
|
toolsNode.attachChild(request.getToolNode());
|
||||||
}
|
}
|
||||||
getCurrentSceneRequest().setDisplayed(true);
|
request.setDisplayed(true);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
notifyOpen(request);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* method to close a scene displayed by a scene request (threadsafe)
|
* method to close a scene displayed by a scene request (threadsafe)
|
||||||
* @param tree
|
* @param request
|
||||||
*/
|
*/
|
||||||
public void closeScene(final SceneRequest request) {
|
public void closeScene(final SceneRequest request) {
|
||||||
if (request != null) {
|
closeScene(request, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void closeScene(final SceneRequest oldRequest, final SceneRequest newRequest) {
|
||||||
java.awt.EventQueue.invokeLater(new Runnable() {
|
java.awt.EventQueue.invokeLater(new Runnable() {
|
||||||
|
|
||||||
public void run() {
|
public void run() {
|
||||||
checkSave();
|
if (oldRequest == null) {
|
||||||
setCurrentFileNode(null);
|
return;
|
||||||
setWindowTitle("OpenGL Window");
|
}
|
||||||
setHelpContext(null);
|
if (newRequest == null || newRequest.getRootNode() != oldRequest.getRootNode()) {
|
||||||
|
checkSave(oldRequest);
|
||||||
SceneUndoRedoManager manager = Lookup.getDefault().lookup(SceneUndoRedoManager.class);
|
SceneUndoRedoManager manager = Lookup.getDefault().lookup(SceneUndoRedoManager.class);
|
||||||
if (manager != null) {
|
if (manager != null) {
|
||||||
manager.discardAllEdits();
|
manager.discardAllEdits();
|
||||||
}
|
}
|
||||||
final SceneRequest currentRequest = currentSceneRequest;
|
}
|
||||||
currentSceneRequest = null;
|
setCurrentFileNode(null);
|
||||||
notifyClose(request);
|
setWindowTitle("OpenGL Window");
|
||||||
|
setHelpContext(null);
|
||||||
|
notifyClose(oldRequest);
|
||||||
enqueue(new Callable() {
|
enqueue(new Callable() {
|
||||||
|
|
||||||
public Object call() throws Exception {
|
public Object call() throws Exception {
|
||||||
if (request.getRequester() instanceof SceneApplication) {
|
if (oldRequest.getRequester() instanceof SceneApplication) {
|
||||||
camController.disable();
|
camController.disable();
|
||||||
}
|
}
|
||||||
if (physicsState != null) {
|
if (physicsState != null) {
|
||||||
@ -416,19 +425,18 @@ public class SceneApplication extends Application implements LookupProvider {
|
|||||||
rootNode.detachAllChildren();
|
rootNode.detachAllChildren();
|
||||||
// resetCam();
|
// resetCam();
|
||||||
lastError = "";
|
lastError = "";
|
||||||
currentRequest.setDisplayed(false);
|
oldRequest.setDisplayed(false);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
private void checkSave() {
|
private void checkSave(SceneRequest request) {
|
||||||
if ((currentSceneRequest != null)
|
if ((request != null)
|
||||||
&& currentSceneRequest.getDataObject().isModified()) {
|
&& request.getDataObject().isModified()) {
|
||||||
final DataObject req = currentSceneRequest.getDataObject();
|
final DataObject req = request.getDataObject();
|
||||||
Confirmation mesg = new NotifyDescriptor.Confirmation("Scene has not been saved,\ndo you want to save it?",
|
Confirmation mesg = new NotifyDescriptor.Confirmation("Scene has not been saved,\ndo you want to save it?",
|
||||||
"Not Saved",
|
"Not Saved",
|
||||||
NotifyDescriptor.YES_NO_OPTION);
|
NotifyDescriptor.YES_NO_OPTION);
|
||||||
|
@ -278,8 +278,15 @@ public class SceneToolController implements AppState {
|
|||||||
|
|
||||||
protected void detachSelectionShape() {
|
protected void detachSelectionShape() {
|
||||||
if (selectionShape != null) {
|
if (selectionShape != null) {
|
||||||
selectionShape.removeFromParent();
|
final Spatial shape = selectionShape;
|
||||||
selectionShape = null;
|
selectionShape = null;
|
||||||
|
SceneApplication.getApplication().enqueue(new Callable<Void>() {
|
||||||
|
|
||||||
|
public Void call() throws Exception {
|
||||||
|
shape.removeFromParent();
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -66,18 +66,28 @@ public class SceneComposerToolController extends SceneToolController {
|
|||||||
// a node in a viewport that will always render on top
|
// a node in a viewport that will always render on top
|
||||||
onTopToolsNode = new Node("OverlayNode");
|
onTopToolsNode = new Node("OverlayNode");
|
||||||
overlayView = SceneApplication.getApplication().getOverlayView();
|
overlayView = SceneApplication.getApplication().getOverlayView();
|
||||||
// overlayView.setClearFlags(false, true, false);
|
SceneApplication.getApplication().enqueue(new Callable<Void>() {
|
||||||
|
|
||||||
|
public Void call() throws Exception {
|
||||||
overlayView.attachScene(onTopToolsNode);
|
overlayView.attachScene(onTopToolsNode);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void cleanup() {
|
public void cleanup() {
|
||||||
super.cleanup();
|
super.cleanup();
|
||||||
//SceneApplication.getApplication().getRenderManager().removeMainView(overlayView);
|
|
||||||
overlayView.detachScene(onTopToolsNode);
|
|
||||||
cameraController = null;
|
cameraController = null;
|
||||||
editorController = null;
|
editorController = null;
|
||||||
|
SceneApplication.getApplication().enqueue(new Callable<Void>() {
|
||||||
|
|
||||||
|
public Void call() throws Exception {
|
||||||
|
overlayView.detachScene(onTopToolsNode);
|
||||||
onTopToolsNode.detachAllChildren();
|
onTopToolsNode.detachAllChildren();
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -788,10 +788,6 @@ private void scaleButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-F
|
|||||||
SceneRequest request = new SceneRequest(this, jmeNode, manager);
|
SceneRequest request = new SceneRequest(this, jmeNode, manager);
|
||||||
request.setDataObject(file);
|
request.setDataObject(file);
|
||||||
request.setHelpCtx(ctx);
|
request.setHelpCtx(ctx);
|
||||||
if (editorController != null) {
|
|
||||||
editorController.cleanup();
|
|
||||||
}
|
|
||||||
editorController = new SceneEditorController(jmeNode, file);
|
|
||||||
this.sentRequest = request;
|
this.sentRequest = request;
|
||||||
request.setWindowTitle("SceneComposer - " + manager.getRelativeAssetPath(file.getPrimaryFile().getPath()));
|
request.setWindowTitle("SceneComposer - " + manager.getRelativeAssetPath(file.getPrimaryFile().getPath()));
|
||||||
request.setToolNode(new Node("SceneComposerToolNode"));
|
request.setToolNode(new Node("SceneComposerToolNode"));
|
||||||
@ -845,22 +841,17 @@ private void scaleButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-F
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void selectSpatial(JmeSpatial spatial) {
|
private void selectSpatial(JmeSpatial spatial) {
|
||||||
|
|
||||||
if (spatial == null) {
|
|
||||||
setSelectedObjectText(null);
|
|
||||||
if (editorController != null) {
|
if (editorController != null) {
|
||||||
editorController.setSelectedSpat(spatial);
|
editorController.setSelectedSpat(spatial);
|
||||||
}
|
}
|
||||||
|
if (spatial == null) {
|
||||||
|
setSelectedObjectText(null);
|
||||||
return;
|
return;
|
||||||
} else {
|
} else {
|
||||||
if (toolController != null) {
|
if (toolController != null) {
|
||||||
toolController.updateSelection(spatial.getLookup().lookup(Spatial.class));
|
toolController.updateSelection(spatial.getLookup().lookup(Spatial.class));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (editorController == null) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
editorController.setSelectedSpat(spatial);
|
|
||||||
if (spatial.getLookup().lookup(Node.class) != null) {
|
if (spatial.getLookup().lookup(Node.class) != null) {
|
||||||
setSelectedObjectText(spatial.getLookup().lookup(Node.class).getName());
|
setSelectedObjectText(spatial.getLookup().lookup(Node.class).getName());
|
||||||
} else if (spatial.getLookup().lookup(Spatial.class) != null) {
|
} else if (spatial.getLookup().lookup(Spatial.class) != null) {
|
||||||
@ -892,15 +883,19 @@ private void scaleButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-F
|
|||||||
public void sceneOpened(SceneRequest request) {
|
public void sceneOpened(SceneRequest request) {
|
||||||
if (request.equals(sentRequest)) {
|
if (request.equals(sentRequest)) {
|
||||||
currentRequest = request;
|
currentRequest = request;
|
||||||
setActivatedNodes(new org.openide.nodes.Node[]{currentRequest.getDataObject().getNodeDelegate()});
|
if (editorController != null) {
|
||||||
setSceneInfo(currentRequest.getJmeNode(), editorController.getCurrentFileObject(), true);
|
editorController.cleanup();
|
||||||
|
}
|
||||||
|
editorController = new SceneEditorController(request.getJmeNode(), request.getDataObject());
|
||||||
|
setActivatedNodes(new org.openide.nodes.Node[]{request.getDataObject().getNodeDelegate()});
|
||||||
|
setSceneInfo(request.getJmeNode(), editorController.getCurrentFileObject(), true);
|
||||||
if (camController != null) {
|
if (camController != null) {
|
||||||
camController.disable();
|
camController.disable();
|
||||||
}
|
}
|
||||||
if (toolController != null) {
|
if (toolController != null) {
|
||||||
toolController.cleanup();
|
toolController.cleanup();
|
||||||
}
|
}
|
||||||
toolController = new SceneComposerToolController(currentRequest.getToolNode(), currentRequest.getManager(), request.getJmeNode());
|
toolController = new SceneComposerToolController(request.getToolNode(), request.getManager(), request.getJmeNode());
|
||||||
|
|
||||||
camController = new ComposerCameraController(SceneApplication.getApplication().getCamera(), request.getJmeNode());
|
camController = new ComposerCameraController(SceneApplication.getApplication().getCamera(), request.getJmeNode());
|
||||||
toolController.setEditorController(editorController);
|
toolController.setEditorController(editorController);
|
||||||
|
@ -893,7 +893,7 @@ public final class VehicleCreatorTopComponent extends TopComponent implements Sc
|
|||||||
|
|
||||||
public Void call() throws Exception {
|
public Void call() throws Exception {
|
||||||
controller.cleanupApplication();
|
controller.cleanupApplication();
|
||||||
// current.getRootNode().removeLight(dirLight);
|
current.getRootNode().getParent().removeLight(dirLight);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -910,7 +910,7 @@ public final class VehicleCreatorTopComponent extends TopComponent implements Sc
|
|||||||
|
|
||||||
public Void call() throws Exception {
|
public Void call() throws Exception {
|
||||||
controller.prepareApplication();
|
controller.prepareApplication();
|
||||||
// request.getRootNode().addLight(dirLight);
|
request.getRootNode().getParent().addLight(dirLight);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
Loading…
x
Reference in New Issue
Block a user