ruby2d 0.10.0 → 0.11.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/ext/ruby2d/extconf.rb +31 -23
- data/ext/ruby2d/font.c +35 -0
- data/ext/ruby2d/gl.c +8 -57
- data/ext/ruby2d/gl2.c +8 -83
- data/ext/ruby2d/gl3.c +57 -115
- data/ext/ruby2d/gles.c +11 -85
- data/ext/ruby2d/image.c +16 -96
- data/ext/ruby2d/ruby2d.c +178 -305
- data/ext/ruby2d/ruby2d.h +16 -153
- data/ext/ruby2d/sound.c +1 -1
- data/ext/ruby2d/text.c +10 -117
- data/ext/ruby2d/window.c +4 -4
- data/lib/ruby2d/circle.rb +3 -1
- data/lib/ruby2d/cli/build.rb +2 -0
- data/lib/ruby2d/font.rb +20 -1
- data/lib/ruby2d/image.rb +22 -17
- data/lib/ruby2d/line.rb +3 -1
- data/lib/ruby2d/quad.rb +3 -1
- data/lib/ruby2d/rectangle.rb +1 -1
- data/lib/ruby2d/renderable.rb +0 -12
- data/lib/ruby2d/sound.rb +25 -0
- data/lib/ruby2d/sprite.rb +37 -87
- data/lib/ruby2d/square.rb +1 -1
- data/lib/ruby2d/text.rb +42 -20
- data/lib/ruby2d/texture.rb +28 -0
- data/lib/ruby2d/tileset.rb +40 -22
- data/lib/ruby2d/triangle.rb +3 -1
- data/lib/ruby2d/version.rb +1 -1
- data/lib/ruby2d/vertices.rb +84 -0
- data/lib/ruby2d/window.rb +13 -3
- data/lib/ruby2d.rb +2 -0
- metadata +6 -5
- data/ext/ruby2d/sprite.c +0 -147
- data/ext/ruby2d/tileset.c +0 -30
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2a371c4ae782c20ba163d4267f55c06e65ab6893d8ced8dd99fc6fe1669a951e
|
4
|
+
data.tar.gz: f3d4715daec9b0b6e42c22ea6a58f8994773de62979981d994268f85af3d19a4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d866419232f24bd69b8bcf99a5cb9eae1d003f9033cbb9abeae4561a7ef7bf92bed995fa2286daf314acd8eb6a9eb625cae44ecb63255ac3d0f51ef9fa561ca9
|
7
|
+
data.tar.gz: 3247b8f90722dfd8f156f6d724a311c925653896b764e740a0e15211918efc0b45dd1c4153a1e8abaafa5e469a399603f2380bf641cec10305ad3e55f1aed7fc
|
data/ext/ruby2d/extconf.rb
CHANGED
@@ -12,6 +12,8 @@ when /linux/
|
|
12
12
|
if `cat /etc/os-release` =~ /raspbian/
|
13
13
|
$platform = :linux_rpi
|
14
14
|
end
|
15
|
+
when /bsd/
|
16
|
+
$platform = :bsd
|
15
17
|
when /mingw/
|
16
18
|
$platform = :windows
|
17
19
|
else
|
@@ -41,32 +43,38 @@ def add_flags(type, flags)
|
|
41
43
|
end
|
42
44
|
|
43
45
|
|
44
|
-
# Check SDL libraries
|
45
|
-
def
|
46
|
+
# Check for SDL libraries
|
47
|
+
def check_sdl
|
46
48
|
unless have_library('SDL2') && have_library('SDL2_image') && have_library('SDL2_mixer') && have_library('SDL2_ttf')
|
47
49
|
|
48
50
|
$errors << "Couldn't find packages needed by Ruby 2D."
|
49
51
|
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
52
|
+
case $platform
|
53
|
+
when :linux, :linux_rpi
|
54
|
+
# Fedora and CentOS
|
55
|
+
if system('which yum')
|
56
|
+
$errors << "Install the following packages using `yum` (or `dnf`) and try again:\n" <<
|
57
|
+
" SDL2-devel SDL2_image-devel SDL2_mixer-devel SDL2_ttf-devel".bold
|
58
|
+
|
59
|
+
# Arch
|
60
|
+
elsif system('which pacman')
|
61
|
+
$errors << "Install the following packages using `pacman` and try again:\n" <<
|
62
|
+
" sdl2 sdl2_image sdl2_mixer sdl2_ttf".bold
|
63
|
+
|
64
|
+
# openSUSE
|
65
|
+
elsif system('which zypper')
|
66
|
+
$errors << "Install the following packages using `zypper` and try again:\n" <<
|
67
|
+
" libSDL2-devel libSDL2_image-devel libSDL2_mixer-devel libSDL2_ttf-devel".bold
|
68
|
+
|
69
|
+
# Ubuntu, Debian, and Mint
|
70
|
+
# `apt` must be last because openSUSE has it aliased to `zypper`
|
71
|
+
elsif system('which apt')
|
72
|
+
$errors << "Install the following packages using `apt` and try again:\n" <<
|
73
|
+
" libsdl2-dev libsdl2-image-dev libsdl2-mixer-dev libsdl2-ttf-dev".bold
|
74
|
+
end
|
75
|
+
when :bsd
|
76
|
+
$errors << "Install the following packages using `pkg` and try again:\n" <<
|
58
77
|
" sdl2 sdl2_image sdl2_mixer sdl2_ttf".bold
|
59
|
-
|
60
|
-
# openSUSE
|
61
|
-
elsif system('which zypper')
|
62
|
-
$errors << "Install the following packages using `zypper` and try again:\n" <<
|
63
|
-
" libSDL2-devel libSDL2_image-devel libSDL2_mixer-devel libSDL2_ttf-devel".bold
|
64
|
-
|
65
|
-
# Ubuntu, Debian, and Mint
|
66
|
-
# `apt` must be last because openSUSE has it aliased to `zypper`
|
67
|
-
elsif system('which apt')
|
68
|
-
$errors << "Install the following packages using `apt` and try again:\n" <<
|
69
|
-
" libsdl2-dev libsdl2-image-dev libsdl2-mixer-dev libsdl2-ttf-dev".bold
|
70
78
|
end
|
71
79
|
|
72
80
|
$errors << "" << "See #{"ruby2d.com".bold} for additional help."
|
@@ -115,8 +123,8 @@ else
|
|
115
123
|
add_flags(:ld, "#{ldir}/libfreetype.a")
|
116
124
|
add_flags(:ld, "-Wl,-framework,Cocoa -Wl,-framework,GameController -Wl,-framework,ForceFeedback")
|
117
125
|
|
118
|
-
when :linux, :linux_rpi
|
119
|
-
|
126
|
+
when :linux, :linux_rpi, :bsd
|
127
|
+
check_sdl
|
120
128
|
|
121
129
|
set_rpi_flags
|
122
130
|
add_flags(:ld, "-lSDL2 -lSDL2_image -lSDL2_mixer -lSDL2_ttf -lm")
|
data/ext/ruby2d/font.c
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
// font.c
|
2
|
+
|
3
|
+
#include "ruby2d.h"
|
4
|
+
|
5
|
+
|
6
|
+
/*
|
7
|
+
* Create a TTF_Font object given a path to a font and a size
|
8
|
+
*/
|
9
|
+
TTF_Font *R2D_FontCreateTTFFont(const char *path, int size, const char *style) {
|
10
|
+
|
11
|
+
// Check if font file exists
|
12
|
+
if (!R2D_FileExists(path)) {
|
13
|
+
R2D_Error("R2D_FontCreateTTFFont", "Font file `%s` not found", path);
|
14
|
+
return NULL;
|
15
|
+
}
|
16
|
+
|
17
|
+
TTF_Font *font = TTF_OpenFont(path, size);
|
18
|
+
|
19
|
+
if (!font) {
|
20
|
+
R2D_Error("TTF_OpenFont", TTF_GetError());
|
21
|
+
return NULL;
|
22
|
+
}
|
23
|
+
|
24
|
+
if(strncmp(style, "bold", 4) == 0) {
|
25
|
+
TTF_SetFontStyle(font, TTF_STYLE_BOLD);
|
26
|
+
} else if(strncmp(style, "italic", 6) == 0) {
|
27
|
+
TTF_SetFontStyle(font, TTF_STYLE_ITALIC);
|
28
|
+
} else if(strncmp(style, "underline", 9) == 0) {
|
29
|
+
TTF_SetFontStyle(font, TTF_STYLE_UNDERLINE);
|
30
|
+
} else if(strncmp(style, "strikethrough", 13) == 0) {
|
31
|
+
TTF_SetFontStyle(font, TTF_STYLE_STRIKETHROUGH);
|
32
|
+
}
|
33
|
+
|
34
|
+
return font;
|
35
|
+
}
|
data/ext/ruby2d/gl.c
CHANGED
@@ -20,7 +20,7 @@ static GLfloat orthoMatrix[16] =
|
|
20
20
|
/*
|
21
21
|
* Prints current GL error
|
22
22
|
*/
|
23
|
-
void R2D_GL_PrintError(char *error) {
|
23
|
+
void R2D_GL_PrintError(const char *error) {
|
24
24
|
R2D_Log(R2D_ERROR, "%s (%d)", error, glGetError());
|
25
25
|
}
|
26
26
|
|
@@ -69,7 +69,7 @@ void R2D_GL_StoreContextInfo(R2D_Window *window) {
|
|
69
69
|
* Creates a shader object, loads shader string, and compiles.
|
70
70
|
* Returns 0 if shader could not be compiled.
|
71
71
|
*/
|
72
|
-
GLuint R2D_GL_LoadShader(GLenum type, const GLchar *shaderSrc, char *shaderName) {
|
72
|
+
GLuint R2D_GL_LoadShader(GLenum type, const GLchar *shaderSrc, const char *shaderName) {
|
73
73
|
|
74
74
|
// Create the shader object
|
75
75
|
GLuint shader = glCreateShader(type);
|
@@ -111,7 +111,7 @@ GLuint R2D_GL_LoadShader(GLenum type, const GLchar *shaderSrc, char *shaderName)
|
|
111
111
|
/*
|
112
112
|
* Check if shader program was linked
|
113
113
|
*/
|
114
|
-
int R2D_GL_CheckLinked(GLuint program, char *name) {
|
114
|
+
int R2D_GL_CheckLinked(GLuint program, const char *name) {
|
115
115
|
|
116
116
|
GLint linked;
|
117
117
|
glGetProgramiv(program, GL_LINK_STATUS, &linked);
|
@@ -361,65 +361,16 @@ void R2D_GL_DrawTriangle(GLfloat x1, GLfloat y1,
|
|
361
361
|
|
362
362
|
|
363
363
|
/*
|
364
|
-
* Draw
|
364
|
+
* Draw a texture
|
365
365
|
*/
|
366
|
-
void
|
366
|
+
void R2D_GL_DrawTexture(GLfloat coordinates[], GLfloat texture_coordinates[], GLfloat color[], int texture_id) {
|
367
367
|
#if GLES
|
368
|
-
|
368
|
+
R2D_GLES_DrawTexture(coordinates, texture_coordinates, color, texture_id);
|
369
369
|
#else
|
370
370
|
if (R2D_GL2) {
|
371
|
-
|
371
|
+
R2D_GL2_DrawTexture(coordinates, texture_coordinates, color, texture_id);
|
372
372
|
} else {
|
373
|
-
|
374
|
-
}
|
375
|
-
#endif
|
376
|
-
}
|
377
|
-
|
378
|
-
|
379
|
-
/*
|
380
|
-
* Draw sprite
|
381
|
-
*/
|
382
|
-
void R2D_GL_DrawSprite(R2D_Sprite *spr) {
|
383
|
-
#if GLES
|
384
|
-
R2D_GLES_DrawSprite(spr);
|
385
|
-
#else
|
386
|
-
if (R2D_GL2) {
|
387
|
-
R2D_GL2_DrawSprite(spr);
|
388
|
-
} else {
|
389
|
-
R2D_GL3_DrawSprite(spr);
|
390
|
-
}
|
391
|
-
#endif
|
392
|
-
}
|
393
|
-
|
394
|
-
|
395
|
-
/*
|
396
|
-
* Draw a tile
|
397
|
-
*/
|
398
|
-
void R2D_GL_DrawTile(R2D_Image *img, int x, int y, int tw, int th, GLfloat tx1, GLfloat ty1, GLfloat tx2,
|
399
|
-
GLfloat ty2, GLfloat tx3, GLfloat ty3, GLfloat tx4, GLfloat ty4) {
|
400
|
-
#if GLES
|
401
|
-
R2D_GLES_DrawTile(img, x, y, tw, th, tx1, ty1, tx2, ty2, tx3, ty3, tx4, ty4);
|
402
|
-
#else
|
403
|
-
if (R2D_GL2) {
|
404
|
-
R2D_GL2_DrawTile(img, x, y, tw, th, tx1, ty1, tx2, ty2, tx3, ty3, tx4, ty4);
|
405
|
-
} else {
|
406
|
-
R2D_GL3_DrawTile(img, x, y, tw, th, tx1, ty1, tx2, ty2, tx3, ty3, tx4, ty4);
|
407
|
-
}
|
408
|
-
#endif
|
409
|
-
}
|
410
|
-
|
411
|
-
|
412
|
-
/*
|
413
|
-
* Draw text
|
414
|
-
*/
|
415
|
-
void R2D_GL_DrawText(R2D_Text *txt) {
|
416
|
-
#if GLES
|
417
|
-
R2D_GLES_DrawText(txt);
|
418
|
-
#else
|
419
|
-
if (R2D_GL2) {
|
420
|
-
R2D_GL2_DrawText(txt);
|
421
|
-
} else {
|
422
|
-
R2D_GL3_DrawText(txt);
|
373
|
+
R2D_GL3_DrawTexture(coordinates, texture_coordinates, color, texture_id);
|
423
374
|
}
|
424
375
|
#endif
|
425
376
|
}
|
data/ext/ruby2d/gl2.c
CHANGED
@@ -64,98 +64,23 @@ void R2D_GL2_DrawTriangle(GLfloat x1, GLfloat y1,
|
|
64
64
|
|
65
65
|
|
66
66
|
/*
|
67
|
-
* Draw texture
|
67
|
+
* Draw a texture (New method with vertices pre-calculated)
|
68
68
|
*/
|
69
|
-
|
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
|
-
|
69
|
+
void R2D_GL2_DrawTexture(GLfloat coordinates[], GLfloat texture_coordinates[], GLfloat color[], int texture_id) {
|
89
70
|
glEnable(GL_TEXTURE_2D);
|
90
71
|
|
91
72
|
glBindTexture(GL_TEXTURE_2D, texture_id);
|
92
73
|
|
93
74
|
glBegin(GL_QUADS);
|
94
|
-
glColor4f(
|
95
|
-
glTexCoord2f(
|
96
|
-
glTexCoord2f(
|
97
|
-
glTexCoord2f(
|
98
|
-
glTexCoord2f(
|
75
|
+
glColor4f(color[0], color[1], color[2], color[3]);
|
76
|
+
glTexCoord2f(texture_coordinates[0], texture_coordinates[1]); glVertex2f(coordinates[0], coordinates[1]);
|
77
|
+
glTexCoord2f(texture_coordinates[2], texture_coordinates[3]); glVertex2f(coordinates[2], coordinates[3]);
|
78
|
+
glTexCoord2f(texture_coordinates[4], texture_coordinates[5]); glVertex2f(coordinates[4], coordinates[5]);
|
79
|
+
glTexCoord2f(texture_coordinates[6], texture_coordinates[7]); glVertex2f(coordinates[6], coordinates[7]);
|
99
80
|
glEnd();
|
100
81
|
|
101
82
|
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
|
-
|
83
|
+
};
|
132
84
|
|
133
|
-
/*
|
134
|
-
* Draw a tile
|
135
|
-
*/
|
136
|
-
void R2D_GL2_DrawTile(R2D_Image *img, int x, int y, int tw, int th, GLfloat tx1, GLfloat ty1, GLfloat tx2,
|
137
|
-
GLfloat ty2, GLfloat tx3, GLfloat ty3, GLfloat tx4, GLfloat ty4) {
|
138
|
-
R2D_GL2_DrawTexture(
|
139
|
-
x, y, tw, th,
|
140
|
-
img->rotate, img->rx, img->ry,
|
141
|
-
img->color.r, img->color.g, img->color.b, img->color.a,
|
142
|
-
tx1, ty1, tx2, ty2, tx3, ty3, tx4, ty4,
|
143
|
-
img->texture_id
|
144
|
-
);
|
145
|
-
}
|
146
|
-
|
147
|
-
|
148
|
-
/*
|
149
|
-
* Draw text
|
150
|
-
*/
|
151
|
-
void R2D_GL2_DrawText(R2D_Text *txt) {
|
152
|
-
R2D_GL2_DrawTexture(
|
153
|
-
txt->x, txt->y, txt->width, txt->height,
|
154
|
-
txt->rotate, txt->rx, txt->ry,
|
155
|
-
txt->color.r, txt->color.g, txt->color.b, txt->color.a,
|
156
|
-
0.f, 0.f, 1.f, 0.f, 1.f, 1.f, 0.f, 1.f,
|
157
|
-
txt->texture_id
|
158
|
-
);
|
159
|
-
}
|
160
85
|
|
161
86
|
#endif
|
data/ext/ruby2d/gl3.c
CHANGED
@@ -10,12 +10,10 @@ static GLuint vboSize; // size of the VBO in bytes
|
|
10
10
|
static GLfloat *vboData; // pointer to the VBO data
|
11
11
|
static GLfloat *vboDataCurrent; // pointer to the data for the current vertices
|
12
12
|
static GLuint vboDataIndex = 0; // index of the current object being rendered
|
13
|
-
static GLuint vboObjCapacity =
|
13
|
+
static GLuint vboObjCapacity = 7500; // number of objects the VBO can store
|
14
|
+
static GLuint verticesTextureIds[7500]; // store the texture_id of each vertices
|
14
15
|
static GLuint shaderProgram; // triangle shader program
|
15
16
|
static GLuint texShaderProgram; // texture shader program
|
16
|
-
static GLuint indices[] = // indices for rendering textured quads
|
17
|
-
{ 0, 1, 2,
|
18
|
-
2, 3, 0 };
|
19
17
|
|
20
18
|
|
21
19
|
/*
|
@@ -106,7 +104,7 @@ int R2D_GL3_Init() {
|
|
106
104
|
// Create a vertex buffer object and allocate data
|
107
105
|
glGenBuffers(1, &vbo);
|
108
106
|
glBindBuffer(GL_ARRAY_BUFFER, vbo);
|
109
|
-
vboSize = vboObjCapacity * sizeof(GLfloat) *
|
107
|
+
vboSize = vboObjCapacity * sizeof(GLfloat) * 8;
|
110
108
|
vboData = (GLfloat *) malloc(vboSize);
|
111
109
|
vboDataCurrent = vboData;
|
112
110
|
|
@@ -207,17 +205,39 @@ int R2D_GL3_Init() {
|
|
207
205
|
* Render the vertex buffer and reset it
|
208
206
|
*/
|
209
207
|
void R2D_GL3_FlushBuffers() {
|
210
|
-
|
211
|
-
// Use the triangle shader program
|
212
|
-
glUseProgram(shaderProgram);
|
213
|
-
|
214
208
|
// Bind to the vertex buffer object and update its data
|
215
209
|
glBindBuffer(GL_ARRAY_BUFFER, vbo);
|
210
|
+
|
216
211
|
glBufferData(GL_ARRAY_BUFFER, vboSize, NULL, GL_DYNAMIC_DRAW);
|
217
|
-
glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(GLfloat) * vboDataIndex *
|
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);
|
218
236
|
|
219
|
-
|
220
|
-
|
237
|
+
lastTextureId = verticesTextureIds[i];
|
238
|
+
verticesOffset = i;
|
239
|
+
}
|
240
|
+
}
|
221
241
|
|
222
242
|
// Reset the buffer object index and data pointer
|
223
243
|
vboDataIndex = 0;
|
@@ -236,10 +256,10 @@ void R2D_GL3_DrawTriangle(GLfloat x1, GLfloat y1,
|
|
236
256
|
GLfloat r3, GLfloat g3, GLfloat b3, GLfloat a3) {
|
237
257
|
|
238
258
|
// If buffer is full, flush it
|
239
|
-
if (vboDataIndex >= vboObjCapacity) R2D_GL3_FlushBuffers();
|
259
|
+
if (vboDataIndex + 3 >= vboObjCapacity) R2D_GL3_FlushBuffers();
|
240
260
|
|
241
261
|
// Set the triangle data into a formatted array
|
242
|
-
GLfloat vertices[] =
|
262
|
+
GLfloat vertices[24] =
|
243
263
|
{ x1, y1, r1, g1, b1, a1, 0, 0,
|
244
264
|
x2, y2, r2, g2, b2, a2, 0, 0,
|
245
265
|
x3, y3, r3, g3, b3, a3, 0, 0 };
|
@@ -248,116 +268,38 @@ void R2D_GL3_DrawTriangle(GLfloat x1, GLfloat y1,
|
|
248
268
|
memcpy(vboDataCurrent, vertices, sizeof(vertices));
|
249
269
|
|
250
270
|
// Increment the buffer object index and the vertex data pointer for next use
|
251
|
-
vboDataIndex
|
271
|
+
verticesTextureIds[vboDataIndex] = verticesTextureIds[vboDataIndex + 1] = verticesTextureIds[vboDataIndex + 2] = 0;
|
272
|
+
vboDataIndex += 3;
|
252
273
|
vboDataCurrent = (GLfloat *)((char *)vboDataCurrent + (sizeof(GLfloat) * 24));
|
253
274
|
}
|
254
275
|
|
255
276
|
|
256
277
|
/*
|
257
|
-
* Draw a texture
|
278
|
+
* Draw a texture (New method with vertices pre-calculated)
|
258
279
|
*/
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
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
|
-
}
|
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
|
+
};
|
333
295
|
|
296
|
+
// Copy the vertex data into the current position of the buffer
|
297
|
+
memcpy(vboDataCurrent, vertices, sizeof(vertices));
|
334
298
|
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
void R2D_GL3_DrawTile(R2D_Image *img, int x, int y, int tw, int th, GLfloat tx1, GLfloat ty1, GLfloat tx2,
|
339
|
-
GLfloat ty2, GLfloat tx3, GLfloat ty3, GLfloat tx4, GLfloat ty4) {
|
340
|
-
R2D_GL3_DrawTexture(
|
341
|
-
x, y, tw, th,
|
342
|
-
img->rotate, img->rx, img->ry,
|
343
|
-
img->color.r, img->color.g, img->color.b, img->color.a,
|
344
|
-
tx1, ty1, tx2, ty2, tx3, ty3, tx4, ty4,
|
345
|
-
img->texture_id
|
346
|
-
);
|
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));
|
347
302
|
}
|
348
303
|
|
349
304
|
|
350
|
-
/*
|
351
|
-
* Draw text
|
352
|
-
*/
|
353
|
-
void R2D_GL3_DrawText(R2D_Text *txt) {
|
354
|
-
R2D_GL3_DrawTexture(
|
355
|
-
txt->x, txt->y, txt->width, txt->height,
|
356
|
-
txt->rotate, txt->rx, txt->ry,
|
357
|
-
txt->color.r, txt->color.g, txt->color.b, txt->color.a,
|
358
|
-
0.f, 0.f, 1.f, 0.f, 1.f, 1.f, 0.f, 1.f,
|
359
|
-
txt->texture_id
|
360
|
-
);
|
361
|
-
}
|
362
|
-
|
363
305
|
#endif
|