From e518f2c73299eef844752d744eabc86b68abb0a7 Mon Sep 17 00:00:00 2001 From: YuRaNnNzZZ Date: Tue, 25 Jul 2023 05:58:32 +0300 Subject: [PATCH] =?UTF-8?q?=D1=80=D0=B5=D0=BD=D0=B4=D0=B5=D1=80=20=D1=88?= =?UTF-8?q?=D0=B8=D0=B7=D1=8B=20(=D0=B8=D0=BB=D0=B8=20=D0=B6=D0=B8=D0=B4?= =?UTF-8?q?=D0=BA=D0=BE=D1=81=D1=82=D1=8F=D1=85=20=D0=B2=20=D1=82=D0=B0?= =?UTF-8?q?=D0=BD=D0=BA=D0=B0=D1=85-=D0=BF=D1=80=D0=B5=D0=B4=D0=BC=D0=B5?= =?UTF-8?q?=D1=82=D0=B0=D1=85)=20#258?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mc/otm/datagen/items/ItemModels.kt | 1 - .../render/blockentity/FluidTankRenderer.kt | 151 ++++++++++++------ .../dbotthepony/mc/otm/item/FluidTankItem.kt | 14 ++ .../models/item/fluid_tank.json | 34 ++++ 4 files changed, 148 insertions(+), 52 deletions(-) create mode 100644 src/main/resources/assets/overdrive_that_matters/models/item/fluid_tank.json diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/items/ItemModels.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/items/ItemModels.kt index cfd8b083c..7db7e577b 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/items/ItemModels.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/items/ItemModels.kt @@ -32,7 +32,6 @@ fun addItemModels(provider: MatteryItemModelProvider) { provider.block(MItems.PHANTOM_ATTRACTOR) provider.block(MItems.HOLO_SIGN) provider.generated(MItems.FLUID_CAPSULE) - provider.block(MItems.FLUID_TANK) MRegistry.VENT.allItems.values.forEach(provider::block) MRegistry.VENT_ALTERNATIVE.allItems.values.forEach(provider::block) 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 index 5ca459112..4d9fd6fc4 100644 --- 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 @@ -5,88 +5,137 @@ 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.client.renderer.entity.ItemRenderer import net.minecraft.world.inventory.InventoryMenu +import net.minecraft.world.item.BlockItem +import net.minecraft.world.item.ItemDisplayContext +import net.minecraft.world.item.ItemStack +import net.minecraft.world.level.block.HalfTransparentBlock +import net.minecraft.world.level.block.StainedGlassPaneBlock import net.minecraftforge.client.extensions.common.IClientFluidTypeExtensions +import net.minecraftforge.common.capabilities.ForgeCapabilities +import net.minecraftforge.fluids.FluidStack +import net.minecraftforge.fluids.capability.IFluidHandler import ru.dbotthepony.mc.otm.block.entity.decorative.FluidTankBlockEntity import ru.dbotthepony.mc.otm.client.minecraft +import ru.dbotthepony.mc.otm.core.ifPresentK import ru.dbotthepony.mc.otm.core.math.RGBAColor import ru.dbotthepony.mc.otm.core.math.linearInterpolation +import ru.dbotthepony.mc.otm.registry.MBlocks 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 + packedOverlay: Int ) { - val fluid = tile.synchronizedFluid + renderFluidInTank(tile.fluid, tile.synchronizedFluid, poseStack, bufferSource, packedLight, packedOverlay) + } - if (fluid.isEmpty) - return + object FluidTankItemRenderer : BlockEntityWithoutLevelRenderer(minecraft.blockEntityRenderDispatcher, minecraft.entityModels) { + override fun renderByItem( + stack: ItemStack, + displayContext: ItemDisplayContext, + poseStack: PoseStack, + bufferSource: MultiBufferSource, + packedLight: Int, + packedOverlay: Int + ) { + val model = minecraft.modelManager.blockModelShaper.getBlockModel(MBlocks.FLUID_TANK.defaultBlockState()) - val fluidLevel = fluid.amount.toFloat() / tile.fluid.getTankCapacity(0).toFloat() + stack.getCapability(ForgeCapabilities.FLUID_HANDLER_ITEM).ifPresentK { + renderFluidInTank(it, it.getFluidInTank(0), poseStack, bufferSource, packedLight, packedOverlay) + } - if (fluidLevel < 0.01f) - return + val hasFoil = stack.hasFoil() + val fabulous = displayContext == ItemDisplayContext.GUI + || displayContext.firstPerson() + || (stack.item is BlockItem && ((stack.item as BlockItem).block is HalfTransparentBlock || (stack.item as BlockItem).block is StainedGlassPaneBlock)) - 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 + for (renderPass in model.getRenderPasses(stack, fabulous)) { + for (renderType in renderPass.getRenderTypes(stack, fabulous)) { + val buffer = if (fabulous) ItemRenderer.getFoilBufferDirect(bufferSource, renderType, true, hasFoil) else ItemRenderer.getFoilBuffer(bufferSource, renderType, true, hasFoil) + minecraft.itemRenderer.renderModelLists(renderPass, stack, packedLight, packedOverlay, poseStack, buffer) + } + } + } + } - val interp = linearInterpolation(fluidLevel, sprite.v1, sprite.v0) - val v1 = linearInterpolation(fluidBottom, sprite.v1, sprite.v0) + private companion object { + val fluidTop = 13f / 16f + val fluidBottom = 3f / 16f + val fluidHeight = 10f / 16f + val fluidWidth = 15.8f / 16f -// val lightLevel = fluid.fluid.fluidType.getLightLevel(fluid) // 0-15 + val fluidPadding = (1f - fluidWidth) * .5f - val builder = bufferSource.getBuffer(Sheets.translucentCullBlockSheet()) + fun renderFluidInTank( + fluidHandler: IFluidHandler, + fluid: FluidStack, + poseStack: PoseStack, + bufferSource: MultiBufferSource, + packedLight: Int, + packedOverlay: Int + ) { + if (fluid.isEmpty) + return - poseStack.pushPose() - poseStack.translate(0f, fluidBottom + (if (gas) 1f - fluidLevel else 0f) * fluidHeight, 0f) + val fluidLevel = fluid.amount.toFloat() / fluidHandler.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 = bufferSource.getBuffer(Sheets.translucentCullBlockSheet()) - for (i in 0 .. 3) { poseStack.pushPose() + poseStack.translate(0f, fluidBottom + (if (gas) 1f - fluidLevel else 0f) * fluidHeight, 0f) - 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) + 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(packedOverlay).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(packedOverlay).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(packedOverlay).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(packedOverlay).uv2(packedLight).normal(0.0f, 1.0f, 0.0f).endVertex() + + poseStack.popPose() + } 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() + 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(packedOverlay).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(packedOverlay).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(packedOverlay).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(packedOverlay).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(packedOverlay).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(packedOverlay).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(packedOverlay).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(packedOverlay).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() } } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/item/FluidTankItem.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/item/FluidTankItem.kt index 582c14b2a..911e44120 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/item/FluidTankItem.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/item/FluidTankItem.kt @@ -1,5 +1,6 @@ package ru.dbotthepony.mc.otm.item +import net.minecraft.client.renderer.BlockEntityWithoutLevelRenderer import net.minecraft.nbt.CompoundTag import net.minecraft.network.chat.Component import net.minecraft.world.InteractionResult @@ -8,14 +9,17 @@ import net.minecraft.world.item.ItemStack import net.minecraft.world.item.TooltipFlag import net.minecraft.world.item.context.UseOnContext import net.minecraft.world.level.Level +import net.minecraftforge.client.extensions.common.IClientItemExtensions import net.minecraftforge.common.capabilities.ForgeCapabilities import net.minecraftforge.common.capabilities.ICapabilityProvider import ru.dbotthepony.mc.otm.block.decorative.FluidTankBlock import ru.dbotthepony.mc.otm.block.entity.decorative.FluidTankBlockEntity import ru.dbotthepony.mc.otm.capability.fluid.BlockMatteryFluidHandler import ru.dbotthepony.mc.otm.capability.fluidLevel +import ru.dbotthepony.mc.otm.client.render.blockentity.FluidTankRenderer import ru.dbotthepony.mc.otm.core.TranslatableComponent import ru.dbotthepony.mc.otm.core.ifPresentK +import java.util.function.Consumer import java.util.function.IntSupplier class FluidTankItem(block: FluidTankBlock, properties: Properties, val capacity: IntSupplier) : BlockItem(block, properties) { @@ -54,4 +58,14 @@ class FluidTankItem(block: FluidTankBlock, properties: Properties, val capacity: it.fluidLevel(pTooltip) } } + + override fun initializeClient(consumer: Consumer) { + super.initializeClient(consumer) + + consumer.accept(object : IClientItemExtensions { + override fun getCustomRenderer(): BlockEntityWithoutLevelRenderer { + return FluidTankRenderer.FluidTankItemRenderer + } + }) + } } diff --git a/src/main/resources/assets/overdrive_that_matters/models/item/fluid_tank.json b/src/main/resources/assets/overdrive_that_matters/models/item/fluid_tank.json new file mode 100644 index 000000000..ee9352db8 --- /dev/null +++ b/src/main/resources/assets/overdrive_that_matters/models/item/fluid_tank.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:builtin/entity", + "display": { + "thirdperson_righthand": { + "rotation": [75, 45, 2], + "translation": [0, 2.75, 0], + "scale": [0.375, 0.375, 0.375] + }, + "thirdperson_lefthand": { + "rotation": [75, 45, 0], + "translation": [0, 2.5, 0], + "scale": [0.375, 0.375, 0.375] + }, + "firstperson_righthand": { + "rotation": [0, 45, 0], + "scale": [0.4, 0.4, 0.4] + }, + "firstperson_lefthand": { + "rotation": [0, 225, 0], + "scale": [0.4, 0.4, 0.4] + }, + "ground": { + "translation": [0, 3, 0], + "scale": [0.25, 0.25, 0.25] + }, + "gui": { + "rotation": [30, 225, 0], + "scale": [0.625, 0.625, 0.625] + }, + "fixed": { + "scale": [0.5, 0.5, 0.5] + } + } +} \ No newline at end of file