simple_render.h 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  1. #ifndef SIMPLE_RENDER_H
  2. #define SIMPLE_RENDER_H
  3. #include <stdint.h>
  4. #include <SDL2/SDL.h>
  5. #define GLEW_STATIC
  6. #include <GL/glew.h>
  7. #define GL_GLEXT_PROTOTYPES
  8. #include <SDL2/SDL_opengl.h>
  9. #include "ht.h"
  10. #include "da.h"
  11. #include "vec2.h"
  12. #include "vec4.h"
  13. #include "glyph_attr.h"
  14. enum simple_vertex_attr {
  15. SIMPLE_VERTEX_ATTR_POS = 0,
  16. SIMPLE_VERTEX_ATTR_COLOR,
  17. SIMPLE_VERTEX_ATTR_UV,
  18. SIMPLE_VERTEX_ATTR_TOTAL,
  19. };
  20. struct simple_vertex {
  21. struct vec2f pos;
  22. struct vec4f color;
  23. struct vec2f uv;
  24. };
  25. struct simple_render {
  26. HT_DEF_STRUCT_ITEM(int32_t, uniforms);
  27. DA_DEF_STRUCT_ITEM(struct simple_vertex, vertexs);
  28. uint32_t vao;
  29. uint32_t vbo;
  30. struct {
  31. uint32_t vert;
  32. uint32_t frag;
  33. } shaders;
  34. uint32_t prog;
  35. };
  36. struct simple_render sr_create(const char *vert_path, const char *frag_path);
  37. int32_t sr_set_uniform(struct simple_render *sr, const char *uniform_name);
  38. int32_t sr_get_uniform(const struct simple_render *sr,
  39. const char *uniform_name);
  40. void sr_use(const struct simple_render *sr);
  41. void sr_triangle(struct simple_render *sr,
  42. struct vec2f p0, struct vec2f p1, struct vec2f p2,
  43. struct vec4f c0, struct vec4f c1, struct vec4f c2,
  44. struct vec2f uv0, struct vec2f uv1, struct vec2f uv2);
  45. void sr_quad(struct simple_render *sr,
  46. struct vec2f p0, struct vec2f p1, struct vec2f p2, struct vec2f p3,
  47. struct vec4f c0, struct vec4f c1, struct vec4f c2, struct vec4f c3,
  48. struct vec2f uv0, struct vec2f uv1,
  49. struct vec2f uv2, struct vec2f uv3);
  50. void sr_solid_rect(struct simple_render *sr, struct vec2f pos,
  51. struct vec2f size, struct vec4f color);
  52. void sr_draw(const struct simple_render *sr);
  53. #if defined(SIMPLE_RENDER_IMP) || defined(IMP)
  54. #include "shader.h"
  55. #include "gl_util.h"
  56. #include "util_macro.h"
  57. struct simple_render
  58. sr_create(const char *vert_path, const char *frag_path)
  59. {
  60. struct simple_render sr = {0};
  61. HT_CREATE(sr.uniforms, 32);
  62. DA_CREATE(sr.vertexs);
  63. /* sr.vertexs.cap = 1024 * 1024; */
  64. /* sr.vertexs.size = 0; */
  65. /* sr.vertexs.items = calloc(sr.vertexs.cap, sizeof(struct simple_vertex)); */
  66. {
  67. glGenVertexArrays(1, &sr.vao);
  68. glBindVertexArray(sr.vao);
  69. glGenBuffers(1, &sr.vbo);
  70. glBindBuffer(GL_ARRAY_BUFFER, sr.vbo);
  71. /* glBufferData(GL_ARRAY_BUFFER, */
  72. /* (ssize_t) (sizeof(struct simple_vertex) */
  73. /* * sr.vertexs.cap), */
  74. /* sr.vertexs.items, */
  75. /* GL_DYNAMIC_DRAW); */
  76. #if 0
  77. static const struct glyph_attr
  78. simple_vertex_attr[SIMPLE_VERTEX_ATTR_TOTAL] = {
  79. [SIMPLE_VERTEX_ATTR_POS] = {
  80. .size = 2,
  81. .type = GL_FLOAT,
  82. .norm = GL_FALSE,
  83. .stride = sizeof(struct simple_vertex),
  84. .offset = offsetof(struct simple_vertex,
  85. pos)
  86. },
  87. [SIMPLE_VERTEX_ATTR_COLOR] = {
  88. .size = 4,
  89. .type = GL_FLOAT,
  90. .norm = GL_FALSE,
  91. .stride = sizeof(struct simple_vertex),
  92. .offset = offsetof(struct simple_vertex,
  93. color)
  94. },
  95. [SIMPLE_VERTEX_ATTR_UV] = {
  96. .size = 2,
  97. .type = GL_FLOAT,
  98. .norm = GL_FALSE,
  99. .stride = sizeof(struct simple_vertex),
  100. .offset = offsetof(struct simple_vertex,
  101. uv)
  102. }
  103. };
  104. glyph_attr_declare(simple_vertex_attr,
  105. SIMPLE_VERTEX_ATTR_TOTAL);
  106. #else
  107. glEnableVertexAttribArray(0);
  108. glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE,
  109. sizeof(struct simple_vertex),
  110. (void *) offsetof(struct simple_vertex,
  111. pos));
  112. glEnableVertexAttribArray(1);
  113. glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE,
  114. sizeof(struct simple_vertex),
  115. (void *) offsetof(struct simple_vertex,
  116. color));
  117. glEnableVertexAttribArray(2);
  118. glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE,
  119. sizeof(struct simple_vertex),
  120. (void *) offsetof(struct simple_vertex,
  121. uv));
  122. #endif
  123. }
  124. sr.shaders.vert = shader_compile_file_or_exit(
  125. vert_path, GL_VERTEX_SHADER);
  126. sr.shaders.frag = shader_compile_file_or_exit(
  127. frag_path, GL_FRAGMENT_SHADER);
  128. sr.prog = program_link_or_exit(sr.shaders.vert, sr.shaders.frag);
  129. glUseProgram(sr.prog);
  130. sr_set_uniform(&sr, "resolution");
  131. sr_set_uniform(&sr, "time");
  132. sr_set_uniform(&sr, "camera");
  133. return sr;
  134. }
  135. int32_t
  136. sr_set_uniform(struct simple_render *sr, const char *uniform_name)
  137. {
  138. int32_t uni = get_uniform(sr->prog, uniform_name);
  139. printf("%s: Got Uniform %s -> %d\n", __func__, uniform_name, uni);
  140. HT_SET(sr->uniforms, uniform_name, strlen(uniform_name), uni);
  141. return uni;
  142. }
  143. int32_t
  144. sr_get_uniform(const struct simple_render *sr, const char *uniform_name)
  145. {
  146. int32_t uni = -1;
  147. HT_GET(sr->uniforms, uniform_name, strlen(uniform_name), uni);
  148. return uni;
  149. }
  150. void
  151. sr_use(const struct simple_render *sr)
  152. {
  153. glBindVertexArray(sr->vao);
  154. glBindBuffer(GL_ARRAY_BUFFER, sr->vbo);
  155. glUseProgram(sr->prog);
  156. }
  157. void
  158. sr_triangle(struct simple_render *sr,
  159. struct vec2f p0, struct vec2f p1, struct vec2f p2,
  160. struct vec4f c0, struct vec4f c1, struct vec4f c2,
  161. struct vec2f uv0, struct vec2f uv1, struct vec2f uv2)
  162. {
  163. struct simple_vertex sv0 = {p0, c0, uv0};
  164. struct simple_vertex sv1 = {p1, c1, uv1};
  165. struct simple_vertex sv2 = {p2, c2, uv2};
  166. DA_APPEND(sr->vertexs, sv0);
  167. DA_APPEND(sr->vertexs, sv1);
  168. DA_APPEND(sr->vertexs, sv2);
  169. }
  170. void
  171. sr_quad(struct simple_render *sr,
  172. struct vec2f p0, struct vec2f p1, struct vec2f p2, struct vec2f p3,
  173. struct vec4f c0, struct vec4f c1, struct vec4f c2, struct vec4f c3,
  174. struct vec2f uv0, struct vec2f uv1, struct vec2f uv2, struct vec2f uv3)
  175. {
  176. sr_triangle(sr, p0, p1, p2, c0, c1, c2, uv0, uv1, uv2);
  177. sr_triangle(sr, p1, p2, p3, c1, c2, c3, uv1, uv2, uv3);
  178. }
  179. void
  180. sr_solid_rect(struct simple_render *sr, struct vec2f pos, struct vec2f size,
  181. struct vec4f color)
  182. {
  183. struct vec2f uv = vec2fs(0);
  184. sr_quad(sr,
  185. pos, vec2f_add(pos, vec2f(size.x, 0)),
  186. vec2f_add(pos, vec2f(0, size.y)), vec2f_add(pos, size),
  187. X4_ARGS(color),
  188. X4_ARGS(uv));
  189. }
  190. void
  191. sr_draw(const struct simple_render *sr)
  192. {
  193. glBufferData(GL_ARRAY_BUFFER,
  194. (ssize_t) (sizeof(struct simple_vertex)
  195. * sr->vertexs.cap),
  196. sr->vertexs.items,
  197. GL_DYNAMIC_DRAW);
  198. glDrawArrays(GL_TRIANGLES, 0, (int32_t) sr->vertexs.size);
  199. }
  200. #endif /* defined(SIMPLE_RENDER_IMP) || defined(IMP) */
  201. #endif