rgss 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.clang-format +6 -0
- data/.gitignore +167 -0
- data/.yardopts +6 -0
- data/CHANGELOG.md +4 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +21 -0
- data/Rakefile +9 -0
- data/ext/rgss/cglm-v0.7.9.tar.gz +0 -0
- data/ext/rgss/color.c +599 -0
- data/ext/rgss/entity.c +373 -0
- data/ext/rgss/extconf.rb +53 -0
- data/ext/rgss/font.c +135 -0
- data/ext/rgss/game.c +469 -0
- data/ext/rgss/game.h +99 -0
- data/ext/rgss/gl.c +3217 -0
- data/ext/rgss/glad.c +1140 -0
- data/ext/rgss/glad.h +2129 -0
- data/ext/rgss/glfw.c +1453 -0
- data/ext/rgss/graphics.c +324 -0
- data/ext/rgss/image.c +274 -0
- data/ext/rgss/input.c +745 -0
- data/ext/rgss/khrplatform.h +290 -0
- data/ext/rgss/mat4.c +279 -0
- data/ext/rgss/pax_global_header +1 -0
- data/ext/rgss/point.c +253 -0
- data/ext/rgss/rect.c +449 -0
- data/ext/rgss/rgss.c +56 -0
- data/ext/rgss/rgss.h +241 -0
- data/ext/rgss/stb_image.h +7762 -0
- data/ext/rgss/stb_image_write.h +1690 -0
- data/ext/rgss/stb_rect_pack.h +628 -0
- data/ext/rgss/stb_truetype.h +5011 -0
- data/ext/rgss/utf8.h +1652 -0
- data/ext/rgss/uthash.h +1133 -0
- data/ext/rgss/vec.c +114 -0
- data/ext/rgss/vec.h +192 -0
- data/ext/rgss/vec2.c +489 -0
- data/ext/rgss/vec3.c +751 -0
- data/ext/rgss/vec4.c +681 -0
- data/lib/rgss.rb +140 -0
- data/lib/rgss/batch.rb +57 -0
- data/lib/rgss/blend.rb +47 -0
- data/lib/rgss/game_object.rb +28 -0
- data/lib/rgss/plane.rb +95 -0
- data/lib/rgss/renderable.rb +158 -0
- data/lib/rgss/rgss.so +0 -0
- data/lib/rgss/shader.rb +94 -0
- data/lib/rgss/shaders/sprite-frag.glsl +40 -0
- data/lib/rgss/shaders/sprite-vert.glsl +17 -0
- data/lib/rgss/sprite.rb +139 -0
- data/lib/rgss/stubs/color.rb +318 -0
- data/lib/rgss/stubs/gl.rb +1999 -0
- data/lib/rgss/stubs/glfw.rb +626 -0
- data/lib/rgss/stubs/rect.rb +324 -0
- data/lib/rgss/stubs/rpg.rb +267 -0
- data/lib/rgss/stubs/tone.rb +65 -0
- data/lib/rgss/texture.rb +132 -0
- data/lib/rgss/tilemap.rb +116 -0
- data/lib/rgss/version.rb +3 -0
- data/lib/rgss/viewport.rb +67 -0
- data/rgss.gemspec +44 -0
- data/test.png +0 -0
- metadata +178 -0
data/ext/rgss/entity.c
ADDED
@@ -0,0 +1,373 @@
|
|
1
|
+
#include "game.h"
|
2
|
+
|
3
|
+
VALUE rb_cEntity;
|
4
|
+
|
5
|
+
vec3 AXIS_Z = { 0.0f, 0.0f, 1.0f };
|
6
|
+
|
7
|
+
typedef struct {
|
8
|
+
vec4 *model;
|
9
|
+
vec3 position;
|
10
|
+
vec3 velocity;
|
11
|
+
vec3 scale;
|
12
|
+
vec3 pivot;
|
13
|
+
float angle;
|
14
|
+
int depth;
|
15
|
+
vec3 size;
|
16
|
+
} RGSS_Entity;
|
17
|
+
|
18
|
+
// TODO: Use direct pointer with RUBY_NEVER_FREE instead of new vector?
|
19
|
+
|
20
|
+
static inline void RGSS_Entity_ParseArg(VALUE value, vec3 result)
|
21
|
+
{
|
22
|
+
if (!RTEST(value))
|
23
|
+
{
|
24
|
+
glm_vec3_zero(result);
|
25
|
+
return;
|
26
|
+
}
|
27
|
+
|
28
|
+
result[2] = 0.0f;
|
29
|
+
if (rb_obj_is_kind_of(value, rb_cPoint) == Qtrue || rb_obj_is_kind_of(value, rb_cSize) == Qtrue)
|
30
|
+
{
|
31
|
+
int *ivec = DATA_PTR(value);
|
32
|
+
result[0] = (float) ivec[0];
|
33
|
+
result[1] = (float) ivec[1];
|
34
|
+
}
|
35
|
+
else if (rb_obj_is_kind_of(value, rb_cVec2))
|
36
|
+
{
|
37
|
+
float *vec = DATA_PTR(value);
|
38
|
+
result[0] = vec[0];
|
39
|
+
result[1] = vec[1];
|
40
|
+
}
|
41
|
+
else if (rb_obj_is_kind_of(value, rb_cVec3))
|
42
|
+
{
|
43
|
+
glm_vec3_copy(DATA_PTR(value), result);
|
44
|
+
}
|
45
|
+
else
|
46
|
+
{
|
47
|
+
rb_raise(rb_eTypeError, "%s is not a Point, Size, Vec2, or Vec3", CLASS_NAME(value));
|
48
|
+
}
|
49
|
+
}
|
50
|
+
|
51
|
+
static void RGSS_Entity_Free(void *data)
|
52
|
+
{
|
53
|
+
if (data)
|
54
|
+
{
|
55
|
+
RGSS_Entity *entity = data;
|
56
|
+
if (entity->model)
|
57
|
+
{
|
58
|
+
free(entity->model);
|
59
|
+
entity->model = NULL;
|
60
|
+
}
|
61
|
+
xfree(data);
|
62
|
+
}
|
63
|
+
}
|
64
|
+
|
65
|
+
static VALUE RGSS_Entity_Alloc(VALUE klass)
|
66
|
+
{
|
67
|
+
RGSS_Entity *entity = ALLOC(RGSS_Entity);
|
68
|
+
entity->model = RGSS_MAT4_NEW;
|
69
|
+
glm_mat4_identity(entity->model);
|
70
|
+
|
71
|
+
glm_vec3_zero(entity->position);
|
72
|
+
glm_vec3_zero(entity->velocity);
|
73
|
+
glm_vec3_zero(entity->size);
|
74
|
+
glm_vec3_one(entity->scale);
|
75
|
+
glm_vec3_zero(entity->pivot);
|
76
|
+
entity->angle = 0.0f;
|
77
|
+
entity->depth = 0;
|
78
|
+
|
79
|
+
return Data_Wrap_Struct(klass, NULL, RGSS_Entity_Free, entity);
|
80
|
+
}
|
81
|
+
|
82
|
+
static VALUE RGSS_Entity_GetX(VALUE self)
|
83
|
+
{
|
84
|
+
RGSS_Entity *entity = DATA_PTR(self);
|
85
|
+
return INT2NUM((int) roundf(entity->position[0]));
|
86
|
+
}
|
87
|
+
|
88
|
+
static VALUE RGSS_Entity_SetX(VALUE self, VALUE value)
|
89
|
+
{
|
90
|
+
RGSS_Entity *entity = DATA_PTR(self);
|
91
|
+
entity->position[0] = NUM2FLT(value);
|
92
|
+
return self;
|
93
|
+
}
|
94
|
+
|
95
|
+
static VALUE RGSS_Entity_GetY(VALUE self)
|
96
|
+
{
|
97
|
+
RGSS_Entity *entity = DATA_PTR(self);
|
98
|
+
return INT2NUM((int) roundf(entity->position[1]));
|
99
|
+
}
|
100
|
+
|
101
|
+
static VALUE RGSS_Entity_SetY(VALUE self, VALUE value)
|
102
|
+
{
|
103
|
+
RGSS_Entity *entity = DATA_PTR(self);
|
104
|
+
entity->position[1] = NUM2FLT(value);
|
105
|
+
return self;
|
106
|
+
}
|
107
|
+
|
108
|
+
static VALUE RGSS_Entity_GetZ(VALUE self)
|
109
|
+
{
|
110
|
+
RGSS_Entity *entity = DATA_PTR(self);
|
111
|
+
return INT2NUM(entity->depth);
|
112
|
+
}
|
113
|
+
|
114
|
+
static VALUE RGSS_Entity_SetZ(VALUE self, VALUE value)
|
115
|
+
{
|
116
|
+
RGSS_Entity *entity = DATA_PTR(self);
|
117
|
+
entity->depth = NUM2INT(value);
|
118
|
+
return self;
|
119
|
+
}
|
120
|
+
|
121
|
+
static VALUE RGSS_Entity_GetLocation(VALUE self)
|
122
|
+
{
|
123
|
+
RGSS_Entity *entity = DATA_PTR(self);
|
124
|
+
return RGSS_Point_New((int) roundf(entity->position[0]), (int) roundf(entity->position[1]));
|
125
|
+
}
|
126
|
+
|
127
|
+
static VALUE RGSS_Entity_SetLocation(VALUE self, VALUE point)
|
128
|
+
{
|
129
|
+
RGSS_Entity *entity = DATA_PTR(self);
|
130
|
+
int *ivec = DATA_PTR(point);
|
131
|
+
entity->position[0] = (float) ivec[0];
|
132
|
+
entity->position[1] = (float) ivec[1];
|
133
|
+
return point;
|
134
|
+
}
|
135
|
+
|
136
|
+
static VALUE RGSS_Entity_Update(VALUE self, VALUE delta)
|
137
|
+
{
|
138
|
+
RGSS_Entity *entity = DATA_PTR(self);
|
139
|
+
|
140
|
+
vec3 scale;
|
141
|
+
glm_vec3_mul(entity->scale, entity->size, scale);
|
142
|
+
|
143
|
+
vec3 velocity;
|
144
|
+
glm_vec3_scale(entity->velocity, NUM2FLT(delta), velocity);
|
145
|
+
|
146
|
+
glm_vec3_add(entity->position, velocity, entity->position);
|
147
|
+
|
148
|
+
|
149
|
+
vec3 pivot;
|
150
|
+
glm_vec3_add(entity->pivot, entity->position, pivot);
|
151
|
+
|
152
|
+
glm_rotate_atm(entity->model, pivot, entity->angle, AXIS_Z);
|
153
|
+
glm_translate(entity->model, entity->position);
|
154
|
+
glm_scale(entity->model, scale);
|
155
|
+
|
156
|
+
return self;
|
157
|
+
}
|
158
|
+
|
159
|
+
static VALUE RGSS_Entity_GetModel(VALUE self)
|
160
|
+
{
|
161
|
+
RGSS_Entity *entity = DATA_PTR(self);
|
162
|
+
return Data_Wrap_Struct(rb_cMat4, NULL, RUBY_NEVER_FREE, entity->model);
|
163
|
+
}
|
164
|
+
|
165
|
+
static VALUE RGSS_Entity_SetModel(VALUE self, VALUE model)
|
166
|
+
{
|
167
|
+
RGSS_Entity *entity = DATA_PTR(self);
|
168
|
+
if (RTEST(model))
|
169
|
+
{
|
170
|
+
vec4 *mat = DATA_PTR(model);
|
171
|
+
glm_mat4_copy(mat, entity->model);
|
172
|
+
}
|
173
|
+
else
|
174
|
+
{
|
175
|
+
glm_mat4_identity(entity->model);
|
176
|
+
}
|
177
|
+
return model;
|
178
|
+
}
|
179
|
+
|
180
|
+
static VALUE RGSS_Entity_GetPosition(VALUE self)
|
181
|
+
{
|
182
|
+
RGSS_Entity *entity = DATA_PTR(self);
|
183
|
+
return RGSS_Vec2_New(entity->position[0], entity->position[1]);
|
184
|
+
}
|
185
|
+
|
186
|
+
static VALUE RGSS_Entity_SetPosition(VALUE self, VALUE value)
|
187
|
+
{
|
188
|
+
RGSS_Entity *entity = DATA_PTR(self);
|
189
|
+
|
190
|
+
vec3 vec;
|
191
|
+
RGSS_Entity_ParseArg(value, vec);
|
192
|
+
|
193
|
+
glm_vec3_copy(vec, entity->position);
|
194
|
+
return value;
|
195
|
+
}
|
196
|
+
|
197
|
+
static VALUE RGSS_Entity_GetVelocity(VALUE self)
|
198
|
+
{
|
199
|
+
RGSS_Entity *entity = DATA_PTR(self);
|
200
|
+
return RGSS_Vec2_New(entity->velocity[0], entity->velocity[1]);
|
201
|
+
}
|
202
|
+
|
203
|
+
static VALUE RGSS_Entity_SetVelocity(VALUE self, VALUE value)
|
204
|
+
{
|
205
|
+
RGSS_Entity *entity = DATA_PTR(self);
|
206
|
+
|
207
|
+
vec3 vec;
|
208
|
+
RGSS_Entity_ParseArg(value, vec);
|
209
|
+
|
210
|
+
glm_vec3_copy(vec, entity->velocity);
|
211
|
+
return value;
|
212
|
+
}
|
213
|
+
|
214
|
+
static VALUE RGSS_Entity_GetScale(VALUE self)
|
215
|
+
{
|
216
|
+
RGSS_Entity *entity = DATA_PTR(self);
|
217
|
+
return RGSS_Vec2_New(entity->scale[0], entity->scale[1]);
|
218
|
+
}
|
219
|
+
|
220
|
+
static VALUE RGSS_Entity_SetScale(VALUE self, VALUE value)
|
221
|
+
{
|
222
|
+
RGSS_Entity *entity = DATA_PTR(self);
|
223
|
+
|
224
|
+
vec3 vec;
|
225
|
+
RGSS_Entity_ParseArg(value, vec);
|
226
|
+
|
227
|
+
glm_vec3_copy(vec, entity->scale);
|
228
|
+
return value;
|
229
|
+
}
|
230
|
+
|
231
|
+
static VALUE RGSS_Entity_GetPivot(VALUE self)
|
232
|
+
{
|
233
|
+
RGSS_Entity *entity = DATA_PTR(self);
|
234
|
+
return RGSS_Vec2_New(entity->pivot[0], entity->pivot[1]);
|
235
|
+
}
|
236
|
+
|
237
|
+
static VALUE RGSS_Entity_SetPivot(VALUE self, VALUE value)
|
238
|
+
{
|
239
|
+
RGSS_Entity *entity = DATA_PTR(self);
|
240
|
+
|
241
|
+
vec3 vec;
|
242
|
+
RGSS_Entity_ParseArg(value, vec);
|
243
|
+
|
244
|
+
glm_vec3_copy(vec, entity->pivot);
|
245
|
+
return value;
|
246
|
+
}
|
247
|
+
|
248
|
+
static VALUE RGSS_Entity_GetSize(VALUE self)
|
249
|
+
{
|
250
|
+
RGSS_Entity *entity = DATA_PTR(self);
|
251
|
+
return RGSS_Size_New((int) roundf(entity->size[0]), (int) roundf(entity->size[1]));
|
252
|
+
}
|
253
|
+
|
254
|
+
static VALUE RGSS_Entity_SetSize(VALUE self, VALUE value)
|
255
|
+
{
|
256
|
+
RGSS_Entity *entity = DATA_PTR(self);
|
257
|
+
|
258
|
+
vec3 vec;
|
259
|
+
RGSS_Entity_ParseArg(value, vec);
|
260
|
+
|
261
|
+
glm_vec3_copy(vec, entity->size);
|
262
|
+
return value;
|
263
|
+
}
|
264
|
+
|
265
|
+
static VALUE RGSS_Entity_GetAngle(VALUE self)
|
266
|
+
{
|
267
|
+
RGSS_Entity *entity = DATA_PTR(self);
|
268
|
+
return DBL2NUM(entity->angle * (180.0 / M_PI));
|
269
|
+
}
|
270
|
+
|
271
|
+
static VALUE RGSS_Entity_SetAngle(VALUE self, VALUE degrees)
|
272
|
+
{
|
273
|
+
RGSS_Entity *entity = DATA_PTR(self);
|
274
|
+
entity->angle = NUM2DBL(degrees) * (M_PI / 180.0);
|
275
|
+
return degrees;
|
276
|
+
}
|
277
|
+
|
278
|
+
static VALUE RGSS_Entity_GetBounds(VALUE self)
|
279
|
+
{
|
280
|
+
RGSS_Entity *entity = DATA_PTR(self);
|
281
|
+
int *rect = xmalloc(sizeof(int) * 4);
|
282
|
+
|
283
|
+
rect[0] = (int) roundf(entity->position[0]);
|
284
|
+
rect[1] = (int) roundf(entity->position[1]);
|
285
|
+
rect[2] = (int) roundf(entity->size[0]);
|
286
|
+
rect[3] = (int) roundf(entity->size[1]);
|
287
|
+
|
288
|
+
return Data_Wrap_Struct(rb_cRect, NULL, RUBY_DEFAULT_FREE, rect);
|
289
|
+
}
|
290
|
+
|
291
|
+
static VALUE RGSS_Entity_Rotate(VALUE self, VALUE degrees, VALUE pivot)
|
292
|
+
{
|
293
|
+
RGSS_Entity *entity = DATA_PTR(self);
|
294
|
+
|
295
|
+
vec3 value;
|
296
|
+
RGSS_Entity_ParseArg(pivot, value);
|
297
|
+
|
298
|
+
entity->angle = NUM2DBL(degrees) * (M_PI / 180.0);
|
299
|
+
glm_vec3_copy(value, entity->pivot);
|
300
|
+
|
301
|
+
return self;
|
302
|
+
}
|
303
|
+
|
304
|
+
static VALUE RGSS_Entity_GetWidth(VALUE self)
|
305
|
+
{
|
306
|
+
RGSS_Entity *entity = DATA_PTR(self);
|
307
|
+
return INT2NUM((int) roundf(entity->size[0]));
|
308
|
+
}
|
309
|
+
|
310
|
+
static VALUE RGSS_Entity_GetHeight(VALUE self)
|
311
|
+
{
|
312
|
+
RGSS_Entity *entity = DATA_PTR(self);
|
313
|
+
return INT2NUM((int) roundf(entity->size[1]));
|
314
|
+
}
|
315
|
+
|
316
|
+
static VALUE RGSS_Entity_SetWidth(VALUE self, VALUE value)
|
317
|
+
{
|
318
|
+
RGSS_Entity *entity = DATA_PTR(self);
|
319
|
+
entity->size[0] = NUM2FLT(value);
|
320
|
+
return value;
|
321
|
+
}
|
322
|
+
|
323
|
+
static VALUE RGSS_Entity_SetHeight(VALUE self, VALUE value)
|
324
|
+
{
|
325
|
+
RGSS_Entity *entity = DATA_PTR(self);
|
326
|
+
entity->size[1] = NUM2FLT(value);
|
327
|
+
return value;
|
328
|
+
}
|
329
|
+
|
330
|
+
void RGSS_Init_Entity(VALUE parent)
|
331
|
+
{
|
332
|
+
rb_cEntity = rb_define_class_under(parent, "Entity", rb_cObject);
|
333
|
+
rb_define_alloc_func(rb_cEntity, RGSS_Entity_Alloc);
|
334
|
+
|
335
|
+
rb_define_method1(rb_cEntity, "update", RGSS_Entity_Update, 1);
|
336
|
+
|
337
|
+
rb_define_method0(rb_cEntity, "model", RGSS_Entity_GetModel, 0);
|
338
|
+
rb_define_method1(rb_cEntity, "model=", RGSS_Entity_SetModel, 1);
|
339
|
+
rb_define_method0(rb_cEntity, "position", RGSS_Entity_GetPosition, 0);
|
340
|
+
rb_define_method1(rb_cEntity, "position=", RGSS_Entity_SetPosition, 1);
|
341
|
+
rb_define_method0(rb_cEntity, "velocity", RGSS_Entity_GetVelocity, 0);
|
342
|
+
rb_define_method1(rb_cEntity, "velocity=", RGSS_Entity_SetVelocity, 1);
|
343
|
+
rb_define_method0(rb_cEntity, "scale", RGSS_Entity_GetScale, 0);
|
344
|
+
rb_define_method1(rb_cEntity, "scale=", RGSS_Entity_SetScale, 1);
|
345
|
+
rb_define_method0(rb_cEntity, "pivot", RGSS_Entity_GetPivot, 0);
|
346
|
+
rb_define_method1(rb_cEntity, "pivot=", RGSS_Entity_SetPivot, 1);
|
347
|
+
rb_define_method0(rb_cEntity, "angle", RGSS_Entity_GetAngle, 0);
|
348
|
+
rb_define_method1(rb_cEntity, "angle=", RGSS_Entity_SetAngle, 1);
|
349
|
+
|
350
|
+
rb_define_method0(rb_cEntity, "bounds", RGSS_Entity_GetBounds, 0);
|
351
|
+
rb_define_method2(rb_cEntity, "rotate", RGSS_Entity_Rotate, 2);
|
352
|
+
|
353
|
+
rb_define_method0(rb_cEntity, "x", RGSS_Entity_GetX, 0);
|
354
|
+
rb_define_method1(rb_cEntity, "x=", RGSS_Entity_SetX, 1);
|
355
|
+
rb_define_method0(rb_cEntity, "y", RGSS_Entity_GetY, 0);
|
356
|
+
rb_define_method1(rb_cEntity, "y=", RGSS_Entity_SetY, 1);
|
357
|
+
rb_define_method0(rb_cEntity, "z", RGSS_Entity_GetZ, 0);
|
358
|
+
rb_define_method1(rb_cEntity, "z=", RGSS_Entity_SetZ, 1);
|
359
|
+
rb_define_method0(rb_cEntity, "location", RGSS_Entity_GetLocation, 0);
|
360
|
+
rb_define_method1(rb_cEntity, "location=", RGSS_Entity_SetLocation, 1);
|
361
|
+
rb_define_method0(rb_cEntity, "size", RGSS_Entity_GetSize, 0);
|
362
|
+
rb_define_method0(rb_cEntity, "width", RGSS_Entity_GetWidth, 0);
|
363
|
+
rb_define_method0(rb_cEntity, "height", RGSS_Entity_GetHeight, 0);
|
364
|
+
|
365
|
+
rb_define_protected_method1(rb_cEntity, "size=", RGSS_Entity_SetSize, 1);
|
366
|
+
rb_define_protected_method1(rb_cEntity, "width=", RGSS_Entity_SetWidth, 1);
|
367
|
+
rb_define_protected_method1(rb_cEntity, "height=", RGSS_Entity_SetHeight, 1);
|
368
|
+
|
369
|
+
rb_define_alias(rb_cEntity, "depth", "z");
|
370
|
+
|
371
|
+
// rb_define_method0(rb_cEntity, "model", RGSS_Entity_GetModel, 0);
|
372
|
+
// rb_define_method1(rb_cEntity, "model", RGSS_Entity_SetModel, 1);
|
373
|
+
}
|
data/ext/rgss/extconf.rb
ADDED
@@ -0,0 +1,53 @@
|
|
1
|
+
require 'mkmf'
|
2
|
+
|
3
|
+
require "mkmf"
|
4
|
+
require 'fileutils'
|
5
|
+
require 'rubygems/package'
|
6
|
+
require 'zlib'
|
7
|
+
|
8
|
+
CGLM_VERSION = '0.7.9'
|
9
|
+
cglm_source_url = "https://github.com/recp/cglm/archive/v#{CGLM_VERSION}.tar.gz"
|
10
|
+
cglm_tar_gz = File.expand_path("cglm-v#{CGLM_VERSION}.tar.gz", __dir__)
|
11
|
+
cglm_dir = File.expand_path("cglm-#{CGLM_VERSION }", __dir__)
|
12
|
+
|
13
|
+
# fetch cglm unless it's already on the file system
|
14
|
+
unless File.exist?(cglm_dir)
|
15
|
+
require 'open-uri'
|
16
|
+
# save tarfile
|
17
|
+
open(cglm_tar_gz, 'wb') do |file|
|
18
|
+
file << URI.open(cglm_source_url, 'rb').read
|
19
|
+
end
|
20
|
+
|
21
|
+
# extract tarfile
|
22
|
+
FileUtils.rm_rf cglm_dir if File.directory?(cglm_dir)
|
23
|
+
FileUtils.mkdir_p cglm_dir
|
24
|
+
tar_extract = Gem::Package::TarReader.new(Zlib::GzipReader.open(cglm_tar_gz))
|
25
|
+
tar_extract.rewind # The extract has to be rewinded after every iteration
|
26
|
+
tar_extract.each do |entry|
|
27
|
+
full_path = File.expand_path(entry.full_name, __dir__)
|
28
|
+
if entry.directory?
|
29
|
+
FileUtils.mkdir_p full_path
|
30
|
+
else
|
31
|
+
FileUtils.mkdir_p File.dirname(full_path)
|
32
|
+
File.open(full_path, 'wb') { |file| file << entry.read }
|
33
|
+
end
|
34
|
+
end
|
35
|
+
tar_extract.close
|
36
|
+
end
|
37
|
+
|
38
|
+
$INCFLAGS << " -I#{cglm_dir}/include"
|
39
|
+
|
40
|
+
require 'fiddle'
|
41
|
+
%w(
|
42
|
+
SIZEOF_VOIDP SIZEOF_CHAR SIZEOF_SHORT SIZEOF_INT SIZEOF_LONG SIZEOF_LONG_LONG
|
43
|
+
SIZEOF_FLOAT SIZEOF_DOUBLE SIZEOF_SIZE_T SIZEOF_SSIZE_T SIZEOF_PTRDIFF_T
|
44
|
+
SIZEOF_INTPTR_T SIZEOF_UINTPTR_T
|
45
|
+
).each do |const_name|
|
46
|
+
if Fiddle.constants.include?(const_name.to_sym)
|
47
|
+
$CFLAGS << " -DHAVE_#{const_name}=1 -D#{const_name}=#{Fiddle.const_get(const_name.to_sym)}"
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
find_library('glfw', 'glfwInit')
|
52
|
+
|
53
|
+
create_makefile("rgss/rgss")
|
data/ext/rgss/font.c
ADDED
@@ -0,0 +1,135 @@
|
|
1
|
+
#if 1
|
2
|
+
|
3
|
+
#include "game.h"
|
4
|
+
#include "ruby/io.h"
|
5
|
+
|
6
|
+
#define STB_TRUETYPE_IMPLEMENTATION 1
|
7
|
+
#define STBTT_STATIC 1
|
8
|
+
#define STBTT_malloc(x, u) ((void)(u),xmalloc(x))
|
9
|
+
#define STBTT_free(x,u) ((void)(u),xfree(x))
|
10
|
+
#define STBTT_assert(x) RUBY_ASSERT(x)
|
11
|
+
|
12
|
+
#include "stb_rect_pack.h"
|
13
|
+
#include "stb_truetype.h"
|
14
|
+
|
15
|
+
VALUE rb_cTrueType;
|
16
|
+
|
17
|
+
typedef struct {
|
18
|
+
stbtt_fontinfo info;
|
19
|
+
unsigned char *buffer;
|
20
|
+
} RGSS_TrueType;
|
21
|
+
|
22
|
+
static void RGSS_TrueType_Free(void *data)
|
23
|
+
{
|
24
|
+
if (data == NULL)
|
25
|
+
return;
|
26
|
+
|
27
|
+
RGSS_TrueType *font = data;
|
28
|
+
if (font->buffer)
|
29
|
+
xfree(font->buffer);
|
30
|
+
|
31
|
+
xfree(font);
|
32
|
+
}
|
33
|
+
|
34
|
+
static VALUE RGSS_TrueType_Alloc(VALUE klass)
|
35
|
+
{
|
36
|
+
RGSS_TrueType *font = ALLOC(RGSS_TrueType);
|
37
|
+
memset(font, 0, sizeof(RGSS_TrueType));
|
38
|
+
return Data_Wrap_Struct(klass, NULL, RGSS_TrueType_Free, font);
|
39
|
+
}
|
40
|
+
|
41
|
+
static unsigned char* RGSS_TrueType_ReadFile(int fd)
|
42
|
+
{
|
43
|
+
if (fd == -1)
|
44
|
+
rb_raise(rb_eRuntimeError, "invalid file descriptor");
|
45
|
+
|
46
|
+
size_t len, result;
|
47
|
+
|
48
|
+
len = lseek(fd, 0, SEEK_END);
|
49
|
+
lseek(fd, 0, SEEK_SET);
|
50
|
+
|
51
|
+
void *buffer = xmalloc(len);
|
52
|
+
if (buffer == NULL)
|
53
|
+
rb_raise(rb_eNoMemError, "failed to allocate file read buffer");
|
54
|
+
|
55
|
+
result = read(fd, buffer, len);
|
56
|
+
if (result != len)
|
57
|
+
rb_raise(rb_eRuntimeError, "failed to read file");
|
58
|
+
|
59
|
+
return buffer;
|
60
|
+
}
|
61
|
+
|
62
|
+
static VALUE RGSS_TrueType_Initialize(VALUE self, VALUE source)
|
63
|
+
{
|
64
|
+
rb_io_t *fptr;
|
65
|
+
VALUE file;
|
66
|
+
int close;
|
67
|
+
|
68
|
+
if (RB_TYPE_P(source, T_STRING))
|
69
|
+
{
|
70
|
+
file = rb_file_open(StringValueCStr(source), "rb");
|
71
|
+
close = 1;
|
72
|
+
}
|
73
|
+
else if (RB_TYPE_P(source, T_FILE))
|
74
|
+
{
|
75
|
+
file = source;
|
76
|
+
close = 0;
|
77
|
+
}
|
78
|
+
else
|
79
|
+
{
|
80
|
+
rb_raise(rb_eTypeError, "%s is not a File or String", CLASS_NAME(source));
|
81
|
+
}
|
82
|
+
|
83
|
+
GetOpenFile(file, fptr);
|
84
|
+
unsigned char *buffer = RGSS_TrueType_ReadFile(fptr->fd);
|
85
|
+
if (close)
|
86
|
+
rb_io_close(file);
|
87
|
+
|
88
|
+
RGSS_TrueType *font = DATA_PTR(self);
|
89
|
+
|
90
|
+
font->buffer = buffer;
|
91
|
+
stbtt_InitFont(&font->info, buffer, stbtt_GetFontOffsetForIndex(buffer, 0));
|
92
|
+
|
93
|
+
return self;
|
94
|
+
}
|
95
|
+
|
96
|
+
static VALUE RGSS_TrueType_Scale(int argc, VALUE *argv, VALUE self)
|
97
|
+
{
|
98
|
+
VALUE height, opts;
|
99
|
+
rb_scan_args(argc, argv, "1:", &height, &opts);
|
100
|
+
|
101
|
+
int pixel = 1;
|
102
|
+
if (RTEST(opts))
|
103
|
+
{
|
104
|
+
VALUE mode = rb_hash_aref(opts, STR2SYM("mode"));
|
105
|
+
if (mode == STR2SYM("pixel"))
|
106
|
+
pixel = 1;
|
107
|
+
else if (mode == STR2SYM("em"))
|
108
|
+
pixel = 0;
|
109
|
+
else
|
110
|
+
rb_raise(rb_eArgError, "invalid scaling mode specified");
|
111
|
+
}
|
112
|
+
|
113
|
+
float value;
|
114
|
+
RGSS_TrueType *font = DATA_PTR(self);
|
115
|
+
|
116
|
+
if (pixel)
|
117
|
+
value = stbtt_ScaleForPixelHeight(&font->info, NUM2FLT(height));
|
118
|
+
else
|
119
|
+
value = stbtt_ScaleForMappingEmToPixels(&font->info, NUM2FLT(height));
|
120
|
+
|
121
|
+
return DBL2NUM(value);
|
122
|
+
}
|
123
|
+
|
124
|
+
|
125
|
+
void RGSS_Init_TrueType(VALUE parent)
|
126
|
+
{
|
127
|
+
rb_cTrueType = rb_define_class_under(parent, "TrueType", rb_cObject);
|
128
|
+
rb_define_alloc_func(rb_cTrueType, RGSS_TrueType_Alloc);
|
129
|
+
|
130
|
+
|
131
|
+
rb_define_method1(rb_cTrueType, "initialize", RGSS_TrueType_Initialize, 1);
|
132
|
+
rb_define_methodm1(rb_cTrueType, "scale", RGSS_TrueType_Scale, -1);
|
133
|
+
}
|
134
|
+
|
135
|
+
#endif /* */
|