1+ package dev .ryanhcode .sable .mixinhelpers .loaded_chunk_debug ;
2+
3+ import com .mojang .blaze3d .vertex .PoseStack ;
4+ import com .mojang .blaze3d .vertex .VertexConsumer ;
5+ import dev .ryanhcode .sable .mixinterface .loaded_chunk_debug .DebugChunkProviderAttachments ;
6+ import dev .ryanhcode .sable .mixinterface .loaded_chunk_debug .DebugLevelChunkExtension ;
7+ import net .minecraft .client .Minecraft ;
8+ import net .minecraft .client .multiplayer .ClientLevel ;
9+ import net .minecraft .client .renderer .MultiBufferSource ;
10+ import net .minecraft .client .renderer .RenderType ;
11+ import net .minecraft .util .Mth ;
12+ import net .minecraft .world .entity .Entity ;
13+ import net .minecraft .world .level .ChunkPos ;
14+ import net .minecraft .world .level .chunk .LevelChunk ;
15+ import org .jetbrains .annotations .ApiStatus ;
16+ import org .joml .Matrix4f ;
17+
18+ @ ApiStatus .Internal
19+ public class SableChunkDebugRenderer {
20+
21+ public static void render (final PoseStack poseStack , final MultiBufferSource bufferSource , final double camX , final double camY , final double camZ ) {
22+ final long time = System .currentTimeMillis ();
23+
24+ final Minecraft minecraft = Minecraft .getInstance ();
25+ final Entity entity = minecraft .gameRenderer .getMainCamera ().getEntity ();
26+ final VertexConsumer builder = bufferSource .getBuffer (RenderType .debugLineStrip (1.0F ));
27+ final Matrix4f pose = poseStack .last ().pose ();
28+
29+ final ClientLevel level = minecraft .level ;
30+ final int minBuildHeight = level .getMinBuildHeight ();
31+ final int maxBuildHeight = level .getMaxBuildHeight ();
32+
33+ final DebugChunkProviderAttachments attachments = (DebugChunkProviderAttachments ) level .getChunkSource ();
34+ for (final LevelChunk chunk : attachments .sable$loadedChunks ()) {
35+ final ChunkPos pos = chunk .getPos ();
36+ final float diff = Mth .clamp (time - ((DebugLevelChunkExtension ) chunk ).sable$getLastUpdate (), 0 , 1000 ) / 1000.0F ;
37+ final float red = 1.0F - diff ;
38+ final float blue = 0.0F ;
39+
40+ final float x = (float ) (pos .getMinBlockX () - camX );
41+ final float z = (float ) (pos .getMinBlockZ () - camZ );
42+ float y = (float ) (minBuildHeight - camY );
43+ if (camY > minBuildHeight ) {
44+ y += (10 * ((1 - diff ) / 100 ));
45+ } else {
46+ y -= (10 * ((1 - diff ) / 100 ));
47+ }
48+ float y1 = (float ) (maxBuildHeight - camY );
49+ if (camY < maxBuildHeight ) {
50+ y1 -= (10 * ((1 - diff ) / 100 ));
51+ } else {
52+ y1 += (10 * ((1 - diff ) / 100 ));
53+ }
54+ builder .addVertex (pose , x , y , z ).setColor (red , diff , blue , 0.0F );
55+
56+ builder .addVertex (pose , x , y , z ).setColor (red , diff , blue , 1.0F );
57+ builder .addVertex (pose , x + 16 , y , z ).setColor (red , diff , blue , 1.0F );
58+ builder .addVertex (pose , x + 16 , y , z + 16 ).setColor (red , diff , blue , 1.0F );
59+ builder .addVertex (pose , x , y , z + 16 ).setColor (red , diff , blue , 1.0F );
60+
61+ builder .addVertex (pose , x , y , z ).setColor (red , diff , blue , 0.0F );
62+
63+ y = y1 ;
64+ builder .addVertex (pose , x , y , z ).setColor (red , diff , blue , 0.0F );
65+
66+ builder .addVertex (pose , x , y , z ).setColor (red , diff , blue , 1.0F );
67+ builder .addVertex (pose , x + 16 , y , z ).setColor (red , diff , blue , 1.0F );
68+ builder .addVertex (pose , x + 16 , y , z + 16 ).setColor (red , diff , blue , 1.0F );
69+ builder .addVertex (pose , x , y , z + 16 ).setColor (red , diff , blue , 1.0F );
70+
71+ builder .addVertex (pose , x , y , z ).setColor (red , diff , blue , 0.0F );
72+ }
73+
74+ final ChunkPos ckPos = entity .chunkPosition ();
75+ final float x = (float ) (ckPos .x * 16 - camX );
76+ float y = (float ) (minBuildHeight - camY );
77+ float y1 = (float ) (maxBuildHeight - camY );
78+ final float z = (float ) (ckPos .z * 16 - camZ );
79+
80+ for (int xO = 0 ; xO < 2 ; xO ++) {
81+ for (int zO = 0 ; zO < 2 ; zO ++) {
82+ builder .addVertex (pose , x + xO * 16 , y , z + zO * 16 ).setColor (1 , 1 , 0.0F , 0.0F );
83+
84+ builder .addVertex (pose , x + xO * 16 , y , z + zO * 16 ).setColor (1 , 1 , 0.0F , 1.0F );
85+ builder .addVertex (pose , x + xO * 16 , y1 , z + zO * 16 ).setColor (1 , 1 , 0.0F , 1.0F );
86+
87+ builder .addVertex (pose , x + xO * 16 , y1 , z + zO * 16 ).setColor (1 , 1 , 0.0F , 0.0F );
88+ }
89+ }
90+
91+ y = minBuildHeight ;
92+ y = ((int ) (y / 16 )) * 16 ;
93+ y1 = maxBuildHeight ;
94+
95+ for (int yO = (int ) y ; yO <= y1 + 1 ; yO += 16 ) {
96+ builder .addVertex (pose , x , (float ) (yO - camY ), z ).setColor (0 , 0 , 1.0F , 0.0F );
97+
98+ builder .addVertex (pose , x , (float ) (yO - camY ), z ).setColor (0 , 0 , 1.0F , 1.0F );
99+ builder .addVertex (pose , x + 16 , (float ) (yO - camY ), z ).setColor (0 , 0 , 1.0F , 1.0F );
100+ builder .addVertex (pose , x + 16 , (float ) (yO - camY ), z + 16 ).setColor (0 , 0 , 1.0F , 1.0F );
101+ builder .addVertex (pose , x , (float ) (yO - camY ), z + 16 ).setColor (0 , 0 , 1.0F , 1.0F );
102+ builder .addVertex (pose , x , (float ) (yO - camY ), z ).setColor (0 , 0 , 1.0F , 1.0F );
103+
104+ builder .addVertex (pose , x , (float ) (yO - camY ), z ).setColor (0 , 0 , 1.0F , 0.0F );
105+ }
106+ }
107+ }
0 commit comments