コード例 #1
0
ファイル: gl.c プロジェクト: Mon-Ouie/ray
/*
 * @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;
}
コード例 #2
0
ファイル: gl.c プロジェクト: Mon-Ouie/ray
/*
 * @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;
}
コード例 #3
0
ファイル: gl_int_array.c プロジェクト: Spooner/ray
/*
  @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;
}
コード例 #4
0
ファイル: gl_int_array.c プロジェクト: Spooner/ray
/*
  @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;
}
コード例 #5
0
ファイル: gl_int_array.c プロジェクト: Spooner/ray
/*
  @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;
}
コード例 #6
0
ファイル: gl_int_array.c プロジェクト: Spooner/ray
/*
  @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;
}
コード例 #7
0
ファイル: drawable.c プロジェクト: Mon-Ouie/ray
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);
}
コード例 #8
0
ファイル: gl_int_array.c プロジェクト: Spooner/ray
static
VALUE ray_int_array_init_copy(VALUE self, VALUE orig) {
  say_array_copy(ray_rb2int_array(self), ray_rb2int_array(orig));
  return self;
}
コード例 #9
0
ファイル: gl_int_array.c プロジェクト: Spooner/ray
/* 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;
}
コード例 #10
0
ファイル: gl_int_array.c プロジェクト: Spooner/ray
/* @return [Integer] size of the array */
static
VALUE ray_int_array_size(VALUE self) {
  return INT2FIX(say_array_get_size(ray_rb2int_array(self)));
}