diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/entities/feature/SkeletalFeature.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/entities/feature/SkeletalFeature.kt index 606a5bab1..06b00bbb6 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/entities/feature/SkeletalFeature.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/entities/feature/SkeletalFeature.kt @@ -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 diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/entities/hitbox/HitboxFeature.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/entities/hitbox/HitboxFeature.kt index 20bd0449e..dd4f2b7c9 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/entities/hitbox/HitboxFeature.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/entities/hitbox/HitboxFeature.kt @@ -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() } } } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/entities/model/biped/PlayerModel.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/entities/model/biped/PlayerModel.kt index b0d699d15..d1aaf9f6a 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/entities/model/biped/PlayerModel.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/entities/model/biped/PlayerModel.kt @@ -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() } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/entities/renderer/player/LocalPlayerRenderer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/entities/renderer/player/LocalPlayerRenderer.kt index 1e6b31d1e..4e3b29f25 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/entities/renderer/player/LocalPlayerRenderer.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/entities/renderer/player/LocalPlayerRenderer.kt @@ -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(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 } } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/entities/renderer/player/PlayerRenderer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/entities/renderer/player/PlayerRenderer.kt index 2a7f197d6..3d6c0691c 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/entities/renderer/player/PlayerRenderer.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/entities/renderer/player/PlayerRenderer.kt @@ -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(renderer: EntitiesRenderer, entity: E) : EntityRenderer(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 diff --git a/src/main/resources/assets/minosoft/rendering/shader/arm/arm.fsh b/src/main/java/de/bixilon/minosoft/gui/rendering/entities/renderer/player/PlayerShader.kt similarity index 58% rename from src/main/resources/assets/minosoft/rendering/shader/arm/arm.fsh rename to src/main/java/de/bixilon/minosoft/gui/rendering/entities/renderer/player/PlayerShader.kt index e8efad605..542d11d65 100644 --- a/src/main/resources/assets/minosoft/rendering/shader/arm/arm.fsh +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/entities/renderer/player/PlayerShader.kt @@ -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) } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/SkeletalManager.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/SkeletalManager.kt index 2aca44f7c..148c1f9ab 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/SkeletalManager.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/SkeletalManager.kt @@ -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 } } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/SkeletalShader.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/shader/BaseSkeletalShader.kt similarity index 75% rename from src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/SkeletalShader.kt rename to src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/shader/BaseSkeletalShader.kt index 725dbacd3..21f598015 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/SkeletalShader.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/shader/BaseSkeletalShader.kt @@ -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 + } } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/shader/SkeletalShader.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/shader/SkeletalShader.kt new file mode 100644 index 000000000..422d70a60 --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/shader/SkeletalShader.kt @@ -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 . + * + * 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) +} diff --git a/src/main/resources/assets/minosoft/rendering/shader/includes/entities/player/player.fsh b/src/main/resources/assets/minosoft/rendering/shader/entities/player/player.fsh similarity index 78% rename from src/main/resources/assets/minosoft/rendering/shader/includes/entities/player/player.fsh rename to src/main/resources/assets/minosoft/rendering/shader/entities/player/player.fsh index fbfb5b31e..ec828e694 100644 --- a/src/main/resources/assets/minosoft/rendering/shader/includes/entities/player/player.fsh +++ b/src/main/resources/assets/minosoft/rendering/shader/entities/player/player.fsh @@ -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(); } diff --git a/src/main/resources/assets/minosoft/rendering/shader/arm/arm.vsh b/src/main/resources/assets/minosoft/rendering/shader/entities/player/player.vsh similarity index 69% rename from src/main/resources/assets/minosoft/rendering/shader/arm/arm.vsh rename to src/main/resources/assets/minosoft/rendering/shader/entities/player/player.vsh index 6e797f1d2..1a8b52fb8 100644 --- a/src/main/resources/assets/minosoft/rendering/shader/arm/arm.vsh +++ b/src/main/resources/assets/minosoft/rendering/shader/entities/player/player.vsh @@ -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)); diff --git a/src/main/resources/assets/minosoft/rendering/shader/includes/entities/player/player.vsh b/src/main/resources/assets/minosoft/rendering/shader/includes/entities/player/player.vsh deleted file mode 100644 index 555a7df62..000000000 --- a/src/main/resources/assets/minosoft/rendering/shader/includes/entities/player/player.vsh +++ /dev/null @@ -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 . - * - * 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; -} diff --git a/src/main/resources/assets/minosoft/rendering/shader/includes/fog.glsl b/src/main/resources/assets/minosoft/rendering/shader/includes/fog.glsl index bf7387670..15f89de24 100644 --- a/src/main/resources/assets/minosoft/rendering/shader/includes/fog.glsl +++ b/src/main/resources/assets/minosoft/rendering/shader/includes/fog.glsl @@ -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