- improve FakeApplication handling

git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@10111 75d07b2b-3a1a-0410-a2c5-0572b91ccdca
3.0
nor..67 12 years ago
parent 220490bee7
commit d127a7389e
  1. 68
      sdk/jme3-core/src/com/jme3/gde/core/scene/FakeApplication.java
  2. 21
      sdk/jme3-core/src/com/jme3/gde/core/scene/SceneApplication.java

@ -41,6 +41,8 @@ import com.jme3.audio.Listener;
import com.jme3.gde.core.appstates.AppStateManagerNode; import com.jme3.gde.core.appstates.AppStateManagerNode;
import com.jme3.input.FlyByCamera; import com.jme3.input.FlyByCamera;
import com.jme3.input.InputManager; import com.jme3.input.InputManager;
import com.jme3.light.Light;
import com.jme3.light.LightList;
import com.jme3.renderer.Camera; import com.jme3.renderer.Camera;
import com.jme3.renderer.RenderManager; import com.jme3.renderer.RenderManager;
import com.jme3.renderer.Renderer; import com.jme3.renderer.Renderer;
@ -58,6 +60,7 @@ import java.io.UnsupportedEncodingException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.Iterator; import java.util.Iterator;
import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.concurrent.Callable; import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutionException;
@ -360,6 +363,7 @@ public class FakeApplication extends SimpleApplication {
return states; return states;
} }
//TODO: make thread safe
@Override @Override
public boolean attach(AppState state) { public boolean attach(AppState state) {
boolean ret = super.attach(state); boolean ret = super.attach(state);
@ -393,9 +397,22 @@ public class FakeApplication extends SimpleApplication {
*/ */
private ScheduledThreadPoolExecutor fakeAppThread = new ScheduledThreadPoolExecutor(1); private ScheduledThreadPoolExecutor fakeAppThread = new ScheduledThreadPoolExecutor(1);
public void removeCurrentStates() {
for (Iterator<AppState> it = new ArrayList(appStateManager.getAddedStates()).iterator(); it.hasNext();) {
AppState appState = it.next();
try {
appStateManager.detach(appState);
} catch (Exception e) {
Exceptions.printStackTrace(e);
}
}
}
public void cleanupFakeApp() { public void cleanupFakeApp() {
runQueuedFake(); runQueuedFake();
appStateManager = new FakeAppStateManager(this); if (guiNode != null) {
clearNode(guiNode);
}
if (rootNode != null) { if (rootNode != null) {
clearNode(rootNode); clearNode(rootNode);
} }
@ -445,13 +462,6 @@ public class FakeApplication extends SimpleApplication {
NotifyDescriptor.WARNING_MESSAGE)); NotifyDescriptor.WARNING_MESSAGE));
} }
private void removeAllStates() {
for (Iterator<AppState> it = new ArrayList(appStateManager.getAddedStates()).iterator(); it.hasNext();) {
AppState appState = it.next();
appStateManager.detach(appState);
}
}
public boolean runQueuedFake() { public boolean runQueuedFake() {
Future fut = fakeAppThread.submit(new Callable<Void>() { Future fut = fakeAppThread.submit(new Callable<Void>() {
public Void call() throws Exception { public Void call() throws Exception {
@ -587,6 +597,30 @@ public class FakeApplication extends SimpleApplication {
return clazz; return clazz;
} }
private void removeAllStates() {
try {
try {
for (Iterator<AppState> it = new ArrayList(appStateManager.getAddedStates()).iterator(); it.hasNext();) {
AppState appState = it.next();
appStateManager.detach(appState);
}
} catch (Exception e) {
Exceptions.printStackTrace(e);
}
AppState state = appStateManager.getState(AppState.class);
while (state != null) {
try {
appStateManager.update(0);
} catch (Exception e) {
Exceptions.printStackTrace(e);
}
state = appStateManager.getState(AppState.class);
}
} catch (Exception e) {
Exceptions.printStackTrace(e);
}
}
private void clearNode(final Node externalNode) { private void clearNode(final Node externalNode) {
while (!externalNode.getChildren().isEmpty()) { while (!externalNode.getChildren().isEmpty()) {
try { try {
@ -615,5 +649,23 @@ public class FakeApplication extends SimpleApplication {
externalNode.setUserData(string, null); externalNode.setUserData(string, null);
} }
} }
LightList llist = null;
try {
llist = externalNode.getLocalLightList();
for (Iterator<Light> it = llist.iterator(); it.hasNext();) {
Light light = it.next();
try {
externalNode.removeLight(light);
} catch (Exception e) {
Exceptions.printStackTrace(e);
} catch (Error e) {
Exceptions.printStackTrace(e);
}
}
} catch (Exception e) {
Exceptions.printStackTrace(e);
} catch (Error e) {
Exceptions.printStackTrace(e);
}
} }
} }

@ -35,6 +35,7 @@ import com.jme3.gde.core.assets.AssetData;
import com.jme3.gde.core.assets.AssetDataObject; import com.jme3.gde.core.assets.AssetDataObject;
import com.jme3.gde.core.scene.controller.AbstractCameraController; import com.jme3.gde.core.scene.controller.AbstractCameraController;
import com.jme3.gde.core.scene.processors.WireProcessor; import com.jme3.gde.core.scene.processors.WireProcessor;
import com.jme3.gde.core.sceneexplorer.nodes.NodeUtility;
import com.jme3.gde.core.sceneviewer.SceneViewerTopComponent; import com.jme3.gde.core.sceneviewer.SceneViewerTopComponent;
import com.jme3.gde.core.undoredo.SceneUndoRedoManager; import com.jme3.gde.core.undoredo.SceneUndoRedoManager;
import com.jme3.input.FlyByCamera; import com.jme3.input.FlyByCamera;
@ -381,11 +382,15 @@ public class SceneApplication extends Application implements LookupProvider {
return; return;
} }
currentSceneRequest = request; currentSceneRequest = request;
if (request.getDataObject() != null) { if (request.getDataNode() != null) {
setCurrentFileNode(request.getDataObject().getNodeDelegate()); setCurrentFileNode(request.getDataNode());
} else { } else {
setCurrentFileNode(null); setCurrentFileNode(null);
} }
//TODO: handle this differently (no opened file)
if (request.getRootNode() == null && request.getJmeNode() == null) {
request.setJmeNode(NodeUtility.createNode(rootNode, false));
}
setHelpContext(request.getHelpCtx()); setHelpContext(request.getHelpCtx());
setWindowTitle(request.getWindowTitle()); setWindowTitle(request.getWindowTitle());
if (request.getRequester() instanceof SceneApplication) { if (request.getRequester() instanceof SceneApplication) {
@ -395,19 +400,17 @@ public class SceneApplication extends Application implements LookupProvider {
} }
final AssetManager manager = request.getManager(); final AssetManager manager = request.getManager();
request.setFakeApp(fakeApp); request.setFakeApp(fakeApp);
fakeApp.newAssetManager(manager);
enqueue(new Callable() { enqueue(new Callable() {
public Object call() throws Exception { public Object call() throws Exception {
if (manager != null) { if (manager != null) {
assetManager = manager; assetManager = manager;
fakeApp.newAssetManager(manager);
} }
Spatial model = request.getRootNode(); Spatial model = request.getRootNode();
if (model == null) { //TODO: use FakeApp internal root node, don't handle model vs clean scene here
StatusDisplayer.getDefault().setStatusText("could not load Spatial from request: " + getCurrentSceneRequest().getWindowTitle()); if (model != null && model != rootNode) {
return null;
}
//TODO: use FakeApp internal root node
rootNode.attachChild(model); rootNode.attachChild(model);
}
if (request.getToolNode() != null) { if (request.getToolNode() != null) {
toolsNode.attachChild(request.getToolNode()); toolsNode.attachChild(request.getToolNode());
} }
@ -451,6 +454,8 @@ public class SceneApplication extends Application implements LookupProvider {
if (oldRequest.getRequester() instanceof SceneApplication) { if (oldRequest.getRequester() instanceof SceneApplication) {
camController.disable(); camController.disable();
} }
//TODO: state list is not thread safe..
fakeApp.removeCurrentStates();
enqueue(new Callable() { enqueue(new Callable() {
public Object call() throws Exception { public Object call() throws Exception {
if (physicsState != null) { if (physicsState != null) {

Loading…
Cancel
Save