mirror of
https://gitlab.bixilon.de/bixilon/minosoft.git
synced 2025-09-13 09:26:11 -04:00
player fixes
This commit is contained in:
parent
a29155cb96
commit
6f10bce914
@ -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
|
||||
|
@ -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() }
|
||||
}
|
||||
}
|
||||
|
@ -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()
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
}
|
@ -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
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
}
|
@ -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)
|
||||
}
|
@ -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();
|
||||
}
|
@ -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));
|
@ -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;
|
||||
}
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user