From 819d188e2ab7f73d864383ed6015c893ec37d427 Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Fri, 30 Dec 2022 12:36:07 +0700 Subject: [PATCH] =?UTF-8?q?=D0=95=D1=89=D1=91=20=D0=B1=D0=BE=D0=BB=D1=8C?= =?UTF-8?q?=D1=88=D0=B5=20=D0=BF=D1=80=D0=B8=D0=B1=D0=B8=D1=80=D0=B0=D0=B5?= =?UTF-8?q?=D0=BC=D1=81=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kstarbound/client/ClientChunk.kt | 2 +- .../client/render/entity/EntityRenderer.kt | 34 ++++++++++++------- .../client/render/entity/ItemRenderer.kt | 1 - .../render/entity/ProjectileRenderer.kt | 1 - 4 files changed, 23 insertions(+), 15 deletions(-) diff --git a/src/main/kotlin/ru/dbotthepony/kstarbound/client/ClientChunk.kt b/src/main/kotlin/ru/dbotthepony/kstarbound/client/ClientChunk.kt index e902ce79..a9459ba1 100644 --- a/src/main/kotlin/ru/dbotthepony/kstarbound/client/ClientChunk.kt +++ b/src/main/kotlin/ru/dbotthepony/kstarbound/client/ClientChunk.kt @@ -10,7 +10,7 @@ import ru.dbotthepony.kstarbound.client.gl.vertex.StatefulVertexBuilder import ru.dbotthepony.kstarbound.client.gl.vertex.quad import ru.dbotthepony.kstarbound.client.gl.vertex.shadowLine import ru.dbotthepony.kstarbound.client.render.ConfiguredStaticMesh -import ru.dbotthepony.kstarbound.client.render.EntityRenderer +import ru.dbotthepony.kstarbound.client.render.entity.EntityRenderer import ru.dbotthepony.kstarbound.client.render.ILayeredRenderer import ru.dbotthepony.kstarbound.client.render.GPULightRenderer import ru.dbotthepony.kstarbound.client.render.TileLayerList diff --git a/src/main/kotlin/ru/dbotthepony/kstarbound/client/render/entity/EntityRenderer.kt b/src/main/kotlin/ru/dbotthepony/kstarbound/client/render/entity/EntityRenderer.kt index 29dd7156..e5fc68a7 100644 --- a/src/main/kotlin/ru/dbotthepony/kstarbound/client/render/entity/EntityRenderer.kt +++ b/src/main/kotlin/ru/dbotthepony/kstarbound/client/render/entity/EntityRenderer.kt @@ -1,5 +1,6 @@ package ru.dbotthepony.kstarbound.client.render.entity +import it.unimi.dsi.fastutil.objects.Reference2ObjectOpenHashMap import ru.dbotthepony.kstarbound.client.ClientChunk import ru.dbotthepony.kstarbound.client.gl.GLStateTracker import ru.dbotthepony.kstarbound.client.render.entity.ItemRenderer @@ -11,12 +12,6 @@ import ru.dbotthepony.kvector.matrix.Matrix4fStack import ru.dbotthepony.kvector.vector.ndouble.Vector2d import java.io.Closeable -/** - * Pseudo Z position for entities, for them to appear behind tile geometry, - * but in front of background walls geometry - */ -const val Z_LEVEL_ENTITIES = 30000 - /** * Базовый класс, отвечающий за отрисовку определённого ентити в мире * @@ -35,19 +30,34 @@ open class EntityRenderer(val state: GLStateTracker, val entity: Entity, open va } } - open val layer: Int = Z_LEVEL_ENTITIES + open val layer: Int get() = Z_LEVEL_ENTITIES override fun close() { } companion object { + /** + * Pseudo Z position for entities, for them to appear behind tile geometry, + * but in front of background walls geometry + */ + const val Z_LEVEL_ENTITIES = 30000 + + private val renderers = Reference2ObjectOpenHashMap, (state: GLStateTracker, entity: Entity, chunk: ClientChunk?) -> EntityRenderer>() + + @Suppress("unchecked_cast") + fun registerRenderer(clazz: Class, renderer: (state: GLStateTracker, entity: T, chunk: ClientChunk?) -> EntityRenderer) { + check(renderers.put(clazz, renderer as (state: GLStateTracker, entity: Entity, chunk: ClientChunk?) -> EntityRenderer) == null) { "Already has renderer for ${clazz.canonicalName}!" } + } + fun getRender(state: GLStateTracker, entity: Entity, chunk: ClientChunk? = null): EntityRenderer { - return when (entity) { - is Projectile -> ProjectileRenderer(state, entity, chunk) - is ItemEntity -> ItemRenderer(state, entity, chunk) - else -> EntityRenderer(state, entity, chunk) - } + val factory = renderers[entity::class.java] ?: return EntityRenderer(state, entity, chunk) + return factory.invoke(state, entity, chunk) + } + + init { + registerRenderer(Projectile::class.java, ::ProjectileRenderer) + registerRenderer(ItemEntity::class.java, ::ItemRenderer) } } } diff --git a/src/main/kotlin/ru/dbotthepony/kstarbound/client/render/entity/ItemRenderer.kt b/src/main/kotlin/ru/dbotthepony/kstarbound/client/render/entity/ItemRenderer.kt index 84c84e19..0a909f03 100644 --- a/src/main/kotlin/ru/dbotthepony/kstarbound/client/render/entity/ItemRenderer.kt +++ b/src/main/kotlin/ru/dbotthepony/kstarbound/client/render/entity/ItemRenderer.kt @@ -6,7 +6,6 @@ import ru.dbotthepony.kstarbound.client.ClientChunk import ru.dbotthepony.kstarbound.client.gl.GLStateTracker import ru.dbotthepony.kstarbound.client.gl.vertex.QuadTransformers import ru.dbotthepony.kstarbound.client.gl.vertex.quadRotatedZ -import ru.dbotthepony.kstarbound.client.render.EntityRenderer import ru.dbotthepony.kstarbound.world.entities.ItemEntity import ru.dbotthepony.kvector.matrix.Matrix4fStack diff --git a/src/main/kotlin/ru/dbotthepony/kstarbound/client/render/entity/ProjectileRenderer.kt b/src/main/kotlin/ru/dbotthepony/kstarbound/client/render/entity/ProjectileRenderer.kt index cad3ac06..6276f13a 100644 --- a/src/main/kotlin/ru/dbotthepony/kstarbound/client/render/entity/ProjectileRenderer.kt +++ b/src/main/kotlin/ru/dbotthepony/kstarbound/client/render/entity/ProjectileRenderer.kt @@ -5,7 +5,6 @@ import ru.dbotthepony.kstarbound.client.ClientChunk import ru.dbotthepony.kstarbound.client.gl.GLStateTracker import ru.dbotthepony.kstarbound.client.gl.vertex.QuadTransformers import ru.dbotthepony.kstarbound.client.gl.vertex.quadRotatedZ -import ru.dbotthepony.kstarbound.client.render.EntityRenderer import ru.dbotthepony.kstarbound.client.render.FrameSetAnimator import ru.dbotthepony.kstarbound.world.entities.projectile.Projectile import ru.dbotthepony.kvector.matrix.Matrix4fStack