From a61a67cbf34441854f4b6fd68c293275da6024ea Mon Sep 17 00:00:00 2001 From: Shadowfacts Date: Fri, 9 Aug 2019 23:18:02 -0400 Subject: [PATCH] Refactor program execution flow to link bidirectionally --- .../asmr/manager/ManagerBlockEntity.kt | 4 ++-- .../shadowfacts/asmr/program/ExecutableBlock.kt | 9 ++++++--- .../shadowfacts/asmr/program/ExecutionFlow.kt | 11 +++++++++++ .../net/shadowfacts/asmr/program/Program.kt | 4 ++-- .../asmr/program/blocks/PrintBlock.kt | 5 +---- .../asmr/program/blocks/StartBlock.kt | 6 +++--- .../net/shadowfacts/asmr/ui/ProgramBlockView.kt | 4 ++-- .../shadowfacts/asmr/ui/ProgramCanvasView.kt | 2 +- .../textures/gui/programmer/execution_flow.png | Bin 889 -> 896 bytes .../shadowfacts/asmr/program/ProgramTests.kt | 2 +- 10 files changed, 29 insertions(+), 18 deletions(-) create mode 100644 src/main/kotlin/net/shadowfacts/asmr/program/ExecutionFlow.kt diff --git a/src/main/kotlin/net/shadowfacts/asmr/manager/ManagerBlockEntity.kt b/src/main/kotlin/net/shadowfacts/asmr/manager/ManagerBlockEntity.kt index eb0dfab..cb5902d 100644 --- a/src/main/kotlin/net/shadowfacts/asmr/manager/ManagerBlockEntity.kt +++ b/src/main/kotlin/net/shadowfacts/asmr/manager/ManagerBlockEntity.kt @@ -34,8 +34,8 @@ class ManagerBlockEntity: BlockEntity(ASMR.managerEntityType) { it.position = Point(240.0, 0.0) } - program.startBlock.nextExecutableBlock = divide - divide.nextExecutableBlock = print + program.startBlock.linkNext(divide) + divide.linkNext(print) } fun activate() { diff --git a/src/main/kotlin/net/shadowfacts/asmr/program/ExecutableBlock.kt b/src/main/kotlin/net/shadowfacts/asmr/program/ExecutableBlock.kt index c2a5298..c01213c 100644 --- a/src/main/kotlin/net/shadowfacts/asmr/program/ExecutableBlock.kt +++ b/src/main/kotlin/net/shadowfacts/asmr/program/ExecutableBlock.kt @@ -1,14 +1,17 @@ package net.shadowfacts.asmr.program -import net.shadowfacts.cacao.geometry.Point - /** * @author shadowfacts */ abstract class ExecutableBlock: ProgramBlock() { - var nextExecutableBlock: ExecutableBlock? = null + open val executionFlow = ExecutionFlow() abstract fun execute() + fun linkNext(next: ExecutableBlock) { + executionFlow.next = next + next.executionFlow.prev = this + } + } \ No newline at end of file diff --git a/src/main/kotlin/net/shadowfacts/asmr/program/ExecutionFlow.kt b/src/main/kotlin/net/shadowfacts/asmr/program/ExecutionFlow.kt new file mode 100644 index 0000000..932c2df --- /dev/null +++ b/src/main/kotlin/net/shadowfacts/asmr/program/ExecutionFlow.kt @@ -0,0 +1,11 @@ +package net.shadowfacts.asmr.program + +/** + * @author shadowfacts + */ +open class ExecutionFlow { + + open var next: ExecutableBlock? = null + open var prev: ExecutableBlock? = null + +} \ No newline at end of file diff --git a/src/main/kotlin/net/shadowfacts/asmr/program/Program.kt b/src/main/kotlin/net/shadowfacts/asmr/program/Program.kt index 93d3c9c..c5ac8ea 100644 --- a/src/main/kotlin/net/shadowfacts/asmr/program/Program.kt +++ b/src/main/kotlin/net/shadowfacts/asmr/program/Program.kt @@ -14,11 +14,11 @@ class Program { val blocks = mutableListOf() fun execute() { - var currentBlock: ExecutableBlock? = startBlock.nextExecutableBlock + var currentBlock: ExecutableBlock? = startBlock.executionFlow.next while (currentBlock != null) { currentBlock.execute() - currentBlock = currentBlock.nextExecutableBlock + currentBlock = currentBlock.executionFlow.next } } diff --git a/src/main/kotlin/net/shadowfacts/asmr/program/blocks/PrintBlock.kt b/src/main/kotlin/net/shadowfacts/asmr/program/blocks/PrintBlock.kt index 9acf0ef..e48d696 100644 --- a/src/main/kotlin/net/shadowfacts/asmr/program/blocks/PrintBlock.kt +++ b/src/main/kotlin/net/shadowfacts/asmr/program/blocks/PrintBlock.kt @@ -2,10 +2,7 @@ package net.shadowfacts.asmr.program.blocks import net.minecraft.util.Identifier import net.shadowfacts.asmr.ASMR -import net.shadowfacts.asmr.program.ExecutableBlock -import net.shadowfacts.asmr.program.ProgramBlockInput -import net.shadowfacts.asmr.program.ProgramBlockOutput -import net.shadowfacts.asmr.program.ProgramType +import net.shadowfacts.asmr.program.* import net.shadowfacts.cacao.geometry.Point /** diff --git a/src/main/kotlin/net/shadowfacts/asmr/program/blocks/StartBlock.kt b/src/main/kotlin/net/shadowfacts/asmr/program/blocks/StartBlock.kt index 7df2e60..8f60fe1 100644 --- a/src/main/kotlin/net/shadowfacts/asmr/program/blocks/StartBlock.kt +++ b/src/main/kotlin/net/shadowfacts/asmr/program/blocks/StartBlock.kt @@ -1,18 +1,18 @@ package net.shadowfacts.asmr.program.blocks import net.shadowfacts.asmr.program.ExecutableBlock -import net.shadowfacts.asmr.program.ProgramBlock import net.shadowfacts.asmr.program.ProgramBlockInput import net.shadowfacts.asmr.program.ProgramBlockOutput /** * @author shadowfacts */ -class StartBlock: ProgramBlock() { +class StartBlock: ExecutableBlock() { override val inputs: Array> = arrayOf() override val outputs: Array> = arrayOf() - var nextExecutableBlock: ExecutableBlock? = null + override fun execute() { + } } \ No newline at end of file diff --git a/src/main/kotlin/net/shadowfacts/asmr/ui/ProgramBlockView.kt b/src/main/kotlin/net/shadowfacts/asmr/ui/ProgramBlockView.kt index 3540c0b..d1fc21f 100644 --- a/src/main/kotlin/net/shadowfacts/asmr/ui/ProgramBlockView.kt +++ b/src/main/kotlin/net/shadowfacts/asmr/ui/ProgramBlockView.kt @@ -43,9 +43,9 @@ class ProgramBlockView(val block: ProgramBlock): StackView(Axis.VERTICAL, Distri val titleStack = addArrangedSubview(StackView(Axis.HORIZONTAL, Distribution.CENTER)) val title = titleStack.addArrangedSubview(Label(block.javaClass.simpleName)) if (block is ExecutableBlock) { - val incomingTexture = executionFlowInactiveTexture + val incomingTexture = if (block.executionFlow.prev == null) executionFlowInactiveTexture else executionFlowActiveTexture incomingExecution = titleStack.addArrangedSubview(TextureView(incomingTexture), index = 0) - val outgoingTexture = if (block.nextExecutableBlock == null) executionFlowInactiveTexture else executionFlowActiveTexture + val outgoingTexture = if (block.executionFlow.next == null) executionFlowInactiveTexture else executionFlowActiveTexture outgoingExeuction = titleStack.addArrangedSubview(TextureView(outgoingTexture)) } diff --git a/src/main/kotlin/net/shadowfacts/asmr/ui/ProgramCanvasView.kt b/src/main/kotlin/net/shadowfacts/asmr/ui/ProgramCanvasView.kt index f767bac..4547f68 100644 --- a/src/main/kotlin/net/shadowfacts/asmr/ui/ProgramCanvasView.kt +++ b/src/main/kotlin/net/shadowfacts/asmr/ui/ProgramCanvasView.kt @@ -31,7 +31,7 @@ class ProgramCanvasView(val program: Program): View() { for ((block, view) in blocks) { - (block as? ExecutableBlock)?.nextExecutableBlock?.let { next -> + (block as? ExecutableBlock)?.executionFlow?.next?.let { next -> blocks[next]?.let { nextView -> val outgoing = view.outgoingExeuction!! val incoming = nextView.incomingExecution!! diff --git a/src/main/resources/assets/asmr/textures/gui/programmer/execution_flow.png b/src/main/resources/assets/asmr/textures/gui/programmer/execution_flow.png index 49edb93b2693740c3d355eb9a0d41f341f27332a..61a9449bf9a02c8b4b5b94180c0104c988678277 100644 GIT binary patch delta 195 zcmV;!06hQs27m{!x&aA@0RI4pB`$x{lfwZbe-SMgiK!I;00DhTL_t(|+U?mf3d1lE z1i)2ZFTZ+I*a{+~NNY3WM(8@hE(ab-(l(bS8Dos>uKCXya9^)2+&yxPGw)j?oaY`n z@;w7?uI(A}t{S*fe%_~TXJ^xNc6QBxXB0qZXZ8Y^ovQ>s;a}e>0WSwO0N@E*z}f`9 x4HLd^0@4r9GWJa%{sNP60`Zf80tXlT?+vdbyef$H-g*E4002ovPDHLkV1lixQ7Qlc delta 184 zcmV;p07w6T2l)oDx&a9Q00000`9r&ZlfwZbe*p<$NMDrz00DMML_t(|+U?mf4#OY} z1<>!RcTTRrsof<+NfoJc()UIT3z7|(N|NqQlFp{8DhItyxQYSy^`6N;GU}M{Gts-d zM@FtuC$#Uue92YEEGy>rv m22PE?eb6tHaRT@kz;7QU(>f8sj)rys0000