Advertisement
Guest User

Untitled

a guest
Jan 17th, 2019
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.29 KB | None | 0 0
  1. // gl_loop.c
  2.  
  3. #include "gl_draw.h"
  4. #include "gl_loop.h"
  5. #include "gl_screen.h"
  6. #include "i_err.h"
  7. #include "i_salloc.h"
  8. #include "i_types.h"
  9.  
  10. // gl_screen variables, extern'd thru gl-screen to rest of program
  11. unsigned short globsperscreenW;
  12. unsigned short globsperscreenH;
  13.  
  14. void initglscreen() {
  15. globsperscreenW = GLOBS_PER_TILE_WIDTH * TILES_PER_SCREEN_WIDTH;
  16. globsperscreenH = GLOBS_PER_TILE_HEIGHT * TILES_PER_SCREEN_HEIGHT;
  17.  
  18. // make sure the total size isn't over USHRT_MAX
  19. int totalsize = globsperscreenW * globsperscreenH;
  20. if (totalsize > USHRT_MAX) error("Total size of glscreen is greater than the maximum USHRT value",false);
  21.  
  22. // also sets up some variables that aren't important
  23. }
  24.  
  25. #include "g_tick.h"
  26. #include "gl_shaders.h"
  27.  
  28. // opengl headers
  29. #include <stdio.h>
  30. #include <stdlib.h>
  31.  
  32. #include <GL/glew.h>
  33. #include <GLFW/glfw3.h>
  34.  
  35. int beginGLLoop() {
  36. // firstly, create the window
  37. puts("Creating window...");
  38.  
  39. // initialize GLFW
  40. glewExperimental = true;
  41. if (!glfwInit()) error("Failed to initialize GLFW",true);
  42.  
  43. // set window hints
  44. glfwWindowHint(GLFW_SAMPLES, 4);
  45. glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
  46. glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
  47. glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
  48. glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
  49.  
  50. // actually create the window
  51. GLFWwindow *window;
  52. window = glfwCreateWindow(720,720,"Test Program",NULL,NULL);
  53. if (window == NULL) error("Unable to initialize window",true);
  54. glfwMakeContextCurrent(window);
  55. glewExperimental = true;
  56. if (glewInit() != GLEW_OK) error("Failed to initialize GLEW",true);
  57.  
  58. puts("Window successfully initialized, initializing screen buffer...");
  59.  
  60. // while we're here, initialize the screen
  61. initglscreen(); // sets up some (currently useless) variables
  62.  
  63. puts("Screen buffer initialized, initializing vertex diagram...");
  64.  
  65. // secondly, calculate the vertices that we need to render
  66. // (more complex calculations are run by the vertex shader)
  67. size_t verticesSize;
  68. GLuint vertexbuffer;
  69. vertexbuffer = initvertexdiagram(&verticesSize);
  70. GLuint colorbuffer = initcolordiagram();
  71.  
  72. puts("Vertex diagram initialized, loading shaders...");
  73.  
  74. // thirdly, load and compile the shaders
  75. GLuint program = loadshaders("./src/shaders/vertex.glsl","./src/shaders/fragment.glsl"); // TODO: find a more reliable way of storing the shader paths
  76.  
  77. puts("Shaders are loaded, running final initialization procedures...");
  78.  
  79. // fourthly, initialize some things that have to be done before rendering
  80. initdraw();
  81.  
  82. puts("Initialization completed, begininng rendering loop...");
  83.  
  84. // fifthly, begin rendering loop
  85. bool continueRendering = true; // TODO: create a more sophisticated way of doing this
  86. glfwSetInputMode(window, GLFW_STICKY_KEYS, GL_TRUE);
  87. int windowwidth, windowheight;
  88. //glUseProgram(program);
  89. do {
  90. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  91. glUseProgram(program);
  92.  
  93. // TODO: poll game to update screen variables
  94.  
  95. glfwGetWindowSize(window,&windowwidth,&windowheight);
  96. drawscreen(window,windowwidth,windowheight,vertexbuffer,colorbuffer);
  97.  
  98. // swap buffers
  99. glfwSwapBuffers(window);
  100. glfwPollEvents();
  101.  
  102. // event polling
  103. continueRendering = (glfwGetKey(window, GLFW_KEY_ESCAPE) != GLFW_PRESS) && gametick();
  104. } while (glfwWindowShouldClose(window) == 0 && continueRendering);
  105.  
  106.  
  107. puts("Freeing memory before exit...");
  108. // finally, release any memory held by the program
  109. glDeleteBuffers(1,&vertexbuffer);
  110. glDeleteBuffers(1,&colorbuffer);
  111. puts("Memory freed, exiting program.");
  112.  
  113. // return
  114. return 0;
  115. }
  116.  
  117. // gl_draw.c
  118. #include "i_salloc.h"
  119. #include "i_types.h"
  120.  
  121. #include "gl_draw.h"
  122. #include "gl_screen.h"
  123.  
  124. #include <stdio.h>
  125. #include <stdlib.h>
  126.  
  127. // initialize collection of vertices used to draw stuff
  128. GLuint initvertexdiagram(size_t *size) {
  129. // initialize memory
  130. const byte numsPerVertice = 3;
  131. *size = sizeof(GLfloat) * (globsperscreenW * globsperscreenH * ((numsPerVertice * 4)));
  132. GLfloat *verticies = checkalloc(*size);
  133.  
  134. // initialize recurring variables
  135. const GLfloat zVal = 0.0f;
  136. GLfloat xVal = -1.0f;
  137. GLfloat yVal = -1.0f;
  138.  
  139. GLfloat xIncrement = 2.0f / globsperscreenW;
  140. GLfloat yIncrement = 2.0f / globsperscreenH;
  141.  
  142. // begin loop to fill diagram
  143. unsigned short currentIndex = 0;
  144. for (unsigned short i = 0; i < globsperscreenH; i++) {
  145. for (unsigned short j = 0; j < globsperscreenH; j++) {
  146. // assign x y and z values
  147. verticies[currentIndex] = xVal;
  148. verticies[currentIndex + 1] = yVal + yIncrement;
  149. verticies[currentIndex + 2] = zVal;
  150.  
  151. verticies[currentIndex + 3] = xVal;
  152. verticies[currentIndex + 4] = yVal;
  153. verticies[currentIndex + 5] = zVal;
  154.  
  155. verticies[currentIndex + 6] = xVal + xIncrement;
  156. verticies[currentIndex + 7] = yVal;
  157. verticies[currentIndex + 8] = zVal;
  158.  
  159. verticies[currentIndex + 9] = xVal + xIncrement;
  160. verticies[currentIndex + 10] = yVal + yIncrement;
  161. verticies[currentIndex + 11] = zVal;
  162.  
  163.  
  164. // increment index
  165. currentIndex += 12;
  166.  
  167. // change values
  168. xVal += xIncrement;
  169. }
  170. yVal += yIncrement;
  171. }
  172.  
  173. // setup opengl-style buffer
  174. GLuint buffer;
  175. glGenBuffers(1,&buffer);
  176. glBindBuffer(GL_ARRAY_BUFFER,buffer);
  177. glBufferData(GL_ARRAY_BUFFER,*size,verticies,GL_STATIC_DRAW);
  178.  
  179. free(verticies);
  180.  
  181. // return the pointer
  182. return buffer;
  183. }
  184.  
  185. // initialize a buffer of colors
  186. GLuint initcolordiagram() {
  187. size_t size = sizeof(GLfloat) * globsperscreenW * globsperscreenH * 3 * 4;
  188. GLfloat *colors = checkalloc(size);
  189.  
  190. // loop through it
  191. int currentIndex = 0;
  192. for (int i = 0; i < globsperscreenW * globsperscreenH * 4; i++) {
  193. colors[currentIndex] = 0.0f;
  194. colors[currentIndex + 1] = 0.0f;
  195. colors[currentIndex + 2] = 1.0f;
  196. currentIndex += 3;
  197. }
  198.  
  199.  
  200. // bind buffers
  201. GLuint buffer;
  202. glGenBuffers(1,&buffer);
  203. glBindBuffer(GL_ARRAY_BUFFER,buffer);
  204. glBufferData(GL_ARRAY_BUFFER,size,colors,GL_STATIC_DRAW);
  205.  
  206. free(colors);
  207.  
  208. return buffer;
  209. }
  210.  
  211. void initdraw() {
  212. glClearColor(0.0f, 0.4f, 0.4f, 0.0f);
  213. }
  214.  
  215. void drawscreen(GLFWwindow *window, int width, int height, GLuint vertexbuffer, GLuint colorbuffer) {
  216. glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
  217. glEnableVertexAttribArray(0);
  218. glVertexAttribPointer(0,3,GL_FLOAT,GL_FALSE,0,(void *)0);
  219. glBindBuffer(GL_ARRAY_BUFFER, colorbuffer);
  220. glEnableVertexAttribArray(1);
  221. glVertexAttribPointer(1,3,GL_FLOAT,GL_FALSE,0,(void *)0);
  222.  
  223. // draw the squares
  224. static const GLubyte indicies[] = {0,1,2,0,2,3};
  225.  
  226. glDrawElements(GL_TRIANGLES,6,GL_UNSIGNED_BYTE,indicies);
  227.  
  228. glDisableVertexAttribArray(1);
  229. glDisableVertexAttribArray(0);
  230. }
  231.  
  232. // vertex shader
  233. #version 330 core
  234.  
  235. layout (location = 0) in vec3 vertexPos;
  236. layout (location = 1) in vec3 fColor;
  237.  
  238. out vec3 vertexColor;
  239.  
  240. void main() {
  241. gl_Position.xyz = vertexPos;
  242. gl_Position.w = 1.0;
  243.  
  244. vertexColor = fColor;
  245. }
  246.  
  247. // fragment shader
  248. #version 330 core
  249.  
  250. // this file is a part of Avaritia, made by John Nunley and licensed under GPL 3.0
  251.  
  252. out vec4 fragmentColor;
  253.  
  254. in vec3 vertexColor;
  255.  
  256. void main() {
  257. fragmentColor.xyz = vertexColor;
  258. fragmentColor.a = 1.0f;
  259. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement