ruby2d 0.9.3 → 0.11.0
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.
- checksums.yaml +4 -4
- data/assets/README.md +7 -9
- data/assets/Rakefile +85 -0
- data/assets/include/SDL2/SDL.h +4 -1
- data/assets/include/SDL2/SDL_assert.h +3 -1
- data/assets/include/SDL2/SDL_atomic.h +20 -2
- data/assets/include/SDL2/SDL_audio.h +47 -14
- data/assets/include/SDL2/SDL_bits.h +10 -1
- data/assets/include/SDL2/SDL_blendmode.h +10 -7
- data/assets/include/SDL2/SDL_clipboard.h +1 -1
- data/assets/include/SDL2/SDL_config.h +24 -390
- data/assets/include/SDL2/SDL_config_android.h +182 -0
- data/assets/include/SDL2/SDL_config_iphoneos.h +207 -0
- data/assets/include/SDL2/SDL_config_macosx.h +266 -0
- data/assets/include/SDL2/SDL_config_minimal.h +85 -0
- data/assets/include/SDL2/SDL_config_os2.h +188 -0
- data/assets/include/SDL2/SDL_config_pandora.h +135 -0
- data/assets/include/SDL2/SDL_config_psp.h +165 -0
- data/assets/include/SDL2/SDL_config_windows.h +288 -0
- data/assets/include/SDL2/SDL_config_winrt.h +243 -0
- data/assets/include/SDL2/SDL_config_wiz.h +149 -0
- data/assets/include/SDL2/SDL_copying.h +20 -0
- data/assets/include/SDL2/SDL_cpuinfo.h +119 -8
- data/assets/include/SDL2/SDL_egl.h +4 -1
- data/assets/include/SDL2/SDL_endian.h +6 -3
- data/assets/include/SDL2/SDL_error.h +38 -2
- data/assets/include/SDL2/SDL_events.h +67 -28
- data/assets/include/SDL2/SDL_filesystem.h +1 -1
- data/assets/include/SDL2/SDL_gamecontroller.h +160 -9
- data/assets/include/SDL2/SDL_gesture.h +1 -1
- data/assets/include/SDL2/SDL_haptic.h +10 -1
- data/assets/include/SDL2/SDL_hints.h +460 -17
- data/assets/include/SDL2/SDL_image.h +2 -2
- data/assets/include/SDL2/SDL_joystick.h +115 -24
- data/assets/include/SDL2/SDL_keyboard.h +1 -1
- data/assets/include/SDL2/SDL_keycode.h +11 -9
- data/assets/include/SDL2/SDL_loadso.h +1 -1
- data/assets/include/SDL2/SDL_locale.h +101 -0
- data/assets/include/SDL2/SDL_log.h +3 -3
- data/assets/include/SDL2/SDL_main.h +28 -16
- data/assets/include/SDL2/SDL_messagebox.h +6 -4
- data/assets/include/SDL2/SDL_metal.h +117 -0
- data/assets/include/SDL2/SDL_misc.h +75 -0
- data/assets/include/SDL2/SDL_mouse.h +1 -1
- data/assets/include/SDL2/SDL_mutex.h +1 -1
- data/assets/include/SDL2/SDL_name.h +1 -1
- data/assets/include/SDL2/SDL_opengl.h +1 -1
- data/assets/include/SDL2/SDL_opengl_glext.h +3 -0
- data/assets/include/SDL2/SDL_opengles.h +1 -1
- data/assets/include/SDL2/SDL_opengles2.h +1 -1
- data/assets/include/SDL2/SDL_pixels.h +27 -18
- data/assets/include/SDL2/SDL_platform.h +1 -1
- data/assets/include/SDL2/SDL_power.h +1 -1
- data/assets/include/SDL2/SDL_quit.h +1 -1
- data/assets/include/SDL2/SDL_rect.h +29 -3
- data/assets/include/SDL2/SDL_render.h +230 -3
- data/assets/include/SDL2/SDL_revision.h +2 -2
- data/assets/include/SDL2/SDL_rwops.h +51 -22
- data/assets/include/SDL2/SDL_scancode.h +2 -2
- data/assets/include/SDL2/SDL_sensor.h +28 -12
- data/assets/include/SDL2/SDL_shape.h +1 -1
- data/assets/include/SDL2/SDL_stdinc.h +44 -4
- data/assets/include/SDL2/SDL_surface.h +12 -2
- data/assets/include/SDL2/SDL_system.h +50 -4
- data/assets/include/SDL2/SDL_syswm.h +39 -9
- data/assets/include/SDL2/SDL_test.h +1 -1
- data/assets/include/SDL2/SDL_test_assert.h +1 -1
- data/assets/include/SDL2/SDL_test_common.h +32 -2
- data/assets/include/SDL2/SDL_test_compare.h +1 -1
- data/assets/include/SDL2/SDL_test_crc32.h +1 -1
- data/assets/include/SDL2/SDL_test_font.h +1 -1
- data/assets/include/SDL2/SDL_test_fuzzer.h +1 -1
- data/assets/include/SDL2/SDL_test_harness.h +1 -1
- data/assets/include/SDL2/SDL_test_images.h +1 -1
- data/assets/include/SDL2/SDL_test_log.h +1 -1
- data/assets/include/SDL2/SDL_test_md5.h +1 -1
- data/assets/include/SDL2/SDL_test_memory.h +3 -3
- data/assets/include/SDL2/SDL_test_random.h +1 -1
- data/assets/include/SDL2/SDL_thread.h +34 -11
- data/assets/include/SDL2/SDL_timer.h +1 -1
- data/assets/include/SDL2/SDL_touch.h +17 -1
- data/assets/include/SDL2/SDL_types.h +1 -1
- data/assets/include/SDL2/SDL_version.h +2 -2
- data/assets/include/SDL2/SDL_video.h +11 -5
- data/assets/include/SDL2/SDL_vulkan.h +9 -11
- data/assets/include/SDL2/begin_code.h +8 -9
- data/assets/include/SDL2/close_code.h +4 -1
- data/assets/macos/lib/libFLAC.a +0 -0
- data/assets/macos/lib/libSDL2.a +0 -0
- data/assets/macos/lib/libSDL2_image.a +0 -0
- data/assets/macos/lib/libSDL2_mixer.a +0 -0
- data/assets/macos/lib/libSDL2_ttf.a +0 -0
- data/assets/macos/lib/libfreetype.a +0 -0
- data/assets/macos/lib/libjpeg.a +0 -0
- data/assets/macos/lib/libmpg123.a +0 -0
- data/assets/macos/lib/libogg.a +0 -0
- data/assets/macos/lib/libpng16.a +0 -0
- data/assets/macos/lib/libtiff.a +0 -0
- data/assets/macos/lib/libvorbis.a +0 -0
- data/assets/macos/lib/libvorbisfile.a +0 -0
- data/assets/macos/lib/libwebp.a +0 -0
- data/assets/mingw/bin/SDL2.dll +0 -0
- data/assets/mingw/bin/SDL2_image.dll +0 -0
- data/assets/mingw/bin/libpng16-16.dll +0 -0
- data/assets/mingw/bin/libtiff-5.dll +0 -0
- data/assets/mingw/bin/libwebp-7.dll +0 -0
- data/assets/mingw/lib/libSDL2.a +0 -0
- data/assets/mingw/lib/libSDL2.dll.a +0 -0
- data/assets/mingw/lib/libSDL2_image.a +0 -0
- data/assets/mingw/lib/libSDL2_image.dll.a +0 -0
- data/assets/mingw/lib/libSDL2_test.a +0 -0
- data/assets/mingw/lib/libSDL2main.a +0 -0
- data/bin/ruby2d +1 -0
- data/{assets/linux/simple2d/src/simple2d.c → ext/ruby2d/common.c} +32 -32
- data/{assets/linux/simple2d/src → ext/ruby2d}/controllers.c +17 -17
- data/ext/ruby2d/extconf.rb +36 -58
- data/ext/ruby2d/font.c +35 -0
- data/{assets/linux/simple2d/src → ext/ruby2d}/gl.c +72 -100
- data/ext/ruby2d/gl2.c +86 -0
- data/ext/ruby2d/gl3.c +305 -0
- data/{assets/linux/simple2d/src → ext/ruby2d}/gles.c +22 -81
- data/ext/ruby2d/image.c +58 -0
- data/{assets/linux/simple2d/src → ext/ruby2d}/input.c +8 -8
- data/{assets/linux/simple2d/src → ext/ruby2d}/music.c +30 -17
- data/ext/ruby2d/ruby2d.c +449 -439
- data/ext/ruby2d/ruby2d.h +652 -0
- data/{assets/linux/simple2d/src → ext/ruby2d}/shapes.c +18 -18
- data/ext/ruby2d/sound.c +118 -0
- data/ext/ruby2d/text.c +22 -0
- data/{assets/linux/simple2d/src → ext/ruby2d}/window.c +73 -62
- data/lib/ruby2d/circle.rb +21 -3
- data/lib/ruby2d/cli/build.rb +4 -7
- data/lib/ruby2d/dsl.rb +16 -9
- data/lib/ruby2d/entity.rb +17 -0
- data/lib/ruby2d/font.rb +23 -3
- data/lib/ruby2d/image.rb +35 -7
- data/lib/ruby2d/line.rb +23 -1
- data/lib/ruby2d/music.rb +5 -0
- data/lib/ruby2d/pixel.rb +17 -0
- data/lib/ruby2d/quad.rb +21 -1
- data/lib/ruby2d/rectangle.rb +12 -3
- data/lib/ruby2d/renderable.rb +4 -20
- data/lib/ruby2d/sound.rb +30 -0
- data/lib/ruby2d/sprite.rb +57 -75
- data/lib/ruby2d/square.rb +10 -1
- data/lib/ruby2d/text.rb +55 -12
- data/lib/ruby2d/texture.rb +28 -0
- data/lib/ruby2d/tileset.rb +87 -0
- data/lib/ruby2d/triangle.rb +19 -1
- data/lib/ruby2d/version.rb +1 -1
- data/lib/ruby2d/vertices.rb +84 -0
- data/lib/ruby2d/window.rb +259 -22
- data/lib/ruby2d.rb +6 -1
- metadata +41 -26
- data/assets/include/simple2d.h +0 -735
- data/assets/linux/simple2d/Makefile +0 -257
- data/assets/linux/simple2d/bin/simple2d.sh +0 -1312
- data/assets/linux/simple2d/include/simple2d.h +0 -735
- data/assets/linux/simple2d/src/gl2.c +0 -146
- data/assets/linux/simple2d/src/gl3.c +0 -275
- data/assets/linux/simple2d/src/image.c +0 -138
- data/assets/linux/simple2d/src/sound.c +0 -56
- data/assets/linux/simple2d/src/sprite.c +0 -147
- data/assets/linux/simple2d/src/text.c +0 -129
- data/assets/macos/lib/libsimple2d.a +0 -0
- data/assets/mingw/lib/libsimple2d.a +0 -0
data/ext/ruby2d/gl3.c
ADDED
|
@@ -0,0 +1,305 @@
|
|
|
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 = 7500; // number of objects the VBO can store
|
|
14
|
+
static GLuint verticesTextureIds[7500]; // store the texture_id of each vertices
|
|
15
|
+
static GLuint shaderProgram; // triangle shader program
|
|
16
|
+
static GLuint texShaderProgram; // texture shader program
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
/*
|
|
20
|
+
* Applies the projection matrix
|
|
21
|
+
*/
|
|
22
|
+
void R2D_GL3_ApplyProjection(GLfloat orthoMatrix[16]) {
|
|
23
|
+
|
|
24
|
+
// Use the program object
|
|
25
|
+
glUseProgram(shaderProgram);
|
|
26
|
+
|
|
27
|
+
// Apply the projection matrix to the triangle shader
|
|
28
|
+
glUniformMatrix4fv(
|
|
29
|
+
glGetUniformLocation(shaderProgram, "u_mvpMatrix"),
|
|
30
|
+
1, GL_FALSE, orthoMatrix
|
|
31
|
+
);
|
|
32
|
+
|
|
33
|
+
// Use the texture program object
|
|
34
|
+
glUseProgram(texShaderProgram);
|
|
35
|
+
|
|
36
|
+
// Apply the projection matrix to the texture shader
|
|
37
|
+
glUniformMatrix4fv(
|
|
38
|
+
glGetUniformLocation(texShaderProgram, "u_mvpMatrix"),
|
|
39
|
+
1, GL_FALSE, orthoMatrix
|
|
40
|
+
);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
/*
|
|
45
|
+
* Initalize OpenGL
|
|
46
|
+
*/
|
|
47
|
+
int R2D_GL3_Init() {
|
|
48
|
+
|
|
49
|
+
// Enable transparency
|
|
50
|
+
glEnable(GL_BLEND);
|
|
51
|
+
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
|
52
|
+
|
|
53
|
+
// Vertex shader source string
|
|
54
|
+
GLchar vertexSource[] =
|
|
55
|
+
"#version 150 core\n" // shader version
|
|
56
|
+
|
|
57
|
+
"uniform mat4 u_mvpMatrix;" // projection matrix
|
|
58
|
+
|
|
59
|
+
// Input attributes to the vertex shader
|
|
60
|
+
"in vec4 position;" // position value
|
|
61
|
+
"in vec4 color;" // vertex color
|
|
62
|
+
"in vec2 texcoord;" // texture coordinates
|
|
63
|
+
|
|
64
|
+
// Outputs to the fragment shader
|
|
65
|
+
"out vec4 Color;" // vertex color
|
|
66
|
+
"out vec2 Texcoord;" // texture coordinates
|
|
67
|
+
|
|
68
|
+
"void main() {"
|
|
69
|
+
// Send the color and texture coordinates right through to the fragment shader
|
|
70
|
+
" Color = color;"
|
|
71
|
+
" Texcoord = texcoord;"
|
|
72
|
+
// Transform the vertex position using the projection matrix
|
|
73
|
+
" gl_Position = u_mvpMatrix * position;"
|
|
74
|
+
"}";
|
|
75
|
+
|
|
76
|
+
// Fragment shader source string
|
|
77
|
+
GLchar fragmentSource[] =
|
|
78
|
+
"#version 150 core\n" // shader version
|
|
79
|
+
"in vec4 Color;" // input color from vertex shader
|
|
80
|
+
"out vec4 outColor;" // output fragment color
|
|
81
|
+
|
|
82
|
+
"void main() {"
|
|
83
|
+
" outColor = Color;" // pass the color right through
|
|
84
|
+
"}";
|
|
85
|
+
|
|
86
|
+
// Fragment shader source string for textures
|
|
87
|
+
GLchar texFragmentSource[] =
|
|
88
|
+
"#version 150 core\n" // shader version
|
|
89
|
+
"in vec4 Color;" // input color from vertex shader
|
|
90
|
+
"in vec2 Texcoord;" // input texture coordinates
|
|
91
|
+
"out vec4 outColor;" // output fragment color
|
|
92
|
+
"uniform sampler2D tex;" // 2D texture unit
|
|
93
|
+
|
|
94
|
+
"void main() {"
|
|
95
|
+
// Apply the texture unit, texture coordinates, and color
|
|
96
|
+
" outColor = texture(tex, Texcoord) * Color;"
|
|
97
|
+
"}";
|
|
98
|
+
|
|
99
|
+
// Create a vertex array object
|
|
100
|
+
GLuint vao;
|
|
101
|
+
glGenVertexArrays(1, &vao);
|
|
102
|
+
glBindVertexArray(vao);
|
|
103
|
+
|
|
104
|
+
// Create a vertex buffer object and allocate data
|
|
105
|
+
glGenBuffers(1, &vbo);
|
|
106
|
+
glBindBuffer(GL_ARRAY_BUFFER, vbo);
|
|
107
|
+
vboSize = vboObjCapacity * sizeof(GLfloat) * 8;
|
|
108
|
+
vboData = (GLfloat *) malloc(vboSize);
|
|
109
|
+
vboDataCurrent = vboData;
|
|
110
|
+
|
|
111
|
+
// Create an element buffer object
|
|
112
|
+
GLuint ebo;
|
|
113
|
+
glGenBuffers(1, &ebo);
|
|
114
|
+
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo);
|
|
115
|
+
|
|
116
|
+
// Load the vertex and fragment shaders
|
|
117
|
+
GLuint vertexShader = R2D_GL_LoadShader( GL_VERTEX_SHADER, vertexSource, "GL3 Vertex");
|
|
118
|
+
GLuint fragmentShader = R2D_GL_LoadShader(GL_FRAGMENT_SHADER, fragmentSource, "GL3 Fragment");
|
|
119
|
+
GLuint texFragmentShader = R2D_GL_LoadShader(GL_FRAGMENT_SHADER, texFragmentSource, "GL3 Texture Fragment");
|
|
120
|
+
|
|
121
|
+
// Triangle Shader //
|
|
122
|
+
|
|
123
|
+
// Create the shader program object
|
|
124
|
+
shaderProgram = glCreateProgram();
|
|
125
|
+
|
|
126
|
+
// Check if program was created successfully
|
|
127
|
+
if (shaderProgram == 0) {
|
|
128
|
+
R2D_GL_PrintError("Failed to create shader program");
|
|
129
|
+
return GL_FALSE;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
// Attach the shader objects to the program object
|
|
133
|
+
glAttachShader(shaderProgram, vertexShader);
|
|
134
|
+
glAttachShader(shaderProgram, fragmentShader);
|
|
135
|
+
|
|
136
|
+
// Bind the output color variable to the fragment shader color number
|
|
137
|
+
glBindFragDataLocation(shaderProgram, 0, "outColor");
|
|
138
|
+
|
|
139
|
+
// Link the shader program
|
|
140
|
+
glLinkProgram(shaderProgram);
|
|
141
|
+
|
|
142
|
+
// Check if linked
|
|
143
|
+
R2D_GL_CheckLinked(shaderProgram, "GL3 shader");
|
|
144
|
+
|
|
145
|
+
// Specify the layout of the position vertex data...
|
|
146
|
+
GLint posAttrib = glGetAttribLocation(shaderProgram, "position");
|
|
147
|
+
glEnableVertexAttribArray(posAttrib);
|
|
148
|
+
glVertexAttribPointer(posAttrib, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(GLfloat), 0);
|
|
149
|
+
|
|
150
|
+
// ...and the color vertex data
|
|
151
|
+
GLint colAttrib = glGetAttribLocation(shaderProgram, "color");
|
|
152
|
+
glEnableVertexAttribArray(colAttrib);
|
|
153
|
+
glVertexAttribPointer(colAttrib, 4, GL_FLOAT, GL_FALSE, 8 * sizeof(GLfloat), (void*)(2 * sizeof(GLfloat)));
|
|
154
|
+
|
|
155
|
+
// Texture Shader //
|
|
156
|
+
|
|
157
|
+
// Create the texture shader program object
|
|
158
|
+
texShaderProgram = glCreateProgram();
|
|
159
|
+
|
|
160
|
+
// Check if program was created successfully
|
|
161
|
+
if (texShaderProgram == 0) {
|
|
162
|
+
R2D_GL_PrintError("Failed to create shader program");
|
|
163
|
+
return GL_FALSE;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
// Attach the shader objects to the program object
|
|
167
|
+
glAttachShader(texShaderProgram, vertexShader);
|
|
168
|
+
glAttachShader(texShaderProgram, texFragmentShader);
|
|
169
|
+
|
|
170
|
+
// Bind the output color variable to the fragment shader color number
|
|
171
|
+
glBindFragDataLocation(texShaderProgram, 0, "outColor");
|
|
172
|
+
|
|
173
|
+
// Link the shader program
|
|
174
|
+
glLinkProgram(texShaderProgram);
|
|
175
|
+
|
|
176
|
+
// Check if linked
|
|
177
|
+
R2D_GL_CheckLinked(texShaderProgram, "GL3 texture shader");
|
|
178
|
+
|
|
179
|
+
// Specify the layout of the position vertex data...
|
|
180
|
+
posAttrib = glGetAttribLocation(texShaderProgram, "position");
|
|
181
|
+
glVertexAttribPointer(posAttrib, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(GLfloat), 0);
|
|
182
|
+
glEnableVertexAttribArray(posAttrib);
|
|
183
|
+
|
|
184
|
+
// ...and the color vertex data...
|
|
185
|
+
colAttrib = glGetAttribLocation(texShaderProgram, "color");
|
|
186
|
+
glVertexAttribPointer(colAttrib, 4, GL_FLOAT, GL_FALSE, 8 * sizeof(GLfloat), (void*)(2 * sizeof(GLfloat)));
|
|
187
|
+
glEnableVertexAttribArray(colAttrib);
|
|
188
|
+
|
|
189
|
+
// ...and the texture coordinates
|
|
190
|
+
GLint texAttrib = glGetAttribLocation(texShaderProgram, "texcoord");
|
|
191
|
+
glVertexAttribPointer(texAttrib, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(GLfloat), (void*)(6 * sizeof(GLfloat)));
|
|
192
|
+
glEnableVertexAttribArray(texAttrib);
|
|
193
|
+
|
|
194
|
+
// Clean up
|
|
195
|
+
glDeleteShader(vertexShader);
|
|
196
|
+
glDeleteShader(fragmentShader);
|
|
197
|
+
glDeleteShader(texFragmentShader);
|
|
198
|
+
|
|
199
|
+
// If successful, return true
|
|
200
|
+
return GL_TRUE;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
|
|
204
|
+
/*
|
|
205
|
+
* Render the vertex buffer and reset it
|
|
206
|
+
*/
|
|
207
|
+
void R2D_GL3_FlushBuffers() {
|
|
208
|
+
// Bind to the vertex buffer object and update its data
|
|
209
|
+
glBindBuffer(GL_ARRAY_BUFFER, vbo);
|
|
210
|
+
|
|
211
|
+
glBufferData(GL_ARRAY_BUFFER, vboSize, NULL, GL_DYNAMIC_DRAW);
|
|
212
|
+
glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(GLfloat) * vboDataIndex * 8, vboData);
|
|
213
|
+
|
|
214
|
+
GLuint verticesOffset = 0;
|
|
215
|
+
GLuint lastTextureId = verticesTextureIds[0];
|
|
216
|
+
|
|
217
|
+
for (GLuint i = 0; i <= vboDataIndex; i++) {
|
|
218
|
+
if(lastTextureId != verticesTextureIds[i] || i == vboDataIndex) {
|
|
219
|
+
// A texture ID of 0 represents no texture (render a triangle)
|
|
220
|
+
if(lastTextureId == 0) {
|
|
221
|
+
|
|
222
|
+
// Use the triangle shader program
|
|
223
|
+
glUseProgram(shaderProgram);
|
|
224
|
+
|
|
225
|
+
// A number other than 0 represents a texture_id
|
|
226
|
+
} else {
|
|
227
|
+
|
|
228
|
+
// Use the texture shader program
|
|
229
|
+
glUseProgram(texShaderProgram);
|
|
230
|
+
|
|
231
|
+
// Bind the texture using the provided ID
|
|
232
|
+
glBindTexture(GL_TEXTURE_2D, lastTextureId);
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
glDrawArrays(GL_TRIANGLES, verticesOffset, i - verticesOffset);
|
|
236
|
+
|
|
237
|
+
lastTextureId = verticesTextureIds[i];
|
|
238
|
+
verticesOffset = i;
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
// Reset the buffer object index and data pointer
|
|
243
|
+
vboDataIndex = 0;
|
|
244
|
+
vboDataCurrent = vboData;
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
|
|
248
|
+
/*
|
|
249
|
+
* Draw triangle
|
|
250
|
+
*/
|
|
251
|
+
void R2D_GL3_DrawTriangle(GLfloat x1, GLfloat y1,
|
|
252
|
+
GLfloat r1, GLfloat g1, GLfloat b1, GLfloat a1,
|
|
253
|
+
GLfloat x2, GLfloat y2,
|
|
254
|
+
GLfloat r2, GLfloat g2, GLfloat b2, GLfloat a2,
|
|
255
|
+
GLfloat x3, GLfloat y3,
|
|
256
|
+
GLfloat r3, GLfloat g3, GLfloat b3, GLfloat a3) {
|
|
257
|
+
|
|
258
|
+
// If buffer is full, flush it
|
|
259
|
+
if (vboDataIndex + 3 >= vboObjCapacity) R2D_GL3_FlushBuffers();
|
|
260
|
+
|
|
261
|
+
// Set the triangle data into a formatted array
|
|
262
|
+
GLfloat vertices[24] =
|
|
263
|
+
{ x1, y1, r1, g1, b1, a1, 0, 0,
|
|
264
|
+
x2, y2, r2, g2, b2, a2, 0, 0,
|
|
265
|
+
x3, y3, r3, g3, b3, a3, 0, 0 };
|
|
266
|
+
|
|
267
|
+
// Copy the vertex data into the current position of the buffer
|
|
268
|
+
memcpy(vboDataCurrent, vertices, sizeof(vertices));
|
|
269
|
+
|
|
270
|
+
// Increment the buffer object index and the vertex data pointer for next use
|
|
271
|
+
verticesTextureIds[vboDataIndex] = verticesTextureIds[vboDataIndex + 1] = verticesTextureIds[vboDataIndex + 2] = 0;
|
|
272
|
+
vboDataIndex += 3;
|
|
273
|
+
vboDataCurrent = (GLfloat *)((char *)vboDataCurrent + (sizeof(GLfloat) * 24));
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
|
|
277
|
+
/*
|
|
278
|
+
* Draw a texture (New method with vertices pre-calculated)
|
|
279
|
+
*/
|
|
280
|
+
void R2D_GL3_DrawTexture(GLfloat coordinates[], GLfloat texture_coordinates[], GLfloat color[], int texture_id) {
|
|
281
|
+
// If buffer is full, flush it
|
|
282
|
+
if (vboDataIndex + 6 >= vboObjCapacity) R2D_GL3_FlushBuffers();
|
|
283
|
+
|
|
284
|
+
// There are 6 vertices for a square as we are rendering two Triangles to make up our square:
|
|
285
|
+
// Triangle one: Top left, Top right, Bottom right
|
|
286
|
+
// Triangle two: Bottom right, Bottom left, Top left
|
|
287
|
+
GLfloat vertices[48] = {
|
|
288
|
+
coordinates[0], coordinates[1], color[0], color[1], color[2], color[3], texture_coordinates[0], texture_coordinates[1],
|
|
289
|
+
coordinates[2], coordinates[3], color[0], color[1], color[2], color[3], texture_coordinates[2], texture_coordinates[3],
|
|
290
|
+
coordinates[4], coordinates[5], color[0], color[1], color[2], color[3], texture_coordinates[4], texture_coordinates[5],
|
|
291
|
+
coordinates[4], coordinates[5], color[0], color[1], color[2], color[3], texture_coordinates[4], texture_coordinates[5],
|
|
292
|
+
coordinates[6], coordinates[7], color[0], color[1], color[2], color[3], texture_coordinates[6], texture_coordinates[7],
|
|
293
|
+
coordinates[0], coordinates[1], color[0], color[1], color[2], color[3], texture_coordinates[0], texture_coordinates[1],
|
|
294
|
+
};
|
|
295
|
+
|
|
296
|
+
// Copy the vertex data into the current position of the buffer
|
|
297
|
+
memcpy(vboDataCurrent, vertices, sizeof(vertices));
|
|
298
|
+
|
|
299
|
+
verticesTextureIds[vboDataIndex] = verticesTextureIds[vboDataIndex + 1] = verticesTextureIds[vboDataIndex + 2] = verticesTextureIds[vboDataIndex + 3] = verticesTextureIds[vboDataIndex + 4] = verticesTextureIds[vboDataIndex + 5] = texture_id;
|
|
300
|
+
vboDataIndex += 6;
|
|
301
|
+
vboDataCurrent = (GLfloat *)((char *)vboDataCurrent + (sizeof(GLfloat) * 48));
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
|
|
305
|
+
#endif
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// OpenGL ES 2.0
|
|
2
2
|
|
|
3
|
-
#include "
|
|
3
|
+
#include "ruby2d.h"
|
|
4
4
|
|
|
5
5
|
#if GLES
|
|
6
6
|
|
|
@@ -24,7 +24,7 @@ static GLushort indices[] =
|
|
|
24
24
|
/*
|
|
25
25
|
* Applies the projection matrix
|
|
26
26
|
*/
|
|
27
|
-
void
|
|
27
|
+
void R2D_GLES_ApplyProjection(GLfloat orthoMatrix[16]) {
|
|
28
28
|
|
|
29
29
|
// Use the program object
|
|
30
30
|
glUseProgram(shaderProgram);
|
|
@@ -47,7 +47,7 @@ void S2D_GLES_ApplyProjection(GLfloat orthoMatrix[16]) {
|
|
|
47
47
|
/*
|
|
48
48
|
* Initalize OpenGL ES
|
|
49
49
|
*/
|
|
50
|
-
int
|
|
50
|
+
int R2D_GLES_Init() {
|
|
51
51
|
|
|
52
52
|
// Enable transparency
|
|
53
53
|
glEnable(GL_BLEND);
|
|
@@ -99,9 +99,9 @@ int S2D_GLES_Init() {
|
|
|
99
99
|
"}";
|
|
100
100
|
|
|
101
101
|
// Load the vertex and fragment shaders
|
|
102
|
-
GLuint vertexShader =
|
|
103
|
-
GLuint fragmentShader =
|
|
104
|
-
GLuint texFragmentShader =
|
|
102
|
+
GLuint vertexShader = R2D_GL_LoadShader( GL_VERTEX_SHADER, vertexSource, "GLES Vertex");
|
|
103
|
+
GLuint fragmentShader = R2D_GL_LoadShader(GL_FRAGMENT_SHADER, fragmentSource, "GLES Fragment");
|
|
104
|
+
GLuint texFragmentShader = R2D_GL_LoadShader(GL_FRAGMENT_SHADER, texFragmentSource, "GLES Texture Fragment");
|
|
105
105
|
|
|
106
106
|
// Triangle Shader //
|
|
107
107
|
|
|
@@ -110,7 +110,7 @@ int S2D_GLES_Init() {
|
|
|
110
110
|
|
|
111
111
|
// Check if program was created successfully
|
|
112
112
|
if (shaderProgram == 0) {
|
|
113
|
-
|
|
113
|
+
R2D_GL_PrintError("Failed to create shader program");
|
|
114
114
|
return GL_FALSE;
|
|
115
115
|
}
|
|
116
116
|
|
|
@@ -122,7 +122,7 @@ int S2D_GLES_Init() {
|
|
|
122
122
|
glLinkProgram(shaderProgram);
|
|
123
123
|
|
|
124
124
|
// Check if linked
|
|
125
|
-
|
|
125
|
+
R2D_GL_CheckLinked(shaderProgram, "GLES shader");
|
|
126
126
|
|
|
127
127
|
// Get the attribute locations
|
|
128
128
|
positionLocation = glGetAttribLocation(shaderProgram, "a_position");
|
|
@@ -135,7 +135,7 @@ int S2D_GLES_Init() {
|
|
|
135
135
|
|
|
136
136
|
// Check if program was created successfully
|
|
137
137
|
if (texShaderProgram == 0) {
|
|
138
|
-
|
|
138
|
+
R2D_GL_PrintError("Failed to create shader program");
|
|
139
139
|
return GL_FALSE;
|
|
140
140
|
}
|
|
141
141
|
|
|
@@ -147,7 +147,7 @@ int S2D_GLES_Init() {
|
|
|
147
147
|
glLinkProgram(texShaderProgram);
|
|
148
148
|
|
|
149
149
|
// Check if linked
|
|
150
|
-
|
|
150
|
+
R2D_GL_CheckLinked(texShaderProgram, "GLES texture shader");
|
|
151
151
|
|
|
152
152
|
// Get the attribute locations
|
|
153
153
|
texPositionLocation = glGetAttribLocation(texShaderProgram, "a_position");
|
|
@@ -169,7 +169,7 @@ int S2D_GLES_Init() {
|
|
|
169
169
|
/*
|
|
170
170
|
* Draw triangle
|
|
171
171
|
*/
|
|
172
|
-
void
|
|
172
|
+
void R2D_GLES_DrawTriangle(GLfloat x1, GLfloat y1,
|
|
173
173
|
GLfloat r1, GLfloat g1, GLfloat b1, GLfloat a1,
|
|
174
174
|
GLfloat x2, GLfloat y2,
|
|
175
175
|
GLfloat r2, GLfloat g2, GLfloat b2, GLfloat a2,
|
|
@@ -202,40 +202,22 @@ void S2D_GLES_DrawTriangle(GLfloat x1, GLfloat y1,
|
|
|
202
202
|
|
|
203
203
|
|
|
204
204
|
/*
|
|
205
|
-
* Draw a texture
|
|
205
|
+
* Draw a texture (New method with vertices pre-calculated)
|
|
206
206
|
*/
|
|
207
|
-
|
|
208
|
-
GLfloat angle, GLfloat rx, GLfloat ry,
|
|
209
|
-
GLfloat r, GLfloat g, GLfloat b, GLfloat a,
|
|
210
|
-
GLfloat tx1, GLfloat ty1, GLfloat tx2, GLfloat ty2,
|
|
211
|
-
GLfloat tx3, GLfloat ty3, GLfloat tx4, GLfloat ty4,
|
|
212
|
-
GLuint texture_id) {
|
|
213
|
-
|
|
214
|
-
S2D_GL_Point v1 = { .x = x, .y = y };
|
|
215
|
-
S2D_GL_Point v2 = { .x = x + w, .y = y };
|
|
216
|
-
S2D_GL_Point v3 = { .x = x + w, .y = y + h };
|
|
217
|
-
S2D_GL_Point v4 = { .x = x, .y = y + h };
|
|
218
|
-
|
|
219
|
-
// Rotate vertices
|
|
220
|
-
if (angle != 0) {
|
|
221
|
-
v1 = S2D_RotatePoint(v1, angle, rx, ry);
|
|
222
|
-
v2 = S2D_RotatePoint(v2, angle, rx, ry);
|
|
223
|
-
v3 = S2D_RotatePoint(v3, angle, rx, ry);
|
|
224
|
-
v4 = S2D_RotatePoint(v4, angle, rx, ry);
|
|
225
|
-
}
|
|
226
|
-
|
|
207
|
+
void R2D_GLES_DrawTexture(GLfloat coordinates[], GLfloat texture_coordinates[], GLfloat color[], int texture_id);
|
|
227
208
|
GLfloat vertices[] =
|
|
228
209
|
// x, y coords | x, y texture coords
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
210
|
+
{
|
|
211
|
+
coordinates[0], coordinates[1], 0.f, texture_coordinates[0], texture_coordinates[1],
|
|
212
|
+
coordinates[2], coordinates[3], 0.f, texture_coordinates[2], texture_coordinates[3],
|
|
213
|
+
coordinates[4], coordinates[5], 0.f, texture_coordinates[4], texture_coordinates[5],
|
|
214
|
+
coordinates[6], coordinates[7], 0.f, texture_coordinates[6], texture_coordinates[7] };
|
|
233
215
|
|
|
234
216
|
GLfloat colors[] =
|
|
235
|
-
{
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
217
|
+
{ color[0], color[1], color[2], color[3],
|
|
218
|
+
color[0], color[1], color[2], color[3],
|
|
219
|
+
color[0], color[1], color[2], color[3],
|
|
220
|
+
color[0], color[1], color[2], color[3] };
|
|
239
221
|
|
|
240
222
|
glUseProgram(texShaderProgram);
|
|
241
223
|
|
|
@@ -264,45 +246,4 @@ static void S2D_GLES_DrawTexture(int x, int y, int w, int h,
|
|
|
264
246
|
}
|
|
265
247
|
|
|
266
248
|
|
|
267
|
-
/*
|
|
268
|
-
* Draw image
|
|
269
|
-
*/
|
|
270
|
-
void S2D_GLES_DrawImage(S2D_Image *img) {
|
|
271
|
-
S2D_GLES_DrawTexture(
|
|
272
|
-
img->x, img->y, img->width, img->height,
|
|
273
|
-
img->rotate, img->rx, img->ry,
|
|
274
|
-
img->color.r, img->color.g, img->color.b, img->color.a,
|
|
275
|
-
0.f, 0.f, 1.f, 0.f, 1.f, 1.f, 0.f, 1.f,
|
|
276
|
-
img->texture_id
|
|
277
|
-
);
|
|
278
|
-
}
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
/*
|
|
282
|
-
* Draw sprite
|
|
283
|
-
*/
|
|
284
|
-
void S2D_GLES_DrawSprite(S2D_Sprite *spr) {
|
|
285
|
-
S2D_GLES_DrawTexture(
|
|
286
|
-
spr->x, spr->y, spr->width, spr->height,
|
|
287
|
-
spr->rotate, spr->rx, spr->ry,
|
|
288
|
-
spr->color.r, spr->color.g, spr->color.b, spr->color.a,
|
|
289
|
-
spr->tx1, spr->ty1, spr->tx2, spr->ty2, spr->tx3, spr->ty3, spr->tx4, spr->ty4,
|
|
290
|
-
spr->img->texture_id
|
|
291
|
-
);
|
|
292
|
-
}
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
/*
|
|
296
|
-
* Draw text
|
|
297
|
-
*/
|
|
298
|
-
void S2D_GLES_DrawText(S2D_Text *txt) {
|
|
299
|
-
S2D_GLES_DrawTexture(
|
|
300
|
-
txt->x, txt->y, txt->width, txt->height,
|
|
301
|
-
txt->rotate, txt->rx, txt->ry,
|
|
302
|
-
txt->color.r, txt->color.g, txt->color.b, txt->color.a,
|
|
303
|
-
0.f, 0.f, 1.f, 0.f, 1.f, 1.f, 0.f, 1.f,
|
|
304
|
-
txt->texture_id
|
|
305
|
-
);
|
|
306
|
-
}
|
|
307
|
-
|
|
308
249
|
#endif
|