From 5379ce921b734122ac892b046e5d7d3707420e46 Mon Sep 17 00:00:00 2001 From: Bixilon Date: Mon, 6 Jun 2022 17:40:49 +0200 Subject: [PATCH] skeletal: allow dynamic textures, change some stuff in skeletal system, wip player model --- .../minosoft/data/entities/entities/Entity.kt | 8 +++ .../entities/entities/player/PlayerEntity.kt | 21 ++++--- .../gui/rendering/entity/EntityRenderer.kt | 63 +++++++++++++++++++ .../gui/rendering/entity/models/DummyModel.kt | 20 ++++++ .../rendering/entity/models/EntityModel.kt | 27 ++++++++ .../entity/models/SkeletalEntityModel.kt | 29 +++++++++ .../models/minecraft/player/PlayerModel.kt | 38 +++++++++++ .../gui/rendering/renderer/RendererManager.kt | 2 + .../gui/rendering/skeletal/SkeletalManager.kt | 1 + .../gui/rendering/skeletal/SkeletalMesh.kt | 8 +-- .../skeletal/baked/BakedSkeletalModel.kt | 4 +- .../rendering/skeletal/model/SkeletalModel.kt | 6 +- .../system/base/texture/ShaderTexture.kt | 22 +++++++ .../base/texture/dynamic/DynamicTexture.kt | 4 +- .../base/texture/texture/AbstractTexture.kt | 13 +++- .../texture/dynamic/OpenGLDynamicTexture.kt | 10 +++ .../rendering/world/entities/EntityModels.kt | 4 +- 17 files changed, 258 insertions(+), 22 deletions(-) create mode 100644 src/main/java/de/bixilon/minosoft/gui/rendering/entity/EntityRenderer.kt create mode 100644 src/main/java/de/bixilon/minosoft/gui/rendering/entity/models/DummyModel.kt create mode 100644 src/main/java/de/bixilon/minosoft/gui/rendering/entity/models/EntityModel.kt create mode 100644 src/main/java/de/bixilon/minosoft/gui/rendering/entity/models/SkeletalEntityModel.kt create mode 100644 src/main/java/de/bixilon/minosoft/gui/rendering/entity/models/minecraft/player/PlayerModel.kt create mode 100644 src/main/java/de/bixilon/minosoft/gui/rendering/system/base/texture/ShaderTexture.kt diff --git a/src/main/java/de/bixilon/minosoft/data/entities/entities/Entity.kt b/src/main/java/de/bixilon/minosoft/data/entities/entities/Entity.kt index a249eb5c6..bff1b39da 100644 --- a/src/main/java/de/bixilon/minosoft/data/entities/entities/Entity.kt +++ b/src/main/java/de/bixilon/minosoft/data/entities/entities/Entity.kt @@ -48,6 +48,9 @@ import de.bixilon.minosoft.data.registries.particle.data.BlockParticleData import de.bixilon.minosoft.data.text.ChatColors import de.bixilon.minosoft.data.text.ChatComponent import de.bixilon.minosoft.data.text.RGBColor +import de.bixilon.minosoft.gui.rendering.RenderWindow +import de.bixilon.minosoft.gui.rendering.entity.models.DummyModel +import de.bixilon.minosoft.gui.rendering.entity.models.EntityModel import de.bixilon.minosoft.gui.rendering.input.camera.EntityPositionInfo import de.bixilon.minosoft.gui.rendering.particle.types.render.texture.advanced.block.BlockDustParticle import de.bixilon.minosoft.gui.rendering.util.VecUtil.empty @@ -139,6 +142,9 @@ abstract class Entity( protected var lastTickTime = -1L + open var model: EntityModel? = null + + // fluids stuff val fluidHeights: MutableMap = synchronizedMapOf() var submergedFluid: Fluid? = null @@ -594,6 +600,8 @@ abstract class Entity( open fun onAttack(attacker: Entity) = true + open fun createModel(renderWindow: RenderWindow): EntityModel<*>? = DummyModel(renderWindow, this) + companion object { private val FLAGS_DATA = EntityDataField("ENTITY_FLAGS") diff --git a/src/main/java/de/bixilon/minosoft/data/entities/entities/player/PlayerEntity.kt b/src/main/java/de/bixilon/minosoft/data/entities/entities/player/PlayerEntity.kt index 0dc63f7a0..7433087b9 100644 --- a/src/main/java/de/bixilon/minosoft/data/entities/entities/player/PlayerEntity.kt +++ b/src/main/java/de/bixilon/minosoft/data/entities/entities/player/PlayerEntity.kt @@ -32,6 +32,9 @@ import de.bixilon.minosoft.data.registries.items.armor.DyeableArmorItem import de.bixilon.minosoft.data.text.ChatColors import de.bixilon.minosoft.data.text.RGBColor import de.bixilon.minosoft.data.world.World +import de.bixilon.minosoft.gui.rendering.RenderWindow +import de.bixilon.minosoft.gui.rendering.entity.models.EntityModel +import de.bixilon.minosoft.gui.rendering.entity.models.minecraft.player.PlayerModel import de.bixilon.minosoft.gui.rendering.util.VecUtil.clamp import de.bixilon.minosoft.gui.rendering.util.vec.vec3.Vec3dUtil.EMPTY import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection @@ -117,7 +120,18 @@ abstract class PlayerEntity( return ChatColors.RED } + override fun createModel(renderWindow: RenderWindow): EntityModel? { + return PlayerModel(renderWindow, this) + } + companion object { + private val ABSORPTION_HEARTS_DATA = EntityDataField("PLAYER_ABSORPTION_HEARTS") + private val SCORE_DATA = EntityDataField("PLAYER_SCORE") + private val SKIN_PARTS_DATA = EntityDataField("PLAYER_SKIN_PARTS_FLAGS") + private val MAIN_ARM_DATA = EntityDataField("PLAYER_SKIN_MAIN_HAND") + private val LEFT_SHOULDER_DATA_DATA = EntityDataField("PLAYER_LEFT_SHOULDER_DATA") + private val RIGHT_SHOULDER_DATA_DATA = EntityDataField("PLAYER_RIGHT_SHOULDER_DATA") + private val LAST_DEATH_POSITION_DATA = EntityDataField("PLAYER_LAST_DEATH_POSITION") private val DIMENSIONS: Map = mapOf( Poses.STANDING to Vec2(0.6f, 1.8f), Poses.SLEEPING to Vec2(0.2f, 0.2f), @@ -127,12 +141,5 @@ abstract class PlayerEntity( Poses.SNEAKING to Vec2(0.6f, 1.5f), // ToDo: This changed at some time Poses.DYING to Vec2(0.2f, 0.2f), ) - private val ABSORPTION_HEARTS_DATA = EntityDataField("PLAYER_ABSORPTION_HEARTS") - private val SCORE_DATA = EntityDataField("PLAYER_SCORE") - private val SKIN_PARTS_DATA = EntityDataField("PLAYER_SKIN_PARTS_FLAGS") - private val MAIN_ARM_DATA = EntityDataField("PLAYER_SKIN_MAIN_HAND") - private val LEFT_SHOULDER_DATA_DATA = EntityDataField("PLAYER_LEFT_SHOULDER_DATA") - private val RIGHT_SHOULDER_DATA_DATA = EntityDataField("PLAYER_RIGHT_SHOULDER_DATA") - private val LAST_DEATH_POSITION_DATA = EntityDataField("PLAYER_LAST_DEATH_POSITION") } } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/entity/EntityRenderer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/entity/EntityRenderer.kt new file mode 100644 index 000000000..3fda29a6d --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/entity/EntityRenderer.kt @@ -0,0 +1,63 @@ +/* + * 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. + */ + +package de.bixilon.minosoft.gui.rendering.entity + +import de.bixilon.kutil.latch.CountUpAndDownLatch +import de.bixilon.minosoft.data.registries.ResourceLocation +import de.bixilon.minosoft.gui.rendering.RenderWindow +import de.bixilon.minosoft.gui.rendering.renderer.Renderer +import de.bixilon.minosoft.gui.rendering.renderer.RendererBuilder +import de.bixilon.minosoft.gui.rendering.system.base.RenderSystem +import de.bixilon.minosoft.gui.rendering.system.base.phases.OpaqueDrawable +import de.bixilon.minosoft.gui.rendering.system.base.phases.SkipAll +import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection + +class EntityRenderer( + val connection: PlayConnection, + override val renderWindow: RenderWindow, +) : Renderer, OpaqueDrawable, SkipAll { + override val renderSystem: RenderSystem = renderWindow.renderSystem + val profile = connection.profiles.entity.hitbox + private val visibilityGraph = renderWindow.camera.visibilityGraph + + override val skipAll: Boolean + get() = false + + override fun init(latch: CountUpAndDownLatch) { + } + + override fun setupOpaque() { + renderWindow.renderSystem.reset(faceCulling = false) + } + + override fun drawOpaque() { + connection.world.entities.lock.acquire() + for (entity in connection.world.entities) { + if (entity.model == null) { + entity.model = entity.createModel(renderWindow) + } + entity.model?.draw() + } + connection.world.entities.lock.release() + } + + + companion object : RendererBuilder { + override val RESOURCE_LOCATION = ResourceLocation("minosoft:entity") + + override fun build(connection: PlayConnection, renderWindow: RenderWindow): EntityRenderer { + return EntityRenderer(connection, renderWindow) + } + } +} diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/entity/models/DummyModel.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/entity/models/DummyModel.kt new file mode 100644 index 000000000..99b8e0368 --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/entity/models/DummyModel.kt @@ -0,0 +1,20 @@ +/* + * 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. + */ + +package de.bixilon.minosoft.gui.rendering.entity.models + +import de.bixilon.minosoft.data.entities.entities.Entity +import de.bixilon.minosoft.gui.rendering.RenderWindow + +@Deprecated("TODO") +class DummyModel(renderWindow: RenderWindow, entity: Entity) : EntityModel(renderWindow, entity) diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/entity/models/EntityModel.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/entity/models/EntityModel.kt new file mode 100644 index 000000000..78a673961 --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/entity/models/EntityModel.kt @@ -0,0 +1,27 @@ +/* + * 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. + */ + +package de.bixilon.minosoft.gui.rendering.entity.models + +import de.bixilon.minosoft.data.entities.entities.Entity +import de.bixilon.minosoft.gui.rendering.RenderWindow + +abstract class EntityModel( + val renderWindow: RenderWindow, + val entity: E, +) { + + open fun draw() { + println("Drawing entity: $entity") + } +} diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/entity/models/SkeletalEntityModel.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/entity/models/SkeletalEntityModel.kt new file mode 100644 index 000000000..a0d93ac6b --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/entity/models/SkeletalEntityModel.kt @@ -0,0 +1,29 @@ +/* + * 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. + */ + +package de.bixilon.minosoft.gui.rendering.entity.models + +import de.bixilon.minosoft.data.entities.entities.Entity +import de.bixilon.minosoft.gui.rendering.RenderWindow +import de.bixilon.minosoft.gui.rendering.skeletal.baked.BakedSkeletalModel +import de.bixilon.minosoft.gui.rendering.skeletal.instance.SkeletalInstance + +abstract class SkeletalEntityModel(renderWindow: RenderWindow, entity: E) : EntityModel(renderWindow, entity) { + abstract val model: BakedSkeletalModel + + abstract val instance: SkeletalInstance + + override fun draw() { + instance.draw() + } +} diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/entity/models/minecraft/player/PlayerModel.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/entity/models/minecraft/player/PlayerModel.kt new file mode 100644 index 000000000..c66ce79f3 --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/entity/models/minecraft/player/PlayerModel.kt @@ -0,0 +1,38 @@ +/* + * 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. + */ + +package de.bixilon.minosoft.gui.rendering.entity.models.minecraft.player + +import de.bixilon.kotlinglm.vec3.Vec3i +import de.bixilon.minosoft.data.entities.entities.player.PlayerEntity +import de.bixilon.minosoft.gui.rendering.RenderWindow +import de.bixilon.minosoft.gui.rendering.entity.models.SkeletalEntityModel +import de.bixilon.minosoft.gui.rendering.models.ModelLoader.Companion.bbModel +import de.bixilon.minosoft.gui.rendering.skeletal.baked.BakedSkeletalModel +import de.bixilon.minosoft.gui.rendering.skeletal.instance.SkeletalInstance +import de.bixilon.minosoft.util.KUtil.toResourceLocation + +class PlayerModel(renderWindow: RenderWindow, player: PlayerEntity) : SkeletalEntityModel(renderWindow, player) { + override val model: BakedSkeletalModel = renderWindow.modelLoader.entities.loadModel( + "minecraft:entities/player/steve".toResourceLocation(), + "minecraft:entities/player/steve".toResourceLocation().bbModel(), + mutableMapOf(0 to renderWindow.textureManager.steveTexture), + ) + + init { + model.loadMesh(renderWindow) + } + + override val instance: SkeletalInstance = SkeletalInstance(renderWindow, Vec3i(), model) + +} diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/renderer/RendererManager.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/renderer/RendererManager.kt index e421accfa..507310a70 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/renderer/RendererManager.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/renderer/RendererManager.kt @@ -20,6 +20,7 @@ import de.bixilon.minosoft.config.profile.ConnectionProfiles import de.bixilon.minosoft.data.registries.ResourceLocation import de.bixilon.minosoft.gui.rendering.RenderWindow import de.bixilon.minosoft.gui.rendering.entity.EntityHitboxRenderer +import de.bixilon.minosoft.gui.rendering.entity.EntityRenderer import de.bixilon.minosoft.gui.rendering.gui.GUIRenderer import de.bixilon.minosoft.gui.rendering.particle.ParticleRenderer import de.bixilon.minosoft.gui.rendering.sky.SkyRenderer @@ -148,6 +149,7 @@ class RendererManager( if (!profiles.particle.skipLoading) { register(ParticleRenderer) } + register(EntityRenderer) register(EntityHitboxRenderer) register(ChunkBorderRenderer) register(WorldBorderRenderer) 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 917efc23a..46ac95a81 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 @@ -33,6 +33,7 @@ class SkeletalManager( fun postInit() { shader.defines["TRANSFORMS"] = TRANSFORMS shader.loadAnimated() + renderWindow.textureManager.dynamicTextures.use(shader) shader["uSkeletalBuffer"] = uniformBuffer shader.setUInt("uLight", 0xFF) renderWindow.lightMap.use(shader) diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/SkeletalMesh.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/SkeletalMesh.kt index ba378d636..6e9710b36 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/SkeletalMesh.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/SkeletalMesh.kt @@ -16,21 +16,21 @@ package de.bixilon.minosoft.gui.rendering.skeletal import de.bixilon.kotlinglm.vec2.Vec2 import de.bixilon.kotlinglm.vec3.Vec3 import de.bixilon.minosoft.gui.rendering.RenderWindow -import de.bixilon.minosoft.gui.rendering.system.base.texture.texture.AbstractTexture +import de.bixilon.minosoft.gui.rendering.system.base.texture.ShaderTexture import de.bixilon.minosoft.gui.rendering.util.mesh.Mesh import de.bixilon.minosoft.gui.rendering.util.mesh.MeshStruct class SkeletalMesh(renderWindow: RenderWindow, initialCacheSize: Int) : Mesh(renderWindow, EntitiesMeshStruct, initialCacheSize = initialCacheSize) { - fun addVertex(position: FloatArray, uv: Vec2, transform: Int, texture: AbstractTexture) { - val transformedUV = texture.renderData.transformUV(uv) + fun addVertex(position: FloatArray, uv: Vec2, transform: Int, texture: ShaderTexture) { + val transformedUV = texture.transformUV(uv) data.add(position[0]) data.add(position[1]) data.add(position[2]) data.add(transformedUV.x) data.add(transformedUV.y) data.add(Float.fromBits(transform)) - data.add(Float.fromBits(texture.renderData.shaderTextureId)) + data.add(Float.fromBits(texture.shaderId)) } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/baked/BakedSkeletalModel.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/baked/BakedSkeletalModel.kt index ebc85e6c7..fe56b2ff5 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/baked/BakedSkeletalModel.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/baked/BakedSkeletalModel.kt @@ -23,7 +23,7 @@ import de.bixilon.minosoft.gui.rendering.models.unbaked.element.UnbakedElement import de.bixilon.minosoft.gui.rendering.skeletal.SkeletalMesh import de.bixilon.minosoft.gui.rendering.skeletal.model.SkeletalModel import de.bixilon.minosoft.gui.rendering.skeletal.model.outliner.SkeletalOutliner -import de.bixilon.minosoft.gui.rendering.system.base.texture.texture.AbstractTexture +import de.bixilon.minosoft.gui.rendering.system.base.texture.ShaderTexture import de.bixilon.minosoft.gui.rendering.util.vec.vec3.Vec3Util.rotateAssign import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap @@ -31,7 +31,7 @@ import java.util.* class BakedSkeletalModel( val model: SkeletalModel, - val textures: Int2ObjectOpenHashMap, + val textures: Int2ObjectOpenHashMap, ) { lateinit var mesh: SkeletalMesh diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/model/SkeletalModel.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/model/SkeletalModel.kt index 5323d7ba0..7793e20e2 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/model/SkeletalModel.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/model/SkeletalModel.kt @@ -22,7 +22,7 @@ import de.bixilon.minosoft.gui.rendering.skeletal.model.meta.SkeletalMeta import de.bixilon.minosoft.gui.rendering.skeletal.model.outliner.SkeletalOutliner import de.bixilon.minosoft.gui.rendering.skeletal.model.resolution.SkeletalResolution import de.bixilon.minosoft.gui.rendering.skeletal.model.textures.SkeletalTexture -import de.bixilon.minosoft.gui.rendering.system.base.texture.texture.AbstractTexture +import de.bixilon.minosoft.gui.rendering.system.base.texture.ShaderTexture import de.bixilon.minosoft.gui.rendering.util.vec.vec3.Vec3Util.EMPTY import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap @@ -38,8 +38,8 @@ data class SkeletalModel( val animations: List = emptyList(), ) { - fun bake(renderWindow: RenderWindow, textureOverride: MutableMap): BakedSkeletalModel { - val textures: Int2ObjectOpenHashMap = Int2ObjectOpenHashMap() + fun bake(renderWindow: RenderWindow, textureOverride: MutableMap): BakedSkeletalModel { + val textures: Int2ObjectOpenHashMap = Int2ObjectOpenHashMap() for (entry in this.textures) { val override = textureOverride[entry.id] if (override != null) { diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/system/base/texture/ShaderTexture.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/system/base/texture/ShaderTexture.kt new file mode 100644 index 000000000..63f7e7d6d --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/system/base/texture/ShaderTexture.kt @@ -0,0 +1,22 @@ +/* + * 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. + */ + +package de.bixilon.minosoft.gui.rendering.system.base.texture + +import de.bixilon.kotlinglm.vec2.Vec2 + +interface ShaderTexture : ShaderIdentifiable { + + fun transformUV(end: Vec2?): Vec2 + fun transformUV(end: FloatArray?): FloatArray +} diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/system/base/texture/dynamic/DynamicTexture.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/system/base/texture/dynamic/DynamicTexture.kt index 8e6d426f1..8bcfd8a76 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/system/base/texture/dynamic/DynamicTexture.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/system/base/texture/dynamic/DynamicTexture.kt @@ -13,11 +13,11 @@ package de.bixilon.minosoft.gui.rendering.system.base.texture.dynamic -import de.bixilon.minosoft.gui.rendering.system.base.texture.ShaderIdentifiable +import de.bixilon.minosoft.gui.rendering.system.base.texture.ShaderTexture import java.util.* import java.util.concurrent.atomic.AtomicInteger -interface DynamicTexture : ShaderIdentifiable { +interface DynamicTexture : ShaderTexture { val uuid: UUID val usages: AtomicInteger diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/system/base/texture/texture/AbstractTexture.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/system/base/texture/texture/AbstractTexture.kt index 32f28251c..83fe7eceb 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/system/base/texture/texture/AbstractTexture.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/system/base/texture/texture/AbstractTexture.kt @@ -17,14 +17,14 @@ import de.bixilon.kotlinglm.vec2.Vec2 import de.bixilon.kotlinglm.vec2.Vec2i import de.bixilon.minosoft.assets.AssetsManager import de.bixilon.minosoft.data.registries.ResourceLocation -import de.bixilon.minosoft.gui.rendering.system.base.texture.ShaderIdentifiable +import de.bixilon.minosoft.gui.rendering.system.base.texture.ShaderTexture import de.bixilon.minosoft.gui.rendering.system.base.texture.TextureStates import de.bixilon.minosoft.gui.rendering.system.base.texture.TextureTransparencies import de.bixilon.minosoft.gui.rendering.system.opengl.texture.OpenGLTextureUtil import de.bixilon.minosoft.gui.rendering.textures.properties.ImageProperties import java.nio.ByteBuffer -interface AbstractTexture : ShaderIdentifiable { +interface AbstractTexture : ShaderTexture { val resourceLocation: ResourceLocation var textureArrayUV: Vec2 @@ -55,4 +55,13 @@ interface AbstractTexture : ShaderIdentifiable { return OpenGLTextureUtil.generateMipMaps(data, size) } + + override fun transformUV(end: FloatArray?): FloatArray { + return renderData.transformUV(end) + } + + override fun transformUV(end: Vec2?): Vec2 { + return renderData.transformUV(end) + } + } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/system/opengl/texture/dynamic/OpenGLDynamicTexture.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/system/opengl/texture/dynamic/OpenGLDynamicTexture.kt index a3161b154..b43e894c9 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/system/opengl/texture/dynamic/OpenGLDynamicTexture.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/system/opengl/texture/dynamic/OpenGLDynamicTexture.kt @@ -13,6 +13,7 @@ package de.bixilon.minosoft.gui.rendering.system.opengl.texture.dynamic +import de.bixilon.kotlinglm.vec2.Vec2 import de.bixilon.minosoft.gui.rendering.system.base.texture.dynamic.DynamicTexture import de.bixilon.minosoft.gui.rendering.system.base.texture.dynamic.DynamicTextureState import java.nio.ByteBuffer @@ -43,4 +44,13 @@ class OpenGLDynamicTexture( override fun toString(): String { return uuid.toString() } + + override fun transformUV(end: Vec2?): Vec2 { + return end ?: Vec2(1.0f) + } + + override fun transformUV(end: FloatArray?): FloatArray { + return end ?: floatArrayOf(1.0f, 1.0f) + } } + diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/world/entities/EntityModels.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/world/entities/EntityModels.kt index ce8b2c8af..b898442ae 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/world/entities/EntityModels.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/world/entities/EntityModels.kt @@ -18,7 +18,7 @@ import de.bixilon.minosoft.data.registries.ResourceLocation import de.bixilon.minosoft.gui.rendering.RenderWindow import de.bixilon.minosoft.gui.rendering.skeletal.baked.BakedSkeletalModel import de.bixilon.minosoft.gui.rendering.skeletal.model.SkeletalModel -import de.bixilon.minosoft.gui.rendering.system.base.texture.texture.AbstractTexture +import de.bixilon.minosoft.gui.rendering.system.base.texture.ShaderTexture class EntityModels(val renderWindow: RenderWindow) { private val unbakedModels: MutableMap = mutableMapOf() @@ -30,7 +30,7 @@ class EntityModels(val renderWindow: RenderWindow) { } @Synchronized - fun loadModel(name: ResourceLocation, path: ResourceLocation, textureOverride: MutableMap = mutableMapOf()): BakedSkeletalModel { + fun loadModel(name: ResourceLocation, path: ResourceLocation, textureOverride: MutableMap = mutableMapOf()): BakedSkeletalModel { return skeletal.getOrPut(name) { loadUnbakedModel(path).bake(renderWindow, textureOverride) } }