mirror of
https://gitlab.bixilon.de/bixilon/minosoft.git
synced 2025-09-13 09:26:11 -04:00
SkeletalMeshBuilder
This commit is contained in:
parent
219a8085f8
commit
013c3998c6
@ -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.entities.entities.player.properties.textures.metadata.SkinModel
|
||||||
import de.bixilon.minosoft.data.registries.identified.Identified
|
import de.bixilon.minosoft.data.registries.identified.Identified
|
||||||
import de.bixilon.minosoft.data.registries.identified.Namespaces.minecraft
|
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.EntitiesRenderer
|
||||||
import de.bixilon.minosoft.gui.rendering.entities.factory.RegisteredEntityModelFactory
|
import de.bixilon.minosoft.gui.rendering.entities.factory.RegisteredEntityModelFactory
|
||||||
import de.bixilon.minosoft.gui.rendering.entities.model.biped.PlayerModel
|
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.ModelLoader
|
||||||
import de.bixilon.minosoft.gui.rendering.models.loader.SkeletalLoader.Companion.sModel
|
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.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.DynamicTexture
|
||||||
import de.bixilon.minosoft.gui.rendering.system.base.texture.dynamic.DynamicTextureListener
|
import de.bixilon.minosoft.gui.rendering.system.base.texture.dynamic.DynamicTextureListener
|
||||||
import de.bixilon.minosoft.gui.rendering.system.base.texture.dynamic.DynamicTextureState
|
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
|
override val identifier get() = PlayerEntity.identifier
|
||||||
private val WIDE = minecraft("entities/player/wide").sModel()
|
private val WIDE = minecraft("entities/player/wide").sModel()
|
||||||
private val SLIM = minecraft("entities/player/slim").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")
|
private val SKIN = minecraft("skin")
|
||||||
|
|
||||||
override fun create(renderer: EntitiesRenderer, entity: PlayerEntity) = PlayerRenderer(renderer, entity)
|
override fun create(renderer: EntitiesRenderer, entity: PlayerEntity) = PlayerRenderer(renderer, entity)
|
||||||
|
override fun buildMesh(context: RenderContext) = PlayerModelMesh(context)
|
||||||
|
|
||||||
override fun register(loader: ModelLoader) {
|
override fun register(loader: ModelLoader) {
|
||||||
val override = mapOf(SKIN to loader.context.textures.debugTexture) // disable textures, they all dynamic
|
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(WIDE, override = override, mesh = this)
|
||||||
loader.skeletal.register(SLIM, override = override, mesh = { PlayerModelMesh(it) })
|
loader.skeletal.register(SLIM, override = override, mesh = this)
|
||||||
// TODO: load with custom mesh, load custom shader
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -20,10 +20,9 @@ import de.bixilon.kutil.reflection.ReflectionUtil.forceSet
|
|||||||
import de.bixilon.minosoft.assets.util.InputStreamUtil.readJson
|
import de.bixilon.minosoft.assets.util.InputStreamUtil.readJson
|
||||||
import de.bixilon.minosoft.data.registries.identified.ResourceLocation
|
import de.bixilon.minosoft.data.registries.identified.ResourceLocation
|
||||||
import de.bixilon.minosoft.data.registries.identified.ResourceLocationUtil.extend
|
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.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.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.skeletal.model.SkeletalModel
|
||||||
import de.bixilon.minosoft.gui.rendering.system.base.texture.shader.ShaderTexture
|
import de.bixilon.minosoft.gui.rendering.system.base.texture.shader.ShaderTexture
|
||||||
import de.bixilon.minosoft.util.logging.Log
|
import de.bixilon.minosoft.util.logging.Log
|
||||||
@ -55,7 +54,7 @@ class SkeletalLoader(private val loader: ModelLoader) {
|
|||||||
|
|
||||||
fun bake(latch: AbstractLatch?) {
|
fun bake(latch: AbstractLatch?) {
|
||||||
for ((name, registered) in this.registered) {
|
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
|
this.baked[name] = baked
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -74,16 +73,16 @@ class SkeletalLoader(private val loader: ModelLoader) {
|
|||||||
return this.baked[name]
|
return this.baked[name]
|
||||||
}
|
}
|
||||||
|
|
||||||
fun register(name: ResourceLocation, template: ResourceLocation = name, override: Map<ResourceLocation, ShaderTexture> = emptyMap(), mesh: (RenderContext) -> AbstractSkeletalMesh = { SkeletalMesh(it) }) {
|
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 = mesh))
|
val previous = this.registered.put(name, RegisteredModel(template, override, mesh))
|
||||||
if (previous != null) throw IllegalArgumentException("A model with the name $name was already registered!")
|
if (previous != null) throw IllegalArgumentException("A model with the name $name was already registered!")
|
||||||
}
|
}
|
||||||
|
|
||||||
private data class RegisteredModel(
|
private data class RegisteredModel(
|
||||||
val template: ResourceLocation,
|
val template: ResourceLocation,
|
||||||
val override: Map<ResourceLocation, ShaderTexture>,
|
val override: Map<ResourceLocation, ShaderTexture>,
|
||||||
|
var mesh: SkeletalMeshBuilder,
|
||||||
var model: SkeletalModel? = null,
|
var model: SkeletalModel? = null,
|
||||||
var mesh: (RenderContext) -> AbstractSkeletalMesh,
|
|
||||||
)
|
)
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
|
@ -50,4 +50,8 @@ class SkeletalMesh(context: RenderContext, initialCacheSize: Int = 1000) : Abstr
|
|||||||
) {
|
) {
|
||||||
companion object : MeshStruct(SkeletalMeshStruct::class)
|
companion object : MeshStruct(SkeletalMeshStruct::class)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
companion object : SkeletalMeshBuilder {
|
||||||
|
override fun buildMesh(context: RenderContext) = SkeletalMesh(context)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
}
|
@ -12,7 +12,7 @@
|
|||||||
*/
|
*/
|
||||||
#define DEGREE_90 1.5707964f
|
#define DEGREE_90 1.5707964f
|
||||||
|
|
||||||
float decodeNormalPart(uint data) {
|
float decodeNormalY(uint data) {
|
||||||
if (data <= 8u) return (data / 8.0f) - 1.0f;
|
if (data <= 8u) return (data / 8.0f) - 1.0f;
|
||||||
return (data - 8u) / 7.0f;
|
return (data - 8u) / 7.0f;
|
||||||
}
|
}
|
||||||
@ -21,7 +21,7 @@ vec3 decodeNormal(uint normal) {
|
|||||||
uint x = normal & 0x0Fu;
|
uint x = normal & 0x0Fu;
|
||||||
uint y = normal >> 8u & 0x0Fu;
|
uint y = normal >> 8u & 0x0Fu;
|
||||||
uint z = normal >> 4u & 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) {
|
vec3 transformNormal(vec3 normal, mat4 transform) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user