From 2cf54a33f09ad0f4eaa1a643b438d46c6400ac6e Mon Sep 17 00:00:00 2001 From: fabmax Date: Sun, 10 Dec 2023 21:51:52 +0100 Subject: [PATCH] fixed editor app reload --- .../kotlin/de/fabmax/kool/editor/model/NodeModel.kt | 1 + .../kotlin/de/fabmax/kool/editor/model/SceneModel.kt | 6 +++++- .../kotlin/de/fabmax/kool/pipeline/ao/AoPipeline.kt | 1 + .../commonMain/kotlin/de/fabmax/kool/scene/Node.kt | 7 +++++++ .../commonMain/kotlin/de/fabmax/kool/scene/Scene.kt | 1 + .../kotlin/de/fabmax/kool/editor/KoolEditor.kt | 11 ++++------- 6 files changed, 19 insertions(+), 8 deletions(-) diff --git a/kool-core/src/commonMain/kotlin/de/fabmax/kool/editor/model/NodeModel.kt b/kool-core/src/commonMain/kotlin/de/fabmax/kool/editor/model/NodeModel.kt index bfe55d0bf..6aa5ce1ec 100644 --- a/kool-core/src/commonMain/kotlin/de/fabmax/kool/editor/model/NodeModel.kt +++ b/kool-core/src/commonMain/kotlin/de/fabmax/kool/editor/model/NodeModel.kt @@ -119,6 +119,7 @@ abstract class NodeModel(val nodeData: SceneNodeData) { it.destroyComponent() check(!it.isCreated) { "Component not destroyed: $it" } } + components.clear() onNodeUpdate.clear() drawNode.release() drawNode.parent?.removeNode(drawNode) diff --git a/kool-core/src/commonMain/kotlin/de/fabmax/kool/editor/model/SceneModel.kt b/kool-core/src/commonMain/kotlin/de/fabmax/kool/editor/model/SceneModel.kt index 59a006582..cb6ddae80 100644 --- a/kool-core/src/commonMain/kotlin/de/fabmax/kool/editor/model/SceneModel.kt +++ b/kool-core/src/commonMain/kotlin/de/fabmax/kool/editor/model/SceneModel.kt @@ -95,7 +95,11 @@ class SceneModel(sceneData: SceneNodeData, val project: EditorProject) : NodeMod } private fun disposeCreatedScene() { - nodeModels.values.forEach { it.destroyComponents() } + nodeModels.values.forEach { + it.destroyComponents() + project.entities -= it + } + nodeModels.clear() nodesToNodeModels.clear() drawNode.release() diff --git a/kool-core/src/commonMain/kotlin/de/fabmax/kool/pipeline/ao/AoPipeline.kt b/kool-core/src/commonMain/kotlin/de/fabmax/kool/pipeline/ao/AoPipeline.kt index 2600845b2..1cd1fa68e 100644 --- a/kool-core/src/commonMain/kotlin/de/fabmax/kool/pipeline/ao/AoPipeline.kt +++ b/kool-core/src/commonMain/kotlin/de/fabmax/kool/pipeline/ao/AoPipeline.kt @@ -91,6 +91,7 @@ abstract class AoPipeline : BaseReleasable() { depthPass = NormalLinearDepthMapPass(drawNode, mapWidth, mapHeight) depthPass.camera = proxyCamera depthPass.isUpdateDrawNode = false + depthPass.isReleaseDrawNode = false depthPass.onBeforeCollectDrawCommands += { ev -> proxyCamera.sync(ev) } diff --git a/kool-core/src/commonMain/kotlin/de/fabmax/kool/scene/Node.kt b/kool-core/src/commonMain/kotlin/de/fabmax/kool/scene/Node.kt index bd9f76389..22dc6b7aa 100644 --- a/kool-core/src/commonMain/kotlin/de/fabmax/kool/scene/Node.kt +++ b/kool-core/src/commonMain/kotlin/de/fabmax/kool/scene/Node.kt @@ -324,6 +324,13 @@ open class Node(name: String? = null) : BaseReleasable() { return null } + fun traverse(block: (Node) -> Unit) { + block(this) + children.forEach { + it.traverse(block) + } + } + open fun collectTag(result: MutableList, tag: String, value: String? = null) { if (tags.hasTag(tag, value)) { result += this diff --git a/kool-core/src/commonMain/kotlin/de/fabmax/kool/scene/Scene.kt b/kool-core/src/commonMain/kotlin/de/fabmax/kool/scene/Scene.kt index e6a261f86..485c39170 100644 --- a/kool-core/src/commonMain/kotlin/de/fabmax/kool/scene/Scene.kt +++ b/kool-core/src/commonMain/kotlin/de/fabmax/kool/scene/Scene.kt @@ -115,6 +115,7 @@ open class Scene(name: String? = null) : Node(name) { super.release() mainRenderPass.renderPass.release() + offscreenPasses.update() for (i in offscreenPasses.indices) { offscreenPasses[i].release() } diff --git a/kool-editor/src/commonMain/kotlin/de/fabmax/kool/editor/KoolEditor.kt b/kool-editor/src/commonMain/kotlin/de/fabmax/kool/editor/KoolEditor.kt index 8dab20d67..55b4107b7 100644 --- a/kool-editor/src/commonMain/kotlin/de/fabmax/kool/editor/KoolEditor.kt +++ b/kool-editor/src/commonMain/kotlin/de/fabmax/kool/editor/KoolEditor.kt @@ -272,12 +272,9 @@ class KoolEditor(val ctx: KoolContext, val paths: ProjectPaths) { editorCameraTransform.addNode(editorOverlay.camera) // dispose old scene + objects - EditorState.projectModel.getCreatedScenes().map { it.drawNode }.let { oldScenes -> - ctx.scenes -= oldScenes.toSet() - oldScenes.forEach { - it.removeOffscreenPass(selectionOverlay.selectionPass) - it.release() - } + EditorState.projectModel.getCreatedScenes().forEach { sceneModel -> + ctx.scenes -= sceneModel.drawNode + sceneModel.drawNode.removeOffscreenPass(selectionOverlay.selectionPass) } EditorState.loadedApp.value?.app?.onDispose(ctx) selectionOverlay.selectionPass.disposePipelines(ctx) @@ -288,7 +285,7 @@ class KoolEditor(val ctx: KoolContext, val paths: ProjectPaths) { // add scene objects from new app EditorState.projectModel.getCreatedScenes().let { newScenes -> if (newScenes.size != 1) { - logW { "Unusual number of scene, currently only single scene setups are supported" } + logW { "Unsupported number of scene, currently only single scene setups are supported" } } newScenes.firstOrNull()?.let { sceneModel -> val scene = sceneModel.drawNode