From cbeb29eeb37d7aaf98718fee74e3fadd62a6ff31 Mon Sep 17 00:00:00 2001 From: mewhenthe Date: Fri, 24 Apr 2026 15:07:12 +0200 Subject: [PATCH] CaseEntity renderer --- .../client/NeoComputersFabricClient.java | 2 + .../neocomputers/entity/CaseBlockEntity.kt | 3 + .../gui/render/CaseEntityRenderer.kt | 66 ++++++++++++++++++ .../gui/render/ScreenEntityRenderer.kt | 39 +++-------- .../neocomputers/gui/screen/CaseScreen.kt | 4 -- .../textures/block/case_front.png | Bin 634 -> 4700 bytes 6 files changed, 82 insertions(+), 32 deletions(-) create mode 100644 src/main/kotlin/org/neoflock/neocomputers/gui/render/CaseEntityRenderer.kt diff --git a/src/main/java/org/neoflock/neocomputers/platforms/fabric/client/NeoComputersFabricClient.java b/src/main/java/org/neoflock/neocomputers/platforms/fabric/client/NeoComputersFabricClient.java index 11406f9..1541c36 100644 --- a/src/main/java/org/neoflock/neocomputers/platforms/fabric/client/NeoComputersFabricClient.java +++ b/src/main/java/org/neoflock/neocomputers/platforms/fabric/client/NeoComputersFabricClient.java @@ -3,11 +3,13 @@ package org.neoflock.neocomputers.platforms.fabric.client; import net.fabricmc.api.ClientModInitializer; import net.minecraft.client.renderer.blockentity.BlockEntityRenderers; import org.neoflock.neocomputers.entity.BlockEntities; +import org.neoflock.neocomputers.gui.render.CaseEntityRenderer; import org.neoflock.neocomputers.gui.render.ScreenEntityRenderer; public class NeoComputersFabricClient implements ClientModInitializer { @Override public void onInitializeClient() { BlockEntityRenderers.register(BlockEntities.INSTANCE.getSCREEN_ENTITY().get(), ScreenEntityRenderer::new); + BlockEntityRenderers.register(BlockEntities.INSTANCE.getCASE_ENTITY().get(), CaseEntityRenderer::new); } } diff --git a/src/main/kotlin/org/neoflock/neocomputers/entity/CaseBlockEntity.kt b/src/main/kotlin/org/neoflock/neocomputers/entity/CaseBlockEntity.kt index 66f5158..abfd5f9 100644 --- a/src/main/kotlin/org/neoflock/neocomputers/entity/CaseBlockEntity.kt +++ b/src/main/kotlin/org/neoflock/neocomputers/entity/CaseBlockEntity.kt @@ -37,6 +37,7 @@ class CaseBlockEntity(blockPos: BlockPos, blockState: BlockState): NodeBlockEnti val stacks: NonNullList = NonNullList.withSize(7, ItemStack.EMPTY) var isOn = false + var isDisking = false // TOOD: writing writers and reading readers var err: String? = null var arch = "Lua 5.3" var soundInstance: SoundInstance? = null @@ -49,12 +50,14 @@ class CaseBlockEntity(blockPos: BlockPos, blockState: BlockState): NodeBlockEnti override fun encodeDownstreamData(packet: FriendlyByteBuf) { super.encodeDownstreamData(packet) packet.writeBoolean(isOn) + packet.writeBoolean(isDisking) packet.writeUtf(err ?: "") } override fun syncWithUpstream(packet: FriendlyByteBuf) { super.syncWithUpstream(packet) setRunning(packet.readBoolean()) + isDisking = packet.readBoolean() err = packet.readUtf().ifEmpty { null } } diff --git a/src/main/kotlin/org/neoflock/neocomputers/gui/render/CaseEntityRenderer.kt b/src/main/kotlin/org/neoflock/neocomputers/gui/render/CaseEntityRenderer.kt new file mode 100644 index 0000000..42a224e --- /dev/null +++ b/src/main/kotlin/org/neoflock/neocomputers/gui/render/CaseEntityRenderer.kt @@ -0,0 +1,66 @@ +package org.neoflock.neocomputers.gui.render + +import com.mojang.blaze3d.vertex.DefaultVertexFormat +import com.mojang.blaze3d.vertex.PoseStack +import com.mojang.blaze3d.vertex.VertexConsumer +import com.mojang.blaze3d.vertex.VertexFormat +import com.mojang.math.Axis +import net.minecraft.client.renderer.MultiBufferSource +import net.minecraft.client.renderer.RenderStateShard +import net.minecraft.client.renderer.RenderType +import net.minecraft.client.renderer.blockentity.BlockEntityRenderer +import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider +import net.minecraft.core.Direction +import org.neoflock.neocomputers.NeoComputers +import org.neoflock.neocomputers.block.CaseBlock +import org.neoflock.neocomputers.entity.CaseBlockEntity + +class CaseEntityRenderer(private val context: BlockEntityRendererProvider.Context?) : BlockEntityRenderer{ + + val OFF = 0xFF5F855E.toInt() + val GREEN = 0xFF4EDC5E.toInt() + val RED = 0xFFff102B.toInt() + + val BLINKTIME: Long = 10 // in ticks + + val RENDER_TYPE = RenderType.create("nc_case", DefaultVertexFormat.POSITION_COLOR, VertexFormat.Mode.QUADS, + RenderType.TRANSIENT_BUFFER_SIZE, RenderType.CompositeState.builder() + .setShaderState(RenderStateShard.POSITION_COLOR_SHADER) + .createCompositeState(false)) + + override fun render(ent: CaseBlockEntity, partialTick: Float, mat: PoseStack, bufferSource: MultiBufferSource, packedLight: Int, packedOverlay: Int) { + val buffer = bufferSource.getBuffer(RENDER_TYPE); + + mat.pushPose() + handleDirection(ent.blockState.getValue(CaseBlock.FACING), mat) + + mat.translate(5/16F, 14/16F, 0.0001F) + if (ent.isOn) drawLED(buffer, mat.last(), 3F) + else if (ent.getLastError() != null) { // if else hell + if ((ent.level!!.dayTime/BLINKTIME) % 2 == 1.toLong()) drawLED(buffer, mat.last(), 3F, RED) + else drawLED(buffer, mat.last(), 3F, OFF) + } else drawLED(buffer, mat.last(), 3F, OFF) + + mat.translate(6/16F, 0F, 0F) + drawLED(buffer, mat.last(), 2F, if (ent.isDisking) GREEN else OFF) + + mat.popPose() + + } + private fun drawLED(buffer: VertexConsumer, mat: PoseStack.Pose, width: Float, color: Int = GREEN) { + buffer.addVertex(mat, width/16F, 0F, 0F).setColor(color) + buffer.addVertex(mat, width/16F, 1/16F, 0F).setColor(color) + buffer.addVertex(mat, 0F, 1/16F, 0F).setColor(color) + buffer.addVertex(mat, 0F, 0F, 0F).setColor(color) + } + + private fun handleDirection(facing: Direction, mat: PoseStack) { + when (facing) { + Direction.SOUTH -> { mat.translate(0F, 0F, 1F) } + Direction.EAST -> { mat.mulPose(Axis.YP.rotationDegrees(90F)); mat.translate(-1F, 0F, 1F) } + Direction.WEST -> { mat.mulPose(Axis.YN.rotationDegrees(90F)); } + Direction.NORTH -> {mat.mulPose(Axis.YP.rotationDegrees(180F)); mat.translate(-1F, 0F, 0F) } + else -> return + } + } +} diff --git a/src/main/kotlin/org/neoflock/neocomputers/gui/render/ScreenEntityRenderer.kt b/src/main/kotlin/org/neoflock/neocomputers/gui/render/ScreenEntityRenderer.kt index c98ba43..45560e4 100644 --- a/src/main/kotlin/org/neoflock/neocomputers/gui/render/ScreenEntityRenderer.kt +++ b/src/main/kotlin/org/neoflock/neocomputers/gui/render/ScreenEntityRenderer.kt @@ -22,45 +22,31 @@ import org.neoflock.neocomputers.entity.ScreenEntity class ScreenEntityRenderer(val context: BlockEntityRendererProvider.Context?) : BlockEntityRenderer { // TODO: FORGE - - companion object { - val RENDER_TYPE: (ResourceLocation) -> RenderType = { t: ResourceLocation -> - RenderType.create( - "nc_screen", - DefaultVertexFormat.POSITION_TEX, - VertexFormat.Mode.QUADS, - RenderType.TRANSIENT_BUFFER_SIZE, RenderType.CompositeState.builder(). - setShaderState(RenderStateShard.POSITION_TEX_SHADER). - setTextureState(RenderStateShard.TextureStateShard(t, false, false)) - .createCompositeState(false)) - } + val RENDER_TYPE: (ResourceLocation) -> RenderType = { t: ResourceLocation -> + RenderType.create( + "nc_screen", + DefaultVertexFormat.POSITION_TEX, + VertexFormat.Mode.QUADS, + RenderType.TRANSIENT_BUFFER_SIZE, RenderType.CompositeState.builder(). + setShaderState(RenderStateShard.POSITION_TEX_SHADER). + setTextureState(RenderStateShard.TextureStateShard(t, false, false)) + .createCompositeState(false)) } - -// var renderer: ChestRenderer override fun render(entity: ScreenEntity, partialTick: Float, mat: PoseStack, bufferSource: MultiBufferSource, packedLight: Int, packedOverlay: Int) { - var facing = entity.blockState.getValue(ScreenBlock.FACING) - - var nx = if(facing==Direction.EAST) 1F else if (facing==Direction.WEST) -1F else 0F - var ny = if(facing==Direction.UP) 1F else if (facing==Direction.DOWN) -1F else 0F - var nz = if(facing==Direction.SOUTH) 1F else if (facing==Direction.EAST) -1F else 0F - + val facing = entity.blockState.getValue(ScreenBlock.FACING) mat.pushPose() handleDirection(facing, mat) mat.translate(2 / 16f, 2 / 16f, 0.0001f) // am i epstein or am i just retarded -// val rendertype = RENDER_TYPE(entity.node.address.toString(), ResourceLocation.fromNamespaceAndPath(NeoComputers.MODID, entity.bound)) val rendertype = RENDER_TYPE(ResourceLocation.fromNamespaceAndPath(NeoComputers.MODID, entity.bound)) val buffer = bufferSource.getBuffer(rendertype) buffer.addVertex(mat.last(), 3 / 4f, 0f, 0f).setUv(1f, 1f) buffer.addVertex(mat.last(), 3 / 4f, 3 / 4f, 0f).setUv(1f, 0f) buffer.addVertex(mat.last(), 0f, 3 / 4f, 0f).setUv(0f, 0f) buffer.addVertex(mat.last(), 0f, 0f, 0f).setUv(0f, 1f) - mat.popPose() - } - private fun addCommonSlop(vert: VertexConsumer, entity: ScreenEntity) { -// vert.setUv2(15, 15).setColor(255, 255, 255, 255).setNormal() + mat.popPose() } private fun handleDirection(facing: Direction, mat: PoseStack) { // TODO: separate up and down from cardinal directions @@ -73,7 +59,4 @@ class ScreenEntityRenderer(val context: BlockEntityRendererProvider.Context?) : Direction.DOWN -> { mat.mulPose(Axis.XP.rotationDegrees(90F)); mat.mulPose(Axis.ZN.rotationDegrees(180F)); mat.translate(-1F, -1F, 0F) } } } -// private fun handleDirection(ent: ScreenEntity, mat: PoseStack?) { -// `when`(ent.getBlockState().get) -// } } \ No newline at end of file diff --git a/src/main/kotlin/org/neoflock/neocomputers/gui/screen/CaseScreen.kt b/src/main/kotlin/org/neoflock/neocomputers/gui/screen/CaseScreen.kt index f608c14..c17a072 100644 --- a/src/main/kotlin/org/neoflock/neocomputers/gui/screen/CaseScreen.kt +++ b/src/main/kotlin/org/neoflock/neocomputers/gui/screen/CaseScreen.kt @@ -23,10 +23,6 @@ import java.util.Optional class CaseScreen : GenericContainerScreen { private val PCB: ResourceLocation = ResourceLocation.fromNamespaceAndPath(NeoComputers.MODID, "textures/gui/computer.png") private val BTN: ResourceLocation = ResourceLocation.fromNamespaceAndPath(NeoComputers.MODID, "textures/gui/button_power.png") -// private val BTN_ENABLED: ResourceLocation = ResourceLocation.fromNamespaceAndPath(NeoComputers.MODID, "textures/gui/button/power/enabled.png") // gonna do this later -// private val BTN_DISABLED: ResourceLocation = ResourceLocation.fromNamespaceAndPath(NeoComputers.MODID, "textures/gui/button/power/disabled.png") -// private val BTN_ENABLED_HOVER: ResourceLocation = ResourceLocation.fromNamespaceAndPath(NeoComputers.MODID, "textures/gui/button/power/enabled_hover.png") -// private val BTN_DISABLED_HOVER: ResourceLocation = ResourceLocation.fromNamespaceAndPath(NeoComputers.MODID, "textures/gui/power/disabled_hover.png") private var btn: ImagerButton? = null override fun shouldCenterTitle(): Boolean = false diff --git a/src/main/resources/assets/neocomputers/textures/block/case_front.png b/src/main/resources/assets/neocomputers/textures/block/case_front.png index 5da1148c336d94bbc4783d230f499abb189a1319..1b959e4ee7e4ba8b44354717ecaa1b1f7b85f13f 100644 GIT binary patch literal 4700 zcmeHKd2ADB7Pq@VXt=M`xg95vb39{vd`;q9wi7$C6W4K^iv-4VI7574PhxYlK(m3c zWvc+qE=4J{1px~Mb{Cc_TkZ<64FXD4pcD#}g$8I4LL6Hl-Oo-4iCSrewEZuZ#xwK2 z_kQoa-+SNFe9KKGh2z4b!Z{qyIK56|2KR})w^Xub+|T!T-8AE% z`0P9n#is%c&EW*TahfiTJH{XT?D5ptBXDcvGSqT=RP3P{OVf6%mVf{33_kY9hYJsH zZ`S9XqxaufF&?VkcK{jt)#}$D-k5ZCYH?il$Vcx#fhJYQJ(ra3Q@q*OE-Yw@Z+Q!v z8r%DbIzCswe#;$#*N!K}jEov3J=n7ULeul3S3E7BFDaRG=R(f?o0l?I9ZKvn>dsVY z2u^o$v*nH3U7uXhZ7wl)=x-(+Y+JNo?PB?PrfTw%k>xoY4!4C-t4(^f`b9Dzg^ssY z9x6VT8}s?Bb4A*;@l7e8w0(?S)N0vn#vcUJ--c6nw?4eOZ^FGERnHY}{)VGy`ou8wvh3W+->*5f{SQYf zMoi2by^FW<1FB1J4zE3NUbS%HXYbzswC7fD%=0-{Y>P{i-jf{Lyy@Qt!KBcwj~&!E*JJDoQGEyCsahPh#9jb zzxnP@M}EHQ-)qIaM~lO!FJAY?iU06MzSEhzt4HzOiTBQBai5(&+I=DAor0J(gLL5MyK4do-e zjE801E`AUbx49cxl|TU2`7h#gdW^;ac$crA1;7U!z&)@?h`>%KJlMj=YMTH^e?Y%# z;j@5E3Y#gPyU|Nf+9t}yCJu%mi2-|0qt_8iha_OiK{ga#1>o$r877XU_O95MEgbVA!VRtG-4Vz(HIO*uTcqt{xQ-`FeDaw z6r&`fwAthku8`UwR4$f7N~M&5M3jgo#8L@P(2_w=dY6yIT?7?`0^mXh;7DvTgg|X5 zq>v&?2vy1y5H6<)h!zoYRH+avBy#B>h*B>Dx)OH`jw%R60w_`h14EFNT2B$vw(iBu{@l~M^R>WevqXQjM8(1}4z5h9eJA@g8aFpvx& z77z9*00_xJE|}U&;jG(hal0KVK@fr;v>aGAg6%}&EUv*>3V3j&%ER3?OxG(h z@Jh2$iZw6yf}^rE7oq@<+O)KrJVp;D>hhd*wrhvhY~5NUso8$?Ab;(r z^DeH_j!C?2FGw17Z`(gEdZOmuJ-*3lUTnCzS#2KwMDTr$GtaZ|+KSQpZ*5msS&@%+ zWam^(@}BBkbnC&myoF1$Y}VQSKTSz{l)L^+VAcmEH5IX^qZi~CR`&dL!=;M1& delta 310 zcmV-60m=T{B>Du9BqAAfMObuGZ)S9NVRB^vL1b@YWgtmyVP|DhWnpA_ami&ovjY$> z0e|pGL_t(|+7ysQcEmsoMAc~anAsj?o-i{rb8`P%q^+H#FTJV)C<`MB8UWSG#$d<2 zo4;%4m94G>F968!o=sI%rLm0IAH6 zdZg&`Y0B3cg5dbn?h|sy>$|e7U_dQ>a(_4{Lo=VAO z8)eyWA>B*uCt