2222import net .minecraft .client .renderer .texture .OverlayTexture ;
2323import net .minecraft .client .resources .model .BakedModel ;
2424import net .minecraft .core .BlockPos ;
25+ import net .minecraft .core .SectionPos ;
2526import net .minecraft .util .RandomSource ;
2627import net .minecraft .world .level .ChunkPos ;
2728import net .minecraft .world .level .Level ;
2829import net .minecraft .world .level .block .RenderShape ;
29- import net .minecraft .world .level .block .entity .BlockEntity ;
3030import net .minecraft .world .level .block .state .BlockState ;
31- import net .minecraft .world .level .levelgen .structure .BoundingBox ;
3231import net .minecraft .world .level .material .FluidState ;
3332
3433import net .minecraft .world .phys .AABB ;
3534import net .neoforged .neoforge .client .model .data .ModelData ;
3635
3736import org .joml .Vector3f ;
3837
39- import java .util .ArrayList ;
4038import java .util .HashMap ;
41- import java .util .List ;
4239import java .util .Map ;
4340import java .util .Set ;
41+ import java .util .function .Consumer ;
4442import java .util .stream .Collectors ;
4543
4644public class LevelBakery {
4745
4846 public static BakedLevel bakeVertices (Level level , AABB blockBoundaries , Vector3f cameraPosition ) {
4947
50- final var minChunk = WorldMath .minCornerChunk ( blockBoundaries );
51- final var maxChunk = WorldMath . maxCornerChunk ( blockBoundaries );
48+ final var allSections = WorldMath .sectionPositions ( level , blockBoundaries )
49+ . collect ( Collectors . toSet () );
5250
53- Set <ChunkPos > allChunks = ChunkPos .rangeClosed (minChunk , maxChunk ).collect (Collectors .toSet ());
51+ Map <SectionPos , BakedLevelSection > bakedSections = new Reference2ObjectArrayMap <>();
52+ for (var sectionPos : allSections ) {
5453
55- Map <ChunkPos , BakedLevelSection > bakedSections = new Reference2ObjectArrayMap <>();
56- for (ChunkPos chunkPos : allChunks ) {
57-
58- final AABB chunkArea = WorldMath .chunkAABB (level , chunkPos );
54+ final AABB chunkArea = WorldMath .sectionABB (sectionPos );
5955
6056 final SectionBufferBuilderPack blockPack = new SectionBufferBuilderPack ();
6157 final SectionBufferBuilderPack fluidPack = new SectionBufferBuilderPack ();
6258
6359 final Map <RenderType , BufferBuilder > blockBufferBuilders = new HashMap <>();
6460 final Map <RenderType , BufferBuilder > fluidBufferBuilders = new HashMap <>();
6561
66- final Reference2ObjectArrayMap <RenderType , VertexBuffer > blockGeometry = new Reference2ObjectArrayMap <>();
67- final Reference2ObjectArrayMap <RenderType , VertexBuffer > fluidGeometry = new Reference2ObjectArrayMap <>();
68-
69- final Reference2ObjectArrayMap <RenderType , MeshData .SortState > blockRenderSortStates = new Reference2ObjectArrayMap <>();
70- final Reference2ObjectArrayMap <RenderType , MeshData .SortState > fluidRenderSortStates = new Reference2ObjectArrayMap <>();
71-
72- final var SORTING = VertexSorting .byDistance (cameraPosition .x , cameraPosition .y , cameraPosition .z );
73-
7462 PoseStack pose = new PoseStack ();
7563 RandomSource random = RandomSource .createNewThreadLocalInstance ();
7664 BlockRenderDispatcher dispatcher = Minecraft .getInstance ().getBlockRenderer ();
@@ -81,15 +69,17 @@ public static BakedLevel bakeVertices(Level level, AABB blockBoundaries, Vector3
8169 createBlockGeometry (level , pos , pose , dispatcher , random , blockBufferBuilders , blockPack , renderer , fluidBufferBuilders );
8270 });
8371
84- sortGeometry (blockBufferBuilders , blockPack , SORTING , blockRenderSortStates , blockGeometry , fluidBufferBuilders ,
85- fluidRenderSortStates , fluidGeometry );
72+ final var sorting = VertexSorting .byDistance (cameraPosition .x , cameraPosition .y , cameraPosition .z );
73+
74+ final var blockVertices = buildSortedGeometryBuffers (blockPack , sorting , blockBufferBuilders );
75+ final var fluidVertices = buildSortedGeometryBuffers (fluidPack , sorting , fluidBufferBuilders );
8676
8777 final var bakedSection = new BakedLevelSection (blockPack , fluidPack ,
88- blockGeometry , fluidGeometry ,
89- blockRenderSortStates , fluidRenderSortStates ,
78+ blockVertices . buffers (), fluidVertices . buffers () ,
79+ blockVertices . meshStates (), fluidVertices . meshStates () ,
9080 chunkArea );
9181
92- bakedSections .put (chunkPos , bakedSection );
82+ bakedSections .put (sectionPos , bakedSection );
9383 }
9484
9585 return new BakedLevel (level , blockBoundaries , bakedSections );
@@ -139,39 +129,33 @@ private static void createBlockGeometry(Level level, BlockPos pos, PoseStack pos
139129
140130 pose .popPose ();
141131 ModelBlockRenderer .clearCache ();
142- }
143-
144- private static void sortGeometry (Map <RenderType , BufferBuilder > blockBufferBuilders , SectionBufferBuilderPack blockPack , VertexSorting SORTING , Reference2ObjectArrayMap <RenderType , MeshData .SortState > blockRenderSortStates , Reference2ObjectArrayMap <RenderType , VertexBuffer > blockGeometry , Map <RenderType , BufferBuilder > fluidBufferBuilders , Reference2ObjectArrayMap <RenderType , MeshData .SortState > fluidRenderSortStates , Reference2ObjectArrayMap <RenderType , VertexBuffer > fluidGeometry ) {
145- blockBufferBuilders .forEach ((renderType , builder ) -> {
146- final var buffer = builder .build ();
147- if (buffer == null ) return ;
148132
149- if (renderType .sortOnUpload ()) {
150- var state = buffer .sortQuads (blockPack .buffer (renderType ), SORTING );
151- blockRenderSortStates .put (renderType , state );
152- }
133+ // TODO: Make Result Record so this can be immutable
134+ }
153135
154- var vb = new VertexBuffer ( VertexBuffer . Usage . STATIC );
155- vb . bind ();
156- vb . upload ( buffer );
157- VertexBuffer . unbind ();
158- blockGeometry . put ( renderType , vb );
159- } );
136+ private static SortedGeometryBufferResult buildSortedGeometryBuffers ( SectionBufferBuilderPack blockPack ,
137+ VertexSorting sorting ,
138+ Map < RenderType , BufferBuilder > bufferBuilders
139+ ) {
140+ final var renderSortStates = new Reference2ObjectArrayMap < RenderType , MeshData . SortState >( );
141+ final var vertexBuffers = new Reference2ObjectArrayMap < RenderType , VertexBuffer >( );
160142
161- fluidBufferBuilders .forEach ((renderType , builder ) -> {
143+ bufferBuilders .forEach ((renderType , builder ) -> {
162144 final var buffer = builder .build ();
163145 if (buffer == null ) return ;
164146
165147 if (renderType .sortOnUpload ()) {
166- var state = buffer .sortQuads (blockPack .buffer (renderType ), SORTING );
167- fluidRenderSortStates .put (renderType , state );
148+ var state = buffer .sortQuads (blockPack .buffer (renderType ), sorting );
149+ renderSortStates .put (renderType , state );
168150 }
169151
170- var vb = new VertexBuffer (VertexBuffer .Usage .STATIC );
152+ VertexBuffer vb = new VertexBuffer (VertexBuffer .Usage .STATIC );
171153 vb .bind ();
172154 vb .upload (buffer );
173155 VertexBuffer .unbind ();
174- fluidGeometry .put (renderType , vb );
156+ vertexBuffers .put (renderType , vb );
175157 });
158+
159+ return new SortedGeometryBufferResult (vertexBuffers , renderSortStates );
176160 }
177161}
0 commit comments