rgss 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (64) hide show
  1. checksums.yaml +7 -0
  2. data/.clang-format +6 -0
  3. data/.gitignore +167 -0
  4. data/.yardopts +6 -0
  5. data/CHANGELOG.md +4 -0
  6. data/Gemfile +4 -0
  7. data/LICENSE.txt +21 -0
  8. data/Rakefile +9 -0
  9. data/ext/rgss/cglm-v0.7.9.tar.gz +0 -0
  10. data/ext/rgss/color.c +599 -0
  11. data/ext/rgss/entity.c +373 -0
  12. data/ext/rgss/extconf.rb +53 -0
  13. data/ext/rgss/font.c +135 -0
  14. data/ext/rgss/game.c +469 -0
  15. data/ext/rgss/game.h +99 -0
  16. data/ext/rgss/gl.c +3217 -0
  17. data/ext/rgss/glad.c +1140 -0
  18. data/ext/rgss/glad.h +2129 -0
  19. data/ext/rgss/glfw.c +1453 -0
  20. data/ext/rgss/graphics.c +324 -0
  21. data/ext/rgss/image.c +274 -0
  22. data/ext/rgss/input.c +745 -0
  23. data/ext/rgss/khrplatform.h +290 -0
  24. data/ext/rgss/mat4.c +279 -0
  25. data/ext/rgss/pax_global_header +1 -0
  26. data/ext/rgss/point.c +253 -0
  27. data/ext/rgss/rect.c +449 -0
  28. data/ext/rgss/rgss.c +56 -0
  29. data/ext/rgss/rgss.h +241 -0
  30. data/ext/rgss/stb_image.h +7762 -0
  31. data/ext/rgss/stb_image_write.h +1690 -0
  32. data/ext/rgss/stb_rect_pack.h +628 -0
  33. data/ext/rgss/stb_truetype.h +5011 -0
  34. data/ext/rgss/utf8.h +1652 -0
  35. data/ext/rgss/uthash.h +1133 -0
  36. data/ext/rgss/vec.c +114 -0
  37. data/ext/rgss/vec.h +192 -0
  38. data/ext/rgss/vec2.c +489 -0
  39. data/ext/rgss/vec3.c +751 -0
  40. data/ext/rgss/vec4.c +681 -0
  41. data/lib/rgss.rb +140 -0
  42. data/lib/rgss/batch.rb +57 -0
  43. data/lib/rgss/blend.rb +47 -0
  44. data/lib/rgss/game_object.rb +28 -0
  45. data/lib/rgss/plane.rb +95 -0
  46. data/lib/rgss/renderable.rb +158 -0
  47. data/lib/rgss/rgss.so +0 -0
  48. data/lib/rgss/shader.rb +94 -0
  49. data/lib/rgss/shaders/sprite-frag.glsl +40 -0
  50. data/lib/rgss/shaders/sprite-vert.glsl +17 -0
  51. data/lib/rgss/sprite.rb +139 -0
  52. data/lib/rgss/stubs/color.rb +318 -0
  53. data/lib/rgss/stubs/gl.rb +1999 -0
  54. data/lib/rgss/stubs/glfw.rb +626 -0
  55. data/lib/rgss/stubs/rect.rb +324 -0
  56. data/lib/rgss/stubs/rpg.rb +267 -0
  57. data/lib/rgss/stubs/tone.rb +65 -0
  58. data/lib/rgss/texture.rb +132 -0
  59. data/lib/rgss/tilemap.rb +116 -0
  60. data/lib/rgss/version.rb +3 -0
  61. data/lib/rgss/viewport.rb +67 -0
  62. data/rgss.gemspec +44 -0
  63. data/test.png +0 -0
  64. metadata +178 -0
