11package falseresync .vivatech .client .rendering .world ;
22
33import falseresync .vivatech .client .VivatechClient ;
4+ import falseresync .vivatech .client .rendering .RenderingUtil ;
5+ import falseresync .vivatech .client .wire .VivatechWireParameters ;
6+ import falseresync .vivatech .client .wire .WireParameters ;
47import net .fabricmc .fabric .api .client .rendering .v1 .WorldRenderContext ;
58import net .fabricmc .fabric .api .client .rendering .v1 .WorldRenderEvents ;
69import net .minecraft .client .render .*;
7- import net .minecraft .client .texture .Sprite ;
8- import net .minecraft .client .texture .SpriteAtlasTexture ;
9- import net .minecraft .client .util .SpriteIdentifier ;
1010import net .minecraft .util .Colors ;
11- import net .minecraft .util .Util ;
1211import net .minecraft .util .math .BlockPos ;
1312import net .minecraft .util .math .Direction ;
1413import org .joml .Matrix4f ;
1514import org .joml .Vector3f ;
1615
17- import java .util .Random ;
18- import java .util .function .Function ;
19-
20- import static falseresync .vivatech .common .Vivatech .vtId ;
21-
2216public class WireRenderer implements WorldRenderEvents .AfterEntities {
23- private static final Random RANDOM = new Random ();
24- private static final float SEGMENT_SIZE = 1 / 32f ;
25- private static final float SEGMENT_SHIFT = 1 / 64f ;
26-
27- private static final Vector3f VERTICAL_SEGMENT_NORMAL = Direction .NORTH .getUnitVector ();
28- private static final Vector3f VERTICAL_SEGMENT_SHIFT = new Vector3f (SEGMENT_SHIFT , 0 , 0 );
29- private static final Vector3f NEG_VERTICAL_SEGMENT_SHIFT = new Vector3f (-SEGMENT_SHIFT , 0 , 0 );
30-
17+ private static final Vector3f VERTICAL_SEGMENT_NORMAL = Direction .NORTH .getUnitVector ();//
3118 private static final Vector3f HORIZONTAL_SEGMENT_NORMAL = Direction .UP .getUnitVector ();
32- private static final Vector3f HORIZONTAL_SEGMENT_SHIFT = new Vector3f (0 , SEGMENT_SHIFT , 0 );
33- private static final Vector3f NEG_HORIZONTAL_SEGMENT_SHIFT = new Vector3f (0 , -SEGMENT_SHIFT , 0 );
34-
3519 private static final int TINT = Colors .WHITE ;
3620 private static final int OVERLAY = OverlayTexture .DEFAULT_UV ;
3721
38- private static final SpriteIdentifier SPRITE_ID = new SpriteIdentifier (SpriteAtlasTexture .BLOCK_ATLAS_TEXTURE , vtId ("block/wire" ));
39- private Sprite sprite ;
40- private float [] defaultUv ;
41- private float segmentWidthOnAtlas ;
42- private float segmentHeightOnAtlas ;
43- private final Function <Integer , float []> randomizedUv = Util .memoize (memoizationKey -> {
44- var x = RANDOM .nextInt (8 );
45- var y = RANDOM .nextInt (8 );
46- return new float [] {
47- defaultUv [0 ] + segmentWidthOnAtlas * x ,
48- defaultUv [0 ] + segmentWidthOnAtlas * (x + 1 ),
49- defaultUv [2 ] + segmentHeightOnAtlas * y ,
50- defaultUv [2 ] + segmentHeightOnAtlas * (y + 1 ),
51- };
52- });
53-
5422 @ Override
5523 public void afterEntities (WorldRenderContext context ) {
5624 var wires = VivatechClient .getClientWireManager ().getWires (context .world ().getRegistryKey ());
5725 if (wires .isEmpty ()) {
5826 return ;
5927 }
6028
61- if (sprite == null ) {
62- sprite = SPRITE_ID .getSprite ();
63- defaultUv = new float [] {
64- sprite .getMinU (), sprite .getMaxU (), sprite .getMinV (), sprite .getMaxV ()
65- };
66- segmentWidthOnAtlas = (defaultUv [1 ] - defaultUv [0 ]) / 8f ;
67- segmentHeightOnAtlas = (defaultUv [3 ] - defaultUv [2 ]) / 8f ;
68- }
69-
7029 var matrices = context .matrixStack ();
71- var buffer = sprite .getTextureSpecificVertexConsumer (context .consumers ().getBuffer (RenderLayer .getCutout ()));
7230 var cameraPos = context .camera ().getPos ();
7331
7432 for (var wire : wires ) {
33+ var parameters = VivatechWireParameters .get (wire );
34+ var buffer = parameters .getSprite ().getTextureSpecificVertexConsumer (context .consumers ().getBuffer (RenderLayer .getCutout ()));
35+
7536 var wireEnd = wire .end ().sub (wire .start (), new Vector3f ());
7637 var light = WorldRenderer .getLightmapCoordinates (context .world (), BlockPos .ofFloored (wire .middle ().x , wire .middle ().y , wire .middle ().z ));
7738
@@ -84,25 +45,25 @@ public void afterEntities(WorldRenderContext context) {
8445 var direction = wireEnd .normalize (new Vector3f ());
8546
8647 float length = wireEnd .length ();
87- int segmentCount = (int ) (length / SEGMENT_SIZE );
48+ int segmentCount = (int ) (length / parameters . getSegmentSize () );
8849
8950 if (direction .x == 0 && direction .z == 0 ) {
90- drawVerticalWire (wireEnd , segmentCount , buffer , positionMatrix , light );
51+ drawVerticalWire (parameters , wireEnd , segmentCount , buffer , positionMatrix , light );
9152 } else {
92- drawHorizontalWire (direction , wireEnd , segmentCount , length , buffer , positionMatrix , light );
53+ drawHorizontalWire (parameters , direction , wireEnd , segmentCount , length , buffer , positionMatrix , light );
9354 }
9455
9556 matrices .pop ();
9657 }
9758 }
9859
99- private void drawVerticalWire (Vector3f wireEnd , int segmentCount , VertexConsumer buffer , Matrix4f positionMatrix , int light ) {
60+ private void drawVerticalWire (WireParameters parameters , Vector3f wireEnd , int segmentCount , VertexConsumer buffer , Matrix4f positionMatrix , int light ) {
10061 var tangent = new Vector3f (VERTICAL_SEGMENT_NORMAL );
101- var tangentialHalfSize = tangent .mul (SEGMENT_SIZE / 2f , new Vector3f ());
62+ var tangentialHalfSize = tangent .mul (parameters . getSegmentSize () / 2f , new Vector3f ());
10263 var stepY = new Vector3f (0 , wireEnd .y / segmentCount , 0 );
10364
104- var segmentAVertices = buildInitialSegmentVertices (tangentialHalfSize , VERTICAL_SEGMENT_SHIFT , stepY );
105- var segmentBVertices = buildInitialSegmentVertices (tangentialHalfSize , NEG_VERTICAL_SEGMENT_SHIFT , stepY );
65+ var segmentAVertices = buildInitialSegmentVertices (tangentialHalfSize , new Vector3f ( parameters . getSegmentSize () / 2 , 0 , 0 ) , stepY );
66+ var segmentBVertices = buildInitialSegmentVertices (tangentialHalfSize , new Vector3f (- parameters . getSegmentSize () / 2 , 0 , 0 ) , stepY );
10667
10768 for (int segmentNo = 0 ; segmentNo < segmentCount ; segmentNo ++) {
10869 for (var segmentVertex : segmentAVertices ) {
@@ -112,51 +73,43 @@ private void drawVerticalWire(Vector3f wireEnd, int segmentCount, VertexConsumer
11273 segmentVertex .add (stepY );
11374 }
11475
115- var uv = randomizedUv . apply (segmentNo );
76+ var uv = parameters . getUv (segmentNo );
11677 drawSegment (buffer , positionMatrix , segmentAVertices , uv , TINT , light , OVERLAY , VERTICAL_SEGMENT_NORMAL );
11778 drawSegment (buffer , positionMatrix , segmentBVertices , uv , TINT , light , OVERLAY , VERTICAL_SEGMENT_NORMAL );
11879 }
11980 }
12081
121- private void drawHorizontalWire (Vector3f direction , Vector3f wireEnd , int segmentCount , float length , VertexConsumer buffer , Matrix4f positionMatrix , int light ) {
82+ private void drawHorizontalWire (WireParameters parameters , Vector3f direction , Vector3f wireEnd , int segmentCount , float length , VertexConsumer buffer , Matrix4f positionMatrix , int light ) {
12283 var tangent = new Vector3f (direction .x , 0 , direction .z ).normalize (new Vector3f ()).cross (HORIZONTAL_SEGMENT_NORMAL );
123- var tangentialHalfSize = tangent .mul (SEGMENT_SIZE / 2f , new Vector3f ());
84+ var tangentialHalfSize = tangent .mul (parameters . getSegmentSize () / 2f , new Vector3f ());
12485
125- var stepXZ = direction .mul (SEGMENT_SIZE , new Vector3f ());
86+ var stepXZ = direction .mul (parameters . getSegmentSize () , new Vector3f ());
12687 float stepY = wireEnd .y / segmentCount ;
12788
128- var segmentAVertices = buildInitialSegmentVertices (tangentialHalfSize , HORIZONTAL_SEGMENT_SHIFT , stepXZ );
129- var segmentBVertices = buildInitialSegmentVertices (tangentialHalfSize , NEG_HORIZONTAL_SEGMENT_SHIFT , stepXZ );
89+ var segmentAVertices = buildInitialSegmentVertices (tangentialHalfSize , new Vector3f ( 0 , parameters . getSegmentSize () / 2 , 0 ) , stepXZ );
90+ var segmentBVertices = buildInitialSegmentVertices (tangentialHalfSize , new Vector3f ( 0 , - parameters . getSegmentSize () / 2 , 0 ) , stepXZ );
13091
131- var startY = getSaggedY (0 , stepY , length );
92+ var startY = parameters . getSaggedY (0 , stepY , length );
13293 for (int segmentNo = 0 ; segmentNo < segmentCount ; segmentNo ++) {
133- var endY = getSaggedY (segmentNo + 1 , stepY , length );
134- advanceSegmentVertices (segmentAVertices , stepXZ , startY , endY , SEGMENT_SHIFT );
135- advanceSegmentVertices (segmentBVertices , stepXZ , startY , endY , -SEGMENT_SHIFT );
94+ var endY = parameters . getSaggedY (segmentNo + 1 , stepY , length );
95+ advanceSegmentVertices (segmentAVertices , stepXZ , startY , endY , parameters . getSegmentSize () / 2 );
96+ advanceSegmentVertices (segmentBVertices , stepXZ , startY , endY , -parameters . getSegmentSize () / 2 );
13697 startY = endY ;
13798
138- var uv = randomizedUv . apply (segmentNo );
99+ var uv = parameters . getUv (segmentNo );
139100 drawSegment (buffer , positionMatrix , segmentAVertices , uv , TINT , light , OVERLAY , HORIZONTAL_SEGMENT_NORMAL );
140101 drawSegment (buffer , positionMatrix , segmentBVertices , uv , TINT , light , OVERLAY , HORIZONTAL_SEGMENT_NORMAL );
141102 }
142103 }
143104
144- private float getSaggedY (float segmentNo , float stepY , float length ) {
145- return (float ) (stepY * segmentNo + getSaggingCoefficient (length ) * (Math .pow (2 * (SEGMENT_SIZE * segmentNo ) - length , 2 ) / Math .pow (length , 2 ) - 1 ));
146- }
147-
148- private float getSaggingCoefficient (float length ) {
149- return length < 5 ? 0.3f : 0.4f ;
150- }
151-
152- private void advanceSegmentVertices (Vector3f [] segmentAVertices , Vector3f stepXZ , float startY , float endY , float segmentRot ) {
105+ private void advanceSegmentVertices (Vector3f [] segmentAVertices , Vector3f stepXZ , float startY , float endY , float segmentShift ) {
153106 for (var segmentVertex : segmentAVertices ) {
154107 segmentVertex .add (stepXZ );
155108 }
156- segmentAVertices [0 ].y = startY + segmentRot ;
157- segmentAVertices [1 ].y = startY - segmentRot ;
158- segmentAVertices [2 ].y = endY - segmentRot ;
159- segmentAVertices [3 ].y = endY + segmentRot ;
109+ segmentAVertices [0 ].y = startY + segmentShift ;
110+ segmentAVertices [1 ].y = startY - segmentShift ;
111+ segmentAVertices [2 ].y = endY - segmentShift ;
112+ segmentAVertices [3 ].y = endY + segmentShift ;
160113 }
161114
162115 private Vector3f [] buildInitialSegmentVertices (Vector3f tangentialHalfSize , Vector3f segmentShift , Vector3f step ) {
@@ -170,20 +123,8 @@ private Vector3f[] buildInitialSegmentVertices(Vector3f tangentialHalfSize, Vect
170123
171124 private void drawSegment (VertexConsumer buffer , Matrix4f positionMatrix , Vector3f [] vertices , float [] uv , int tint , int light , int overlay , Vector3f normal ) {
172125 // Counter-clockwise - front-facing
173- drawQuad (buffer , positionMatrix , vertices [0 ], vertices [1 ], vertices [2 ], vertices [3 ], uv [0 ], uv [1 ], uv [2 ], uv [3 ], tint , light , overlay , normal );
126+ RenderingUtil . drawQuad (buffer , positionMatrix , vertices [0 ], vertices [1 ], vertices [2 ], vertices [3 ], uv [0 ], uv [1 ], uv [2 ], uv [3 ], tint , light , overlay , normal );
174127 // Clockwise - rear-facing
175- drawQuad (buffer , positionMatrix , vertices [0 ], vertices [3 ], vertices [2 ], vertices [1 ], uv [1 ], uv [0 ], uv [3 ], uv [2 ], tint , light , overlay , normal .negate (new Vector3f ()));
176- }
177-
178- private void drawQuad (VertexConsumer buffer , Matrix4f positionMatrix , Vector3f vUpLeft , Vector3f vDownLeft , Vector3f vDownRight , Vector3f vUpRight , float u1 , float u2 , float v1 , float v2 , int tint , int light , int overlay , Vector3f normal ) {
179- // Counter-clockwise https://stackoverflow.com/a/8142461
180- setupVertex (vUpLeft , buffer , positionMatrix , u1 , v1 , tint , light , overlay , normal );
181- setupVertex (vDownLeft , buffer , positionMatrix , u2 , v1 , tint , light , overlay , normal );
182- setupVertex (vDownRight , buffer , positionMatrix , u2 , v2 , tint , light , overlay , normal );
183- setupVertex (vUpRight , buffer , positionMatrix , u1 , v2 , tint , light , overlay , normal );
184- }
185-
186- private void setupVertex (Vector3f vertex , VertexConsumer buffer , Matrix4f positionMatrix , float u , float v , int tint , int light , int overlay , Vector3f normal ) {
187- buffer .vertex (positionMatrix , vertex .x , vertex .y , vertex .z ).texture (u , v ).color (tint ).light (light ).overlay (overlay ).normal (normal .x , normal .y , normal .z );
128+ RenderingUtil .drawQuad (buffer , positionMatrix , vertices [0 ], vertices [3 ], vertices [2 ], vertices [1 ], uv [1 ], uv [0 ], uv [3 ], uv [2 ], tint , light , overlay , normal .negate (new Vector3f ()));
188129 }
189130}
0 commit comments