player fixes

This commit is contained in:
Moritz Zwerger 2023-10-28 15:22:23 +02:00
parent a29155cb96
commit 6f10bce914
No known key found for this signature in database
GPG Key ID: 5CAD791931B09AC4
13 changed files with 119 additions and 112 deletions

View File

@ -18,9 +18,9 @@ import de.bixilon.kotlinglm.vec3.Vec3
import de.bixilon.kotlinglm.vec3.Vec3d import de.bixilon.kotlinglm.vec3.Vec3d
import de.bixilon.minosoft.data.entities.EntityRotation import de.bixilon.minosoft.data.entities.EntityRotation
import de.bixilon.minosoft.gui.rendering.entities.renderer.EntityRenderer import de.bixilon.minosoft.gui.rendering.entities.renderer.EntityRenderer
import de.bixilon.minosoft.gui.rendering.skeletal.SkeletalShader
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.instance.SkeletalInstance import de.bixilon.minosoft.gui.rendering.skeletal.instance.SkeletalInstance
import de.bixilon.minosoft.gui.rendering.skeletal.shader.BaseSkeletalShader
import de.bixilon.minosoft.gui.rendering.util.vec.vec3.Vec3dUtil.EMPTY import de.bixilon.minosoft.gui.rendering.util.vec.vec3.Vec3dUtil.EMPTY
open class SkeletalFeature( open class SkeletalFeature(
@ -28,7 +28,7 @@ open class SkeletalFeature(
val instance: SkeletalInstance, val instance: SkeletalInstance,
) : EntityRenderFeature(renderer) { ) : EntityRenderFeature(renderer) {
protected val manager = renderer.renderer.context.skeletal protected val manager = renderer.renderer.context.skeletal
protected open val shader: SkeletalShader = manager.shader protected open val shader: BaseSkeletalShader get() = manager.shader
protected var position = Vec3d.EMPTY protected var position = Vec3d.EMPTY
protected var yaw = 0.0f protected var yaw = 0.0f

View File

@ -128,6 +128,7 @@ class HitboxFeature(renderer: EntityRenderer<*>) : EntityRenderFeature(renderer)
override fun unload() { override fun unload() {
val mesh = this.mesh ?: return val mesh = this.mesh ?: return
this.mesh = null this.mesh = null
if (mesh.state != Mesh.MeshStates.LOADED) return
renderer.renderer.queue += { mesh.unload() } renderer.renderer.queue += { mesh.unload() }
} }
} }

View File

@ -16,12 +16,20 @@ package de.bixilon.minosoft.gui.rendering.entities.model.biped
import de.bixilon.minosoft.data.entities.entities.player.local.LocalPlayerEntity import de.bixilon.minosoft.data.entities.entities.player.local.LocalPlayerEntity
import de.bixilon.minosoft.gui.rendering.entities.renderer.EntityRenderer import de.bixilon.minosoft.gui.rendering.entities.renderer.EntityRenderer
import de.bixilon.minosoft.gui.rendering.skeletal.baked.BakedSkeletalModel import de.bixilon.minosoft.gui.rendering.skeletal.baked.BakedSkeletalModel
import de.bixilon.minosoft.gui.rendering.system.base.texture.dynamic.DynamicTextureState
import de.bixilon.minosoft.gui.rendering.system.base.texture.skin.PlayerSkin
open class PlayerModel(renderer: EntityRenderer<*>, model: BakedSkeletalModel) : BipedModel(renderer, model) { open class PlayerModel(
renderer: EntityRenderer<*>,
model: BakedSkeletalModel,
val skin: PlayerSkin,
) : BipedModel(renderer, model) {
override val shader get() = manager.playerShader
override fun draw() { override fun draw() {
manager.context.system.reset(faceCulling = renderer.entity is LocalPlayerEntity) // TODO: and !renderSelf manager.context.system.reset(faceCulling = renderer.entity is LocalPlayerEntity) // TODO: and !renderSelf
shader.use() shader.use()
shader.texture = if (skin.texture.state == DynamicTextureState.LOADED) skin.texture.shaderId else 0 // TODO: use default skins if not loaded yet
manager.upload(instance) manager.upload(instance)
instance.model.mesh.draw() instance.model.mesh.draw()
} }

View File

@ -17,6 +17,7 @@ import de.bixilon.kutil.observer.DataObserver.Companion.observe
import de.bixilon.minosoft.data.entities.entities.player.local.LocalPlayerEntity import de.bixilon.minosoft.data.entities.entities.player.local.LocalPlayerEntity
import de.bixilon.minosoft.gui.rendering.entities.EntitiesRenderer import de.bixilon.minosoft.gui.rendering.entities.EntitiesRenderer
import de.bixilon.minosoft.gui.rendering.entities.model.biped.PlayerModel import de.bixilon.minosoft.gui.rendering.entities.model.biped.PlayerModel
import de.bixilon.minosoft.gui.rendering.system.base.texture.skin.PlayerSkin
open class LocalPlayerRenderer(renderer: EntitiesRenderer, entity: LocalPlayerEntity) : PlayerRenderer<LocalPlayerEntity>(renderer, entity) { open class LocalPlayerRenderer(renderer: EntitiesRenderer, entity: LocalPlayerEntity) : PlayerRenderer<LocalPlayerEntity>(renderer, entity) {
@ -24,9 +25,9 @@ open class LocalPlayerRenderer(renderer: EntitiesRenderer, entity: LocalPlayerEn
renderer.context.camera.view::view.observe(this, instant = true) { hitbox.enabled = it.renderSelf; model?.enabled = it.renderSelf } renderer.context.camera.view::view.observe(this, instant = true) { hitbox.enabled = it.renderSelf; model?.enabled = it.renderSelf }
} }
override fun createModel(): PlayerModel? { override fun createModel(skin: PlayerSkin): PlayerModel? {
val model = super.createModel() val model = super.createModel(skin) ?: return null
model?.enabled = renderer.context.camera.view.view.renderSelf model.enabled = renderer.context.camera.view.view.renderSelf
return model return model
} }
} }

View File

@ -13,8 +13,8 @@
package de.bixilon.minosoft.gui.rendering.entities.renderer.player package de.bixilon.minosoft.gui.rendering.entities.renderer.player
import de.bixilon.kutil.observer.DataObserver.Companion.observe
import de.bixilon.minosoft.data.entities.entities.player.PlayerEntity import de.bixilon.minosoft.data.entities.entities.player.PlayerEntity
import de.bixilon.minosoft.data.entities.entities.player.properties.PlayerProperties
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
@ -26,54 +26,48 @@ 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.system.base.texture.skin.PlayerSkin import de.bixilon.minosoft.gui.rendering.system.base.texture.skin.PlayerSkin
import java.util.*
open class PlayerRenderer<E : PlayerEntity>(renderer: EntitiesRenderer, entity: E) : EntityRenderer<E>(renderer, entity) { open class PlayerRenderer<E : PlayerEntity>(renderer: EntitiesRenderer, entity: E) : EntityRenderer<E>(renderer, entity) {
protected var model = createModel()?.register() protected var model: PlayerModel? = null
private var properties: PlayerProperties? = null private var refreshSkin = true
init {
entity.additional::properties.observe(this) { refreshSkin = true }
}
override fun update(millis: Long) { override fun update(millis: Long) {
updateSkeletalModel() if (refreshSkin) updateModel()
super.update(millis) super.update(millis)
} }
private fun updateSkeletalModel() { private fun getSkin(): PlayerSkin? {
if (this.model != null) return return renderer.context.textures.skins.getSkin(entity, fetch = false, async = true)
val update = updateProperties() }
val model = createModel() ?: return private fun updateModel() {
this.model?.let { this.features -= it }
val model = createModel()
this.model = model
this.refreshSkin = false
if (model == null) return
this.features += model this.features += model
} }
protected open fun createModel(): PlayerModel? { private fun createModel(): PlayerModel? {
val model = getModel() ?: return null
return PlayerModel(this, model)
}
private fun updateProperties(): Boolean {
val properties = entity.additional.properties
if (this.properties == properties) return false
unload()
this.properties = properties
return true
}
open fun getSkin(): PlayerSkin? {
val skins = renderer.context.textures.skins
return skins.default[UUID.randomUUID()]
// val properties = this.properties?.textures?.skin
// if(properties == null){
// return renderer.context.textures.skins.getSkin(entity, properties, )
//}
}
private fun getModel(): BakedSkeletalModel? {
val skin = getSkin() ?: return null val skin = getSkin() ?: return null
return createModel(skin)
}
protected open fun createModel(skin: PlayerSkin): PlayerModel? {
val model = getModel(skin) ?: return null
return PlayerModel(this, model, skin)
}
private fun getModel(skin: PlayerSkin): BakedSkeletalModel? {
val name = when (skin.model) { val name = when (skin.model) {
SkinModel.WIDE -> WIDE SkinModel.WIDE -> WIDE
SkinModel.SLIM -> SLIM SkinModel.SLIM -> SLIM

View File

@ -1,6 +1,6 @@
/* /*
* Minosoft * Minosoft
* Copyright (C) 2020 Moritz Zwerger * 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 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.
* *
@ -11,20 +11,12 @@
* This software is not affiliated with Mojang AB, the original developer of Minecraft. * This software is not affiliated with Mojang AB, the original developer of Minecraft.
*/ */
#version 330 core package de.bixilon.minosoft.gui.rendering.entities.renderer.player
out vec4 foutColor; import de.bixilon.minosoft.gui.rendering.skeletal.shader.BaseSkeletalShader
import de.bixilon.minosoft.gui.rendering.system.base.buffer.uniform.FloatUniformBuffer
import de.bixilon.minosoft.gui.rendering.system.base.shader.NativeShader
in vec2 finUV; class PlayerShader(native: NativeShader, buffer: FloatUniformBuffer) : BaseSkeletalShader(native, buffer) {
flat in uint finTextureIndex; var texture by uniform("uIndexLayer", 0x00, NativeShader::setUInt)
in vec3 finTextureCoordinates;
#include "minosoft:texture"
#include "minosoft:alpha"
void main() {
vec4 texelColor = getTexture(finTextureIndex, finTextureCoordinates);
foutColor = texelColor;
// foutColor.a = 1.0f;
} }

View File

@ -16,7 +16,9 @@ package de.bixilon.minosoft.gui.rendering.skeletal
import de.bixilon.kotlinglm.mat4x4.Mat4 import de.bixilon.kotlinglm.mat4x4.Mat4
import de.bixilon.minosoft.data.registries.identified.Namespaces.minosoft import de.bixilon.minosoft.data.registries.identified.Namespaces.minosoft
import de.bixilon.minosoft.gui.rendering.RenderContext import de.bixilon.minosoft.gui.rendering.RenderContext
import de.bixilon.minosoft.gui.rendering.entities.renderer.player.PlayerShader
import de.bixilon.minosoft.gui.rendering.skeletal.instance.SkeletalInstance import de.bixilon.minosoft.gui.rendering.skeletal.instance.SkeletalInstance
import de.bixilon.minosoft.gui.rendering.skeletal.shader.SkeletalShader
import org.lwjgl.system.MemoryUtil.memAllocFloat import org.lwjgl.system.MemoryUtil.memAllocFloat
class SkeletalManager( class SkeletalManager(
@ -26,13 +28,15 @@ class SkeletalManager(
val shader = context.system.createShader(minosoft("skeletal")) { SkeletalShader(it, uniformBuffer) } val shader = context.system.createShader(minosoft("skeletal")) { SkeletalShader(it, uniformBuffer) }
private val temp = Mat4() private val temp = Mat4()
val playerShader = context.system.createShader(minosoft("entities/player")) { PlayerShader(it, uniformBuffer) } // TODO: move somewhere else
fun init() { fun init() {
uniformBuffer.init() uniformBuffer.init()
} }
fun postInit() { fun postInit() {
shader.native.defines["TRANSFORMS"] = MAX_TRANSFORMS
shader.load() shader.load()
playerShader.load()
shader.light = 0xFF shader.light = 0xFF
} }
@ -49,6 +53,6 @@ class SkeletalManager(
} }
companion object { companion object {
private const val MAX_TRANSFORMS = 128 const val MAX_TRANSFORMS = 128
} }
} }

View File

@ -11,28 +11,33 @@
* This software is not affiliated with Mojang AB, the original developer of Minecraft. * This software is not affiliated with Mojang AB, the original developer of Minecraft.
*/ */
package de.bixilon.minosoft.gui.rendering.skeletal package de.bixilon.minosoft.gui.rendering.skeletal.shader
import de.bixilon.kotlinglm.mat4x4.Mat4 import de.bixilon.kotlinglm.mat4x4.Mat4
import de.bixilon.kotlinglm.vec3.Vec3 import de.bixilon.kotlinglm.vec3.Vec3
import de.bixilon.minosoft.gui.rendering.camera.FogManager import de.bixilon.minosoft.gui.rendering.camera.FogManager
import de.bixilon.minosoft.gui.rendering.light.LightmapBuffer
import de.bixilon.minosoft.gui.rendering.shader.Shader import de.bixilon.minosoft.gui.rendering.shader.Shader
import de.bixilon.minosoft.gui.rendering.shader.types.* import de.bixilon.minosoft.gui.rendering.shader.types.FogShader
import de.bixilon.minosoft.gui.rendering.shader.types.TextureShader
import de.bixilon.minosoft.gui.rendering.shader.types.ViewProjectionShader
import de.bixilon.minosoft.gui.rendering.skeletal.SkeletalManager
import de.bixilon.minosoft.gui.rendering.system.base.buffer.uniform.FloatUniformBuffer import de.bixilon.minosoft.gui.rendering.system.base.buffer.uniform.FloatUniformBuffer
import de.bixilon.minosoft.gui.rendering.system.base.shader.NativeShader import de.bixilon.minosoft.gui.rendering.system.base.shader.NativeShader
import de.bixilon.minosoft.gui.rendering.system.base.texture.TextureManager import de.bixilon.minosoft.gui.rendering.system.base.texture.TextureManager
open class SkeletalShader( abstract class BaseSkeletalShader(
override val native: NativeShader, override val native: NativeShader,
buffer: FloatUniformBuffer, buffer: FloatUniformBuffer,
) : Shader(), TextureShader, AnimatedShader, LightShader, ViewProjectionShader, FogShader { ) : Shader(), TextureShader, ViewProjectionShader, FogShader {
override var textures: TextureManager by textureManager() override var textures: TextureManager by textureManager()
override val lightmap: LightmapBuffer by lightmap()
override var viewProjectionMatrix: Mat4 by viewProjectionMatrix() override var viewProjectionMatrix: Mat4 by viewProjectionMatrix()
override var cameraPosition: Vec3 by cameraPosition() override var cameraPosition: Vec3 by cameraPosition()
override var fog: FogManager by fog() override var fog: FogManager by fog()
var light by uniform("uLight", 0x00, NativeShader::setUInt)
var skeletalBuffer by uniform("uSkeletalBuffer", buffer) var skeletalBuffer by uniform("uSkeletalBuffer", buffer)
init {
native.defines["TRANSFORMS"] = SkeletalManager.MAX_TRANSFORMS
}
} }

View File

@ -0,0 +1,25 @@
/*
* 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.shader
import de.bixilon.minosoft.gui.rendering.light.LightmapBuffer
import de.bixilon.minosoft.gui.rendering.shader.types.AnimatedShader
import de.bixilon.minosoft.gui.rendering.shader.types.LightShader
import de.bixilon.minosoft.gui.rendering.system.base.buffer.uniform.FloatUniformBuffer
import de.bixilon.minosoft.gui.rendering.system.base.shader.NativeShader
class SkeletalShader(native: NativeShader, buffer: FloatUniformBuffer) : BaseSkeletalShader(native, buffer), AnimatedShader, LightShader {
var light by uniform("uLight", 0xFF, NativeShader::setUInt)
override val lightmap: LightmapBuffer by lightmap() // TODO: remove (interpolate on cpu)
}

View File

@ -22,16 +22,18 @@ out vec4 foutColor;
#include "minosoft:alpha" #include "minosoft:alpha"
#include "minosoft:fog" #include "minosoft:fog"
flat in bool finSkinLayer; in vec4 finTintColor;
uniform uint uTextureIndex; // flat in bool finSkinLayer;
uniform vec3 uTextureCoordinates;
flat in uint finTextureIndex;
in vec3 finTextureCoordinates;
void main() { void main() {
foutColor = getTexture(uTextureIndex, uTextureCoordinates); foutColor = getTexture(finTextureIndex, finTextureCoordinates);
if (finSkinLayer) { // if (finSkinLayer) {
if (foutColor.a < 0.5) discard; // if (foutColor.a < 0.5) discard;
} // }
foutColor.a = 1.0f; foutColor.a = 1.0f;
set_fog(); set_fog();
} }

View File

@ -1,6 +1,6 @@
/* /*
* Minosoft * Minosoft
* Copyright (C) 2020 Moritz Zwerger * Copyright (C) 2020-2022 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 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.
* *
@ -15,17 +15,26 @@
layout (location = 0) in vec3 vinPosition; layout (location = 0) in vec3 vinPosition;
layout (location = 1) in vec2 vinUV; layout (location = 1) in vec2 vinUV;
layout (location = 2) in float vinPartTransformNormal; // part(0x380000) transform (0x7F000), normal (0xFFF)
out vec3 finFragmentPosition;
uniform uint uIndexLayer;
// flat out bool finSkinLayer;
flat out uint finTextureIndex; flat out uint finTextureIndex;
out vec3 finTextureCoordinates; out vec3 finTextureCoordinates;
uniform uint uIndexLayer; out vec4 finTintColor;
uniform mat4 uTransform;
#include "minosoft:skeletal/vertex"
void main() { void main() {
gl_Position = uTransform * vec4(vinPosition, 1.0f); uint partTransformNormal = floatBitsToUint(vinPartTransformNormal);
gl_Position.w = 1.0f; run_skeletal(partTransformNormal, vinPosition);
// finSkinLayer = (partTransformNormal >> 13u & 0x07u) > 0u;
finTextureIndex = uIndexLayer >> 28u; finTextureIndex = uIndexLayer >> 28u;
finTextureCoordinates = vec3(vinUV, ((uIndexLayer >> 12) & 0xFFFFu)); finTextureCoordinates = vec3(vinUV, ((uIndexLayer >> 12) & 0xFFFFu));

View File

@ -1,34 +0,0 @@
/*
* Minosoft
* Copyright (C) 2020-2022 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.
*/
#version 330 core
layout (location = 0) in vec3 vinPosition;
layout (location = 1) in vec2 vinUV;
layout (location = 2) in float vinTransformNormal; // transform (0x7F000), normal (0xFFF)
#include "minosoft:animation/header_vertex"
#include "minosoft:skeletal/vertex"
#include "minosoft:animation/buffer"
#include "minosoft:animation/main_vertex"
flat out bool finSkinLayer;
void main() {
run_skeletal(floatBitsToUint(vinTransformNormal), vinPosition);
run_animation();
finSkinLayer = false;
}

View File

@ -37,7 +37,7 @@ float calulate_fog_alpha(float distance2) {
} }
float calculate_fog() { float calculate_fog() {
if (uFogStart > 100000.0f) { if (uFogStart > 10000.0f) {
return 1.0f; return 1.0f;
}; };
#ifdef FOG_SPHERE #ifdef FOG_SPHERE