@@ -0,0 +1,114 @@
1
+ /**
2
+ * Copyright (c) 2014 rxi
3
+ *
4
+ * This library is free software; you can redistribute it and/or modify it
5
+ * under the terms of the MIT license. See LICENSE for details.
6
+ */
7
+
8
+ #include "vec.h"
9
+
10
+
11
+ int vec_expand_(char **data, int *length, int *capacity, int memsz) {
12
+ if (*length + 1 > *capacity) {
13
+ void *ptr;
14
+ int n = (*capacity == 0) ? 1 : *capacity << 1;
15
+ ptr = VEC_REALLOC(*data, n * memsz);
16
+ if (ptr == NULL) return -1;
17
+ *data = ptr;
18
+ *capacity = n;
19
+ }
20
+ return 0;
21
+ }
22
+
23
+
24
+ int vec_reserve_(char **data, int *length, int *capacity, int memsz, int n) {
25
+ (void) length;
26
+ if (n > *capacity) {
27
+ void *ptr = VEC_REALLOC(*data, n * memsz);
28
+ if (ptr == NULL) return -1;
29
+ *data = ptr;
30
+ *capacity = n;
31
+ }
32
+ return 0;
33
+ }
34
+
35
+
36
+ int vec_reserve_po2_(
37
+ char **data, int *length, int *capacity, int memsz, int n
38
+ ) {
39
+ int n2 = 1;
40
+ if (n == 0) return 0;
41
+ while (n2 < n) n2 <<= 1;
42
+ return vec_reserve_(data, length, capacity, memsz, n2);
43
+ }
44
+
45
+
46
+ int vec_compact_(char **data, int *length, int *capacity, int memsz) {
47
+ if (*length == 0) {
48
+ VEC_FREE(*data);
49
+ *data = NULL;
50
+ *capacity = 0;
51
+ return 0;
52
+ } else {
53
+ void *ptr;
54
+ int n = *length;
55
+ ptr = VEC_REALLOC(*data, n * memsz);
56
+ if (ptr == NULL) return -1;
57
+ *capacity = n;
58
+ *data = ptr;
59
+ }
60
+ return 0;
61
+ }
62
+
63
+
64
+ int vec_insert_(char **data, int *length, int *capacity, int memsz,
65
+ int idx
66
+ ) {
67
+ int err = vec_expand_(data, length, capacity, memsz);
68
+ if (err) return err;
69
+ memmove(*data + (idx + 1) * memsz,
70
+ *data + idx * memsz,
71
+ (*length - idx) * memsz);
72
+ return 0;
73
+ }
74
+
75
+
76
+ void vec_splice_(char **data, int *length, int *capacity, int memsz,
77
+ int start, int count
78
+ ) {
79
+ (void) capacity;
80
+ memmove(*data + start * memsz,
81
+ *data + (start + count) * memsz,
82
+ (*length - start - count) * memsz);
83
+ }
84
+
85
+
86
+ void vec_swapsplice_(char **data, int *length, int *capacity, int memsz,
87
+ int start, int count
88
+ ) {
89
+ (void) capacity;
90
+ memmove(*data + start * memsz,
91
+ *data + (*length - count) * memsz,
92
+ count * memsz);
93
+ }
94
+
95
+
96
+ void vec_swap_(char **data, int *length, int *capacity, int memsz,
97
+ int idx1, int idx2
98
+ ) {
99
+ unsigned char *a, *b, tmp;
100
+ int count;
101
+ (void) length;
102
+ (void) capacity;
103
+ if (idx1 == idx2) return;
104
+ a = (unsigned char*) *data + idx1 * memsz;
105
+ b = (unsigned char*) *data + idx2 * memsz;
106
+ count = memsz;
107
+ while (count--) {
108
+ tmp = *a;
109
+ *a = *b;
110
+ *b = tmp;
111
+ a++, b++;
112
+ }
113
+ }
114
+
@@ -0,0 +1,192 @@
1
+ /**
2
+ * Copyright (c) 2014 rxi
3
+ *
4
+ * This library is free software; you can redistribute it and/or modify it
5
+ * under the terms of the MIT license. See LICENSE for details.
6
+ */
7
+
8
+ #ifndef VEC_H
9
+ #define VEC_H
10
+
11
+ #include <stdlib.h>
12
+ #include <string.h>
13
+
14
+ #define VEC_VERSION "0.2.1"
15
+
16
+
17
+ #define vec_unpack_(v)\
18
+ (char**)&(v)->data, &(v)->length, &(v)->capacity, sizeof(*(v)->data)
19
+
20
+
21
+ #define vec_t(T)\
22
+ struct { T *data; int length, capacity; }
23
+
24
+
25
+ #define vec_init(v)\
26
+ memset((v), 0, sizeof(*(v)))
27
+
28
+
29
+ #define vec_deinit(v)\
30
+ ( VEC_FREE((v)->data),\
31
+ vec_init(v) )
32
+
33
+
34
+ #define vec_push(v, val)\
35
+ ( vec_expand_(vec_unpack_(v)) ? -1 :\
36
+ ((v)->data[(v)->length++] = (val), 0), 0 )
37
+
38
+
39
+ #define vec_pop(v)\
40
+ (v)->data[--(v)->length]
41
+
42
+
43
+ #define vec_splice(v, start, count)\
44
+ ( vec_splice_(vec_unpack_(v), start, count),\
45
+ (v)->length -= (count) )
46
+
47
+
48
+ #define vec_swapsplice(v, start, count)\
49
+ ( vec_swapsplice_(vec_unpack_(v), start, count),\
50
+ (v)->length -= (count) )
51
+
52
+
53
+ #define vec_insert(v, idx, val)\
54
+ ( vec_insert_(vec_unpack_(v), idx) ? -1 :\
55
+ ((v)->data[idx] = (val), 0), (v)->length++, 0 )
56
+
57
+
58
+ #define vec_sort(v, fn)\
59
+ qsort((v)->data, (v)->length, sizeof(*(v)->data), fn)
60
+
61
+
62
+ #define vec_swap(v, idx1, idx2)\
63
+ vec_swap_(vec_unpack_(v), idx1, idx2)
64
+
65
+
66
+ #define vec_truncate(v, len)\
67
+ ((v)->length = (len) < (v)->length ? (len) : (v)->length)
68
+
69
+
70
+ #define vec_clear(v)\
71
+ ((v)->length = 0)
72
+
73
+
74
+ #define vec_first(v)\
75
+ (v)->data[0]
76
+
77
+
78
+ #define vec_last(v)\
79
+ (v)->data[(v)->length - 1]
80
+
81
+
82
+ #define vec_reserve(v, n)\
83
+ vec_reserve_(vec_unpack_(v), n)
84
+
85
+
86
+ #define vec_compact(v)\
87
+ vec_compact_(vec_unpack_(v))
88
+
89
+
90
+ #define vec_pusharr(v, arr, count)\
91
+ do {\
92
+ int i__, n__ = (count);\
93
+ if (vec_reserve_po2_(vec_unpack_(v), (v)->length + n__) != 0) break;\
94
+ for (i__ = 0; i__ < n__; i__++) {\
95
+ (v)->data[(v)->length++] = (arr)[i__];\
96
+ }\
97
+ } while (0)
98
+
99
+
100
+ #define vec_extend(v, v2)\
101
+ vec_pusharr((v), (v2)->data, (v2)->length)
102
+
103
+
104
+ #define vec_find(v, val, idx)\
105
+ do {\
106
+ for ((idx) = 0; (idx) < (v)->length; (idx)++) {\
107
+ if ((v)->data[(idx)] == (val)) break;\
108
+ }\
109
+ if ((idx) == (v)->length) (idx) = -1;\
110
+ } while (0)
111
+
112
+
113
+ #define vec_remove(v, val)\
114
+ do {\
115
+ int idx__;\
116
+ vec_find(v, val, idx__);\
117
+ if (idx__ != -1) vec_splice(v, idx__, 1);\
118
+ } while (0)
119
+
120
+
121
+ #define vec_reverse(v)\
122
+ do {\
123
+ int i__ = (v)->length / 2;\
124
+ while (i__--) {\
125
+ vec_swap((v), i__, (v)->length - (i__ + 1));\
126
+ }\
127
+ } while (0)
128
+
129
+
130
+ #define vec_foreach(v, var, iter)\
131
+ if ( (v)->length > 0 )\
132
+ for ( (iter) = 0;\
133
+ (iter) < (v)->length && (((var) = (v)->data[(iter)]), 1);\
134
+ ++(iter))
135
+
136
+
137
+ #define vec_foreach_rev(v, var, iter)\
138
+ if ( (v)->length > 0 )\
139
+ for ( (iter) = (v)->length - 1;\
140
+ (iter) >= 0 && (((var) = (v)->data[(iter)]), 1);\
141
+ --(iter))
142
+
143
+
144
+ #define vec_foreach_ptr(v, var, iter)\
145
+ if ( (v)->length > 0 )\
146
+ for ( (iter) = 0;\
147
+ (iter) < (v)->length && (((var) = &(v)->data[(iter)]), 1);\
148
+ ++(iter))
149
+
150
+
151
+ #define vec_foreach_ptr_rev(v, var, iter)\
152
+ if ( (v)->length > 0 )\
153
+ for ( (iter) = (v)->length - 1;\
154
+ (iter) >= 0 && (((var) = &(v)->data[(iter)]), 1);\
155
+ --(iter))
156
+
157
+
158
+
159
+ #if defined(VEC_FREE) && defined(VEC_REALLOC)
160
+ // Both defined, no error
161
+ #elif !defined(VEC_REALLOC) && !defined(VEC_FREE)
162
+ // Neither defined, use stdlib
163
+ #define VEC_FREE free
164
+ #define VEC_REALLOC realloc
165
+ #else
166
+ #error "Must define all or none of VEC_FREE and VEC_REALLOC."
167
+ #endif
168
+
169
+
170
+ int vec_expand_(char **data, int *length, int *capacity, int memsz);
171
+ int vec_reserve_(char **data, int *length, int *capacity, int memsz, int n);
172
+ int vec_reserve_po2_(char **data, int *length, int *capacity, int memsz,
173
+ int n);
174
+ int vec_compact_(char **data, int *length, int *capacity, int memsz);
175
+ int vec_insert_(char **data, int *length, int *capacity, int memsz,
176
+ int idx);
177
+ void vec_splice_(char **data, int *length, int *capacity, int memsz,
178
+ int start, int count);
179
+ void vec_swapsplice_(char **data, int *length, int *capacity, int memsz,
180
+ int start, int count);
181
+ void vec_swap_(char **data, int *length, int *capacity, int memsz,
182
+ int idx1, int idx2);
183
+
184
+
185
+ typedef vec_t(void*) vec_void_t;
186
+ typedef vec_t(char*) vec_str_t;
187
+ typedef vec_t(int) vec_int_t;
188
+ typedef vec_t(char) vec_char_t;
189
+ typedef vec_t(float) vec_float_t;
190
+ typedef vec_t(double) vec_double_t;
191
+
192
+ #endif
@@ -0,0 +1,489 @@
1
+ #include "game.h"
2
+
3
+ VALUE rb_cVec2;
4
+
5
+ CREATE_ALLOC_FUNC(vec2, RGSS_VEC2_ALIGN, RGSS_VEC2_SIZE)
6
+ VEC_ATTR_ACCESSOR(vec2, x, 0)
7
+ VEC_ATTR_ACCESSOR(vec2, y, 1)
8
+
9
+ static VALUE vec2_get(VALUE self, VALUE index)
10
+ {
11
+ int i = NUM2INT(index);
12
+ if (index < 0 || index > 1)
13
+ rb_raise(rb_eArgError, "index of of range (must be 0..1)");
14
+ return DBL2NUM(((float*) DATA_PTR(self))[i]);
15
+ }
16
+
17
+ static VALUE vec2_set(VALUE self, VALUE index, VALUE value)
18
+ {
19
+ int i = NUM2INT(index);
20
+ if (index < 0 || index > 1)
21
+ rb_raise(rb_eArgError, "index of of range (must be 0..1)");
22
+ ((float*) DATA_PTR(self))[i] = NUM2FLT(value);
23
+ return value;
24
+ }
25
+
26
+ static VALUE vec2_copy(VALUE self)
27
+ {
28
+ float *d = RGSS_VEC2_NEW;
29
+ glm_vec2_copy(DATA_PTR(self), d);
30
+ return VEC2_WRAP(d);
31
+ }
32
+
33
+ static VALUE vec2_zero(VALUE klass)
34
+ {
35
+ float *d = RGSS_VEC2_NEW;
36
+ glm_vec2_zero(d);
37
+ return VEC2_WRAP(d);
38
+ }
39
+
40
+ static VALUE vec2_one(VALUE klass)
41
+ {
42
+ float *d = RGSS_VEC2_NEW;
43
+ glm_vec2_one(d);
44
+ return VEC2_WRAP(d);
45
+ }
46
+
47
+ static VALUE vec2_dot(VALUE self, VALUE other)
48
+ {
49
+ return DBL2NUM(glm_vec2_dot(DATA_PTR(self), DATA_PTR(other)));
50
+ }
51
+
52
+ static VALUE vec2_cross(VALUE self, VALUE other)
53
+ {
54
+ return DBL2NUM(glm_vec2_cross(DATA_PTR(self), DATA_PTR(other)));
55
+ }
56
+
57
+ static VALUE vec2_length(VALUE self)
58
+ {
59
+ return DBL2NUM(glm_vec2_norm(DATA_PTR(self)));
60
+ }
61
+
62
+ static VALUE vec2_length_squared(VALUE self)
63
+ {
64
+ return DBL2NUM(glm_vec2_norm2(DATA_PTR(self)));
65
+ }
66
+
67
+ static VALUE vec2_add(VALUE self, VALUE other)
68
+ {
69
+ float *v = DATA_PTR(self);
70
+ float *d = RGSS_VEC2_NEW;
71
+
72
+ if (RB_TYPE_P(other, T_DATA))
73
+ {
74
+ glm_vec2_add(v, DATA_PTR(other), d);
75
+ }
76
+ else
77
+ {
78
+ glm_vec2_adds(v, NUM2FLT(other), d);
79
+ }
80
+
81
+ return VEC2_WRAP(d);
82
+ }
83
+
84
+ static VALUE vec2_sub(VALUE self, VALUE other)
85
+ {
86
+ float *v = DATA_PTR(self);
87
+ float *d = RGSS_VEC2_NEW;
88
+
89
+ if (RB_TYPE_P(other, T_DATA))
90
+ {
91
+ glm_vec2_sub(v, DATA_PTR(other), d);
92
+ }
93
+ else
94
+ {
95
+ glm_vec2_subs(v, NUM2FLT(other), d);
96
+ }
97
+
98
+ return VEC2_WRAP(d);
99
+ }
100
+
101
+ static VALUE vec2_mul(VALUE self, VALUE other)
102
+ {
103
+ float *v = DATA_PTR(self);
104
+ float *d = RGSS_VEC2_NEW;
105
+
106
+ if (RB_TYPE_P(other, T_DATA))
107
+ {
108
+ glm_vec2_mul(v, DATA_PTR(other), d);
109
+ }
110
+ else
111
+ {
112
+ glm_vec2_scale(v, NUM2FLT(other), d);
113
+ }
114
+
115
+ return VEC2_WRAP(d);
116
+ }
117
+
118
+ static VALUE vec2_div(VALUE self, VALUE other)
119
+ {
120
+ float *v = DATA_PTR(self);
121
+ float *d = RGSS_VEC2_NEW;
122
+
123
+ if (RB_TYPE_P(other, T_DATA))
124
+ {
125
+ glm_vec2_div(v, DATA_PTR(other), d);
126
+ }
127
+ else
128
+ {
129
+ glm_vec2_divs(v, NUM2FLT(other), d);
130
+ }
131
+
132
+ return VEC2_WRAP(d);
133
+ }
134
+
135
+ static VALUE vec2_norm_scale(VALUE self, VALUE scalar)
136
+ {
137
+ float *d = RGSS_VEC2_NEW;
138
+ glm_vec2_scale_as(DATA_PTR(self), NUM2FLT(scalar), d);
139
+ return VEC2_WRAP(d);
140
+ }
141
+
142
+ static VALUE vec2_add_add(VALUE self, VALUE other)
143
+ {
144
+ float *d = RGSS_VEC2_NEW;
145
+ glm_vec2_addadd(DATA_PTR(self), DATA_PTR(other), d);
146
+ return VEC2_WRAP(d);
147
+ }
148
+
149
+ static VALUE vec2_sub_add(VALUE self, VALUE other)
150
+ {
151
+ float *d = RGSS_VEC2_NEW;
152
+ glm_vec2_subadd(DATA_PTR(self), DATA_PTR(other), d);
153
+ return VEC2_WRAP(d);
154
+ }
155
+
156
+ static VALUE vec2_mul_add(VALUE self, VALUE other)
157
+ {
158
+ float *d = RGSS_VEC2_NEW;
159
+ float *v = DATA_PTR(self);
160
+
161
+ if (RB_TYPE_P(other, T_DATA))
162
+ {
163
+ glm_vec2_muladd(v, DATA_PTR(other), d);
164
+ }
165
+ else
166
+ {
167
+ glm_vec2_muladds(v, NUM2FLT(other), d);
168
+ }
169
+ return VEC2_WRAP(d);
170
+ }
171
+
172
+ static VALUE vec2_max_add(VALUE self, VALUE other)
173
+ {
174
+ float *d = RGSS_VEC2_NEW;
175
+ glm_vec2_maxadd(DATA_PTR(self), DATA_PTR(other), d);
176
+ return VEC2_WRAP(d);
177
+ }
178
+
179
+ static VALUE vec2_min_add(VALUE self, VALUE other)
180
+ {
181
+ float *d = RGSS_VEC2_NEW;
182
+ glm_vec2_minadd(DATA_PTR(self), DATA_PTR(other), d);
183
+ return VEC2_WRAP(d);
184
+ }
185
+
186
+ static VALUE vec2_negate_bang(VALUE self)
187
+ {
188
+ glm_vec2_negate(DATA_PTR(self));
189
+ return self;
190
+ }
191
+
192
+ static VALUE vec2_negate(VALUE self)
193
+ {
194
+ float *d = RGSS_VEC2_NEW;
195
+ glm_vec2_negate_to(DATA_PTR(self), d);
196
+ return VEC2_WRAP(d);
197
+ }
198
+
199
+ static VALUE vec2_normalize(VALUE self)
200
+ {
201
+ float *d = RGSS_VEC2_NEW;
202
+ glm_vec2_normalize_to(DATA_PTR(self), d);
203
+ return VEC2_WRAP(d);
204
+ }
205
+
206
+ static VALUE vec2_normalize_bang(VALUE self)
207
+ {
208
+ glm_vec2_normalize(DATA_PTR(self));
209
+ return self;
210
+ }
211
+
212
+ static VALUE vec2_rotate_bang(VALUE self, VALUE angle)
213
+ {
214
+ float *v = DATA_PTR(self);
215
+ vec2 temp;
216
+ glm_vec2_rotate(v, NUM2FLT(angle), v);
217
+ return self;
218
+ }
219
+
220
+ static VALUE vec2_rotate(VALUE self, VALUE angle)
221
+ {
222
+ float *d = RGSS_VEC2_NEW;
223
+ glm_vec2_rotate(DATA_PTR(self), NUM2FLT(angle), d);
224
+ return VEC2_WRAP(d);
225
+ }
226
+
227
+ static VALUE vec2_distance(VALUE self, VALUE other)
228
+ {
229
+ return DBL2NUM(glm_vec2_distance(DATA_PTR(self), DATA_PTR(other)));
230
+ }
231
+
232
+ static VALUE vec2_distance_squared(VALUE self, VALUE other)
233
+ {
234
+ return DBL2NUM(glm_vec2_distance2(DATA_PTR(self), DATA_PTR(other)));
235
+ }
236
+
237
+ static VALUE vec2_maxv(VALUE self, VALUE other)
238
+ {
239
+ float *d = RGSS_VEC2_NEW;
240
+ glm_vec2_maxv(DATA_PTR(self), DATA_PTR(other), d);
241
+ return VEC2_WRAP(d);
242
+ }
243
+
244
+ static VALUE vec2_minv(VALUE self, VALUE other)
245
+ {
246
+ float *d = RGSS_VEC2_NEW;
247
+ glm_vec2_minv(DATA_PTR(self), DATA_PTR(other), d);
248
+ return VEC2_WRAP(d);
249
+ }
250
+
251
+ static VALUE vec2_clamp_bang(VALUE self, VALUE min, VALUE max)
252
+ {
253
+ glm_vec2_clamp(DATA_PTR(self), NUM2FLT(min), NUM2FLT(max));
254
+ return self;
255
+ }
256
+
257
+ static VALUE vec2_clamp(VALUE self, VALUE min, VALUE max)
258
+ {
259
+ return vec2_clamp(vec2_copy(self), min, max);
260
+ }
261
+
262
+ static VALUE vec2_lerp(VALUE self, VALUE other, VALUE weight)
263
+ {
264
+ float *d = RGSS_VEC2_NEW;
265
+ glm_vec2_lerp(DATA_PTR(self), DATA_PTR(other), NUM2FLT(weight), d);
266
+ return VEC2_WRAP(d);
267
+ }
268
+
269
+ static VALUE vec2_lerp_bang(VALUE self, VALUE other, VALUE weight)
270
+ {
271
+ vec2 temp;
272
+ float *v = DATA_PTR(self);
273
+ glm_vec2_lerp(v, DATA_PTR(other), NUM2FLT(weight), temp);
274
+ glm_vec2_copy(temp, v);
275
+ return self;
276
+ }
277
+
278
+ static VALUE vec2_equal(int argc, VALUE *argv, VALUE self)
279
+ {
280
+ VALUE other, epsilon;
281
+ rb_scan_args(argc, argv, "11", &other, &epsilon);
282
+
283
+ if (CLASS_OF(self) != CLASS_OF(other))
284
+ return Qfalse;
285
+
286
+ float *v1 = DATA_PTR(self), *v2 = DATA_PTR(other);
287
+ bool result = RTEST(epsilon) ? glm_vec2_eqv_eps(v1, v2) : glm_vec2_eqv(v1, v2);
288
+
289
+ return RB_BOOL(result);
290
+ }
291
+
292
+ static VALUE vec2_all_p(int argc, VALUE *argv, VALUE self)
293
+ {
294
+ VALUE value, epsilon;
295
+ rb_scan_args(argc, argv, "11", &value, &epsilon);
296
+
297
+ float *v1 = DATA_PTR(self), v2 = NUM2FLT(value);
298
+ bool result = RTEST(epsilon) ? glm_vec2_eq_eps(v1, v2) : glm_vec2_eq(v1, v2);
299
+
300
+ return RB_BOOL(result);
301
+ }
302
+
303
+ static VALUE vec2_max_value(VALUE self)
304
+ {
305
+ return DBL2NUM(glm_vec2_max(DATA_PTR(self)));
306
+ }
307
+
308
+ static VALUE vec2_min_value(VALUE self)
309
+ {
310
+ return DBL2NUM(glm_vec2_min(DATA_PTR(self)));
311
+ }
312
+
313
+ static VALUE vec2_infinite_p(VALUE self)
314
+ {
315
+ return RB_BOOL(glm_vec2_isinf(DATA_PTR(self)));
316
+ }
317
+
318
+ static VALUE vec2_nan_p(VALUE self)
319
+ {
320
+ return RB_BOOL(glm_vec2_isnan(DATA_PTR(self)));
321
+ }
322
+
323
+ static VALUE vec2_sqrt(VALUE self)
324
+ {
325
+ float *d = RGSS_VEC2_NEW;
326
+ glm_vec2_sqrt(DATA_PTR(self), d);
327
+ return VEC2_WRAP(d);
328
+ }
329
+
330
+ static VALUE vec2_abs(VALUE self)
331
+ {
332
+ float *d = RGSS_VEC2_NEW;
333
+ float *v = DATA_PTR(self);
334
+ d[0] = fabsf(v[0]);
335
+ d[1] = fabsf(v[1]);
336
+ return VEC2_WRAP(d);
337
+ }
338
+
339
+ static VALUE vec2_sign(VALUE self)
340
+ {
341
+ float *d = RGSS_VEC2_NEW;
342
+ glm_vec2_sign(DATA_PTR(self), d);
343
+ return VEC2_WRAP(d);
344
+ }
345
+
346
+ static void vec2_create(int argc, VALUE *argv, vec2 v)
347
+ {
348
+ VALUE a1, a2;
349
+ rb_scan_args(argc, argv, "02", &a1, &a2);
350
+
351
+ switch (argc)
352
+ {
353
+ case 0:
354
+ {
355
+ glm_vec2_zero(v);
356
+ break;
357
+ }
358
+ case 1:
359
+ {
360
+ if (RB_TYPE_P(a1, T_DATA))
361
+ {
362
+ glm_vec2_copy(DATA_PTR(a1), v);
363
+ }
364
+ else
365
+ {
366
+ glm_vec2_fill(v, NUM2FLT(a1));
367
+ }
368
+ break;
369
+ }
370
+ case 2:
371
+ {
372
+ v[0] = NUM2FLT(a1);
373
+ v[1] = NUM2FLT(a2);
374
+ break;
375
+ }
376
+ }
377
+ }
378
+
379
+ static VALUE vec2_initialize(int argc, VALUE *argv, VALUE self)
380
+ {
381
+ if (CLASS_OF(self) != rb_cVec2)
382
+ rb_warn("inheriting from %s may result in undefined behavior", rb_class2name(rb_cVec3));
383
+
384
+ vec2_create(argc, argv, DATA_PTR(self));
385
+ return Qnil;
386
+ }
387
+
388
+ static VALUE vec2_kernel_create(int argc, VALUE *argv, VALUE module)
389
+ {
390
+ float *v = RGSS_VEC2_NEW;
391
+ vec2_create(argc, argv, v);
392
+ return VEC2_WRAP(v);
393
+ }
394
+
395
+ static VALUE vec2_unitx(VALUE klass)
396
+ {
397
+ return RGSS_Vec2_New(1.0f, 0.0f);
398
+ }
399
+
400
+ static VALUE vec2_unity(VALUE klass)
401
+ {
402
+ return RGSS_Vec2_New(0.0f, 1.0f);
403
+ }
404
+
405
+ static VALUE vec2_inspect(VALUE self)
406
+ {
407
+ float *v = DATA_PTR(self);
408
+ return rb_sprintf("<%f, %f>", v[0], v[1]);
409
+ }
410
+
411
+ void RGSS_Init_Vec2(VALUE parent)
412
+ {
413
+ rb_cVec2 = rb_define_class_under(parent, "Vec2", rb_cObject);
414
+ rb_define_alloc_func(rb_cVec2, vec2_alloc);
415
+ rb_define_methodm1(rb_cVec2, "initialize", vec2_initialize, -1);
416
+ rb_define_methodm1(rb_mKernel, "vec2", vec2_kernel_create, -1);
417
+
418
+ rb_define_const(rb_cVec2, "SIZE", SIZET2NUM(RGSS_VEC2_SIZE));
419
+ rb_define_const(rb_cVec2, "ALIGN", SIZET2NUM(RGSS_VEC2_ALIGN));
420
+
421
+ rb_define_method1(rb_cVec2, "[]", vec2_get, 1);
422
+ rb_define_method2(rb_cVec2, "[]=", vec2_set, 2);
423
+ rb_define_method0(rb_cVec2, "x", vec2_get_x, 0);
424
+ rb_define_method0(rb_cVec2, "y", vec2_get_y, 0);
425
+ rb_define_method1(rb_cVec2, "x=", vec2_set_x, 1);
426
+ rb_define_method1(rb_cVec2, "y=", vec2_set_y, 1);
427
+ rb_define_method0(rb_cVec2, "copy", vec2_copy, 0);
428
+ rb_define_method1(rb_cVec2, "dot", vec2_dot, 1);
429
+ rb_define_method1(rb_cVec2, "cross", vec2_cross, 1);
430
+ rb_define_method0(rb_cVec2, "length", vec2_length, 0);
431
+ rb_define_method0(rb_cVec2, "length_squared", vec2_length_squared, 0);
432
+ rb_define_method1(rb_cVec2, "add", vec2_add, 1);
433
+ rb_define_method1(rb_cVec2, "subtract", vec2_sub, 1);
434
+ rb_define_method1(rb_cVec2, "multiply", vec2_mul, 1);
435
+ rb_define_method1(rb_cVec2, "divide", vec2_div, 1);
436
+ rb_define_method1(rb_cVec2, "norm_scale", vec2_norm_scale, 1);
437
+ rb_define_method1(rb_cVec2, "add_add", vec2_add_add, 1);
438
+ rb_define_method1(rb_cVec2, "sub_add", vec2_sub_add, 1);
439
+ rb_define_method1(rb_cVec2, "mul_add", vec2_mul_add, 1);
440
+ rb_define_method1(rb_cVec2, "max_add", vec2_max_add, 1);
441
+ rb_define_method1(rb_cVec2, "min_add", vec2_min_add, 1);
442
+ rb_define_method0(rb_cVec2, "negate", vec2_negate, 0);
443
+ rb_define_method0(rb_cVec2, "negate!", vec2_negate_bang, 0);
444
+ rb_define_method0(rb_cVec2, "normalize", vec2_normalize, 0);
445
+ rb_define_method0(rb_cVec2, "normalize!", vec2_normalize_bang, 0);
446
+ rb_define_method1(rb_cVec2, "rotate", vec2_rotate, 1);
447
+ rb_define_method1(rb_cVec2, "rotate!", vec2_rotate_bang, 1);
448
+ rb_define_method1(rb_cVec2, "distance", vec2_distance, 1);
449
+ rb_define_method1(rb_cVec2, "distance_squared", vec2_distance_squared, 1);
450
+ rb_define_method1(rb_cVec2, "max", vec2_maxv, 1);
451
+ rb_define_method1(rb_cVec2, "min", vec2_minv, 1);
452
+ rb_define_method2(rb_cVec2, "clamp", vec2_clamp, 2);
453
+ rb_define_method2(rb_cVec2, "clamp!", vec2_clamp_bang, 2);
454
+ rb_define_method2(rb_cVec2, "lerp", vec2_lerp, 2);
455
+ rb_define_method2(rb_cVec2, "lerp!", vec2_lerp_bang, 2);
456
+ rb_define_method0(rb_cVec2, "infinite?", vec2_infinite_p, 0);
457
+ rb_define_method0(rb_cVec2, "nan?", vec2_nan_p, 0);
458
+ rb_define_method0(rb_cVec2, "sqrt", vec2_sqrt, 0);
459
+ rb_define_method0(rb_cVec2, "abs", vec2_abs, 0);
460
+ rb_define_method0(rb_cVec2, "sign", vec2_sign, 0);
461
+ rb_define_methodm1(rb_cVec2, "eql?", vec2_equal, -1);
462
+ rb_define_methodm1(rb_cVec2, "all?", vec2_all_p, -1);
463
+ rb_define_method0(rb_cVec2, "max_value", vec2_max_value, 0);
464
+ rb_define_method0(rb_cVec2, "min_value", vec2_min_value, 0);
465
+
466
+ rb_define_method0(rb_cVec2, "inspect", vec2_inspect, 0);
467
+ rb_define_method0(rb_cVec2, "to_s", vec2_inspect, 0);
468
+ rb_define_method0(rb_cVec2, "to_str", vec2_inspect, 0);
469
+
470
+ rb_define_alias(rb_cVec2, "dup", "copy");
471
+ rb_define_alias(rb_cVec2, "magnitude", "length");
472
+ rb_define_alias(rb_cVec2, "magnitude_squared", "length_squared");
473
+ rb_define_alias(rb_cVec2, "norm", "length");
474
+ rb_define_alias(rb_cVec2, "norm2", "length_squared");
475
+ rb_define_alias(rb_cVec2, "+", "add");
476
+ rb_define_alias(rb_cVec2, "-", "subtract");
477
+ rb_define_alias(rb_cVec2, "*", "multiply");
478
+ rb_define_alias(rb_cVec2, "/", "divide");
479
+ rb_define_alias(rb_cVec2, "-@", "negate");
480
+ rb_define_alias(rb_cVec2, "==", "eql?");
481
+ rb_define_alias(rb_cVec2, "scale", "multiply");
482
+ rb_define_alias(rb_cVec2, "mix", "lerp");
483
+ rb_define_alias(rb_cVec2, "mix!", "lerp!");
484
+
485
+ rb_define_singleton_method0(rb_cVec2, "zero", vec2_zero, 0);
486
+ rb_define_singleton_method0(rb_cVec2, "one", vec2_one, 0);
487
+ rb_define_singleton_method0(rb_cVec2, "unit_x", vec2_unitx, 0);
488
+ rb_define_singleton_method0(rb_cVec2, "unit_y", vec2_unity, 0);
489
+ }