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.minosoft.data.entities.EntityRotation
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.instance.SkeletalInstance
import de.bixilon.minosoft.gui.rendering.skeletal.shader.BaseSkeletalShader
import de.bixilon.minosoft.gui.rendering.util.vec.vec3.Vec3dUtil.EMPTY
open class SkeletalFeature(
@ -28,7 +28,7 @@ open class SkeletalFeature(
val instance: SkeletalInstance,
) : EntityRenderFeature(renderer) {
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 yaw = 0.0f

View File

@ -128,6 +128,7 @@ class HitboxFeature(renderer: EntityRenderer<*>) : EntityRenderFeature(renderer)
override fun unload() {
val mesh = this.mesh ?: return
this.mesh = null
if (mesh.state != Mesh.MeshStates.LOADED) return
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.gui.rendering.entities.renderer.EntityRenderer
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() {
manager.context.system.reset(faceCulling = renderer.entity is LocalPlayerEntity) // TODO: and !renderSelf
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)
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.gui.rendering.entities.EntitiesRenderer
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) {
@ -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 }
}
override fun createModel(): PlayerModel? {
val model = super.createModel()
model?.enabled = renderer.context.camera.view.view.renderSelf
override fun createModel(skin: PlayerSkin): PlayerModel? {
val model = super.createModel(skin) ?: return null
model.enabled = renderer.context.camera.view.view.renderSelf
return model
}
}

View File

@ -13,8 +13,8 @@
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.properties.PlayerProperties
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
@ -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.skeletal.baked.BakedSkeletalModel
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) {
protected var model = createModel()?.register()
private var properties: PlayerProperties? = null
protected var model: PlayerModel? = null
private var refreshSkin = true
init {
entity.additional::properties.observe(this) { refreshSkin = true }
}
override fun update(millis: Long) {
updateSkeletalModel()
if (refreshSkin) updateModel()
super.update(millis)
}
private fun updateSkeletalModel() {
if (this.model != null) return
val update = updateProperties()
private fun getSkin(): PlayerSkin? {
return renderer.context.textures.skins.getSkin(entity, fetch = false, async = true)
}
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
}
protected open 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? {
private fun createModel(): PlayerModel? {
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) {
SkinModel.WIDE -> WIDE
SkinModel.SLIM -> SLIM

View File

@ -1,6 +1,6 @@
/*
* 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.
*
@ -11,20 +11,12 @@
* 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;
flat in uint finTextureIndex;
in vec3 finTextureCoordinates;
#include "minosoft:texture"
#include "minosoft:alpha"
void main() {
vec4 texelColor = getTexture(finTextureIndex, finTextureCoordinates);
foutColor = texelColor;
// foutColor.a = 1.0f;
class PlayerShader(native: NativeShader, buffer: FloatUniformBuffer) : BaseSkeletalShader(native, buffer) {
var texture by uniform("uIndexLayer", 0x00, NativeShader::setUInt)
}

View File

@ -16,7 +16,9 @@ package de.bixilon.minosoft.gui.rendering.skeletal
import de.bixilon.kotlinglm.mat4x4.Mat4
import de.bixilon.minosoft.data.registries.identified.Namespaces.minosoft
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.shader.SkeletalShader
import org.lwjgl.system.MemoryUtil.memAllocFloat
class SkeletalManager(
@ -26,13 +28,15 @@ class SkeletalManager(
val shader = context.system.createShader(minosoft("skeletal")) { SkeletalShader(it, uniformBuffer) }
private val temp = Mat4()
val playerShader = context.system.createShader(minosoft("entities/player")) { PlayerShader(it, uniformBuffer) } // TODO: move somewhere else
fun init() {
uniformBuffer.init()
}
fun postInit() {
shader.native.defines["TRANSFORMS"] = MAX_TRANSFORMS
shader.load()
playerShader.load()
shader.light = 0xFF
}
@ -49,6 +53,6 @@ class SkeletalManager(
}
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.
*/
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.vec3.Vec3
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.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.shader.NativeShader
import de.bixilon.minosoft.gui.rendering.system.base.texture.TextureManager
open class SkeletalShader(
abstract class BaseSkeletalShader(
override val native: NativeShader,
buffer: FloatUniformBuffer,
) : Shader(), TextureShader, AnimatedShader, LightShader, ViewProjectionShader, FogShader {
) : Shader(), TextureShader, ViewProjectionShader, FogShader {
override var textures: TextureManager by textureManager()
override val lightmap: LightmapBuffer by lightmap()
override var viewProjectionMatrix: Mat4 by viewProjectionMatrix()
override var cameraPosition: Vec3 by cameraPosition()
override var fog: FogManager by fog()
var light by uniform("uLight", 0x00, NativeShader::setUInt)
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:fog"
flat in bool finSkinLayer;
in vec4 finTintColor;
uniform uint uTextureIndex;
uniform vec3 uTextureCoordinates;
// flat in bool finSkinLayer;
flat in uint finTextureIndex;
in vec3 finTextureCoordinates;
void main() {
foutColor = getTexture(uTextureIndex, uTextureCoordinates);
if (finSkinLayer) {
if (foutColor.a < 0.5) discard;
}
foutColor = getTexture(finTextureIndex, finTextureCoordinates);
// if (finSkinLayer) {
// if (foutColor.a < 0.5) discard;
// }
foutColor.a = 1.0f;
set_fog();
}

View File

@ -1,6 +1,6 @@
/*
* 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.
*
@ -15,17 +15,26 @@
layout (location = 0) in vec3 vinPosition;
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;
out vec3 finTextureCoordinates;
uniform uint uIndexLayer;
uniform mat4 uTransform;
out vec4 finTintColor;
#include "minosoft:skeletal/vertex"
void main() {
gl_Position = uTransform * vec4(vinPosition, 1.0f);
gl_Position.w = 1.0f;
uint partTransformNormal = floatBitsToUint(vinPartTransformNormal);
run_skeletal(partTransformNormal, vinPosition);
// finSkinLayer = (partTransformNormal >> 13u & 0x07u) > 0u;
finTextureIndex = uIndexLayer >> 28u;
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() {
if (uFogStart > 100000.0f) {
if (uFogStart > 10000.0f) {
return 1.0f;
};
#ifdef FOG_SPHERE