diff options
| author | Linnea Gräf <nea@nea.moe> | 2025-07-27 20:24:55 +0200 |
|---|---|---|
| committer | Linnea Gräf <nea@nea.moe> | 2025-07-27 20:24:55 +0200 |
| commit | ba74103dbb7d13f57306e336713a5cd90859b642 (patch) | |
| tree | 29e691a56a0c2f829e043bfa78f9de07a99d462b /src/main/kotlin/features | |
| parent | 5247d98d3b768b34880640214f702c026c8c883b (diff) | |
| download | Firmament-ba74103dbb7d13f57306e336713a5cd90859b642.tar.gz Firmament-ba74103dbb7d13f57306e336713a5cd90859b642.tar.bz2 Firmament-ba74103dbb7d13f57306e336713a5cd90859b642.zip | |
feat: cape rendering
Diffstat (limited to 'src/main/kotlin/features')
| -rw-r--r-- | src/main/kotlin/features/misc/CustomCapes.kt | 40 |
1 files changed, 33 insertions, 7 deletions
diff --git a/src/main/kotlin/features/misc/CustomCapes.kt b/src/main/kotlin/features/misc/CustomCapes.kt index a3725e5..5004c15 100644 --- a/src/main/kotlin/features/misc/CustomCapes.kt +++ b/src/main/kotlin/features/misc/CustomCapes.kt @@ -1,10 +1,13 @@ package moe.nea.firmament.features.misc import com.mojang.blaze3d.buffers.GpuBuffer +import com.mojang.blaze3d.buffers.Std140Builder import com.mojang.blaze3d.systems.RenderSystem import java.nio.ByteBuffer +import java.nio.ByteOrder import java.util.OptionalDouble import java.util.OptionalInt +import org.joml.Vector4f import util.render.CustomRenderPipelines import kotlin.time.Duration import kotlin.time.Duration.Companion.seconds @@ -16,6 +19,7 @@ import net.minecraft.client.render.VertexConsumerProvider import net.minecraft.client.render.entity.state.PlayerEntityRenderState import net.minecraft.client.util.BufferAllocator import net.minecraft.client.util.SkinTextures +import net.minecraft.client.util.math.MatrixStack import net.minecraft.util.Identifier import moe.nea.firmament.Firmament import moe.nea.firmament.features.FirmamentFeature @@ -38,6 +42,7 @@ object CustomCapes : FirmamentFeature { fun replaceRender( renderLayer: RenderLayer, vertexConsumerProvider: VertexConsumerProvider, + matrixStack: MatrixStack, model: (VertexConsumer) -> Unit ) } @@ -48,6 +53,7 @@ object CustomCapes : FirmamentFeature { override fun replaceRender( renderLayer: RenderLayer, vertexConsumerProvider: VertexConsumerProvider, + matrixStack: MatrixStack, model: (VertexConsumer) -> Unit ) { model(vertexConsumerProvider.getBuffer(RenderLayer.getEntitySolid(location))) @@ -63,14 +69,16 @@ object CustomCapes : FirmamentFeature { override fun replaceRender( renderLayer: RenderLayer, vertexConsumerProvider: VertexConsumerProvider, + matrixStack: MatrixStack, model: (VertexConsumer) -> Unit ) { // TODO: figure out how exactly the rotation abstraction works val animationValue = (startTime.passedTime() / animationSpeed).mod(1F) val commandEncoder = RenderSystem.getDevice().createCommandEncoder() - val animationBufSource = ByteBuffer.allocateDirect(8) - animationBufSource.putFloat(animationValue.toFloat()) - animationBufSource.flip() + val animationBufSource = Std140Builder.intoBuffer(ByteBuffer.allocateDirect(16).order(ByteOrder.nativeOrder())) + .putFloat(animationValue.toFloat()) + .align(16) + .get() BufferAllocator(2048).use { allocator -> val bufferBuilder = BufferBuilder(allocator, renderLayer.drawMode, renderLayer.vertexFormat) model(bufferBuilder) @@ -81,14 +89,29 @@ object CustomCapes : FirmamentFeature { val templateTexture = MC.textureManager.getTexture(template) val backgroundTexture = MC.textureManager.getTexture(background) val foregroundTexture = MC.textureManager.getTexture(overlay) + val dynamicTransforms = RenderSystem.getDynamicUniforms() + .write( + RenderSystem.getModelViewMatrix(), + Vector4f(1.0F, 1.0F, 1.0F, 1.0F), + RenderSystem.getModelOffset(), + RenderSystem.getTextureMatrix(), + RenderSystem.getShaderLineWidth() + ) + val framebuffer = MC.instance.framebuffer + val colorAttachment = + RenderSystem.outputColorTextureOverride ?: framebuffer.getColorAttachmentView() + val depthAttachment = + (RenderSystem.outputDepthTextureOverride + ?: framebuffer.getDepthAttachmentView()).takeIf { framebuffer.useDepthAttachment } + RenderSystem.getDevice() - .createBuffer({ "Firm Cape Animation" }, GpuBuffer.USAGE_UNIFORM, animationBufSource) + .createBuffer({ "Firm Cape Animation" }, GpuBuffer.USAGE_UNIFORM or GpuBuffer.USAGE_MAP_READ, animationBufSource) .use { animationUniformBuf -> commandEncoder.createRenderPass( { "FirmamentCustomCape" }, - MC.instance.framebuffer.colorAttachmentView, + colorAttachment, OptionalInt.empty(), - MC.instance.framebuffer.depthAttachmentView, + depthAttachment, OptionalDouble.empty(), ).use { renderPass -> // TODO: account for lighting @@ -96,6 +119,8 @@ object CustomCapes : FirmamentFeature { renderPass.bindSampler("Sampler0", templateTexture.glTextureView) renderPass.bindSampler("Sampler1", backgroundTexture.glTextureView) renderPass.bindSampler("Sampler3", foregroundTexture.glTextureView) + RenderSystem.bindDefaultUniforms(renderPass) + renderPass.setUniform("DynamicTransforms", dynamicTransforms) renderPass.setUniform("Animation", animationUniformBuf) renderPass.setIndexBuffer(indexBuffer, indexBufferConstructor.indexType) renderPass.setVertexBuffer(0, vertexBuffer) @@ -166,12 +191,13 @@ object CustomCapes : FirmamentFeature { vertexConsumer: VertexConsumer, renderLayer: RenderLayer, vertexConsumerProvider: VertexConsumerProvider, + matrixStack: MatrixStack, model: (VertexConsumer) -> Unit ) { val capeStorage = CapeStorage.cast(playerEntityRenderState) val firmCape = capeStorage.cape_firmament if (firmCape != null) { - firmCape.render.replaceRender(renderLayer, vertexConsumerProvider, model) + firmCape.render.replaceRender(renderLayer, vertexConsumerProvider, matrixStack, model) } else { model(vertexConsumer) } |
