SDK:
- improve FakeApplication handling git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@10111 75d07b2b-3a1a-0410-a2c5-0572b91ccdca
This commit is contained in:
parent
220490bee7
commit
d127a7389e
@ -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;
|
rootNode.attachChild(model);
|
||||||
}
|
}
|
||||||
//TODO: use FakeApp internal root node
|
|
||||||
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…
x
Reference in New Issue
Block a user