Vao.java 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. package eu.tankernn.gameEngine.renderEngine;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import org.lwjgl.opengl.GL11;
  5. import org.lwjgl.opengl.GL15;
  6. import org.lwjgl.opengl.GL20;
  7. import org.lwjgl.opengl.GL30;
  8. import org.lwjgl.opengl.GL33;
  9. public class Vao {
  10. protected static final int BYTES_PER_FLOAT = 4;
  11. private static final int BYTES_PER_INT = 4;
  12. public final int id;
  13. private List<Vbo> dataVbos = new ArrayList<Vbo>();
  14. private Vbo indexVbo;
  15. private int indexCount;
  16. public static Vao create() {
  17. int id = GL30.glGenVertexArrays();
  18. return new Vao(id);
  19. }
  20. public static Vao create(int indexCount) {
  21. int id = GL30.glGenVertexArrays();
  22. return new Vao(id, indexCount);
  23. }
  24. private Vao(int id) {
  25. this.id = id;
  26. }
  27. private Vao(int id, int indexCount) {
  28. this(id);
  29. this.indexCount = indexCount;
  30. }
  31. public int getIndexCount() {
  32. return indexCount;
  33. }
  34. public void bind(int... attributes) {
  35. bind();
  36. for (int i: attributes) {
  37. GL20.glEnableVertexAttribArray(i);
  38. }
  39. }
  40. public void unbind(int... attributes) {
  41. for (int i: attributes) {
  42. GL20.glDisableVertexAttribArray(i);
  43. }
  44. unbind();
  45. }
  46. public void createIndexBuffer(int[] indices) {
  47. this.indexVbo = Vbo.create(GL15.GL_ELEMENT_ARRAY_BUFFER);
  48. indexVbo.bind();
  49. indexVbo.storeData(indices);
  50. this.indexCount = indices.length;
  51. }
  52. public void createAttribute(int attribute, float[] data, int attrSize) {
  53. Vbo dataVbo = Vbo.create(GL15.GL_ARRAY_BUFFER);
  54. dataVbo.bind();
  55. dataVbo.storeData(data);
  56. GL20.glVertexAttribPointer(attribute, attrSize, GL11.GL_FLOAT, false, attrSize * BYTES_PER_FLOAT, 0);
  57. dataVbo.unbind();
  58. dataVbos.add(dataVbo);
  59. }
  60. public void createIntAttribute(int attribute, int[] data, int attrSize) {
  61. Vbo dataVbo = Vbo.create(GL15.GL_ARRAY_BUFFER);
  62. dataVbo.bind();
  63. dataVbo.storeData(data);
  64. GL30.glVertexAttribIPointer(attribute, attrSize, GL11.GL_INT, attrSize * BYTES_PER_INT, 0);
  65. dataVbo.unbind();
  66. dataVbos.add(dataVbo);
  67. }
  68. public void addInstacedAttribute(Vbo vbo, int attribute, int dataSize, int instancedDataLength, int offset) {
  69. vbo.bind();
  70. this.bind();
  71. GL20.glVertexAttribPointer(attribute, dataSize, GL11.GL_FLOAT, false, instancedDataLength * 4, offset * 4);
  72. GL33.glVertexAttribDivisor(attribute, 1);
  73. vbo.unbind();
  74. this.unbind();
  75. }
  76. public void storeDataInAttributeList(int attributeNumber, int coordinateSize, float[] data) {
  77. Vbo dataVbo = Vbo.create(GL15.GL_ARRAY_BUFFER, GL15.GL_STATIC_DRAW);
  78. dataVbo.bind();
  79. dataVbo.storeData(data);
  80. GL20.glVertexAttribPointer(attributeNumber, coordinateSize, GL11.GL_FLOAT, false, 0, 0);
  81. dataVbo.unbind();
  82. dataVbos.add(dataVbo);
  83. }
  84. public void delete() {
  85. GL30.glDeleteVertexArrays(id);
  86. for (Vbo vbo: dataVbos) {
  87. vbo.delete();
  88. }
  89. if (indexVbo != null)
  90. indexVbo.delete();
  91. }
  92. private void bind() {
  93. GL30.glBindVertexArray(id);
  94. }
  95. private void unbind() {
  96. GL30.glBindVertexArray(0);
  97. }
  98. }