From af3d76561468cfbffddd19efcb1a4fe238f2ac15 Mon Sep 17 00:00:00 2001 From: Linnea Gräf Date: Wed, 30 Jul 2025 21:01:20 +0200 Subject: fix: render circle with custom pipeline --- .gitignore | 1 + src/main/kotlin/util/mc/CustomRenderPassHelper.kt | 8 +++++ src/main/kotlin/util/render/CustomRenderLayers.kt | 2 +- src/main/kotlin/util/render/DumpTexture.kt | 34 ++++++++++++++++++++++ .../kotlin/util/render/RenderCircleProgress.kt | 1 + 5 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 src/main/kotlin/util/render/DumpTexture.kt diff --git a/.gitignore b/.gitignore index c5e4a9e..6552c3e 100644 --- a/.gitignore +++ b/.gitignore @@ -31,3 +31,4 @@ gradle-app.setting /logs/ *.xsd *.png~ +*.kra diff --git a/src/main/kotlin/util/mc/CustomRenderPassHelper.kt b/src/main/kotlin/util/mc/CustomRenderPassHelper.kt index 12f98e4..295f727 100644 --- a/src/main/kotlin/util/mc/CustomRenderPassHelper.kt +++ b/src/main/kotlin/util/mc/CustomRenderPassHelper.kt @@ -34,6 +34,7 @@ class CustomRenderPassHelper( private val preparations = mutableListOf<(RenderPass) -> Unit>() val device = RenderSystem.getDevice() private var hasPipelineAction = false + private var hasSetDefaultUniforms = false val commandEncoder = device.createCommandEncoder() fun setPipeline(pipeline: RenderPipeline) { ErrorUtil.softCheck("Already has a pipeline", !hasPipelineAction) @@ -51,7 +52,13 @@ class CustomRenderPassHelper( queueAction { it.bindSampler(name, texture.glTextureView) } } + + fun dontSetDefaultUniforms() { + hasSetDefaultUniforms = true + } + fun setAllDefaultUniforms() { + hasSetDefaultUniforms = true queueAction { RenderSystem.bindDefaultUniforms(it) } @@ -129,6 +136,7 @@ class CustomRenderPassHelper( fun draw(): DrawToken { val vertexData = (ErrorUtil.notNullOr(vertices, "No vertex data uploaded") { return DrawToken }) + ErrorUtil.softCheck("Missing default uniforms", hasSetDefaultUniforms) ErrorUtil.softCheck("Missing a pipeline", hasPipelineAction) val renderPass = queueClose( commandEncoder.createRenderPass( diff --git a/src/main/kotlin/util/render/CustomRenderLayers.kt b/src/main/kotlin/util/render/CustomRenderLayers.kt index 13412ec..a133cbf 100644 --- a/src/main/kotlin/util/render/CustomRenderLayers.kt +++ b/src/main/kotlin/util/render/CustomRenderLayers.kt @@ -47,7 +47,7 @@ object CustomRenderPipelines { .withLocation(Firmament.identifier("gui_textured_overlay_tris_circle")) .withUniform("CutoutRadius", UniformType.UNIFORM_BUFFER) .withFragmentShader(Firmament.identifier("circle_discard_color")) - .withBlend(BlendFunction.TRANSLUCENT) +// .withBlend(BlendFunction.TRANSLUCENT) .build() val PARALLAX_CAPE_SHADER = RenderPipeline.builder(RenderPipelines.ENTITY_SNIPPET) diff --git a/src/main/kotlin/util/render/DumpTexture.kt b/src/main/kotlin/util/render/DumpTexture.kt new file mode 100644 index 0000000..a7b4e78 --- /dev/null +++ b/src/main/kotlin/util/render/DumpTexture.kt @@ -0,0 +1,34 @@ +package moe.nea.firmament.util.render + +import com.mojang.blaze3d.buffers.GpuBuffer +import com.mojang.blaze3d.systems.RenderSystem +import com.mojang.blaze3d.textures.GpuTexture +import java.io.File +import net.minecraft.client.texture.NativeImage + +fun dumpTexture(gpuTexture: GpuTexture, name: String) { + val w = gpuTexture.getWidth(0) + val h = gpuTexture.getHeight(0) + val buffer = RenderSystem.getDevice() + .createBuffer( + { "Dump Buffer" }, + GpuBuffer.USAGE_COPY_DST or GpuBuffer.USAGE_MAP_READ, + w * h * gpuTexture.getFormat().pixelSize() + ) + val commandEncoder = RenderSystem.getDevice().createCommandEncoder() + commandEncoder.copyTextureToBuffer( + gpuTexture, buffer, 0, { + val nativeImage = NativeImage(w, h, false) + commandEncoder.mapBuffer(buffer, true, false).use { mappedView -> + for (i in 0.. renderPass.uploadVertices(buffer) + renderPass.setAllDefaultUniforms() renderPass.setPipeline(state.layer.pipeline) renderPass.setUniform("CutoutRadius", 4) { it.putFloat(state.innerCutoutRadius) -- cgit