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 5da1148..1b959e4 100644 Binary files a/src/main/resources/assets/neocomputers/textures/block/case_front.png and b/src/main/resources/assets/neocomputers/textures/block/case_front.png differ