1+ package me.znepb.roadworks.render.attachments
2+
3+ import me.znepb.roadworks.RoadworksMain
4+ import me.znepb.roadworks.attachment.AttachmentPosition
5+ import me.znepb.roadworks.container.AttachmentContainerBlockEntity
6+ import me.znepb.roadworks.sign.RoadSignAttachment
7+ import me.znepb.roadworks.sign.RouteShieldAttachment
8+ import me.znepb.roadworks.util.Charset
9+ import me.znepb.roadworks.util.RenderUtils
10+ import net.minecraft.client.render.VertexConsumer
11+ import net.minecraft.client.render.VertexConsumerProvider
12+ import net.minecraft.client.util.math.MatrixStack
13+ import net.minecraft.util.Identifier
14+ import org.joml.Vector3d
15+
16+ class RouteShieldAttachmentRenderer : AttachmentRenderer <RouteShieldAttachment > {
17+ companion object {
18+ val FRONT_TEXTURE = RoadworksMain .ModId (" textures/block/signs/route_shield.png" )
19+ val BACK_TEXTURE = RoadworksMain .ModId (" textures/block/signs/back_large_square.png" )
20+ val NUMBERS_TEXTURE = RoadworksMain .ModId (" textures/block/signs/highway_shield_numbers.png" )
21+ }
22+
23+ override fun render (
24+ attachment : RouteShieldAttachment ,
25+ blockEntity : AttachmentContainerBlockEntity ,
26+ tickDelta : Float ,
27+ matrices : MatrixStack ,
28+ vertexConsumers : VertexConsumerProvider ,
29+ light : Int ,
30+ overlay : Int ,
31+ offset : Vector3d
32+ ) {
33+ val number = attachment.number
34+
35+ // Get size of contents
36+ val width = if (number < 100 ) 21.0 else 14.0
37+ val renderedCharWidth = if (number < 100 ) 15.0 else 10.0
38+ val height = if (number < 100 ) 21.0 else 14.0
39+ val charOffset = if (number < 10 ) 1 else if (number < 100 ) 3 else 2
40+ val pixelCount = number.toString().length * renderedCharWidth
41+
42+ val offsetPos = 0.0
43+
44+ val finalOffset = offset.add(Vector3d (0.0 , offsetPos, 0.0078125 ))
45+
46+ // Prepare matrices
47+ matrices.push()
48+ matrices.translate(0.5F , 0.5F , 0.5F )
49+ matrices.multiply(attachment.facing.rotationQuaternion.rotateXYZ((Math .PI / 2 ).toFloat(), Math .PI .toFloat(), Math .PI .toFloat()))
50+ matrices.translate(- 0.5F , - 0.5F , - 0.5F )
51+ matrices.translate(finalOffset.x, finalOffset.y, finalOffset.z)
52+
53+ // Render sign background
54+ val buffer: VertexConsumer = vertexConsumers.getBuffer(RenderLayers .getRenderLayer(FRONT_TEXTURE ))
55+ val matrix = matrices.peek().positionMatrix
56+ RenderUtils .drawSquare(
57+ 0F , 0F , 0.501F , 0F , 0F , 64F , 64F ,
58+ 64 , 64 , 64F , 64F ,
59+ 64 , 64 , buffer, matrix, light, overlay
60+ )
61+
62+ // Render sign text
63+ val charsetBuffer: VertexConsumer = vertexConsumers.getBuffer(RenderLayers .getRenderLayer(NUMBERS_TEXTURE ))
64+ var x = 32.0 - (pixelCount / 2 ) - charOffset
65+ number.toString().forEach {
66+ val num = it.digitToIntOrNull()?.toDouble()
67+
68+ if (num != null )
69+ RenderUtils .drawSquare(
70+ x.toFloat(), 32F - (height / 2 ).toFloat(), 0.51F , (num * width).toFloat(), if (number < 100 ) 14F else 0F , width.toFloat(), height.toFloat(),
71+ 64 , 64 , width.toFloat(), height.toFloat(),
72+ 256 , 256 , charsetBuffer, matrix, light, overlay
73+ )
74+
75+ x + = (width - charOffset)
76+ }
77+
78+ matrices.pop()
79+
80+ // Render sign back
81+ matrices.push()
82+
83+ matrices.translate(0.5F , 0.5F , 0.5F )
84+ matrices.multiply(attachment.facing.rotationQuaternion.rotateXYZ((Math .PI / 2 ).toFloat(), 0.0F , Math .PI .toFloat()))
85+ matrices.translate(- 0.5F , - 0.5F , - 0.5F )
86+ matrices.translate(finalOffset.x, finalOffset.y, - finalOffset.z)
87+
88+ val backBuffer: VertexConsumer = vertexConsumers.getBuffer(RenderLayers .getRenderLayer(BACK_TEXTURE ))
89+ val backMatrix = matrices.peek().positionMatrix
90+ RenderUtils .drawSquare(
91+ 0F , 0F , 0.501F , 0F , 0F , 64F , 64F ,
92+ 64 , 64 , 64F , 64F ,
93+ 64 , 64 , backBuffer, backMatrix, light, overlay
94+ )
95+
96+ matrices.pop()
97+ }
98+ }
0 commit comments