Advertisement
Guest User

Untitled

a guest
Jul 20th, 2017
52
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5 9.95 KB | None | 0 0
  1.  
  2. /**
  3.  * Index buffer helper class
  4.  */
  5. public class IndexBuffer
  6. {
  7.    
  8.     private static final Logger LOGGER = Logger.getLogger(IndexBuffer.class);
  9.    
  10.     protected int bufferId = -1;
  11.     protected int stride = -1;
  12.     protected long sizeInBytes;
  13.     private int elementCount = -1;
  14.     protected boolean ready = false;
  15.  
  16.     private IntBuffer buffer = null;
  17.    
  18.    
  19.     /**
  20.      * Creates and allocates a vertex buffer with the requested size in bytes.
  21.      * @param sizeInBytes the size in bytes
  22.      */
  23.     public void createBuffer(long sizeInBytes)
  24.     {
  25.         if (bufferId != -1)
  26.         {
  27.             LOGGER.error("Buffer already created");
  28.             return;
  29.         }
  30.        
  31.         bufferId = allocateGLBuffer();
  32.        
  33.         glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, bufferId);
  34.         glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeInBytes, GL_STATIC_DRAW);
  35.         glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
  36.        
  37.         this.sizeInBytes = sizeInBytes;
  38.        
  39.         GLErrorChecker.checkError();
  40.        
  41.         LOGGER.info("Created index buffer with size in bytes: " + sizeInBytes);
  42.        
  43.     }
  44.    
  45.     /**
  46.      * Uploads index data into a previously created buffer.
  47.      * @param data the data to upload
  48.      */
  49.     public void uploadIndexData(List<Integer> data)
  50.     {
  51.         if (bufferId == -1)
  52.         {
  53.             LOGGER.error("Buffer not yet created");
  54.             return;
  55.         }
  56.        
  57.         stride = 3;
  58.         elementCount = data.size();
  59.         long requiredBytes = elementCount * 4;
  60.        
  61.         if (getSizeInBytes() != requiredBytes)
  62.         {
  63.             LOGGER.error("Invalid buffer size, required: " + requiredBytes + " allocated: " + getSizeInBytes());
  64.             return;
  65.         }
  66.        
  67.         buffer = BufferUtils.createIntBuffer(elementCount);
  68.        
  69.         int index = 0;
  70.        
  71.         for (Integer i : data)
  72.         {
  73.             buffer.put(index, i);
  74.             index++;
  75.         }
  76.        
  77.         buffer.rewind();
  78.         buffer.flip();
  79.        
  80.         glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, bufferId);
  81.         glBufferData(GL_ELEMENT_ARRAY_BUFFER, buffer, GL_STATIC_DRAW);
  82.         glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
  83.        
  84.         GLErrorChecker.checkError();
  85.        
  86.         LOGGER.info("Successfully uploaded index data");
  87.        
  88.         ready = true;
  89.     }
  90.    
  91.     /**
  92.      * Allocates a GL Buffer
  93.      * @return the GL buffer id that was allocated
  94.      */
  95.     protected int allocateGLBuffer()
  96.     {
  97.         IntBuffer buffer = BufferUtils.createIntBuffer(1);
  98.         glGenBuffers(buffer);
  99.        
  100.         int result = buffer.get(0);
  101.         LOGGER.info("Created index buffer: " + result);
  102.         return result;
  103.     }
  104.  
  105.  
  106.     public long getSizeInBytes()
  107.     {
  108.         return sizeInBytes;
  109.     }
  110.  
  111.     public boolean isReady()
  112.     {
  113.         return ready;
  114.     }
  115.  
  116.     public int getElementCount()
  117.     {
  118.         return elementCount;
  119.     }
  120.    
  121.     public int getBufferId()
  122.     {
  123.         return bufferId;
  124.     }
  125.    
  126.  
  127.     public void destroy()
  128.     {
  129.         if (getBufferId() != -1)
  130.         {
  131.             glDeleteBuffers(getBufferId());
  132.             LOGGER.debug("Destroyed GL index buffer: " + getBufferId());
  133.         }
  134.        
  135.         bufferId = -1;
  136.         ready = false;
  137.     }
  138.    
  139.     public IntBuffer getBuffer()
  140.     {
  141.         return buffer;
  142.     }
  143.    
  144. }
  145.  
  146.  
  147.  
  148. /**
  149.  * Vertex buffer helper code
  150.  */
  151. public class VertexBuffer
  152. {
  153.    
  154.     private static final Logger LOGGER = Logger.getLogger(VertexBuffer.class);
  155.    
  156.     protected int bufferId = -1;
  157.     protected int stride = -1;
  158.     protected long sizeInBytes;
  159.     private int elementCount = -1;
  160.     protected boolean ready = false;
  161.     protected FloatBuffer buffer = null;
  162.    
  163.     /**
  164.      * Creates and allocates a vertex buffer with the requested size in bytes.
  165.      * @param sizeInBytes the size in bytes
  166.      */
  167.     public void createBuffer(long sizeInBytes)
  168.     {
  169.         GLErrorChecker.checkError();
  170.        
  171.         if (bufferId != -1)
  172.         {
  173.             LOGGER.error("Buffer already created");
  174.             return;
  175.         }
  176.        
  177.         bufferId = allocateGLBuffer();
  178.        
  179.         glBindBuffer(GL_ARRAY_BUFFER, bufferId);
  180.         glBufferData(GL_ARRAY_BUFFER, sizeInBytes, GL_STATIC_DRAW);
  181.         glBindBuffer(GL_ARRAY_BUFFER, 0);
  182.        
  183.         this.sizeInBytes = sizeInBytes;
  184.        
  185.         GLErrorChecker.checkError();
  186.        
  187.         LOGGER.info("Created vertex buffer with size in bytes: " + sizeInBytes);
  188.        
  189.     }
  190.    
  191.     /**
  192.      * Uploads 3f data into a previously created buffer.
  193.      * @param data the data to upload
  194.      */
  195.     public void uploadData3f(List<Vector3f> data)
  196.     {
  197.         GLErrorChecker.checkError();
  198.        
  199.         if (bufferId == -1)
  200.         {
  201.             LOGGER.error("Buffer not created");
  202.             return;
  203.         }
  204.        
  205.         stride = 3;
  206.         elementCount = data.size() * stride;
  207.         long requiredBytes = elementCount * 4;
  208.        
  209.         if (getSizeInBytes() != requiredBytes)
  210.         {
  211.             LOGGER.error("Invalid buffer size, required: " + requiredBytes + " allocated: " + getSizeInBytes());
  212.             return;
  213.         }
  214.        
  215.         FloatBuffer buffer = BufferUtils.createFloatBuffer(elementCount);
  216.        
  217.         int index = 0;
  218.        
  219.         for (Vector3f v : data)
  220.         {
  221.             buffer.put(index, v.x);
  222.             index++;
  223.             buffer.put(index, v.y);
  224.             index++;
  225.             buffer.put(index, v.z);
  226.             index++;
  227.         }
  228.        
  229.         buffer.rewind();
  230.         buffer.flip();
  231.        
  232.         glBindBuffer(GL_ARRAY_BUFFER, bufferId);
  233.         glBufferData(GL_ARRAY_BUFFER, buffer, GL_STATIC_DRAW);
  234.         glBindBuffer(GL_ARRAY_BUFFER, 0);
  235.        
  236.         ready = true;
  237.        
  238.         GLErrorChecker.checkError();
  239.        
  240.         LOGGER.info("Successfully uploaded vertex 3f data");
  241.     }
  242.    
  243.     /**
  244.      * Uploads 2f data into a previously created buffer.
  245.      * @param data the data to upload
  246.      */
  247.     public void uploadData2f(List<Vector2f> data)
  248.     {
  249.        
  250.         GLErrorChecker.checkError();
  251.        
  252.         if (bufferId == -1)
  253.         {
  254.             LOGGER.error("Buffer not created");
  255.             return;
  256.         }
  257.        
  258.         stride = 2;
  259.         elementCount = data.size() * stride;
  260.         long requiredBytes = elementCount * 4;
  261.        
  262.         if (getSizeInBytes() != requiredBytes)
  263.         {
  264.             LOGGER.error("Invalid buffer size, required: " + requiredBytes + " allocated: " + getSizeInBytes());
  265.             return;
  266.         }
  267.        
  268.         buffer = BufferUtils.createFloatBuffer(elementCount);
  269.        
  270.         int index = 0;
  271.        
  272.         for (Vector2f v : data)
  273.         {
  274.             buffer.put(index, v.x);
  275.             index++;
  276.             buffer.put(index, v.y);
  277.             index++;
  278.         }
  279.        
  280.         buffer.rewind();
  281.         buffer.flip();
  282.        
  283.         glBindBuffer(GL_ARRAY_BUFFER, bufferId);
  284.         glBufferData(GL_ARRAY_BUFFER, buffer, GL_STATIC_DRAW);
  285.         glBindBuffer(GL_ARRAY_BUFFER, 0);
  286.        
  287.         ready = true;
  288.        
  289.         GLErrorChecker.checkError();
  290.        
  291.         LOGGER.info("Successfully uploaded vertex 2f data");
  292.     }
  293.    
  294.     /**
  295.      * Allocates a GL Buffer
  296.      * @return the GL buffer id that was allocated
  297.      */
  298.     protected int allocateGLBuffer()
  299.     {
  300.         GLErrorChecker.checkError();
  301.        
  302.         IntBuffer buffer = BufferUtils.createIntBuffer(1);
  303.         glGenBuffers(buffer);
  304.        
  305.         GLErrorChecker.checkError();
  306.        
  307.         int result = buffer.get(0);
  308.         LOGGER.info("Created vertex buffer: " + result);
  309.         return result;
  310.     }
  311.  
  312.  
  313.     public long getSizeInBytes()
  314.     {
  315.         return sizeInBytes;
  316.     }
  317.  
  318.     public boolean isReady()
  319.     {
  320.         return ready;
  321.     }
  322.  
  323.     public int getElementCount()
  324.     {
  325.         return elementCount;
  326.     }
  327.    
  328.     public int getBufferId()
  329.     {
  330.         return bufferId;
  331.     }
  332.    
  333.  
  334.    
  335.     public void destroy()
  336.     {
  337.         if (getBufferId() != -1)
  338.         {
  339.             glDeleteBuffers(getBufferId());
  340.             LOGGER.debug("Destroyed GL vertex buffer: " + getBufferId());
  341.         }
  342.        
  343.         bufferId = -1;
  344.         ready = false;
  345.     }
  346.  
  347.     public FloatBuffer getBuffer()
  348.     {
  349.         return buffer;
  350.     }
  351.    
  352. }
  353.  
  354.  
  355.   /**
  356.    * Set up and rendering code from my mesh class
  357.    */
  358.    public void renderFromBuffer()
  359.     {
  360.        
  361.         if (!buffersCreated)
  362.         {
  363.             createIndexBuffer();
  364.             createVertexBuffer();
  365.             buffersCreated = true;
  366.         }
  367.        
  368.         glEnableClientState(GL_VERTEX_ARRAY);
  369.         glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer.getBufferId());
  370.         glVertexPointer(3, GL_FLOAT, 0, 0);
  371.        
  372.         glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer.getBufferId());
  373.         glDrawElements(GL_TRIANGLES, 9, GL_UNSIGNED_INT, 0);
  374.        
  375.         glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
  376.         glBindBuffer(GL_ARRAY_BUFFER, 0);
  377.        
  378.         glDisableClientState(GL_VERTEX_ARRAY);
  379.     }
  380.  
  381.     protected void createIndexBuffer()
  382.     {
  383.         indexBuffer = new IndexBuffer();
  384.         indexBuffer.createBuffer(faces.size() * 3 * 4);
  385.         List<Integer> indices = new ArrayList<Integer>(faces.size() * 3);
  386.        
  387.         for (Triangle t : faces)
  388.         {
  389.             indices.add(t.pointIndex[0]);
  390.             indices.add(t.pointIndex[1]);
  391.             indices.add(t.pointIndex[2]);
  392.         }
  393.        
  394.         indexBuffer.uploadIndexData(indices);
  395.     }
  396.    
  397.     protected void createVertexBuffer()
  398.     {
  399.         vertexBuffer = new VertexBuffer();
  400.         vertexBuffer.createBuffer(positions.size() * 3 * 4);
  401.         vertexBuffer.uploadData3f(positions);
  402.     }
  403.  
  404. I've trimmed out the support for normal and texture buffers to keep it simpler
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement