ruby2d 0.9.0 → 0.9.1
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 +1 -0
- data/assets/linux/simple2d/Makefile +250 -0
- data/assets/linux/simple2d/bin/simple2d.sh +1249 -0
- data/assets/linux/simple2d/include/simple2d.h +735 -0
- data/assets/linux/simple2d/src/controllers.c +110 -0
- data/assets/linux/simple2d/src/gl.c +426 -0
- data/assets/linux/simple2d/src/gl2.c +146 -0
- data/assets/linux/simple2d/src/gl3.c +275 -0
- data/assets/linux/simple2d/src/gles.c +308 -0
- data/assets/linux/simple2d/src/image.c +138 -0
- data/assets/linux/simple2d/src/input.c +48 -0
- data/assets/linux/simple2d/src/music.c +114 -0
- data/assets/linux/simple2d/src/shapes.c +154 -0
- data/assets/linux/simple2d/src/simple2d.c +185 -0
- data/assets/linux/simple2d/src/sound.c +56 -0
- data/assets/linux/simple2d/src/sprite.c +147 -0
- data/assets/linux/simple2d/src/text.c +129 -0
- data/assets/linux/simple2d/src/window.c +403 -0
- data/ext/ruby2d/extconf.rb +110 -29
- data/lib/ruby2d/version.rb +1 -1
- metadata +19 -2
@@ -0,0 +1,403 @@
|
|
1
|
+
// window.c
|
2
|
+
|
3
|
+
#include "../include/simple2d.h"
|
4
|
+
|
5
|
+
|
6
|
+
/*
|
7
|
+
* Create a window
|
8
|
+
*/
|
9
|
+
S2D_Window *S2D_CreateWindow(const char *title, int width, int height,
|
10
|
+
S2D_Update update, S2D_Render render, int flags) {
|
11
|
+
|
12
|
+
S2D_Init();
|
13
|
+
|
14
|
+
SDL_DisplayMode dm;
|
15
|
+
SDL_GetCurrentDisplayMode(0, &dm);
|
16
|
+
S2D_Log(S2D_INFO, "Current display mode is %dx%dpx @ %dhz", dm.w, dm.h, dm.refresh_rate);
|
17
|
+
|
18
|
+
width = width == S2D_DISPLAY_WIDTH ? dm.w : width;
|
19
|
+
height = height == S2D_DISPLAY_HEIGHT ? dm.h : height;
|
20
|
+
|
21
|
+
// Allocate window and set default values
|
22
|
+
S2D_Window *window = (S2D_Window *) malloc(sizeof(S2D_Window));
|
23
|
+
window->sdl = NULL;
|
24
|
+
window->glcontext = NULL;
|
25
|
+
window->title = title;
|
26
|
+
window->width = width;
|
27
|
+
window->height = height;
|
28
|
+
window->orig_width = width;
|
29
|
+
window->orig_height = height;
|
30
|
+
window->viewport.width = width;
|
31
|
+
window->viewport.height = height;
|
32
|
+
window->viewport.mode = S2D_SCALE;
|
33
|
+
window->update = update;
|
34
|
+
window->render = render;
|
35
|
+
window->flags = flags;
|
36
|
+
window->on_key = NULL;
|
37
|
+
window->on_mouse = NULL;
|
38
|
+
window->on_controller = NULL;
|
39
|
+
window->vsync = true;
|
40
|
+
window->fps_cap = 60;
|
41
|
+
window->background.r = 0.0;
|
42
|
+
window->background.g = 0.0;
|
43
|
+
window->background.b = 0.0;
|
44
|
+
window->background.a = 1.0;
|
45
|
+
window->icon = NULL;
|
46
|
+
window->close = true;
|
47
|
+
|
48
|
+
// Return the window structure
|
49
|
+
return window;
|
50
|
+
}
|
51
|
+
|
52
|
+
|
53
|
+
/*
|
54
|
+
* Show the window
|
55
|
+
*/
|
56
|
+
int S2D_Show(S2D_Window *window) {
|
57
|
+
|
58
|
+
if (!window) {
|
59
|
+
S2D_Error("S2D_Show", "Window cannot be shown (because it's NULL)");
|
60
|
+
return 1;
|
61
|
+
}
|
62
|
+
|
63
|
+
// Create SDL window
|
64
|
+
window->sdl = SDL_CreateWindow(
|
65
|
+
window->title, // title
|
66
|
+
SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, // window position
|
67
|
+
window->width, window->height, // window size
|
68
|
+
SDL_WINDOW_OPENGL | window->flags // flags
|
69
|
+
);
|
70
|
+
|
71
|
+
if (!window->sdl) S2D_Error("SDL_CreateWindow", SDL_GetError());
|
72
|
+
if (window->icon) S2D_SetIcon(window, window->icon);
|
73
|
+
|
74
|
+
// The window created by SDL might not actually be the requested size.
|
75
|
+
// If it's not the same, retrieve and store the actual window size.
|
76
|
+
int actual_width, actual_height;
|
77
|
+
SDL_GetWindowSize(window->sdl, &actual_width, &actual_height);
|
78
|
+
|
79
|
+
if ((window->width != actual_width) || (window->height != actual_height)) {
|
80
|
+
S2D_Log(S2D_INFO,
|
81
|
+
"Scaling window to %ix%i (requested size was %ix%i)",
|
82
|
+
actual_width, actual_height, window->width, window->height
|
83
|
+
);
|
84
|
+
window->width = actual_width;
|
85
|
+
window->height = actual_height;
|
86
|
+
window->orig_width = actual_width;
|
87
|
+
window->orig_height = actual_height;
|
88
|
+
}
|
89
|
+
|
90
|
+
// Set Up OpenGL /////////////////////////////////////////////////////////////
|
91
|
+
|
92
|
+
S2D_GL_Init(window);
|
93
|
+
|
94
|
+
// Set Main Loop Data ////////////////////////////////////////////////////////
|
95
|
+
|
96
|
+
const Uint8 *key_state;
|
97
|
+
|
98
|
+
Uint32 frames = 0; // Total frames since start
|
99
|
+
Uint32 frames_last_sec = 0; // Frames in the last second
|
100
|
+
Uint32 start_ms = SDL_GetTicks(); // Elapsed time since start
|
101
|
+
Uint32 next_second_ms = SDL_GetTicks(); // The last time plus a second
|
102
|
+
Uint32 begin_ms = start_ms; // Time at beginning of loop
|
103
|
+
Uint32 end_ms; // Time at end of loop
|
104
|
+
Uint32 elapsed_ms; // Total elapsed time
|
105
|
+
Uint32 loop_ms; // Elapsed time of loop
|
106
|
+
int delay_ms; // Amount of delay to achieve desired frame rate
|
107
|
+
const double decay_rate = 0.5; // Determines how fast an average decays over time
|
108
|
+
double fps = window->fps_cap; // Moving average of actual FPS, initial value a guess
|
109
|
+
|
110
|
+
// Enable VSync
|
111
|
+
if (window->vsync) {
|
112
|
+
if (!SDL_SetHint(SDL_HINT_RENDER_VSYNC, "1")) {
|
113
|
+
S2D_Log(S2D_WARN, "VSync cannot be enabled");
|
114
|
+
}
|
115
|
+
}
|
116
|
+
|
117
|
+
window->close = false;
|
118
|
+
|
119
|
+
// Main Loop /////////////////////////////////////////////////////////////////
|
120
|
+
|
121
|
+
while (!window->close) {
|
122
|
+
|
123
|
+
// Clear Frame /////////////////////////////////////////////////////////////
|
124
|
+
|
125
|
+
S2D_GL_Clear(window->background);
|
126
|
+
|
127
|
+
// Set FPS /////////////////////////////////////////////////////////////////
|
128
|
+
|
129
|
+
frames++;
|
130
|
+
frames_last_sec++;
|
131
|
+
end_ms = SDL_GetTicks();
|
132
|
+
elapsed_ms = end_ms - start_ms;
|
133
|
+
|
134
|
+
// Calculate the frame rate using an exponential moving average
|
135
|
+
if (next_second_ms < end_ms) {
|
136
|
+
fps = decay_rate * fps + (1.0 - decay_rate) * frames_last_sec;
|
137
|
+
frames_last_sec = 0;
|
138
|
+
next_second_ms = SDL_GetTicks() + 1000;
|
139
|
+
}
|
140
|
+
|
141
|
+
loop_ms = end_ms - begin_ms;
|
142
|
+
delay_ms = (1000 / window->fps_cap) - loop_ms;
|
143
|
+
|
144
|
+
if (delay_ms < 0) delay_ms = 0;
|
145
|
+
|
146
|
+
// Note: `loop_ms + delay_ms` should equal `1000 / fps_cap`
|
147
|
+
|
148
|
+
SDL_Delay(delay_ms);
|
149
|
+
begin_ms = SDL_GetTicks();
|
150
|
+
|
151
|
+
// Handle Input and Window Events //////////////////////////////////////////
|
152
|
+
|
153
|
+
int mx, my; // mouse x, y coordinates
|
154
|
+
|
155
|
+
SDL_Event e;
|
156
|
+
while (SDL_PollEvent(&e)) {
|
157
|
+
switch (e.type) {
|
158
|
+
|
159
|
+
case SDL_KEYDOWN:
|
160
|
+
if (window->on_key && e.key.repeat == 0) {
|
161
|
+
S2D_Event event = {
|
162
|
+
.type = S2D_KEY_DOWN, .key = SDL_GetScancodeName(e.key.keysym.scancode)
|
163
|
+
};
|
164
|
+
window->on_key(event);
|
165
|
+
}
|
166
|
+
break;
|
167
|
+
|
168
|
+
case SDL_KEYUP:
|
169
|
+
if (window->on_key) {
|
170
|
+
S2D_Event event = {
|
171
|
+
.type = S2D_KEY_UP, .key = SDL_GetScancodeName(e.key.keysym.scancode)
|
172
|
+
};
|
173
|
+
window->on_key(event);
|
174
|
+
}
|
175
|
+
break;
|
176
|
+
|
177
|
+
case SDL_MOUSEBUTTONDOWN: case SDL_MOUSEBUTTONUP:
|
178
|
+
if (window->on_mouse) {
|
179
|
+
S2D_GetMouseOnViewport(window, e.button.x, e.button.y, &mx, &my);
|
180
|
+
S2D_Event event = {
|
181
|
+
.button = e.button.button, .x = mx, .y = my
|
182
|
+
};
|
183
|
+
event.type = e.type == SDL_MOUSEBUTTONDOWN ? S2D_MOUSE_DOWN : S2D_MOUSE_UP;
|
184
|
+
event.dblclick = e.button.clicks == 2 ? true : false;
|
185
|
+
window->on_mouse(event);
|
186
|
+
}
|
187
|
+
break;
|
188
|
+
|
189
|
+
case SDL_MOUSEWHEEL:
|
190
|
+
if (window->on_mouse) {
|
191
|
+
S2D_Event event = {
|
192
|
+
.type = S2D_MOUSE_SCROLL, .direction = e.wheel.direction,
|
193
|
+
.delta_x = e.wheel.x, .delta_y = -e.wheel.y
|
194
|
+
};
|
195
|
+
window->on_mouse(event);
|
196
|
+
}
|
197
|
+
break;
|
198
|
+
|
199
|
+
case SDL_MOUSEMOTION:
|
200
|
+
if (window->on_mouse) {
|
201
|
+
S2D_GetMouseOnViewport(window, e.motion.x, e.motion.y, &mx, &my);
|
202
|
+
S2D_Event event = {
|
203
|
+
.type = S2D_MOUSE_MOVE,
|
204
|
+
.x = mx, .y = my, .delta_x = e.motion.xrel, .delta_y = e.motion.yrel
|
205
|
+
};
|
206
|
+
window->on_mouse(event);
|
207
|
+
}
|
208
|
+
break;
|
209
|
+
|
210
|
+
case SDL_CONTROLLERAXISMOTION:
|
211
|
+
if (window->on_controller) {
|
212
|
+
S2D_Event event = {
|
213
|
+
.which = e.caxis.which, .type = S2D_AXIS,
|
214
|
+
.axis = e.caxis.axis, .value = e.caxis.value
|
215
|
+
};
|
216
|
+
window->on_controller(event);
|
217
|
+
}
|
218
|
+
break;
|
219
|
+
|
220
|
+
case SDL_JOYAXISMOTION:
|
221
|
+
if (window->on_controller && !S2D_IsController(e.jbutton.which)) {
|
222
|
+
S2D_Event event = {
|
223
|
+
.which = e.jaxis.which, .type = S2D_AXIS,
|
224
|
+
.axis = e.jaxis.axis, .value = e.jaxis.value
|
225
|
+
};
|
226
|
+
window->on_controller(event);
|
227
|
+
}
|
228
|
+
break;
|
229
|
+
|
230
|
+
case SDL_CONTROLLERBUTTONDOWN: case SDL_CONTROLLERBUTTONUP:
|
231
|
+
if (window->on_controller) {
|
232
|
+
S2D_Event event = {
|
233
|
+
.which = e.cbutton.which, .button = e.cbutton.button
|
234
|
+
};
|
235
|
+
event.type = e.type == SDL_CONTROLLERBUTTONDOWN ? S2D_BUTTON_DOWN : S2D_BUTTON_UP;
|
236
|
+
window->on_controller(event);
|
237
|
+
}
|
238
|
+
break;
|
239
|
+
|
240
|
+
case SDL_JOYBUTTONDOWN: case SDL_JOYBUTTONUP:
|
241
|
+
if (window->on_controller && !S2D_IsController(e.jbutton.which)) {
|
242
|
+
S2D_Event event = {
|
243
|
+
.which = e.jbutton.which, .button = e.jbutton.button
|
244
|
+
};
|
245
|
+
event.type = e.type == SDL_JOYBUTTONDOWN ? S2D_BUTTON_DOWN : S2D_BUTTON_UP;
|
246
|
+
window->on_controller(event);
|
247
|
+
}
|
248
|
+
break;
|
249
|
+
|
250
|
+
case SDL_JOYDEVICEADDED:
|
251
|
+
S2D_Log(S2D_INFO, "Controller connected (%i total)", SDL_NumJoysticks());
|
252
|
+
S2D_OpenControllers();
|
253
|
+
break;
|
254
|
+
|
255
|
+
case SDL_JOYDEVICEREMOVED:
|
256
|
+
if (S2D_IsController(e.jdevice.which)) {
|
257
|
+
S2D_Log(S2D_INFO, "Controller #%i: %s removed (%i remaining)", e.jdevice.which, SDL_GameControllerName(SDL_GameControllerFromInstanceID(e.jdevice.which)), SDL_NumJoysticks());
|
258
|
+
SDL_GameControllerClose(SDL_GameControllerFromInstanceID(e.jdevice.which));
|
259
|
+
} else {
|
260
|
+
S2D_Log(S2D_INFO, "Controller #%i: %s removed (%i remaining)", e.jdevice.which, SDL_JoystickName(SDL_JoystickFromInstanceID(e.jdevice.which)), SDL_NumJoysticks());
|
261
|
+
SDL_JoystickClose(SDL_JoystickFromInstanceID(e.jdevice.which));
|
262
|
+
}
|
263
|
+
break;
|
264
|
+
|
265
|
+
case SDL_WINDOWEVENT:
|
266
|
+
switch (e.window.event) {
|
267
|
+
case SDL_WINDOWEVENT_RESIZED:
|
268
|
+
// Store new window size, set viewport
|
269
|
+
window->width = e.window.data1;
|
270
|
+
window->height = e.window.data2;
|
271
|
+
S2D_GL_SetViewport(window);
|
272
|
+
break;
|
273
|
+
}
|
274
|
+
break;
|
275
|
+
|
276
|
+
case SDL_QUIT:
|
277
|
+
S2D_Close(window);
|
278
|
+
break;
|
279
|
+
}
|
280
|
+
}
|
281
|
+
|
282
|
+
// Detect keys held down
|
283
|
+
int num_keys;
|
284
|
+
key_state = SDL_GetKeyboardState(&num_keys);
|
285
|
+
|
286
|
+
for (int i = 0; i < num_keys; i++) {
|
287
|
+
if (window->on_key) {
|
288
|
+
if (key_state[i] == 1) {
|
289
|
+
S2D_Event event = {
|
290
|
+
.type = S2D_KEY_HELD, .key = SDL_GetScancodeName(i)
|
291
|
+
};
|
292
|
+
window->on_key(event);
|
293
|
+
}
|
294
|
+
}
|
295
|
+
}
|
296
|
+
|
297
|
+
// Get and store mouse position relative to the viewport
|
298
|
+
int wx, wy; // mouse x, y coordinates relative to the window
|
299
|
+
SDL_GetMouseState(&wx, &wy);
|
300
|
+
S2D_GetMouseOnViewport(window, wx, wy, &window->mouse.x, &window->mouse.y);
|
301
|
+
|
302
|
+
// Update Window State /////////////////////////////////////////////////////
|
303
|
+
|
304
|
+
// Store new values in the window
|
305
|
+
window->frames = frames;
|
306
|
+
window->elapsed_ms = elapsed_ms;
|
307
|
+
window->loop_ms = loop_ms;
|
308
|
+
window->delay_ms = delay_ms;
|
309
|
+
window->fps = fps;
|
310
|
+
|
311
|
+
// Call update and render callbacks
|
312
|
+
if (window->update) window->update();
|
313
|
+
if (window->render) window->render();
|
314
|
+
|
315
|
+
// Draw Frame //////////////////////////////////////////////////////////////
|
316
|
+
SDL_GL_SwapWindow(window->sdl);
|
317
|
+
}
|
318
|
+
|
319
|
+
return 0;
|
320
|
+
}
|
321
|
+
|
322
|
+
|
323
|
+
/*
|
324
|
+
* Set the icon for the window
|
325
|
+
*/
|
326
|
+
void S2D_SetIcon(S2D_Window *window, const char *icon) {
|
327
|
+
S2D_Image *img = S2D_CreateImage(icon);
|
328
|
+
if (img) {
|
329
|
+
window->icon = icon;
|
330
|
+
SDL_SetWindowIcon(window->sdl, img->surface);
|
331
|
+
S2D_FreeImage(img);
|
332
|
+
} else {
|
333
|
+
S2D_Log(S2D_WARN, "Could not set window icon");
|
334
|
+
}
|
335
|
+
}
|
336
|
+
|
337
|
+
|
338
|
+
/*
|
339
|
+
* Take a screenshot of the window
|
340
|
+
*/
|
341
|
+
void S2D_Screenshot(S2D_Window *window, const char *path) {
|
342
|
+
|
343
|
+
#if GLES
|
344
|
+
S2D_Error("S2D_Screenshot", "Not supported in OpenGL ES");
|
345
|
+
#else
|
346
|
+
// Create a surface the size of the window
|
347
|
+
SDL_Surface *surface = SDL_CreateRGBSurface(
|
348
|
+
SDL_SWSURFACE, window->width, window->height, 24,
|
349
|
+
0x000000FF, 0x0000FF00, 0x00FF0000, 0
|
350
|
+
);
|
351
|
+
|
352
|
+
// Grab the pixels from the front buffer, save to surface
|
353
|
+
glReadBuffer(GL_FRONT);
|
354
|
+
glReadPixels(0, 0, window->width, window->height, GL_RGB, GL_UNSIGNED_BYTE, surface->pixels);
|
355
|
+
|
356
|
+
// Flip image vertically
|
357
|
+
|
358
|
+
void *temp_row = (void *)malloc(surface->pitch);
|
359
|
+
if (!temp_row) {
|
360
|
+
S2D_Error("S2D_Screenshot", "Out of memory!");
|
361
|
+
SDL_FreeSurface(surface);
|
362
|
+
return;
|
363
|
+
}
|
364
|
+
|
365
|
+
int height_div_2 = (int) (surface->h * 0.5);
|
366
|
+
|
367
|
+
for (int index = 0; index < height_div_2; index++) {
|
368
|
+
memcpy((Uint8 *)temp_row,(Uint8 *)(surface->pixels) + surface->pitch * index, surface->pitch);
|
369
|
+
memcpy((Uint8 *)(surface->pixels) + surface->pitch * index, (Uint8 *)(surface->pixels) + surface->pitch * (surface->h - index-1), surface->pitch);
|
370
|
+
memcpy((Uint8 *)(surface->pixels) + surface->pitch * (surface->h - index-1), temp_row, surface->pitch);
|
371
|
+
}
|
372
|
+
|
373
|
+
free(temp_row);
|
374
|
+
|
375
|
+
// Save image to disk
|
376
|
+
IMG_SavePNG(surface, path);
|
377
|
+
SDL_FreeSurface(surface);
|
378
|
+
#endif
|
379
|
+
}
|
380
|
+
|
381
|
+
|
382
|
+
/*
|
383
|
+
* Close the window
|
384
|
+
*/
|
385
|
+
int S2D_Close(S2D_Window *window) {
|
386
|
+
if (!window->close) {
|
387
|
+
S2D_Log(S2D_INFO, "Closing window");
|
388
|
+
window->close = true;
|
389
|
+
}
|
390
|
+
return 0;
|
391
|
+
}
|
392
|
+
|
393
|
+
|
394
|
+
/*
|
395
|
+
* Free all resources
|
396
|
+
*/
|
397
|
+
int S2D_FreeWindow(S2D_Window *window) {
|
398
|
+
S2D_Close(window);
|
399
|
+
SDL_GL_DeleteContext(window->glcontext);
|
400
|
+
SDL_DestroyWindow(window->sdl);
|
401
|
+
free(window);
|
402
|
+
return 0;
|
403
|
+
}
|
data/ext/ruby2d/extconf.rb
CHANGED
@@ -2,7 +2,25 @@ require 'mkmf'
|
|
2
2
|
require_relative '../../lib/ruby2d/colorize'
|
3
3
|
|
4
4
|
S2D_VERSION = '1.1.0' # Simple 2D minimum version required
|
5
|
-
$errors = [] #
|
5
|
+
$errors = [] # Holds errors
|
6
|
+
|
7
|
+
# Set the OS platform
|
8
|
+
case RUBY_PLATFORM
|
9
|
+
when /darwin/
|
10
|
+
$platform = :macos
|
11
|
+
when /linux/
|
12
|
+
$platform = :linux
|
13
|
+
if `cat /etc/os-release` =~ /raspbian/
|
14
|
+
$platform = :linux_rpi
|
15
|
+
end
|
16
|
+
when /mingw/
|
17
|
+
$platform = :windows
|
18
|
+
else
|
19
|
+
$platform = nil
|
20
|
+
end
|
21
|
+
|
22
|
+
|
23
|
+
# Helper functions #############################################################
|
6
24
|
|
7
25
|
# Print installation errors
|
8
26
|
def print_errors
|
@@ -12,15 +30,15 @@ def print_errors
|
|
12
30
|
#{"======================================================================"}"
|
13
31
|
end
|
14
32
|
|
33
|
+
|
15
34
|
# Check that Simple 2D is installed and meets minimum version requirements
|
16
35
|
def check_s2d
|
17
36
|
|
18
37
|
# Simple 2D not installed
|
19
38
|
if `which simple2d`.empty?
|
20
39
|
$errors << "Ruby 2D uses a native library called Simple 2D, which was not found." <<
|
21
|
-
|
22
|
-
print_errors
|
23
|
-
exit
|
40
|
+
"To install, follow the instructions at #{"ruby2d.com".bold}"
|
41
|
+
print_errors; exit
|
24
42
|
|
25
43
|
# Simple 2D installed, checking version
|
26
44
|
else
|
@@ -28,26 +46,79 @@ def check_s2d
|
|
28
46
|
$errors << "Simple 2D needs to be updated for this version of Ruby 2D." <<
|
29
47
|
"Run the following, then try reinstalling this gem:\n" <<
|
30
48
|
" simple2d update".bold
|
31
|
-
print_errors
|
32
|
-
exit
|
49
|
+
print_errors; exit
|
33
50
|
end
|
34
51
|
end
|
35
52
|
end
|
36
53
|
|
54
|
+
|
55
|
+
# Add compiler and linker flags
|
56
|
+
def add_flags(type, flags)
|
57
|
+
case type
|
58
|
+
when :c
|
59
|
+
$CFLAGS << " #{flags} "
|
60
|
+
when :ld
|
61
|
+
$LDFLAGS << " #{flags} "
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
|
66
|
+
# Check SDL libraries on Linux
|
67
|
+
def check_sdl_linux
|
68
|
+
unless have_library('SDL2') && have_library('SDL2_image') && have_library('SDL2_mixer') && have_library('SDL2_ttf')
|
69
|
+
|
70
|
+
$errors << "Couldn't find packages needed by Ruby 2D."
|
71
|
+
|
72
|
+
# Fedora and CentOS
|
73
|
+
if system('which yum')
|
74
|
+
$errors << "Install the following packages using `yum` (or `dnf`) and try again:\n" <<
|
75
|
+
" SDL2-devel SDL2_image-devel SDL2_mixer-devel SDL2_ttf-devel".bold
|
76
|
+
|
77
|
+
# Arch
|
78
|
+
elsif system('which pacman')
|
79
|
+
$errors << "Install the following packages using `pacman` and try again:\n" <<
|
80
|
+
" sdl2 sdl2_image sdl2_mixer sdl2_ttf".bold
|
81
|
+
|
82
|
+
# openSUSE
|
83
|
+
elsif system('which zypper')
|
84
|
+
$errors << "Install the following packages using `zypper` and try again:\n" <<
|
85
|
+
" libSDL2-devel libSDL2_image-devel libSDL2_mixer-devel libSDL2_ttf-devel".bold
|
86
|
+
|
87
|
+
# Ubuntu, Debian, and Mint
|
88
|
+
# `apt` must be last because openSUSE has it aliased to `zypper`
|
89
|
+
elsif system('which apt')
|
90
|
+
$errors << "Install the following packages using `apt` and try again:\n" <<
|
91
|
+
" libsdl2-dev libsdl2-image-dev libsdl2-mixer-dev libsdl2-ttf-dev".bold
|
92
|
+
end
|
93
|
+
|
94
|
+
$errors << "" << "See #{"ruby2d.com".bold} for additional help."
|
95
|
+
print_errors; exit
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
|
100
|
+
# Set Raspberry Pi flags
|
101
|
+
def set_rpi_flags
|
102
|
+
if $platform == :linux_rpi
|
103
|
+
add_flags(:c, '-I/opt/vc/include')
|
104
|
+
add_flags(:ld, '-L/opt/vc/lib -lbrcmGLESv2')
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
|
37
109
|
# Use the Simple 2D, SDL, and other libraries installed by the user (not those bundled with the gem)
|
38
110
|
def use_usr_libs
|
39
111
|
check_s2d
|
40
112
|
|
41
113
|
# Add flags
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
end
|
46
|
-
$LDFLAGS << ' ' << `bash simple2d --libs`
|
47
|
-
$LDFLAGS.gsub!(/\n/, ' ') # remove newlines in flags, they cause problems
|
114
|
+
set_rpi_flags
|
115
|
+
add_flags(:c, '-I/usr/local/include')
|
116
|
+
add_flags(:ld, `bash simple2d --libs`)
|
48
117
|
end
|
49
118
|
|
50
119
|
|
120
|
+
# Configure native extension ###################################################
|
121
|
+
|
51
122
|
# Build Ruby 2D native extention using libraries installed by user
|
52
123
|
# To use install flag: `gem install ruby2d -- libs`
|
53
124
|
if ARGV.include? 'libs'
|
@@ -55,27 +126,36 @@ if ARGV.include? 'libs'
|
|
55
126
|
|
56
127
|
# Use libraries provided by the gem (default)
|
57
128
|
else
|
58
|
-
|
59
|
-
case RUBY_PLATFORM
|
129
|
+
add_flags(:c, '-std=c11')
|
60
130
|
|
61
|
-
|
62
|
-
when /darwin/
|
63
|
-
# $LDFLAGS << " -L../../assets/macos/lib -lsimple2d -lSDL2 -lSDL2_image -lSDL2_mixer -lSDL2_ttf -ljpeg -lpng16 -ltiff -lwebp -lmpg123 -logg -lflac -lvorbis -lvorbisfile -lfreetype -Wl,-framework,Cocoa -Wl,-framework,ForceFeedback"
|
131
|
+
case $platform
|
64
132
|
|
133
|
+
when :macos
|
134
|
+
add_flags(:c, '-I../../assets/include')
|
65
135
|
ldir = "#{Dir.pwd}/../../assets/macos/lib"
|
66
|
-
$LDFLAGS << " #{ldir}/libsimple2d.a #{ldir}/libSDL2.a #{ldir}/libSDL2_image.a #{ldir}/libSDL2_mixer.a #{ldir}/libSDL2_ttf.a \
|
67
|
-
#{ldir}/libjpeg.a #{ldir}/libpng16.a #{ldir}/libtiff.a #{ldir}/libwebp.a \
|
68
|
-
#{ldir}/libmpg123.a #{ldir}/libogg.a #{ldir}/libflac.a #{ldir}/libvorbis.a #{ldir}/libvorbisfile.a \
|
69
|
-
#{ldir}/libfreetype.a -Wl,-framework,Cocoa -Wl,-framework,ForceFeedback"
|
70
|
-
|
71
|
-
# Linux
|
72
|
-
when /linux/
|
73
|
-
# TODO: Implement static compilation for Linux
|
74
|
-
use_usr_libs
|
75
136
|
|
76
|
-
|
77
|
-
|
78
|
-
|
137
|
+
add_flags(:ld, "#{ldir}/libsimple2d.a")
|
138
|
+
add_flags(:ld, "#{ldir}/libSDL2.a #{ldir}/libSDL2_image.a #{ldir}/libSDL2_mixer.a #{ldir}/libSDL2_ttf.a")
|
139
|
+
add_flags(:ld, "#{ldir}/libjpeg.a #{ldir}/libpng16.a #{ldir}/libtiff.a #{ldir}/libwebp.a")
|
140
|
+
add_flags(:ld, "#{ldir}/libmpg123.a #{ldir}/libogg.a #{ldir}/libflac.a #{ldir}/libvorbis.a #{ldir}/libvorbisfile.a")
|
141
|
+
add_flags(:ld, "#{ldir}/libfreetype.a")
|
142
|
+
add_flags(:ld, "-Wl,-framework,Cocoa -Wl,-framework,ForceFeedback")
|
143
|
+
|
144
|
+
when :linux, :linux_rpi
|
145
|
+
check_sdl_linux
|
146
|
+
simple2d_dir = "#{Dir.pwd}/../../assets/linux/simple2d"
|
147
|
+
|
148
|
+
`(cd #{simple2d_dir} && make)`
|
149
|
+
|
150
|
+
set_rpi_flags
|
151
|
+
add_flags(:c, "-I#{simple2d_dir}/include")
|
152
|
+
add_flags(:ld, "#{simple2d_dir}/build/libsimple2d.a -lSDL2 -lSDL2_image -lSDL2_mixer -lSDL2_ttf -lm")
|
153
|
+
if $platform == :linux then add_flags(:ld, '-lGL') end
|
154
|
+
|
155
|
+
when :windows
|
156
|
+
add_flags(:c, '-I../../assets/include')
|
157
|
+
add_flags(:ld, '-L../../assets/mingw/lib -lsimple2d -lSDL2 -lSDL2_image -lSDL2_mixer -lSDL2_ttf')
|
158
|
+
add_flags(:ld, '-lmingw32 -lopengl32 -lglew32')
|
79
159
|
|
80
160
|
# If can't detect the platform, use libraries installed by the user
|
81
161
|
else
|
@@ -83,6 +163,7 @@ else
|
|
83
163
|
end
|
84
164
|
end
|
85
165
|
|
166
|
+
$LDFLAGS.gsub!(/\n/, ' ') # remove newlines in flags, they can cause problems
|
86
167
|
|
87
168
|
# Create the Makefile
|
88
169
|
create_makefile('ruby2d/ruby2d')
|