ray 0.1.1 → 0.2.0
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.
- data/README.md +9 -6
- data/Rakefile +1 -5
- data/ext/audio.c +25 -19
- data/ext/audio_source.c +67 -39
- data/ext/color.c +19 -19
- data/ext/drawable.c +190 -31
- data/ext/extconf.rb +16 -14
- data/ext/gl.c +310 -30
- data/ext/gl_buffer.c +223 -2
- data/ext/gl_index_buffer.c +11 -0
- data/ext/gl_int_array.c +24 -22
- data/ext/gl_vertex.c +84 -49
- data/ext/image.c +115 -51
- data/ext/image_target.c +58 -10
- data/ext/input.c +73 -6
- data/ext/mo.c +583 -0
- data/ext/mo.h +189 -0
- data/ext/music.c +9 -8
- data/ext/pixel_bus.c +349 -0
- data/ext/polygon.c +68 -45
- data/ext/ray.c +1 -0
- data/ext/ray.h +19 -1
- data/ext/rect.c +9 -47
- data/ext/say.h +1 -2
- data/ext/say_all.h +6 -0
- data/ext/say_audio.h +3 -0
- data/ext/say_audio_context.c +1 -4
- data/ext/say_basic_type.c +24 -0
- data/ext/say_basic_type.h +4 -0
- data/ext/say_buffer.c +217 -88
- data/ext/say_buffer.h +20 -5
- data/ext/say_buffer_renderer.c +10 -7
- data/ext/say_buffer_renderer.h +1 -1
- data/ext/say_buffer_slice.c +70 -76
- data/ext/say_context.c +109 -22
- data/ext/say_context.h +14 -0
- data/ext/say_drawable.c +113 -25
- data/ext/say_drawable.h +23 -2
- data/ext/say_error.c +7 -2
- data/ext/say_font.c +30 -27
- data/ext/say_font.h +3 -6
- data/ext/say_get_proc.c +35 -0
- data/ext/say_image.c +102 -27
- data/ext/say_image.h +11 -4
- data/ext/say_image_target.c +88 -34
- data/ext/say_image_target.h +3 -2
- data/ext/say_index_buffer.c +31 -19
- data/ext/say_index_buffer.h +4 -2
- data/ext/say_index_buffer_slice.c +78 -70
- data/ext/say_music.c +4 -2
- data/ext/say_osx.h +3 -2
- data/ext/say_osx_context.h +37 -4
- data/ext/say_osx_window.h +32 -37
- data/ext/say_pixel_bus.c +163 -0
- data/ext/say_pixel_bus.h +44 -0
- data/ext/say_polygon.c +2 -2
- data/ext/say_shader.c +66 -62
- data/ext/say_shader.h +2 -0
- data/ext/say_sprite.c +1 -2
- data/ext/say_target.c +14 -23
- data/ext/say_target.h +3 -1
- data/ext/say_text.c +45 -7
- data/ext/say_text.h +12 -3
- data/ext/say_thread.c +13 -6
- data/ext/say_thread.h +1 -1
- data/ext/say_thread_variable.c +5 -5
- data/ext/say_vertex_type.c +79 -41
- data/ext/say_vertex_type.h +6 -2
- data/ext/say_view.c +10 -31
- data/ext/say_view.h +1 -5
- data/ext/say_win.h +2 -2
- data/ext/say_win_context.h +49 -11
- data/ext/say_win_window.h +30 -27
- data/ext/say_window.c +3 -3
- data/ext/say_x11.h +3 -1
- data/ext/say_x11_context.h +64 -10
- data/ext/say_x11_window.h +22 -17
- data/ext/shader.c +9 -0
- data/ext/sprite.c +7 -1
- data/ext/target.c +80 -28
- data/ext/text.c +43 -1
- data/ext/view.c +53 -1
- data/ext/window.c +4 -0
- data/lib/ray/animation_list.rb +17 -2
- data/lib/ray/audio_source.rb +11 -0
- data/lib/ray/color.rb +14 -0
- data/lib/ray/drawable.rb +23 -0
- data/lib/ray/dsl/event.rb +1 -9
- data/lib/ray/dsl/event_runner.rb +3 -4
- data/lib/ray/dsl/matcher.rb +20 -1
- data/lib/ray/effect.rb +116 -0
- data/lib/ray/effect/black_and_white.rb +38 -0
- data/lib/ray/effect/color_inversion.rb +16 -0
- data/lib/ray/effect/generator.rb +145 -0
- data/lib/ray/effect/grayscale.rb +32 -0
- data/lib/ray/game.rb +25 -5
- data/lib/ray/gl/vertex.rb +105 -26
- data/lib/ray/helper.rb +5 -0
- data/lib/ray/image.rb +54 -13
- data/lib/ray/image_target.rb +7 -0
- data/lib/ray/matrix.rb +26 -0
- data/lib/ray/music.rb +4 -0
- data/lib/ray/pixel_bus.rb +22 -0
- data/lib/ray/polygon.rb +17 -0
- data/lib/ray/pp.rb +28 -0
- data/lib/ray/ray.rb +7 -1
- data/lib/ray/rect.rb +7 -13
- data/lib/ray/scene.rb +24 -5
- data/lib/ray/scene_list.rb +9 -0
- data/lib/ray/shader.rb +11 -2
- data/lib/ray/sound.rb +4 -0
- data/lib/ray/sprite.rb +23 -62
- data/lib/ray/target.rb +25 -0
- data/lib/ray/text.rb +10 -0
- data/lib/ray/turtle.rb +9 -3
- data/lib/ray/vector.rb +18 -0
- data/lib/ray/vertex.rb +6 -0
- data/lib/ray/view.rb +22 -0
- data/samples/animation/sprite_motion.rb +0 -60
- data/samples/audio/{spacial.rb → spatial.rb} +1 -1
- data/samples/buffer/buffer.rb +1 -0
- data/samples/buffer/index_buffer.rb +2 -0
- data/samples/cptn_ruby/cptn_ruby.rb +6 -7
- data/samples/effects/effect.rb +39 -0
- data/samples/effects/grayscale.rb +27 -0
- data/samples/opengl/image.rb +7 -5
- data/samples/opengl/instancing.rb +159 -0
- data/samples/opengl/instancing.rbc +3231 -0
- data/samples/opengl/obj_loader.rb +9 -8
- data/samples/opengl/shader.rb +1 -3
- data/samples/shaders/geometry.rb +108 -38
- data/samples/shaders/geometry.rbc +2074 -0
- data/samples/shaders/shape.rb +2 -2
- data/samples/starfighter/starfighter.rb +5 -5
- data/samples/window/get_pixel.rb +1 -1
- data/test/animation_list_test.rb +18 -4
- data/test/drawable_test.rb +70 -1
- data/test/effect_generator_test.rb +63 -0
- data/test/effect_test.rb +61 -0
- data/test/game_test.rb +18 -0
- data/test/gl_buffer_test.rb +43 -1
- data/test/gl_index_buffer_test.rb +5 -0
- data/test/gl_vertex_test.rb +28 -1
- data/test/image_test.rb +5 -5
- data/test/input_test.rb +49 -0
- data/test/pixel_bus_test.rb +28 -0
- data/test/rect_test.rb +4 -0
- data/{samples/_media → test/res}/Beep.wav +0 -0
- data/samples/_media/CptnRuby Gem.png b/data/test/res/CptnRuby → Gem.png +0 -0
- data/samples/_media/CptnRuby Map.txt b/data/test/res/CptnRuby → Map.txt +0 -0
- data/samples/_media/CptnRuby Tileset.png b/data/test/res/CptnRuby → Tileset.png +0 -0
- data/{samples/_media → test/res}/CptnRuby.png +0 -0
- data/{samples/_media → test/res}/Space.png +0 -0
- data/{samples/_media → test/res}/Star.png +0 -0
- data/{samples/_media → test/res}/Starfighter.png +0 -0
- data/test/res/cube.obj +28 -0
- data/test/res/light3d.c +2 -2
- data/test/res/stone.png +0 -0
- data/test/scene_test.rb +3 -0
- data/test/sprite_test.rb +10 -0
- data/test/text_test.rb +31 -2
- data/test/view_test.rb +13 -1
- metadata +38 -17
- data/ext/say_array.c +0 -124
- data/ext/say_array.h +0 -34
- data/ext/say_table.c +0 -86
- data/ext/say_table.h +0 -24
data/ext/gl_buffer.c
CHANGED
@@ -48,20 +48,66 @@ VALUE ray_gl_buffer_init(VALUE self, VALUE type, VALUE vtype) {
|
|
48
48
|
return self;
|
49
49
|
}
|
50
50
|
|
51
|
-
/*
|
51
|
+
/* @return [Boolean] True if the buffer has instance-specific data */
|
52
|
+
static
|
53
|
+
VALUE ray_gl_buffer_has_instance(VALUE self) {
|
54
|
+
return say_buffer_has_instance(ray_rb2buffer(self)) ? Qtrue : Qfalse;
|
55
|
+
}
|
56
|
+
|
57
|
+
/* Unbinds any bound buffer */
|
52
58
|
static
|
53
59
|
VALUE ray_gl_buffer_unbind(VALUE self) {
|
54
60
|
say_buffer_unbind();
|
55
61
|
return Qnil;
|
56
62
|
}
|
57
63
|
|
58
|
-
/*
|
64
|
+
/* Unbinds any bound VBO from array buffer */
|
65
|
+
static
|
66
|
+
VALUE ray_gl_buffer_unbind_vbo(VALUE self) {
|
67
|
+
say_buffer_unbind_vbo();
|
68
|
+
return Qnil;
|
69
|
+
}
|
70
|
+
|
71
|
+
/* Binds the receiver, allowing to draw data stored in it */
|
59
72
|
static
|
60
73
|
VALUE ray_gl_buffer_bind(VALUE self) {
|
61
74
|
say_buffer_bind(ray_rb2buffer(self));
|
62
75
|
return self;
|
63
76
|
}
|
64
77
|
|
78
|
+
/* Binds the receivers's VBO as an OpenGL array buffer */
|
79
|
+
static
|
80
|
+
VALUE ray_gl_buffer_bind_vbo(VALUE self) {
|
81
|
+
say_buffer_bind_vbo(ray_rb2buffer(self));
|
82
|
+
return self;
|
83
|
+
}
|
84
|
+
|
85
|
+
/*
|
86
|
+
* Binds the receivers's VBO containing instance data as an OpenGL array buffer
|
87
|
+
*/
|
88
|
+
static
|
89
|
+
VALUE ray_gl_buffer_bind_instance_vbo(VALUE self) {
|
90
|
+
say_buffer_bind_instance_vbo(ray_rb2buffer(self));
|
91
|
+
return self;
|
92
|
+
}
|
93
|
+
|
94
|
+
/*
|
95
|
+
* @return [Integer] The identifier of the OpenGL buffer used by the buffer
|
96
|
+
*/
|
97
|
+
static
|
98
|
+
VALUE ray_gl_buffer_vbo(VALUE self) {
|
99
|
+
return ULONG2NUM(say_buffer_get_vbo(ray_rb2buffer(self)));
|
100
|
+
}
|
101
|
+
|
102
|
+
/*
|
103
|
+
* @return [Integer] The identifier of the OpenGL buffer used by the buffer to
|
104
|
+
* store per-instance data
|
105
|
+
*/
|
106
|
+
static
|
107
|
+
VALUE ray_gl_buffer_instance_vbo(VALUE self) {
|
108
|
+
return ULONG2NUM(say_buffer_get_instance_vbo(ray_rb2buffer(self)));
|
109
|
+
}
|
110
|
+
|
65
111
|
/*
|
66
112
|
* @overload [](id)
|
67
113
|
* @param [Integer] id
|
@@ -123,6 +169,77 @@ VALUE ray_gl_buffer_set(VALUE self, VALUE i, VALUE vertex) {
|
|
123
169
|
|
124
170
|
return vertex;
|
125
171
|
}
|
172
|
+
/*
|
173
|
+
* @overload get_instance(id)
|
174
|
+
* @param [Integer] id
|
175
|
+
* @return [Ray::GL::Vertex::Instance] The instance at the given index
|
176
|
+
*/
|
177
|
+
static
|
178
|
+
VALUE ray_gl_buffer_get_instance(VALUE self, VALUE i) {
|
179
|
+
say_buffer *buf = ray_rb2buffer(self);
|
180
|
+
|
181
|
+
if (!say_buffer_has_instance(buf))
|
182
|
+
rb_raise(rb_eRuntimeError, "buffer has no instance data");
|
183
|
+
|
184
|
+
size_t size = say_buffer_get_instance_size(buf);
|
185
|
+
size_t index = NUM2ULONG(i);
|
186
|
+
|
187
|
+
if (index >= size)
|
188
|
+
return Qnil;
|
189
|
+
|
190
|
+
VALUE klass = rb_const_get(rb_iv_get(self, "@vertex_type"),
|
191
|
+
rb_intern("Instance"));
|
192
|
+
VALUE object = rb_funcall(klass, RAY_METH("allocate"), 0);
|
193
|
+
|
194
|
+
size_t byte_size = NUM2INT(rb_iv_get(klass, "@vertex_instance_size"));
|
195
|
+
|
196
|
+
void *ptr = NULL;
|
197
|
+
Data_Get_Struct(object, void, ptr);
|
198
|
+
|
199
|
+
memcpy(ptr, say_buffer_get_instance(buf, index), byte_size);
|
200
|
+
|
201
|
+
return object;
|
202
|
+
}
|
203
|
+
|
204
|
+
/*
|
205
|
+
* @overload set_intance(id, value)
|
206
|
+
* @param [Integer] id
|
207
|
+
* @param [Ray::GL::Vertex::Instance] value The instance to set the given
|
208
|
+
* index.
|
209
|
+
*/
|
210
|
+
static
|
211
|
+
VALUE ray_gl_buffer_set_instance(VALUE self, VALUE i, VALUE vertex) {
|
212
|
+
rb_check_frozen(self);
|
213
|
+
|
214
|
+
say_buffer *buf = ray_rb2buffer(self);
|
215
|
+
|
216
|
+
if (!say_buffer_has_instance(buf))
|
217
|
+
rb_raise(rb_eRuntimeError, "buffer has no instance data");
|
218
|
+
|
219
|
+
VALUE klass = rb_const_get(rb_iv_get(self, "@vertex_type"),
|
220
|
+
rb_intern("Instance"));
|
221
|
+
if (!RAY_IS_A(vertex, klass)) {
|
222
|
+
rb_raise(rb_eTypeError, "Can't convert %s into %s",
|
223
|
+
RAY_OBJ_CLASSNAME(vertex), rb_class2name(klass));
|
224
|
+
}
|
225
|
+
|
226
|
+
size_t size = say_buffer_get_instance_size(buf);
|
227
|
+
size_t index = NUM2ULONG(i);
|
228
|
+
|
229
|
+
if (index >= size) {
|
230
|
+
rb_raise(rb_eRangeError, "%zu is outside of range 0...%zu",
|
231
|
+
size, index);
|
232
|
+
}
|
233
|
+
|
234
|
+
size_t byte_size = NUM2INT(rb_iv_get(klass, "@vertex_instance_size"));
|
235
|
+
|
236
|
+
void *ptr = NULL;
|
237
|
+
Data_Get_Struct(vertex, void, ptr);
|
238
|
+
|
239
|
+
memcpy(say_buffer_get_instance(buf, index), ptr, byte_size);
|
240
|
+
|
241
|
+
return vertex;
|
242
|
+
}
|
126
243
|
|
127
244
|
/*
|
128
245
|
* @overload update(range = 0...size)
|
@@ -176,6 +293,60 @@ VALUE ray_gl_buffer_update(int argc, VALUE *argv, VALUE self) {
|
|
176
293
|
return self;
|
177
294
|
}
|
178
295
|
|
296
|
+
/*
|
297
|
+
* @overload update_instance(range = 0...size)
|
298
|
+
* @param [Range<Integer>] range (see #update)
|
299
|
+
*
|
300
|
+
* Updates a part of the buffer's instance-specific data
|
301
|
+
*
|
302
|
+
* @overload update_instance(first, size)
|
303
|
+
* @param (see #update)
|
304
|
+
*/
|
305
|
+
static
|
306
|
+
VALUE ray_gl_buffer_update_instance(int argc, VALUE *argv, VALUE self) {
|
307
|
+
say_buffer *buf = ray_rb2buffer(self);
|
308
|
+
size_t max_index = say_buffer_get_instance_size(buf);
|
309
|
+
|
310
|
+
if (!say_buffer_has_instance(buf))
|
311
|
+
rb_raise(rb_eRuntimeError, "buffer has no per-instance data");
|
312
|
+
|
313
|
+
if (argc == 0)
|
314
|
+
say_buffer_update_instance(buf);
|
315
|
+
else if (argc == 2) {
|
316
|
+
size_t begin = NUM2ULONG(argv[0]);
|
317
|
+
size_t end = NUM2ULONG(argv[1]);
|
318
|
+
|
319
|
+
if (end > max_index)
|
320
|
+
end = max_index;
|
321
|
+
|
322
|
+
if (begin > end || begin > max_index)
|
323
|
+
return self;
|
324
|
+
|
325
|
+
size_t size = (end - begin) + 1;
|
326
|
+
|
327
|
+
say_buffer_update_instance_part(buf, begin, size);
|
328
|
+
}
|
329
|
+
else {
|
330
|
+
VALUE range;
|
331
|
+
rb_scan_args(argc, argv, "1", &range); /* raise exception */
|
332
|
+
|
333
|
+
size_t begin = NUM2ULONG(rb_funcall(range, RAY_METH("begin"), 0));
|
334
|
+
size_t end = NUM2ULONG(rb_funcall(range, RAY_METH("end"), 0));
|
335
|
+
|
336
|
+
if (end > max_index)
|
337
|
+
end = max_index;
|
338
|
+
|
339
|
+
if (begin > end || begin > max_index)
|
340
|
+
return self;
|
341
|
+
|
342
|
+
size_t size = (end - begin) + 1;
|
343
|
+
|
344
|
+
say_buffer_update_instance_part(buf, begin, size);
|
345
|
+
}
|
346
|
+
|
347
|
+
return self;
|
348
|
+
}
|
349
|
+
|
179
350
|
/* @return [Integer] Size of the buffer (amount of vertices it contains) */
|
180
351
|
static
|
181
352
|
VALUE ray_gl_buffer_size(VALUE self) {
|
@@ -195,6 +366,32 @@ VALUE ray_gl_buffer_resize(VALUE self, VALUE size) {
|
|
195
366
|
return self;
|
196
367
|
}
|
197
368
|
|
369
|
+
/* @return [Integer] Amount of per-instance blocks in the buffer */
|
370
|
+
static
|
371
|
+
VALUE ray_gl_buffer_instance_size(VALUE self) {
|
372
|
+
say_buffer *buf = ray_rb2buffer(self);
|
373
|
+
if (!say_buffer_has_instance(buf))
|
374
|
+
return Qnil;
|
375
|
+
return ULONG2NUM(say_buffer_get_instance_size(buf));
|
376
|
+
}
|
377
|
+
|
378
|
+
/*
|
379
|
+
* @overload resize_instance(size)
|
380
|
+
* @param [Integere] size (see #resize)
|
381
|
+
*
|
382
|
+
* Resizes the buffer's instance data, alsos causing it to be updated.
|
383
|
+
*/
|
384
|
+
static
|
385
|
+
VALUE ray_gl_buffer_resize_instance(VALUE self, VALUE size) {
|
386
|
+
rb_check_frozen(self);
|
387
|
+
say_buffer *buf = ray_rb2buffer(self);
|
388
|
+
if (!say_buffer_has_instance(buf))
|
389
|
+
rb_raise(rb_eRuntimeError, "buffer has no per-instance data");
|
390
|
+
say_buffer_resize_instance(buf, NUM2ULONG(size));
|
391
|
+
return self;
|
392
|
+
}
|
393
|
+
|
394
|
+
|
198
395
|
/*
|
199
396
|
* Document-class: Ray::GL::Buffer
|
200
397
|
*
|
@@ -211,14 +408,38 @@ void Init_ray_gl_buffer() {
|
|
211
408
|
rb_define_alloc_func(ray_cGLBuffer, ray_gl_buffer_alloc);
|
212
409
|
rb_define_method(ray_cGLBuffer, "initialize", ray_gl_buffer_init, 2);
|
213
410
|
|
411
|
+
rb_define_method(ray_cGLBuffer, "has_instance?", ray_gl_buffer_has_instance,
|
412
|
+
0);
|
413
|
+
|
214
414
|
rb_define_singleton_method(ray_cGLBuffer, "unbind", ray_gl_buffer_unbind, 0);
|
415
|
+
rb_define_singleton_method(ray_cGLBuffer, "unbind_vbo",
|
416
|
+
ray_gl_buffer_unbind_vbo, 0);
|
215
417
|
rb_define_method(ray_cGLBuffer, "bind", ray_gl_buffer_bind, 0);
|
418
|
+
rb_define_method(ray_cGLBuffer, "bind_vbo", ray_gl_buffer_bind_vbo, 0);
|
419
|
+
rb_define_method(ray_cGLBuffer, "bind_instance_vbo",
|
420
|
+
ray_gl_buffer_bind_instance_vbo, 0);
|
421
|
+
|
422
|
+
rb_define_method(ray_cGLBuffer, "vbo", ray_gl_buffer_vbo, 0);
|
423
|
+
rb_define_method(ray_cGLBuffer, "instance_vbo", ray_gl_buffer_instance_vbo,
|
424
|
+
0);
|
216
425
|
|
217
426
|
rb_define_method(ray_cGLBuffer, "[]", ray_gl_buffer_get, 1);
|
218
427
|
rb_define_method(ray_cGLBuffer, "[]=", ray_gl_buffer_set, 2);
|
219
428
|
|
429
|
+
rb_define_method(ray_cGLBuffer, "get_instance", ray_gl_buffer_get_instance,
|
430
|
+
1);
|
431
|
+
rb_define_method(ray_cGLBuffer, "set_instance", ray_gl_buffer_set_instance,
|
432
|
+
2);
|
433
|
+
|
220
434
|
rb_define_method(ray_cGLBuffer, "update", ray_gl_buffer_update, -1);
|
435
|
+
rb_define_method(ray_cGLBuffer, "update_instance",
|
436
|
+
ray_gl_buffer_update_instance, -1);
|
221
437
|
|
222
438
|
rb_define_method(ray_cGLBuffer, "size", ray_gl_buffer_size, 0);
|
223
439
|
rb_define_method(ray_cGLBuffer, "resize", ray_gl_buffer_resize, 1);
|
440
|
+
|
441
|
+
rb_define_method(ray_cGLBuffer, "instance_size", ray_gl_buffer_instance_size,
|
442
|
+
0);
|
443
|
+
rb_define_method(ray_cGLBuffer, "resize_instance",
|
444
|
+
ray_gl_buffer_resize_instance, 1);
|
224
445
|
}
|
data/ext/gl_index_buffer.c
CHANGED
@@ -60,6 +60,15 @@ VALUE ray_gl_index_buffer_bind(VALUE self) {
|
|
60
60
|
return self;
|
61
61
|
}
|
62
62
|
|
63
|
+
/*
|
64
|
+
* @return [Integer] The identifier of the OpenGL buffer used by the index
|
65
|
+
* buffer.
|
66
|
+
*/
|
67
|
+
static
|
68
|
+
VALUE ray_gl_index_buffer_ibo(VALUE self) {
|
69
|
+
return ULONG2NUM(say_index_buffer_get_ibo(ray_rb2index_buffer(self)));
|
70
|
+
}
|
71
|
+
|
63
72
|
/*
|
64
73
|
* @overload [](id)
|
65
74
|
* @param [Integer] id
|
@@ -190,6 +199,8 @@ void Init_ray_gl_index_buffer() {
|
|
190
199
|
ray_gl_index_buffer_unbind, 0);
|
191
200
|
rb_define_method(ray_cGLIndexBuffer, "bind", ray_gl_index_buffer_bind, 0);
|
192
201
|
|
202
|
+
rb_define_method(ray_cGLIndexBuffer, "ibo", ray_gl_index_buffer_ibo, 0);
|
203
|
+
|
193
204
|
rb_define_method(ray_cGLIndexBuffer, "[]", ray_gl_index_buffer_get, 1);
|
194
205
|
rb_define_method(ray_cGLIndexBuffer, "[]=", ray_gl_index_buffer_set, 2);
|
195
206
|
|
data/ext/gl_int_array.c
CHANGED
@@ -2,27 +2,29 @@
|
|
2
2
|
|
3
3
|
VALUE ray_cIntArray = Qnil;
|
4
4
|
|
5
|
-
|
5
|
+
mo_array *ray_rb2int_array(VALUE obj) {
|
6
6
|
if (!rb_obj_is_kind_of(obj, rb_path2class("Ray::GL::IntArray"))) {
|
7
7
|
rb_raise(rb_eTypeError, "can't convert %s into Ray::GL::IntArray",
|
8
8
|
RAY_OBJ_CLASSNAME(obj));
|
9
9
|
}
|
10
10
|
|
11
|
-
|
12
|
-
Data_Get_Struct(obj,
|
11
|
+
mo_array *ptr = NULL;
|
12
|
+
Data_Get_Struct(obj, mo_array, ptr);
|
13
13
|
|
14
14
|
return ptr;
|
15
15
|
}
|
16
16
|
|
17
17
|
static
|
18
18
|
void ray_int_set_to_zero(void *elem) {
|
19
|
-
*(
|
19
|
+
*(GLint*)elem = 0;
|
20
20
|
}
|
21
21
|
|
22
22
|
static
|
23
23
|
VALUE ray_int_array_alloc(VALUE self) {
|
24
|
-
|
25
|
-
|
24
|
+
mo_array *obj = mo_array_create(sizeof(GLint));
|
25
|
+
obj->init = ray_int_set_to_zero;
|
26
|
+
|
27
|
+
return Data_Wrap_Struct(self, NULL, mo_array_free, obj);
|
26
28
|
}
|
27
29
|
|
28
30
|
/*
|
@@ -31,11 +33,11 @@ VALUE ray_int_array_alloc(VALUE self) {
|
|
31
33
|
*/
|
32
34
|
static
|
33
35
|
VALUE ray_int_array_init(int argc, VALUE *argv, VALUE self) {
|
34
|
-
|
36
|
+
mo_array *ary = ray_rb2int_array(self);
|
35
37
|
|
36
38
|
for (int i = 0; i < argc; i++) {
|
37
|
-
|
38
|
-
|
39
|
+
GLint val = NUM2INT(argv[i]);
|
40
|
+
mo_array_push(ary, &val);
|
39
41
|
}
|
40
42
|
|
41
43
|
return self;
|
@@ -43,7 +45,7 @@ VALUE ray_int_array_init(int argc, VALUE *argv, VALUE self) {
|
|
43
45
|
|
44
46
|
static
|
45
47
|
VALUE ray_int_array_init_copy(VALUE self, VALUE orig) {
|
46
|
-
|
48
|
+
mo_array_copy(ray_rb2int_array(self), ray_rb2int_array(orig));
|
47
49
|
return self;
|
48
50
|
}
|
49
51
|
|
@@ -56,10 +58,10 @@ static
|
|
56
58
|
VALUE ray_int_array_push(VALUE self, VALUE val) {
|
57
59
|
rb_check_frozen(self);
|
58
60
|
|
59
|
-
|
60
|
-
|
61
|
+
mo_array *ary = ray_rb2int_array(self);
|
62
|
+
GLint e = NUM2INT(val);
|
61
63
|
|
62
|
-
|
64
|
+
mo_array_push(ary, &e);
|
63
65
|
|
64
66
|
return self;
|
65
67
|
}
|
@@ -71,10 +73,10 @@ VALUE ray_int_array_push(VALUE self, VALUE val) {
|
|
71
73
|
*/
|
72
74
|
static
|
73
75
|
VALUE ray_int_array_get(VALUE self, VALUE i) {
|
74
|
-
|
76
|
+
mo_array *ary = ray_rb2int_array(self);
|
75
77
|
size_t idx = NUM2ULONG(i);
|
76
78
|
|
77
|
-
|
79
|
+
GLint *elem = mo_array_get_ptr(ary, idx, GLint);
|
78
80
|
|
79
81
|
if (elem) {
|
80
82
|
return INT2FIX(*elem);
|
@@ -92,13 +94,13 @@ static
|
|
92
94
|
VALUE ray_int_array_set(VALUE self, VALUE i, VALUE val) {
|
93
95
|
rb_check_frozen(self);
|
94
96
|
|
95
|
-
|
96
|
-
size_t idx
|
97
|
+
mo_array *ary = ray_rb2int_array(self);
|
98
|
+
size_t idx = NUM2ULONG(i);
|
97
99
|
|
98
|
-
if (
|
99
|
-
|
100
|
+
if (ary->size <= idx)
|
101
|
+
mo_array_resize(ary, idx + 1);
|
100
102
|
|
101
|
-
|
103
|
+
mo_array_get_as(ary, idx, GLint) = NUM2INT(val);
|
102
104
|
|
103
105
|
return val;
|
104
106
|
}
|
@@ -106,13 +108,13 @@ VALUE ray_int_array_set(VALUE self, VALUE i, VALUE val) {
|
|
106
108
|
/* @return [Integer] size of the array */
|
107
109
|
static
|
108
110
|
VALUE ray_int_array_size(VALUE self) {
|
109
|
-
return INT2FIX(
|
111
|
+
return INT2FIX(ray_rb2int_array(self)->size);
|
110
112
|
}
|
111
113
|
|
112
114
|
/* Removes all the elements from the array */
|
113
115
|
static
|
114
116
|
VALUE ray_int_array_clear(VALUE self) {
|
115
|
-
|
117
|
+
mo_array_resize(ray_rb2int_array(self), 0);
|
116
118
|
return self;
|
117
119
|
}
|
118
120
|
|
data/ext/gl_vertex.c
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
#include "ray.h"
|
2
2
|
|
3
|
-
VALUE ray_cGLVertex
|
3
|
+
VALUE ray_cGLVertex = Qnil;
|
4
|
+
VALUE ray_cGLInstance = Qnil;
|
5
|
+
|
4
6
|
static VALUE ray_gl_vertex_types = Qnil;
|
5
7
|
|
6
8
|
VALUE ray_get_vertex_class(size_t id) {
|
@@ -19,6 +21,55 @@ size_t ray_get_vtype(VALUE class) {
|
|
19
21
|
}
|
20
22
|
}
|
21
23
|
|
24
|
+
VALUE ray_get_vertex_element(void *data, VALUE type) {
|
25
|
+
switch (NUM2INT(rb_hash_aref(ray_gl_vertex_types, type))) {
|
26
|
+
case SAY_FLOAT:
|
27
|
+
return rb_float_new(*(GLfloat*)data);
|
28
|
+
case SAY_INT:
|
29
|
+
return INT2FIX(*(GLint*)data);
|
30
|
+
case SAY_UBYTE:
|
31
|
+
return INT2FIX(*(GLubyte*)data);
|
32
|
+
case SAY_BOOL:
|
33
|
+
return (*(GLint*)data) ? Qtrue : Qfalse;
|
34
|
+
|
35
|
+
case SAY_COLOR:
|
36
|
+
return ray_col2rb(*(say_color*)data);
|
37
|
+
case SAY_VECTOR2:
|
38
|
+
return ray_vector2_to_rb(*(say_vector2*)data);
|
39
|
+
case SAY_VECTOR3:
|
40
|
+
return ray_vector3_to_rb(*(say_vector3*)data);
|
41
|
+
}
|
42
|
+
|
43
|
+
return Qnil;
|
44
|
+
}
|
45
|
+
|
46
|
+
void ray_set_vertex_element(void *data, VALUE type, VALUE val) {
|
47
|
+
switch (NUM2INT(rb_hash_aref(ray_gl_vertex_types, type))) {
|
48
|
+
case SAY_FLOAT:
|
49
|
+
*(GLfloat*)data = NUM2DBL(val);
|
50
|
+
break;
|
51
|
+
case SAY_INT:
|
52
|
+
*(GLint*)data = NUM2INT(val);
|
53
|
+
break;
|
54
|
+
case SAY_UBYTE:
|
55
|
+
*(GLubyte*)data = ray_byte_clamp(NUM2INT(val));
|
56
|
+
break;
|
57
|
+
case SAY_BOOL:
|
58
|
+
(*(GLint*)data) = RTEST(val);
|
59
|
+
break;
|
60
|
+
|
61
|
+
case SAY_COLOR:
|
62
|
+
*(say_color*)data = ray_rb2col(val);
|
63
|
+
break;
|
64
|
+
case SAY_VECTOR2:
|
65
|
+
*(say_vector2*)data = ray_convert_to_vector2(val);
|
66
|
+
break;
|
67
|
+
case SAY_VECTOR3:
|
68
|
+
*(say_vector3*)data = ray_convert_to_vector3(val);
|
69
|
+
break;
|
70
|
+
}
|
71
|
+
}
|
72
|
+
|
22
73
|
VALUE ray_gl_vertex_alloc(VALUE self) {
|
23
74
|
size_t size = NUM2ULONG(rb_iv_get(self, "@vertex_type_size"));
|
24
75
|
|
@@ -26,6 +77,13 @@ VALUE ray_gl_vertex_alloc(VALUE self) {
|
|
26
77
|
return Data_Wrap_Struct(self, NULL, free, vertex);
|
27
78
|
}
|
28
79
|
|
80
|
+
VALUE ray_gl_instance_alloc(VALUE self) {
|
81
|
+
size_t size = NUM2ULONG(rb_iv_get(self, "@vertex_instance_size"));
|
82
|
+
|
83
|
+
void *instance = malloc(size);
|
84
|
+
return Data_Wrap_Struct(self, NULL, free, instance);
|
85
|
+
}
|
86
|
+
|
29
87
|
static
|
30
88
|
VALUE ray_gl_vertex_make_type(VALUE self, VALUE types) {
|
31
89
|
size_t size = RARRAY_LEN(types);
|
@@ -42,11 +100,13 @@ VALUE ray_gl_vertex_make_type(VALUE self, VALUE types) {
|
|
42
100
|
VALUE name = RAY_ARRAY_AT(element, 0);
|
43
101
|
VALUE type = RAY_ARRAY_AT(element, 1);
|
44
102
|
|
45
|
-
|
103
|
+
VALUE per_instance = RAY_ARRAY_AT(element, 2);
|
104
|
+
|
105
|
+
char *c_name = say_strdup(StringValuePtr(name));
|
46
106
|
say_vertex_elem_type c_type = NUM2INT(rb_hash_aref(ray_gl_vertex_types,
|
47
107
|
type));
|
48
108
|
|
49
|
-
say_vertex_elem c_elem = {c_type, c_name};
|
109
|
+
say_vertex_elem c_elem = {c_type, c_name, RTEST(per_instance)};
|
50
110
|
say_vertex_type_push(vtype, c_elem);
|
51
111
|
}
|
52
112
|
|
@@ -65,31 +125,18 @@ VALUE ray_gl_vertex_size(VALUE self, VALUE vtype) {
|
|
65
125
|
return INT2FIX(say_vertex_type_get_size(type));
|
66
126
|
}
|
67
127
|
|
128
|
+
static
|
129
|
+
VALUE ray_gl_vertex_instance_size(VALUE self, VALUE vtype) {
|
130
|
+
say_vertex_type *type = say_get_vertex_type(NUM2ULONG(vtype));
|
131
|
+
return INT2FIX(say_vertex_type_get_instance_size(type));
|
132
|
+
}
|
133
|
+
|
68
134
|
VALUE ray_gl_vertex_element(VALUE self, VALUE offset, VALUE type) {
|
69
135
|
uint8_t *data = NULL;
|
70
136
|
Data_Get_Struct(self, uint8_t, data);
|
71
137
|
|
72
138
|
data += NUM2ULONG(offset);
|
73
|
-
|
74
|
-
switch (NUM2INT(rb_hash_aref(ray_gl_vertex_types, type))) {
|
75
|
-
case SAY_FLOAT:
|
76
|
-
return rb_float_new(*(GLfloat*)data);
|
77
|
-
case SAY_INT:
|
78
|
-
return INT2FIX((*(GLint*)data));
|
79
|
-
case SAY_UBYTE:
|
80
|
-
return INT2FIX((*(GLubyte*)data));
|
81
|
-
case SAY_BOOL:
|
82
|
-
return (*(GLint*)data) ? Qtrue : Qfalse;
|
83
|
-
|
84
|
-
case SAY_COLOR:
|
85
|
-
return ray_col2rb(*(say_color*)data);
|
86
|
-
case SAY_VECTOR2:
|
87
|
-
return ray_vector2_to_rb(*(say_vector2*)data);
|
88
|
-
case SAY_VECTOR3:
|
89
|
-
return ray_vector3_to_rb(*(say_vector3*)data);
|
90
|
-
}
|
91
|
-
|
92
|
-
return Qnil;
|
139
|
+
return ray_get_vertex_element(data, type);
|
93
140
|
}
|
94
141
|
|
95
142
|
VALUE ray_gl_vertex_set_element(VALUE self, VALUE offset, VALUE type,
|
@@ -98,33 +145,9 @@ VALUE ray_gl_vertex_set_element(VALUE self, VALUE offset, VALUE type,
|
|
98
145
|
Data_Get_Struct(self, uint8_t, data);
|
99
146
|
|
100
147
|
data += NUM2ULONG(offset);
|
148
|
+
ray_set_vertex_element(data, type, val);
|
101
149
|
|
102
|
-
|
103
|
-
case SAY_FLOAT:
|
104
|
-
(*(GLfloat*)data) = NUM2DBL(val);
|
105
|
-
break;
|
106
|
-
case SAY_INT:
|
107
|
-
((*(GLint*)data)) = NUM2INT(val);
|
108
|
-
break;
|
109
|
-
case SAY_UBYTE:
|
110
|
-
((*(GLubyte*)data)) = ray_byte_clamp(NUM2INT(val));
|
111
|
-
break;
|
112
|
-
case SAY_BOOL:
|
113
|
-
(*(GLint*)data) = RTEST(val);
|
114
|
-
break;
|
115
|
-
|
116
|
-
case SAY_COLOR:
|
117
|
-
((*(say_color*)data)) = ray_rb2col(val);
|
118
|
-
break;
|
119
|
-
case SAY_VECTOR2:
|
120
|
-
((*(say_vector2*)data)) = ray_convert_to_vector2(val);
|
121
|
-
break;
|
122
|
-
case SAY_VECTOR3:
|
123
|
-
((*(say_vector3*)data)) = ray_convert_to_vector3(val);
|
124
|
-
break;
|
125
|
-
}
|
126
|
-
|
127
|
-
return type;
|
150
|
+
return val;
|
128
151
|
}
|
129
152
|
|
130
153
|
void Init_ray_gl_vertex() {
|
@@ -137,6 +160,8 @@ void Init_ray_gl_vertex() {
|
|
137
160
|
ray_gl_vertex_offset_of, 2);
|
138
161
|
rb_define_singleton_method(ray_cGLVertex, "size",
|
139
162
|
ray_gl_vertex_size, 1);
|
163
|
+
rb_define_singleton_method(ray_cGLVertex, "instance_size",
|
164
|
+
ray_gl_vertex_instance_size, 1);
|
140
165
|
|
141
166
|
rb_define_private_method(ray_cGLVertex, "element", ray_gl_vertex_element, 2);
|
142
167
|
rb_define_private_method(ray_cGLVertex, "set_element",
|
@@ -154,4 +179,14 @@ void Init_ray_gl_vertex() {
|
|
154
179
|
rb_hash_aset(ray_gl_vertex_types, RAY_SYM("vector3"), INT2FIX(SAY_VECTOR3));
|
155
180
|
|
156
181
|
rb_define_const(ray_cGLVertex, "TypeMap", ray_gl_vertex_types);
|
182
|
+
|
183
|
+
ray_cGLInstance = rb_define_class_under(ray_cGLVertex, "Instance",
|
184
|
+
rb_cObject);
|
185
|
+
rb_define_alloc_func(ray_cGLInstance, ray_gl_instance_alloc);
|
186
|
+
|
187
|
+
rb_define_private_method(ray_cGLInstance, "element", ray_gl_vertex_element,
|
188
|
+
2);
|
189
|
+
rb_define_private_method(ray_cGLInstance, "set_element",
|
190
|
+
ray_gl_vertex_set_element, 3);
|
191
|
+
|
157
192
|
}
|