From 7a69dee5ca03c8f67bbdf9a1d9f42ad1ca94ec35 Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Mon, 4 Sep 2023 09:43:36 +0700 Subject: [PATCH] faaster --- .../kstarbound/defs/tile/RenderTemplate.kt | 36 ++++++++++++++++--- 1 file changed, 31 insertions(+), 5 deletions(-) diff --git a/src/main/kotlin/ru/dbotthepony/kstarbound/defs/tile/RenderTemplate.kt b/src/main/kotlin/ru/dbotthepony/kstarbound/defs/tile/RenderTemplate.kt index 7fbbffcc..4b3c680d 100644 --- a/src/main/kotlin/ru/dbotthepony/kstarbound/defs/tile/RenderTemplate.kt +++ b/src/main/kotlin/ru/dbotthepony/kstarbound/defs/tile/RenderTemplate.kt @@ -38,21 +38,47 @@ data class RenderRuleList( val matchHue: Boolean = false, val inverse: Boolean = false, ) { - private fun doTest(getter: ITileAccess, equalityTester: EqualityRuleTester, thisPos: Vector2i, offsetPos: Vector2i): Boolean { - return when (type) { - "EqualsSelf" -> equalityTester.test(getter.getTile(thisPos), getter.getTile(thisPos + offsetPos)) - "Connects" -> getter.getTile(thisPos + offsetPos).material != null + private fun interface ActualTester { + fun doTest(getter: ITileAccess, equalityTester: EqualityRuleTester, thisPos: Vector2i, offsetPos: Vector2i): Boolean + } + + private object EqualsSelf : ActualTester { + override fun doTest(getter: ITileAccess, equalityTester: EqualityRuleTester, thisPos: Vector2i, offsetPos: Vector2i): Boolean { + return equalityTester.test(getter.getTile(thisPos), getter.getTile(thisPos + offsetPos)) + } + } + + private object Conntects : ActualTester { + override fun doTest(getter: ITileAccess, equalityTester: EqualityRuleTester, thisPos: Vector2i, offsetPos: Vector2i): Boolean { + return getter.getTile(thisPos + offsetPos).material != null + } + } + + private object Never : ActualTester { + override fun doTest(getter: ITileAccess, equalityTester: EqualityRuleTester, thisPos: Vector2i, offsetPos: Vector2i): Boolean { + return false + } + } + + private val actualTester by lazy { + when (type) { + "EqualsSelf" -> EqualsSelf + "Connects" -> Conntects else -> { if (LOGGED.add(type)) { LOGGER.error("Unknown render rule test $type!") } - false + Never } } } + private fun doTest(getter: ITileAccess, equalityTester: EqualityRuleTester, thisPos: Vector2i, offsetPos: Vector2i): Boolean { + return actualTester.doTest(getter, equalityTester, thisPos, offsetPos) + } + fun test(getter: ITileAccess, equalityTester: EqualityRuleTester, thisPos: Vector2i, offsetPos: Vector2i): Boolean { if (inverse) { return !doTest(getter, equalityTester, thisPos, offsetPos)