SkeletalMeshBuilder

This commit is contained in:
Moritz Zwerger 2023-10-29 16:27:27 +01:00
parent 219a8085f8
commit 013c3998c6
No known key found for this signature in database
GPG Key ID: 5CAD791931B09AC4
5 changed files with 38 additions and 12 deletions

View File

@ -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<E : PlayerEntity>(renderer: EntitiesRenderer, entity:
}
companion object : RegisteredEntityModelFactory<PlayerEntity>, Identified {
companion object : RegisteredEntityModelFactory<PlayerEntity>, 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<E : PlayerEntity>(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)
}
}
}

View File

@ -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<ResourceLocation, ShaderTexture> = 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<ResourceLocation, ShaderTexture> = 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<ResourceLocation, ShaderTexture>,
var mesh: SkeletalMeshBuilder,
var model: SkeletalModel? = null,
var mesh: (RenderContext) -> AbstractSkeletalMesh,
)
companion object {

View File

@ -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)
}
}

View File

@ -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 <https://www.gnu.org/licenses/>.
*
* 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
}

View File

@ -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) {