From 013c3998c6e6c1e4421e10b853a4bc6de05d03cc Mon Sep 17 00:00:00 2001 From: Moritz Zwerger Date: Sun, 29 Oct 2023 16:27:27 +0100 Subject: [PATCH] SkeletalMeshBuilder --- .../renderer/player/PlayerRenderer.kt | 10 +++++---- .../rendering/models/loader/SkeletalLoader.kt | 11 +++++----- .../rendering/skeletal/mesh/SkeletalMesh.kt | 4 ++++ .../skeletal/mesh/SkeletalMeshBuilder.kt | 21 +++++++++++++++++++ .../shader/includes/skeletal/shade.glsl | 4 ++-- 5 files changed, 38 insertions(+), 12 deletions(-) create mode 100644 src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/mesh/SkeletalMeshBuilder.kt diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/entities/renderer/player/PlayerRenderer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/entities/renderer/player/PlayerRenderer.kt index f8a5631bf..bd5f5b0db 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/entities/renderer/player/PlayerRenderer.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/entities/renderer/player/PlayerRenderer.kt @@ -18,6 +18,7 @@ import de.bixilon.minosoft.data.entities.entities.player.PlayerEntity import de.bixilon.minosoft.data.entities.entities.player.properties.textures.metadata.SkinModel import de.bixilon.minosoft.data.registries.identified.Identified import de.bixilon.minosoft.data.registries.identified.Namespaces.minecraft +import de.bixilon.minosoft.gui.rendering.RenderContext import de.bixilon.minosoft.gui.rendering.entities.EntitiesRenderer import de.bixilon.minosoft.gui.rendering.entities.factory.RegisteredEntityModelFactory import de.bixilon.minosoft.gui.rendering.entities.model.biped.PlayerModel @@ -25,6 +26,7 @@ import de.bixilon.minosoft.gui.rendering.entities.renderer.EntityRenderer import de.bixilon.minosoft.gui.rendering.models.loader.ModelLoader import de.bixilon.minosoft.gui.rendering.models.loader.SkeletalLoader.Companion.sModel import de.bixilon.minosoft.gui.rendering.skeletal.baked.BakedSkeletalModel +import de.bixilon.minosoft.gui.rendering.skeletal.mesh.SkeletalMeshBuilder import de.bixilon.minosoft.gui.rendering.system.base.texture.dynamic.DynamicTexture import de.bixilon.minosoft.gui.rendering.system.base.texture.dynamic.DynamicTextureListener import de.bixilon.minosoft.gui.rendering.system.base.texture.dynamic.DynamicTextureState @@ -96,7 +98,7 @@ open class PlayerRenderer(renderer: EntitiesRenderer, entity: } - companion object : RegisteredEntityModelFactory, Identified { + companion object : RegisteredEntityModelFactory, Identified, SkeletalMeshBuilder { override val identifier get() = PlayerEntity.identifier private val WIDE = minecraft("entities/player/wide").sModel() private val SLIM = minecraft("entities/player/slim").sModel() @@ -104,12 +106,12 @@ open class PlayerRenderer(renderer: EntitiesRenderer, entity: private val SKIN = minecraft("skin") override fun create(renderer: EntitiesRenderer, entity: PlayerEntity) = PlayerRenderer(renderer, entity) + override fun buildMesh(context: RenderContext) = PlayerModelMesh(context) override fun register(loader: ModelLoader) { val override = mapOf(SKIN to loader.context.textures.debugTexture) // disable textures, they all dynamic - loader.skeletal.register(WIDE, override = override, mesh = { PlayerModelMesh(it) }) - loader.skeletal.register(SLIM, override = override, mesh = { PlayerModelMesh(it) }) - // TODO: load with custom mesh, load custom shader + loader.skeletal.register(WIDE, override = override, mesh = this) + loader.skeletal.register(SLIM, override = override, mesh = this) } } } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/models/loader/SkeletalLoader.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/models/loader/SkeletalLoader.kt index 55fb24623..a347f4df3 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/models/loader/SkeletalLoader.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/models/loader/SkeletalLoader.kt @@ -20,10 +20,9 @@ import de.bixilon.kutil.reflection.ReflectionUtil.forceSet import de.bixilon.minosoft.assets.util.InputStreamUtil.readJson import de.bixilon.minosoft.data.registries.identified.ResourceLocation import de.bixilon.minosoft.data.registries.identified.ResourceLocationUtil.extend -import de.bixilon.minosoft.gui.rendering.RenderContext import de.bixilon.minosoft.gui.rendering.skeletal.baked.BakedSkeletalModel -import de.bixilon.minosoft.gui.rendering.skeletal.mesh.AbstractSkeletalMesh import de.bixilon.minosoft.gui.rendering.skeletal.mesh.SkeletalMesh +import de.bixilon.minosoft.gui.rendering.skeletal.mesh.SkeletalMeshBuilder import de.bixilon.minosoft.gui.rendering.skeletal.model.SkeletalModel import de.bixilon.minosoft.gui.rendering.system.base.texture.shader.ShaderTexture import de.bixilon.minosoft.util.logging.Log @@ -55,7 +54,7 @@ class SkeletalLoader(private val loader: ModelLoader) { fun bake(latch: AbstractLatch?) { for ((name, registered) in this.registered) { - val baked = registered.model?.bake(loader.context, registered.override, registered.mesh.invoke(loader.context)) ?: continue + val baked = registered.model?.bake(loader.context, registered.override, registered.mesh.buildMesh(loader.context)) ?: continue this.baked[name] = baked } } @@ -74,16 +73,16 @@ class SkeletalLoader(private val loader: ModelLoader) { return this.baked[name] } - fun register(name: ResourceLocation, template: ResourceLocation = name, override: Map = emptyMap(), mesh: (RenderContext) -> AbstractSkeletalMesh = { SkeletalMesh(it) }) { - val previous = this.registered.put(name, RegisteredModel(template, override, mesh = mesh)) + fun register(name: ResourceLocation, template: ResourceLocation = name, override: Map = emptyMap(), mesh: SkeletalMeshBuilder = SkeletalMesh) { + val previous = this.registered.put(name, RegisteredModel(template, override, mesh)) if (previous != null) throw IllegalArgumentException("A model with the name $name was already registered!") } private data class RegisteredModel( val template: ResourceLocation, val override: Map, + var mesh: SkeletalMeshBuilder, var model: SkeletalModel? = null, - var mesh: (RenderContext) -> AbstractSkeletalMesh, ) companion object { diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/mesh/SkeletalMesh.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/mesh/SkeletalMesh.kt index 01d412f89..e34ced957 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/mesh/SkeletalMesh.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/mesh/SkeletalMesh.kt @@ -50,4 +50,8 @@ class SkeletalMesh(context: RenderContext, initialCacheSize: Int = 1000) : Abstr ) { companion object : MeshStruct(SkeletalMeshStruct::class) } + + companion object : SkeletalMeshBuilder { + override fun buildMesh(context: RenderContext) = SkeletalMesh(context) + } } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/mesh/SkeletalMeshBuilder.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/mesh/SkeletalMeshBuilder.kt new file mode 100644 index 000000000..a2e5e0069 --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/mesh/SkeletalMeshBuilder.kt @@ -0,0 +1,21 @@ +/* + * Minosoft + * Copyright (C) 2020-2023 Moritz Zwerger + * + * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this program. If not, see . + * + * This software is not affiliated with Mojang AB, the original developer of Minecraft. + */ + +package de.bixilon.minosoft.gui.rendering.skeletal.mesh + +import de.bixilon.minosoft.gui.rendering.RenderContext + +fun interface SkeletalMeshBuilder { + + fun buildMesh(context: RenderContext): AbstractSkeletalMesh +} diff --git a/src/main/resources/assets/minosoft/rendering/shader/includes/skeletal/shade.glsl b/src/main/resources/assets/minosoft/rendering/shader/includes/skeletal/shade.glsl index e50413bdc..9cd95fea6 100644 --- a/src/main/resources/assets/minosoft/rendering/shader/includes/skeletal/shade.glsl +++ b/src/main/resources/assets/minosoft/rendering/shader/includes/skeletal/shade.glsl @@ -12,7 +12,7 @@ */ #define DEGREE_90 1.5707964f -float decodeNormalPart(uint data) { +float decodeNormalY(uint data) { if (data <= 8u) return (data / 8.0f) - 1.0f; return (data - 8u) / 7.0f; } @@ -21,7 +21,7 @@ vec3 decodeNormal(uint normal) { uint x = normal & 0x0Fu; uint y = normal >> 8u & 0x0Fu; uint z = normal >> 4u & 0x0Fu; - return vec3(x / 15.0f, decodeNormalPart(y), z / 15.0f); + return vec3(x / 15.0f, decodeNormalY(y), z / 15.0f); } vec3 transformNormal(vec3 normal, mat4 transform) {