22
33import org .lwjgl .opengl .GL43 ;
44
5- public class RareCandyVertexArray {
5+ public final class RareCandyVertexArray {
6+
67 private final int vao ;
78 private final int vertexStride ;
8-
9+
10+ // binding index used for all vertex attributes
11+ private static final int VERTEX_BINDING = 0 ;
12+
913 public RareCandyVertexArray (int strideBytes ) {
1014 this .vertexStride = strideBytes ;
1115 this .vao = GL43 .glGenVertexArrays ();
12-
1316 setupAttributes ();
1417 }
15-
18+
1619 private void setupAttributes () {
1720 GL43 .glBindVertexArray (vao );
18-
19- // Position (vec3)
21+
22+ // Position (vec3) @ location 0
2023 GL43 .glEnableVertexAttribArray (0 );
21- GL43 .glVertexAttribPointer (0 , 3 , GL43 .GL_FLOAT , false , vertexStride , 0 );
22-
23- // Color (vec4)
24+ GL43 .glVertexAttribFormat (0 , 3 , GL43 .GL_FLOAT , false , 0 );
25+ GL43 .glVertexAttribBinding (0 , VERTEX_BINDING );
26+
27+ // Color (vec4) @ location 1
2428 GL43 .glEnableVertexAttribArray (1 );
25- GL43 .glVertexAttribPointer (1 , 4 , GL43 .GL_FLOAT , false , vertexStride , 12 );
26-
27- // UV0 (vec2)
29+ GL43 .glVertexAttribFormat (1 , 4 , GL43 .GL_FLOAT , false , 12 );
30+ GL43 .glVertexAttribBinding (1 , VERTEX_BINDING );
31+
32+ // UV0 (vec2) @ location 2
2833 GL43 .glEnableVertexAttribArray (2 );
29- GL43 .glVertexAttribPointer (2 , 2 , GL43 .GL_FLOAT , false , vertexStride , 28 );
30-
31- // UV1 (ivec2)
34+ GL43 .glVertexAttribFormat (2 , 2 , GL43 .GL_FLOAT , false , 28 );
35+ GL43 .glVertexAttribBinding (2 , VERTEX_BINDING );
36+
37+ // UV1 (ivec2) @ location 3
3238 GL43 .glEnableVertexAttribArray (3 );
33- GL43 .glVertexAttribIPointer (3 , 2 , GL43 .GL_INT , vertexStride , 36 );
34-
35- // UV2 (ivec2)
39+ GL43 .glVertexAttribIFormat (3 , 2 , GL43 .GL_INT , 36 );
40+ GL43 .glVertexAttribBinding (3 , VERTEX_BINDING );
41+
42+ // UV2 (ivec2) @ location 4
3643 GL43 .glEnableVertexAttribArray (4 );
37- GL43 .glVertexAttribIPointer (4 , 2 , GL43 .GL_INT , vertexStride , 44 );
38-
39- // Normal (vec3)
44+ GL43 .glVertexAttribIFormat (4 , 2 , GL43 .GL_INT , 44 );
45+ GL43 .glVertexAttribBinding (4 , VERTEX_BINDING );
46+
47+ // Normal (vec3) @ location 5
4048 GL43 .glEnableVertexAttribArray (5 );
41- GL43 .glVertexAttribPointer (5 , 3 , GL43 .GL_FLOAT , false , vertexStride , 52 );
42-
49+ GL43 .glVertexAttribFormat (5 , 3 , GL43 .GL_FLOAT , false , 52 );
50+ GL43 .glVertexAttribBinding (5 , VERTEX_BINDING );
51+
4352 GL43 .glBindVertexArray (0 );
4453 }
45-
54+
55+ /** Bind VAO only */
4656 public void bind () {
4757 GL43 .glBindVertexArray (vao );
4858 }
49-
59+
60+ /** Bind the actual vertex buffer (destBuffer) at draw time */
61+ public void bindVertexBuffer (int bufferId ) {
62+ GL43 .glBindVertexBuffer (
63+ VERTEX_BINDING ,
64+ bufferId ,
65+ 0 ,
66+ vertexStride
67+ );
68+ }
69+
5070 public void unbind () {
5171 GL43 .glBindVertexArray (0 );
5272 }
53-
73+
5474 public void delete () {
5575 GL43 .glDeleteVertexArrays (vao );
5676 }
57- }
77+ }
0 commit comments