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
data/ext/ruby2d/gles.c
CHANGED
@@ -202,40 +202,22 @@ void R2D_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
|
-
R2D_GL_Point v1 = { .x = x, .y = y };
|
215
|
-
R2D_GL_Point v2 = { .x = x + w, .y = y };
|
216
|
-
R2D_GL_Point v3 = { .x = x + w, .y = y + h };
|
217
|
-
R2D_GL_Point v4 = { .x = x, .y = y + h };
|
218
|
-
|
219
|
-
// Rotate vertices
|
220
|
-
if (angle != 0) {
|
221
|
-
v1 = R2D_RotatePoint(v1, angle, rx, ry);
|
222
|
-
v2 = R2D_RotatePoint(v2, angle, rx, ry);
|
223
|
-
v3 = R2D_RotatePoint(v3, angle, rx, ry);
|
224
|
-
v4 = R2D_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,60 +246,4 @@ static void R2D_GLES_DrawTexture(int x, int y, int w, int h,
|
|
264
246
|
}
|
265
247
|
|
266
248
|
|
267
|
-
/*
|
268
|
-
* Draw image
|
269
|
-
*/
|
270
|
-
void R2D_GLES_DrawImage(R2D_Image *img) {
|
271
|
-
R2D_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 R2D_GLES_DrawSprite(R2D_Sprite *spr) {
|
285
|
-
R2D_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 a tile
|
297
|
-
*/
|
298
|
-
void R2D_GLES_DrawTile(R2D_Image *img, int x, int y, int tw, int th, GLfloat tx1, GLfloat ty1, GLfloat tx2,
|
299
|
-
GLfloat ty2, GLfloat tx3, GLfloat ty3, GLfloat tx4, GLfloat ty4) {
|
300
|
-
R2D_GLES_DrawTexture(
|
301
|
-
x, y, tw, th,
|
302
|
-
img->rotate, img->rx, img->ry,
|
303
|
-
img->color.r, img->color.g, img->color.b, img->color.a,
|
304
|
-
tx1, ty1, tx2, ty2, tx3, ty3, tx4, ty4,
|
305
|
-
img->texture_id
|
306
|
-
);
|
307
|
-
}
|
308
|
-
|
309
|
-
|
310
|
-
/*
|
311
|
-
* Draw text
|
312
|
-
*/
|
313
|
-
void R2D_GLES_DrawText(R2D_Text *txt) {
|
314
|
-
R2D_GLES_DrawTexture(
|
315
|
-
txt->x, txt->y, txt->width, txt->height,
|
316
|
-
txt->rotate, txt->rx, txt->ry,
|
317
|
-
txt->color.r, txt->color.g, txt->color.b, txt->color.a,
|
318
|
-
0.f, 0.f, 1.f, 0.f, 1.f, 1.f, 0.f, 1.f,
|
319
|
-
txt->texture_id
|
320
|
-
);
|
321
|
-
}
|
322
|
-
|
323
249
|
#endif
|
data/ext/ruby2d/image.c
CHANGED
@@ -3,75 +3,39 @@
|
|
3
3
|
#include "ruby2d.h"
|
4
4
|
|
5
5
|
|
6
|
-
|
7
|
-
* Create an image, given a file path
|
8
|
-
*/
|
9
|
-
R2D_Image *R2D_CreateImage(const char *path) {
|
6
|
+
SDL_Surface *R2D_CreateImageSurface(const char *path) {
|
10
7
|
R2D_Init();
|
11
8
|
|
12
9
|
// Check if image file exists
|
13
10
|
if (!R2D_FileExists(path)) {
|
14
|
-
R2D_Error("
|
15
|
-
return NULL;
|
16
|
-
}
|
17
|
-
|
18
|
-
// Allocate the image structure
|
19
|
-
R2D_Image *img = (R2D_Image *) malloc(sizeof(R2D_Image));
|
20
|
-
if (!img) {
|
21
|
-
R2D_Error("R2D_CreateImage", "Out of memory!");
|
11
|
+
R2D_Error("R2D_CreateImageSurface", "Image file `%s` not found", path);
|
22
12
|
return NULL;
|
23
13
|
}
|
24
14
|
|
25
15
|
// Load image from file as SDL_Surface
|
26
|
-
|
27
|
-
if (!img->surface) {
|
28
|
-
R2D_Error("IMG_Load", IMG_GetError());
|
29
|
-
free(img);
|
30
|
-
return NULL;
|
31
|
-
}
|
16
|
+
SDL_Surface *surface = IMG_Load(path);
|
32
17
|
|
33
|
-
int bits_per_color =
|
34
|
-
|
35
|
-
|
18
|
+
int bits_per_color = surface->format->Amask == 0 ?
|
19
|
+
surface->format->BitsPerPixel / 3 :
|
20
|
+
surface->format->BitsPerPixel / 4;
|
36
21
|
|
37
22
|
if (bits_per_color < 8) {
|
38
23
|
R2D_Log(R2D_WARN, "`%s` has less than 8 bits per color and will likely not render correctly", path, bits_per_color);
|
39
24
|
}
|
40
25
|
|
41
|
-
|
42
|
-
|
43
|
-
img->x = 0;
|
44
|
-
img->y = 0;
|
45
|
-
img->color.r = 1.f;
|
46
|
-
img->color.g = 1.f;
|
47
|
-
img->color.b = 1.f;
|
48
|
-
img->color.a = 1.f;
|
49
|
-
img->orig_width = img->surface->w;
|
50
|
-
img->orig_height = img->surface->h;
|
51
|
-
img->width = img->orig_width;
|
52
|
-
img->height = img->orig_height;
|
53
|
-
img->rotate = 0;
|
54
|
-
img->rx = 0;
|
55
|
-
img->ry = 0;
|
56
|
-
img->texture_id = 0;
|
57
|
-
|
58
|
-
// Detect image mode
|
59
|
-
img->format = GL_RGB;
|
60
|
-
if (img->surface->format->BytesPerPixel == 4) {
|
61
|
-
img->format = GL_RGBA;
|
62
|
-
}
|
63
|
-
|
64
|
-
// Flip image bits if BGA
|
26
|
+
return surface;
|
27
|
+
}
|
65
28
|
|
66
|
-
|
67
|
-
Uint32
|
68
|
-
Uint32
|
29
|
+
void R2D_ImageConvertToRGB(SDL_Surface *surface) {
|
30
|
+
Uint32 r = surface->format->Rmask;
|
31
|
+
Uint32 g = surface->format->Gmask;
|
32
|
+
Uint32 a = surface->format->Amask;
|
69
33
|
|
70
34
|
if (r&0xFF000000 || r&0xFF0000) {
|
71
|
-
char *p = (char *)
|
72
|
-
int bpp =
|
73
|
-
int w =
|
74
|
-
int h =
|
35
|
+
char *p = (char *)surface->pixels;
|
36
|
+
int bpp = surface->format->BytesPerPixel;
|
37
|
+
int w = surface->w;
|
38
|
+
int h = surface->h;
|
75
39
|
char tmp;
|
76
40
|
for (int i = 0; i < bpp * w * h; i += bpp) {
|
77
41
|
if (a&0xFF) {
|
@@ -91,48 +55,4 @@ R2D_Image *R2D_CreateImage(const char *path) {
|
|
91
55
|
}
|
92
56
|
}
|
93
57
|
}
|
94
|
-
|
95
|
-
return img;
|
96
|
-
}
|
97
|
-
|
98
|
-
|
99
|
-
/*
|
100
|
-
* Rotate an image
|
101
|
-
*/
|
102
|
-
void R2D_RotateImage(R2D_Image *img, GLfloat angle, int position) {
|
103
|
-
|
104
|
-
R2D_GL_Point p = R2D_GetRectRotationPoint(
|
105
|
-
img->x, img->y, img->width, img->height, position
|
106
|
-
);
|
107
|
-
|
108
|
-
img->rotate = angle;
|
109
|
-
img->rx = p.x;
|
110
|
-
img->ry = p.y;
|
111
|
-
}
|
112
|
-
|
113
|
-
|
114
|
-
/*
|
115
|
-
* Draw an image
|
116
|
-
*/
|
117
|
-
void R2D_DrawImage(R2D_Image *img) {
|
118
|
-
if (!img) return;
|
119
|
-
|
120
|
-
if (img->texture_id == 0) {
|
121
|
-
R2D_GL_CreateTexture(&img->texture_id, img->format,
|
122
|
-
img->orig_width, img->orig_height,
|
123
|
-
img->surface->pixels, GL_NEAREST);
|
124
|
-
SDL_FreeSurface(img->surface);
|
125
|
-
}
|
126
|
-
|
127
|
-
R2D_GL_DrawImage(img);
|
128
|
-
}
|
129
|
-
|
130
|
-
|
131
|
-
/*
|
132
|
-
* Free an image
|
133
|
-
*/
|
134
|
-
void R2D_FreeImage(R2D_Image *img) {
|
135
|
-
if (!img) return;
|
136
|
-
R2D_GL_FreeTexture(&img->texture_id);
|
137
|
-
free(img);
|
138
58
|
}
|
data/ext/ruby2d/ruby2d.c
CHANGED
@@ -108,18 +108,6 @@ static R2D_Window *window;
|
|
108
108
|
|
109
109
|
// Method signatures and structures for Ruby 2D classes
|
110
110
|
#if MRUBY
|
111
|
-
static void free_image(mrb_state *mrb, void *p_);
|
112
|
-
static const struct mrb_data_type image_data_type = {
|
113
|
-
"image", free_image
|
114
|
-
};
|
115
|
-
static void free_sprite(mrb_state *mrb, void *p_);
|
116
|
-
static const struct mrb_data_type sprite_data_type = {
|
117
|
-
"sprite", free_sprite
|
118
|
-
};
|
119
|
-
static void free_text(mrb_state *mrb, void *p_);
|
120
|
-
static const struct mrb_data_type text_data_type = {
|
121
|
-
"text", free_text
|
122
|
-
};
|
123
111
|
static void free_sound(mrb_state *mrb, void *p_);
|
124
112
|
static const struct mrb_data_type sound_data_type = {
|
125
113
|
"sound", free_sound
|
@@ -129,11 +117,10 @@ static R2D_Window *window;
|
|
129
117
|
"music", free_music
|
130
118
|
};
|
131
119
|
#else
|
132
|
-
static void free_image(R2D_Image *img);
|
133
|
-
static void free_sprite(R2D_Sprite *spr);
|
134
|
-
static void free_text(R2D_Text *txt);
|
135
120
|
static void free_sound(R2D_Sound *snd);
|
136
121
|
static void free_music(R2D_Music *mus);
|
122
|
+
static void free_font(TTF_Font *font);
|
123
|
+
static void free_surface(SDL_Surface *font);
|
137
124
|
#endif
|
138
125
|
|
139
126
|
|
@@ -368,353 +355,190 @@ static R_VAL ruby2d_circle_ext_draw(R_VAL self, R_VAL a) {
|
|
368
355
|
|
369
356
|
|
370
357
|
/*
|
371
|
-
* Ruby2D::Image#
|
372
|
-
*
|
373
|
-
*/
|
374
|
-
#if MRUBY
|
375
|
-
static R_VAL ruby2d_image_ext_init(mrb_state* mrb, R_VAL self) {
|
376
|
-
mrb_value path;
|
377
|
-
mrb_get_args(mrb, "o", &path);
|
378
|
-
#else
|
379
|
-
static R_VAL ruby2d_image_ext_init(R_VAL self, R_VAL path) {
|
380
|
-
#endif
|
381
|
-
R2D_Image *img = R2D_CreateImage(RSTRING_PTR(path));
|
382
|
-
if (!img) return R_FALSE;
|
383
|
-
|
384
|
-
// Get width and height from Ruby class. If set, use it, else choose the
|
385
|
-
// native dimensions of the image.
|
386
|
-
R_VAL w = r_iv_get(self, "@width");
|
387
|
-
R_VAL h = r_iv_get(self, "@height");
|
388
|
-
r_iv_set(self, "@width" , r_test(w) ? w : INT2NUM(img->width));
|
389
|
-
r_iv_set(self, "@height", r_test(h) ? h : INT2NUM(img->height));
|
390
|
-
r_iv_set(self, "@data", r_data_wrap_struct(image, img));
|
391
|
-
|
392
|
-
return R_TRUE;
|
393
|
-
}
|
394
|
-
|
395
|
-
|
396
|
-
/*
|
397
|
-
* Ruby2D::Image#self.ext_draw
|
358
|
+
* Ruby2D::Image#ext_load_image
|
359
|
+
* Create an SDL surface from an image path, return the surface, width, and height
|
398
360
|
*/
|
399
|
-
|
400
|
-
|
401
|
-
mrb_value a;
|
402
|
-
mrb_get_args(mrb, "o", &a);
|
403
|
-
#else
|
404
|
-
static R_VAL ruby2d_image_ext_draw(R_VAL self, R_VAL a) {
|
405
|
-
#endif
|
406
|
-
// `a` is the array representing the image
|
361
|
+
static R_VAL ruby2d_image_ext_load_image(R_VAL self, R_VAL path) {
|
362
|
+
R2D_Init();
|
407
363
|
|
408
|
-
|
409
|
-
r_data_get_struct(r_ary_entry(a, 0), "@data", &image_data_type, R2D_Image, img);
|
364
|
+
VALUE result = rb_ary_new2(3);
|
410
365
|
|
411
|
-
|
412
|
-
|
366
|
+
SDL_Surface *surface = R2D_CreateImageSurface(RSTRING_PTR(path));
|
367
|
+
R2D_ImageConvertToRGB(surface);
|
413
368
|
|
414
|
-
|
415
|
-
|
416
|
-
|
417
|
-
if (r_test(h)) img->height = NUM2INT(h);
|
369
|
+
rb_ary_push(result, r_data_wrap_struct(surface, surface));
|
370
|
+
rb_ary_push(result, INT2NUM(surface->w));
|
371
|
+
rb_ary_push(result, INT2NUM(surface->h));
|
418
372
|
|
419
|
-
|
420
|
-
|
421
|
-
img->color.r = NUM2DBL(r_ary_entry(a, 6));
|
422
|
-
img->color.g = NUM2DBL(r_ary_entry(a, 7));
|
423
|
-
img->color.b = NUM2DBL(r_ary_entry(a, 8));
|
424
|
-
img->color.a = NUM2DBL(r_ary_entry(a, 9));
|
425
|
-
|
426
|
-
R2D_DrawImage(img);
|
427
|
-
return R_NIL;
|
373
|
+
return result;
|
428
374
|
}
|
429
375
|
|
430
376
|
|
431
377
|
/*
|
432
|
-
*
|
378
|
+
* Ruby2D::Text#ext_load_text
|
433
379
|
*/
|
434
|
-
|
435
|
-
|
436
|
-
R2D_Image *img = (R2D_Image *)p_;
|
437
|
-
#else
|
438
|
-
static void free_image(R2D_Image *img) {
|
439
|
-
#endif
|
440
|
-
R2D_FreeImage(img);
|
441
|
-
}
|
380
|
+
static R_VAL ruby2d_text_ext_load_text(R_VAL self, R_VAL font, R_VAL message) {
|
381
|
+
R2D_Init();
|
442
382
|
|
383
|
+
VALUE result = rb_ary_new2(3);
|
443
384
|
|
444
|
-
|
445
|
-
|
446
|
-
* Initialize sprite structure data
|
447
|
-
*/
|
448
|
-
#if MRUBY
|
449
|
-
static R_VAL ruby2d_sprite_ext_init(mrb_state* mrb, R_VAL self) {
|
450
|
-
mrb_value path;
|
451
|
-
mrb_get_args(mrb, "o", &path);
|
452
|
-
#else
|
453
|
-
static R_VAL ruby2d_sprite_ext_init(R_VAL self, R_VAL path) {
|
454
|
-
#endif
|
455
|
-
R2D_Sprite *spr = R2D_CreateSprite(RSTRING_PTR(path));
|
456
|
-
if (!spr) return R_FALSE;
|
385
|
+
TTF_Font *ttf_font;
|
386
|
+
Data_Get_Struct(font, TTF_Font, ttf_font);
|
457
387
|
|
458
|
-
|
459
|
-
|
460
|
-
|
388
|
+
SDL_Surface *surface = R2D_TextCreateSurface(ttf_font, RSTRING_PTR(message));
|
389
|
+
if (!surface) {
|
390
|
+
return result;
|
391
|
+
}
|
461
392
|
|
462
|
-
|
463
|
-
|
393
|
+
rb_ary_push(result, r_data_wrap_struct(surface, surface));
|
394
|
+
rb_ary_push(result, INT2NUM(surface->w));
|
395
|
+
rb_ary_push(result, INT2NUM(surface->h));
|
464
396
|
|
397
|
+
return result;
|
398
|
+
}
|
465
399
|
|
466
400
|
/*
|
467
|
-
* Ruby2D::
|
401
|
+
* Ruby2D::Texture#ext_create
|
468
402
|
*/
|
469
|
-
|
470
|
-
|
471
|
-
|
472
|
-
|
473
|
-
|
474
|
-
|
475
|
-
|
476
|
-
|
477
|
-
|
478
|
-
|
479
|
-
r_data_get_struct(r_ary_entry(a, 0), "@data", &sprite_data_type, R2D_Sprite, spr);
|
480
|
-
|
481
|
-
spr->x = NUM2DBL(r_ary_entry(a, 1));
|
482
|
-
spr->y = NUM2DBL(r_ary_entry(a, 2));
|
483
|
-
|
484
|
-
R_VAL w = r_ary_entry(a, 3);
|
485
|
-
if (r_test(w)) spr->width = NUM2DBL(w);
|
486
|
-
|
487
|
-
R_VAL h = r_ary_entry(a, 4);
|
488
|
-
if (r_test(h)) spr->height = NUM2DBL(h);
|
489
|
-
|
490
|
-
R2D_RotateSprite(spr, NUM2DBL(r_ary_entry(a, 5)), R2D_CENTER);
|
491
|
-
|
492
|
-
R2D_ClipSprite(
|
493
|
-
spr,
|
494
|
-
NUM2INT(r_ary_entry(a, 6)),
|
495
|
-
NUM2INT(r_ary_entry(a, 7)),
|
496
|
-
NUM2INT(r_ary_entry(a, 8)),
|
497
|
-
NUM2INT(r_ary_entry(a, 9))
|
498
|
-
);
|
499
|
-
|
500
|
-
spr->color.r = NUM2DBL(r_ary_entry(a, 10));
|
501
|
-
spr->color.g = NUM2DBL(r_ary_entry(a, 11));
|
502
|
-
spr->color.b = NUM2DBL(r_ary_entry(a, 12));
|
503
|
-
spr->color.a = NUM2DBL(r_ary_entry(a, 13));
|
504
|
-
|
505
|
-
R2D_DrawSprite(spr);
|
506
|
-
return R_NIL;
|
507
|
-
}
|
403
|
+
static R_VAL ruby2d_texture_ext_create(R_VAL self, R_VAL rubySurface, R_VAL width, R_VAL height) {
|
404
|
+
GLuint texture_id = 0;
|
405
|
+
SDL_Surface *surface;
|
406
|
+
Data_Get_Struct(rubySurface, SDL_Surface, surface);
|
407
|
+
|
408
|
+
// Detect image mode
|
409
|
+
GLint format = GL_RGB;
|
410
|
+
if (surface->format->BytesPerPixel == 4) {
|
411
|
+
format = GL_RGBA;
|
412
|
+
}
|
508
413
|
|
414
|
+
R2D_GL_CreateTexture(&texture_id, format,
|
415
|
+
NUM2INT(width), NUM2INT(height),
|
416
|
+
surface->pixels, GL_NEAREST);
|
509
417
|
|
510
|
-
|
511
|
-
* Free sprite structure attached to Ruby 2D `Sprite` class
|
512
|
-
*/
|
513
|
-
#if MRUBY
|
514
|
-
static void free_sprite(mrb_state *mrb, void *p_) {
|
515
|
-
R2D_Sprite *spr = (R2D_Sprite *)p_;
|
516
|
-
#else
|
517
|
-
static void free_sprite(R2D_Sprite *spr) {
|
518
|
-
#endif
|
519
|
-
R2D_FreeSprite(spr);
|
418
|
+
return INT2NUM(texture_id);
|
520
419
|
}
|
521
420
|
|
522
|
-
|
523
421
|
/*
|
524
|
-
* Ruby2D::
|
525
|
-
* Initialize tileset data
|
422
|
+
* Ruby2D::Texture#ext_delete
|
526
423
|
*/
|
527
|
-
static R_VAL
|
528
|
-
|
529
|
-
if (!img) return R_FALSE;
|
530
|
-
|
531
|
-
// Get width and height from Ruby class. If set, use it, else choose the
|
532
|
-
// native dimensions of the image.
|
533
|
-
R_VAL w = r_iv_get(self, "@width");
|
534
|
-
R_VAL h = r_iv_get(self, "@height");
|
535
|
-
r_iv_set(self, "@width" , r_test(w) ? w : INT2NUM(img->width));
|
536
|
-
r_iv_set(self, "@height", r_test(h) ? h : INT2NUM(img->height));
|
537
|
-
r_iv_set(self, "@data", r_data_wrap_struct(image, img));
|
538
|
-
|
539
|
-
return R_TRUE;
|
540
|
-
}
|
424
|
+
static R_VAL ruby2d_texture_ext_delete(R_VAL self, R_VAL rubyTexture_id) {
|
425
|
+
GLuint texture_id = NUM2INT(rubyTexture_id);
|
541
426
|
|
427
|
+
R2D_GL_FreeTexture(&texture_id);
|
542
428
|
|
543
|
-
/*
|
544
|
-
* Ruby2D::Tileset#ext_draw
|
545
|
-
* Draws a single tile, will be called once per individual tile to draw
|
546
|
-
*/
|
547
|
-
static R_VAL ruby2d_tileset_ext_draw(R_VAL self, R_VAL a) {
|
548
|
-
// `a` is the array representing the tileset
|
549
|
-
|
550
|
-
R2D_Image *img;
|
551
|
-
r_data_get_struct(r_ary_entry(a, 0), "@data", &image_data_type, R2D_Image, img);
|
552
|
-
|
553
|
-
int tw = NUM2INT(r_ary_entry(a, 1));
|
554
|
-
int th = NUM2INT(r_ary_entry(a, 2));
|
555
|
-
int padding = NUM2INT(r_ary_entry(a, 3));
|
556
|
-
int spacing = NUM2INT(r_ary_entry(a, 4));
|
557
|
-
int tx = NUM2INT(r_ary_entry(a, 5));
|
558
|
-
int ty = NUM2INT(r_ary_entry(a, 6));
|
559
|
-
int x = NUM2INT(r_ary_entry(a, 7));
|
560
|
-
int y = NUM2INT(r_ary_entry(a, 8));
|
561
|
-
|
562
|
-
R2D_DrawTile(img, tw, th, padding, spacing, tx, ty, x, y);
|
563
429
|
return R_NIL;
|
564
430
|
}
|
565
431
|
|
566
432
|
|
567
433
|
/*
|
568
|
-
* Ruby2D::
|
569
|
-
* Initialize
|
434
|
+
* Ruby2D::Sound#ext_init
|
435
|
+
* Initialize sound structure data
|
570
436
|
*/
|
571
437
|
#if MRUBY
|
572
|
-
static R_VAL
|
438
|
+
static R_VAL ruby2d_sound_ext_init(mrb_state* mrb, R_VAL self) {
|
439
|
+
mrb_value path;
|
440
|
+
mrb_get_args(mrb, "o", &path);
|
573
441
|
#else
|
574
|
-
static R_VAL
|
442
|
+
static R_VAL ruby2d_sound_ext_init(R_VAL self, R_VAL path) {
|
575
443
|
#endif
|
576
|
-
|
577
|
-
|
578
|
-
|
579
|
-
mrb_str_resize(mrb, s, RSTRING_LEN(s));
|
580
|
-
#endif
|
581
|
-
|
582
|
-
R2D_Text *txt = R2D_CreateText(
|
583
|
-
RSTRING_PTR(r_iv_get(self, "@font")),
|
584
|
-
RSTRING_PTR(r_iv_get(self, "@text")),
|
585
|
-
NUM2DBL(r_iv_get(self, "@size"))
|
586
|
-
);
|
587
|
-
if (!txt) return R_FALSE;
|
588
|
-
|
589
|
-
r_iv_set(self, "@width", INT2NUM(txt->width));
|
590
|
-
r_iv_set(self, "@height", INT2NUM(txt->height));
|
591
|
-
r_iv_set(self, "@data", r_data_wrap_struct(text, txt));
|
592
|
-
|
444
|
+
R2D_Sound *snd = R2D_CreateSound(RSTRING_PTR(path));
|
445
|
+
if (!snd) return R_FALSE;
|
446
|
+
r_iv_set(self, "@data", r_data_wrap_struct(sound, snd));
|
593
447
|
return R_TRUE;
|
594
448
|
}
|
595
449
|
|
596
450
|
|
597
451
|
/*
|
598
|
-
* Ruby2D::
|
452
|
+
* Ruby2D::Sound#ext_play
|
599
453
|
*/
|
600
454
|
#if MRUBY
|
601
|
-
static R_VAL
|
602
|
-
mrb_value text;
|
603
|
-
mrb_get_args(mrb, "o", &text);
|
455
|
+
static R_VAL ruby2d_sound_ext_play(mrb_state* mrb, R_VAL self) {
|
604
456
|
#else
|
605
|
-
static R_VAL
|
457
|
+
static R_VAL ruby2d_sound_ext_play(R_VAL self) {
|
606
458
|
#endif
|
607
|
-
|
608
|
-
r_data_get_struct(self, "@data", &
|
609
|
-
|
610
|
-
R2D_SetText(txt, RSTRING_PTR(text));
|
611
|
-
|
612
|
-
r_iv_set(self, "@width", INT2NUM(txt->width));
|
613
|
-
r_iv_set(self, "@height", INT2NUM(txt->height));
|
614
|
-
|
459
|
+
R2D_Sound *snd;
|
460
|
+
r_data_get_struct(self, "@data", &sound_data_type, R2D_Sound, snd);
|
461
|
+
R2D_PlaySound(snd);
|
615
462
|
return R_NIL;
|
616
463
|
}
|
617
464
|
|
618
465
|
|
619
466
|
/*
|
620
|
-
* Ruby2D::
|
467
|
+
* Ruby2D::Sound#ext_length
|
621
468
|
*/
|
622
|
-
|
623
|
-
|
624
|
-
|
625
|
-
|
626
|
-
#else
|
627
|
-
static R_VAL ruby2d_text_ext_draw(R_VAL self, R_VAL a) {
|
628
|
-
#endif
|
629
|
-
// `a` is the array representing the text
|
630
|
-
|
631
|
-
R2D_Text *txt;
|
632
|
-
r_data_get_struct(r_ary_entry(a, 0), "@data", &text_data_type, R2D_Text, txt);
|
633
|
-
|
634
|
-
txt->x = NUM2DBL(r_ary_entry(a, 1));
|
635
|
-
txt->y = NUM2DBL(r_ary_entry(a, 2));
|
636
|
-
|
637
|
-
R2D_RotateText(txt, NUM2DBL(r_ary_entry(a, 3)), R2D_CENTER);
|
638
|
-
|
639
|
-
txt->color.r = NUM2DBL(r_ary_entry(a, 4));
|
640
|
-
txt->color.g = NUM2DBL(r_ary_entry(a, 5));
|
641
|
-
txt->color.b = NUM2DBL(r_ary_entry(a, 6));
|
642
|
-
txt->color.a = NUM2DBL(r_ary_entry(a, 7));
|
643
|
-
|
644
|
-
R2D_DrawText(txt);
|
645
|
-
return R_NIL;
|
469
|
+
static R_VAL ruby2d_sound_ext_length(R_VAL self) {
|
470
|
+
R2D_Sound *snd;
|
471
|
+
r_data_get_struct(self, "@data", &sound_data_type, R2D_Sound, snd);
|
472
|
+
return INT2NUM(R2D_GetSoundLength(snd));
|
646
473
|
}
|
647
474
|
|
648
475
|
|
649
476
|
/*
|
650
|
-
* Free
|
477
|
+
* Free sound structure attached to Ruby 2D `Sound` class
|
651
478
|
*/
|
652
479
|
#if MRUBY
|
653
|
-
static void
|
654
|
-
|
480
|
+
static void free_sound(mrb_state *mrb, void *p_) {
|
481
|
+
R2D_Sound *snd = (R2D_Sound *)p_;
|
655
482
|
#else
|
656
|
-
static void
|
483
|
+
static void free_sound(R2D_Sound *snd) {
|
657
484
|
#endif
|
658
|
-
|
485
|
+
R2D_FreeSound(snd);
|
659
486
|
}
|
660
487
|
|
661
|
-
|
662
488
|
/*
|
663
|
-
* Ruby2D::Sound#
|
664
|
-
* Initialize sound structure data
|
489
|
+
* Ruby2D::Sound#ext_get_volume
|
665
490
|
*/
|
666
491
|
#if MRUBY
|
667
|
-
static R_VAL
|
668
|
-
mrb_value path;
|
669
|
-
mrb_get_args(mrb, "o", &path);
|
492
|
+
static R_VAL ruby2d_sound_ext_get_volume(mrb_state* mrb, R_VAL self) {
|
670
493
|
#else
|
671
|
-
static R_VAL
|
494
|
+
static R_VAL ruby2d_sound_ext_get_volume(R_VAL self) {
|
672
495
|
#endif
|
673
|
-
R2D_Sound *snd
|
674
|
-
|
675
|
-
|
676
|
-
return R_TRUE;
|
496
|
+
R2D_Sound *snd;
|
497
|
+
r_data_get_struct(self, "@data", &sound_data_type, R2D_Sound, snd);
|
498
|
+
return INT2NUM(ceil(Mix_VolumeChunk(snd->data, -1) * (100.0 / MIX_MAX_VOLUME)));
|
677
499
|
}
|
678
500
|
|
679
|
-
|
680
501
|
/*
|
681
|
-
* Ruby2D::
|
502
|
+
* Ruby2D::Music#ext_set_volume
|
682
503
|
*/
|
683
504
|
#if MRUBY
|
684
|
-
static R_VAL
|
505
|
+
static R_VAL ruby2d_sound_ext_set_volume(mrb_state* mrb, R_VAL self) {
|
506
|
+
mrb_value volume;
|
507
|
+
mrb_get_args(mrb, "o", &volume);
|
685
508
|
#else
|
686
|
-
static R_VAL
|
509
|
+
static R_VAL ruby2d_sound_ext_set_volume(R_VAL self, R_VAL volume) {
|
687
510
|
#endif
|
688
511
|
R2D_Sound *snd;
|
689
512
|
r_data_get_struct(self, "@data", &sound_data_type, R2D_Sound, snd);
|
690
|
-
|
513
|
+
Mix_VolumeChunk(snd->data, (NUM2INT(volume) / 100.0) * MIX_MAX_VOLUME);
|
691
514
|
return R_NIL;
|
692
515
|
}
|
693
516
|
|
694
|
-
|
695
517
|
/*
|
696
|
-
* Ruby2D::Sound#
|
518
|
+
* Ruby2D::Sound#ext_get_mix_volume
|
697
519
|
*/
|
698
|
-
|
699
|
-
|
700
|
-
|
701
|
-
|
520
|
+
#if MRUBY
|
521
|
+
static R_VAL ruby2d_sound_ext_get_mix_volume(mrb_state* mrb, R_VAL self) {
|
522
|
+
#else
|
523
|
+
static R_VAL ruby2d_sound_ext_get_mix_volume(R_VAL self) {
|
524
|
+
#endif
|
525
|
+
return INT2NUM(ceil(Mix_Volume(-1, -1) * (100.0 / MIX_MAX_VOLUME)));
|
702
526
|
}
|
703
527
|
|
704
|
-
|
705
528
|
/*
|
706
|
-
*
|
529
|
+
* Ruby2D::Music#ext_set_mix_volume
|
707
530
|
*/
|
708
531
|
#if MRUBY
|
709
|
-
static
|
710
|
-
|
532
|
+
static R_VAL ruby2d_sound_ext_set_mix_volume(mrb_state* mrb, R_VAL self) {
|
533
|
+
mrb_value volume;
|
534
|
+
mrb_get_args(mrb, "o", &volume);
|
711
535
|
#else
|
712
|
-
static
|
536
|
+
static R_VAL ruby2d_sound_ext_set_mix_volume(R_VAL self, R_VAL volume) {
|
713
537
|
#endif
|
714
|
-
|
538
|
+
Mix_Volume(-1, (NUM2INT(volume) / 100.0) * MIX_MAX_VOLUME);
|
539
|
+
return R_NIL;
|
715
540
|
}
|
716
541
|
|
717
|
-
|
718
542
|
/*
|
719
543
|
* Ruby2D::Music#ext_init
|
720
544
|
* Initialize music structure data
|
@@ -838,6 +662,52 @@ static R_VAL ruby2d_music_ext_length(R_VAL self) {
|
|
838
662
|
return INT2NUM(R2D_GetMusicLength(ms));
|
839
663
|
}
|
840
664
|
|
665
|
+
/*
|
666
|
+
* Ruby2D::Font#ext_load
|
667
|
+
*/
|
668
|
+
static R_VAL ruby2d_font_ext_load(R_VAL self, R_VAL path, R_VAL size, R_VAL style) {
|
669
|
+
R2D_Init();
|
670
|
+
|
671
|
+
TTF_Font *font = R2D_FontCreateTTFFont(RSTRING_PTR(path), NUM2INT(size), RSTRING_PTR(style));
|
672
|
+
if (!font) {
|
673
|
+
return R_NIL;
|
674
|
+
}
|
675
|
+
|
676
|
+
return r_data_wrap_struct(font, font);
|
677
|
+
}
|
678
|
+
|
679
|
+
|
680
|
+
/*
|
681
|
+
* Ruby2D::Texture#ext_draw
|
682
|
+
*/
|
683
|
+
static R_VAL ruby2d_texture_ext_draw(R_VAL self, R_VAL ruby_coordinates, R_VAL ruby_texture_coordinates, R_VAL ruby_color, R_VAL texture_id) {
|
684
|
+
GLfloat coordinates[8];
|
685
|
+
GLfloat texture_coordinates[8];
|
686
|
+
GLfloat color[4];
|
687
|
+
|
688
|
+
for(int i = 0; i < 8; i++) { coordinates[i] = NUM2DBL(r_ary_entry(ruby_coordinates, i)); }
|
689
|
+
for(int i = 0; i < 8; i++) { texture_coordinates[i] = NUM2DBL(r_ary_entry(ruby_texture_coordinates, i)); }
|
690
|
+
for(int i = 0; i < 4; i++) { color[i] = NUM2DBL(r_ary_entry(ruby_color, i)); }
|
691
|
+
|
692
|
+
R2D_GL_DrawTexture(coordinates, texture_coordinates, color, NUM2INT(texture_id));
|
693
|
+
|
694
|
+
return R_NIL;
|
695
|
+
}
|
696
|
+
|
697
|
+
/*
|
698
|
+
* Free font structure stored in the Ruby 2D `Font` class
|
699
|
+
*/
|
700
|
+
static void free_font(TTF_Font *font) {
|
701
|
+
TTF_CloseFont(font);
|
702
|
+
}
|
703
|
+
|
704
|
+
/*
|
705
|
+
* Free surface structure used within the Ruby 2D `Texture` class
|
706
|
+
*/
|
707
|
+
static void free_surface(SDL_Surface *surface) {
|
708
|
+
SDL_FreeSurface(surface);
|
709
|
+
}
|
710
|
+
|
841
711
|
|
842
712
|
/*
|
843
713
|
* Free music structure attached to Ruby 2D `Music` class
|
@@ -1275,41 +1145,14 @@ void Init_ruby2d() {
|
|
1275
1145
|
// Ruby2D::Image
|
1276
1146
|
R_CLASS ruby2d_image_class = r_define_class(ruby2d_module, "Image");
|
1277
1147
|
|
1278
|
-
// Ruby2D::Image#
|
1279
|
-
|
1280
|
-
|
1281
|
-
// Ruby2D::Image#self.ext_draw
|
1282
|
-
r_define_class_method(ruby2d_image_class, "ext_draw", ruby2d_image_ext_draw, r_args_req(1));
|
1283
|
-
|
1284
|
-
// Ruby2D::Sprite
|
1285
|
-
R_CLASS ruby2d_sprite_class = r_define_class(ruby2d_module, "Sprite");
|
1286
|
-
|
1287
|
-
// Ruby2D::Sprite#ext_init
|
1288
|
-
r_define_method(ruby2d_sprite_class, "ext_init", ruby2d_sprite_ext_init, r_args_req(1));
|
1289
|
-
|
1290
|
-
// Ruby2D::Sprite#self.ext_draw
|
1291
|
-
r_define_class_method(ruby2d_sprite_class, "ext_draw", ruby2d_sprite_ext_draw, r_args_req(1));
|
1292
|
-
|
1293
|
-
// Ruby2D::Tileset
|
1294
|
-
R_CLASS ruby2d_tileset_class = r_define_class(ruby2d_module, "Tileset");
|
1295
|
-
|
1296
|
-
// Ruby2D::Tileset#ext_init
|
1297
|
-
r_define_method(ruby2d_tileset_class, "ext_init", ruby2d_tileset_ext_init, r_args_req(1));
|
1298
|
-
|
1299
|
-
// Ruby2D::Tileset#self.ext_draw
|
1300
|
-
r_define_class_method(ruby2d_tileset_class, "ext_draw", ruby2d_tileset_ext_draw, r_args_req(1));
|
1148
|
+
// Ruby2D::Image#ext_load_image
|
1149
|
+
r_define_class_method(ruby2d_image_class, "ext_load_image", ruby2d_image_ext_load_image, r_args_req(1));
|
1301
1150
|
|
1302
1151
|
// Ruby2D::Text
|
1303
1152
|
R_CLASS ruby2d_text_class = r_define_class(ruby2d_module, "Text");
|
1304
1153
|
|
1305
|
-
// Ruby2D::Text#
|
1306
|
-
|
1307
|
-
|
1308
|
-
// Ruby2D::Text#ext_set
|
1309
|
-
r_define_method(ruby2d_text_class, "ext_set", ruby2d_text_ext_set, r_args_req(1));
|
1310
|
-
|
1311
|
-
// Ruby2D::Text#self.ext_draw
|
1312
|
-
r_define_class_method(ruby2d_text_class, "ext_draw", ruby2d_text_ext_draw, r_args_req(1));
|
1154
|
+
// Ruby2D::Text#ext_load_text
|
1155
|
+
r_define_class_method(ruby2d_text_class, "ext_load_text", ruby2d_text_ext_load_text, r_args_req(2));
|
1313
1156
|
|
1314
1157
|
// Ruby2D::Sound
|
1315
1158
|
R_CLASS ruby2d_sound_class = r_define_class(ruby2d_module, "Sound");
|
@@ -1319,6 +1162,18 @@ void Init_ruby2d() {
|
|
1319
1162
|
|
1320
1163
|
// Ruby2D::Sound#ext_play
|
1321
1164
|
r_define_method(ruby2d_sound_class, "ext_play", ruby2d_sound_ext_play, r_args_none);
|
1165
|
+
|
1166
|
+
// Ruby2D::Sound#ext_get_volume
|
1167
|
+
r_define_method(ruby2d_sound_class, "ext_get_volume", ruby2d_sound_ext_get_volume, r_args_none);
|
1168
|
+
|
1169
|
+
// Ruby2D::Sound#ext_set_volume
|
1170
|
+
r_define_method(ruby2d_sound_class, "ext_set_volume", ruby2d_sound_ext_set_volume, r_args_req(1));
|
1171
|
+
|
1172
|
+
// Ruby2D::Sound#self.ext_get_mix_volume
|
1173
|
+
r_define_class_method(ruby2d_sound_class, "ext_get_mix_volume", ruby2d_sound_ext_get_mix_volume, r_args_none);
|
1174
|
+
|
1175
|
+
// Ruby2D::Sound#self.ext_set_mix_volume
|
1176
|
+
r_define_class_method(ruby2d_sound_class, "ext_set_mix_volume", ruby2d_sound_ext_set_mix_volume, r_args_req(1));
|
1322
1177
|
|
1323
1178
|
// Ruby2D::Sound#ext_length
|
1324
1179
|
r_define_method(ruby2d_sound_class, "ext_length", ruby2d_sound_ext_length, r_args_none);
|
@@ -1353,6 +1208,24 @@ void Init_ruby2d() {
|
|
1353
1208
|
// Ruby2D::Music#ext_length
|
1354
1209
|
r_define_method(ruby2d_music_class, "ext_length", ruby2d_music_ext_length, r_args_none);
|
1355
1210
|
|
1211
|
+
// Ruby2D::Font
|
1212
|
+
R_CLASS ruby2d_font_class = r_define_class(ruby2d_module, "Font");
|
1213
|
+
|
1214
|
+
// Ruby2D::Font#ext_load
|
1215
|
+
r_define_class_method(ruby2d_font_class, "ext_load", ruby2d_font_ext_load, r_args_req(3));
|
1216
|
+
|
1217
|
+
// Ruby2D::Texture
|
1218
|
+
R_CLASS ruby2d_texture_class = r_define_class(ruby2d_module, "Texture");
|
1219
|
+
|
1220
|
+
// Ruby2D::Texture#ext_draw
|
1221
|
+
r_define_method(ruby2d_texture_class, "ext_draw", ruby2d_texture_ext_draw, r_args_req(4));
|
1222
|
+
|
1223
|
+
// Ruby2D::Texture#ext_create
|
1224
|
+
r_define_method(ruby2d_texture_class, "ext_create", ruby2d_texture_ext_create, r_args_req(3));
|
1225
|
+
|
1226
|
+
// Ruby2D::Texture#ext_delete
|
1227
|
+
r_define_method(ruby2d_texture_class, "ext_delete", ruby2d_texture_ext_delete, r_args_req(1));
|
1228
|
+
|
1356
1229
|
// Ruby2D::Window
|
1357
1230
|
R_CLASS ruby2d_window_class = r_define_class(ruby2d_module, "Window");
|
1358
1231
|
|