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
@@ -0,0 +1 @@
|
|
1
|
+
52 comment=ec852c7682fbebacccbee01e3076e8ee4f378d8e
|
data/ext/rgss/point.c
ADDED
@@ -0,0 +1,253 @@
|
|
1
|
+
#include "rgss.h"
|
2
|
+
|
3
|
+
VALUE rb_cIVec2;
|
4
|
+
VALUE rb_cPoint;
|
5
|
+
VALUE rb_cSize;
|
6
|
+
|
7
|
+
#define IVEC_SIZE (sizeof(int) * 2)
|
8
|
+
|
9
|
+
RGSS_DEFINE_MARSHAL(RGSS_Point)
|
10
|
+
|
11
|
+
static VALUE RGSS_IVec_Alloc(VALUE klass)
|
12
|
+
{
|
13
|
+
int *vec = xmalloc(IVEC_SIZE);
|
14
|
+
memset(vec, 0, IVEC_SIZE);
|
15
|
+
return Data_Wrap_Struct(klass, NULL, RUBY_DEFAULT_FREE, vec);
|
16
|
+
}
|
17
|
+
|
18
|
+
static VALUE RGSS_IVec_GetX(VALUE self)
|
19
|
+
{
|
20
|
+
return INT2NUM(((int*) DATA_PTR(self))[0]);
|
21
|
+
}
|
22
|
+
|
23
|
+
static VALUE RGSS_IVec_GetY(VALUE self)
|
24
|
+
{
|
25
|
+
return INT2NUM(((int*) DATA_PTR(self))[1]);
|
26
|
+
}
|
27
|
+
|
28
|
+
static VALUE RGSS_IVec_SetX(VALUE self, VALUE value)
|
29
|
+
{
|
30
|
+
RGSS_ASSERT_UNFROZEN(self);
|
31
|
+
int *vec = DATA_PTR(self);
|
32
|
+
vec[0] = NUM2INT(value);
|
33
|
+
return value;
|
34
|
+
}
|
35
|
+
|
36
|
+
static VALUE RGSS_IVec_SetY(VALUE self, VALUE value)
|
37
|
+
{
|
38
|
+
RGSS_ASSERT_UNFROZEN(self);
|
39
|
+
int *vec = DATA_PTR(self);
|
40
|
+
vec[1] = NUM2INT(value);
|
41
|
+
return value;
|
42
|
+
}
|
43
|
+
|
44
|
+
static VALUE RGSS_IVec_Equal(VALUE self, VALUE other)
|
45
|
+
{
|
46
|
+
if (CLASS_OF(self) != CLASS_OF(other))
|
47
|
+
return Qfalse;
|
48
|
+
|
49
|
+
int *v1 = DATA_PTR(self), *v2 = DATA_PTR(other);
|
50
|
+
return RB_BOOL(v1[0] == v2[0] && v1[1] == v2[1]);
|
51
|
+
}
|
52
|
+
|
53
|
+
static VALUE RGSS_IVec_GetIndex(VALUE self, VALUE index)
|
54
|
+
{
|
55
|
+
int i = NUM2INT(index);
|
56
|
+
if (i < 0 || i > 1)
|
57
|
+
return Qnil;
|
58
|
+
return INT2NUM(((int*) DATA_PTR(self))[i]);
|
59
|
+
}
|
60
|
+
|
61
|
+
static VALUE RGSS_IVec_SetIndex(VALUE self, VALUE index, VALUE value)
|
62
|
+
{
|
63
|
+
RGSS_ASSERT_UNFROZEN(self);
|
64
|
+
int i = NUM2INT(index);
|
65
|
+
if (i < 0 || i > 1)
|
66
|
+
rb_raise(rb_eArgError, "index out of range (given %d, expect 0..1)", i);
|
67
|
+
|
68
|
+
int *vec = DATA_PTR(self);
|
69
|
+
vec[i] = NUM2INT(value);
|
70
|
+
return value;
|
71
|
+
}
|
72
|
+
|
73
|
+
static VALUE RGSS_IVec_IsEmpty(VALUE self)
|
74
|
+
{
|
75
|
+
int *i = DATA_PTR(self);
|
76
|
+
return RB_BOOL(i[0] == 0 && i[1] == 0);
|
77
|
+
}
|
78
|
+
|
79
|
+
static VALUE RGSS_IVec_Add(VALUE self, VALUE other)
|
80
|
+
{
|
81
|
+
int *v1 = DATA_PTR(self), *v2 = DATA_PTR(other), *dst = xmalloc(IVEC_SIZE);
|
82
|
+
|
83
|
+
dst[0] = v1[0] + v2[0];
|
84
|
+
dst[1] = v1[1] + v2[1];
|
85
|
+
return Data_Wrap_Struct(CLASS_OF(self), NULL, RUBY_DEFAULT_FREE, dst);
|
86
|
+
}
|
87
|
+
|
88
|
+
static VALUE RGSS_IVec_Subtract(VALUE self, VALUE other)
|
89
|
+
{
|
90
|
+
int *v1 = DATA_PTR(self), *v2 = DATA_PTR(other), *dst = xmalloc(IVEC_SIZE);
|
91
|
+
|
92
|
+
dst[0] = v1[0] - v2[0];
|
93
|
+
dst[1] = v1[1] - v2[1];
|
94
|
+
return Data_Wrap_Struct(CLASS_OF(self), NULL, RUBY_DEFAULT_FREE, dst);
|
95
|
+
}
|
96
|
+
|
97
|
+
static VALUE RGSS_IVec_Clone(VALUE self)
|
98
|
+
{
|
99
|
+
int *src = DATA_PTR(self), *dst = xmalloc(IVEC_SIZE);
|
100
|
+
memcpy(dst, src, IVEC_SIZE);
|
101
|
+
|
102
|
+
VALUE value = Data_Wrap_Struct(CLASS_OF(self), NULL, RUBY_DEFAULT_FREE, dst);
|
103
|
+
if (rb_obj_frozen_p(self))
|
104
|
+
rb_obj_freeze(value);
|
105
|
+
|
106
|
+
return value;
|
107
|
+
}
|
108
|
+
|
109
|
+
static VALUE RGSS_IVec_Dupe(VALUE self)
|
110
|
+
{
|
111
|
+
int *src = DATA_PTR(self), *dst = xmalloc(IVEC_SIZE);
|
112
|
+
memcpy(dst, src, IVEC_SIZE);
|
113
|
+
return Data_Wrap_Struct(CLASS_OF(self), NULL, RUBY_DEFAULT_FREE, dst);
|
114
|
+
}
|
115
|
+
|
116
|
+
static VALUE RGSS_IVec_OffsetBang(int argc, VALUE *argv, VALUE self)
|
117
|
+
{
|
118
|
+
RGSS_ASSERT_UNFROZEN(self);
|
119
|
+
VALUE a1, a2;
|
120
|
+
rb_scan_args(argc, argv, "11", &a1, &a2);
|
121
|
+
|
122
|
+
int *vec = DATA_PTR(self);
|
123
|
+
int x, y;
|
124
|
+
|
125
|
+
if (argc == 1)
|
126
|
+
{
|
127
|
+
int *v = DATA_PTR(a1);
|
128
|
+
x = v[0];
|
129
|
+
y = v[1];
|
130
|
+
}
|
131
|
+
else
|
132
|
+
{
|
133
|
+
x = NUM2INT(a1);
|
134
|
+
y = NUM2INT(a2);
|
135
|
+
}
|
136
|
+
|
137
|
+
vec[0] += x;
|
138
|
+
vec[1] += y;
|
139
|
+
return self;
|
140
|
+
}
|
141
|
+
|
142
|
+
static VALUE RGSS_IVec_Offset(int argc, VALUE *argv, VALUE self)
|
143
|
+
{
|
144
|
+
return RGSS_IVec_OffsetBang(argc, argv, RGSS_IVec_Dupe(self));
|
145
|
+
}
|
146
|
+
|
147
|
+
static VALUE RGSS_IVec_Inspect(VALUE self)
|
148
|
+
{
|
149
|
+
int *vec = DATA_PTR(self);
|
150
|
+
return rb_sprintf("<%d, %d>", vec[0], vec[1]);
|
151
|
+
}
|
152
|
+
|
153
|
+
static VALUE RGSS_IVec_Set(VALUE self, VALUE x, VALUE y)
|
154
|
+
{
|
155
|
+
RGSS_ASSERT_UNFROZEN(self);
|
156
|
+
int *vec = DATA_PTR(self);
|
157
|
+
vec[0] = NUM2INT(x);
|
158
|
+
vec[1] = NUM2INT(y);
|
159
|
+
return self;
|
160
|
+
}
|
161
|
+
|
162
|
+
static VALUE RGSS_IVec_ToArray(VALUE self)
|
163
|
+
{
|
164
|
+
int *vec = DATA_PTR(self);
|
165
|
+
return rb_ary_new_from_args(2, INT2NUM(vec[0]), INT2NUM(vec[1]));
|
166
|
+
}
|
167
|
+
|
168
|
+
static VALUE RGSS_Point_ToHash(VALUE self)
|
169
|
+
{
|
170
|
+
int *vec = DATA_PTR(self);
|
171
|
+
VALUE hash = rb_hash_new();
|
172
|
+
rb_hash_aset(hash, STR2SYM("x"), INT2NUM(vec[0]));
|
173
|
+
rb_hash_aset(hash, STR2SYM("y"), INT2NUM(vec[1]));
|
174
|
+
return hash;
|
175
|
+
}
|
176
|
+
|
177
|
+
static VALUE RGSS_Size_ToHash(VALUE self)
|
178
|
+
{
|
179
|
+
int *vec = DATA_PTR(self);
|
180
|
+
VALUE hash = rb_hash_new();
|
181
|
+
rb_hash_aset(hash, STR2SYM("width"), INT2NUM(vec[0]));
|
182
|
+
rb_hash_aset(hash, STR2SYM("height"), INT2NUM(vec[1]));
|
183
|
+
return hash;
|
184
|
+
}
|
185
|
+
|
186
|
+
static VALUE RGSS_IVec_Initialize(int argc, VALUE *argv, VALUE self)
|
187
|
+
{
|
188
|
+
VALUE x, y;
|
189
|
+
rb_scan_args(argc, argv, "02", &x, &y);
|
190
|
+
|
191
|
+
int *vec = DATA_PTR(self);
|
192
|
+
|
193
|
+
switch (argc)
|
194
|
+
{
|
195
|
+
case 0: break;
|
196
|
+
case 1:
|
197
|
+
{
|
198
|
+
memcpy(vec, DATA_PTR(x), IVEC_SIZE);
|
199
|
+
break;
|
200
|
+
}
|
201
|
+
case 2:
|
202
|
+
{
|
203
|
+
vec[0] = NUM2INT(x);
|
204
|
+
vec[1] = NUM2INT(y);
|
205
|
+
break;
|
206
|
+
}
|
207
|
+
}
|
208
|
+
return Qnil;
|
209
|
+
}
|
210
|
+
|
211
|
+
void RGSS_Init_PointAndSize(VALUE parent)
|
212
|
+
{
|
213
|
+
rb_cIVec2 = rb_define_class_under(parent, "IVec2", rb_cObject);
|
214
|
+
rb_cPoint = rb_define_class_under(parent, "Point", rb_cIVec2);
|
215
|
+
rb_cSize = rb_define_class_under(parent, "Size", rb_cIVec2);
|
216
|
+
rb_define_alloc_func(rb_cIVec2, RGSS_IVec_Alloc);
|
217
|
+
rb_define_alloc_func(rb_cPoint, RGSS_IVec_Alloc);
|
218
|
+
rb_define_alloc_func(rb_cSize, RGSS_IVec_Alloc);
|
219
|
+
|
220
|
+
rb_define_methodm1(rb_cIVec2, "initialize", RGSS_IVec_Initialize, -1);
|
221
|
+
rb_define_method1(rb_cIVec2, "[]", RGSS_IVec_GetIndex, 1);
|
222
|
+
rb_define_method2(rb_cIVec2, "[]=", RGSS_IVec_SetIndex, 2);
|
223
|
+
rb_define_method1(rb_cIVec2, "eql?", RGSS_IVec_Equal, 1);
|
224
|
+
rb_define_method1(rb_cIVec2, "==", RGSS_IVec_Equal, 1);
|
225
|
+
rb_define_method0(rb_cIVec2, "empty?", RGSS_IVec_IsEmpty, 0);
|
226
|
+
rb_define_method1(rb_cIVec2, "+", RGSS_IVec_Add, 1);
|
227
|
+
rb_define_method1(rb_cIVec2, "-", RGSS_IVec_Subtract, 1);
|
228
|
+
rb_define_method1(rb_cIVec2, "add", RGSS_IVec_Add, 1);
|
229
|
+
rb_define_method1(rb_cIVec2, "subtract", RGSS_IVec_Subtract, 1);
|
230
|
+
rb_define_method0(rb_cIVec2, "clone", RGSS_IVec_Clone, 0);
|
231
|
+
rb_define_method0(rb_cIVec2, "dup", RGSS_IVec_Dupe, 0);
|
232
|
+
rb_define_method0(rb_cIVec2, "inspect", RGSS_IVec_Inspect, 0);
|
233
|
+
rb_define_method2(rb_cIVec2, "set", RGSS_IVec_Set, 2);
|
234
|
+
rb_define_method0(rb_cIVec2, "to_a", RGSS_IVec_ToArray, 0);
|
235
|
+
rb_define_methodm1(rb_cIVec2, "_dump", RGSS_Point_Dump, -1);
|
236
|
+
|
237
|
+
rb_define_method0(rb_cPoint, "x", RGSS_IVec_GetX, 0);
|
238
|
+
rb_define_method0(rb_cPoint, "y", RGSS_IVec_GetY, 0);
|
239
|
+
rb_define_method1(rb_cPoint, "x=", RGSS_IVec_SetX, 1);
|
240
|
+
rb_define_method1(rb_cPoint, "y=", RGSS_IVec_SetY, 1);
|
241
|
+
rb_define_methodm1(rb_cPoint, "offset!", RGSS_IVec_OffsetBang, -1);
|
242
|
+
rb_define_methodm1(rb_cPoint, "offset", RGSS_IVec_Offset, -1);
|
243
|
+
rb_define_method0(rb_cPoint, "to_h", RGSS_Point_ToHash, 0);
|
244
|
+
|
245
|
+
rb_define_method0(rb_cSize, "width", RGSS_IVec_GetX, 0);
|
246
|
+
rb_define_method0(rb_cSize, "height", RGSS_IVec_GetY, 0);
|
247
|
+
rb_define_method1(rb_cSize, "width=", RGSS_IVec_SetX, 1);
|
248
|
+
rb_define_method1(rb_cSize, "height=", RGSS_IVec_SetY, 1);
|
249
|
+
rb_define_method0(rb_cSize, "to_h", RGSS_Size_ToHash, 0);
|
250
|
+
|
251
|
+
rb_define_singleton_method0(rb_cIVec2, "empty", RGSS_IVec_Alloc, 0);
|
252
|
+
rb_define_singleton_method1(rb_cIVec2, "_load", RGSS_Point_Load, 1);
|
253
|
+
}
|
data/ext/rgss/rect.c
ADDED
@@ -0,0 +1,449 @@
|
|
1
|
+
#include "rgss.h"
|
2
|
+
|
3
|
+
VALUE rb_cRect;
|
4
|
+
|
5
|
+
RGSS_DEFINE_MARSHAL(RGSS_Rect)
|
6
|
+
|
7
|
+
static VALUE RGSS_Rect_Alloc(VALUE klass)
|
8
|
+
{
|
9
|
+
RGSS_Rect *rect = ALLOC(RGSS_Rect);
|
10
|
+
memset(rect, 0, sizeof(RGSS_Rect));
|
11
|
+
return Data_Wrap_Struct(klass, NULL, RUBY_DEFAULT_FREE, rect);
|
12
|
+
}
|
13
|
+
|
14
|
+
static VALUE RGSS_Rect_GetX(VALUE self)
|
15
|
+
{
|
16
|
+
RGSS_Rect *rect = DATA_PTR(self);
|
17
|
+
return INT2NUM(rect->x);
|
18
|
+
}
|
19
|
+
|
20
|
+
static VALUE RGSS_Rect_GetY(VALUE self)
|
21
|
+
{
|
22
|
+
RGSS_Rect *rect = DATA_PTR(self);
|
23
|
+
return INT2NUM(rect->y);
|
24
|
+
}
|
25
|
+
|
26
|
+
static VALUE RGSS_Rect_GetWidth(VALUE self)
|
27
|
+
{
|
28
|
+
RGSS_Rect *rect = DATA_PTR(self);
|
29
|
+
return INT2NUM(rect->width);
|
30
|
+
}
|
31
|
+
|
32
|
+
static VALUE RGSS_Rect_GetHeight(VALUE self)
|
33
|
+
{
|
34
|
+
RGSS_Rect *rect = DATA_PTR(self);
|
35
|
+
return INT2NUM(rect->height);
|
36
|
+
}
|
37
|
+
|
38
|
+
static VALUE RGSS_Rect_GetLocation(VALUE self)
|
39
|
+
{
|
40
|
+
RGSS_Rect *rect = DATA_PTR(self);
|
41
|
+
return RGSS_IVec2_New(rb_cPoint, rect->x, rect->y);
|
42
|
+
}
|
43
|
+
|
44
|
+
static VALUE RGSS_Rect_GetSize(VALUE self)
|
45
|
+
{
|
46
|
+
RGSS_Rect *rect = DATA_PTR(self);
|
47
|
+
return RGSS_IVec2_New(rb_cSize, rect->width, rect->height);
|
48
|
+
}
|
49
|
+
|
50
|
+
static VALUE RGSS_Rect_GetIndex(VALUE self, VALUE index)
|
51
|
+
{
|
52
|
+
int i = NUM2INT(index);
|
53
|
+
if (i < 0 || i > 3)
|
54
|
+
return Qnil;
|
55
|
+
return INT2NUM(((int*) DATA_PTR(self))[i]);
|
56
|
+
}
|
57
|
+
|
58
|
+
static VALUE RGSS_Rect_SetIndex(VALUE self, VALUE index, VALUE value)
|
59
|
+
{
|
60
|
+
int i = NUM2INT(index);
|
61
|
+
if (i < 0 || i > 3)
|
62
|
+
rb_raise(rb_eArgError, "index out of range (given %d, expect 0..3)", i);
|
63
|
+
|
64
|
+
int *vec = DATA_PTR(self);
|
65
|
+
vec[i] = NUM2INT(value);
|
66
|
+
return value;
|
67
|
+
}
|
68
|
+
|
69
|
+
static VALUE RGSS_Rect_SetX(VALUE self, VALUE value)
|
70
|
+
{
|
71
|
+
RGSS_ASSERT_UNFROZEN(self);
|
72
|
+
RGSS_Rect *rect = DATA_PTR(self);
|
73
|
+
rect->x = NUM2INT(value);
|
74
|
+
return value;
|
75
|
+
}
|
76
|
+
|
77
|
+
static VALUE RGSS_Rect_SetY(VALUE self, VALUE value)
|
78
|
+
{
|
79
|
+
RGSS_ASSERT_UNFROZEN(self);
|
80
|
+
RGSS_Rect *rect = DATA_PTR(self);
|
81
|
+
rect->y = NUM2INT(value);
|
82
|
+
return value;
|
83
|
+
}
|
84
|
+
|
85
|
+
static VALUE RGSS_Rect_SetWidth(VALUE self, VALUE value)
|
86
|
+
{
|
87
|
+
RGSS_ASSERT_UNFROZEN(self);
|
88
|
+
RGSS_Rect *rect = DATA_PTR(self);
|
89
|
+
rect->width = NUM2INT(value);
|
90
|
+
return value;
|
91
|
+
}
|
92
|
+
|
93
|
+
static VALUE RGSS_Rect_SetHeight(VALUE self, VALUE value)
|
94
|
+
{
|
95
|
+
RGSS_ASSERT_UNFROZEN(self);
|
96
|
+
RGSS_Rect *rect = DATA_PTR(self);
|
97
|
+
rect->y = NUM2INT(value);
|
98
|
+
return value;
|
99
|
+
}
|
100
|
+
|
101
|
+
static VALUE RGSS_Rect_SetLocation(VALUE self, VALUE value)
|
102
|
+
{
|
103
|
+
RGSS_ASSERT_UNFROZEN(self);
|
104
|
+
RGSS_Rect *rect = DATA_PTR(self);
|
105
|
+
RGSS_Point *ivec = DATA_PTR(value);
|
106
|
+
memcpy(&rect->location, ivec, sizeof(RGSS_Point));
|
107
|
+
return value;
|
108
|
+
}
|
109
|
+
|
110
|
+
static VALUE RGSS_Rect_SetSize(VALUE self, VALUE value)
|
111
|
+
{
|
112
|
+
RGSS_ASSERT_UNFROZEN(self);
|
113
|
+
RGSS_Rect *rect = DATA_PTR(self);
|
114
|
+
RGSS_Size *ivec = DATA_PTR(value);
|
115
|
+
memcpy(&rect->size, ivec, sizeof(RGSS_Size));
|
116
|
+
return value;
|
117
|
+
}
|
118
|
+
|
119
|
+
static VALUE RGSS_Rect_Set(VALUE self, VALUE x, VALUE y, VALUE width, VALUE height)
|
120
|
+
{
|
121
|
+
RGSS_ASSERT_UNFROZEN(self);
|
122
|
+
RGSS_Rect *rect = DATA_PTR(self);
|
123
|
+
|
124
|
+
rect->x = NUM2INT(x);
|
125
|
+
rect->y = NUM2INT(y);
|
126
|
+
rect->width = NUM2INT(width);
|
127
|
+
rect->height = NUM2INT(height);
|
128
|
+
|
129
|
+
return self;
|
130
|
+
}
|
131
|
+
|
132
|
+
static VALUE RGSS_Rect_Equal(VALUE self, VALUE other)
|
133
|
+
{
|
134
|
+
if (CLASS_OF(self) != CLASS_OF(other))
|
135
|
+
return Qfalse;
|
136
|
+
|
137
|
+
RGSS_Rect *r1 = DATA_PTR(self), *r2 = DATA_PTR(other);
|
138
|
+
return RB_BOOL(r1->x == r2->x && r1->y == r2->y && r1->width == r2->width && r1->height == r2->height);
|
139
|
+
}
|
140
|
+
|
141
|
+
static VALUE RGSS_Rect_Dupe(VALUE self)
|
142
|
+
{
|
143
|
+
RGSS_Rect *src = DATA_PTR(self), *dst = ALLOC(RGSS_Rect);
|
144
|
+
memcpy(dst, src, sizeof(RGSS_Rect));
|
145
|
+
return Data_Wrap_Struct(CLASS_OF(self), NULL, RUBY_DEFAULT_FREE, dst);
|
146
|
+
}
|
147
|
+
|
148
|
+
static VALUE RGSS_Rect_Clone(VALUE self)
|
149
|
+
{
|
150
|
+
RGSS_Rect *src = DATA_PTR(self), *dst = ALLOC(RGSS_Rect);
|
151
|
+
memcpy(dst, src, sizeof(RGSS_Rect));
|
152
|
+
|
153
|
+
VALUE value = Data_Wrap_Struct(CLASS_OF(self), NULL, RUBY_DEFAULT_FREE, dst);
|
154
|
+
if (rb_obj_frozen_p(self))
|
155
|
+
rb_obj_freeze(value);
|
156
|
+
|
157
|
+
return value;
|
158
|
+
}
|
159
|
+
|
160
|
+
static VALUE RGSS_Rect_IsEmpty(VALUE self)
|
161
|
+
{
|
162
|
+
RGSS_Rect *rect = DATA_PTR(self);
|
163
|
+
return RB_BOOL(rect->x == 0 && rect->y == 0 && rect->width == 0 && rect->height == 0);
|
164
|
+
}
|
165
|
+
|
166
|
+
static VALUE RGSS_Rect_FromLTRB(VALUE klass, VALUE left, VALUE top, VALUE right, VALUE bottom)
|
167
|
+
{
|
168
|
+
RGSS_Rect *rect = ALLOC(RGSS_Rect);
|
169
|
+
|
170
|
+
int x, y, width, height;
|
171
|
+
rect->x = NUM2INT(left);
|
172
|
+
rect->y = NUM2INT(top);
|
173
|
+
rect->width = NUM2INT(right) - rect->x;
|
174
|
+
rect->height = NUM2INT(bottom) - rect->y;
|
175
|
+
|
176
|
+
return Data_Wrap_Struct(klass, NULL, RUBY_DEFAULT_FREE, rect);
|
177
|
+
}
|
178
|
+
|
179
|
+
static VALUE RGSS_Rect_GetRight(VALUE self)
|
180
|
+
{
|
181
|
+
RGSS_Rect *rect = ALLOC(RGSS_Rect);
|
182
|
+
return INT2NUM(rect->x + rect->width);
|
183
|
+
}
|
184
|
+
|
185
|
+
static VALUE RGSS_Rect_GetBottom(VALUE self)
|
186
|
+
{
|
187
|
+
RGSS_Rect *rect = ALLOC(RGSS_Rect);
|
188
|
+
return INT2NUM(rect->y + rect->height);
|
189
|
+
}
|
190
|
+
|
191
|
+
static VALUE RGSS_Rect_Contains(int argc, VALUE *argv, VALUE self)
|
192
|
+
{
|
193
|
+
VALUE arg1, arg2;
|
194
|
+
rb_scan_args(argc, argv, "11", &arg1, &arg2);
|
195
|
+
|
196
|
+
RGSS_Rect *rect = ALLOC(RGSS_Rect);
|
197
|
+
|
198
|
+
if (argc == 2)
|
199
|
+
{
|
200
|
+
int x = NUM2INT(arg1);
|
201
|
+
int y = NUM2INT(arg2);
|
202
|
+
return RB_BOOL(rect->x <= x && x < rect->x + rect->width && rect->y <= y && y < rect->y + rect->height);
|
203
|
+
}
|
204
|
+
|
205
|
+
if (rb_obj_is_kind_of(arg1, rb_cPoint))
|
206
|
+
{
|
207
|
+
RGSS_Point *pnt = DATA_PTR(arg1);
|
208
|
+
return RB_BOOL(rect->x <= pnt->x && pnt->x < rect->x + rect->width && rect->y <= pnt->y &&
|
209
|
+
pnt->y < rect->y + rect->height);
|
210
|
+
}
|
211
|
+
|
212
|
+
RGSS_Rect *other = DATA_PTR(arg1);
|
213
|
+
return RB_BOOL((rect->x <= other->x) && ((other->x + other->width) <= (rect->x + rect->width)) &&
|
214
|
+
(rect->y <= other->y) && ((other->y + other->height) <= (rect->y + rect->height)));
|
215
|
+
}
|
216
|
+
|
217
|
+
static VALUE RGSS_Rect_InflateBang(int argc, VALUE *argv, VALUE self)
|
218
|
+
{
|
219
|
+
VALUE a1, a2;
|
220
|
+
rb_scan_args(argc, argv, "11", &a1, &a2);
|
221
|
+
|
222
|
+
RGSS_ASSERT_UNFROZEN(self);
|
223
|
+
RGSS_Rect *rect = DATA_PTR(self);
|
224
|
+
|
225
|
+
int x, y;
|
226
|
+
if (argc == 1)
|
227
|
+
{
|
228
|
+
int *point = DATA_PTR(a1);
|
229
|
+
x = point[0];
|
230
|
+
y = point[1];
|
231
|
+
}
|
232
|
+
else
|
233
|
+
{
|
234
|
+
x = NUM2INT(a1);
|
235
|
+
y = NUM2INT(a2);
|
236
|
+
}
|
237
|
+
|
238
|
+
rect->x -= x;
|
239
|
+
rect->y -= y;
|
240
|
+
rect->width += (2 * x);
|
241
|
+
rect->height += (2 * y);
|
242
|
+
|
243
|
+
return self;
|
244
|
+
}
|
245
|
+
|
246
|
+
static VALUE RGSS_Rect_Inflate(int argc, VALUE *argv, VALUE self)
|
247
|
+
{
|
248
|
+
return RGSS_Rect_InflateBang(argc, argv, RGSS_Rect_Dupe(self));
|
249
|
+
}
|
250
|
+
|
251
|
+
static VALUE RGSS_Rect_IntersectBang(VALUE self, VALUE other)
|
252
|
+
{
|
253
|
+
RGSS_ASSERT_UNFROZEN(self);
|
254
|
+
RGSS_Rect *a = DATA_PTR(self), *b = DATA_PTR(other);
|
255
|
+
|
256
|
+
int x1 = RGSS_MAX(a->x, b->x);
|
257
|
+
int x2 = RGSS_MIN(a->x + a->width, b->x + b->width);
|
258
|
+
int y1 = RGSS_MAX(a->y, b->y);
|
259
|
+
int y2 = RGSS_MIN(a->y + a->height, b->y + b->height);
|
260
|
+
|
261
|
+
if (x2 >= x1 && y2 >= y1)
|
262
|
+
{
|
263
|
+
a->x = x1;
|
264
|
+
a->y = y1;
|
265
|
+
a->width = x2 - x1;
|
266
|
+
a->height = y2 - y1;
|
267
|
+
}
|
268
|
+
else
|
269
|
+
{
|
270
|
+
memset(a, 0, sizeof(RGSS_Rect));
|
271
|
+
}
|
272
|
+
|
273
|
+
return self;
|
274
|
+
}
|
275
|
+
|
276
|
+
static VALUE RGSS_Rect_Intersect(VALUE self, VALUE other)
|
277
|
+
{
|
278
|
+
return RGSS_Rect_Intersect(RGSS_Rect_Dupe(self), other);
|
279
|
+
}
|
280
|
+
|
281
|
+
static VALUE RGSS_Rect_IntersectWith(VALUE self, VALUE other)
|
282
|
+
{
|
283
|
+
RGSS_Rect *a = DATA_PTR(self), *b = DATA_PTR(other);
|
284
|
+
return RB_BOOL((b->x < a->x + a->width) && (a->x < (b->x + b->width)) && (b->y < a->y + a->height) &&
|
285
|
+
(a->y < b->y + b->height));
|
286
|
+
}
|
287
|
+
|
288
|
+
static VALUE RGSS_Rect_UnionBang(VALUE self, VALUE other)
|
289
|
+
{
|
290
|
+
RGSS_ASSERT_UNFROZEN(self);
|
291
|
+
RGSS_Rect *a = DATA_PTR(self), *b = DATA_PTR(other);
|
292
|
+
|
293
|
+
int x1 = RGSS_MIN(a->x, b->x);
|
294
|
+
int y1 = RGSS_MIN(a->y, b->y);
|
295
|
+
int x2 = RGSS_MAX(a->x + a->width, b->x + b->width);
|
296
|
+
int y2 = RGSS_MAX(a->y + a->height, b->y + b->height);
|
297
|
+
|
298
|
+
a->x = x1;
|
299
|
+
a->y = y1;
|
300
|
+
a->width = x2 - x1;
|
301
|
+
a->height = y2 - y1;
|
302
|
+
|
303
|
+
return self;
|
304
|
+
}
|
305
|
+
|
306
|
+
static VALUE RGSS_Rect_Union(VALUE self, VALUE other)
|
307
|
+
{
|
308
|
+
return RGSS_Rect_UnionBang(RGSS_Rect_Dupe(self), other);
|
309
|
+
}
|
310
|
+
|
311
|
+
static VALUE RGSS_Rect_OffsetBang(int argc, VALUE *argv, VALUE self)
|
312
|
+
{
|
313
|
+
RGSS_ASSERT_UNFROZEN(self);
|
314
|
+
VALUE a1, a2;
|
315
|
+
rb_scan_args(argc, argv, "11", &a1, &a2);
|
316
|
+
|
317
|
+
RGSS_Rect *rect = DATA_PTR(self);
|
318
|
+
int x, y;
|
319
|
+
|
320
|
+
if (argc == 1)
|
321
|
+
{
|
322
|
+
int *v = DATA_PTR(a1);
|
323
|
+
x = v[0];
|
324
|
+
y = v[1];
|
325
|
+
}
|
326
|
+
else
|
327
|
+
{
|
328
|
+
x = NUM2INT(a1);
|
329
|
+
y = NUM2INT(a2);
|
330
|
+
}
|
331
|
+
|
332
|
+
rect->x += x;
|
333
|
+
rect->y += y;
|
334
|
+
return self;
|
335
|
+
}
|
336
|
+
|
337
|
+
static VALUE RGSS_Rect_Offset(int argc, VALUE *argv, VALUE self)
|
338
|
+
{
|
339
|
+
return RGSS_Rect_OffsetBang(argc, argv, RGSS_Rect_Dupe(self));
|
340
|
+
}
|
341
|
+
|
342
|
+
static VALUE RGSS_Rect_Inspect(VALUE self)
|
343
|
+
{
|
344
|
+
RGSS_Rect *rect = DATA_PTR(self);
|
345
|
+
return rb_sprintf("[%d, %d, %d, %d]", rect->x, rect->y, rect->width, rect->height);
|
346
|
+
}
|
347
|
+
|
348
|
+
static VALUE RGSS_Rect_ToArray(VALUE self)
|
349
|
+
{
|
350
|
+
int *rect = DATA_PTR(self);
|
351
|
+
VALUE ary = rb_ary_new_capa(4);
|
352
|
+
|
353
|
+
for (int i = 0; i < 4; i++)
|
354
|
+
rb_ary_store(ary, i, INT2NUM(rect[i]));
|
355
|
+
return ary;
|
356
|
+
}
|
357
|
+
|
358
|
+
static VALUE RGSS_Rect_ToHash(VALUE self)
|
359
|
+
{
|
360
|
+
RGSS_Rect *rect = DATA_PTR(self);
|
361
|
+
VALUE hash = rb_hash_new();
|
362
|
+
|
363
|
+
rb_hash_aset(hash, STR2SYM("x"), INT2NUM(rect->x));
|
364
|
+
rb_hash_aset(hash, STR2SYM("y"), INT2NUM(rect->y));
|
365
|
+
rb_hash_aset(hash, STR2SYM("width"), INT2NUM(rect->width));
|
366
|
+
rb_hash_aset(hash, STR2SYM("height"), INT2NUM(rect->height));
|
367
|
+
|
368
|
+
return hash;
|
369
|
+
}
|
370
|
+
|
371
|
+
static VALUE RGSS_Rect_Initialize(int argc, VALUE *argv, VALUE self)
|
372
|
+
{
|
373
|
+
VALUE a1, a2, a3, a4;
|
374
|
+
rb_scan_args(argc, argv, "04", &a1, &a2, &a3, &a4);
|
375
|
+
|
376
|
+
RGSS_Rect *rect = DATA_PTR(self);
|
377
|
+
|
378
|
+
switch (argc)
|
379
|
+
{
|
380
|
+
case 0: break;
|
381
|
+
case 2:
|
382
|
+
{
|
383
|
+
memcpy(&rect->location, DATA_PTR(a1), sizeof(RGSS_Point));
|
384
|
+
memcpy(&rect->size, DATA_PTR(a2), sizeof(RGSS_Size));
|
385
|
+
break;
|
386
|
+
}
|
387
|
+
case 4:
|
388
|
+
{
|
389
|
+
rect->x = NUM2INT(a1);
|
390
|
+
rect->y = NUM2INT(a2);
|
391
|
+
rect->width = NUM2INT(a3);
|
392
|
+
rect->height = NUM2INT(a4);
|
393
|
+
break;
|
394
|
+
}
|
395
|
+
default: rb_raise(rb_eArgError, "wrong number of arguments (given %d, expected 0, 2, 4)", argc);
|
396
|
+
}
|
397
|
+
|
398
|
+
return Qnil;
|
399
|
+
}
|
400
|
+
|
401
|
+
void RGSS_Init_Rect(VALUE parent)
|
402
|
+
{
|
403
|
+
rb_cRect = rb_define_class_under(parent, "Rect", rb_cObject);
|
404
|
+
rb_define_alloc_func(rb_cRect, RGSS_Rect_Alloc);
|
405
|
+
rb_define_methodm1(rb_cRect, "initialize", RGSS_Rect_Initialize, -1);
|
406
|
+
|
407
|
+
rb_define_method0(rb_cRect, "x", RGSS_Rect_GetX, 0);
|
408
|
+
rb_define_method0(rb_cRect, "y", RGSS_Rect_GetY, 0);
|
409
|
+
rb_define_method0(rb_cRect, "width", RGSS_Rect_GetWidth, 0);
|
410
|
+
rb_define_method0(rb_cRect, "height", RGSS_Rect_GetHeight, 0);
|
411
|
+
rb_define_method0(rb_cRect, "location", RGSS_Rect_GetLocation, 0);
|
412
|
+
rb_define_method0(rb_cRect, "size", RGSS_Rect_GetSize, 0);
|
413
|
+
rb_define_method1(rb_cRect, "x=", RGSS_Rect_SetX, 0);
|
414
|
+
rb_define_method1(rb_cRect, "y=", RGSS_Rect_SetY, 0);
|
415
|
+
rb_define_method1(rb_cRect, "width=", RGSS_Rect_SetWidth, 0);
|
416
|
+
rb_define_method1(rb_cRect, "height=", RGSS_Rect_SetHeight, 0);
|
417
|
+
rb_define_method1(rb_cRect, "location=", RGSS_Rect_SetLocation, 0);
|
418
|
+
rb_define_method1(rb_cRect, "size=", RGSS_Rect_SetSize, 0);
|
419
|
+
rb_define_method1(rb_cRect, "[]", RGSS_Rect_GetIndex, 1);
|
420
|
+
rb_define_method2(rb_cRect, "[]=", RGSS_Rect_SetIndex, 2);
|
421
|
+
rb_define_method4(rb_cRect, "set", RGSS_Rect_Set, 4);
|
422
|
+
rb_define_method1(rb_cRect, "==", RGSS_Rect_Equal, 1);
|
423
|
+
rb_define_method1(rb_cRect, "eql?", RGSS_Rect_Equal, 1);
|
424
|
+
rb_define_method0(rb_cRect, "dup", RGSS_Rect_Dupe, 0);
|
425
|
+
rb_define_method0(rb_cRect, "clone", RGSS_Rect_Clone, 0);
|
426
|
+
rb_define_method0(rb_cRect, "empty?", RGSS_Rect_IsEmpty, 0);
|
427
|
+
rb_define_method0(rb_cRect, "left", RGSS_Rect_GetX, 0);
|
428
|
+
rb_define_method0(rb_cRect, "top", RGSS_Rect_GetY, 0);
|
429
|
+
rb_define_method0(rb_cRect, "right", RGSS_Rect_GetRight, 0);
|
430
|
+
rb_define_method0(rb_cRect, "bottom", RGSS_Rect_GetBottom, 0);
|
431
|
+
rb_define_methodm1(rb_cRect, "contains?", RGSS_Rect_Contains, -1);
|
432
|
+
rb_define_methodm1(rb_cRect, "inflate!", RGSS_Rect_InflateBang, -1);
|
433
|
+
rb_define_methodm1(rb_cRect, "inflate", RGSS_Rect_Inflate, -1);
|
434
|
+
rb_define_method1(rb_cRect, "intersect!", RGSS_Rect_IntersectBang, 1);
|
435
|
+
rb_define_method1(rb_cRect, "intersect", RGSS_Rect_Intersect, 1);
|
436
|
+
rb_define_method1(rb_cRect, "intersect?", RGSS_Rect_IntersectWith, 1);
|
437
|
+
rb_define_methodm1(rb_cRect, "offset!", RGSS_Rect_OffsetBang, -1);
|
438
|
+
rb_define_methodm1(rb_cRect, "offset", RGSS_Rect_Offset, -1);
|
439
|
+
rb_define_method0(rb_cRect, "inspect", RGSS_Rect_Inspect, 0);
|
440
|
+
rb_define_method0(rb_cRect, "to_a", RGSS_Rect_ToArray, 0);
|
441
|
+
rb_define_method0(rb_cRect, "to_h", RGSS_Rect_ToHash, 0);
|
442
|
+
rb_define_methodm1(rb_cRect, "_dump", RGSS_Rect_Dump, -1);
|
443
|
+
|
444
|
+
rb_define_singleton_method0(rb_cRect, "empty", RGSS_Rect_Alloc, 0);
|
445
|
+
rb_define_singleton_method4(rb_cRect, "ltrb", RGSS_Rect_FromLTRB, 4);
|
446
|
+
rb_define_singleton_method1(rb_cRect, "_load", RGSS_Rect_Load, 1);
|
447
|
+
|
448
|
+
rb_define_alias(rb_cRect, "include?", "contains?");
|
449
|
+
}
|