Guest User

Untitled

a guest
Dec 13th, 2018
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.86 KB | None | 0 0
  1. #include "glew.h"
  2. #include "wglew.h"
  3.  
  4. #include "sdl.h"
  5.  
  6. #include <assert.h>
  7.  
  8. #define NO_SDL_GLEXT
  9. #include "sdl_opengl.h"
  10.  
  11. #include "glm.hpp"
  12. #include "gtc/matrix_transform.hpp"
  13.  
  14. #define ASSERT assert
  15.  
  16. #include <fstream>
  17. #include <sstream>
  18. #include <string>
  19.  
  20. using std::string;
  21. typedef unsigned int uint;
  22.  
  23. #include <malloc.h>
  24.  
  25. template <typename T, uint uiIncrement=500>
  26. class CBuffer {
  27. public:
  28.     CBuffer()
  29.         : m_uiUsed(0)
  30.         , m_uiSize(uiIncrement)
  31.     {
  32.         m_pBuffer = (T*)malloc(sizeof(T) * uiIncrement);
  33.     }
  34.  
  35.     ~CBuffer() { }
  36.     void freeBuffer()   { free(m_pBuffer); m_uiUsed = 0; m_uiSize = 0; }
  37.     void clear() { m_uiUsed = 0;    }
  38.     T* alloc()
  39.     {
  40.         if (m_uiUsed == m_uiSize) {
  41.             T* pNewBuffer((T*)realloc(m_pBuffer, sizeof(T) * (m_uiSize + uiIncrement)));
  42.             m_uiSize += uiIncrement;
  43.             m_pBuffer = pNewBuffer;
  44.         }
  45.  
  46.         T* pAlloc(&m_pBuffer[m_uiUsed]);
  47.         ++m_uiUsed;
  48.         return pAlloc;
  49.     }
  50.  
  51.     T* GetBuffer()  { return m_pBuffer; }
  52.     uint    GetSize() const         { return m_uiUsed;  }
  53.     uint    GetRealSize() const     { return m_uiSize;  }
  54. private:
  55.     T* m_pBuffer;
  56.     uint m_uiUsed;
  57.     uint m_uiSize;
  58. };
  59.  
  60.  
  61. #define OFFSET_OF(st, m) \
  62.     ((size_t) ( (char *)&((st *)0)->m - (char *)0 ))
  63.  
  64. #define COMPILE_SHADER(shaderName, shaderSource) { \
  65.     GLint iCompiled, iLength; \
  66.     glShaderSource(shaderName, 1, (const GLchar**)&shaderSource, 0); \
  67.     glCompileShader(shaderName); \
  68.     glGetShaderiv(shaderName, GL_COMPILE_STATUS, &iCompiled); \
  69.     if(iCompiled == FALSE)  { \
  70.     glGetShaderiv(shaderName, GL_INFO_LOG_LENGTH, &iLength); \
  71.     char* infoLog((char *)malloc(iLength)); \
  72.     glGetShaderInfoLog(shaderName, iLength, &iLength, infoLog); \
  73.     free(infoLog); \
  74.     } }
  75.  
  76. #define LINK_SHADER(shaderProgram, vertexShader, fragShader) { \
  77.     GLint iLinked, iLength; \
  78.     glAttachShader(shaderProgram, vertexShader); \
  79.     glAttachShader(shaderProgram, fragShader); \
  80.     glLinkProgram(shaderProgram); \
  81.     glGetProgramiv(shaderProgram, GL_LINK_STATUS, (int *)&iLinked); \
  82.     if(iLinked == FALSE) { \
  83.     glGetProgramiv(shaderProgram, GL_INFO_LOG_LENGTH, &iLength); \
  84.     char* infoLog((char *)malloc(iLength)); \
  85.     glGetProgramInfoLog(shaderProgram, iLength, &iLength, infoLog); \
  86.     free(infoLog); \
  87.     } }
  88.  
  89.  
  90. char *FileToBuffer(const string& sFileName)
  91. {
  92.     using std::ifstream;   
  93.  
  94.     ifstream fFile(sFileName, std::ios::binary);
  95.  
  96.     fFile.seekg(0, std::ios::end);
  97.     std::streamsize zFileSize(fFile.tellg());
  98.     fFile.seekg(0, std::ios::beg);
  99.  
  100.     char *pBuffer(new char[uint(zFileSize + 1)]);
  101.     fFile.read(pBuffer, zFileSize);
  102.     pBuffer[zFileSize] = 0;
  103.  
  104.     fFile.close();
  105.  
  106.     return pBuffer;
  107. }
  108.  
  109. struct SGLVertex2D {
  110.     GLfloat position[2];
  111. };
  112.  
  113. int main(int argc, char *argv[])
  114. {
  115.     if (SDL_Init(SDL_INIT_EVERYTHING) < 0)
  116.         return 1;
  117.  
  118.     SDL_Surface *display = SDL_SetVideoMode(800, 600, 32, 2);
  119.     GLenum err(glewInit());
  120.     assert (err == 0);
  121.  
  122.     glShadeModel(GL_SMOOTH);
  123.     glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
  124.     glReadBuffer(GL_BACK);
  125.     glDrawBuffer(GL_BACK);
  126.     glEnable(GL_DEPTH_TEST);
  127.     glDepthFunc(GL_LEQUAL);
  128.     glDepthMask(TRUE);
  129.     glFrontFace(GL_CCW);
  130.     glCullFace(GL_BACK);
  131.     glEnable(GL_CULL_FACE);
  132.     glClearColor(1.0, 0.0, 0.0, 1.0);
  133.     glClearDepth(1.0);
  134.  
  135.     CBuffer<SGLVertex2D> m_VertexBuffer;
  136.     CBuffer<GLushort> m_IndexBuffer;
  137.     GLuint m_uiVertexArrayObject, m_uiVertexBufferObject, m_uiIndexBufferObject, m_uiShaderProgram, m_uiFragShader, m_uiVertexShader;
  138.    
  139.     char *pVertexShader(FileToBuffer("2drender.vert"));
  140.     char *pFragmentShader(FileToBuffer("2drender.frag"));
  141.  
  142.     ASSERT(GLEW_VERSION_3_3);
  143.  
  144.     m_uiVertexShader = glCreateShader(GL_VERTEX_SHADER);
  145.     COMPILE_SHADER(m_uiVertexShader, pVertexShader);
  146.  
  147.     m_uiFragShader = glCreateShader(GL_FRAGMENT_SHADER);
  148.     COMPILE_SHADER(m_uiFragShader, pFragmentShader);
  149.  
  150.     m_uiShaderProgram = glCreateProgram();
  151.     LINK_SHADER(m_uiShaderProgram, m_uiVertexShader, m_uiFragShader);
  152.  
  153.     glGenVertexArrays(1, &m_uiVertexArrayObject);
  154.     glBindVertexArray(m_uiVertexArrayObject);
  155.  
  156.     glGenBuffers(1, &m_uiVertexBufferObject);
  157.     glGenBuffers(1, &m_uiIndexBufferObject);
  158.  
  159.     glBindBuffer(GL_ARRAY_BUFFER, m_uiVertexBufferObject);
  160.     glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_uiIndexBufferObject);
  161.  
  162.     glEnableVertexAttribArray(0);
  163.     glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(SGLVertex2D), (void*)OFFSET_OF(SGLVertex2D, position));
  164.     err = glGetError();
  165.     ASSERT(err == 0);
  166.  
  167.     float fX1(10), fY1(10), fX2(300), fY2(300);
  168.        
  169.     GLuint uiVertex0(m_VertexBuffer.GetSize());
  170.  
  171.     SGLVertex2D* pVertex(m_VertexBuffer.alloc());
  172.     pVertex->position[0] = fX1;
  173.     pVertex->position[1] = fY1;
  174.  
  175.     pVertex = m_VertexBuffer.alloc();
  176.     pVertex->position[0] = fX2;
  177.     pVertex->position[1] = fY1;
  178.  
  179.     pVertex = m_VertexBuffer.alloc();
  180.     pVertex->position[0] = fX1;
  181.     pVertex->position[1] = fY2;
  182.  
  183.     pVertex = m_VertexBuffer.alloc();
  184.     pVertex->position[0] = fX2;
  185.     pVertex->position[1] = fY2;
  186.  
  187.     GLushort* pIndex;
  188. #define ASSIGN_INDEX(index) \
  189.     { pIndex = m_IndexBuffer.alloc(); *pIndex = uiVertex0 + index; }
  190.  
  191.     ASSIGN_INDEX(0);
  192.     ASSIGN_INDEX(2);
  193.     ASSIGN_INDEX(1);
  194.     ASSIGN_INDEX(1);
  195.     ASSIGN_INDEX(2);
  196.     ASSIGN_INDEX(3);
  197.  
  198.     glBindVertexArray(m_uiVertexArrayObject);  
  199.     glBindBuffer(GL_ARRAY_BUFFER, m_uiVertexBufferObject);
  200.     glBufferData(GL_ARRAY_BUFFER, m_VertexBuffer.GetSize() * sizeof(SGLVertex2D), m_VertexBuffer.GetBuffer(), GL_STATIC_DRAW);  // By passing it NULL for data, we're saying "Trash the old shit, we're giving you new shit"
  201.     glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_uiIndexBufferObject);
  202.     glBufferData(GL_ELEMENT_ARRAY_BUFFER, m_IndexBuffer.GetSize() * sizeof(GLushort), m_IndexBuffer.GetBuffer(), GL_STATIC_DRAW);
  203.    
  204.     glEnableVertexAttribArray(0);
  205.     glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(SGLVertex2D), (void*)OFFSET_OF(SGLVertex2D, position));
  206.  
  207.     err = glGetError();
  208.     assert (err == 0);
  209.     while (true) {
  210.         // Bind the vertex buffer object, and fill it with vertex data
  211.         SGLVertex2D* pVertexBuffer(NULL);
  212.         GLuint* pIndexBuffer(NULL);
  213.    
  214.         glm::mat4 orthoMatrix(glm::ortho<float>(0.0f, float(800), float(600), 0.0f, -1.0f, 1.0f));
  215.         glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  216.  
  217.         glBindVertexArray(m_uiVertexArrayObject);
  218.         glBindBuffer(GL_ARRAY_BUFFER, m_uiVertexBufferObject);
  219.         glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_uiIndexBufferObject);
  220.  
  221.         // bind the shader program
  222.         glUseProgram(m_uiShaderProgram);
  223.         glBindAttribLocation(m_uiShaderProgram, 0, "position");
  224.         uint projLoc(glGetUniformLocation(m_uiShaderProgram, "proj"));
  225.         glUniformMatrix4fv(projLoc, 1, FALSE, (GLfloat*)&orthoMatrix[0][0]);
  226.    
  227.         // Finally, we draw
  228.         //glDrawRangeElements(GL_TRIANGLE_STRIP, 0, m_VertexBuffer.GetSize(), m_IndexBuffer.GetSize(), GL_UNSIGNED_SHORT, NULL);
  229.         glDrawElements(GL_TRIANGLES, m_IndexBuffer.GetSize(), GL_UNSIGNED_SHORT, NULL);
  230.         err = glGetError();
  231.         ASSERT(err == 0);
  232.  
  233.         glUseProgram(0);
  234.    
  235.         glBindBuffer(GL_ARRAY_BUFFER, 0);
  236.         glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
  237.         glBindVertexArray(0);
  238.  
  239.         glDisableVertexAttribArray(0);
  240.    
  241.         SDL_GL_SwapBuffers();
  242.     }
  243.  
  244.     return 0;
  245. }
Add Comment
Please, Sign In to add comment