ruby2d 0.9.0 → 0.9.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (132) hide show
  1. checksums.yaml +4 -4
  2. data/assets/README.md +8 -8
  3. data/assets/Rakefile +85 -0
  4. data/assets/include/SDL2/SDL.h +1 -1
  5. data/assets/include/SDL2/SDL_assert.h +1 -1
  6. data/assets/include/SDL2/SDL_atomic.h +20 -2
  7. data/assets/include/SDL2/SDL_audio.h +47 -14
  8. data/assets/include/SDL2/SDL_bits.h +10 -1
  9. data/assets/include/SDL2/SDL_blendmode.h +7 -7
  10. data/assets/include/SDL2/SDL_clipboard.h +1 -1
  11. data/assets/include/SDL2/SDL_config.h +24 -390
  12. data/assets/include/SDL2/SDL_config_android.h +178 -0
  13. data/assets/include/SDL2/SDL_config_iphoneos.h +201 -0
  14. data/assets/include/SDL2/SDL_config_macosx.h +240 -0
  15. data/assets/include/SDL2/SDL_config_minimal.h +85 -0
  16. data/assets/include/SDL2/SDL_config_os2.h +170 -0
  17. data/assets/include/SDL2/SDL_config_pandora.h +133 -0
  18. data/assets/include/SDL2/SDL_config_psp.h +164 -0
  19. data/assets/include/SDL2/SDL_config_windows.h +257 -0
  20. data/assets/include/SDL2/SDL_config_winrt.h +240 -0
  21. data/assets/include/SDL2/SDL_config_wiz.h +146 -0
  22. data/assets/include/SDL2/SDL_copying.h +20 -0
  23. data/assets/include/SDL2/SDL_cpuinfo.h +90 -8
  24. data/assets/include/SDL2/SDL_egl.h +1 -1
  25. data/assets/include/SDL2/SDL_endian.h +1 -1
  26. data/assets/include/SDL2/SDL_error.h +1 -1
  27. data/assets/include/SDL2/SDL_events.h +4 -1
  28. data/assets/include/SDL2/SDL_filesystem.h +1 -1
  29. data/assets/include/SDL2/SDL_gamecontroller.h +1 -1
  30. data/assets/include/SDL2/SDL_gesture.h +1 -1
  31. data/assets/include/SDL2/SDL_haptic.h +1 -1
  32. data/assets/include/SDL2/SDL_hints.h +145 -14
  33. data/assets/include/SDL2/SDL_image.h +2 -2
  34. data/assets/include/SDL2/SDL_joystick.h +1 -1
  35. data/assets/include/SDL2/SDL_keyboard.h +1 -1
  36. data/assets/include/SDL2/SDL_keycode.h +1 -1
  37. data/assets/include/SDL2/SDL_loadso.h +1 -1
  38. data/assets/include/SDL2/SDL_log.h +1 -1
  39. data/assets/include/SDL2/SDL_main.h +28 -16
  40. data/assets/include/SDL2/SDL_messagebox.h +1 -1
  41. data/assets/include/SDL2/SDL_mouse.h +1 -1
  42. data/assets/include/SDL2/SDL_mutex.h +1 -1
  43. data/assets/include/SDL2/SDL_name.h +1 -1
  44. data/assets/include/SDL2/SDL_opengl.h +1 -1
  45. data/assets/include/SDL2/SDL_opengles.h +1 -1
  46. data/assets/include/SDL2/SDL_opengles2.h +1 -1
  47. data/assets/include/SDL2/SDL_pixels.h +3 -3
  48. data/assets/include/SDL2/SDL_platform.h +1 -1
  49. data/assets/include/SDL2/SDL_power.h +1 -1
  50. data/assets/include/SDL2/SDL_quit.h +1 -1
  51. data/assets/include/SDL2/SDL_rect.h +29 -3
  52. data/assets/include/SDL2/SDL_render.h +168 -1
  53. data/assets/include/SDL2/SDL_revision.h +2 -2
  54. data/assets/include/SDL2/SDL_rwops.h +50 -13
  55. data/assets/include/SDL2/SDL_scancode.h +2 -2
  56. data/assets/include/SDL2/SDL_sensor.h +4 -4
  57. data/assets/include/SDL2/SDL_shape.h +1 -1
  58. data/assets/include/SDL2/SDL_stdinc.h +1 -1
  59. data/assets/include/SDL2/SDL_surface.h +2 -1
  60. data/assets/include/SDL2/SDL_system.h +1 -1
  61. data/assets/include/SDL2/SDL_syswm.h +11 -8
  62. data/assets/include/SDL2/SDL_test.h +1 -1
  63. data/assets/include/SDL2/SDL_test_assert.h +1 -1
  64. data/assets/include/SDL2/SDL_test_common.h +22 -5
  65. data/assets/include/SDL2/SDL_test_compare.h +1 -1
  66. data/assets/include/SDL2/SDL_test_crc32.h +1 -1
  67. data/assets/include/SDL2/SDL_test_font.h +1 -1
  68. data/assets/include/SDL2/SDL_test_fuzzer.h +1 -1
  69. data/assets/include/SDL2/SDL_test_harness.h +1 -1
  70. data/assets/include/SDL2/SDL_test_images.h +1 -1
  71. data/assets/include/SDL2/SDL_test_log.h +1 -1
  72. data/assets/include/SDL2/SDL_test_md5.h +1 -1
  73. data/assets/include/SDL2/SDL_test_memory.h +3 -3
  74. data/assets/include/SDL2/SDL_test_random.h +1 -1
  75. data/assets/include/SDL2/SDL_thread.h +1 -1
  76. data/assets/include/SDL2/SDL_timer.h +1 -1
  77. data/assets/include/SDL2/SDL_touch.h +17 -1
  78. data/assets/include/SDL2/SDL_types.h +1 -1
  79. data/assets/include/SDL2/SDL_version.h +2 -2
  80. data/assets/include/SDL2/SDL_video.h +1 -1
  81. data/assets/include/SDL2/SDL_vulkan.h +3 -3
  82. data/assets/include/SDL2/begin_code.h +4 -1
  83. data/assets/include/SDL2/close_code.h +4 -1
  84. data/assets/macos/lib/libFLAC.a +0 -0
  85. data/assets/macos/lib/libSDL2.a +0 -0
  86. data/assets/macos/lib/libSDL2_image.a +0 -0
  87. data/assets/macos/lib/libSDL2_mixer.a +0 -0
  88. data/assets/macos/lib/libSDL2_ttf.a +0 -0
  89. data/assets/macos/lib/libfreetype.a +0 -0
  90. data/assets/macos/lib/libjpeg.a +0 -0
  91. data/assets/macos/lib/libmpg123.a +0 -0
  92. data/assets/macos/lib/libogg.a +0 -0
  93. data/assets/macos/lib/libpng16.a +0 -0
  94. data/assets/macos/lib/libtiff.a +0 -0
  95. data/assets/macos/lib/libwebp.a +0 -0
  96. data/assets/mingw/bin/SDL2.dll +0 -0
  97. data/assets/mingw/bin/SDL2_image.dll +0 -0
  98. data/assets/mingw/bin/libpng16-16.dll +0 -0
  99. data/assets/mingw/bin/libtiff-5.dll +0 -0
  100. data/assets/mingw/bin/libwebp-7.dll +0 -0
  101. data/assets/mingw/lib/libSDL2.a +0 -0
  102. data/assets/mingw/lib/libSDL2.dll.a +0 -0
  103. data/assets/mingw/lib/libSDL2_image.a +0 -0
  104. data/assets/mingw/lib/libSDL2_image.dll.a +0 -0
  105. data/assets/mingw/lib/libSDL2_test.a +0 -0
  106. data/assets/mingw/lib/libSDL2main.a +0 -0
  107. data/bin/ruby2d +2 -1
  108. data/ext/ruby2d/common.c +185 -0
  109. data/ext/ruby2d/controllers.c +110 -0
  110. data/ext/ruby2d/extconf.rb +97 -46
  111. data/ext/ruby2d/gl.c +430 -0
  112. data/ext/ruby2d/gl2.c +146 -0
  113. data/ext/ruby2d/gl3.c +348 -0
  114. data/ext/ruby2d/gles.c +308 -0
  115. data/ext/ruby2d/image.c +138 -0
  116. data/ext/ruby2d/input.c +48 -0
  117. data/ext/ruby2d/music.c +114 -0
  118. data/ext/ruby2d/ruby2d.c +125 -126
  119. data/{assets/include/simple2d.h → ext/ruby2d/ruby2d.h} +223 -201
  120. data/ext/ruby2d/shapes.c +154 -0
  121. data/ext/ruby2d/sound.c +93 -0
  122. data/ext/ruby2d/sprite.c +147 -0
  123. data/ext/ruby2d/text.c +129 -0
  124. data/ext/ruby2d/window.c +414 -0
  125. data/lib/ruby2d.rb +1 -1
  126. data/lib/ruby2d/cli/build.rb +3 -8
  127. data/lib/ruby2d/cli/colorize.rb +10 -0
  128. data/lib/ruby2d/version.rb +1 -1
  129. metadata +34 -10
  130. data/assets/macos/lib/libsimple2d.a +0 -0
  131. data/assets/mingw/lib/libsimple2d.a +0 -0
  132. data/lib/ruby2d/colorize.rb +0 -10
