@@ -23,12 +23,15 @@ public class Drawer {
2323
2424 private int framesNum ;
2525 private VertexBuffer [] vertexBuffers ;
26+ private IndexBuffer [] indexBuffers ;
27+
2628 private final AutoIndexBuffer quadsIndexBuffer ;
2729 private final AutoIndexBuffer quadsIntIndexBuffer ;
2830 private final AutoIndexBuffer linesIndexBuffer ;
2931 private final AutoIndexBuffer debugLineStripIndexBuffer ;
3032 private final AutoIndexBuffer triangleFanIndexBuffer ;
3133 private final AutoIndexBuffer triangleStripIndexBuffer ;
34+
3235 private UniformBuffer [] uniformBuffers ;
3336
3437 private int currentFrame ;
@@ -58,6 +61,14 @@ public void createResources(int framesNum) {
5861 this .vertexBuffers = new VertexBuffer [framesNum ];
5962 Arrays .setAll (this .vertexBuffers , i -> new VertexBuffer (INITIAL_VB_SIZE , MemoryTypes .HOST_MEM ));
6063
64+ if (this .indexBuffers != null ) {
65+ Arrays .stream (this .indexBuffers ).iterator ().forEachRemaining (
66+ Buffer ::freeBuffer
67+ );
68+ }
69+ this .indexBuffers = new IndexBuffer [framesNum ];
70+ Arrays .setAll (this .indexBuffers , i -> new IndexBuffer (INITIAL_UB_SIZE , MemoryTypes .HOST_MEM ));
71+
6172 if (this .uniformBuffers != null ) {
6273 Arrays .stream (this .uniformBuffers ).iterator ().forEachRemaining (
6374 Buffer ::freeBuffer
@@ -69,54 +80,38 @@ public void createResources(int framesNum) {
6980
7081 public void resetBuffers (int currentFrame ) {
7182 this .vertexBuffers [currentFrame ].reset ();
83+ this .indexBuffers [currentFrame ].reset ();
7284 this .uniformBuffers [currentFrame ].reset ();
7385 }
7486
75- public void draw (ByteBuffer buffer , VertexFormat .Mode mode , VertexFormat vertexFormat , int vertexCount ) {
76- AutoIndexBuffer autoIndexBuffer ;
77- int indexCount ;
87+ public void draw (ByteBuffer vertexData , VertexFormat .Mode mode , VertexFormat vertexFormat , int vertexCount ) {
88+ draw ( vertexData , null , mode , vertexFormat , vertexCount ) ;
89+ }
7890
91+ public void draw (ByteBuffer vertexData , ByteBuffer indexData , VertexFormat .Mode mode , VertexFormat vertexFormat , int vertexCount ) {
7992 VertexBuffer vertexBuffer = this .vertexBuffers [this .currentFrame ];
80- vertexBuffer .copyToVertexBuffer (vertexFormat .getVertexSize (), vertexCount , buffer );
93+ vertexBuffer .copyToVertexBuffer (vertexFormat .getVertexSize (), vertexCount , vertexData );
8194
82- switch ( mode ) {
83- case QUADS -> {
84- indexCount = vertexCount * 3 / 2 ;
95+ if ( indexData != null ) {
96+ IndexBuffer indexBuffer = this . indexBuffers [ this . currentFrame ];
97+ indexBuffer . copyBuffer ( indexData ) ;
8598
86- autoIndexBuffer = indexCount > AutoIndexBuffer .U16_MAX_INDEX_COUNT
87- ? this .quadsIntIndexBuffer : this .quadsIndexBuffer ;
88- }
89- case LINES -> {
90- autoIndexBuffer = this .linesIndexBuffer ;
91- indexCount = vertexCount * 3 / 2 ;
92- }
93- case TRIANGLE_FAN -> {
94- autoIndexBuffer = this .triangleFanIndexBuffer ;
95- indexCount = (vertexCount - 2 ) * 3 ;
96- }
97- case TRIANGLE_STRIP , LINE_STRIP -> {
98- autoIndexBuffer = this .triangleStripIndexBuffer ;
99- indexCount = (vertexCount - 2 ) * 3 ;
100- }
101- case DEBUG_LINE_STRIP -> {
102- autoIndexBuffer = this .debugLineStripIndexBuffer ;
103- indexCount = (vertexCount - 1 ) * 2 ;
104- }
105- case TRIANGLES , DEBUG_LINES -> {
106- indexCount = 0 ;
107- autoIndexBuffer = null ;
108- }
109- default -> throw new RuntimeException (String .format ("unknown drawMode: %s" , mode ));
99+ int indexCount = vertexCount * 3 / 2 ;
100+
101+ drawIndexed (vertexBuffer , indexBuffer , indexCount );
110102 }
103+ else {
104+ AutoIndexBuffer autoIndexBuffer = getAutoIndexBuffer (mode , vertexCount );
111105
112- if (indexCount > 0 ) {
113- autoIndexBuffer .checkCapacity (vertexCount );
106+ if (autoIndexBuffer != null ) {
107+ int indexCount = autoIndexBuffer .getIndexCount (vertexCount );
114108
115- drawIndexed (vertexBuffer , autoIndexBuffer .getIndexBuffer (), indexCount );
116- } else {
117- draw (vertexBuffer , vertexCount );
109+ drawIndexed (vertexBuffer , autoIndexBuffer .getIndexBuffer (), indexCount );
110+ }
111+ else {
112+ draw (vertexBuffer , vertexCount );
113+ }
118114 }
119-
120115 }
121116
122117 public void drawIndexed (VertexBuffer vertexBuffer , IndexBuffer indexBuffer , int indexCount ) {
@@ -150,9 +145,11 @@ public void cleanUpResources() {
150145 buffer = this .vertexBuffers [i ];
151146 MemoryManager .freeBuffer (buffer .getId (), buffer .getAllocation ());
152147
153- buffer = this .uniformBuffers [i ];
148+ buffer = this .indexBuffers [i ];
154149 MemoryManager .freeBuffer (buffer .getId (), buffer .getAllocation ());
155150
151+ buffer = this .uniformBuffers [i ];
152+ MemoryManager .freeBuffer (buffer .getId (), buffer .getAllocation ());
156153 }
157154
158155 this .quadsIndexBuffer .freeBuffer ();
@@ -185,4 +182,19 @@ public UniformBuffer getUniformBuffer() {
185182 return this .uniformBuffers [this .currentFrame ];
186183 }
187184
185+ private AutoIndexBuffer getAutoIndexBuffer (VertexFormat .Mode mode , int vertexCount ) {
186+ return switch (mode ) {
187+ case QUADS -> {
188+ int indexCount = vertexCount * 3 / 2 ;
189+
190+ yield indexCount > AutoIndexBuffer .U16_MAX_INDEX_COUNT
191+ ? this .quadsIntIndexBuffer : this .quadsIndexBuffer ;
192+ }
193+ case LINES -> this .linesIndexBuffer ;
194+ case TRIANGLE_FAN -> this .triangleFanIndexBuffer ;
195+ case TRIANGLE_STRIP , LINE_STRIP -> this .triangleStripIndexBuffer ;
196+ case DEBUG_LINE_STRIP -> this .debugLineStripIndexBuffer ;
197+ case TRIANGLES , DEBUG_LINES -> null ;
198+ };
199+ }
188200}
0 commit comments