22
22
23
23
package dev .galacticraft .machinelib .client .api .util ;
24
24
25
+ import org .joml .Matrix4f ;
26
+
27
+ import com .mojang .blaze3d .systems .RenderSystem ;
28
+ import com .mojang .blaze3d .vertex .BufferBuilder ;
29
+ import com .mojang .blaze3d .vertex .BufferUploader ;
30
+ import com .mojang .blaze3d .vertex .DefaultVertexFormat ;
31
+ import com .mojang .blaze3d .vertex .PoseStack ;
32
+ import com .mojang .blaze3d .vertex .Tesselator ;
33
+ import com .mojang .blaze3d .vertex .VertexFormat ;
34
+
25
35
import net .fabricmc .fabric .api .transfer .v1 .client .fluid .FluidVariantRendering ;
26
36
import net .fabricmc .fabric .api .transfer .v1 .fluid .FluidVariant ;
27
37
import net .fabricmc .fabric .api .transfer .v1 .fluid .FluidVariantAttributes ;
28
38
import net .minecraft .client .gui .GuiGraphics ;
39
+ import net .minecraft .client .renderer .GameRenderer ;
29
40
import net .minecraft .client .renderer .texture .TextureAtlasSprite ;
41
+ import net .minecraft .resources .ResourceLocation ;
30
42
import net .minecraft .util .FastColor ;
31
43
import net .minecraft .world .level .material .Fluids ;
32
44
@@ -49,17 +61,39 @@ public static void drawFluid(GuiGraphics graphics, int x, int y, int width, int
49
61
assert sprite != null ;
50
62
}
51
63
64
+ int tileWidth = 16 ;
65
+ int tileHeight = 16 ;
52
66
int fluidHeight = (int ) (((double ) available / (double ) capacity ) * height );
53
67
int startY = fillFromTop ? y : y + (height - fluidHeight );
68
+ int depth = startY + fluidHeight ;
69
+ float u0 = sprite .getU0 ();
70
+ float v0 = sprite .getV0 ();
54
71
55
- for (int splitX = 0 ; splitX < width ; splitX += Math .min (width , 16 )) {
56
- int realWidth = Math .min (width - splitX , 16 );
57
- for (int splitY = startY ; splitY < startY + fluidHeight ; splitY += realWidth ) {
58
- graphics .blit (x + splitX , splitY , 0 , realWidth , Math .min (realWidth , startY + fluidHeight - splitY ), sprite , r , g , b , 1.0f );
72
+ for (int splitX = 0 ; splitX < width ; splitX += tileWidth ) {
73
+ int realWidth = Math .min (width - splitX , tileWidth );
74
+ for (int splitY = startY ; splitY < depth ; splitY += tileHeight ) {
75
+ int realHeight = Math .min (depth - splitY , tileHeight );
76
+ float u1 = sprite .getU ((float ) realWidth / (float ) tileWidth );
77
+ float v1 = sprite .getV ((float ) realHeight / (float ) tileHeight );
78
+ innerBlit (graphics .pose (), sprite .atlasLocation (), x + splitX , x + splitX + realWidth , splitY , splitY + realHeight , 0 , u0 , u1 , v0 , v1 , r , g , b , 1.0f );
59
79
}
60
80
}
61
81
}
62
82
83
+ private static void innerBlit (PoseStack poseStack , ResourceLocation resourceLocation , int x0 , int x1 , int y0 , int y1 , int z , float u0 , float u1 , float v0 , float v1 , float r , float g , float b , float a ) {
84
+ RenderSystem .setShaderTexture (0 , resourceLocation );
85
+ RenderSystem .setShader (GameRenderer ::getPositionTexColorShader );
86
+ RenderSystem .enableBlend ();
87
+ Matrix4f matrix = poseStack .last ().pose ();
88
+ BufferBuilder bufferBuilder = Tesselator .getInstance ().begin (VertexFormat .Mode .QUADS , DefaultVertexFormat .POSITION_TEX_COLOR );
89
+ bufferBuilder .addVertex (matrix , (float )x0 , (float )y0 , (float )z ).setUv (u0 , v0 ).setColor (r , g , b , a );
90
+ bufferBuilder .addVertex (matrix , (float )x0 , (float )y1 , (float )z ).setUv (u0 , v1 ).setColor (r , g , b , a );
91
+ bufferBuilder .addVertex (matrix , (float )x1 , (float )y1 , (float )z ).setUv (u1 , v1 ).setColor (r , g , b , a );
92
+ bufferBuilder .addVertex (matrix , (float )x1 , (float )y0 , (float )z ).setUv (u1 , v0 ).setColor (r , g , b , a );
93
+ BufferUploader .drawWithShader (bufferBuilder .buildOrThrow ());
94
+ RenderSystem .disableBlend ();
95
+ }
96
+
63
97
public static void highlightElement (GuiGraphics graphics , int left , int top , int x , int y , int width , int height , int color ) {
64
98
color |= (0xFF << 24 );
65
99
color ^= (0b1110000 << 24 );
0 commit comments