data/ext/ruby2d/gl2.c ADDED
@@ -0,0 +1,146 @@
1
+ // OpenGL 2.1
2
+
3
+ #include "ruby2d.h"
4
+
5
+ #if !GLES
6
+
7
+
8
+ /*
9
+ * Applies the projection matrix
10
+ */
11
+ void R2D_GL2_ApplyProjection(int w, int h) {
12
+
13
+ // Initialize the projection matrix
14
+ glMatrixMode(GL_PROJECTION);
15
+ glLoadIdentity();
16
+
17
+ // Multiply the current matrix with the orthographic matrix
18
+ glOrtho(0.f, w, h, 0.f, -1.f, 1.f);
19
+
20
+ // Initialize the model-view matrix
21
+ glMatrixMode(GL_MODELVIEW);
22
+ glLoadIdentity();
23
+ }
24
+
25
+
26
+ /*
27
+ * Initalize OpenGL
28
+ */
29
+ int R2D_GL2_Init() {
30
+
31
+ GLenum error = GL_NO_ERROR;
32
+
33
+ // Enable transparency
34
+ glEnable(GL_BLEND);
35
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
36
+
37
+ // Check for errors
38
+ error = glGetError();
39
+ if (error != GL_NO_ERROR) {
40
+ R2D_GL_PrintError("OpenGL initialization failed");
41
+ return 1;
42
+ } else {
43
+ return 0;
44
+ }
45
+ }
46
+
47
+
48
+ /*
49
+ * Draw triangle
50
+ */
51
+ void R2D_GL2_DrawTriangle(GLfloat x1, GLfloat y1,
52
+ GLfloat r1, GLfloat g1, GLfloat b1, GLfloat a1,
53
+ GLfloat x2, GLfloat y2,
54
+ GLfloat r2, GLfloat g2, GLfloat b2, GLfloat a2,
55
+ GLfloat x3, GLfloat y3,
56
+ GLfloat r3, GLfloat g3, GLfloat b3, GLfloat a3) {
57
+
58
+ glBegin(GL_TRIANGLES);
59
+ glColor4f(r1, g1, b1, a1); glVertex2f(x1, y1);
60
+ glColor4f(r2, g2, b2, a2); glVertex2f(x2, y2);
61
+ glColor4f(r3, g3, b3, a3); glVertex2f(x3, y3);
62
+ glEnd();
63
+ }
64
+
65
+
66
+ /*
67
+ * Draw texture
68
+ */
69
+ static void R2D_GL2_DrawTexture(int x, int y, int w, int h,
70
+ GLfloat angle, GLfloat rx, GLfloat ry,
71
+ GLfloat r, GLfloat g, GLfloat b, GLfloat a,
72
+ GLfloat tx1, GLfloat ty1, GLfloat tx2, GLfloat ty2,
73
+ GLfloat tx3, GLfloat ty3, GLfloat tx4, GLfloat ty4,
74
+ GLuint texture_id) {
75
+
76
+ R2D_GL_Point v1 = { .x = x, .y = y };
77
+ R2D_GL_Point v2 = { .x = x + w, .y = y };
78
+ R2D_GL_Point v3 = { .x = x + w, .y = y + h };
79
+ R2D_GL_Point v4 = { .x = x, .y = y + h };
80
+
81
+ // Rotate vertices
82
+ if (angle != 0) {
83
+ v1 = R2D_RotatePoint(v1, angle, rx, ry);
84
+ v2 = R2D_RotatePoint(v2, angle, rx, ry);
85
+ v3 = R2D_RotatePoint(v3, angle, rx, ry);
86
+ v4 = R2D_RotatePoint(v4, angle, rx, ry);
87
+ }
88
+
89
+ glEnable(GL_TEXTURE_2D);
90
+
91
+ glBindTexture(GL_TEXTURE_2D, texture_id);
92
+
93
+ glBegin(GL_QUADS);
94
+ glColor4f(r, g, b, a);
95
+ glTexCoord2f(tx1, ty1); glVertex2f(v1.x, v1.y);
96
+ glTexCoord2f(tx2, ty2); glVertex2f(v2.x, v2.y);
97
+ glTexCoord2f(tx3, ty3); glVertex2f(v3.x, v3.y);
98
+ glTexCoord2f(tx4, ty4); glVertex2f(v4.x, v4.y);
99
+ glEnd();
100
+
101
+ glDisable(GL_TEXTURE_2D);
102
+ }
103
+
104
+
105
+ /*
106
+ * Draw image
107
+ */
108
+ void R2D_GL2_DrawImage(R2D_Image *img) {
109
+ R2D_GL2_DrawTexture(
110
+ img->x, img->y, img->width, img->height,
111
+ img->rotate, img->rx, img->ry,
112
+ img->color.r, img->color.g, img->color.b, img->color.a,
113
+ 0.f, 0.f, 1.f, 0.f, 1.f, 1.f, 0.f, 1.f,
114
+ img->texture_id
115
+ );
116
+ }
117
+
118
+
119
+ /*
120
+ * Draw sprite
121
+ */
122
+ void R2D_GL2_DrawSprite(R2D_Sprite *spr) {
123
+ R2D_GL2_DrawTexture(
124
+ spr->x, spr->y, spr->width, spr->height,
125
+ spr->rotate, spr->rx, spr->ry,
126
+ spr->color.r, spr->color.g, spr->color.b, spr->color.a,
127
+ spr->tx1, spr->ty1, spr->tx2, spr->ty2, spr->tx3, spr->ty3, spr->tx4, spr->ty4,
128
+ spr->img->texture_id
129
+ );
130
+ }
131
+
132
+
133
+ /*
134
+ * Draw text
135
+ */
136
+ void R2D_GL2_DrawText(R2D_Text *txt) {
137
+ R2D_GL2_DrawTexture(
138
+ txt->x, txt->y, txt->width, txt->height,
139
+ txt->rotate, txt->rx, txt->ry,
140
+ txt->color.r, txt->color.g, txt->color.b, txt->color.a,
141
+ 0.f, 0.f, 1.f, 0.f, 1.f, 1.f, 0.f, 1.f,
142
+ txt->texture_id
143
+ );
144
+ }
145
+
146
+ #endif
data/ext/ruby2d/gl3.c ADDED
@@ -0,0 +1,348 @@
1
+ // OpenGL 3.3+
2
+
3
+ #include "ruby2d.h"
4
+
5
+ // Skip this file if OpenGL ES
6
+ #if !GLES
7
+
8
+ static GLuint vbo; // our primary vertex buffer object (VBO)
9
+ static GLuint vboSize; // size of the VBO in bytes
10
+ static GLfloat *vboData; // pointer to the VBO data
11
+ static GLfloat *vboDataCurrent; // pointer to the data for the current vertices
12
+ static GLuint vboDataIndex = 0; // index of the current object being rendered
13
+ static GLuint vboObjCapacity = 2500; // number of objects the VBO can store
14
+ static GLuint shaderProgram; // triangle shader program
15
+ static GLuint texShaderProgram; // texture shader program
16
+ static GLuint indices[] = // indices for rendering textured quads
17
+ { 0, 1, 2,
18
+ 2, 3, 0 };
19
+
20
+
21
+ /*
22
+ * Applies the projection matrix
23
+ */
24
+ void R2D_GL3_ApplyProjection(GLfloat orthoMatrix[16]) {
25
+
26
+ // Use the program object
27
+ glUseProgram(shaderProgram);
28
+
29
+ // Apply the projection matrix to the triangle shader
30
+ glUniformMatrix4fv(
31
+ glGetUniformLocation(shaderProgram, "u_mvpMatrix"),
32
+ 1, GL_FALSE, orthoMatrix
33
+ );
34
+
35
+ // Use the texture program object
36
+ glUseProgram(texShaderProgram);
37
+
38
+ // Apply the projection matrix to the texture shader
39
+ glUniformMatrix4fv(
40
+ glGetUniformLocation(texShaderProgram, "u_mvpMatrix"),
41
+ 1, GL_FALSE, orthoMatrix
42
+ );
43
+ }
44
+
45
+
46
+ /*
47
+ * Initalize OpenGL
48
+ */
49
+ int R2D_GL3_Init() {
50
+
51
+ // Enable transparency
52
+ glEnable(GL_BLEND);
53
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
54
+
55
+ // Vertex shader source string
56
+ GLchar vertexSource[] =
57
+ "#version 150 core\n" // shader version
58
+
59
+ "uniform mat4 u_mvpMatrix;" // projection matrix
60
+
61
+ // Input attributes to the vertex shader
62
+ "in vec4 position;" // position value
63
+ "in vec4 color;" // vertex color
64
+ "in vec2 texcoord;" // texture coordinates
65
+
66
+ // Outputs to the fragment shader
67
+ "out vec4 Color;" // vertex color
68
+ "out vec2 Texcoord;" // texture coordinates
69
+
70
+ "void main() {"
71
+ // Send the color and texture coordinates right through to the fragment shader
72
+ " Color = color;"
73
+ " Texcoord = texcoord;"
74
+ // Transform the vertex position using the projection matrix
75
+ " gl_Position = u_mvpMatrix * position;"
76
+ "}";
77
+
78
+ // Fragment shader source string
79
+ GLchar fragmentSource[] =
80
+ "#version 150 core\n" // shader version
81
+ "in vec4 Color;" // input color from vertex shader
82
+ "out vec4 outColor;" // output fragment color
83
+
84
+ "void main() {"
85
+ " outColor = Color;" // pass the color right through
86
+ "}";
87
+
88
+ // Fragment shader source string for textures
89
+ GLchar texFragmentSource[] =
90
+ "#version 150 core\n" // shader version
91
+ "in vec4 Color;" // input color from vertex shader
92
+ "in vec2 Texcoord;" // input texture coordinates
93
+ "out vec4 outColor;" // output fragment color
94
+ "uniform sampler2D tex;" // 2D texture unit
95
+
96
+ "void main() {"
97
+ // Apply the texture unit, texture coordinates, and color
98
+ " outColor = texture(tex, Texcoord) * Color;"
99
+ "}";
100
+
101
+ // Create a vertex array object
102
+ GLuint vao;
103
+ glGenVertexArrays(1, &vao);
104
+ glBindVertexArray(vao);
105
+
106
+ // Create a vertex buffer object and allocate data
107
+ glGenBuffers(1, &vbo);
108
+ glBindBuffer(GL_ARRAY_BUFFER, vbo);
109
+ vboSize = vboObjCapacity * sizeof(GLfloat) * 24;
110
+ vboData = (GLfloat *) malloc(vboSize);
111
+ vboDataCurrent = vboData;
112
+
113
+ // Create an element buffer object
114
+ GLuint ebo;
115
+ glGenBuffers(1, &ebo);
116
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo);
117
+
118
+ // Load the vertex and fragment shaders
119
+ GLuint vertexShader = R2D_GL_LoadShader( GL_VERTEX_SHADER, vertexSource, "GL3 Vertex");
120
+ GLuint fragmentShader = R2D_GL_LoadShader(GL_FRAGMENT_SHADER, fragmentSource, "GL3 Fragment");
121
+ GLuint texFragmentShader = R2D_GL_LoadShader(GL_FRAGMENT_SHADER, texFragmentSource, "GL3 Texture Fragment");
122
+
123
+ // Triangle Shader //
124
+
125
+ // Create the shader program object
126
+ shaderProgram = glCreateProgram();
127
+
128
+ // Check if program was created successfully
129
+ if (shaderProgram == 0) {
130
+ R2D_GL_PrintError("Failed to create shader program");
131
+ return GL_FALSE;
132
+ }
133
+
134
+ // Attach the shader objects to the program object
135
+ glAttachShader(shaderProgram, vertexShader);
136
+ glAttachShader(shaderProgram, fragmentShader);
137
+
138
+ // Bind the output color variable to the fragment shader color number
139
+ glBindFragDataLocation(shaderProgram, 0, "outColor");
140
+
141
+ // Link the shader program
142
+ glLinkProgram(shaderProgram);
143
+
144
+ // Check if linked
145
+ R2D_GL_CheckLinked(shaderProgram, "GL3 shader");
146
+
147
+ // Specify the layout of the position vertex data...
148
+ GLint posAttrib = glGetAttribLocation(shaderProgram, "position");
149
+ glEnableVertexAttribArray(posAttrib);
150
+ glVertexAttribPointer(posAttrib, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(GLfloat), 0);
151
+
152
+ // ...and the color vertex data
153
+ GLint colAttrib = glGetAttribLocation(shaderProgram, "color");
154
+ glEnableVertexAttribArray(colAttrib);
155
+ glVertexAttribPointer(colAttrib, 4, GL_FLOAT, GL_FALSE, 8 * sizeof(GLfloat), (void*)(2 * sizeof(GLfloat)));
156
+
157
+ // Texture Shader //
158
+
159
+ // Create the texture shader program object
160
+ texShaderProgram = glCreateProgram();
161
+
162
+ // Check if program was created successfully
163
+ if (texShaderProgram == 0) {
164
+ R2D_GL_PrintError("Failed to create shader program");
165
+ return GL_FALSE;
166
+ }
167
+
168
+ // Attach the shader objects to the program object
169
+ glAttachShader(texShaderProgram, vertexShader);
170
+ glAttachShader(texShaderProgram, texFragmentShader);
171
+
172
+ // Bind the output color variable to the fragment shader color number
173
+ glBindFragDataLocation(texShaderProgram, 0, "outColor");
174
+
175
+ // Link the shader program
176
+ glLinkProgram(texShaderProgram);
177
+
178
+ // Check if linked
179
+ R2D_GL_CheckLinked(texShaderProgram, "GL3 texture shader");
180
+
181
+ // Specify the layout of the position vertex data...
182
+ posAttrib = glGetAttribLocation(texShaderProgram, "position");
183
+ glVertexAttribPointer(posAttrib, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(GLfloat), 0);
184
+ glEnableVertexAttribArray(posAttrib);
185
+
186
+ // ...and the color vertex data...
187
+ colAttrib = glGetAttribLocation(texShaderProgram, "color");
188
+ glVertexAttribPointer(colAttrib, 4, GL_FLOAT, GL_FALSE, 8 * sizeof(GLfloat), (void*)(2 * sizeof(GLfloat)));
189
+ glEnableVertexAttribArray(colAttrib);
190
+
191
+ // ...and the texture coordinates
192
+ GLint texAttrib = glGetAttribLocation(texShaderProgram, "texcoord");
193
+ glVertexAttribPointer(texAttrib, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(GLfloat), (void*)(6 * sizeof(GLfloat)));
194
+ glEnableVertexAttribArray(texAttrib);
195
+
196
+ // Clean up
197
+ glDeleteShader(vertexShader);
198
+ glDeleteShader(fragmentShader);
199
+ glDeleteShader(texFragmentShader);
200
+
201
+ // If successful, return true
202
+ return GL_TRUE;
203
+ }
204
+
205
+
206
+ /*
207
+ * Render the vertex buffer and reset it
208
+ */
209
+ void R2D_GL3_FlushBuffers() {
210
+
211
+ // Use the triangle shader program
212
+ glUseProgram(shaderProgram);
213
+
214
+ // Bind to the vertex buffer object and update its data
215
+ glBindBuffer(GL_ARRAY_BUFFER, vbo);
216
+ glBufferData(GL_ARRAY_BUFFER, vboSize, NULL, GL_DYNAMIC_DRAW);
217
+ glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(GLfloat) * vboDataIndex * 24, vboData);
218
+
219
+ // Render all the triangles in the buffer
220
+ glDrawArrays(GL_TRIANGLES, 0, (GLsizei)(vboDataIndex * 3));
221
+
222
+ // Reset the buffer object index and data pointer
223
+ vboDataIndex = 0;
224
+ vboDataCurrent = vboData;
225
+ }
226
+
227
+
228
+ /*
229
+ * Draw triangle
230
+ */
231
+ void R2D_GL3_DrawTriangle(GLfloat x1, GLfloat y1,
232
+ GLfloat r1, GLfloat g1, GLfloat b1, GLfloat a1,
233
+ GLfloat x2, GLfloat y2,
234
+ GLfloat r2, GLfloat g2, GLfloat b2, GLfloat a2,
235
+ GLfloat x3, GLfloat y3,
236
+ GLfloat r3, GLfloat g3, GLfloat b3, GLfloat a3) {
237
+
238
+ // If buffer is full, flush it
239
+ if (vboDataIndex >= vboObjCapacity) R2D_GL3_FlushBuffers();
240
+
241
+ // Set the triangle data into a formatted array
242
+ GLfloat vertices[] =
243
+ { x1, y1, r1, g1, b1, a1, 0, 0,
244
+ x2, y2, r2, g2, b2, a2, 0, 0,
245
+ x3, y3, r3, g3, b3, a3, 0, 0 };
246
+
247
+ // Copy the vertex data into the current position of the buffer
248
+ memcpy(vboDataCurrent, vertices, sizeof(vertices));
249
+
250
+ // Increment the buffer object index and the vertex data pointer for next use
251
+ vboDataIndex++;
252
+ vboDataCurrent = (GLfloat *)((char *)vboDataCurrent + (sizeof(GLfloat) * 24));
253
+ }
254
+
255
+
256
+ /*
257
+ * Draw a texture
258
+ */
259
+ static void R2D_GL3_DrawTexture(int x, int y, int w, int h,
260
+ GLfloat angle, GLfloat rx, GLfloat ry,
261
+ GLfloat r, GLfloat g, GLfloat b, GLfloat a,
262
+ GLfloat tx1, GLfloat ty1, GLfloat tx2, GLfloat ty2,
263
+ GLfloat tx3, GLfloat ty3, GLfloat tx4, GLfloat ty4,
264
+ GLuint texture_id) {
265
+
266
+ // Currently, textures are not buffered, so we have to flush all buffers so
267
+ // textures get rendered in the correct Z order
268
+ R2D_GL3_FlushBuffers();
269
+
270
+ // Set up the vertex points
271
+ R2D_GL_Point v1 = { .x = x, .y = y };
272
+ R2D_GL_Point v2 = { .x = x + w, .y = y };
273
+ R2D_GL_Point v3 = { .x = x + w, .y = y + h };
274
+ R2D_GL_Point v4 = { .x = x, .y = y + h };
275
+
276
+ // Rotate vertices
277
+ if (angle != 0) {
278
+ v1 = R2D_RotatePoint(v1, angle, rx, ry);
279
+ v2 = R2D_RotatePoint(v2, angle, rx, ry);
280
+ v3 = R2D_RotatePoint(v3, angle, rx, ry);
281
+ v4 = R2D_RotatePoint(v4, angle, rx, ry);
282
+ }
283
+
284
+ // Set the textured quad data into a formatted array
285
+ GLfloat vertices[] =
286
+ // vertex coords | colors | x, y texture coords
287
+ { v1.x, v1.y, r, g, b, a, tx1, ty1, // Top-left
288
+ v2.x, v2.y, r, g, b, a, tx2, ty2, // Top-right
289
+ v3.x, v3.y, r, g, b, a, tx3, ty3, // Bottom-right
290
+ v4.x, v4.y, r, g, b, a, tx4, ty4 }; // Bottom-left
291
+
292
+ // Use the texture shader program
293
+ glUseProgram(texShaderProgram);
294
+
295
+ // Bind the texture using the provided ID
296
+ glBindTexture(GL_TEXTURE_2D, texture_id);
297
+
298
+ // Create and Initialize the vertex data and array indices
299
+ glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
300
+ glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);
301
+
302
+ // Render the textured quad
303
+ glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
304
+ }
305
+
306
+
307
+ /*
308
+ * Draw image
309
+ */
310
+ void R2D_GL3_DrawImage(R2D_Image *img) {
311
+ R2D_GL3_DrawTexture(
312
+ img->x, img->y, img->width, img->height,
313
+ img->rotate, img->rx, img->ry,
314
+ img->color.r, img->color.g, img->color.b, img->color.a,
315
+ 0.f, 0.f, 1.f, 0.f, 1.f, 1.f, 0.f, 1.f,
316
+ img->texture_id
317
+ );
318
+ }
319
+
320
+
321
+ /*
322
+ * Draw sprite
323
+ */
324
+ void R2D_GL3_DrawSprite(R2D_Sprite *spr) {
325
+ R2D_GL3_DrawTexture(
326
+ spr->x, spr->y, spr->width, spr->height,
327
+ spr->rotate, spr->rx, spr->ry,
328
+ spr->color.r, spr->color.g, spr->color.b, spr->color.a,
329
+ spr->tx1, spr->ty1, spr->tx2, spr->ty2, spr->tx3, spr->ty3, spr->tx4, spr->ty4,
330
+ spr->img->texture_id
331
+ );
332
+ }
333
+
334
+
335
+ /*
336
+ * Draw text
337
+ */
338
+ void R2D_GL3_DrawText(R2D_Text *txt) {
339
+ R2D_GL3_DrawTexture(
340
+ txt->x, txt->y, txt->width, txt->height,
341
+ txt->rotate, txt->rx, txt->ry,
342
+ txt->color.r, txt->color.g, txt->color.b, txt->color.a,
343
+ 0.f, 0.f, 1.f, 0.f, 1.f, 1.f, 0.f, 1.f,
344
+ txt->texture_id
345
+ );
346
+ }
347
+
348
+ #endif