11package net .vulkanmod .render .chunk .buffer ;
22
3+ import net .minecraft .world .phys .Vec3 ;
4+ import net .vulkanmod .Initializer ;
35import net .vulkanmod .render .PipelineManager ;
46import net .vulkanmod .render .chunk .ChunkArea ;
57import net .vulkanmod .render .chunk .RenderSection ;
68import net .vulkanmod .render .chunk .build .UploadBuffer ;
9+ import net .vulkanmod .render .chunk .cull .QuadFacing ;
710import net .vulkanmod .render .chunk .util .StaticQueue ;
811import net .vulkanmod .render .vertex .CustomVertexFormat ;
912import net .vulkanmod .render .vertex .TerrainRenderType ;
@@ -39,28 +42,49 @@ public DrawBuffers(int index, Vector3i origin, int minHeight) {
3942 }
4043
4144 public void upload (RenderSection section , UploadBuffer buffer , TerrainRenderType renderType ) {
42- DrawParameters drawParameters = section .getDrawParameters (renderType );
43- int vertexOffset = drawParameters .vertexOffset ;
44- int firstIndex = -1 ;
45+ var vertexBuffers = buffer .getVertexBuffers ();
46+
47+ if (buffer .indexOnly ) {
48+ DrawParameters drawParameters = section .getDrawParameters (renderType , QuadFacing .NONE .ordinal ());
4549
46- if (!buffer .indexOnly ) {
47- AreaBuffer .Segment segment = this .getAreaBufferOrAlloc (renderType ).upload (buffer .getVertexBuffer (), vertexOffset , drawParameters );
48- vertexOffset = segment .offset / VERTEX_SIZE ;
50+ AreaBuffer .Segment segment = this .indexBuffer .upload (buffer .getIndexBuffer (), drawParameters .firstIndex , drawParameters );
51+ drawParameters .firstIndex = segment .offset / INDEX_SIZE ;
4952
50- drawParameters .baseInstance = encodeSectionOffset (section .xOffset (), section .yOffset (), section .zOffset ());
53+ buffer .release ();
54+ return ;
5155 }
5256
53- if (!buffer .autoIndices ) {
54- if (this .indexBuffer == null )
57+ for (int i = 0 ; i < QuadFacing .COUNT ; i ++) {
58+ DrawParameters drawParameters = section .getDrawParameters (renderType , i );
59+ int vertexOffset = drawParameters .vertexOffset ;
60+ int firstIndex = -1 ;
61+ int indexCount = 0 ;
62+
63+ var vertexBuffer = vertexBuffers [i ];
64+
65+ if (vertexBuffer != null ) {
66+ AreaBuffer .Segment segment = this .getAreaBufferOrAlloc (renderType ).upload (vertexBuffer , vertexOffset , drawParameters );
67+ vertexOffset = segment .offset / VERTEX_SIZE ;
68+
69+ drawParameters .baseInstance = encodeSectionOffset (section .xOffset (), section .yOffset (), section .zOffset ());
70+ indexCount = vertexBuffer .limit () / VERTEX_SIZE * 6 / 4 ;
71+ }
72+
73+ if (i == QuadFacing .NONE .ordinal () && !buffer .autoIndices ) {
74+ if (this .indexBuffer == null ) {
5575 this .indexBuffer = new AreaBuffer (AreaBuffer .Usage .INDEX , 60000 , INDEX_SIZE );
76+ }
5677
57- AreaBuffer .Segment segment = this .indexBuffer .upload (buffer .getIndexBuffer (), drawParameters .firstIndex , drawParameters );
58- firstIndex = segment .offset / INDEX_SIZE ;
59- }
78+ AreaBuffer .Segment segment = this .indexBuffer .upload (buffer .getIndexBuffer (), drawParameters .firstIndex , drawParameters );
79+ firstIndex = segment .offset / INDEX_SIZE ;
80+ }
6081
61- drawParameters .indexCount = buffer .indexCount ;
62- drawParameters .firstIndex = firstIndex ;
63- drawParameters .vertexOffset = vertexOffset ;
82+ // drawParameters.indexCount = buffer.indexCount;
83+ drawParameters .firstIndex = firstIndex ;
84+ drawParameters .vertexOffset = vertexOffset ;
85+
86+ drawParameters .indexCount = indexCount ;
87+ }
6488
6589 buffer .release ();
6690 }
@@ -110,11 +134,11 @@ private void updateChunkAreaOrigin(VkCommandBuffer commandBuffer, Pipeline pipel
110134 vkCmdPushConstants (commandBuffer , pipeline .getLayout (), VK_SHADER_STAGE_VERTEX_BIT , 0 , byteBuffer );
111135 }
112136
113- public void buildDrawBatchesIndirect (IndirectBuffer indirectBuffer , StaticQueue <RenderSection > queue , TerrainRenderType terrainRenderType ) {
137+ public void buildDrawBatchesIndirect (Vec3 cameraPos , IndirectBuffer indirectBuffer , StaticQueue <RenderSection > queue , TerrainRenderType terrainRenderType ) {
114138
115139 try (MemoryStack stack = MemoryStack .stackPush ()) {
116140
117- ByteBuffer byteBuffer = stack .malloc (20 * queue .size ());
141+ ByteBuffer byteBuffer = stack .malloc (20 * queue .size () * 7 );
118142 long bufferPtr = MemoryUtil .memAddress0 (byteBuffer );
119143
120144 boolean isTranslucent = terrainRenderType == TerrainRenderType .TRANSLUCENT ;
@@ -123,19 +147,28 @@ public void buildDrawBatchesIndirect(IndirectBuffer indirectBuffer, StaticQueue<
123147 for (var iterator = queue .iterator (isTranslucent ); iterator .hasNext (); ) {
124148
125149 final RenderSection section = iterator .next ();
126- final DrawParameters drawParameters = section .getDrawParameters (terrainRenderType );
127150
128- if (drawParameters .indexCount <= 0 )
129- continue ;
151+ int mask = getMask (cameraPos , section );
152+
153+ for (int i = 0 ; i < QuadFacing .COUNT ; i ++) {
130154
131- long ptr = bufferPtr + (drawCount * 20L );
132- MemoryUtil .memPutInt (ptr , drawParameters .indexCount );
133- MemoryUtil .memPutInt (ptr + 4 , 1 );
134- MemoryUtil .memPutInt (ptr + 8 , drawParameters .firstIndex == -1 ? 0 : drawParameters .firstIndex );
135- MemoryUtil .memPutInt (ptr + 12 , drawParameters .vertexOffset );
136- MemoryUtil .memPutInt (ptr + 16 , drawParameters .baseInstance );
155+ if ((mask & 1 << i ) == 0 )
156+ continue ;
137157
138- drawCount ++;
158+ final DrawParameters drawParameters = section .getDrawParameters (terrainRenderType , i );
159+
160+ if (drawParameters .indexCount <= 0 )
161+ continue ;
162+
163+ long ptr = bufferPtr + (drawCount * 20L );
164+ MemoryUtil .memPutInt (ptr , drawParameters .indexCount );
165+ MemoryUtil .memPutInt (ptr + 4 , 1 );
166+ MemoryUtil .memPutInt (ptr + 8 , drawParameters .firstIndex == -1 ? 0 : drawParameters .firstIndex );
167+ MemoryUtil .memPutInt (ptr + 12 , drawParameters .vertexOffset );
168+ MemoryUtil .memPutInt (ptr + 16 , drawParameters .baseInstance );
169+
170+ drawCount ++;
171+ }
139172 }
140173
141174 if (drawCount == 0 ) return ;
@@ -149,22 +182,50 @@ public void buildDrawBatchesIndirect(IndirectBuffer indirectBuffer, StaticQueue<
149182
150183 }
151184
152- public void buildDrawBatchesDirect (StaticQueue <RenderSection > queue , TerrainRenderType renderType ) {
185+ public void buildDrawBatchesDirect (Vec3 cameraPos , StaticQueue <RenderSection > queue , TerrainRenderType renderType ) {
153186 boolean isTranslucent = renderType == TerrainRenderType .TRANSLUCENT ;
154187 VkCommandBuffer commandBuffer = Renderer .getCommandBuffer ();
155188
156189 for (var iterator = queue .iterator (isTranslucent ); iterator .hasNext (); ) {
157190 final RenderSection section = iterator .next ();
158- final DrawParameters drawParameters = section .getDrawParameters (renderType );
159191
160- if (drawParameters .indexCount <= 0 )
161- continue ;
192+ int mask = getMask (cameraPos , section );
193+
194+ for (int i = 0 ; i < QuadFacing .COUNT ; i ++) {
195+
196+ if ((mask & 1 << i ) == 0 )
197+ continue ;
198+
199+ final DrawParameters drawParameters = section .getDrawParameters (renderType , i );
200+
201+ if (drawParameters .indexCount <= 0 )
202+ continue ;
203+
204+ final int firstIndex = drawParameters .firstIndex == -1 ? 0 : drawParameters .firstIndex ;
205+ vkCmdDrawIndexed (commandBuffer , drawParameters .indexCount , 1 , firstIndex , drawParameters .vertexOffset , drawParameters .baseInstance );
206+ }
162207
163- final int firstIndex = drawParameters .firstIndex == -1 ? 0 : drawParameters .firstIndex ;
164- vkCmdDrawIndexed (commandBuffer , drawParameters .indexCount , 1 , firstIndex , drawParameters .vertexOffset , drawParameters .baseInstance );
165208 }
166209 }
167210
211+ private int getMask (Vec3 camera , RenderSection section ) {
212+ final int secX = section .xOffset ;
213+ final int secY = section .yOffset ;
214+ final int secZ = section .zOffset ;
215+
216+ int mask = 1 << QuadFacing .NONE .ordinal ();
217+
218+ mask |= camera .x - secX >= 0 ? 1 << QuadFacing .X_POS .ordinal () : 0 ;
219+ mask |= camera .y - secY >= 0 ? 1 << QuadFacing .Y_POS .ordinal () : 0 ;
220+ mask |= camera .z - secZ >= 0 ? 1 << QuadFacing .Z_POS .ordinal () : 0 ;
221+ mask |= camera .x - (secX + 16 ) < 0 ? 1 << QuadFacing .X_NEG .ordinal () : 0 ;
222+ mask |= camera .y - (secY + 16 ) < 0 ? 1 << QuadFacing .Y_NEG .ordinal () : 0 ;
223+ mask |= camera .z - (secZ + 16 ) < 0 ? 1 << QuadFacing .Z_NEG .ordinal () : 0 ;
224+
225+ return mask ;
226+ // return 0xFF;
227+ }
228+
168229 public void bindBuffers (VkCommandBuffer commandBuffer , Pipeline pipeline , TerrainRenderType terrainRenderType , double camX , double camY , double camZ ) {
169230
170231 try (MemoryStack stack = MemoryStack .stackPush ()) {
@@ -173,7 +234,8 @@ public void bindBuffers(VkCommandBuffer commandBuffer, Pipeline pipeline, Terrai
173234 updateChunkAreaOrigin (commandBuffer , pipeline , camX , camY , camZ , stack );
174235 }
175236
176- if (terrainRenderType == TerrainRenderType .TRANSLUCENT ) {
237+ // TODO index buffer
238+ if (terrainRenderType == TerrainRenderType .TRANSLUCENT && this .indexBuffer != null ) {
177239 vkCmdBindIndexBuffer (commandBuffer , this .indexBuffer .getId (), 0 , VK_INDEX_TYPE_UINT16 );
178240 }
179241
0 commit comments