/* * @overload multi_draw_arrays(primitive, first, count) * @param primitive (see #draw_arrays) * @param [Ray::GL::IntArray] first Indices of the first vertex * @param [Ray::GL::IntArray] count Ammount of vertices to draw */ static VALUE ray_gl_multi_draw_arrays(VALUE self, VALUE primitive, VALUE rb_first, VALUE rb_count) { mo_array *first = ray_rb2int_array(rb_first); mo_array *count = ray_rb2int_array(rb_count); if (first->size != count->size) rb_raise(rb_eArgError, "first and count arrays should have the same size"); glMultiDrawArrays(NUM2INT(rb_hash_aref(ray_gl_primitives, primitive)), mo_array_at(first, 0), mo_array_at(count, 0), first->size); return Qnil; }
/* * @overload multi_draw_elements(primitive, count, index) * @param primitive (see #draw_arrays) * @param count (see #multi_draw_arrays) * @param [Ray::GL::IntArray] index First indices from the element array for * each draw */ static VALUE ray_gl_multi_draw_elements(VALUE self, VALUE primitive, VALUE rb_count, VALUE rb_index) { mo_array *index = ray_rb2int_array(rb_index); mo_array *count = ray_rb2int_array(rb_count); if (index->size != count->size) rb_raise(rb_eArgError, "index and count arrays should have the same size"); glMultiDrawElements(NUM2INT(rb_hash_aref(ray_gl_primitives, primitive)), mo_array_at(count, 0), GL_UNSIGNED_INT, (const GLvoid**)mo_array_at(index, 0), index->size); return Qnil; }
/* @overload <<(val) @param [Integer] val Element to push @return [self] */ static VALUE ray_int_array_push(VALUE self, VALUE val) { rb_check_frozen(self); say_array *ary = ray_rb2int_array(self); int e = NUM2INT(val); say_array_push(ary, &e); return self; }
/* @overload initialize(*args) @param [Array<Integer>] args Inital content of the array */ static VALUE ray_int_array_init(int argc, VALUE *argv, VALUE self) { say_array *ary = ray_rb2int_array(self); for (int i = 0; i < argc; i++) { int val = NUM2INT(argv[i]); say_array_push(ary, &val); } return self; }
/* @overload [](i) @param [Integer] i Index to read from @return [Integer, nil] Value at that index */ static VALUE ray_int_array_get(VALUE self, VALUE i) { say_array *ary = ray_rb2int_array(self); size_t idx = NUM2ULONG(i); int *elem = say_array_get(ary, idx); if (elem) { return INT2FIX(*elem); } else return Qnil; }
/* @overload []=(i, val) @param [Integer] i Index of the value to change @param [Integer] val Value to assign */ static VALUE ray_int_array_set(VALUE self, VALUE i, VALUE val) { rb_check_frozen(self); say_array *ary = ray_rb2int_array(self); size_t idx = NUM2ULONG(i); if (say_array_get_size(ary) <= idx) say_array_resize(ary, idx + 1); *(int*)say_array_get(ary, idx) = NUM2INT(val); return val; }
static void ray_drawable_indices_fill_proc(void *data, GLuint *ptr, size_t first) { ray_drawable *drawable = (ray_drawable*)data; VALUE array = rb_funcall(drawable->obj, RAY_METH("fill_indices"), 1, ULONG2NUM(first)); mo_array *c_array = ray_rb2int_array(array); size_t size = say_drawable_get_index_count(drawable->drawable); size_t actual_size = c_array->size; if (actual_size < size) { rb_raise(rb_eRuntimeError, "received %zu indices, expected %zu", actual_size, size); } memcpy(ptr, mo_array_at(c_array, 0), sizeof(GLuint) * size); }
static VALUE ray_int_array_init_copy(VALUE self, VALUE orig) { say_array_copy(ray_rb2int_array(self), ray_rb2int_array(orig)); return self; }
/* Removes all the elements from the array */ static VALUE ray_int_array_clear(VALUE self) { say_array_resize(ray_rb2int_array(self), 0); return self; }
/* @return [Integer] size of the array */ static VALUE ray_int_array_size(VALUE self) { return INT2FIX(say_array_get_size(ray_rb2int_array(self))); }