CaseEntity renderer

This commit is contained in:
2026-04-24 15:07:12 +02:00
parent a8ca4b1e35
commit cbeb29eeb3
6 changed files with 82 additions and 32 deletions

View File

@@ -3,11 +3,13 @@ package org.neoflock.neocomputers.platforms.fabric.client;
import net.fabricmc.api.ClientModInitializer; import net.fabricmc.api.ClientModInitializer;
import net.minecraft.client.renderer.blockentity.BlockEntityRenderers; import net.minecraft.client.renderer.blockentity.BlockEntityRenderers;
import org.neoflock.neocomputers.entity.BlockEntities; import org.neoflock.neocomputers.entity.BlockEntities;
import org.neoflock.neocomputers.gui.render.CaseEntityRenderer;
import org.neoflock.neocomputers.gui.render.ScreenEntityRenderer; import org.neoflock.neocomputers.gui.render.ScreenEntityRenderer;
public class NeoComputersFabricClient implements ClientModInitializer { public class NeoComputersFabricClient implements ClientModInitializer {
@Override @Override
public void onInitializeClient() { public void onInitializeClient() {
BlockEntityRenderers.register(BlockEntities.INSTANCE.getSCREEN_ENTITY().get(), ScreenEntityRenderer::new); BlockEntityRenderers.register(BlockEntities.INSTANCE.getSCREEN_ENTITY().get(), ScreenEntityRenderer::new);
BlockEntityRenderers.register(BlockEntities.INSTANCE.getCASE_ENTITY().get(), CaseEntityRenderer::new);
} }
} }

View File

@@ -37,6 +37,7 @@ class CaseBlockEntity(blockPos: BlockPos, blockState: BlockState): NodeBlockEnti
val stacks: NonNullList<ItemStack> = NonNullList<ItemStack>.withSize(7, ItemStack.EMPTY) val stacks: NonNullList<ItemStack> = NonNullList<ItemStack>.withSize(7, ItemStack.EMPTY)
var isOn = false var isOn = false
var isDisking = false // TOOD: writing writers and reading readers
var err: String? = null var err: String? = null
var arch = "Lua 5.3" var arch = "Lua 5.3"
var soundInstance: SoundInstance? = null var soundInstance: SoundInstance? = null
@@ -49,12 +50,14 @@ class CaseBlockEntity(blockPos: BlockPos, blockState: BlockState): NodeBlockEnti
override fun encodeDownstreamData(packet: FriendlyByteBuf) { override fun encodeDownstreamData(packet: FriendlyByteBuf) {
super.encodeDownstreamData(packet) super.encodeDownstreamData(packet)
packet.writeBoolean(isOn) packet.writeBoolean(isOn)
packet.writeBoolean(isDisking)
packet.writeUtf(err ?: "") packet.writeUtf(err ?: "")
} }
override fun syncWithUpstream(packet: FriendlyByteBuf) { override fun syncWithUpstream(packet: FriendlyByteBuf) {
super.syncWithUpstream(packet) super.syncWithUpstream(packet)
setRunning(packet.readBoolean()) setRunning(packet.readBoolean())
isDisking = packet.readBoolean()
err = packet.readUtf().ifEmpty { null } err = packet.readUtf().ifEmpty { null }
} }

View File

@@ -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<CaseBlockEntity>{
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
}
}
}

View File

@@ -22,8 +22,6 @@ import org.neoflock.neocomputers.entity.ScreenEntity
class ScreenEntityRenderer(val context: BlockEntityRendererProvider.Context?) : BlockEntityRenderer<ScreenEntity> { // TODO: FORGE class ScreenEntityRenderer(val context: BlockEntityRendererProvider.Context?) : BlockEntityRenderer<ScreenEntity> { // TODO: FORGE
companion object {
val RENDER_TYPE: (ResourceLocation) -> RenderType = { t: ResourceLocation -> val RENDER_TYPE: (ResourceLocation) -> RenderType = { t: ResourceLocation ->
RenderType.create( RenderType.create(
"nc_screen", "nc_screen",
@@ -34,33 +32,21 @@ class ScreenEntityRenderer(val context: BlockEntityRendererProvider.Context?) :
setTextureState(RenderStateShard.TextureStateShard(t, false, false)) setTextureState(RenderStateShard.TextureStateShard(t, false, false))
.createCompositeState(false)) .createCompositeState(false))
} }
}
// var renderer: ChestRenderer
override fun render(entity: ScreenEntity, partialTick: Float, mat: PoseStack, bufferSource: MultiBufferSource, packedLight: Int, packedOverlay: Int) { override fun render(entity: ScreenEntity, partialTick: Float, mat: PoseStack, bufferSource: MultiBufferSource, packedLight: Int, packedOverlay: Int) {
var facing = entity.blockState.getValue(ScreenBlock.FACING) val 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
mat.pushPose() mat.pushPose()
handleDirection(facing, mat) handleDirection(facing, mat)
mat.translate(2 / 16f, 2 / 16f, 0.0001f) // am i epstein or am i just retarded 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 rendertype = RENDER_TYPE(ResourceLocation.fromNamespaceAndPath(NeoComputers.MODID, entity.bound))
val buffer = bufferSource.getBuffer(rendertype) val buffer = bufferSource.getBuffer(rendertype)
buffer.addVertex(mat.last(), 3 / 4f, 0f, 0f).setUv(1f, 1f) 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(), 3 / 4f, 3 / 4f, 0f).setUv(1f, 0f)
buffer.addVertex(mat.last(), 0f, 3 / 4f, 0f).setUv(0f, 0f) buffer.addVertex(mat.last(), 0f, 3 / 4f, 0f).setUv(0f, 0f)
buffer.addVertex(mat.last(), 0f, 0f, 0f).setUv(0f, 1f) buffer.addVertex(mat.last(), 0f, 0f, 0f).setUv(0f, 1f)
mat.popPose()
}
private fun addCommonSlop(vert: VertexConsumer, entity: ScreenEntity) { mat.popPose()
// vert.setUv2(15, 15).setColor(255, 255, 255, 255).setNormal()
} }
private fun handleDirection(facing: Direction, mat: PoseStack) { // TODO: separate up and down from cardinal directions 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) } 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)
// }
} }

View File

@@ -23,10 +23,6 @@ import java.util.Optional
class CaseScreen : GenericContainerScreen<CaseMenu> { class CaseScreen : GenericContainerScreen<CaseMenu> {
private val PCB: ResourceLocation = ResourceLocation.fromNamespaceAndPath(NeoComputers.MODID, "textures/gui/computer.png") 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: 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 private var btn: ImagerButton? = null
override fun shouldCenterTitle(): Boolean = false override fun shouldCenterTitle(): Boolean = false

Binary file not shown.

Before

Width:  |  Height:  |  Size: 634 B

After

Width:  |  Height:  |  Size: 4.6 KiB