From c110aed90b88d99701aba7a8a10cbd2c82c51502 Mon Sep 17 00:00:00 2001 From: YuRaNnNzZZ Date: Sat, 1 Jul 2023 04:09:43 +0300 Subject: [PATCH] =?UTF-8?q?=D0=B2=D1=8B=D1=81=D1=82=D1=80=D0=B5=D0=BB=20?= =?UTF-8?q?=D0=B2=20=D0=BD=D0=BE=D0=B3=D1=83=20=D0=92=D0=A1=D0=95=D0=9C=20?= =?UTF-8?q?progress=20towards=20#258=20prototype,=20missing:=20lighting,?= =?UTF-8?q?=20item=20render?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../render/blockentity/FluidTankRenderer.kt | 102 ++++++++++++++++++ .../mc/otm/registry/MBlockEntities.kt | 1 + 2 files changed, 103 insertions(+) create mode 100644 src/main/kotlin/ru/dbotthepony/mc/otm/client/render/blockentity/FluidTankRenderer.kt diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/blockentity/FluidTankRenderer.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/blockentity/FluidTankRenderer.kt new file mode 100644 index 000000000..bfd99551a --- /dev/null +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/blockentity/FluidTankRenderer.kt @@ -0,0 +1,102 @@ +package ru.dbotthepony.mc.otm.client.render.blockentity + +import com.mojang.blaze3d.systems.RenderSystem +import com.mojang.blaze3d.vertex.* +import com.mojang.math.Axis +import net.minecraft.client.renderer.* +import net.minecraft.client.renderer.blockentity.BlockEntityRenderer +import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider +import net.minecraft.world.inventory.InventoryMenu +import net.minecraftforge.client.extensions.common.IClientFluidTypeExtensions +import ru.dbotthepony.mc.otm.block.entity.decorative.FluidTankBlockEntity +import ru.dbotthepony.mc.otm.client.minecraft +import ru.dbotthepony.mc.otm.client.render.* +import ru.dbotthepony.mc.otm.core.math.RGBAColor +import ru.dbotthepony.mc.otm.core.math.linearInterpolation + +class FluidTankRenderer(private val context: BlockEntityRendererProvider.Context) : BlockEntityRenderer { + private val fluidTop = 13f / 16f + private val fluidBottom = 3f / 16f + private val fluidHeight = 10f / 16f + private val fluidWidth = 15.8f / 16f + + private val fluidPadding = (1f - fluidWidth) * .5f + + override fun render( + tile: FluidTankBlockEntity, + partialTick: Float, + poseStack: PoseStack, + bufferSource: MultiBufferSource, + packedLight: Int, + overlayLight: Int + ) { + val fluid = tile.synchronizedFluid + + if (fluid.isEmpty) + return + + val fluidLevel = fluid.amount.toFloat() / tile.fluid.getTankCapacity(0).toFloat() + + if (fluidLevel < 0.01f) + return + + val data = IClientFluidTypeExtensions.of(fluid.fluid) + val texture = data.stillTexture + val sprite = minecraft.getTextureAtlas(InventoryMenu.BLOCK_ATLAS).apply(texture) + val tint = RGBAColor.argb(data.getTintColor(fluid)) + val gas = fluid.fluid.fluidType.isLighterThanAir + + val interp = linearInterpolation(fluidLevel, sprite.v1, sprite.v0) + val v1 = linearInterpolation(fluidBottom, sprite.v1, sprite.v0) + + val builder = tesselator.builder + builder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.BLOCK) + + poseStack.pushPose() + poseStack.translate(0f, fluidBottom + (if (gas) 1f - fluidLevel else 0f) * fluidHeight, 0f) + + for (i in 0 .. 3) { + poseStack.pushPose() + + poseStack.translate(0.5, 0.0, 0.5) + poseStack.rotateAround(Axis.YP.rotationDegrees(i * 90.0f), 0.0f, 1.0f, 0.0f) + poseStack.translate(-0.5f, 0f, fluidWidth * .5f) + + val matrix = poseStack.last().pose() + + builder.vertex(matrix, fluidPadding, 0f, 0f).color(tint.red, tint.green, tint.blue, tint.alpha).uv(sprite.u0, v1).overlayCoords(overlayLight).uv2(packedLight).normal(0.0f, 1.0f, 0.0f).endVertex() + builder.vertex(matrix, fluidPadding + fluidWidth, 0f, 0f).color(tint.red, tint.green, tint.blue, tint.alpha).uv(sprite.u1, v1).overlayCoords(overlayLight).uv2(packedLight).normal(0.0f, 1.0f, 0.0f).endVertex() + builder.vertex(matrix, fluidPadding + fluidWidth, fluidLevel * fluidHeight, 0f).color(tint.red, tint.green, tint.blue, tint.alpha).uv(sprite.u1, interp).overlayCoords(overlayLight).uv2(packedLight).normal(0.0f, 1.0f, 0.0f).endVertex() + builder.vertex(matrix, fluidPadding, fluidLevel * fluidHeight, 0f).color(tint.red, tint.green, tint.blue, tint.alpha).uv(sprite.u0, interp).overlayCoords(overlayLight).uv2(packedLight).normal(0.0f, 1.0f, 0.0f).endVertex() + + poseStack.popPose() + } + + val matrix = poseStack.last().pose() + + if (!gas && fluidLevel < 1f) { // top + builder.vertex(matrix, fluidPadding, fluidLevel * fluidHeight, fluidPadding + fluidWidth).color(tint.red, tint.green, tint.blue, tint.alpha).uv(sprite.u0, sprite.v1).overlayCoords(overlayLight).uv2(packedLight).normal(0.0f, 1.0f, 0.0f).endVertex() + builder.vertex(matrix, fluidPadding + fluidWidth, fluidLevel * fluidHeight, fluidPadding + fluidWidth).color(tint.red, tint.green, tint.blue, tint.alpha).uv(sprite.u1, sprite.v1).overlayCoords(overlayLight).uv2(packedLight).normal(0.0f, 1.0f, 0.0f).endVertex() + builder.vertex(matrix, fluidPadding + fluidWidth, fluidLevel * fluidHeight, fluidPadding).color(tint.red, tint.green, tint.blue, tint.alpha).uv(sprite.u1, sprite.v0).overlayCoords(overlayLight).uv2(packedLight).normal(0.0f, 1.0f, 0.0f).endVertex() + builder.vertex(matrix, fluidPadding, fluidLevel * fluidHeight, fluidPadding).color(tint.red, tint.green, tint.blue, tint.alpha).uv(sprite.u0, sprite.v0).overlayCoords(overlayLight).uv2(packedLight).normal(0.0f, 1.0f, 0.0f).endVertex() + } + + if (gas && fluidLevel < 1f) { // bottom + builder.vertex(matrix, fluidPadding, 0f, fluidPadding).color(tint.red, tint.green, tint.blue, tint.alpha).uv(sprite.u0, sprite.v0).overlayCoords(overlayLight).uv2(packedLight).normal(0.0f, 1.0f, 0.0f).endVertex() + builder.vertex(matrix, fluidPadding + fluidWidth, 0f, fluidPadding).color(tint.red, tint.green, tint.blue, tint.alpha).uv(sprite.u1, sprite.v0).overlayCoords(overlayLight).uv2(packedLight).normal(0.0f, 1.0f, 0.0f).endVertex() + builder.vertex(matrix, fluidPadding + fluidWidth, 0f, fluidPadding + fluidWidth).color(tint.red, tint.green, tint.blue, tint.alpha).uv(sprite.u1, sprite.v1).overlayCoords(overlayLight).uv2(packedLight).normal(0.0f, 1.0f, 0.0f).endVertex() + builder.vertex(matrix, fluidPadding, 0f, fluidPadding + fluidWidth).color(tint.red, tint.green, tint.blue, tint.alpha).uv(sprite.u0, sprite.v1).overlayCoords(overlayLight).uv2(packedLight).normal(0.0f, 1.0f, 0.0f).endVertex() + } + + poseStack.popPose() + + RenderSystem.setShader(GameRenderer::getPositionColorTexLightmapShader) + RenderSystem.setShaderTexture(0, InventoryMenu.BLOCK_ATLAS) + + RenderSystem.enableCull() + RenderSystem.enableBlend() + RenderSystem.enableDepthTest() + + BufferUploader.drawWithShader(builder.end()) + } +} diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MBlockEntities.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MBlockEntities.kt index 6bfc64e38..f281a490f 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MBlockEntities.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MBlockEntities.kt @@ -83,6 +83,7 @@ object MBlockEntities { BlockEntityRenderers.register(MATTER_RECONSTRUCTOR, ::MatterReconstructorRenderer) BlockEntityRenderers.register(MATTER_REPLICATOR, ::MatterReplicatorRenderer) BlockEntityRenderers.register(HOLO_SIGN, ::HoloSignRenderer) + BlockEntityRenderers.register(FLUID_TANK, ::FluidTankRenderer) } } }